documentation
Kohinos v3 Doc générée le commit 8d60b1904

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.

TL;DR
  • 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.

ScriptRôleSortie
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.
Pattern Larson 95/5

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)

AgentRôle
solid-auditorNote chaque classe sur les 5 principes SOLID (SRP/OCP/LSP/ISP/DIP), 5 points par axe, snippets de refactor priorisés.
symfony-best-practices-reviewerVérifie la conformité aux best practices SF 7.x (autowiring, types de retour, services finaux, attributs).
sonata-admin-reviewerSonata Admin 4.x : pas de $this->trans(), DatagridMapper final, etc.
api-platform-reviewerRevue #[ApiResource], sécurité security/securityPostDenormalize, normalization groups.
doctrine-migration-reviewerRevue des migrations Doctrine : idempotence, down() réversible, pas de DDL hors migrations.
csrf-protection-auditorVérifie que tous les formulaires POST ont un token CSRF actif.
a11y-twig-auditorAudit accessibilité (ARIA, contrastes, ordre tab) sur les templates Twig.
i18n-coverage-auditorDétecte les strings hardcodées non traduites dans Twig / PHP.
n-plus-one-detectorDétecte les patterns N+1 sur les relations Doctrine.
dependency-cartographerCartographie 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)

AgentRôle
boundary-clarifierRepère les fuites de couches (entité dans contrôleur, repo dans Twig).
dependency-injection-puristMigre les new X() vers DI, supprime les ContainerAwareTrait résiduels.
enum-migratorConvertit les const STATUS_* en enums PHP 8.1+ (FluxType, SepaMandateStatus…).
repository-method-extractorSort les QueryBuilder in-controller vers des méthodes find* du repo.
legacy-annotation-migratorMigre les docblock annotations Doctrine/Gedmo restantes vers attributs PHP 8.
psalm-baseline-narrowRéduit progressivement la baseline Psalm, fichier par fichier.
twig-vanilla-js-refactorerSort le JS/CSS inline des Twig vers assets/js|css/ + Webpack Encore.

Tests

AgentRôle
tdd-coachCoache 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-testerLance Infection sur une cible, lit le rapport, propose tests pour tuer les mutants survivants.
route-coverage-checkerCroise debug:router avec les tests fonctionnels pour repérer les routes non testées.
financial-property-testerGénère des property tests (somme = 0, signes, idempotence) sur les services financiers.
fixture-minimizerRéduit un fixture d'échec à son minimum reproductible.
test-runnerExécute des tests ciblés (jamais la suite complète) et synthétise les échecs.

Finance (cœur de Kohinos)

AgentRôle
financial-investigatorReç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-debaterJoue l'avocat du diable sur une décision financière (changement de signe, modèle de redistribution…). Cherche les contre-exemples.
money-invariant-proverProuve formellement (par énumération de cas ou SQL) qu'un invariant tient sur un périmètre donné.

Sécurité

AgentRôle
security-scannerScan vulnérabilités sur un fichier ou dossier. Produit findings.jsonl (1 ligne / vuln).
security-validatorConfirme 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-patcherPropose un patch minimal qui fait passer le test PHPUnit du validator au vert sans casser les autres tests.
sepa-diagnosticianDiagnostique l'échec d'un test SEPA et propose les pistes (mandat, XML pain.008, dates).

Documentation & release

AgentRôle
docs-syncerMet à jour les docs (doc/, docs/INDEX.md) quand le code change.
changelog-writerGénère les entrées CHANGELOG.md (technique) + CHANGELOG_USER.md (fonctionnel) à partir du diff stagé.
release-notes-aggregatorCompile les notes de release à partir des deux changelogs.
deprecation-hunterRepère les @deprecated, les usages d'API Symfony retirées en 7.4, les SwiftMailer résiduels.

Hors-scope direct (méthodologie)

AgentRôle
kohinos-office-hours6 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-managerSuit l'avancement d'un plan multi-étapes, met à jour les tâches.
git-workflowEncadre les commits atomiques, vérifie les changelogs avant commit.
context-fetcherRécupère du contexte ciblé (un fichier, une méthode) avec un budget de tokens borné.
file-creatorCrée des fichiers à partir d'un template (entité, repo, admin, test).

MCP servers — autorisés (local-only)

⚠ Politique stricte : tous les MCP doivent tourner localement

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.

ServerRôleAccè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)

⛔ Refus automatique

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éPourquoiAlternative self-host
GitHub MCP officielCloud Microsoft, télémétrie, dépendance critique.gh CLI manuel, Forgejo / Gitea.
Linear MCPSaaS propriétaire.Issues locales .claude/issues/ ou Vikunja.
Slack MCPSaaS, données sortantes.Mattermost self-host, ou rien (dev solo).
Notion MCPSaaS, vendor lock-in.Markdown dans doc/ ou docs/.
Sentry cloud MCPSaaS 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 :

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.

HookEffet
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

  1. Vérifier qu'il tourne 100 % local (binaire, container, ou stdio process). Aucune connexion sortante non maîtrisée.
  2. Vérifier l'absence de télémétrie : strace / tcpdump sur une session de test. Si du trafic sort vers un domaine tiers, refus.
  3. PR + revue : justifier l'absence d'alternative déjà autorisée. Indiquer le binaire, sa version, son repo, sa licence.
  4. Mettre à jour .claude/rules/mcp-policy.md : ajouter une ligne dans le tableau « Autorisé », avec rôle et permissions.
  5. 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 :

  1. /kohinos-office-hours — validation YC-style avant écriture de code.
  2. /tdd-coach — produit le test RED qui décrit la spec.
  3. Implémentation manuelle (Claude propose, le dev valide).
  4. /solid-auditor + /symfony-best-practices-reviewer.
  5. /mutation-tester — Infection MSI ≥ 80 % sur le code finance (cf. Tests & qualité).
  6. /changelog-writer — met à jour les deux changelogs.
  7. git commit atomique avec hook Stop qui rappelle les changelogs.

Refus automatiques (rappel .claude/rules/global.md)

Ne jamais proposer
  • 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 :

Voir aussi

Sources
  • 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é