Aller au contenu

GOV-SYSTEM — Spécification canonique contractuelle

Objet : Spécification exhaustive du système de gouvernance IA ProbatioVault, produite par reverse-engineering du code existant. Ce document suit le format standard des spécifications PD-XX (sections 1–10).


1. Objectif

Le système de gouvernance IA ProbatioVault orchestre un workflow en 11 étapes (0–10) qui encadre le cycle de vie complet d'une user story, de l'expression de besoin jusqu'à la rétrospective. Le système DOIT garantir :

  • La séparation des pouvoirs entre agents producteurs et agents validateurs (aucun agent ne valide son propre travail).
  • La traçabilité probatoire de chaque événement (état, transition, artefact, verdict) dans Jira et sur disque.
  • L'application non négociable de quality gates mathématiques aux étapes de validation (gates 3, 5, 8).
  • La capitalisation systématique des apprentissages pour améliorer le processus de manière continue.

Le workflow suit le principe : Les agents produisent. Claude orchestre. Le PMO juge. L'humain tranche.


2. Périmètre / Hors périmètre

Inclus

  • Orchestration séquentielle des 11 étapes du workflow de gouvernance.
  • Gestion d'état hybride : Jira comme source de vérité (19 statuts custom, 24 transitions) + données locales (.gov-local.json).
  • Assemblage de prompts cache-first pour les LLM (Claude, ChatGPT, Ollama).
  • Exécution multi-agents (step 6) avec décomposition, dispatch séquentiel et synthèse.
  • Gates PMO (steps 3, 5, 8) : review croisée, confrontation, dossier de conformité, verdict YAML.
  • Acceptabilité automatisée (step 7) : quality gates (lint, format, types, tests, Sonar) + reviews LLM.
  • Capitalisation : métriques (metrics.jsonl), learnings (learnings.jsonl), dashboards, amélioration process.
  • Vérification constitutionnelle automatisée (Articles I–VII).
  • Revue documentaire pré-clôture (12/12 artefacts).
  • Intégrations : Jira REST API, OpenCode (ChatGPT), Ollama (LLM local), GitLab CI/CD, HashiCorp Vault.

