Aller au contenu

PD-272 — Expression de besoin

Contexte

L'audit formel PV-PROOF-001 a identifie un ecart de conformite (KO) sur l'exigence PROOF-12 : la table legal_composite_proofs ne dispose pas de trigger PostgreSQL empechant les modifications apres generation de la preuve composite.

La preuve composite (ProofEnvelope) est le document probant central de ProbatioVault. Une fois generee, elle DOIT etre immutable — aucune modification ni suppression ne doit etre possible au niveau base de donnees.

Ce besoin est identifie par le check Prolog check_proof_immutable_trigger qui valide la presence d'un trigger BEFORE UPDATE OR DELETE sur la table.

Probleme

La propriete d'immutabilite post-generation est actuellement garantie uniquement au niveau applicatif (pas d'endpoint de modification). Mais sans trigger DB, une modification directe en base (erreur humaine, injection SQL, acces DBA) pourrait alterer une preuve finalisee.

Le modele formel TLA+ (INV-07 ImmutableAfterFinalize) et Alloy (ImmutableAfterGeneration) prouvent cette propriete au niveau specification. L'implementation doit la garantir au niveau PostgreSQL.

Besoin

Ajouter une migration PostgreSQL qui cree un trigger BEFORE UPDATE OR DELETE sur la table legal_composite_proofs. Ce trigger DOIT :

  1. Bloquer tout UPDATE : RAISE EXCEPTION 'legal_composite_proofs: modification interdite — preuve immutable'
  2. Bloquer tout DELETE : RAISE EXCEPTION 'legal_composite_proofs: suppression interdite — preuve immutable'
  3. S'appliquer inconditionnellement (pas de condition sur le statut — toute ligne inseree est immutable)

Criteres de succes

  • CS-01 : Le trigger existe sur la table legal_composite_proofs
  • CS-02 : Un UPDATE sur n'importe quel champ de la table leve une exception PostgreSQL
  • CS-03 : Un DELETE sur la table leve une exception PostgreSQL
  • CS-04 : L'INSERT reste autorise (seule la creation est permise)
  • CS-05 : Le check Prolog check_proof_immutable_trigger passe a OK
  • CS-06 : Les tests existants continuent de passer (pas de regression)

Hors perimetre

  • Modification de l'entite TypeORM LegalCompositeProof
  • Modification du service LegalCompositeProofService
  • Autres triggers sur d'autres tables (couverts par PD-273, PD-274)

References normatives

Reference Exigence Description
RFC PV-PROOF-001 PROOF-12 Immutable apres persistance (trigger DB)
TLA+ PV_Proof.tla INV-07 ImmutableAfterFinalize
Alloy PV_Proof.als ASSERT-08 ImmutableAfterGeneration
Z PV_Proof.zed THM-07 Preservation immutabilite

Learnings injectes

  • [PD-171] : Triggers PostgreSQL pour append-only indispensables — pattern de reference pour cette story.