[DTP-Worker 20260802_020502] Sprint 8 · buffer · QA Audit 5D : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate (6ᵉ instance du ledger)
RECOMPUTE le ledger d'invariants depuis le SEUL registre-source (les `# N ·` de `_validate` de audit_5d_gen.py) et gate les 6 transcriptions manuelles de « 15 invariants » (4 dans le .py, 2 dans le README), toutes invisibles à check_artifacts. Ledger PROPRE 1..15 (schéma compté à part). Exige : (a) ledger contigu 1..N (lacune/doublon nu mordu) ; (b) toute mention « N invariants » du .py == |ledger| ; (d) toute mention README == |ledger|. Le distinct « 17 contrôles » est exclu nativement par l'ancre sur le mot « invariants » (aucun faux positif). 6 morsures adversariales dont M3 (ajout `# 16 ·` mord .py+README, preuve que l'autorité est le CODE) et M6 (« 17 contrôles » reste invisible). 6 gates re-verts exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,61 @@
|
||||
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
||||
|
||||
## Sprint 8 · buffer · QA Audit 5D — gate d'IDENTITÉ du COMPTE D'INVARIANTS de `_validate` (6ᵉ instance du ledger)
|
||||
|
||||
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||
chiffres »). Le pattern « ledger d'invariants » (recompute le nombre de contrôles
|
||||
CI depuis le registre-source `# N ·` de `_validate`, jamais une liste à la main)
|
||||
a déjà couvert **Chat OTOIA**, **SEO**, **Fiscal e-CF**, **Legal CONFOTUR** et
|
||||
**CRM Dossier Vente**. Le **6ᵉ générateur** portant le même nombre magique restait
|
||||
NON gaté : `qa/audit_5d/audit_5d_gen.py` (candidat restant recensé : `crm/commissions`
|
||||
·10, ledger propre non gaté).
|
||||
|
||||
Le compte **« 15 invariants »** y est transcrit **à la main à SIX endroits**,
|
||||
aucun gaté, tous invisibles à `check_artifacts` (le `.py` source n'est pas un
|
||||
`out/*.json`) :
|
||||
1. docstring sous-commande module (l.19 « valide schéma + 15 invariants ») ;
|
||||
2. docstring `_validate` (l.80 « 15 invariants de cohérence audit/contrôles ») ;
|
||||
3. message de succès CLI `validate` « … 15 invariants — verdict … » (l.218) ;
|
||||
4. aide du sous-parseur `validate` « valide schéma + 15 invariants » (l.229) ;
|
||||
5. README bloc de commande « schéma + 15 invariants » (l.66) ;
|
||||
6. README prose d'architecture « CLI build/validate + **15 invariants** » (l.81).
|
||||
|
||||
Ajouter un contrôle `# 16 ·` à `_validate` sans toucher les 6 chaînes ⇒ le README
|
||||
ET les self-reports du `.py` mentent en silence pendant que la CI applique 16
|
||||
contrôles. Aucune suite `tests/` (qui teste des FONCTIONS de validation, pas la
|
||||
prose) n'attrape ce « vert trompeur ».
|
||||
|
||||
**Particularité du registre Audit 5D** (≈ Dossier Vente, ≠ Fiscal) : le ledger est
|
||||
**PROPRE 1..15** — le **schéma est compté À PART** (phrasé « schéma + N invariants »),
|
||||
donc **pas de schéma-#1 non marqué** et **pas de split a/b** ; on garde la détection
|
||||
de doublon nu comme filet. MAIS le module porte un **SECOND nombre distinct** —
|
||||
« **17 contrôles** » (le compte de fonctions-contrôle de `qalib/controls.py`, déjà
|
||||
gaté par ailleurs), présent dans le `.py` ET le README : un `\d+ invariants` ancré
|
||||
sur le mot « invariants » l'**exclut nativement** (« 17 contrôles » ≠ mot
|
||||
« invariants ») ⇒ **aucun faux positif** sur l'arbre propre. Contrairement à
|
||||
Dossier Vente/Fiscal, ce README n'a **NI titre « ## Les N invariants » NI
|
||||
énumération numérotée** du ledger → on ne gate que (a)(b)(d).
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « QA · Audit 5D · IDENTITÉ du
|
||||
COMPTE D'INVARIANTS ») — RECOMPUTE le ledger depuis le SEUL registre-source
|
||||
(`# N ·` de `_validate`) et exige :
|
||||
- **(a)** ledger CONTIGU 1..N (lacune OU doublon nu = vrai défaut de registre) ;
|
||||
- **(b)** toute mention « N invariants » du `.py` == |ledger| ;
|
||||
- **(d)** toute mention « N invariants » du README == |ledger|.
|
||||
Une mention ou le registre absent échoue AUSSI (traçabilité #6 · anti-évaporation).
|
||||
|
||||
**Vérif** — 3 checks verts sur l'arbre propre (ledger 1..15 = 15 marqueurs `# N ·`,
|
||||
schéma compté à part). **6 morsures** adversariales : M1 self-report `.py` 15→16
|
||||
(b) · M2 mention README 15→16 (d) · **M3 ajout marqueur `# 16 ·` ⇒ ledger→16 pendant
|
||||
que la prose reste 15 (mord `.py` ET README, preuve que l'autorité est le CODE)** ·
|
||||
M4 suppression `# 7 ·` ⇒ gap non-contigu (a) · M5 doublon nu `# 5 ·` ⇒ détection de
|
||||
vrai doublon (a) · **M6 no-false-positive** : le distinct « 17 contrôles » reste
|
||||
INVISIBLE au gate (l'ancre « invariants » l'exclut, arbre propre VERT). Gates
|
||||
re-verts : `check_artifacts` · `check_docs` · `guard_constraints` ·
|
||||
`check_ci_integrity` · `check_regression` · `check_readme_claims` tous exit 0.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 8 · buffer · CRM Dossier Vente — gate d'IDENTITÉ du COMPTE D'INVARIANTS de `_validate` (5ᵉ instance du ledger)
|
||||
|
||||
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||
|
||||
Reference in New Issue
Block a user