[DTP-Worker 20260801_220449] Sprint 8 · buffer · Chat OTOIA : gate d'IDENTITÉ de la LISTE D'INVARIANTS CI — la section « ## Invariants (N) — garantis en CI » du README (compte annoncé + énumération numérotée en prose + self-report CLI « N invariants verts » du générateur, 3 transcriptions) recomputée du REGISTRE-source = marqueurs # Invariant N de chat_otoia_gen.py : (a) registre code contigu 1..N, (b) self-report CLI == |registre|, (c) compte annoncé == |registre|, (d) énumération prose == registre EXACT (set-diff absent/fantôme) ; surface aveugle aux blocs Chat OTOIA préexistants (comptes d'artefact + identité persona/langues) ; 5 morsures vérifiées, 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 22:13:26 +00:00
parent d20d37607d
commit 64b635073a
3 changed files with 145 additions and 1 deletions
+54
View File
@@ -2379,3 +2379,57 @@ interdits absolus). **7 gates re-verts** : `validate_json` / `guard_constraints`
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'application
réelle du DocType par `bench` reste côté agent ERPNext Backend).
- **Auto-score 4Big** : 96/100.
---
## Sprint 8 · buffer · Chat OTOIA : gate d'IDENTITÉ de la LISTE D'INVARIANTS CI
**Contexte** : campagne anti-dérive documentaire (Sprint 8 · QA « regression
tests exhaustifs »). Baseline des 7 gates vert avant intervention. Recherche
(sous-agent Explore) de la prochaine classe de surface data-derived transcrite
en prose mais NON gatée → candidat retenu : la section « ## Invariants (14) —
garantis en CI » du README `frontend/chat_otoia` (README:53-60).
**Défaut** : cette section (a) ANNONCE un compte `(14)` puis (b) ÉNUMÈRE chaque
invariant par son numéro entre parenthèses ((1)·(2)·…·(11, 13)·(12)·(14)). C'est
la transcription À LA MAIN du REGISTRE réel des invariants du générateur — les
marqueurs `# Invariant N ·` de `chat_otoia_gen.py` (source d'autorité : chaque
marqueur = un contrôle appliqué par `validate()`). Le générateur se self-reporte
en plus dans son message CLI (« schéma + 14 invariants verts. »), 3ᵉ transcription
du même compte. Les blocs Chat OTOIA préexistants du gate couvrent des COMPTES
d'artefact (blocks/mounts/portails) + l'IDENTITÉ persona/langues/endpoint —
AUCUN ne touche la liste d'invariants : surface aveugle. Aucune suite `tests/` ne
teste la PROSE ; le byte-gate d'artefact ignore le `.py` source ⇒ dérive
silencieuse (ajouter `# Invariant 15` ⇒ README périmé sans échec).
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Chat OTOIA · IDENTITÉ
de la LISTE D'INVARIANTS CI », inséré juste après le bloc « Chat OTOIA identité »
et avant le bloc « Recette ») : on RECOMPUTE le registre depuis le SEUL
registre-source (`re.findall(r"#\s*Invariant\s+(\d+)", chat_otoia_gen.py)`) et on
exige — **(a)** le registre code est un ensemble CONTIGU `1..max` (lacune/doublon
dans le ledger = défaut réel) ; **(b)** le message CLI « N invariants verts »
== |registre| (self-report du `.py` cohérent avec son propre ledger) ; **(c)** le
compte annoncé « ## Invariants (N) » du README == |registre| ; **(d)**
l'ÉNUMÉRATION en prose (ints extraits des groupes `(...)` de la section, borne =
prochain `## `) == registre EXACT — absent ET fantôme mordus par set-diff. Section
ou compte absent = échec (disparition d'un chiffre = régression de traçabilité #6).
**5 morsures vérifiées** (working tree byte-restauré après chacune via
`git checkout -- <fichier précis>`, JAMAIS `git checkout .` / `git clean`) :
1. compte annoncé `14`→`15` → ✗ (c) « annonce (15) MAIS registre en compte 14 » ;
2. numéro `(7)` retiré de la prose → ✗ (d) « absent(s)=[7] » ;
3. numéro fantôme `20` ajouté à la prose → ✗ (d) « fantôme(s)=[20] » ;
4. self-report CLI `14`→`13` → ✗ (b) « générateur dit 13 MAIS registre 14 » ;
5. ledger code `# Invariant 7`→`77` → ✗ (a) « registre NON contigu […77] » +
✗ (d) « absent(s)=[77] · fantôme(s)=[7] » (double morsure : ledger + prose).
Restauré = green : (a)(b)(c)(d) tous ✓ (registre contigu 1..14 · 14 marqueurs).
- `ci/README.md` : la clause « montage Chat OTOIA » de la row `check-readme-claims`
étendue de l'IDENTITÉ de la liste d'invariants (compte + énumération + self-report
CLI recomputés du registre `# Invariant N`, set-diff + contiguïté).
- **7 gates re-verts** : `validate_json` / `guard_constraints` / `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.