Expression de besoin — GOV-SYSTEM¶
| Champ | Valeur |
|---|---|
| Story | GOV-SYSTEM |
| Titre | Système de gouvernance IA ProbatioVault — Orchestration multi-agents gouvernée |
| Labels | governance, tooling, process, multi-agent |
| Priorité | Critique (infrastructure fondatrice) |
| Auteur | Claude (reverse-engineering) |
| Date | 2026-03-28 |
| Version | 1.0 (rétrospective — système existant documenté a posteriori) |
1. Contexte et motivation¶
Le problème fondamental¶
ProbatioVault développe un coffre-fort numérique probatoire soumis à des exigences réglementaires strictes (NF Z42-013, ISO 14641, eIDAS). Le code produit engage la valeur probante des documents archivés — une erreur cryptographique, une faille de sécurité ou une incohérence fonctionnelle peut invalider juridiquement des preuves.
Le développement repose sur des agents IA (Claude, ChatGPT) qui produisent spécifications, code et tests. Or ces agents :
- N'ont pas de mémoire inter-sessions : chaque invocation repart de zéro, sans capitalisation.
- Ne se valident pas eux-mêmes : un LLM qui produit un document et le review ensuite a un biais de confirmation systématique.
- Produisent des artefacts incohérents si le contexte est pollué par les étapes précédentes.
- Ne respectent pas spontanément les contraintes réglementaires (NF Z42-013 §6.3, ISO 14641 §7.2) sans injection explicite.
Pourquoi un système de gouvernance¶
Un développeur humain seul face à des agents IA sans cadre produit du code qui compile mais ne prouve rien. Les premières stories ProbatioVault (PD-13 à PD-22) ont été développées sans gouvernance formelle. Le constat :
- Aucune traçabilité des décisions architecturales — impossible de justifier un choix lors d'un audit.
- Pas de validation croisée — le même LLM qui écrit la spec la valide, sans contradiction.
- Corrections tardives — les erreurs découvertes en production (ou par Sonar) au lieu d'être bloquées en amont.
- Pas de capitalisation — les mêmes erreurs se répétaient d'une story à l'autre (double-hash HSM,
createVerifyvscrypto.verify,ALTER TYPE ADD VALUEdans la même transaction, etc.).
L'analogie positronique¶
Le système s'inspire des cerveaux positroniques d'Isaac Asimov : des règles ancrées si profondément dans l'architecture qu'elles ne peuvent être violées, même par l'agent lui-même. Les Trois Lois de la Robotique deviennent les Articles Constitutionnels — des invariants inviolables injectés dans chaque point de contrôle.
Pourquoi 11 étapes¶
Le workflow en 11 étapes reproduit un cycle de développement industriel complet, adapté à la production IA :
- Besoin (étape 0) : capture de l'intention humaine, préservation des tensions.
- Spécification + Tests (étapes 1-2) : contractualisation formelle par un LLM distinct.
- Gate Spec (étape 3) : premier point de contrôle — la spec est-elle complète, testable, sans ambiguïté ?
- Plan (étape 4) : découpage en composants, mapping invariants → mécanismes.
- Gate Plan (étape 5) : le plan couvre-t-il tous les invariants ? Les hypothèses sont-elles vérifiables ?
- Implémentation (étape 6) : production multi-agents avec isolation par module.
- Acceptabilité (étape 7) : quality gates automatisés + reviews LLM.
- Gate Closure (étape 8) : le code produit respecte-t-il la spec ? Les invariants sont-ils couverts ?
- REX (étape 9) : extraction des apprentissages, métriques.
- Rétrospective (étape 10) : patterns récurrents, amélioration du processus.
Chaque gate est un point de non-retour conditionnel : on ne passe pas sans preuve de conformité.
2. Objectif¶
Fournir un cadre d'orchestration automatisé qui :
- Sépare production et validation : aucun agent ne valide jamais son propre travail (validation croisée Claude ↔ ChatGPT).
- Impose des quality gates mathématiques : scoring numérique non négociable (GO ≥ 8.0, RESERVE ≥ 7.0, NON_CONFORME sinon) avec plafond d'itérations et détection de stagnation.
- Trace chaque événement : état dans Jira (source de vérité), artefacts sur disque, sessions JSONL, commentaires horodatés.
- Capitalise les apprentissages : chaque erreur détectée en gate ou en REX alimente une base de learnings indexée par embeddings, réinjectée dans les stories suivantes.
- Isole les contextes : chaque étape s'exécute dans un processus distinct, sans pollution inter-étapes.
- Survit aux interruptions : le workflow peut être stoppé et repris à tout moment grâce à l'état Jira + données locales.
Le système ne développe pas — il gouverne le développement. Les agents produisent. Claude orchestre. Le PMO juge. L'humain tranche.
3. Périmètre fonctionnel¶
Lot 1 — Orchestration fondamentale (MUST-HAVE)¶
| # | Capacité | Description |
|---|---|---|
| F-01 | Workflow 11 étapes | Boucle séquentielle des étapes 0 à 10 avec gestion des exit codes (0=succès, 2=NON_CONFORME, 3=ESCALADE). |
| F-02 | Machine d'états Jira | 19 statuts custom, 24 transitions (dirigées + globales), source de vérité pour l'état du workflow. Assignee auto-configuré par automation rules (3 agents : Claude, ChatGPT, Loïc) — routage dynamique de l'executor. |
| F-03 | Données locales | .gov-local.json par epic : iteration, substeps step 6, history, accepted_reserves, prompt_versions. |
| F-04 | Gates PMO | Steps 3, 5, 8 : review (P1) → confrontation (P2, LLM différent) → dossier de conformité → verdict YAML. |
| F-05 | Scoring constitutionnel | GO ≥ 8.0 partout, RESERVE ≥ 7.0 moyenne, NON_CONFORME sinon. Plafond 3 itérations. Delta=0 → ESCALADE. |
| F-06 | Multi-agents step 6 | Décomposition (manifest) → agents séquentiels (Claude auto / ChatGPT auto) → synthèse. Vérification TS inter-agent. |
| F-07 | Acceptabilité step 7 | Phase 1 (lint/format/tsc/test) → Phase 1.5 (Sonar QG, BLOQUANT) → Phase 2 (3 reviews LLM parallèles via parallel-reviews.sh). |
| F-08 | Assemblage cache-first | Prompts assemblés avec contenu statique en tête (cacheable TTL 5 min) et contenu variable en queue. |
| F-09 | Vérification constitutionnelle | Scan automatisé des violations Articles I-VII avant chaque verdict de gate. |
| F-10 | Revue documentaire | 12/12 artefacts requis (6 MD + 6 YAML) avant clôture Jira. |
| F-11 | Reprise après interruption | État déterminé par Jira au redémarrage, .gov-local.json pour les données complémentaires. |
Lot 2 — Capitalisation et amélioration continue¶
| # | Capacité | Description |
|---|---|---|
| F-12 | Métriques | metrics.jsonl : temps, gates, scores, écarts, complexité par story. |
| F-13 | Learnings | learnings.jsonl : extraction depuis REX + verdicts, indexation par embeddings (Ollama BGE-M3). |
| F-14 | Injection proactive | Au step 0, recherche sémantique des learnings pertinents par domaine et injection dans le prompt. |
| F-15 | Dashboards | Régénération batch : stories actives, bloquées, métriques de convergence. |
| F-16 | Améliorations process | REX section 10 → modifications CLAUDE.md, rules, procedures. Validation humaine si fichier constitutionnel touché. |
| F-17 | Rétrospective | Step 10 : analyse de patterns récurrents sur les N dernières stories, recommandations priorisées. |
Lot 3 — Intégrations¶
| # | Capacité | Description |
|---|---|---|
| F-18 | Jira REST API | Transitions, commentaires, lecture de statut. Credentials dans CLAUDE.local.md. |
| F-19 | OpenCode (ChatGPT) | Steps ChatGPT (1, 2, gates P1/P2) via opencode run. Capture en variable (sandbox filesystem). |
| F-20 | Ollama (LLM local) | Données sensibles, indexation embeddings, shadow evals. IA-Server 192.168.1.82. |
| F-21 | GitLab CI/CD | Feature branches, commits agents, pipeline vert obligatoire avant REX. |
| F-22 | HashiCorp Vault | Credentials GitLab, Sonar, AWS via API HTTPS. |
Lot 4 — Cohérence et traçabilité¶
| # | Capacité | Description |
|---|---|---|
| F-23 | Cohérence inter-EB | Pipeline Prolog après step 0 : détection contradictions entre besoins. STOP si critique. |
| F-24 | Data-index YAML | Index structuré data/specs-index/ : un YAML par artefact, un index.yaml par story. |
| F-25 | Session recording | data/sessions/{story}-session.jsonl : chaque événement horodaté. |
| F-26 | Traçabilité RTM | Matrice de traçabilité des exigences : story → RFC → test → code. |
4. Contraintes¶
4.1 Contraintes réglementaires¶
- Le code produit via ce workflow DOIT être conforme NF Z42-013 (archivage électronique) et ISO 14641 (gestion des documents).
- Les preuves cryptographiques DOIVENT respecter eIDAS (signatures qualifiées, horodatage RFC 3161).
- La traçabilité DOIT être suffisante pour un audit externe (AFNOR, commissaire aux comptes).
4.2 Contraintes organisationnelles¶
- Développeur unique : le workflow est conçu pour un développeur assisté par des agents IA, pas pour une équipe.
- PO = développeur : l'humain qui tranche les RESERVE et ESCALADE est aussi celui qui développe.
- Budget LLM : le prompt caching (cache-first) est une contrainte économique, pas un luxe.
4.3 Contraintes techniques¶
- Claude Code (extension VSCode) est le runtime principal. Les skills
.claude/commands/sont le point d'entrée. - OpenCode est le seul accès à ChatGPT (pas de copier-coller). Sandbox filesystem impose la capture en variable.
claude -pne peut pas être lancé depuis une session Claude Code sansunset CLAUDECODE.- Jira Team-managed : le workflow n'est pas exposé via l'API classique. Les TIDs sont découverts empiriquement.
- Ollama sur serveur local (2× RTX 5090) : embeddings BGE-M3, modèles qwen3.5:35b-a3b et llama3.3:70b.
4.4 Contraintes temporelles¶
- Le workflow complet d'une story prend 8 à 24 heures selon la complexité.
- Les gates itératives (v1 → v2 → v3) doivent être exécutées rapidement (< 5 min entre appels) pour bénéficier du prompt caching.
- Le REX DOIT être lancé APRÈS que le pipeline GitLab soit vert.
5. Scénarios d'échec et résultats inacceptables¶
| # | Scénario d'échec | Conséquence inacceptable | Garde existante |
|---|---|---|---|
| E-01 | Un agent valide son propre travail | Biais de confirmation, erreurs non détectées | Art. II — validation croisée P1 ≠ P2 |
| E-02 | Une gate est contournée (skip) | Code non conforme en production | Art. IV — QG non contournables, exit code bloquant |
| E-03 | Le scoring est modifié pour forcer un GO | Perte de crédibilité du processus | Art. I — seuils mathématiques dans la Constitution |
| E-04 | L'état du workflow est incohérent entre Jira et le disque | PO voit un statut erroné, décision sur base fausse | INV-GOV-19 — Jira source de vérité, sync à chaque événement |
| E-05 | Un learning n'est pas capitalisé | La même erreur se répète dans la story suivante | Compounder obligatoire post-step 9, injection proactive en step 0 |
| E-06 | Les artefacts sont incomplets à la clôture | Audit impossible, non-conformité | check-docs.sh bloque la transition Done si < 12/12 |
| E-07 | Le Sonar QG est contourné | Bugs/vulnérabilités en production | Phase 1.5 BLOQUANTE, substitution ESLint+tsc interdite |
| E-08 | Les prompts changent mid-story sans trace | Incohérence entre artefacts produits avec des versions différentes | Prompt versioning, prompt_versions dans .gov-local.json |
| E-09 | Un multi-agents step 6 produit du code qui ne compile pas | Erreurs TS découvertes tardivement en acceptabilité | Vérification tsc --noEmit après CHAQUE agent |
| E-10 | Le workflow tourne en boucle infinie sur une gate | Temps perdu, frustration développeur | Plafond 3 itérations + détection delta=0 → ESCALADE |
6. Tensions et conflits non résolus¶
T-01 : Autonomie des agents vs. contrôle constitutionnel¶
Les agents IA sont plus efficaces quand ils ont de la latitude. Mais le domaine réglementaire exige un contrôle strict. La tension se manifeste dans : - Les agents step 6b qui voudraient refactorer du code existant mais sont limités aux fichiers autorisés. - Les gates qui parfois sur-pénalisent des choix techniques valides mais non documentés dans la spec.
Non résolu : le calibrage entre "laisser l'agent s'exprimer" et "imposer la conformité" est empirique, ajusté story par story.
T-02 : Coût du prompt caching vs. complétude du contexte¶
Le cache-first impose de mettre le contenu statique en tête. Mais parfois, le contexte le plus pertinent pour l'agent est dynamique (corrections de l'itération précédente, écarts spécifiques). Injecter ce contexte en premier casserait le cache.
Non résolu : le compromis actuel (dynamique en queue) est acceptable mais sous-optimal pour les gates itératives complexes.
T-03 : Développeur unique vs. séparation des pouvoirs¶
L'Art. II impose que l'auteur ne valide jamais son propre travail. Mais avec un développeur unique, c'est le même humain qui guide tous les agents. La séparation se fait entre LLM (Claude vs. ChatGPT), pas entre humains.
Non résolu : la validation croisée inter-LLM est un proxy imparfait pour la vraie séparation des pouvoirs. Un audit externe humain périodique renforcerait le dispositif.
T-04 : Traçabilité exhaustive vs. volume de données¶
Chaque événement est logué (session JSONL, commentaires Jira, métriques). Sur 30+ stories, le volume de données devient significatif. Les dashboards sont en batch (pas temps réel), les learnings nécessitent un reindex.
Non résolu : le passage à l'échelle (100+ stories) nécessiterait une base structurée (PostgreSQL ?) au lieu de fichiers JSONL.
T-05 : Jira source de vérité vs. latence réseau¶
Jira est la source de vérité, mais chaque appel API prend 200-500ms. Sur un workflow avec 20+ transitions, ça représente 10+ secondes de latence pure. Le fallback .gov-local.json est un mode dégradé, pas un remplacement.
Non résolu : acceptable pour un développeur unique, problématique si multi-sessions parallèles.
7. Questions ouvertes¶
| # | Question | Impact | Piste |
|---|---|---|---|
| Q-01 | Faut-il des tests automatisés pour le workflow lui-même ? | Confiance, non-régression du processus | Complexité haute (mock Jira, LLM, Git). Aujourd'hui, chaque story est un test d'intégration implicite. |
| Q-02 | Le workflow peut-il fonctionner sans Jira ? | Résilience, mode offline complet | Possible si .gov-local.json devient source de vérité temporaire + file de transitions. Pas implémenté. |
| Q-03 | Faut-il un dashboard temps réel au lieu du batch ? | Visibilité PO, multi-sessions | PD-290 dans le backlog (Flask local + WORKFLOW-STATE.md → migration Jira API). |
| Q-04 | Le modèle constitutionnel est-il vérifiable formellement ? | Garantie mathématique que les Articles sont respectés | Pipeline Prolog existe pour les besoins. Extension aux Articles I-VII envisageable mais non priorisée. |
| Q-05 | Quelle stratégie de migration pour les stories historiques (pré-Jira FSM) ? | Cohérence de l'historique | Les WORKFLOW-STATE.md existants dans les projets cibles ne sont plus lus. Les données sont dans metrics.jsonl et learnings.jsonl. Pas de rétro-migration prévue. |
| Q-06 | Faut-il supporter plusieurs développeurs en parallèle ? | Passage à l'échelle | Nécessiterait : mutex .gov-local.json, namespacing Jira, merge de learnings. Hors périmètre actuel (développeur unique). |
| Q-07 | Comment gérer l'obsolescence des TIDs Jira ? | Fiabilité des transitions | jira_list_transitions() permet la redécouverte dynamique. Pas de mécanisme automatique de mise à jour des mappings data/fsm.yaml. |
| Q-08 | Les credentials doivent-ils être centralisés dans Vault uniquement ? | Sécurité, rotation | Aujourd'hui dupliqués dans jira-api.sh et CLAUDE.local.md. Migration Vault ajouterait une dépendance au démarrage. |
8. Hors périmètre¶
| # | Exclusion | Raison | Story potentielle |
|---|---|---|---|
| HP-01 | CI/CD du repo de gouvernance | Outil interne, pas un livrable | — |
| HP-02 | Tests automatisés du workflow | Complexité mock multi-LLM | Q-01 |
| HP-03 | Multi-utilisateur / multi-sessions | Développeur unique | Q-06 |
| HP-04 | Monitoring/alerting temps réel | Dashboard manuel suffisant | PD-290 |
| HP-05 | Gestion centralisée des secrets | Vault seul ajouterait une dépendance | Q-08 |
| HP-06 | Rollback automatique Jira | Transitions globales manuelles | — |
| HP-07 | Vérification formelle des Articles | Pipeline Prolog limité aux besoins | Q-04 |
| HP-08 | Interface web / GUI du workflow | CLI + VSCode suffisant | — |
| HP-09 | Support de LLM alternatifs (Gemini, Mistral) | Le routage dynamique via assignee Jira rend l'ajout d'un nouveau LLM trivial (créer l'utilisateur Jira + ajouter le mapping dans jira_assignee_to_executor). Non priorisé. | — |
| HP-10 | Internationalisation (i18n) | Utilisateur francophone unique | — |
9. Risques identifiés¶
| # | Risque | Probabilité | Impact | Mitigation |
|---|---|---|---|---|
| R-01 | Dépendance ChatGPT : si API OpenAI down, 5 étapes bloquées | Moyenne | Élevé | Pas de fallback LLM local pour ces étapes. claude -p comme reviewer partiel (dérogation Art. II documentée). |
| R-02 | TIDs Jira instables : si le workflow Jira est modifié | Faible | Élevé | jira_list_transitions() pour redécouverte. data/fsm.yaml à mettre à jour manuellement. |
| R-03 | Race condition .gov-local.json : 2 sessions sur la même story | Faible | Moyen | Convention "1 session par story". Pas de mutex implémenté. |
| R-04 | Prompts > 30KB : ChatGPT bascule en mode agentic involontaire | Connue | Moyen | Sanitisation paths absolus + claude -p comme fallback. |
| R-05 | Stagnation gate : corrections cosmétiques sans progrès réel | Moyenne | Moyen | Détection delta=0 → ESCALADE immédiate (Art. I). |
| R-06 | Volume de données : 100+ stories → JSONL trop gros pour grep/jq | Faible | Faible | Migration vers base structurée si nécessaire. Learnings déjà indexés par FAISS. |
| R-07 | Obsolescence des agents : changement de modèle (GPT-5 → GPT-6, Claude 4 → 5) | Certaine | Moyen | agent-registry.yaml avec shadow evals pour valider les nouveaux modèles avant bascule. |
| R-08 | Constitutional check incomplet : scan heuristique, pas de preuve formelle | Moyenne | Moyen | Vérification formelle Prolog envisageable (Q-04) mais non priorisée. |
10. Dépendances¶
| Composant | Statut | Impact sur le workflow |
|---|---|---|
| Jira Cloud (Atlassian) | Opérationnel | Source de vérité pour l'état. Indisponibilité = mode dégradé. |
| OpenCode + ChatGPT Plus | Opérationnel | Steps 1, 2, gates P1/P2. Indisponibilité = blocage. |
| Claude Code (Anthropic) | Opérationnel | Runtime principal. Indisponibilité = workflow impossible. |
| Ollama / IA-Server | Opérationnel | Embeddings, shadow evals. Indisponibilité = dégradation (pas de nouveaux learnings indexés). |
| GitLab CI/CD | Opérationnel | Pipeline vert requis avant REX. Indisponibilité = REX bloqué. |
| HashiCorp Vault | Opérationnel | Credentials GitLab, Sonar. Indisponibilité = intégrations bloquées. |
| sonar-scanner (local) | Installé | Phase 1.5 step 7. Absence = STOP (substitution interdite). |
| python3 | Installé | Parsing JSON réponses Jira. Absence = fonctions Jira cassées. |
Annexe — Learnings injectés¶
Les learnings suivants, issus de 30+ stories gouvernées, ont directement façonné le système :
| Source | Learning | Impact sur le système |
|---|---|---|
| PD-55, PD-107, PD-31, PD-44 (8 stories) | Sonar QG FAILED découvert post-Gate 8 | → Phase 1.5 Sonar BLOQUANTE avant reviews LLM |
| PD-282 | createVerify(ALG).update(hash) = double-hash HSM | → Learning injecté dans prompts agents crypto |
| PD-282, PD-279 | ALTER TYPE ADD VALUE dans même transaction | → Learning injecté dans prompts agents DB |
| PD-250, PD-81 | Stagnation delta=0 sur gate | → Détection automatique + ESCALADE immédiate |
| PD-254, PD-282, PD-265, PD-283, PD-85 | Erreurs TypeScript post-generation multi-agents | → Vérification tsc --noEmit après CHAQUE agent |
| PD-55, PD-79, PD-31, PD-105, PD-53 | Faux positifs LLM en review | → Injection stubs connus + TODO tracés dans prompts |
| PD-250, PD-251 | Stubs inter-PD sans story destination | → Annotation // STUB: PD-XX obligatoire |
| PD-84 | Gate 3 : 3 itérations par manque de transitions retour | → Section "Transitions inverses" ajoutée au template spec |
| PD-86 | Spec mentionne Swift/SwiftUI pour un projet React Native | → Section "Stack technique" ajoutée au template spec |
| PD-80 | Gate 3 v1 = 5.94/10 par omission locks/idempotence | → Section "Mécanismes de protection distribuée" ajoutée au template spec |
| PD-262 | 50% faux positifs gate 8 sur stories mobile (natif invisible) | → Injection fichiers natifs Swift/Kotlin dans prompts review |
| PD-283 | integrityHash valide en format mais jamais vérifié fonctionnellement | → Checklist "Vérification fonctionnelle des champs sécurité" |
Ces learnings démontrent le mécanisme d'auto-amélioration du système : chaque erreur détectée en gate ou en REX modifie les templates, les rules ou les procedures pour empêcher sa récurrence.