AI workflows — Claude Code, agents spécialisés, MCP local-only
Kohinos utilise Claude Code pour faire de l'audit qualité, sécurité et financier
sur le codebase, et pour épauler le dev solo dans les boucles TDD / refacto / release.
L'ensemble du dispositif respecte la priorité 2 du projet : souveraineté.
Tous les MCP servers tournent en local (machine du dev ou Raspberry Pi),
aucune donnée adhérent ne sort de la machine, aucun SaaS propriétaire n'est dans le path
critique. Cf. .claude/rules/mcp-policy.md et .claude/rules/global.md.
- Scripts déterministes dans
bin/ai-workflows/— les outils existants (PHPUnit, SQL, xmllint) font 95 % du travail. - Agents Claude Code dans
.claude/agents/— appelés uniquement quand un jugement ambigu est nécessaire (5 % du travail). - MCP autorisés :
symfony-ai-mate,context7,mcp-server-mysql(SELECT only),code-review-graph. Tous locaux. - MCP interdits : GitHub officiel, Linear, Slack, Notion, Sentry cloud, Anthropic Files API.
Architecture d'ensemble
flowchart LR
DEV([Dev solo]) -->|slash command| CC[Claude Code CLI]
CC --> HK[hooks .claude/hooks/]
CC --> AG[.claude/agents/]
CC --> SK[.claude/skills/]
HK -->|PreToolUse / PostToolUse| GR[code-review-graph]
CC --> SCRIPT[bin/ai-workflows/*.sh]
SCRIPT -->|déterministe| TOOLS[PHPUnit · SQL · xmllint · phpstan]
SCRIPT -.diagnostic ambigu.-> AG
CC --- MCP{MCP servers locaux}
MCP --> M1[symfony-ai-mate]
MCP --> M2[context7]
MCP --> M3[mcp-server-mysql
SELECT only]
MCP --> M4[code-review-graph]
Pattern Larson : le code déterministe orchestre, l'agent IA n'intervient qu'en aval pour le diagnostic ou la décision ambigüe.
Workflows scriptés (bin/ai-workflows/)
Quatre dossiers métier : financial/, security/,
sepa/, et shared/ (prérequis). Chaque script est
code-driven : il enchaîne les étapes déterministes
(lint, SQL, PHPUnit, XSD) et n'appelle un sous-agent que pour produire du
diagnostic humain-lisible en cas d'échec.
| Script | Rôle | Sortie |
|---|---|---|
financial/check-invariants.php |
Vérifie les 22 invariants financiers (somme des opérations par compte, signe attendu, anti-rejeu SSA, intégrité des flux…). 100 % déterministe, zéro agent. | JSON sur stdout, exit 0 si clean, 1 si violation. |
security/run-audit.sh |
Orchestrateur d'audit sécurité. Enchaîne 3 sous-agents : security-scanner (scan), security-validator (confirme via test PHPUnit RED), security-patcher (propose patch minimal). |
var/security-audit/<ts>/findings.jsonl · validated.jsonl · patches.jsonl · summary.md |
security/generate-report.sh |
Compile le rapport humain final à partir des JSONL de l'étape audit. | summary.md markdown. |
sepa/run-with-diagnosis.sh |
Exécute la suite PHPUnit sepa + mlc + (optionnel) validation XSD pain.008. En cas d'échec, appelle l'agent sepa-diagnostician pour produire un diagnostic. |
var/sepa-diagnosis/junit-sepa.xml · diagnosis.md |
shared/check-prerequisites.sh |
Vérifie les prérequis durs (claude, jq, php, composer) et optionnels (xmllint). |
Exit 0 si OK, message d'erreur sinon. |
Les outils existants (PHPUnit, requêtes SQL, phpstan, xmllint)
font 95 % du travail. L'agent Claude n'est appelé que pour
les 5 % ambigus : formuler une hypothèse de cause racine,
proposer une formulation humaine d'un diff, prioriser des findings. Aucune
décision financière n'est jamais prise par un agent.
Agents Claude Code spécialisés
Chaque agent vit dans .claude/agents/<nom>.md avec un frontmatter
YAML (name, description, tools, model).
Le modèle est choisi au plus bas coût utile : haiku pour le
mécanique, sonnet pour la revue scopée, opus pour les
tradeoffs / planification financière.
Audit qualité (lecture seule)
| Agent | Rôle |
|---|---|
solid-auditor | Note chaque classe sur les 5 principes SOLID (SRP/OCP/LSP/ISP/DIP), 5 points par axe, snippets de refactor priorisés. |
symfony-best-practices-reviewer | Vérifie la conformité aux best practices SF 7.x (autowiring, types de retour, services finaux, attributs). |
sonata-admin-reviewer | Sonata Admin 4.x : pas de $this->trans(), DatagridMapper final, etc. |
api-platform-reviewer | Revue #[ApiResource], sécurité security/securityPostDenormalize, normalization groups. |
doctrine-migration-reviewer | Revue des migrations Doctrine : idempotence, down() réversible, pas de DDL hors migrations. |
csrf-protection-auditor | Vérifie que tous les formulaires POST ont un token CSRF actif. |
a11y-twig-auditor | Audit accessibilité (ARIA, contrastes, ordre tab) sur les templates Twig. |
i18n-coverage-auditor | Détecte les strings hardcodées non traduites dans Twig / PHP. |
n-plus-one-detector | Détecte les patterns N+1 sur les relations Doctrine. |
dependency-cartographer | Cartographie des dépendances inter-services pour repérer les cycles. |
taste-keeper | "Bon goût" Linus-style : simplification, élimination de cas particuliers. |
Refactoring (proposition de diff)
| Agent | Rôle |
|---|---|
boundary-clarifier | Repère les fuites de couches (entité dans contrôleur, repo dans Twig). |
dependency-injection-purist | Migre les new X() vers DI, supprime les ContainerAwareTrait résiduels. |
enum-migrator | Convertit les const STATUS_* en enums PHP 8.1+ (FluxType, SepaMandateStatus…). |
repository-method-extractor | Sort les QueryBuilder in-controller vers des méthodes find* du repo. |
legacy-annotation-migrator | Migre les docblock annotations Doctrine/Gedmo restantes vers attributs PHP 8. |
psalm-baseline-narrow | Réduit progressivement la baseline Psalm, fichier par fichier. |
twig-vanilla-js-refactorer | Sort le JS/CSS inline des Twig vers assets/js|css/ + Webpack Encore. |
Tests
| Agent | Rôle |
|---|---|
tdd-coach | Coache la boucle RED → GREEN → REFACTOR ; refuse d'écrire du code sans test RED préalable. |
unit-test-writer | Écrit des tests unitaires sur du code existant, avec mocks adaptés (Sonata, EntityManager). |
mutation-tester | Lance Infection sur une cible, lit le rapport, propose tests pour tuer les mutants survivants. |
route-coverage-checker | Croise debug:router avec les tests fonctionnels pour repérer les routes non testées. |
financial-property-tester | Génère des property tests (somme = 0, signes, idempotence) sur les services financiers. |
fixture-minimizer | Réduit un fixture d'échec à son minimum reproductible. |
test-runner | Exécute des tests ciblés (jamais la suite complète) et synthétise les échecs. |
Finance (cœur de Kohinos)
| Agent | Rôle |
|---|---|
financial-investigator | Reçoit UNE violation d'invariant de check-invariants.php et propose une hypothèse de cause racine. N'agit jamais sur la DB. Ne propose aucun correctif automatique. |
adversarial-finance-debater | Joue l'avocat du diable sur une décision financière (changement de signe, modèle de redistribution…). Cherche les contre-exemples. |
money-invariant-prover | Prouve formellement (par énumération de cas ou SQL) qu'un invariant tient sur un périmètre donné. |
Sécurité
| Agent | Rôle |
|---|---|
security-scanner | Scan vulnérabilités sur un fichier ou dossier. Produit findings.jsonl (1 ligne / vuln). |
security-validator | Confirme un finding en générant un test PHPUnit RED qui exploite la vuln. Si le test passe (vert), le finding est rejeté comme faux positif. |
security-patcher | Propose un patch minimal qui fait passer le test PHPUnit du validator au vert sans casser les autres tests. |
sepa-diagnostician | Diagnostique l'échec d'un test SEPA et propose les pistes (mandat, XML pain.008, dates). |
Documentation & release
| Agent | Rôle |
|---|---|
docs-syncer | Met à jour les docs (doc/, docs/INDEX.md) quand le code change. |
changelog-writer | Génère les entrées CHANGELOG.md (technique) + CHANGELOG_USER.md (fonctionnel) à partir du diff stagé. |
release-notes-aggregator | Compile les notes de release à partir des deux changelogs. |
deprecation-hunter | Repère les @deprecated, les usages d'API Symfony retirées en 7.4, les SwiftMailer résiduels. |
Hors-scope direct (méthodologie)
| Agent | Rôle |
|---|---|
kohinos-office-hours | 6 questions YC-style avant tout dev (problème ? utilisateur ? alternative ? métrique ? simplification ? réversibilité ?). Refuse de continuer si 3+ restent sans réponse — propose un brainstorming. |
project-manager | Suit l'avancement d'un plan multi-étapes, met à jour les tâches. |
git-workflow | Encadre les commits atomiques, vérifie les changelogs avant commit. |
context-fetcher | Récupère du contexte ciblé (un fichier, une méthode) avec un budget de tokens borné. |
file-creator | Crée des fichiers à partir d'un template (entité, repo, admin, test). |
MCP servers — autorisés (local-only)
Aucun MCP cloud n'est admis dans le path critique. La règle est appliquée par
.claude/rules/mcp-policy.md et vérifiée à la revue.
| Server | Rôle | Accès |
|---|---|---|
symfony-ai-mate |
Profiler Symfony, monolog (search / tail / regex / by-level), debug:container, PHP extensions, OS info. |
Lecture sur la machine locale. |
context7 |
Documentation à jour Symfony, Doctrine, PHP, etc. Pas de clé API, pas de télémétrie. | Lecture (cache local des docs). |
mcp-server-mysql |
Introspection BDD Kohinos locale. | Read-only — SELECT uniquement. Aucun INSERT/UPDATE/DELETE/DDL. |
code-review-graph |
Knowledge graph local du codebase (Tree-sitter + impact radius + flow detection). Auto-update via hooks PostToolUse. |
Lecture / écriture du graphe local (.code-review-graph/). |
mcp-git (optionnel) |
Git ops avec sortie JSON structurée. | Local. |
mcp-filesystem (optionnel) |
Fallback Read/Grep si besoin. | Local. |
MCP servers — interdits (cloud SaaS)
Toute proposition d'ajout de l'un de ces MCP est refusée par
.claude/rules/mcp-policy.md. La réponse attendue :
« Refusé par .claude/rules/mcp-policy.md. Souveraineté est
priorité 2. Alternative self-host : … ».
| MCP refusé | Pourquoi | Alternative self-host |
|---|---|---|
| GitHub MCP officiel | Cloud Microsoft, télémétrie, dépendance critique. | gh CLI manuel, Forgejo / Gitea. |
| Linear MCP | SaaS propriétaire. | Issues locales .claude/issues/ ou Vikunja. |
| Slack MCP | SaaS, données sortantes. | Mattermost self-host, ou rien (dev solo). |
| Notion MCP | SaaS, vendor lock-in. | Markdown dans doc/ ou docs/. |
| Sentry cloud MCP | SaaS payant, données d'erreur sortantes. | GlitchTip self-host. |
| Anthropic Files API (hors CLI) | Données uploadées sur l'infra Anthropic. | Filesystem local, MCP filesystem. |
Justifications inscrites dans .claude/rules/global.md :
- AGPL-3.0 non négociable — pas de couche cloud propriétaire.
- Code auto-hébergeable : la totalité du dispositif doit pouvoir tourner sans Internet.
- Raspberry Pi friendly : RAM/CPU limités, pas de runtime cloud lourd.
- Intégrité financière > performance : aucune donnée adhérent (IBAN, montants, identité) ne sort de la machine.
Hooks Claude Code
Les hooks sont définis dans .claude/settings.json. Ils
contraignent Claude Code pendant la session : certaines actions
sont bloquées, d'autres déclenchent des effets de bord automatiques.
| Hook | Effet |
|---|---|
PreToolUse (Write / Edit / MultiEdit) |
.claude/hooks/pre-tool-use.sh : lint Twig/YAML, refus de JS/CSS inline, vérif de la règle PHP declare(strict_types=1);. |
PostToolUse (Edit / Write / Bash) |
code-review-graph update auto sur le repo local. Le graphe reste frais sans intervention manuelle. |
Stop |
.claude/hooks/stop.sh : rappel changelogs, vérif git status, suggestion de commit atomique. |
UserPromptSubmit |
Injecte du contexte (règles money / sepa / entity) selon le prompt. |
SessionStart |
Affiche le statut du graphe (code-review-graph status). |
Permissions — phpunit borné
L'allowlist de settings.json n'autorise jamais
vendor/bin/phpunit tout court — uniquement filtré :
"Bash(vendor/bin/phpunit --testsuite=*)",
"Bash(vendor/bin/phpunit tests/*)",
"Bash(vendor/bin/phpunit --filter=*)",
Conséquence : lancer toute la suite est impossible sans permission explicite. Aligné avec la règle CLAUDE.md « Ne jamais lancer toute la suite PHPUnit ».
Procédure pour ajouter un nouveau MCP
- Vérifier qu'il tourne 100 % local (binaire, container, ou stdio process). Aucune connexion sortante non maîtrisée.
- Vérifier l'absence de télémétrie :
strace/tcpdumpsur une session de test. Si du trafic sort vers un domaine tiers, refus. - PR + revue : justifier l'absence d'alternative déjà autorisée. Indiquer le binaire, sa version, son repo, sa licence.
- Mettre à jour
.claude/rules/mcp-policy.md: ajouter une ligne dans le tableau « Autorisé », avec rôle et permissions. - Tester sur Raspberry Pi cible : si le MCP ne tient pas en RAM/CPU sur la cible self-host, refus.
Boucle dev type (slash commands)
Pour une feature côté finance, la séquence canonique est :
sequenceDiagram
autonumber
participant Dev
participant Office as kohinos-office-hours
participant TDD as tdd-coach
participant Code as (implémentation)
participant Solid as solid-auditor
participant SF as symfony-best-practices-reviewer
participant Mut as mutation-tester
participant CL as changelog-writer
Dev->>Office: /kohinos-office-hours
Office-->>Dev: 6 questions YC-style
Dev->>TDD: spec → test RED
TDD-->>Dev: PHPUnit RED confirmé
Dev->>Code: implémentation
Code-->>TDD: PHPUnit GREEN
Dev->>Solid: audit SOLID
Dev->>SF: audit best practices
Solid-->>Dev: notes + diff proposé
SF-->>Dev: corrections autowiring/types
Dev->>Mut: infection sur le service
Mut-->>Dev: MSI ≥ 80% sur code finance
Dev->>CL: génère CHANGELOG.md + CHANGELOG_USER.md
CL-->>Dev: diff prêt à commit
Pas de raccourci : la boucle office-hours → TDD RED → impl → audits → mutation → changelog est la règle pour tout code financier.
Étapes :
/kohinos-office-hours— validation YC-style avant écriture de code./tdd-coach— produit le test RED qui décrit la spec.- Implémentation manuelle (Claude propose, le dev valide).
/solid-auditor+/symfony-best-practices-reviewer./mutation-tester— Infection MSI ≥ 80 % sur le code finance (cf. Tests & qualité)./changelog-writer— met à jour les deux changelogs.git commitatomique avec hookStopqui rappelle les changelogs.
Refus automatiques (rappel .claude/rules/global.md)
- SaaS critique dans le path : Auth0, SendGrid, Sentry cloud, GitHub Actions payant, etc. Toujours une alternative self-hostable.
openssl_*pour signatures cryptographiques : libsodium uniquement (Ed25519, Curve25519). Cohérent roadmap Reticulum / LoRa offline. Cf. Cryptographie.- Framework front lourd (React / Angular / Vue SPA). On reste Twig + Bootstrap 5.2 + Vanilla JS (+ Web Components si besoin). Cf. Conventions.
- Dépendance npm/composer < 100 stars sans audit manuel.
- Design centralisé : « le serveur a la clé privée de tout » ⇒ refus.
- Refactor fermé (closed-source cloud layer). AGPL-3.0 non négociable.
Skills (slash commands locales)
Les skills de Claude Code sont packagées sous .claude/skills/.
Quatre skills locales Kohinos :
debug-issue— debug systémique d'un bug avec capture des hypothèses.explore-codebase— exploration ciblée avec budget de tokens borné.refactor-safely— refacto avec garde-fou test RED → diff → tests verts.review-changes— revue de code avant commit, vérifie changelogs + invariants finance + style PHP.
Voir aussi
bin/ai-workflows/— scripts orchestrateurs..claude/agents/*.md— agents spécialisés (~41 agents)..claude/skills/*— slash commands..claude/rules/global.md— règles globales projet..claude/rules/mcp-policy.md— politique MCP local-only..claude/rules/money.md— règles d'atomicité & idempotence financière..claude/settings.json— hooks et permissions.- Conventions Kohinos · Invariants financiers · Tests & qualité