[DTP-Worker 20260801_230453] Sprint 8 · buffer · QA/Audit 5D : gate d'IDENTITÉ du VERDICT GLOBAL — le LABEL de conclusion de l'audit (PASS / PASS_WITH_OPEN_ITEMS / FAIL), la HEADLINE du livrable, était HORS de tout gate : le bloc audit_5d existant recompute la ventilation chiffrée (13 PASS · 0 FAIL · 4 à confirmer), les open items, les 5 dimensions et les livrables audités — jamais le label lui-même. Or il est data-derived (audit_report.json[verdict] == MANIFEST.json[verdict], byte-gatés), recalculé par builder.py (FAIL si ≥1 FAIL · sinon PASS_WITH_OPEN_ITEMS si ≥1 A_CONFIRMER · sinon PASS) et transcrit à la main à 2 endroits du README (la RÈGLE l.39 + le VERDICT COURANT l.49). Nouveau bloc : on MIROITE la règle et on exige (a) HONNÊTETÉ interne audit_report.verdict == verdict(triplet) — un PASS forcé pendant que 4 params restent a_confirmer (CŒUR #6 : ne jamais forcer un PASS) est mordu ; (b) MANIFEST.verdict == audit_report.verdict ; (c) label « Verdict courant » README == artefact ; (d) la règle « Verdict global » énumère EXACTEMENT le codomaine {FAIL, PASS_WITH_OPEN_ITEMS, PASS} du générateur. 5 morsures vérifiées (2 README · 2 artefact + M3 cascade a+b+c · 1 disparition), 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,65 @@
|
||||
# Activity Log · 2026-08-01 · Claude Code DTP
|
||||
|
||||
## Session `20260801_230453` · Buffer S8 · QA/Audit 5D : gate d'IDENTITÉ du **VERDICT GLOBAL** — le LABEL de conclusion de l'audit
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
complète ; la valeur marginale reste le durcissement anti-dérive (CLAUDE.md #6)
|
||||
des surfaces prose data-derived encore non gatées. Les 7 gates verts au départ.
|
||||
|
||||
**Surface trouvée (aveugle)** : le **verdict global** de l'audit 5D — le LABEL
|
||||
`PASS` / `PASS_WITH_OPEN_ITEMS` / `FAIL` qui est la **HEADLINE de tout le
|
||||
livrable** — était **HORS de tout gate**. Le bloc audit_5d existant recompute la
|
||||
**ventilation chiffrée** (« **13 PASS · 0 FAIL · 4 à confirmer** », pass/fail/à
|
||||
confirmer d'`audit_report.totals`), l'énumération des open items, les 5 dimensions
|
||||
et les livrables audités — mais **jamais le label de verdict lui-même**. Or ce
|
||||
label est data-derived (`out/audit_report.json[verdict]` == `out/MANIFEST.json[verdict]`
|
||||
== `PASS_WITH_OPEN_ITEMS`, byte-gatés), recalculé par `qalib/builder.py` via la
|
||||
règle **`FAIL` si ≥1 FAIL · sinon `PASS_WITH_OPEN_ITEMS` si ≥1 A_CONFIRMER · sinon
|
||||
`PASS`**, et transcrit à la main à **deux** endroits du README : la RÈGLE
|
||||
(`Verdict global : …`, l.39) et le VERDICT COURANT (`## Verdict courant` l.49). Le
|
||||
risque #6 est le **CŒUR** du livrable : écrire `PASS` alors que 4 params
|
||||
réglementaires restent `a_confirmer` = l'audit « force » un PASS et prétend propre
|
||||
un dossier qui ne l'est pas — exactement ce que l'audit reproche aux autres. La
|
||||
ventilation chiffrée peut rester exacte pendant que le label ment ; ni
|
||||
`check_artifacts` (byte only) ni les suites `tests/` (FONCTIONS, pas la prose)
|
||||
n'attrapent.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « Audit 5D · IDENTITÉ du VERDICT
|
||||
GLOBAL », inséré juste après la ventilation chiffrée) : on **MIROITE** la règle du
|
||||
générateur et on exige — **(a)** HONNÊTETÉ interne : `audit_report.verdict` ==
|
||||
verdict recalculé du triplet (fail>0→FAIL · a_confirmer>0→PASS_WITH_OPEN_ITEMS ·
|
||||
sinon PASS) ⇒ un verdict FORCÉ incohérent avec ses propres chiffres est mordu ;
|
||||
**(b)** CROISÉ : `MANIFEST.verdict` == `audit_report.verdict` ; **(c)** le LABEL
|
||||
« Verdict courant » du README == `audit_report.verdict` (ancré sur le heading +
|
||||
la ventilation `**N PASS`, pas sur la règle l.39) ; **(d)** la RÈGLE « Verdict
|
||||
global » énumère EXACTEMENT le **codomaine** `{FAIL, PASS_WITH_OPEN_ITEMS, PASS}`
|
||||
du générateur (un label renommé côté `builder.py` sans mise à jour de la règle est
|
||||
mordu). Claim absent = échec (disparition = régression).
|
||||
|
||||
**5 morsures vérifiées** (working tree byte-restauré après chacune via
|
||||
`git checkout -- <chemin précis>`, JAMAIS `git checkout .` / `git clean`) :
|
||||
1. README label `PASS_WITH_OPEN_ITEMS`→`PASS` → ✗ (c) « Verdict courant = PASS MAIS
|
||||
artefact PASS_WITH_OPEN_ITEMS » ;
|
||||
2. README règle l.39 `PASS_WITH_OPEN_ITEMS`→`PASS_OPEN` → ✗ (d) « codomaine
|
||||
[FAIL, PASS, PASS_OPEN] ≠ [FAIL, PASS, PASS_WITH_OPEN_ITEMS] » ;
|
||||
3. `audit_report.verdict`→`PASS` (à_confirmer reste 4) → ✗ (a) « verdict FORCÉ,
|
||||
incohérent — viole #6 » **+** cascade ✗ (b) + ✗ (c) (3 fails : l'honnêteté est
|
||||
la morsure la plus forte) ;
|
||||
4. `MANIFEST.verdict`→`PASS` → ✗ (b) « MANIFEST PASS MAIS audit_report
|
||||
PASS_WITH_OPEN_ITEMS (désynchronisés) » ;
|
||||
5. README label supprimé (l.49) → ✗ (c) « Verdict courant INTROUVABLE ».
|
||||
Restauré = green : (a)(b)(c)(d) tous ✓.
|
||||
|
||||
- `ci/README.md` : la sous-clause « audit 5D » de la row `check-readme-claims`
|
||||
étendue de l'IDENTITÉ du VERDICT GLOBAL (label + honnêteté interne + croisé
|
||||
MANIFEST + codomaine de la règle documentée).
|
||||
- **7 gates re-verts** : `guard_constraints` / `validate_json` / `check_docs` /
|
||||
`check_artifacts` / `check_regression` / `check_ci_integrity` /
|
||||
`check_readme_claims` (tous rc=0).
|
||||
- **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_210434` · Buffer S8 · Domaine CRM/commissions : l'**IDENTITÉ du CHAMP DEVISE** — la clause `devise_field` = le champ `devise` (`Select` **USD/DOP** · #10) du DocType Dossier Vente, transcrite **en prose** dans la §« Cross-cohérence » (`crm/commissions/README.md:54`) — était **HORS de tout gate**. Les trois blocs commissions déjà en place gatent les états soumis / brouillons exclus, les champs de base Currency, l'identité des rôles payés (portail `ventes`) et la promesse anti-taux #6 — mais **aucun** ne touchait ce couple champ↔devises (l'**invariant CLI #8** du générateur).
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
|
||||
Reference in New Issue
Block a user