[0m
build · gpt-5.3-codex [0m
PD-281 — Specification canonique du Z-lint: discrimination state machine vs type/category et completion des types Z¶
1. Objectif¶
La story PD-281 doit contractualiser un comportement de verification formelle ou:
- le generateur Z-lint distingue strictement les enums de state machine (eligibles au check Anchor enum) des enums de classification (non eligibles);
- les types Z manquants pour les vraies machines a etats soient presents dans les fichiers
.zedcibles; - la regeneration du pipeline rende un resultat deterministe et conforme:
verify-norm.shen succes sur 9/9 normes, sans faux positifs Anchor enum.
2. Perimetre / Hors perimetre¶
Inclus¶
- Regles de discrimination entre colonnes
statuset colonnestype/category. - Liste contractuelle des entites/colonnes explicitement exclues du check Anchor enum.
- Presence contractuelle des types Z manquants dans les fichiers
.zedidentifies. - Regeneration des artefacts
_generated-z-lint.yamlet verification de resultat global. - Preservation des checks existants hors scope Anchor enum (notamment Anchor entity).
Exclu¶
- Toute modification des entites TypeORM backend.
- Ajout de nouvelles normes dans le pipeline.
- Refonte du systeme de verification formelle.
- Modification du principe du check Anchor entity (mapping entite -> schema Z).
- Definition metier detaillee des transitions de lifecycle (hors perimetre de cette story).
3. Definitions¶
Anchor enum check: controle Z-lint qui exige un type Z ancre pour une entite portant un enum de machine a etats.State machine: enum de lifecycle porte par une colonnestatus(ou mapping explicite dans_z_enum_type_mappings).Type/category: enum de classification (ex:event_type,envelope_type,document_category,validation_status) sans exigence d’ancrage<entity>_state.Type Z: type enum declare dans un fichier.zed.Faux positif: echec Z-lint declenche alors que la colonne ne represente pas une machine a etats.Vrai gap: absence effective d’un type Z requis pour une colonnestatus.
4. Invariants (non negociables)¶
| ID | Regle | Justification |
|---|---|---|
| INV-281-01-discrimination | Seules les colonnes status et celles explicitement mappees dans _z_enum_type_mappings sont eligibles au check Anchor enum. | Eliminer les faux positifs structurels. |
| INV-281-02-exclusion-classification | Les colonnes de classification (event_type, envelope_type, document_category, validation_status, et toute colonne non-status non mappee) sont exclues du check Anchor enum. | Ne pas confondre classification statique et lifecycle. |
| INV-281-03-completude-types-z | Chaque colonne status des entites cibles doit avoir un type Z correspondant dans le .zed cible. | Garantir la couverture des machines a etats. |
| INV-281-04-non-regression-anchor-entity | Les controles Anchor entity existants restent strictement inchanges. | Eviter regression sur la couverture structurelle. |
| INV-281-05-idempotence | Deux executions consecutives de generation + verification, a entree identique, produisent le meme verdict. | Fiabilite du pipeline. |
| INV-281-06-resultat-global | Le resultat attendu est verify-norm.sh = SUCCESS et Z-lint 9/9 PASS. | Objectif contractuel observable. |
| INV-281-07-modele-etats-lint | Le perimetre de cette story couvre l’ancrage des types, pas la specification des transitions metier entre valeurs d’etat. | Eviter hypotheses non documentees sur les workflows metier. |
| INV-281-08-responsabilite-doc-only | Les changements sont limites au projet ProbatioVault-doc (scripts, specs .zed, configs generees). | Respect du perimetre technique impose. |
5. Flux nominaux¶
5.1 Modele de donnees contractuel (formats et contraintes)¶
Defini une seule fois dans cette section; toute autre section y fait reference.
| Donnee | Format/encodage | Longueur/taille | Jeu caracteres | Case | Regex/contrainte | Comportement si invalide |
|---|---|---|---|---|---|---|
entity_name | snake_case ASCII | 1..64 caracteres | [a-z0-9_] avec 1er char [a-z] | sensible | ^[a-z][a-z0-9_]{0,63}$ | Rejet de l’entree de controle (FAIL lint). |
column_name | snake_case ASCII | 1..64 caracteres | [a-z0-9_] avec 1er char [a-z] | sensible | ^[a-z][a-z0-9_]{0,63}$ | Rejet (FAIL lint). |
enum_value | identifiant enum | 1..64 caracteres | [A-Z0-9_] avec 1er char [A-Z] | sensible | ^[A-Z][A-Z0-9_]{0,63}$ | Rejet (FAIL lint). |
z_type_name | PascalCase ASCII | 3..80 caracteres | [A-Za-z0-9] | sensible | ^[A-Z][A-Za-z0-9]{2,79}$ | Rejet (FAIL lint). |
norm_id | identifiant norme | valeur dans ensemble ferme | ASCII | sensible | ^(pv-anchor|nf-z42-013|iso-14641|rfc-3161|pv-envelope|pv-pre|etsi-119-xxx|eidas|rgpd)$ | Rejet (FAIL lint) si hors ensemble cible du run. |
zed_file_path | chemin relatif repo | 1..255 caracteres | ASCII imprimable sans espace de tete/fin | sensible | Doit terminer par .zed | Rejet (FAIL lint). |
generated_config_path | chemin relatif repo | 1..255 caracteres | ASCII imprimable sans espace de tete/fin | sensible | Doit terminer par _generated-z-lint.yaml | Rejet (FAIL lint). |
Regle de referencement: toute mention de ces donnees ailleurs dans la spec doit etre interpretee selon ce tableau (§5.1), sans redefinition.
5.2 Flux nominal A — Discrimination des enums dans la generation Z-lint¶
- Le systeme lit les faits extraits et identifie chaque couple (
entity_name,column_name) conforme §5.1. - Pour chaque couple:
- si
column_name == statusou mapping explicite present dans_z_enum_type_mappings, alors le check Anchor enum est produit; - sinon, aucun check Anchor enum n’est produit pour ce couple.
- Les exclusions explicites suivantes sont obligatoires (non regressives):
anchor_batch_event.event_typekey_envelope.envelope_typelegal_access_event.event_typelegal_mandate.validation_statusdeposit.document_category- Le resultat genere respecte l’idempotence (INV-281-05).
5.3 Flux nominal B — Completion des types Z requis¶
Les declarations suivantes doivent exister dans les fichiers cibles, avec valeurs strictement conformes:
| Type Z | Fichier .zed | Valeurs autorisees |
|---|---|---|
TimestampBatchStatus | RFC_3161.zed | OPEN, SEALED, TIMESTAMPED, FAILED |
AnchorBatchStatus | NF_Z42_013.zed | PENDING, BUILDING, SUBMITTED, PENDING_FINALITY, FINALIZED, FAILED |
AnchorBatchStatus | ISO_14641.zed | PENDING, BUILDING, SUBMITTED, PENDING_FINALITY, FINALIZED, FAILED |
LegalReKeyStatus | PV_PRE.zed | ACTIVE, REVOKED, EXPIRED, COMPLETED, DESTROYED |
Regle conditionnelle:
- si
deposit.statusexiste comme colonne lifecycle dans la source de verite, alorsDepositStatusdevient obligatoire dansNF_Z42_013.zedetISO_14641.zed; - sinon,
DepositStatusest interdit comme exigence de cette story.
5.4 Flux nominal C — Regeneration et verification globale¶
- Les configurations
_generated-z-lint.yamlsont regenerees. - La verification complete
verify-norm.shest executee sur les 9 normes cibles. - Le verdict attendu est SUCCESS global, sans echec Z-lint.
AUDIT-SYNTHESIS.mddoit afficher Z-lint9/9 PASS.
5.5 Transitions inverses et etats terminaux¶
- Perimetre PD-281: ancrage de types Z et regles de lint, sans specification des transitions metier internes de chaque enum.
- Aucune transition retour applicable dans le perimetre de cette story.
- Pour les etats terminaux metier (ex:
DESTROYED), la politique de transition sortante est hors perimetre de PD-281 et doit etre specifiee dans la norme metier source correspondante.
5bis. Diagrammes¶
5bis.1 State diagram — TimestampBatchStatus (INV-281-03)¶
Machine a etats declaree dans RFC_3161.zed (cf. §5.3).
stateDiagram-v2
[*] --> OPEN
OPEN --> SEALED
SEALED --> TIMESTAMPED
OPEN --> FAILED
SEALED --> FAILED
TIMESTAMPED --> [*]
FAILED --> [*] 5bis.2 State diagram — AnchorBatchStatus (INV-281-03)¶
Machine a etats declaree dans NF_Z42_013.zed et ISO_14641.zed (cf. §5.3).
stateDiagram-v2
[*] --> PENDING
PENDING --> BUILDING
BUILDING --> SUBMITTED
SUBMITTED --> PENDING_FINALITY
PENDING_FINALITY --> FINALIZED
PENDING --> FAILED
BUILDING --> FAILED
SUBMITTED --> FAILED
PENDING_FINALITY --> FAILED
FINALIZED --> [*]
FAILED --> [*] 5bis.3 State diagram — LegalReKeyStatus (INV-281-03)¶
Machine a etats declaree dans PV_PRE.zed (cf. §5.3).
stateDiagram-v2
[*] --> ACTIVE
ACTIVE --> REVOKED
ACTIVE --> EXPIRED
ACTIVE --> COMPLETED
REVOKED --> DESTROYED
EXPIRED --> DESTROYED
COMPLETED --> DESTROYED
DESTROYED --> [*] 5bis.4 Sequence diagram — Pipeline de discrimination et verification (INV-281-01, INV-281-02, INV-281-05, INV-281-06)¶
Flux nominaux A + C : generation Z-lint avec discrimination puis verification globale.
sequenceDiagram
participant O as Orchestrateur (verify-norm.sh)
participant E as extract-facts.py
participant G as Generateur Z-lint
participant Z as Fichiers .zed
participant C as Configs _generated-z-lint.yaml
participant A as AUDIT-SYNTHESIS.md
O->>E: Extraction des faits (entites, colonnes)
E-->>O: Couples (entity_name, column_name)
loop Pour chaque couple
O->>G: Soumet (entity_name, column_name)
alt column_name == "status" OU mapping _z_enum_type_mappings
G->>C: Produit check Anchor enum (INV-281-01)
else Colonne classification (event_type, envelope_type, etc.)
G-->>G: Aucun check Anchor enum (INV-281-02)
end
end
G->>C: Ecriture _generated-z-lint.yaml (idempotent — INV-281-05)
O->>Z: Verification types Z requis (INV-281-03)
Z-->>O: Presence/absence des types declares §5.3
O->>C: Verification 9 normes
C-->>O: Verdict par norme
alt 9/9 PASS (INV-281-06)
O->>A: Ecriture Z-lint 9/9 PASS
else Echec >= 1 norme
O->>A: Ecriture Z-lint FAIL + motifs
end 6. Cas d’erreur¶
| ID | Condition | Reponse attendue |
|---|---|---|
| ERR-281-01 | Donnee non conforme aux formats §5.1 | Echec de verification (FAIL lint), cause explicite tracee. |
| ERR-281-02 | Colonne non-status produisant encore un Anchor enum check | Non-conformite majeure (faux positif). |
| ERR-281-03 | Type Z requis absent dans .zed cible | Non-conformite majeure (vrai gap). |
| ERR-281-04 | verify-norm.sh != SUCCESS | Story non acceptee. |
| ERR-281-05 | AUDIT-SYNTHESIS.md n’affiche pas 9/9 PASS Z-lint | Story non acceptee. |
| ERR-281-06 | Regression sur checks Anchor entity | Story non acceptee. |
| ERR-281-07 | Resultat non idempotent entre deux runs identiques | Story non acceptee. |
7. Criteres d’acceptation (testables)¶
| ID | Critere | Observable |
|---|---|---|
| CA-01 | verify-norm.sh passe en SUCCESS sur les 9 normes | Sortie de commande: statut SUCCESS, 0 echec Z-lint. |
| CA-02 | Tous les types Z listes en §5.3 sont presents avec les valeurs exactes | Lecture des fichiers .zed cibles conforme tableau §5.3. |
| CA-03 | Le generateur ne produit plus de checks Anchor enum pour les colonnes non-status non mappees | Absence des couples exclus dans les configs generees. |
| CA-04 | AUDIT-SYNTHESIS.md affiche Z-lint 9/9 PASS | Valeur visible et exacte dans le document. |
| CA-05 | Les _generated-z-lint.yaml regenerees n’incluent plus les faux positifs identifies | Verification textuelle des sections anchored.enum_states. |
| CA-06 | Aucun impact sur les checks existants hors scope | Comparaison avant/apres sur checks Anchor entity et controles non cibles. |
| CA-07 | Idempotence de regeneration/verification | Deux executions consecutives donnent le meme verdict et memes artefacts fonctionnels. |
| CA-08 | Regle conditionnelle DepositStatus appliquee selon existence de deposit.status | Presence/absence de DepositStatus conforme a la condition §5.3. |
8. Scenarios de test (Given / When / Then)¶
-
SCN-281-01 (exclusion classification)
Given un faitanchor_batch_event.event_typeconforme §5.1
When la generation Z-lint est executee
Then aucun Anchor enum check n’est genere pour ce couple. -
SCN-281-02 (inclusion state machine)
Given un faitanchor_batch.statusconforme §5.1
When la generation Z-lint est executee
Then un Anchor enum check est genere pouranchor_batch_state(ou mapping explicite). -
SCN-281-03 (type Z manquant)
Giventimestamp_batch.statuspresent etTimestampBatchStatusabsent deRFC_3161.zed
Whenverify-norm.shest execute
Then la verification echoue avec motif type Z manquant. -
SCN-281-04 (type Z present)
GivenTimestampBatchStatuspresent avec valeurs exactes
Whenverify-norm.shest execute
Then le controle associe passe. -
SCN-281-05 (idempotence)
Given un meme jeu d’entree
When la generation + verification est executee deux fois
Then le verdict global et le statut Z-lint sont identiques. -
SCN-281-06 (condition DepositStatus)
Givendeposit.statusexiste dans la source de verite
When verification des.zedest faite
ThenDepositStatusest requis dansNF_Z42_013.zedetISO_14641.zed. -
SCN-281-07 (condition inverse DepositStatus)
Givendeposit.statusn’existe pas
When verification des.zedest faite
Then aucune exigenceDepositStatusn’est appliquee.
9. Hypotheses explicites¶
| ID | Hypothese | Impact si faux |
|---|---|---|
| H-281-01 | Le pipeline cible couvre exactement 9 normes sur ce scope. | Les CAs numeriques deviennent invalides et doivent etre renormalises. |
| H-281-02 | Les noms d’entites/colonnes extraits respectent §5.1. | Echecs de parsing/lint non lies au besoin metier. |
| H-281-03 | Les fichiers .zed references sont les sources de verite de leurs normes respectives. | Risque de corriger le mauvais artefact, CAs non fiables. |
| H-281-04 | Le check Anchor entity est orthogonal au check Anchor enum. | Regression potentielle hors perimetre si coupling cache. |
| H-281-05 | La determination de l’existence de deposit.status est possible a partir des faits/extraits disponibles. | Impossibilite d’appliquer CA-08 sans clarification prealable. |
10. Points a clarifier¶
10.1 Contraintes techniques (stack reelle du projet cible)¶
- Projet cible:
ProbatioVault-doc(scripts/formal specs). - Stack constatee sur ce perimetre:
Shell(orchestration),Python 3(extract-facts.py), fichiersYAML(_generated-z-lint.yaml), specs formelles.zed, documentationMarkdown. - Clarification requise: la matrice stack standard fournie ne liste pas
ProbatioVault-doc; confirmer que cette stack documentaire est la reference contractuelle pour PD-281.
10.2 Bornes numeriques obligatoires¶
| Parametre | Valeur defaut | Min | Max | Unite | Hors bornes |
|---|---|---|---|---|---|
normes_cible | 9 | 9 | 9 | normes | Non-conformite (spec input invalide). |
echecs_zlint_autorises | 0 | 0 | 0 | echec | Non-conformite (story refusee). |
types_z_a_ajouter_obligatoires | 4 (hors cas conditionnel DepositStatus) | 4 | 5 | types | Non-conformite si < min; si 5, uniquement si condition DepositStatus vraie. |
10.3 SLA temporels¶
- Aucune transition temporelle identifiee.
10.4 Contraintes inter-modules¶
- Aucune contrainte inter-module applicable.
10.5 Migration DDL¶
- Aucune strategie de migration DDL applicable (aucune modification de colonne base de donnees dans ce perimetre).
10.6 Atomicite multi-composant¶
- Aucune exigence d’atomicite DB + queue applicable dans ce perimetre documentaire.
10.7 Invariant envelope encryption¶
- Hors perimetre pour PD-281 (aucun artefact cryptographique temporaire manipule dans ce module documentaire).
10.8 Donnees manquantes a confirmer¶
- Reference epique exacte (valeur fournie vide).
- Existence effective de
deposit.statusdans la source de verite. - Liste definitive des 9 normes du run courant (noms exacts).
References¶
- Epic :
A clarifier (reference epique non fournie) - JIRA :
PD-281 - Repos concernes :
ProbatioVault-doc - Documents associes : Expression de besoin PD-281;
AUDIT-SYNTHESIS.md; fichiers.zedcibles; configs_generated-z-lint.yaml; scriptverify-norm.sh; scriptextract-facts.py; learningsPD-250,PD-37,PD-35.