PD-297 — Boucle d'enrichissement formel¶
1. Contexte¶
PD-296 a intégré la vérification formelle (Art. VIII CONSTITUTIONAL) en mode lecture seule : formal-check.sh invoque le coherence check Prolog inter-EB, mais les scopes contracts, code et full retournent SKIP car formal-verify.py n'existe pas. Les prédicats extraits par extract-eb-predicates.py sont éphémères — ils ne sont jamais persistés dans la base formelle de ProbatioVault-formal.
Résultat : la base formelle ne s'enrichit pas au fil des stories. Chaque story repart de la même base statique (ontologie + normes). Les invariants découverts (INV-XXX-01..N), les code-contracts, et les patterns vérifiés ne sont pas capitalisés.
2. Problème¶
3 trous identifiés après PD-296 (2026-04-13) :
-
Pas d'enrichissement de l'ontologie : quand une story ajoute des invariants (INV-XXX-01..N), ils ne sont jamais injectés dans la base Prolog de ProbatioVault-formal. La prochaine story du même domaine ne bénéficie pas des nouvelles règles.
-
Pas d'extraction systématique des prédicats :
extract-eb-predicates.pyextrait des prédicats temporaires, les compare, puis les jette. Pas dedata/ontology.plpersistant accumulant les prédicats de toutes les stories. -
formal-verify.pyn'existe pas : les scopescontracts,code,fulldeformal-check.shretournentSKIP. Seule la cohérence Prolog inter-EB fonctionne.
3. Objectif¶
Fermer la boucle de vérification formelle : chaque story DONE enrichit la base formelle, et les stories suivantes bénéficient de cette base étendue. Implémenter formal-verify.py pour que formal-check.sh retourne GO/FAIL (pas SKIP) pour tous les scopes.
4. Périmètre¶
4.1 Enrichissement ontologie (step 10 / story DONE)¶
- Extraire les prédicats de la spec + code-contracts de la story terminée
- Les persister dans
ProbatioVault-formal/coherence/ontology/stories/PD-XXX.pl - Recompiler la base Prolog globale (
_ontology-facts.plétendu) - Intégrer dans
/gov-retrospective(step 10)
4.2 Enrichissement modèles TLA+/Alloy/Z (step 10)¶
- Extraire les invariants TLA+/Alloy/Z depuis les code-contracts
- Les ajouter aux modèles formels du domaine dans
ProbatioVault-formal/normes/{norme}/formal/ - Script
scripts/extract-formal-invariants.py - 4 formalismes : Prolog, TLA+, Alloy, Z
4.3 Implémentation formal-verify.py¶
- Pipeline complet chargeant les modèles formels du domaine
- Vérifie le code généré / les contracts contre les modèles
- Scopes :
contracts,code,full - Remplace le
SKIPactuel deformal-check.shpar un vrai verdictGO/FAIL
4.4 Test de non-régression formelle¶
- Après enrichissement, relancer le coherence check sur la base étendue
- Vérifier qu'aucune régression n'est introduite (nouveaux prédicats ne contredisent pas les anciens)
4.5 Documentation¶
- Mise à jour
procedures.mdetworkflow-rules.md - Point d'intégration step 10 / gov-retrospective
5. Hors périmètre¶
- Modification des normes existantes dans ProbatioVault-formal (lecture seule)
- Enrichissement rétroactif des stories déjà DONE (capitalisation future uniquement)
- Modification de
formal-check.sh(seulformal-verify.pyest créé, le wrapper existant l'appelle déjà)
6. Dépendances¶
| Dépendance | Statut | Impact |
|---|---|---|
| PD-296 (Art. VIII, formal-check.sh) | DONE | Prérequis — wrapper existant |
| ProbatioVault-formal (infrastructure TLA+/Prolog/Alloy/Z) | Existant | Cible de l'enrichissement |
| PD-295 (mémoire vivante, learnings.jsonl) | DONE | Cohérence avec capitalisation |
7. Critères de succès¶
| ID | Critère | Vérification |
|---|---|---|
| CS-1 | Après une story DONE, les prédicats de la spec sont persistés dans ProbatioVault-formal/coherence/ontology/stories/PD-XXX.pl | Glob du fichier après step 10 |
| CS-2 | Le coherence check de la story suivante voit les nouveaux prédicats (nombre de prédicats augmenté) | Lancer /coherence check après enrichissement |
| CS-3 | formal-check.sh --scope contracts retourne GO ou FAIL (pas SKIP) pour une story avec code-contracts | Exécuter formal-check.sh |
| CS-4 | formal-check.sh --scope code retourne GO ou FAIL (pas SKIP) pour une story avec implémentation | Exécuter formal-check.sh |
| CS-5 | Les invariants TLA+/Alloy/Z sont extraits et persistés dans les modèles du domaine | Glob des fichiers .tla/.als/.z ajoutés |
| CS-6 | Le test de non-régression passe après enrichissement (pas de contradiction) | Résultat coherence check post-enrichissement |
8. Invariants¶
| ID | Invariant | Justification |
|---|---|---|
| INV-297-01 | L'enrichissement est append-only : aucun prédicat existant n'est modifié ou supprimé | Prévient les régressions formelles |
| INV-297-02 | Tout prédicat persisté est tracé vers sa story source (PD-XXX) | Art. III CONSTITUTIONAL (traçabilité) |
| INV-297-03 | L'enrichissement est idempotent : relancer l'extraction pour la même story ne duplique pas les prédicats | Robustesse en cas de retry |
| INV-297-04 | Si l'extraction échoue, le workflow continue (non-bloquant à l'enrichissement, bloquant à la vérification) | Dégradation gracieuse pour l'enrichissement, fail-closed pour la vérification (Art. VIII) |
| INV-297-05 | formal-verify.py est fail-closed : toute erreur interne retourne FAIL, jamais GO par défaut | Art. VIII CONSTITUTIONAL |
9. Arbitrages et décisions¶
| Décision | Choix | Justification |
|---|---|---|
| Point d'intégration | gov-retrospective (step 10) | L'enrichissement fait partie de la capitalisation de la story, pas du compounder |
| 4 formalismes d'un coup | Oui (Prolog + TLA+ + Alloy + Z) | La description Jira les mentionne tous, le PO confirme |
| Persistance ontologie | ProbatioVault-formal/coherence/ontology/stories/PD-XXX.pl | Sous-dossier dédié, ne pollue pas _ontology-facts.pl qui est auto-généré |
formal-verify.py scope complet | Oui, GO/FAIL pour contracts/code/full | Remplace les SKIP actuels, active vraiment Art. VIII |
10. Projets concernés¶
| Projet | Rôle |
|---|---|
| ProbatioVault-ia-governance | Workflow : scripts d'extraction, intégration gov-retrospective, formal-verify.py |
| ProbatioVault-formal | Cible : ontologie enrichie, modèles formels étendus |