Aller au contenu

PD-295 — Review spécification (Gate 3, cycle 2 v3)

Auditeur : Gate 3 indépendant. Portée : PD-295-specification.md (cycle 2 v3) + vérification de cohérence avec PD-295-tests.md (cycle 2 v3). Mode : constat uniquement. Aucune proposition d'implémentation, aucune reformulation.


1. Ambiguïtés

A-01 — Statut de la clé HMAC "au moment critique" vs clé chargée une fois par session

  • Type : Ambiguïté
  • Référence : spec §5.2.4 + §5.6 step 10 + INV-295-09
  • Description : §5.2.4 contractualise que la clé HMAC est chargée une fois au démarrage de la session et « reste immuable jusqu'au prochain démarrage ». §5.6 step 10 introduit toutefois une branche « Si clé audit indisponible/invalide au moment critique » avec une distinction « dernière clé valide en mémoire » vs « aucune clé valide ». Le cadre d'occurrence réel de cette branche n'est pas défini : mémoire corrompue ? unset volontaire ? rotation non autorisée intra-session ?
  • Impact : comportement non reproductible, chemin d'erreur audit_key_unavailable_fatal sans déclencheur observable, impossible à tester de manière déterministe.
  • Gravité : Majeur

A-02 — count_configured 5/3/3 non mappé explicitement dans INV-295-11

  • Type : Ambiguïté
  • Référence : INV-295-11 + §5.7 + §5.9
  • Description : INV-295-11 impose « count_configured à 5/3/3 » sans dire quelle valeur s'applique à quelle source. Le mapping n'est lisible qu'en croisant §5.7 (top_k par source) et §5.9 (template). Un lecteur qui ne lit que §4 ne peut pas vérifier la règle.
  • Impact : règle ancrée dans un invariant non négociable mais dont la vérification exige la lecture de 2 autres sections.
  • Gravité : Mineur

A-03 — "buffer mémoire Python et pipes OS" vs "pipe + buffer Python"

  • Type : Ambiguïté
  • Référence : INV-295-RUNTIME-02 + §5.3 step 3 + §5.3.3
  • Description : INV-295-RUNTIME-02 contractualise « buffers mémoire Python ET pipes OS (os.pipe) ». §5.3 step 3 parle de « buffer mémoire (pipe + buffer Python) ». §5.3.3 décrit un flux à 2 subprocess imbriqués sans préciser si os.pipe est obligatoire ou si subprocess.PIPE (stdlib) suffit. Les 3 formulations ne se recouvrent pas strictement.
  • Impact : contrat runtime non déterministe pour l'implémenteur et pour le reviewer Gate 8 ; empêche une vérification objective.
  • Gravité : Majeur

A-04 — ERR-295-FAIL_CLOSED_DEPTH_EXCEEDED "alias legacy" sans scope de compatibilité

  • Type : Ambiguïté
  • Référence : §6 table d'erreurs
  • Description : l'entrée ERR-295-FAIL_CLOSED_DEPTH_EXCEEDED est déclarée « alias legacy non émis en v3 | compat lecture historique ». Aucune section ne dit quel parseur doit encore accepter cet alias, ni dans quels fichiers historiques il apparaîtrait (schéma v1/v2 non documenté ici).
  • Impact : règle sans observable ; non testable.
  • Gravité : Mineur

A-05 — "purge sécurité 24h" vs "strict à date > retention_until"

  • Type : Ambiguïté
  • Référence : INV-295-05 + §5.10 ligne purge cron
  • Description : INV-295-05 impose « purge rétention strictement à date > retention_until ». §5.10 indique un cron 24h. La fenêtre maximale effective entre expiration et purge observable n'est pas contractualisée (peut atteindre ~24h).
  • Impact : un enregistrement peut rester visible jusqu'à 24h après expiration, sans qu'aucune règle de §5 ne borne explicitement ce retard. Ambiguïté sur la promesse RGPD effective.
  • Gravité : Majeur

