Aller au contenu

PD-274 — Conformite formelle PV-ANCHOR-001 (correction des 2 checks Prolog KO)

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

FN-01 — Extraction de faits enum pour anchor_batch.status

  1. Le systeme analyse l'entite anchor_batch.
  2. Il identifie le champ status et son type metier enum (AnchorBatchStatus).
  3. Il produit le fait entity_enum_values(anchor_batch, status, Values).
  4. Values contient exactement les 6 valeurs contractuelles.
  5. Le check Prolog check_batch_status_enum est evalue a OK.

FN-02 — Exposition de la capacite service de gestion reorg

  1. Le module anchor_batch expose une methode de service nommee handleReorg (ou alias accepte par regle formelle).
  2. L'extraction de faits produit service_method(anchor_batch, handleReorg) (ou service_method(anchor_batch, reorg) selon contrat de regle).
  3. Le check Prolog check_handle_reorg est evalue a OK.

FN-03 — Evaluation globale de conformite PV-ANCHOR-001

  1. Les faits extraits sont soumis a l'ensemble des checks PV-ANCHOR-001.
  2. Les 24 checks sont evalues.
  3. Score final attendu: 24/24 OK.

Modele d'etats AnchorBatchStatus et transitions

  • PENDINGBUILDING : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE
  • BUILDINGSUBMITTED : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE
  • SUBMITTEDPENDING_FINALITY : AUTORISEE | → FAILED : AUTORISEE | → * : INTERDITE
  • PENDING_FINALITYFINALIZED : 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)

Diagramme de sequence — Extraction de faits et evaluation Prolog (FN-01, FN-02, FN-03)

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

ST-06 — Score global conforme

  • 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)