Exclu

  • HP-01 : CI/CD du repo de gouvernance lui-même (pas de pipeline GitLab pour ia-governance).
  • HP-02 : Tests automatisés du workflow (pas de test harness pour l'orchestrateur multi-LLM).
  • HP-03 : Multi-utilisateur (un seul développeur/PO, pas de verrous concurrents).
  • HP-04 : Monitoring/alerting du workflow en production (dashboard manuel uniquement).
  • HP-05 : Gestion centralisée des secrets (credentials dupliqués entre jira-api.sh et CLAUDE.local.md).
  • HP-06 : Rollback automatique de transitions Jira incorrectes (transitions globales manuelles uniquement).

3. Définitions

Terme Définition contractuelle
Story User story identifiée par PD-XX (ex: PD-42), unité de travail du workflow.
Step Étape du workflow (0 à 10), chacune avec un agent producteur, des artefacts attendus, et potentiellement une gate.
Gate Point de contrôle PMO (steps 3, 5, 8) avec review croisée, scoring et verdict.
Verdict Résultat d'une gate : GO, RESERVE, NON_CONFORME, ou ESCALADE.
Scoring Évaluation numérique sur 10 de chaque axe d'analyse. Seuils : GO ≥ 8.0 partout, RESERVE ≥ 7.0 moyenne, NON_CONFORME sinon.
Iteration Tentative de passage d'une gate (v1, v2, v3). Plafond : 3 itérations par gate.
Delta Différence de score moyen entre deux itérations consécutives : score_mean(vN) - score_mean(vN-1).
ESCALADE Mise en pause du workflow nécessitant une décision humaine (PO). Déclenchée par plafond 3 itérations, stagnation (delta=0), ou blocage.
Validation croisée Principe Art. II : le LLM qui produit un document n'est jamais celui qui le review en gate.
Cache-first Stratégie d'assemblage des prompts : contenu statique en tête (cacheable), contenu variable en queue. Exploite le prefix matching de l'API Anthropic (TTL 5 min).
Artefact Document produit par une étape : besoin, specification, tests, plan, code-contracts, decomposition, acceptability, rex, retrospective, verdict.
Constitution Document CONSTITUTIONAL.md contenant les Articles I–VII, règles inviolables injectées dans toutes les gates.
Code-contracts Fichier YAML (PD-XX-code-contracts.yaml) définissant les modules, interfaces, invariants et contraintes pour le multi-agents (step 6).
Manifest Table CSV dans PD-XX-decomposition.md listant les tâches agents : agent, module, description, livrable, fichiers autorisés.
Data-index Index YAML structuré dans data/specs-index/ reflétant tous les artefacts de chaque story.
Compounder Phase post-step 9 qui agrège métriques, learnings, dashboards et améliorations process.
.gov-local.json Fichier JSON par epic stockant les données que Jira ne peut pas représenter : iteration, substeps, history, accepted_reserves, prompt_versions.
TID Transition ID Jira. Identifiant numérique d'une transition dirigée ou globale dans le workflow Jira.
P1 / P2 Respectivement le premier reviewer et le second (confrontation) dans une gate. P1 et P2 sont toujours des LLM distincts.

4. Invariants (non négociables)

ID Règle Justification
INV-GOV-01 Scoring mathématique : GO si tous les scores ≥ 8.0/10, RESERVE si moyenne ≥ 7.0 avec au moins un < 8.0, NON_CONFORME si moyenne < 7.0 ou un score < 6.0. Art. I CONSTITUTIONAL — seuils non négociables, pas de dérogation manuelle.
INV-GOV-02 Plafond 3 itérations par gate. À la 3e itération NON_CONFORME, le système DOIT déclencher ESCALADE. Art. I — empêche les boucles infinies de correction.
INV-GOV-03 Stagnation delta=0 : si le score moyen ne progresse pas entre deux itérations consécutives (delta=0), le système DOIT déclencher ESCALADE immédiatement. Art. I — empêche les corrections cosmétiques sans progrès réel.
INV-GOV-04 Validation croisée obligatoire : le LLM producteur d'un document NE DOIT JAMAIS être le reviewer P1 en gate. L'assignee Jira de chaque statut encode cette contrainte : SPECIFICATION=ChatGPT (produit), GATE_SPEC=Claude (review) ; PLAN=Claude (produit), GATE_PLAN=ChatGPT (review) ; IMPLEMENTATION=Claude (produit), GATE_CLOSURE=ChatGPT (review). Art. II — séparation des pouvoirs, encodée dans les automation rules Jira.
INV-GOV-05 Sync Jira à chaque événement : toute transition d'étape DOIT être reflétée immédiatement dans Jira (transition + commentaire). Ne JAMAIS attendre la fin du workflow. Art. III — traçabilité temps réel pour le PO et l'audit.
INV-GOV-06 Quality gates non contournables : lint, format, TypeScript, tests unitaires, et Sonar sont BLOQUANTS en step 7. Aucun skip autorisé. Art. IV — non-régression garantie.
INV-GOV-07 Sonar QG BLOQUANT : si Sonar Quality Gate = ERROR, le workflow DOIT s'arrêter AVANT les reviews LLM (step 7 Phase 1.5). La substitution ESLint+tsc n'est PLUS acceptée. Art. V — 8 stories historiques avec corrections post-Gate 8 causées par Sonar QG FAILED.
INV-GOV-08 Acceptabilité complète : Phase 1 (QG auto) ET Phase 1.5 (Sonar) ET Phase 2 (reviews LLM) sont toutes OBLIGATOIRES. Aucune phase ne peut être sautée. Art. V — couverture exhaustive.
INV-GOV-09 Responsabilité totale du code : tout agent est responsable de TOUS les bugs dans sa sortie. Aucun bug n'est "pré-existant". Correction immédiate obligatoire. Art. VI — pas de dette technique transférée.
INV-GOV-10 Skills = force constitutionnelle : l'invocation d'un skill engage l'agent à respecter TOUTES ses contraintes. Art. VII — mémoire positronique (Asimov).
INV-GOV-11 Isolation inter-étapes : chaque étape est exécutée dans un contexte isolé. Aucune pollution de variables ou de contexte LLM entre étapes. Empêche les biais de confirmation et les fuites de contexte.
INV-GOV-12 12/12 artefacts avant clôture : la transition Jira → Done (tid 31) est INTERDITE si un des 12 artefacts requis (6 MD + 6 YAML data-index) est absent. Complétude documentaire pour l'audit.
INV-GOV-13 Vérification TypeScript inter-agent : après chaque agent step 6b, npx tsc --noEmit DOIT être exécuté. Si le build casse, corriger AVANT de passer à l'agent suivant. 5+ stories historiques avec erreurs TS découvertes tardivement.
INV-GOV-14 Cache-first ordering : dans tout prompt assemblé, le contenu statique (templates, documents, rules) DOIT précéder le contenu variable (identité agent, tâche, corrections). Le bloc statique DOIT être byte-identical entre appels d'une même phase. Exploite le prompt caching Anthropic (TTL 5 min) pour réduire coût et latence.
INV-GOV-15 Stubs inter-PD avec story destination : chaque stub dans le code DOIT être annoté avec la story de destination exacte (ex: // STUB: PD-37 — signature PDF probante). Un stub sans story tracable est signalé MAJEUR en Gate 8. Traçabilité des dépendances inter-stories.
INV-GOV-16 Prompt versioning : chaque template de prompt porte un header versionné (prompt_id | version | updated | changelog). Les versions sont enregistrées dans .gov-local.json au démarrage du workflow. Reproductibilité et audit des prompts utilisés.
INV-GOV-17 Session recording : chaque événement significatif (début/fin step, appel LLM, verdict gate, écriture artefact) DOIT être logué dans data/sessions/{story}-session.jsonl. Audit trail complet, métriques de performance.
INV-GOV-18 Cohérence inter-EB : après chaque step 0, le nouveau besoin DOIT être vérifié contre les besoins existants via le pipeline Prolog. Si contradiction critique → STOP avant step 1. Prévention des incohérences fonctionnelles entre stories.
INV-GOV-19 Jira est la source de vérité pour l'état : l'état du workflow est déterminé par le statut Jira de l'issue. .gov-local.json ne contient que les données complémentaires (iteration, substeps). En cas de désaccord, Jira fait foi. Single source of truth, visibilité PO directe.
INV-GOV-20 RESERVE requiert validation humaine : un verdict RESERVE NE DOIT JAMAIS entraîner une continuation automatique. L'humain DOIT explicitement accepter (Option A : lever les réserves, Option B : accepter avec justification tracée). Art. I — les réserves sont des points < 8.0 qui méritent attention.
INV-GOV-21 Routage dynamique via assignee Jira : l'executor d'une étape est déterminé par l'assignee Jira de l'issue, pas par un mapping hardcodé. jira_get_assignee()jira_assignee_to_executor() → routage. Fallback sur mapping statique si Jira inaccessible. Déclaratif et configurable : changer d'agent pour une étape = modifier la rule Jira, sans toucher au code.
INV-GOV-22 Jira inaccessible = BLOCAGE : si Jira est down, check_prerequisites() et get_current_step() DOIVENT retourner une erreur (return 1). Aucun fallback permissif. Le workflow ne peut pas avancer sans validation Jira. Empêche toute dérive en mode dégradé.
INV-GOV-23 Reviews LLM parallèles : les 3 reviews d'acceptabilité (code, tests, sécurité) DOIVENT être lancées en parallèle via parallel-reviews.sh (3 sessions OpenCode concurrentes). Elles sont indépendantes et partagent le même préfixe cache-first. Gain ~30-40 min par story. Art. II respecté : c'est ChatGPT (assignee ACCEPTABILITE) qui review, pas Claude (auteur du code).
INV-GOV-24 Détection de régression inter-stories : les prompts de review (step 7) et les prompts agents (step 6b) DOIVENT inclure les invariants des stories sœurs (même domaine/epic). collect-sibling-invariants.py extrait les invariants depuis le data-index YAML. Tout invariant hérité violé DOIT être signalé BLOQUANT. Empêche qu'une story conforme à ses propres invariants casse une garantie acquise par une story antérieure.

5. Flux nominaux

Flux N1 — Workflow complet (happy path)

  1. L'utilisateur invoque /gov PD-XX [projet].
  2. Le système probe les capabilities disponibles (claude-p, opencode, ollama, vault).
  3. Le système interroge Jira pour le statut courant de PD-XX.
  4. Le système résout le projet cible et localise le dossier epic.
  5. Le système initialise l'état : Jira (transition si nécessaire) + .gov-local.json (création si absent).
  6. Le système affiche les règles constitutionnelles et l'état des 11 étapes.
  7. Pour chaque étape non terminée (0 → 10) :
  8. Le système assemble le prompt approprié (cache-first).
  9. Le système exécute l'étape selon son type (Claude / ChatGPT / Gate / Multi-agent).
  10. Le système détecte l'artefact produit.
  11. Le système met à jour Jira (transition + commentaire) et .gov-local.json.
  12. Le système génère le YAML data-index correspondant.
  13. Le système logue l'événement dans la session.
  14. Après l'étape 10, le système exécute la revue documentaire (12/12 artefacts).
  15. Le système exécute le compounder (métriques, learnings, dashboards, améliorations process).
  16. Le système transitionne Jira → Done (tid 31).

Flux N2 — Gate PMO (steps 3, 5, 8)

  1. Le système assemble le prompt de review et l'envoie au reviewer P1.
  2. P1 produit un document de review.
  3. Le système assemble le prompt de confrontation et l'envoie au reviewer P2 (LLM différent de P1).
  4. P2 produit un document de confrontation comparant les documents focaux avec la review P1.
  5. Le système synthétise le dossier de conformité (écarts, scoring).
  6. Le système exécute la vérification constitutionnelle automatisée.
  7. Le verdict est produit avec scores individuels, moyenne, delta (si itération > 1), et verdict final.
  8. Selon le verdict :
  9. GO : transition vers l'étape suivante.
  10. RESERVE : pause, validation humaine requise (Option A ou B).
  11. NON_CONFORME : transition vers correction, iteration++.
  12. ESCALADE : transition vers ESCALADE_*, workflow en pause.

Flux N3 — Multi-agents (step 6)

  1. Phase 0 : création de la feature branch Git (feature/{story-id}-{slug}).
  2. Phase 6a : Claude génère le manifest de décomposition (table CSV : agent, module, description, livrable, fichiers autorisés).
  3. Phase 6b : pour chaque ligne du manifest, le système :
  4. Assemble le prompt agent (bloc stable : spec + tests + plan + TOUS code-contracts ; bloc variable : identité agent + mission + contract du module).
  5. Exécute l'agent (Claude auto via claude -p, ChatGPT auto via opencode run).
  6. Sauvegarde le livrable.
  7. Exécute npx tsc --noEmit (si applicable). Si erreur → correction avant agent suivant.
  8. Commit intermédiaire sur la feature branch.
  9. Met à jour la sous-étape dans .gov-local.json.
  10. Phase 6c : Claude orchestre la synthèse finale, résout les conflits d'interface, écrit le code dans le projet.

Flux N4 — Acceptabilité (step 7)

  1. Phase 1 : Quality gates automatisés (lint, format, TypeScript, tests, couverture ≥ 80%).
  2. Phase 1.5 : Sonar Quality Gate local. Si ERROR → STOP.
  3. Phase 2 : 3 reviews LLM parallèles (code, tests, sécurité). Injection des stubs connus et TODO tracés pour réduire les faux positifs.
  4. Phase 3 : synthèse dans PD-XX-acceptability.md.

Flux N5 — Correction (NON_CONFORME)

  1. Le verdict NON_CONFORME liste les écarts à corriger.
  2. Le système transitionne Jira vers l'état de correction approprié (NON_CONFORME SPEC/PLAN/CLOSURE).
  3. L'agent qui a produit le document original corrige (même LLM, même type).
  4. Le step amont est relancé (step 7 pour Gate 8, step 4 pour Gate 5, step 1 pour Gate 3).
  5. La gate est relancée (itération v2, v3).
  6. Si 3 NON_CONFORME consécutifs → ESCALADE automatique (INV-GOV-02).

Flux N6 — ESCALADE

  1. Le verdict ESCALADE ou le plafond 3 itérations transitionne Jira vers ESCALADE_SPEC/PLAN/CLOSURE.
  2. Le workflow se met en pause (exit code 3).
  3. Le PO examine la situation et prend une décision.
  4. L'humain relance le workflow ou transitionne manuellement (tid 22/23/24 → retour gate).

Flux N7 — Reprise après interruption

  1. L'utilisateur relance /gov PD-XX.
  2. Le système interroge Jira pour le statut courant.
  3. Le système lit .gov-local.json pour les données locales (iteration, substeps).
  4. Le système détermine la prochaine étape non terminée et reprend le workflow.

Flux N8 — Compounder (post step 9)

  1. Append métriques story dans data/metrics.jsonl.
  2. Vérifier/compléter data/learnings.jsonl (extraction depuis REX + verdicts).
  3. Régénérer les dashboards (dashboards/GOVERNANCE-DASHBOARD.md).
  4. Appliquer les améliorations process issues du REX : haute priorité (immédiat), moyenne (fin step 9).
  5. Si modification CLAUDE.md ou CONSTITUTIONAL.md → validation humaine obligatoire.
  6. Mettre à jour la matrice de traçabilité (RTM).

6. Cas d'erreur

ID Condition d'erreur Réponse attendue
ERR-GOV-01 Jira indisponible (timeout 15s) jira_get_status() retourne "JIRA_UNAVAILABLE". Le workflow continue en mode dégradé avec .gov-local.json comme source temporaire. Les transitions sont mises en file d'attente.
ERR-GOV-02 Transition Jira échoue (TID invalide ou statut incompatible) Le système logue l'erreur, affiche le message, et demande à l'utilisateur de continuer ou non. Pas de retry automatique.
ERR-GOV-03 OpenCode (ChatGPT) timeout ou mode agentic involontaire Retry 1 fois. Si échec persistant : fallback clipboard pour prompts < 30KB, fallback claude -p comme reviewer pour prompts > 30KB (dérogation Art. II documentée dans verdict).
ERR-GOV-04 npx tsc --noEmit échoue entre agents step 6b STOP immédiat. Corriger les erreurs TypeScript AVANT de passer à l'agent suivant. Pas de bypass.
ERR-GOV-05 Sonar Quality Gate ERROR en step 7 STOP avant les reviews LLM. L'agent DOIT corriger les issues Sonar, puis relancer la Phase 1.5.
ERR-GOV-06 Artefact attendu non détecté après exécution d'un step Le système affiche un message d'erreur et demande à l'utilisateur de confirmer le chemin de l'artefact ou de le produire manuellement.
ERR-GOV-07 Pipeline Prolog détecte une contradiction critique inter-EB (step 0) STOP avant step 1. Résolution obligatoire de la contradiction, puis relance de la vérification.
ERR-GOV-08 Plafond 3 itérations atteint en gate ESCALADE automatique. Transition Jira vers ESCALADE_*. Workflow en pause.
ERR-GOV-09 Delta=0 entre deux itérations consécutives ESCALADE immédiate. Commentaire Jira "stagnation delta=0".
ERR-GOV-10 Documents manquants à la revue pré-clôture (< 12/12) Clôture Jira BLOQUÉE. Liste des documents manquants affichée. L'agent DOIT produire les documents manquants avant de retenter la clôture.
ERR-GOV-11 .gov-local.json corrompu ou absent Régénération depuis l'état Jira (statut → step) + valeurs par défaut (iteration=1, substeps vides). Perte potentielle du compteur d'itérations — warning affiché.
ERR-GOV-12 Dossier epic introuvable pour la story Proposition de création interactive (domaine + description). Si refus → abandon.
ERR-GOV-13 claude -p échoue (conflit CLAUDECODE) Le système DOIT préfixer la commande par unset CLAUDECODE &&. Si échec persistant → fallback clipboard.
ERR-GOV-14 sonar-scanner non installé Le système DOIT installer sonar-scanner (brew install sonar-scanner). La dérogation ESLint+tsc comme substitution n'est PLUS acceptée.

7. Critères d'acceptation (testables)

ID Critère Observable
CA-GOV-01 Une story PEUT traverser les 11 étapes de bout en bout sans intervention manuelle (hors gates RESERVE et ESCALADE). Jira passe de To Do à Done ; 12 artefacts produits ; metrics.jsonl contient une entrée pour la story.
CA-GOV-02 Le statut Jira reflète l'étape courante en temps réel (INV-GOV-05). À tout moment, jira_get_status(PD-XX) retourne un statut cohérent avec l'étape en cours d'exécution.
CA-GOV-03 Chaque gate produit exactement 4 artefacts : review, confrontation, dossier, verdict (INV-GOV-04). 4 fichiers dans le dossier epic : PD-XX-review-stepN.md, PD-XX-confrontation-stepN.md, PD-XX-dossier-conformite-stepN.md, PD-XX-verdict-stepN-vI.yaml.
CA-GOV-04 Le verdict YAML contient : scores individuels, score moyen, delta (si N > 1), verdict final, et axes d'analyse. Fichier YAML parseable avec tous les champs requis.
CA-GOV-05 Un verdict NON_CONFORME revient à l'étape de correction et incrémente iteration (INV-GOV-02). Jira en CORRECTION/NON_CONFORME, .gov-local.json iteration == N+1.
CA-GOV-06 L'ESCALADE bloque le workflow et ne peut être débloquée que par action humaine (INV-GOV-02, INV-GOV-03). Jira en ESCALADE_*, exit code 3, aucune progression automatique tant que l'humain ne transitionne pas.
CA-GOV-07 Le multi-agents (step 6) produit un manifest puis exécute chaque agent séquentiellement avec vérification TS entre agents (INV-GOV-13). Fichiers PD-XX-decomposition.md + N fichiers PD-XX-agent-*-*.md, sous-étapes tracées dans .gov-local.json.
CA-GOV-08 Les prompts sont assemblés en mode cache-first : bloc stable byte-identical entre appels, bloc variable en dernier (INV-GOV-14). Prompt assemblé dans .workspace/ vérifiable : sections statiques en tête, variables en queue.
CA-GOV-09 Les learnings sont extraits automatiquement après chaque story et indexés par embeddings. Nouvelles entrées dans learnings.jsonl avec tags, story, gate, learning. Index FAISS mis à jour.
CA-GOV-10 La revue documentaire bloque la clôture Jira si un artefact est manquant (INV-GOV-12). check-docs.sh retourne 1 si < 12 documents. Transition Done (tid 31) non exécutée.
CA-GOV-11 Le workflow survit à une interruption et reprend au bon endroit (INV-GOV-19). Après kill + relance, get_current_step() retourne l'étape correcte en interrogeant Jira.
CA-GOV-12 La validation croisée respecte le mapping P1/P2 par gate (INV-GOV-04). Dossier de conformité identifie explicitement les 2 LLM utilisés (un pour review, l'autre pour confrontation).
CA-GOV-13 Les agents step 6b reçoivent TOUS les code-contracts (pas seulement celui de leur module). Prompt agent contient le fichier code-contracts.yaml complet dans le bloc stable.
CA-GOV-14 Un verdict RESERVE exige une décision humaine explicite (Option A ou B) avec justification tracée (INV-GOV-20). .gov-local.json contient accepted_reserves si Option B. Pas de continuation automatique.
CA-GOV-15 Le pipeline de cohérence Prolog détecte les contradictions inter-EB et bloque avant step 1 si critique (INV-GOV-18). Rapport Prolog produit. Si contradiction critique : step 1 non démarré.
CA-GOV-16 Les versions des prompts utilisés sont enregistrées au démarrage du workflow (INV-GOV-16). .gov-local.json contient prompt_versions avec l'ID et la version de chaque template.
CA-GOV-17 Le compounder produit des métriques, learnings, dashboard, et améliorations process après chaque story. metrics.jsonl contient l'entrée story. dashboards/GOVERNANCE-DASHBOARD.md mis à jour. Si améliorations process : diff Git visible.
CA-GOV-18 La vérification constitutionnelle automatisée détecte les violations d'Articles avant le verdict de gate. constitutional-check.sh s'exécute en Phase 3 de chaque gate. Violations listées dans le dossier de conformité.

8. Scénarios de test (Given / When / Then)

ST-GOV-01 — Gate GO : scoring conforme

Given une gate 3 avec review P1 et confrontation P2
When tous les scores individuels sont ≥ 8.0/10
Then le verdict est "GO"
And Jira transitionne de GATE SPEC vers PLAN (tid 7)
And l'artefact PD-XX-verdict-step3-v1.yaml contient verdict: GO

ST-GOV-02 — Gate RESERVE : score moyen suffisant, un axe faible

Given une gate 5 avec score moyen = 7.5 et un axe à 7.0
When le verdict est calculé selon INV-GOV-01
Then le verdict est "RESERVE"
And le workflow se met en pause
And l'humain doit explicitement accepter (Option A ou B) avant continuation

ST-GOV-03 — Gate NON_CONFORME : score insuffisant

Given une gate 8 avec score moyen = 6.5
When le verdict est calculé selon INV-GOV-01
Then le verdict est "NON_CONFORME"
And Jira transitionne vers NON_CONFORME CLOSURE (tid 12)
And .gov-local.json iteration est incrémenté de 1

ST-GOV-04 — Plafond 3 itérations déclenche ESCALADE

Given une gate 3 avec iteration = 3 et verdict = NON_CONFORME
When le système vérifie INV-GOV-02
Then le système déclenche ESCALADE au lieu d'une 4e itération
And Jira transitionne vers ESCALADE SPEC (tid 18)
And le workflow s'arrête avec exit code 3

ST-GOV-05 — Stagnation delta=0 déclenche ESCALADE

Given une gate 5 v2 avec score moyen = 7.2
And gate 5 v1 avait score moyen = 7.2 (delta = 0)
When le système vérifie INV-GOV-03
Then le système déclenche ESCALADE immédiatement
And Jira transitionne vers ESCALADE PLAN (tid 19)
And un commentaire "stagnation delta=0" est posté sur Jira

ST-GOV-06 — Validation croisée Gate 3

Given une gate 3 déclenchée
When le review P1 est exécuté
Then P1 est Claude (factual)
And P2 (confrontation) est ChatGPT (factual, température 0.1)
And le dossier de conformité identifie les 2 LLM distincts

ST-GOV-07 — Multi-agents : vérification TS inter-agent

Given un step 6b avec 3 agents dans le manifest
When l'agent 1 est terminé et produit du code TypeScript
Then npx tsc --noEmit est exécuté
And si des erreurs TS sont détectées, l'agent 2 n'est pas lancé
And les erreurs sont corrigées avant de continuer

ST-GOV-08 — Acceptabilité : Sonar bloquant

Given un step 7 avec Phase 1 (QG auto) = PASS
When Sonar Quality Gate retourne ERROR
Then les reviews LLM (Phase 2) ne sont PAS exécutées
And le workflow s'arrête avec un message "Sonar QG ERROR"

ST-GOV-09 — Revue documentaire : document manquant

Given une story avec 11/12 artefacts (rex.yaml manquant)
When check-docs.sh est exécuté
Then le script retourne exit code 1
And la transition Jira → Done n'est pas exécutée
And le message liste "MISSING: rex.yaml"

ST-GOV-10 — Reprise après interruption

Given un workflow PD-42 interrompu au step 4 (Jira en PLAN)
When l'utilisateur relance /gov PD-42
Then le système interroge Jira, obtient statut PLAN
And get_current_step() retourne 4
And le workflow reprend au step 4 sans re-exécuter 0-3

ST-GOV-11 — ESCALADE : déblocage humain

Given un workflow PD-42 en ESCALADE PLAN (Jira)
When l'humain transitionne Jira de ESCALADE PLAN vers GATE PLAN (tid 23)
And l'utilisateur relance /gov PD-42
Then le système détecte statut GATE PLAN
And la gate 5 est relancée (itération v2)

ST-GOV-12 — Cohérence inter-EB : contradiction critique

Given un step 0 produit un besoin PD-XX-besoin.md
When le pipeline Prolog détecte une contradiction critique avec PD-YY
Then le step 1 n'est PAS démarré
And un rapport de contradiction est affiché
And l'utilisateur doit résoudre la contradiction avant de continuer

ST-GOV-13 — Cache-first : bloc stable identique entre agents

Given un step 6b avec agents A1 et A2
When les prompts de A1 et A2 sont assemblés
Then les N premières lignes (bloc stable) sont byte-identical
And seul le bloc variable (identité agent, tâche) diffère

ST-GOV-14 — Compounder : métriques et learnings

Given un step 9 terminé pour PD-XX
When le compounder s'exécute
Then metrics.jsonl contient une nouvelle ligne pour PD-XX
And learnings.jsonl contient les learnings extraits
And dashboards/GOVERNANCE-DASHBOARD.md est régénéré

ST-GOV-15 — RESERVE Option B : justification tracée

Given un verdict RESERVE avec 2 axes < 8.0
When l'humain choisit Option B (accepter les réserves)
Then l'humain fournit une justification écrite
And .gov-local.json contient accepted_reserves avec la justification
And un commentaire Jira documente la décision
And le workflow continue vers l'étape suivante

9. Hypothèses explicites

ID Hypothèse Impact si faux
HYP-GOV-01 Jira est accessible depuis la machine locale via HTTPS avec authentification Basic (email + API token). Fallback .gov-local.json dégradé : pas de transition, pas de commentaire, perte de visibilité PO.
HYP-GOV-02 Claude Code (extension VSCode) est le runtime principal. Les skills .claude/commands/ sont chargés automatiquement. Si CLI standalone : skills non disponibles, fallback scripts shell uniquement.
HYP-GOV-03 OpenCode est installé et authentifié avec un compte ChatGPT Plus. Le modèle gpt-5.3-codex est disponible. Steps ChatGPT impossibles. Fallback clipboard (interdit par règle) ou claude -p (dérogation Art. II).
HYP-GOV-04 Ollama est accessible sur IA-Server (192.168.1.82:11434) avec les modèles qwen3.5:35b-a3b et llama3.3:70b. Indexation embeddings impossible. Shadow evals bloquées. Pas de fallback cloud (données potentiellement sensibles).
HYP-GOV-05 Le projet cible suit la convention docs/epics/{domain}/{PD-XX-slug}/ pour les artefacts. Epic non trouvé → création interactive avec domaine et description.
HYP-GOV-06 python3 est disponible dans le PATH pour le parsing JSON des réponses Jira. Fallback jq non implémenté. Fonctions Jira retournent des chaînes vides.
HYP-GOV-07 sonar-scanner est installé localement via Homebrew. Phase 1.5 impossible → STOP obligatoire. L'orchestrateur DOIT installer sonar-scanner avant de continuer.
HYP-GOV-08 Les templates de prompts sont stables pendant toute la durée d'une story. Aucune modification mid-workflow. Si template modifié mid-story : incohérence entre artefacts produits avec des versions différentes du prompt.
HYP-GOV-09 Le workflow Jira Team-managed expose les transitions via l'API REST /rest/api/3/issue/{id}/transitions. Les TIDs sont stables. Si workflow Jira modifié : TIDs invalides → transitions échouent silencieusement (curl -sf). Redécouverte via jira_list_transitions().
HYP-GOV-10 Un seul workflow est actif par story à un instant donné. Pas de sessions concurrentes sur la même issue. Race condition sur .gov-local.json : corruption compteur iteration, sous-étapes incohérentes.
HYP-GOV-11 Le réseau local est fiable (pas de perte de connectivité prolongée vers Jira, GitLab, Ollama). Transitions Jira perdues, commits Git bloqués, embeddings non mis à jour.
HYP-GOV-12 Les credentials Jira et Vault dans CLAUDE.local.md sont valides et non expirés. Toutes les intégrations (Jira, GitLab via Vault, Sonar via Vault) échouent.

10. Points à clarifier

ID Point à clarifier Donnée manquante / décision requise
Q-GOV-01 Mutex .gov-local.json : faut-il implémenter un verrou fichier (flock) pour prévenir les écritures concurrentes ? Aujourd'hui, la convention "1 session par story" suffit. Mais si le dashboard mobile (PD-290) interroge en parallèle, un read lock serait nécessaire.
Q-GOV-02 Fallback Jira offline : en mode dégradé (Jira indisponible), faut-il accumuler les transitions dans une file locale et les rejouer au retour ? Aujourd'hui, la transition est simplement perdue. Le gap est comblé manuellement au prochain /gov status.
Q-GOV-03 Expiration des TIDs Jira : les TIDs sont-ils stables dans le temps pour un workflow Team-managed ? Découverts empiriquement via PD-290. Pas de garantie Atlassian. jira_list_transitions() permet la redécouverte dynamique.
Q-GOV-04 Versioning des skills : les skills .claude/commands/ ne portent pas de header versionné comme les prompts. Faut-il aligner ? Les skills sont versionnés par Git. Un header explicite améliorerait la traçabilité mais augmenterait la maintenance.
Q-GOV-05 Tests automatisés du workflow : est-il envisageable de créer un test harness pour les scripts shell (BATS, ShellSpec) ? Complexité haute (mock Jira, mock LLM, mock Git). ROI incertain vs. le nombre de stories exécutées comme tests d'intégration implicites.
Q-GOV-06 Centralisation des credentials : les credentials Jira sont dupliqués dans jira-api.sh et CLAUDE.local.md. Faut-il sourcer uniquement depuis Vault ? Migration possible mais ajoute une dépendance Vault au démarrage de chaque workflow.
Q-GOV-07 Dashboard temps réel : le dashboard est régénéré en batch (compounder). Faut-il un endpoint temps réel (PD-290) alimenté par Jira webhooks ? PD-290 est dans le backlog. La solution actuelle (/morning + dashboard MD) suffit pour un développeur solo.
Q-GOV-08 Nettoyage des WORKFLOW-STATE.md résiduels : les anciens fichiers dans les projets cibles ne sont plus lus mais pas supprimés. Faut-il les purger ? Pas d'impact fonctionnel (plus lus). Purge optionnelle pour hygiène.

Références

  • Epic : GOV-SYSTEM (meta — système de gouvernance lui-même)
  • Repos concernés : ProbatioVault-ia-governance (principal), tous les projets ProbatioVault (cibles)
  • Documents associés :
  • CONSTITUTIONAL.md — Articles I-VII (racine du depot ia-governance)
  • GOV-SYSTEM-plan.md — Plan d'implementation (reverse-engineered)
  • data/fsm.yaml — Machine d'etats formelle avec mapping Jira
  • CLAUDE.md — Instructions projet (racine du depot ia-governance)
  • CLAUDE.local.md — Credentials (non commite)

Machine d'états

           ┌──────────┐
           │  To Do   │
           │ (10033)  │
           └────┬─────┘
                │ tid 4
           ┌────▼─────┐
           │  BESOIN   │
           │ (10137)  │
           └────┬─────┘
                │ tid 5
       ┌────────▼─────────┐
       │  SPECIFICATION    │  ◄──── tid 8 (NON_CONFORME)
       │  (10138)         │
       └────────┬─────────┘
                │ tid 6
       ┌────────▼─────────┐         ┌──────────────────┐
       │   GATE SPEC      │──tid 18──▶ ESCALADE SPEC   │
       │   (10139)        │         │  (10147)         │
       └──┬─────────┬─────┘         └────────┬─────────┘
          │         │                         │ tid 22
     tid 7│    tid 8│                         │
          │         │              ◄──────────┘
     ┌────▼─────┐   │
     │   PLAN   │   │
     │  (10145) │   │
     └────┬─────┘   │
          │ tid 15  │
     ┌────▼─────────┐         ┌──────────────────┐
     │  GATE PLAN   │──tid 19──▶ ESCALADE PLAN   │
     │  (10146)     │         │  (10148)         │
     └──┬─────┬─────┘         └────────┬─────────┘
        │     │                        │ tid 23
   tid 16   tid 17                     │
        │     │             ◄──────────┘
   ┌────▼──────────────┐
   │  IMPLEMENTATION   │
   │  (10140)          │
   └────────┬──────────┘
            │ tid 9
   ┌────────▼──────────┐
   │  ACCEPTABILITE    │ ◄──── tid 13 (depuis NON_CONFORME CLOSURE)
   │  (10141)          │
   └────────┬──────────┘
            │ tid 10
   ┌────────▼──────────┐         ┌──────────────────────┐
   │  GATE CLOSURE     │──tid 20──▶ ESCALADE CLOSURE    │
   │  (10142)          │         │  (10149)             │
   └──┬─────┬──────────┘         └────────┬─────────────┘
      │     │                             │ tid 24
 tid 14   tid 12                          │
      │     │                  ◄──────────┘
      │  ┌──▼───────────────────────┐
      │  │  NON_CONFORME CLOSURE    │
      │  │  (10143)                 │──── tid 13 ──▶ ACCEPTABILITE
      │  └──────────────────────────┘
 ┌────▼─────┐
 │   REX    │
 │  (10144) │
 └────┬─────┘
      │ tid 24
 ┌────▼──────────────┐
 │  RETROSPECTIVE    │
 │  (10150)          │
 └────┬──────────────┘
      │ tid 31
 ┌────▼─────┐
 │   Done   │
 │  (10035) │
 └──────────┘

Transitions globales : tid 11 (→ To Do), tid 21 (→ In Progress), tid 2 (→ DONE with anomaly), tid 3 (→ REJECTED).