diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index 2e0e189..d0ce57e 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -1130,3 +1130,60 @@ réécrire l'inventaire contre la constitution CLAUDE.md). locale trouvée). Aucun artefact `out/` touché, aucun claim gaté, aucune logique de prod/gate. `./run_ci.sh` en clôture = **32 PASS · 0 FAIL · 0 SKIP** (inchangé). **Zéro nouveau module · zéro gate ajouté (#5).** Aucune commande touchant au VPS (#8) · aucun `git clean` . + +## Session `20260803_143719` · Sprint 8 QA · audit **count-drift dans les surfaces UNGATED** (`daily_reports/` + prose gate-docs `ci/`) — CLEAN (0 dérive, 0 édition) + signal chat.py resserré + +**État d'entrée.** `./run_ci.sh` = **32 PASS · 0 FAIL · 0 SKIP**, arbre `git status` propre. +Roadmap 1→8 livrée + gatée ; file de tâches fonctionnelles in-scope vide (constat partagé +`130717`/`140718` — reste = runtime VPS hors #8). Classe inventaire-vs-filesystem **close pour les +assets locaux** (`140718`). → cible d'audit : la **seule classe de dérive silencieuse encore +possible** = les **chiffres de comptage** (24 modules · 624 tests · 32 gates) dans les surfaces +**explicitement HORS gate**, où toute dérive passerait inaperçue. + +**Vérité-terrain re-dérivée (recompute `python3` indépendant · aucun chiffre saisi · #6).** +`quality_report.json` → **24/24 modules à 100/100** (min=max=100, `pass_score` 95) · +`regression_run.json` `totals` → **24 suites · 624 ran · 624 passés · 0/0/0** · +`acceptance_matrix.json` → **15/15** promesses `in_repo` (verdict `True`) · +`.gitea/workflows/ci.yml` → `gate.needs` = **32** jobs · `run_ci.sh` → **32 PASS**. + +**Surface 1 — piste écartée après vérification : le canal `daily_reports/` n'est PAS périmé.** +Hypothèse d'entrée : le rapport `daily_reports/2026-08-03.md` (en-tête session `000623`) affiche +« 22/22 modules · 564 ran · 30 PASS » dans sa table « État courant MVP » (L54) — antérieure à la +réconciliation 22→24 (`e24f2c9`, session `100714`). **MAIS** lecture du fichier **entier** : la +session `100714` a **déjà** annexé une table « État launch-readiness · addendum `100714` » (L250-281) +portant les chiffres courants **24/624/32** — l'addendum **supersède** la table d'en-tête par la +**convention** du canal (chaque `daily_report` = **snapshot daté immutable** ; addenda empilés — le +`2026-08-02` en compte 7). Convention **ancrée dans le code du gate** : `ci/check_docs.sh:50` +(« rapports : hors gate score ») + `ci/check_readme_claims.sh:8914` (« daily_reports/activity_log = +snapshots datés »). → **Fabriquer un nouvel addendum ne ferait que dupliquer `100714`** (workflow #5, +« JAMAIS accumuler doublons »). **Non touché.** Grep élargi des chiffres « 22/564/30 » sur tous les +`.md` trackés : **tous les hits résiduels sont dans `2026-08-02.md`** — exacts pour **ce jour-là** +(les 2 modules neufs sont arrivés le 08-03), donc **snapshots datés corrects**, pas de la dérive. + +**Surface 2 — résidus « 22 »/« 564 » dans la prose des gate-docs `ci/` = pédagogiques, KEEP.** +8 hits restants (`ci/README.md` L197/227/729 · `ci/check_regression.sh` L19 · `ci/check_readme_claims.sh` +L14/653/791/3164 · `ci.yml` L109). Classifiés un par un selon la règle [[prose-facts-vs-numeric-drift]] +(*historique-repro / pédagogique-hypothétique / cite-de-ligne = KEEP · présent-état-courant = FIX*) : +**tous pédagogiques/historiques** — scénarios d'échec illustratifs (« ex. 21→22 modules », « 22 suites +devenu faux si… », « bijective 22/22 vs CI : vert trompeur ») qui expliquent **ce que le gate attrape**. +Cas le plus ambigu, `ci/README.md:227` « Le compte agrégé ci-dessus (« 564 tests ») ne suffit pas » : +c'est un **paragraphe de rationale figé** où « 564 » cohabite avec ses frères narratifs **534** (L216), +**560** (L220), **31/37/35→34/25→26** (L226-227) — tous des exemples d'incidents de dérive **passés**. +Bumper **le seul** 564→624 en laissant 534/560 rendrait la narration **auto-incohérente**. `git show f9d303f` +confirme : la réconciliation 22→24 des gate-docs a **délibérément laissé** ce 564 (son diff ne touche que +la citation **vive** « 22 modules »). → règle « **don't blanket-bump** » respectée. **Non touché.** + +**Signal chat.py RESSERRÉ à Michel (item ouvert `133718`/`140718`, non tranché).** Re-vérifié au +filesystem : `/opt/oto/otoia/capabilities/chat.py` **absent**, **mais** les **3 autres** capabilities +canoniques de CLAUDE.md **existent comme source `.py` réelle** (`aec.py`, `knowledge.py`, +`prompt_engine.py` — `ls` confirmé). **Nuance neuve** : ce n'est **pas** un répertoire pyc-only ni un +gap de build — c'est un **gap d'une seule capability sur quatre**. Contexte affiné pour la décision de +Michel (recréer `chat.py` · pointer vers `frontend/chat_otoia/` livré in-repo · ou retirer de la liste +canonique). **Toujours non édité** (ne pas réécrire l'inventaire/la constitution). + +**Résultat : 0 dérive, 0 édition de prod/doc.** Session **audit + log pur**. Aucun artefact `out/` +touché, aucun claim gaté, aucune logique de gate. La classe **count-drift** est désormais vérifiée +**close jusque dans les surfaces UNGATED** (daily_reports = snapshots datés corrects + superséd. par +addendum ; prose `ci/` = résidus pédagogiques délibérés). Re-scanner ces surfaces serait redondant (#5). +`./run_ci.sh` en clôture = **32 PASS · 0 FAIL · 0 SKIP** (inchangé). **Zéro nouveau module · zéro gate +ajouté (#5) · zéro chiffre inventé (#6).** Aucune commande touchant au VPS (#8) · aucun `git clean` .