[DTP-Worker 20260801_203424] Sprint 8 · buffer · Audit 5D (4e surface du même README) : gate d'IDENTITÉ des LIVRABLES AUDITÉS — la liste des 5 hand-off out/*.json que l'audit de second niveau LIT (README qa/audit_5d §« Livrables audités »), énumérée à la main hors de tout gate ; recomputée par ENSEMBLE de MANIFEST.audited_artifacts (byte-gaté · = sorted(ARTIFACT_PATHS.values())), ordre README ≠ ordre MANIFEST trié ⇒ set-diff absent/fantôme ; cross-anchors : chaque chemin résout un fichier commité (a) + |audités| == |alias distincts des controls[].artifacts du spec| (b) ; 6 morsures vérifiées (4 README · 2 source), 7 gates re-verts

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-01 20:46:10 +00:00
parent 17c3d2b104
commit f91a22f458
3 changed files with 192 additions and 1 deletions
+71
View File
@@ -2183,3 +2183,74 @@ Working tree byte-restauré via `git checkout -- <fichier précis>` (**JAMAIS**
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
- **Auto-score 4Big** : 96/100.
## Session `20260801_203424` · Buffer S8 · Audit 5D (4e surface du même README) : gate de l'IDENTITÉ des **LIVRABLES AUDITÉS** — la liste des hand-off `out/*.json` que l'audit de second niveau LIT comme matière première
**Contexte** : la série anti-dérive Sprint-8 gate chaque surface data-derived contre
sa source de vérité (CLAUDE.md #6, roadmap fonctionnellement close). Trois blocs
`audit_5d` de `ci/check_readme_claims.sh` couvrent déjà le MÊME README : la **synthèse**
(17 contrôles / 5 dimensions + ventilation verdict), l'**énumération des open items**
(`control→dimension→propriétaire`) et l'**IDENTITÉ des 5 dimensions** (`id→titre→
reference`). Une **4e surface** du même README restait ungated.
**Surface trouvée (ungated)** : `05_deliverables_mvp/qa/audit_5d/README.md:21-27` —
section « ## Livrables audités (source = leur `out/`) » : une **liste de 5 puces** qui
énumère À LA MAIN les hand-off `out/*.json` que l'auditeur charge réellement
(`crm/workflow_vente/out/workflow.json` · `crm/dossier_vente/out/doctype_oto_dossier_
vente.json` · `crm/commissions/out/commission_plan.json` · `fiscal/ecf_dgii/out/
ecf_plan.json` · `legal/confotur/out/doctype_confotur_application.json`). Aucun bloc ne
la touchait — vérifié : le seul `audited_artifacts` de tout le gate était dans un
**commentaire** ; les 3 blocs audit_5d ne `load()` que `controls_total`/`totals`/
`open_items`/`dimensions[]`.
**Source faisant autorité** : `qa/audit_5d/out/MANIFEST.json` clé `audited_artifacts`
(byte-gaté par `check_artifacts` ⇒ reproduit à chaque build via
`sorted(ARTIFACT_PATHS.values())` dans `audit_5d_gen.py:61` — le registre des hand-off
que `qalib/artifacts.py::load_artifacts()` charge). Le README énumère les 5 chemins
dans un **ORDRE DIFFÉRENT** du MANIFEST (workflow 2e ici, 3e au MANIFEST trié) ⇒
comparaison par **ENSEMBLE**.
**Dérive silencieuse fermée** : brancher un nouveau livrable amont sur l'audit
(nouvelle entrée `ARTIFACT_PATHS` → nouveau chemin dans `audited_artifacts`) ou en
retirer un laisse la section README **périmée en silence** pendant que l'audit lit un
autre jeu de fichiers ⇒ le lecteur/banquier croirait l'audit couvrir un **périmètre
qu'il ne couvre plus** (l'invention #6 interdit), qu'aucune suite `tests/` (FONCTIONS
de contrôle, pas la prose) n'attrape. **État courant** : les 5 puces == registre
exactement (rien à réécrire · anti-invention #6), le défaut est la **surface ungated**.
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Audit 5D (4e surface) ·
IDENTITÉ des LIVRABLES AUDITÉS » entre le bloc des 5 dimensions et le bloc DevOps
run-book) : on RECOMPUTE l'ensemble depuis `MANIFEST.audited_artifacts` (zéro
duplication du registre) et on parse les puces `` - `<chemin>` `` de la section
« ## Livrables audités » → égalité par ENSEMBLE exigée (absent ET fantôme mordus, via
set-diff `absents`/`en trop`). **Cohérences croisées bonus** : **(a)** chaque chemin
audité RÉSOUT un fichier commité sur disque (`os.path.exists` — le `_load` de l'auditeur
lève `FileNotFoundError` sinon, audit à vide impossible) ; **(b)** |livrables audités|
== |alias distincts d'artefacts référencés par les `controls[].artifacts` de
`audit_spec.json`| (un artefact chargé mais jamais contrôlé, ou un alias contrôlé sans
chemin de chargement → `KeyError` runtime, désynchronise). Section absente = échec
(traçabilité #6). `import os` ajouté au bloc (non importé globalement).
**6 morsures vérifiées** (4 côté README · 2 côté source) :
1. README puce `workflow.json` retirée → ✗ « absents=[…workflow.json] » ;
2. README puce FANTÔME `demo/scenarios/out/run_sheet.json` ajoutée → ✗ « en trop
(fantôme)=[…run_sheet.json] » ;
3. README typo `commission_plan.json`→`commissions_plan.json` → ✗ absents ET fantôme ;
4. README header de section renommé → ✗ « section « ## Livrables audités »
INTROUVABLE/vide » ;
5. `audit_spec.json` : alias `phantom_alias` ajouté à un contrôle → ✗ « désynchro
registre/spec : 5 livrables MAIS 6 alias distincts contrôlés » (cross-anchor b) ;
6. `MANIFEST.audited_artifacts` : un chemin pointé vers un fichier inexistant → ✗
« INTROUVABLES sur disque » (cross-anchor a) + ✗ README périmé.
Restauré = green : 5 puces == registre · 5 == 5 alias · 5 fichiers résolus · exit 0.
Working tree byte-restauré via `git checkout -- <fichier précis>` (**JAMAIS**
`git checkout .` / `git clean`, interdits absolus). **7 gates re-verts** :
`validate_json` / `guard_constraints` / `check_docs` / `check_artifacts` /
`check_regression` / `check_ci_integrity` / `check_readme_claims` (tous rc=0).
- `ci/README.md` mis à jour : clause de la row récap `check-readme-claims` (surface
audit 5D étendue) + paragraphe détaillé « 4ᵉ surface du même README de l'audit 5D ».
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'exécution
réelle de l'audit `bench` reste côté VPS).
- **Auto-score 4Big** : 96/100.