2. Contradictions

C-01 — fail_closed_depth borne 0..3 vs 0..4

  • Type : Contradiction
  • Référence : INV-295-17 + D-295-32 + §5.6 step 8/9 + §5.7 (fail_closed_depth_max_accepted=3, fail_closed_depth_abort=4)
  • Description : INV-295-17 dit « autorisé jusqu'à 3 inclus ; tentative de 4e fail-closed (depth=4) => arrêt ». D-295-32 dit « entier 0..4 ; 4 atteignable uniquement à l'instant de l'abort récursif ». §5.6 step 8 incrémente puis teste <=3. Le contrat est consistant seulement si on lit que la valeur 4 est un état transitoire d'abort ; aucun invariant ne le dit en toutes lettres. La distinction « valeur acceptée » vs « valeur atteinte » n'est pas nommée.
  • Impact : risque de divergence d'implémentation sur la borne supérieure (<=3 vs <4 vs <=4).
  • Gravité : Mineur (formel), Majeur si implémentation divergente

C-02 — Lock learnings.jsonl exigé mais corpus immuable

  • Type : Contradiction
  • Référence : INV-295-14 + TC-NR-04 + §5.4 step 1
  • Description : INV-295-14 rend le flock obligatoire sur learnings.jsonl. TC-NR-04 contractualise « B3 n'altère pas learnings.jsonl ». §5.4 ne liste qu'une lecture. Si le fichier est strictement en lecture par B3, un write-lock n'est pas justifié, et un read-lock flock ne protège rien contre une écriture externe non coordonnée.
  • Impact : contrainte qui ne protège pas l'invariant qu'elle est censée protéger ; confusion sur la surface d'écrivains légitimes.
  • Gravité : Majeur

C-03 — H-295-04 "dérive horloge <=500ms" vs TC-NEG-10 testant la violation

  • Type : Contradiction (hypothèse vs comportement testé)
  • Référence : §9 H-295-04 + §5.7 clock_drift_max + TC-NEG-10
  • Description : §9 formalise la dérive <500 ms comme hypothèse environnementale (« si faux, idempotence/rate-limit fragiles »). TC-NEG-10 traite la dérive >500 ms au moment de la trace comme un cas négatif à fail-closed. Une règle testée n'est plus une hypothèse : c'est un invariant implicite de runtime, mais aucun INV- ne le porte, aucun ERR- dédié n'est défini, et le comportement exact (quel composant mesure ? quelle horloge ?) n'est pas spécifié.
  • Impact : un comportement critique (rate-limit/idempotence) repose sur une hypothèse non invariantisée mais testée — statut contradictoire.
  • Gravité : Majeur

