Aller au contenu

PD-272 — Retour d'experience

1. Fiche d'identite

Champ Valeur
Story PD-272
Titre Conformite formelle PV-PROOF — trigger immutabilite legal_composite_proofs
Projet ProbatioVault-backend
Domaine crypto-proof
Sprint PD Sprint 9
Date debut 2026-02-27
Date fin 2026-02-27
Duree totale ~4h (session unique)
Complexite Faible

2. Metriques de convergence

Gate Iterations Score final Verdict
Gate 3 (CONFORMITY_CHECK) 1 9.0/10 GO
Gate 5 (AMBIGUITY) 1 8.875/10 GO
Gate 8 (CLOSURE) 1 9.0/10 GO

Total iterations : 3 (minimum theorique) Convergence : Optimale — GO en v1 pour les 3 gates

3. Artefacts livres

Fichier Lignes Role
1740900000000-PD272-CreateLegalCompositeProofImmutableTrigger.ts ~40 Migration PostgreSQL
PD272-legal-composite-proof-immutable.integration-spec.ts ~170 Tests d'integration

Volume total : ~210 lignes

4. Quality gates

Outil Resultat
TypeScript (tsc) PASS — 0 erreur
ESLint PASS — 0 erreur sur fichiers PD-272
Prettier PASS (apres correction)
Sonar SKIP (token expire)

5. Ecarts identifies en gates

Gate 3

4 ecarts MINEURS, tous faux positifs apres confrontation.

Gate 5

ChatGPT a identifie 9 ecarts dont 6 faux positifs. Ecart reel corrige : retrait de REVOKE TRUNCATE (extension de scope non demandee).

Gate 8

3 ecarts MINEURS : IF TG_OP (accepte), isolation tests (accepte), Sonar (non imputable).

6. Patterns positifs

  1. Pattern trigger repliquable : Le pattern BEFORE UPDATE OR DELETE avec IF TG_OP pour messages differencies est desormais valide dans le codebase (rejoint PD-81 legal_access_event et PD-237 merkle_trees).

  2. Story simple = convergence rapide : Une story de complexite faible (1 migration, 1 fichier test) converge naturellement en v1 sur les 3 gates. Pas de boucle de correction necessaire.

  3. Typage des resultats query TypeORM : Les interfaces ProofRow et TriggerRow resolvent les erreurs ESLint no-unsafe-assignment sans cast as any.

7. Difficultes rencontrees

  1. claude-p indisponible : La commande claude -p n'est pas installee (tier degraded). Contournement : utilisation d'OpenCode avec le modele anthropic/claude-sonnet-4-20250514.

  2. ChatGPT Gate 5 sur-severe : Le reviewer ChatGPT a confondu singulier/pluriel (legal_composite_proof vs legal_composite_proofs) et a signale 9 ecarts dont 6 faux positifs. La confrontation a corrige.

  3. Sonar token expire : Le token Vault pour SonarCloud est expire (HTTP 403). Non imputable a PD-272 mais bloque le scan local.

  4. OpenCode permission external_directory : L'agent OpenCode ne peut pas acceder aux fichiers hors du projet backend. Les reviews et le REX doivent etre guides ou assembles inline.

8. Ecarts de processus

ID Description Impact
PROC-01 Sonar local skip — necessitait un token valide MINEUR — couvert par ESLint+tsc
PROC-02 claude-p indisponible — fallback OpenCode MINEUR — fonctionnellement equivalent
PROC-03 Tests integration non executables (pas de PostgreSQL local) MINEUR — seront executes en CI

9. Learnings

  1. [PostgreSQL Immutability Trigger] IF TG_OP pour differencier les messages d'erreur est conforme au forbidden pattern "IF/WHEN condition" si les 2 branches levent RAISE EXCEPTION.

  2. [TypeORM Query Typing] Typer les resultats dataSource.query() avec des interfaces evite les erreurs ESLint no-unsafe-assignment et ameliore la maintenabilite des tests.

  3. [Gate 5 Cross-validation] ChatGPT peut etre sur-severe sur les noms de tables (singulier vs pluriel). La confrontation est indispensable pour corriger les faux positifs.

10. Ameliorations process

10.1 Renouvellement token Sonar (priorite: haute)

Fichier cible : CLAUDE.md section "Integrations externes"

Action : Documenter la procedure de renouvellement du token SonarCloud via Vault et ajouter un check de validite au demarrage du workflow.

10.2 Template tests integration — interfaces TypeORM (priorite: moyenne)

Fichier cible : templates/prompts/step2-tests.md

Action : Ajouter dans le template de generation de tests une instruction pour typer les resultats dataSource.query() avec des interfaces explicites au lieu de any.

10.3 Fallback claude-p → OpenCode (priorite: basse)

Documentation : Le fallback opencode run -m anthropic/claude-sonnet-4-20250514 est fonctionnellement equivalent a claude -p pour les prompts delegues. A documenter dans CLAUDE.md section "Fallbacks".