[DTP-Worker 20260802_003501] Sprint 8 · buffer · Fiscal e-CF DGII : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate
3ᵉ application du pattern « ledger d'invariants » (après Chat OTOIA + SEO) : le
nombre magique « 12 invariants » du générateur fiscal ecf_dgii_gen.py est
transcrit à la main à 7 endroits (4 chaînes du .py : docstrings module/_validate
+ succès CLI + aide sous-parseur ; 3 du README : bloc commande + titre « ## Les
12 invariants » + prose de score), aucun gaté, tous invisibles à check_artifacts
(le .py source n'est pas un out/*.json). Ajouter un contrôle # 13 · à _validate
sans toucher les 7 chaînes = 13 contrôles appliqués pendant que README et
self-reports mentent en silence — vert trompeur qu'aucune suite tests/ (fonctions,
pas la prose) n'attrape.
Gate (bloc « Fiscal · e-CF DGII · IDENTITÉ du COMPTE D'INVARIANTS ») : RECOMPUTE
le ledger depuis le SEUL registre-source (# N · de _validate) et exige (a) ledger
CONTIGU 1..N ; (b) toute mention « N invariants » du .py == |ledger| ; (c) annonce
du titre README == |ledger| ; (d) toute mention README == |ledger| ; (e)
énumération numérotée prose du README contiguë 1..N. Particularité fiscale (≠
SEO/Chat OTOIA propres 1..N) : invariant 1 = validation de SCHÉMA non marquée
# 1 · (marqueurs 2..N), invariant 12 SPLITTÉ en # 12a ·/# 12b · (2 volets d'un
même invariant). Le ledger = {1:schéma} ∪ marqueurs-top-level, collapse 12a/12b
mais MORD un vrai doublon nu.
5 checks verts (ledger 1..12). 8 morsures : M1 self-report .py 12→13 (b) · M2
titre 12→13 (c+d) · M3 mention README 12→13 (d) · M4 ajout # 13 · ⇒ ledger→13
pendant que prose reste 12 (b+c+d, preuve que l'autorité est le CODE) · M5 drop
# 7 · = gap non contigu (a) · M6 doublon nu # 5 · · M7 énumération 7.→8. (e) ·
M8 drop validate(bundle, schema) = invariant 1 introuvable. 6 gates re-verts
(check_artifacts · check_docs · guard_constraints · check_ci_integrity ·
check_readme_claims · check_regression) exit 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -39,3 +39,58 @@ les 4 copies simultanément** (preuve que l'ancre est CLAUDE.md, pas la cohéren
|
||||
interne) · M6 footer supprimé → INTROUVABLE. Gates re-verts :
|
||||
`check_readme_claims` · `check_docs` · `guard_constraints` · `check_ci_integrity`
|
||||
tous exit 0.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 8 · buffer · Fiscal e-CF DGII : gate d'IDENTITÉ du COMPTE D'INVARIANTS de `_validate`
|
||||
|
||||
**Contexte** — Série anti-dérive Sprint 8 (CLAUDE.md #6 « zéro invention de
|
||||
chiffres »). Le pattern « ledger d'invariants » a déjà été appliqué à **Chat
|
||||
OTOIA** et **SEO** (recompute le nombre d'invariants CI depuis le registre-source
|
||||
`# N ·` de `_validate`, jamais une liste à la main). Le **3ᵉ générateur** portant
|
||||
le même nombre magique restait NON couvert : `fiscal/ecf_dgii/ecf_dgii_gen.py`.
|
||||
|
||||
Le compte **« 12 invariants »** y est transcrit **à la main à SEPT endroits**,
|
||||
aucun gaté, tous invisibles à `check_artifacts` (le `.py` source n'est pas un
|
||||
`out/*.json`) :
|
||||
1. `ecf_dgii_gen.py` docstring module (l.24) ;
|
||||
2. docstring `_validate` (l.110) ;
|
||||
3. message de succès CLI `validate` « … schéma + 12 invariants verts. » (l.277) ;
|
||||
4. aide du sous-parseur `validate` (l.289) ;
|
||||
5. README bloc de commande « schéma + 12 invariants » (l.65) ;
|
||||
6. README titre de section « ## Les 12 invariants » (l.69) ;
|
||||
7. README prose de score « 12 invariants de cross-cohérence » (l.105).
|
||||
|
||||
Ajouter un contrôle `# 13 ·` à `_validate` sans toucher les 7 chaînes ⇒ le README
|
||||
ET les self-reports du `.py` mentent en silence pendant que la CI applique 13
|
||||
contrôles. Aucune suite `tests/` (qui teste des FONCTIONS de validation, pas la
|
||||
prose) n'attrape ce « vert trompeur ».
|
||||
|
||||
**Particularité du registre fiscal** (≠ SEO/Chat OTOIA au ledger propre 1..N) :
|
||||
l'**invariant 1 est la validation de SCHÉMA** (`validate(bundle, schema)`, **non
|
||||
marquée** `# 1 ·`), les marqueurs couvrent **2..N**, et l'invariant **12 est
|
||||
splitté** en `# 12a ·` (unicité évènements) / `# 12b ·` (comptes du manifeste) —
|
||||
deux volets d'un même invariant. Le gate reconstruit donc le ledger = `{1:schéma}`
|
||||
∪ marqueurs-top-level, en collapsant 12a/12b, tout en **mordant un vrai doublon**
|
||||
d'un numéro NON suffixé.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « Fiscal · e-CF DGII · IDENTITÉ
|
||||
du COMPTE D'INVARIANTS ») — RECOMPUTE le ledger depuis le SEUL registre-source
|
||||
(`# N ·` de `_validate`) et exige :
|
||||
- **(a)** ledger CONTIGU 1..N (schéma #1 présent + marqueurs 2..N sans lacune ;
|
||||
doublon nu = défaut mordu ; 12a/12b comptés 1×) ;
|
||||
- **(b)** toute mention « N invariants » du `.py` == |ledger| ;
|
||||
- **(c)** l'annonce du titre README == |ledger| ;
|
||||
- **(d)** toute mention « N invariants » du README == |ledger| ;
|
||||
- **(e)** l'ÉNUMÉRATION numérotée du README (« 1. … 2. … N. ») elle-même contiguë
|
||||
1..N (item ni sauté ni dupliqué).
|
||||
|
||||
**Vérif** — 5 checks verts sur l'arbre propre (ledger 1..12 = schéma #1 + 11
|
||||
marqueurs). **8 morsures** adversariales : M1 self-report `.py` 12→13 (b) · M2
|
||||
titre README 12→13 (c+d) · M3 mention README 12→13 (d) · M4 ajout marqueur `# 13 ·`
|
||||
⇒ ledger→13 pendant que la prose reste 12 (b+c+d, preuve que l'autorité est le
|
||||
CODE, pas la prose) · M5 suppression `# 7 ·` ⇒ gap non-contigu (a) · M6 doublon nu
|
||||
`# 5 ·` ⇒ détection de vrai doublon · M7 énumération README 7.→8. ⇒ deux 8/pas de
|
||||
7 (e) · M8 suppression `validate(bundle, schema)` ⇒ invariant 1 introuvable. Gates
|
||||
re-verts : `check_artifacts` · `check_docs` · `guard_constraints` ·
|
||||
`check_ci_integrity` · `check_readme_claims` · `check_regression` tous exit 0.
|
||||
|
||||
Reference in New Issue
Block a user