C-04 — CS-2 cible numérique vs CS-1/CS-3/CS-4 sans cible

  • Type : Contradiction (critère d'acceptation)
  • Référence : CA-295-16, CA-295-17, CA-295-18, CA-295-19
  • Description : CA-295-17 porte une cible explicite >=30%. CA-295-16/18/19 n'ont aucune cible numérique : la CA est satisfaite par la simple production d'un rapport horodaté, indépendamment de la valeur mesurée. Incohérence interne sur le niveau d'exigence contractuelle des 4 compounding signals.
  • Impact : 3 CA sur 4 sont non falsifiables — satisfaites par tautologie si le script ne crashe pas.
  • Gravité : Majeur

C-05 — Événement audit_key_unavailable_fatal signé avec clé absente

  • Type : Contradiction
  • Référence : §5.6 step 10 + §5.14 enum event_type
  • Description : le chemin décrit tente de signer un événement audit_key_unavailable_fatal avec « la dernière clé valide en mémoire ». Si §5.2.4 est respecté, il existe exactement une clé de session, non relue. Le cas « clé invalide au moment critique mais dernière clé valide encore en mémoire » décrit deux états simultanés incompatibles (la clé est ou n'est pas celle de la session).
  • Impact : chemin d'erreur décrit mais logiquement inatteignable sous §5.2.4 ; ou alors §5.2.4 est violé et l'invariant d'immutabilité de clé tombe.
  • Gravité : Majeur

3. Règles non testables

NT-01 — INV-295-02 "destruction en sortie de phase 1 bis" en boîte noire

  • Type : Non testable
  • Référence : INV-295-02 + TC-INV-02
  • Description : l'invariant impose la destruction du verbatim en mémoire volatile. TC-INV-02 repose sur check-no-verbatim-persisted.sh qui ne vérifie que l'absence de persistance disque. La destruction effective (zeroization, écrasement du buffer) n'est pas observable en boîte noire et aucun observable de remplacement n'est contractualisé.
  • Impact : la partie « destruction » de l'invariant ne peut pas être prouvée, seulement la partie « non-persistance ».
  • Gravité : Mineur

NT-02 — "stdout/stderr redirigés vers buffer mémoire, jamais fichier"

  • Type : Non testable
  • Référence : INV-295-RUNTIME-01 + TC-RUNTIME-01..03
  • Description : les tests runtime vérifient l'absence d'UUID sentinelle sur disque et l'absence d'enregistrements dans data/sessions/*.jsonl. Ils ne vérifient pas que stdout/stderr du subprocess n'atterrissent nulle part sur le système (journal systemd, syslog, tty scrollback, logs IDE parent, pager). Aucun observable de type « inventaire exhaustif des consommateurs de stdout subprocess » n'est défini.
  • Impact : l'invariant est plus fort que ce que les tests peuvent prouver.
  • Gravité : Majeur

NT-03 — "pipe OS jamais fichier" sans test d'absence dans $TMPDIR / /tmp / /dev/shm

  • Type : Non testable
  • Référence : INV-295-RUNTIME-02 + TC-RUNTIME-01
  • Description : TC-RUNTIME-01 vérifie l'absence d'UUID dans data/ et dans ps. Aucun test ne vérifie l'absence de fichier temporaire dans $TMPDIR, /tmp, /var/folders/... (macOS), /dev/shm, ni l'absence de fichiers anonymes ouverts (O_TMPFILE). L'interdiction « aucun fallback tmpfs sur macOS » est contractualisée mais non testée.
  • Impact : invariant runtime critique non couvert par scénario de test.
  • Gravité : Majeur

NT-04 — "Sanitizer LLM supprime PII" dépend d'un composant non déterministe

  • Type : Non testable
  • Référence : §5.3.3 (claude -p pour sanitisation) + INV-295-01 + D-295-17
  • Description : la suppression des PII repose sur un appel claude -p avec prompt « SANITIZE ». La spec cite un règlement PII (pii_ruleset_v1) mais ne définit pas quel composant déterministe (regex, liste bloquée, détecteur) applique ce règlement après le LLM. Aucun test ne vérifie le comportement sur prompt adversarial. TC-NEG-08 se limite à « résumé avec PII » → ERR-295-PII_DETECTED sans préciser le détecteur.
  • Impact : la sécurité PII repose sur un composant non déterministe non observable à la revue.
  • Gravité : Majeur

NT-05 — CA-295-16/18/19 sans seuil

  • Type : Non testable (critère non falsifiable)
  • Référence : CA-295-16, CA-295-18, CA-295-19
  • Description : satisfaits dès que le script produit un rapport horodaté. Aucune valeur mesurée ne peut faire échouer la CA.
  • Impact : 3 CA post-merge vides de contenu vérifiable.
  • Gravité : Majeur

4. Incohérences Spec ↔ Tests

ST-01 — TC-NOM-20 orphelin de la matrice §2

  • Type : Incohérence Spec↔Tests
  • Référence : tests §2 matrice + §3 ligne TC-NOM-20 + INV-295-HOOK-01
  • Description : TC-NOM-20 est défini en §3 (hook sur REJECTED/DONE_WITH_ANOMALY). La matrice §2 mappe INV-295-HOOK-01 / CA-295-21 à TC-NOM-22 uniquement. TC-NOM-20 n'est tracé à aucun invariant / CA, et il ne couvre que 2 des 3 états contractualisés par INV-295-HOOK-01 (manque DONE). Doublon partiel + trou de traçabilité.
  • Impact : ambiguïté sur le test faisant foi pour le hook ; audit de couverture compromis.
  • Gravité : Majeur

ST-02 — Vecteurs HMAC §5.14 non reproductibles depuis la spec

  • Type : Incohérence Spec↔Tests
  • Référence : §5.14 vecteurs V1/V4/V6/V8 + TC-NOM-06
  • Description : 4 signatures HMAC sont fournies comme référence contractuelle pour TC-NOM-06. La spec ne donne pas l'algorithme exact de JCS utilisé (implémentation de référence, version de la RFC 8785, ordre des clés pour les tableaux, encodage des nombres), ni la commande reproductible permettant à un implémenteur de retrouver les 4 expected_sig. Si un vecteur est erroné dans la spec, TC-NOM-06 est contradictoire avec lui-même sans que l'erreur soit détectable en Gate 3.
  • Impact : toute divergence entre impl JCS et spec JCS sera invisible en review et reportée en Gate 8.
  • Gravité : Majeur

ST-03 — TC-NOM-06-bis : signature attendue sans payload canonique complet

  • Type : Incohérence Spec↔Tests
  • Référence : tests §3 TC-NOM-06-bis
  • Description : TC-NOM-06-bis demande « HMAC(key, JCS(objet arbitraire schéma v3)) == 2afd2cd6... » sans spécifier quel objet est utilisé comme entrée, ni quelle clé. Le test est inexécutable en l'état.
  • Impact : test référencé dans la matrice INV-295-06..08 mais non exécutable.
  • Gravité : Bloquant

ST-04 — TC-ERR-18 ERR-295-UNSIGNED_ENTRY défini mais non listé dans la matrice §2

  • Type : Incohérence Spec↔Tests
  • Référence : tests §2 matrice + §4 TC-ERR-18 + INV-295-STATE-02
  • Description : TC-ERR-18 teste le comportement ERR-295-UNSIGNED_ENTRY (compteur + ligne ignorée). INV-295-STATE-02 porte ce comportement. La matrice trace INV-295-STATE-01..04 → TC-STATE-01/02 uniquement, pas TC-ERR-18. Trou de traçabilité.
  • Impact : ERR de sécurité (silent skip) sans lien matriciel.
  • Gravité : Mineur

ST-05 — TC-NEG-16 "bypass 10 guards" sans détail

  • Type : Incohérence Spec↔Tests
  • Référence : tests §9 TC-NEG-16 + §5.17 G-295-01..10
  • Description : TC-NEG-16 annonce « 10 cas G-295-01..10 » mais ne décrit aucun scénario individuel. Aucun moyen de vérifier que les 10 guards sont effectivement couverts ; aucune distinction entre guards d'entrée (format) et guards de flux (rate-limit, lock, clé Vault).
  • Impact : couverture non vérifiable.
  • Gravité : Majeur

ST-06 — TC-INT-03 observe une transition non documentée dans §5.11

  • Type : Incohérence Spec↔Tests
  • Référence : §5.11 machines à états + INV-295-18 + TC-INT-03
  • Description : §5.11 ne contient aucune machine d'états MEMORY_DEGRADED/MEMORY_HEALTHY. INV-295-18 et CA-295-25 parlent d'une transition entre deux états non introduits dans la liste §5.11. TC-INT-03 la teste. La machine complète (états initiaux, transitions sortantes de HEALTHY, condition exacte d'entrée en DEGRADED, scope du compteur « 2 cycles conformes ») n'est pas spécifiée.
  • Impact : test adossé à un FSM implicite ; non reproductible entre implémenteurs.
  • Gravité : Majeur

ST-07 — reuse_score_clip_threshold_pre_round >=0.99995 — frontière non spécifiée

  • Type : Incohérence Spec↔Tests
  • Référence : §5.7 + TC-NOM-07
  • Description : TC-NOM-07 parcourt « jeux de données saturants » et vérifie « aucune valeur 1.0000, écrêtage si pré-arrondi >=0.99995 ». Aucun test frontière raw==0.99995 (doit écrêter) vs raw==0.99994999 (doit arrondir). Le mode d'arrondi n'est pas précisé dans §5.7 (half-even ? half-up ? banquier ?).
  • Impact : comportement non déterministe en frontière ; deux implémentations peuvent passer TC-NOM-07 avec comportements divergents.
  • Gravité : Majeur

5. Hypothèses dangereuses

HD-01 — H-295-06 "Déploiement mono-hôte" présenté comme hypothèse

  • Type : Hypothèse dangereuse
  • Référence : §9 H-295-06 + §5.16 ligne Déploiement + INV-295-14
  • Description : le mono-hôte est traité comme hypothèse (« candidate G34 sinon ») ; c'est en réalité un pré-requis de sécurité car flock est local. Si un second hôte coexiste, toutes les garanties de cohérence des fichiers d'état signés et l'anti-replay tombent en silence. Ce n'est pas une hypothèse, c'est un invariant d'architecture non porté par un INV-.
  • Impact : dérive d'exploitation possible sans signal ; aucun guard ne détecte une exécution sur un second hôte.
  • Gravité : Majeur

HD-02 — HMAC-SHA256 à clé unique + rotation re-signe l'historique

  • Type : Hypothèse dangereuse
  • Référence : INV-295-06/07 + §5.15 + §5.16 ligne « Non-répudiation »
  • Description : l'authenticité des événements repose intégralement sur une clé symétrique en Vault. rotate-audit-hmac.sh re-signe l'existant avec la nouvelle clé, détruisant la capacité à distinguer les événements historiques des événements reforgés rétroactivement. Le modèle est documenté (non-répudiation forte = G33) mais toute trace signée ici reste fragile à un compromis Vault.
  • Impact : le mot « audit » dans le nom de la clé surestime la propriété réelle obtenue.
  • Gravité : Majeur (non bloquant car borné explicitement dans §5.16)

HD-03 — fail_closed_depth thread-local, aucun anti-boucle d'invocation

  • Type : Hypothèse dangereuse
  • Référence : INV-295-17 + §5.6.10
  • Description : le compteur est réinitialisé à 0 en début d'invocation step 0. Rien n'empêche un scénario pathologique où /gov-step-0 est ré-invoqué après un abort ERR-295-FAIL_CLOSED_RECURSION (watchdog, retry opérateur) : chaque ré-invocation repart à 0, et une situation de fail-closed systémique peut générer une oscillation abort → retry sans atteindre un état stable. Aucun invariant borne le nombre de ré-invocations.
  • Impact : la protection anti-récursion est locale à un process ; la protection globale n'est pas spécifiée.
  • Gravité : Majeur

HD-04 — Idempotence timestamp_bucket_5min sensible à la dérive horloge

  • Type : Hypothèse dangereuse
  • Référence : §5.16 + H-295-04
  • Description : deux requêtes légitimes émises à la frontière d'un bucket (ex. 14:59:59.8 et 15:00:00.1) avec 500 ms de dérive peuvent être bucketisées de façon incohérente → soit replay autorisé à tort, soit idempotence cassée à tort. La spec ne dit pas quelle horloge fait foi (locale ? NTP ? PTP ?).
  • Impact : surface de replay en frontière de bucket ; fragilité reconnue en H-295-04 mais non contrainte.
  • Gravité : Majeur

HD-05 — Sanitisation PII déléguée à un LLM

  • Type : Hypothèse dangereuse
  • Référence : §5.3 + §5.3.3
  • Description : l'ensemble de la garantie RGPD « jamais de verbatim persistant » repose sur un LLM (claude -p) avec prompt SANITIZE. L'hypothèse implicite est que le LLM respecte le prompt — connu faux en adversariat. pii_ruleset_v1 est mentionné mais son application en second passage déterministe n'est pas décrite dans §5.3 ni §5.3.3.
  • Impact : la promesse INV-295-01 / CA-295-02 repose sur une brique non déterministe.
  • Gravité : Majeur

HD-06 — pii_ruleset_v1 réduit à 4 familles de patterns

  • Type : Hypothèse dangereuse
  • Référence : D-295-17
  • Description : le règlement PII n'énonce que email, phone, IBAN, adresse explicite. Pas de nom/prénom, pas d'identifiant national (NIR/SSN/NSS), pas de numéro client, pas de date de naissance, pas de coordonnées géographiques fines, pas de données de santé. Sous-ensemble très restreint au regard du RGPD art. 4.1.
  • Impact : définition PII probablement sous-spécifiée vs obligations réelles ; risque de non-conformité.
  • Gravité : Majeur

6. Risques sécurité / conformité

SR-01 — Lignes d'état non signées "ignorées silencieusement"

  • Type : Risque sécurité
  • Référence : INV-295-STATE-02
  • Description : la politique de lecture ignore les lignes non signées / invalides. Un attaquant en écriture sur le fichier peut injecter du bruit massivement pour dégrader la qualité du score ou masquer des entrées légitimes (DoS par bruit), puis compter sur le compteur ERR-295-UNSIGNED_ENTRY pour rester sous les radars opérationnels. Aucun seuil d'alerte (« >N unsigned en M min → alerte critique ») n'est contractualisé.
  • Impact : silent degradation exploitable.
  • Gravité : Majeur

SR-02 — Codes d'erreur distincts sur guards d'identifiants (anti-enumeration)

  • Type : Risque sécurité
  • Référence : §6 ERR-295-INVALID_STORY_ID / INVALID_DOMAIN / INVALID_PROJECT + learning universel « Anti-enumeration »
  • Description : la spec distingue 3 codes d'erreur différents selon le champ invalide. Le learning universel (REX PD-85) impose un message uniforme pour éviter le profilage. Ici les erreurs sont internes (/gov local) donc le risque est moindre, mais l'approche diverge d'une règle transverse appliquée ailleurs, et le code d'erreur fuite l'information sur le premier champ échoué.
  • Impact : divergence avec un learning universel déjà appliqué ailleurs.
  • Gravité : Mineur

SR-03 — rotate-audit-hmac.sh re-signe l'existant avec la nouvelle clé

  • Type : Risque conformité (auditabilité)
  • Référence : §5.15 + §5.16
  • Description : la re-signature rétroactive efface la distinction cryptographique entre « signé à T0 avec keyN » et « re-signé à T1 avec keyN+1 ». Un opérateur ayant accès à Vault peut reforger l'historique complet sans trace observable. L'archivage de la clé précédente permet une vérification a posteriori seulement si l'archive est intègre — aucune contrainte sur l'archive (append-only ? WORM ?) n'est contractualisée.
  • Impact : la rotation détruit partiellement la propriété d'audit.
  • Gravité : Majeur

SR-04 — Purge RGPD n'énumère pas PD-XX-clarifications.md

  • Type : Risque conformité RGPD
  • Référence : INV-295-04 + §5.3 step 7 + CA-295-04
  • Description : INV-295-04 liste « clarifications.jsonl, index FAISS, embeddings NPY, cache JSON, traces query sessions » (5 artefacts). §5.3 step 7 écrit aussi PD-XX-clarifications.md. Ce fichier Markdown n'apparaît pas dans l'énumération de l'invariant de purge. CA-295-04 parle de « 5 artefacts » — le .md n'en fait pas partie.
  • Impact : trou de purge RGPD : le résumé structuré persiste potentiellement après purge.
  • Gravité : Bloquant

SR-05 — Subprocess claude -p hérite de l'environnement parent sauf surcharge

  • Type : Risque sécurité
  • Référence : §5.3.3 + INV-295-RUNTIME-01
  • Description : la spec impose CLAUDE_DISABLE_SESSION_LOG=1 et TERM=dumb, mais ne dit pas que l'environnement doit être réduit à un whitelist. Variables comme CLAUDECODE, CLAUDE_CODE_*, ANTHROPIC_*, HOME (qui pointe vers les session logs), XDG_* sont implicitement héritées. Une variable non listée peut réactiver un log verbatim.
  • Impact : surface d'évasion non bornée, invariant RUNTIME-01 fragile à un changement upstream de claude -p.
  • Gravité : Majeur

SR-06 — Absence de guard sur la taille des fichiers d'état

  • Type : Risque sécurité
  • Référence : §5.15 + INV-295-STATE-05 + SR-01
  • Description : aucun invariant ne borne la taille maximale des fichiers d'état signés. Combiné à SR-01 (lignes unsigned ignorées silencieusement), un attaquant en écriture peut faire enfler learnings-injections.jsonl jusqu'à saturation disque.
  • Impact : DoS par remplissage, pas de quota.
  • Gravité : Majeur

7. Axe 5bis — Cohérence des diagrammes

D-01 — Machine MEMORY_DEGRADED / MEMORY_HEALTHY absente de §5.11 et de §5bis

  • Type : Incohérence diagramme / invariant
  • Référence : §5.11 + §5bis + INV-295-18 + CA-295-25 + TC-INT-03
  • Description : INV-295-18 et CA-295-25 parlent d'une transition entre ces deux états. §5.11 ne liste que learning.scope et clarification.lifecycle_state. §5bis ne fournit aucun diagramme pour MEMORY_*. Une entité avec >=2 états (et a minima un sous-état transitoire « en cours de 2 cycles conformes ») sans diagramme tombe sous la règle « absence de diagramme » de l'axe 5bis.
  • Impact : FSM implicite non vérifiable ; ST-06 découle directement.
  • Gravité : Majeur

D-02 — Diagramme de séquence B5 n'explicite pas JCS et exclusion de sig_hmac_sha256

  • Type : Cohérence diagramme / transformation
  • Référence : §5bis diagramme B5 + §5.14
  • Description : le diagramme montre « append signed event » sans rendre visible l'étape JCS (RFC 8785) ni le point exact d'exclusion du champ sig_hmac_sha256 avant HMAC. Pour une fonction de sécurité auditée contractuellement, ces transformations devraient apparaître explicitement.
  • Impact : la revue visuelle ne suffit pas à valider le flux crypto ; nécessite un croisement manuel avec §5.14.
  • Gravité : Mineur

D-03 — Diagramme clarification.lifecycle_state : puits REJECTED / PURGED non matérialisés

  • Type : Cohérence diagramme / invariant
  • Référence : §5bis diagramme clarification + INV-295-CL-07 + INV-295-CL-08
  • Description : les états terminaux REJECTED et PURGED sont posés par INV-295-CL-07/08, mais le diagramme Mermaid ne les matérialise pas comme puits (--> [*]). REJECTED n'apparaît que comme cible de transition, pas comme nœud terminal explicite.
  • Impact : lecture visuelle incomplète ; un implémenteur peut supposer d'autres transitions sortantes.
  • Gravité : Mineur

8. Synthèse gravité

Gravité Nombre
Bloquant 2 (ST-03, SR-04)
Majeur 24
Mineur 8

Points bloquants :

  • ST-03 : TC-NOM-06-bis non exécutable (payload non spécifié).
  • SR-04 : PD-XX-clarifications.md absent de l'énumération de purge RGPD (INV-295-04).

⚠️ Aucune correction proposée. ⚠️ Aucune reformulation. ⚠️ Aucune implémentation.