Aller au contenu

PD-287 — Revue d’acceptabilité (post-correction)

1. Références

  • Spécification : PD-287-specification.md
  • Tests contractuels : PD-287-tests.md
  • Acceptabilité existante : PD-287-acceptability.md
  • Date de revue : 2026-04-19
  • Reviewer : Codex (auditeur technique indépendant)

2. Suivi des écarts (append-only)

[2026-04-19] — Suivi E-01

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • createShareLink persiste proofId depuis le DTO sans vérification explicite de propriété (proofId ∈ ownerUserId).
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/sharing.service.ts:130-134
  • test contractuel concerné TC-NOM-01 : résultat d’exécution non fourni (pas de preuve PASS)

[2026-04-19] — Suivi E-02

  • Statut précédent : OUVERT
  • Statut actuel : PARTIELLEMENT RÉSOLU
  • Justification factuelle :
  • Le guard force bien Resource not found sur plusieurs branches.
  • Mais il relance les NotFoundException internes telles quelles, et validateSession() émet Session not found, donc homogénéité anti-enum incomplète.
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/proofs/guards/share-proof.guard.ts:69-73 et src/sharing/recipient-session/recipient-session.service.ts:80-91
  • tests contractuels concernés TC-ERR-05, TC-INV-06, TC-NEG-02 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-03

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • L’append audit lit le dernier hash puis écrit sans verrou sérialisant la tête de chaîne.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/audit/audit-journal.service.ts:44-47 puis :65-79
  • tests contractuels concernés TC-NOM-14, TC-INV-14 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-04

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • Le contrôle maxConsultations est fait avant la transaction/verrou.
  • Incrémentation ensuite sous verrou seulement, donc fenêtre de course persistante.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/sharing.service.ts:495-499 puis :501-509
  • test contractuel concerné TC-NOM-15 : résultat d’exécution non fourni

[2026-04-19] — Suivi E-05

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • Une clé idempotence expirée est traitée comme absente sans purge de l’enregistrement.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/sharing.service.ts:702-705
  • tests contractuels concernés TC-ERR-19, TC-NEG-13 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-06

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • activateLink() ouvre une transaction pour l’état, puis appelle createSession() hors du même manager transactionnel.
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/sharing/sharing.service.ts:346-359 et src/sharing/recipient-session/recipient-session.service.ts:33-35
  • tests contractuels concernés TC-INV-04, TC-INV-05 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-07

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • purgeLink() enchaîne audit/suppressions/anonymisations sans transaction atomique unique.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/retention/retention.service.ts:96-145
  • tests contractuels concernés TC-NOM-19, TC-INV-12 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-08

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • expireOrphanLinks() fait update puis append audit hors transaction atomique commune.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/reconciliation/reconciliation.service.ts:86-101
  • test contractuel concerné TC-NOM-16 : résultat d’exécution non fourni

[2026-04-19] — Suivi E-09

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • En cas de blocage OTP, blockedUntil est mis à jour mais pas shareLink.state = OTP_BLOCKED.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/otp/otp.service.ts:217-233
  • tests contractuels concernés TC-NOM-03, TC-ERR-07 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-10

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • TrustStoreService injecte TRUST_STORE_CONFIG, mais aucun provider explicite de ce token n’est visible dans les modules sharing.
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/sharing/trust-store/trust-store.service.ts:39-40, src/sharing/trust-store/trust-store.module.ts:17-20, src/sharing/sharing.module.ts:21-37
  • tests contractuels concernés TC-ERR-16, TC-INV-07 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-11

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • archive.pipe() vers un Readable avec cast forcé as unknown as NodeJS.WritableStream reste un contournement de type.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/export/export-composer.service.ts:164-170
  • tests contractuels concernés TC-NOM-08, TC-ERR-17 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-12

  • Statut précédent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • Les écarts 12-16 sont groupés dans le document step 7 sans granularité individuelle exploitable dans cette revue.
  • Preuve de vérification :
  • source PD-287-acceptability.md:36
  • tests contractuels associés non individualisables dans l’entrée fournie

[2026-04-19] — Suivi E-13

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • La validation de session ne lie pas le recipientSessionId au shareLinkId courant.
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/sharing/recipient-session/recipient-session.service.ts:76-78 et src/sharing/sharing.service.ts:481-491
  • test contractuel concerné TC-NEG-05 : résultat d’exécution non fourni

[2026-04-19] — Suivi E-14

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • reEncrypt() vérifie seulement isReady() et n’appelle pas verifyCertificateChain().
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/sharing/crypto/pre-crypto.service.ts:125-127 et src/sharing/trust-store/trust-store.service.ts:70-104
  • tests contractuels concernés TC-INV-07, TC-ERR-16, TC-NEG-08 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-15

  • Statut précédent : OUVERT (documenté STUB attendu)
  • Statut actuel : OUVERT
  • Justification factuelle :
  • Le mode PRE STUB est toujours présent et explicitement journalisé comme tel.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/crypto/pre-crypto.service.ts:194-197 et :221-223
  • note historique PD-287-acceptability.md:45 (écart attendu/documenté)

[2026-04-19] — Suivi E-16

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • Contrôle d’accessibilité (état) fait avant transaction d’écriture, sans revalidation canonique sous verrou au moment critique.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/sharing.service.ts:484-487 puis :501-509
  • tests contractuels concernés TC-NOM-09, TC-ERR-10 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-17

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • maybeExpireLink() absorbe l’erreur par catch + warn (fail-open).
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/sharing.service.ts:644-646
  • tests contractuels concernés TC-NOM-10, TC-ERR-11 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-18

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • Worker Merkle explicitement stub, no-op, ancrage non implémenté.
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/audit/merkle-anchor.worker.ts:38-46
  • tests contractuels concernés TC-NOM-14, TC-ERR-14 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-19

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • Risque de race append hash-chain identique à E-03 (lecture dernier event sans verrou de sérialisation).
  • Preuve de vérification :
  • commit c02d1d1
  • fichier src/sharing/audit/audit-journal.service.ts:44-47
  • tests contractuels concernés TC-INV-14 : résultats d’exécution non fournis

[2026-04-19] — Suivi E-20

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • recipientSessionId est placé en metadata d’événements d’audit.
  • Preuve de vérification :
  • commit c02d1d1
  • fichiers src/sharing/recipient-session/recipient-session.service.ts:52, src/sharing/sharing.service.ts:444, :518, :572
  • tests contractuels concernés : résultats d’exécution non fournis

[2026-04-19] — Suivi E-21

  • Statut précédent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • Les 4 écarts de sévérité moyenne ne sont pas détaillés individuellement dans le step 7 fourni.
  • Preuve de vérification :
  • source PD-287-acceptability.md:40
  • absence de détail unitaire exploitable pour statuts individuels dans l’entrée

3. Verdict d’acceptabilité (courant)

Verdict actuel : ⛔ REFUSÉ
Date : 2026-04-19
Motif synthétique : Les écarts actionnables majeurs/critiques restent non résolus ou partiellement résolus, et aucun résultat d’exécution TC-* (PASS) n’a été fourni pour justifier des clôtures contractuelles.

4. Historique des verdicts

Date Verdict Version / commit Commentaire
2026-04-19 ⛔ REFUSÉ c02d1d1 Initialisation historique step 8 ; verdict inchangé vs step 7 (NON_CONFORME)