1. Objectif
Contractualiser les exigences necessaires et suffisantes pour faire passer a OK les 2 checks Prolog KO de l'audit PV-ANCHOR-001, sans regression fonctionnelle ni de conformite sur le reste du perimetre.
Objectifs mesurables : - Passer de 22/24 a 24/24 checks OK pour PV-ANCHOR-001. - Corriger le gap de detection des enums de statut pour anchor_batch.status. - Rendre observable la capacite du service d'ancrage a traiter un reorg via une methode de service attendue par les regles formelles. - Conserver a OK les 22 checks deja conformes.
2. Perimetre / Hors perimetre
Inclus
- Specification du comportement attendu de l'extraction de faits pour detecter les valeurs d'enum de
anchor_batch.status quand la colonne est stockee en varchar et que la propriete TypeScript est typee par enum. - Specification du contrat fonctionnel de presence d'une methode de service de gestion de reorg dans le module
anchor_batch. - Verification de conformite Prolog PV-ANCHOR-001 sur l'ensemble des checks.
- Non-regression des tests backend existants.
- Definition explicite du modele d'etats
AnchorBatchStatus, y compris transitions retour/interdites.
Exclu
- Changement de schema SQL/DDL de
anchor_batch.status. - Refonte du moteur Prolog, du domaine metier blockchain, ou des regles hors PV-ANCHOR-001.
- Optimisations de performance non liees au besoin.
- Evolution API publique non necessaire au passage des checks.
- Toute implementation detaillee (choix de classes, algorithmes internes, snippets de code).
3. Definitions
- PV-ANCHOR-001 : Audit formel de conformite du module d'ancrage.
- Check Prolog : Regle de verification formelle evaluee a partir de faits extraits du code.
entity_enum_values(Entity, Field, Values) : Fait Prolog listant les valeurs d'enum contractuelles d'un champ d'entite. service_method(Module, Method) : Fait Prolog attestant qu'une methode existe dans un service du module. - Reorg : Reorganisation de chaine blockchain invalident une confirmation precedente.
AnchorBatchStatus : Enum de statut de batch d'ancrage (6 valeurs attendues). - Etat terminal : Etat sans transition sortante autorisee.
- Stack cible : ProbatioVault-backend = NestJS + TypeORM + PostgreSQL.
4. Invariants (non negociables)
| ID | Regle | Justification |
| INV-274-01 | Le fait entity_enum_values(anchor_batch, status, Values) DOIT etre genere et contenir exactement les 6 valeurs: PENDING, BUILDING, SUBMITTED, PENDING_FINALITY, FINALIZED, FAILED. | Le check check_batch_status_enum exige la presence explicite de FINALIZED et FAILED dans la liste d'enum. |
| INV-274-02 | La generation des valeurs d'enum DOIT etre basee sur le type enum TypeScript de la propriete status, independamment du type de stockage SQL (varchar ou enum). | Evite les faux KO quand le modele metier est enum mais la persistance est varchar. |
| INV-274-03 | Le module anchor_batch DOIT exposer un fait service_method(anchor_batch, handleReorg) ou service_method(anchor_batch, reorg). | Le check check_handle_reorg exige cette capacite de service. |
| INV-274-04 | Toutes les transitions sortantes de chaque etat AnchorBatchStatus DOIVENT etre explicitement documentees comme AUTORISEE ou INTERDITE. | Evite les ambiguities sanctionnees en gate sur transitions implicites. |
| INV-274-05 | Etats terminaux: FINALIZED, FAILED. Pour chacun: aucune transition sortante autorisee. | Obligation explicite pour etats terminaux. |
| INV-274-06 | Apres correction, aucun des 22 checks deja OK de PV-ANCHOR-001 ne doit devenir KO. | Protection de la conformite acquise. |
| INV-274-07 | Les tests backend existants doivent rester passants. | Protection de non-regression applicative. |
| INV-274-08 | Aucune modification implicite de type de colonne, contrainte, index ou nullabilite n'est autorisee dans ce perimetre. | Le besoin cible la conformite formelle, pas la migration schema. |
5. Flux nominaux
- Le systeme analyse l'entite
anchor_batch. - Il identifie le champ
status et son type metier enum (AnchorBatchStatus). - Il produit le fait
entity_enum_values(anchor_batch, status, Values). Values contient exactement les 6 valeurs contractuelles. - Le check Prolog
check_batch_status_enum est evalue a OK.
FN-02 — Exposition de la capacite service de gestion reorg
- Le module
anchor_batch expose une methode de service nommee handleReorg (ou alias accepte par regle formelle). - L'extraction de faits produit
service_method(anchor_batch, handleReorg) (ou service_method(anchor_batch, reorg) selon contrat de regle). - Le check Prolog
check_handle_reorg est evalue a OK.
- Les faits extraits sont soumis a l'ensemble des checks PV-ANCHOR-001.
- Les 24 checks sont evalues.
- Score final attendu: 24/24 OK.
Modele d'etats AnchorBatchStatus et transitions
PENDING → BUILDING : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE BUILDING → SUBMITTED : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE SUBMITTED → PENDING_FINALITY : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE PENDING_FINALITY → FINALIZED : AUTORISEE | → FAILED : AUTORISEE (ex: reorg) | → * : INTERDITE FINALIZED → * : INTERDITE (etat terminal) FAILED → * : INTERDITE (etat terminal)
5bis. Diagrammes
Diagramme d'etats — AnchorBatchStatus (INV-274-04, INV-274-05)
stateDiagram-v2
[*] --> PENDING
PENDING --> BUILDING : batch construit
PENDING --> FAILED : erreur construction
BUILDING --> SUBMITTED : soumis on-chain
BUILDING --> FAILED : erreur soumission
SUBMITTED --> PENDING_FINALITY : tx confirmee (attente finality)
SUBMITTED --> FAILED : erreur confirmation
PENDING_FINALITY --> FINALIZED : finality atteinte
PENDING_FINALITY --> FAILED : reorg detecte (INV-274-03)
FINALIZED --> [*]
FAILED --> [*]
note right of FINALIZED : Etat terminal — aucune\ntransition sortante (INV-274-05)
note right of FAILED : Etat terminal — aucune\ntransition sortante (INV-274-05)
sequenceDiagram
participant Extract as extract-facts.py
participant AST as AST Parser (TypeScript)
participant Prolog as Moteur Prolog
Extract->>AST: Analyse entite anchor_batch
AST-->>Extract: Propriete status: AnchorBatchStatus (enum TS)
Note over Extract: Genere entity_enum_values<br/>(INV-274-01, INV-274-02)<br/>6 valeurs depuis enum TS,<br/>independamment du type SQL varchar
Extract->>AST: Analyse service anchor_batch
AST-->>Extract: Methode handleReorg detectee
Note over Extract: Genere service_method<br/>(INV-274-03)
Extract->>Prolog: Soumet faits extraits
Prolog->>Prolog: check_batch_status_enum (CA-01)
Prolog->>Prolog: check_handle_reorg (CA-03)
Prolog->>Prolog: 22 checks existants (INV-274-06)
Prolog-->>Extract: Rapport 24/24 OK (CA-05)
6. Cas d'erreur
| ID | Condition | Reponse attendue |
| ERR-01 | entity_enum_values(anchor_batch, status, Values) absent ou incomplet | check KO ; livraison refusee |
| ERR-02 | Aucun fait service_method(anchor_batch, handleReorg\|reorg) | check KO ; livraison refusee |
| ERR-03 | Au moins un des 22 checks auparavant OK passe KO | non-conformite globale ; livraison refusee |
| ERR-04 | Echec d'au moins un test existant backend | non-regression non respectee ; livraison refusee |
| ERR-05 | Transition non documentee ou etat terminal avec sortie implicite | non-conformite specification ; livraison refusee |
7. Criteres d'acceptation (testables)
| ID | Critere | Observable |
| CA-01 | Le check check_batch_status_enum est OK | Rapport Prolog PV-ANCHOR-001: check OK |
| CA-02 | Le fait enum pour anchor_batch.status est present avec les 6 valeurs exactes | Sortie faits: entity_enum_values(anchor_batch, status, [...]) |
| CA-03 | Le check check_handle_reorg est OK | Rapport Prolog PV-ANCHOR-001: check OK |
| CA-04 | Le module anchor_batch expose un service method conforme | Sortie faits: service_method(anchor_batch, handleReorg) |
| CA-05 | Score global PV-ANCHOR-001 = 24/24 OK | Rapport final: 24 checks OK, 0 KO |
| CA-06 | Les 22 checks prealablement OK restent OK | Diff avant/apres: aucune regression |
| CA-07 | Les tests backend existants restent passants | Rapport tests: statut PASS |
| CA-08 | Les etats terminaux n'ont aucune transition sortante autorisee | Specification: FINALIZED/FAILED → * INTERDITE |
8. Scenarios de test (Given / When / Then)
ST-01 — Enum detecte depuis propriete enum TS avec colonne varchar
- Given une entite
anchor_batch avec colonne status stockee en varchar et propriete typee AnchorBatchStatus - When l'extraction de faits est executee
- Then le fait
entity_enum_values(anchor_batch, status, Values) est present avec 6 valeurs exactes
ST-02 — Presence explicite de FINALIZED et FAILED
- Given les faits extraits pour
anchor_batch.status - When la regle
check_batch_status_enum est evaluee - Then
FINALIZED et FAILED sont presents dans Values et le check est OK
ST-03 — Methode handleReorg exposee par le service anchor_batch
- Given le module
anchor_batch - When l'extraction de faits service est executee
- Then
service_method(anchor_batch, handleReorg) est present
ST-04 — Check reorg passe a OK
- Given les faits extraits incluant la methode reorg contractuelle
- When
check_handle_reorg est evalue - Then le resultat est
OK
ST-05 — Non-regression checks existants
- Given un baseline de 22 checks PV-ANCHOR-001 a
OK - When la nouvelle extraction/regles est appliquee
- Then les 22 checks restent
OK
- Given l'ensemble des checks PV-ANCHOR-001
- When l'audit formel complet est execute
- Then le resultat global est
24/24 OK
ST-07 — Verrouillage des etats terminaux
- Given un batch en statut
FINALIZED ou FAILED - When une transition sortante est sollicitee
- Then la transition est refusee (etat terminal)
ST-08 — Retour d'etat interdit
- Given un batch en statut
SUBMITTED ou PENDING_FINALITY - When une transition retour vers un etat precedent est sollicitee
- Then la transition est refusee (retour interdit)
9. Hypotheses explicites
| ID | Hypothese | Impact si faux |
| H-01 | Le module cible est ProbatioVault-backend (NestJS + TypeORM + PostgreSQL) | Mauvaise stack => non-conformite Gate |
| H-02 | Le nom canonique de l'entite logique est anchor_batch dans les faits Prolog | Les checks peuvent ne pas matcher |
| H-03 | La regle check_handle_reorg accepte handleReorg ou reorg comme predicate | Si nom differe, le check reste KO |
| H-04 | Les 6 valeurs de AnchorBatchStatus sont normatives et exhaustives | Toute valeur manquante/supplementaire invalide CA-02 |
| H-05 | Aucun changement DDL n'est requis pour satisfaire PD-274 | Si DDL requis, spec incomplete |
References
- Epic : BACKEND-3 (crypto-proof)
- JIRA : PD-274
- Repos : ProbatioVault-backend (principal), ProbatioVault-doc (extract-facts.py)
- Norme : PV-ANCHOR-001 (rapport d'audit formel)
- Stories liees : PD-272 (pattern correction PV-PROOF), PD-273 (pattern correction PV-AUDIT)