diff --git a/05_activity_log/2026-08-05.md b/05_activity_log/2026-08-05.md index bfcb58b..6331bdc 100644 --- a/05_activity_log/2026-08-05.md +++ b/05_activity_log/2026-08-05.md @@ -1945,3 +1945,61 @@ ajouté** (#5), **0 chiffre saisi à la main** (#6 — `8`/`33`/`258` recomputé + ce journal. **Vérif.** `./run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** · `git status` propre après commit. + +--- + +## Session `20260805_221354` · SWEEP de vérification — bijection INVERSE des artefacts `out/` (aucun fichier commité orphelin) · 0 édition de production + +**Contexte.** Repo VERT à l'ouverture (`./run_ci.sh` → 33 PASS · 0 FAIL · 0 SKIP), très +convergé. Balayage lecture-seule multi-surface préalable pour un finding **réel** avant tout +travail (discipline anti-gate-N+1 · #5) : +- **CI** : 8 gates statiques (`git ls-files 'ci/*.sh'` hors `lib.sh` = 8) + 25 suites = 33 jobs. +- **Complétude modules** : **24/24** modules livrés (22 `*/*/tests` + `seo/tests` + `publiciste/tests`) + CI-câblés (`gate.needs`), régression-couverts (`regression_plan.json` = 24 suites, `publiciste` + inclus), fiche-documentés (≥1 `03_agents/*/AGENT.md`). **Aucun orphelin.** +- **Dérive doc↔code** (sous-agent Explore, 3 classes : docstring-vs-code · prose-vs-numeric · + fiche-completeness) → **CLEAN**, 0 dérive présente-temps. +- **Registre décisions ouvertes** (`OPEN_DECISIONS_REGISTER.md`) : les **5** items (D-01..D-05) + re-vérifiés **encore ouverts**, chaque citation `file:line` **encore exacte** (D-01 `pie_spec.json:24` + `contrats→legal/confotur` + 5 downstreams `null` · D-02 `gate.py:142` `_cond_validation_wag` + + `financement_spec.json:157` · D-03 `chat.py` absent fs / `CLAUDE.md:28` le liste / footer L128 + l'omet · D-04 `projets_editor.py` absent fs · D-05 bundle `a_confirmer`/`null`). **Contenu à jour** + (tampon de session en retard, mais bumper sans changement de contenu = churn cosmétique — écarté). +- **publiciste** : `build/` **`.gitignore`-d** (artefacts reproductibles non commités · pattern + `bancable-out-not-committed`), pas de sous-commande `build` ni de `out/` commité → `check_artifacts` + le saute correctement ; fiche L105 « aucun `index.html` commité » **exacte**. **Pas un gap.** +- **Sweep CWD-hétérogène écarté** : `check_artifacts` (l.62) exécute chaque générateur **depuis son + propre répertoire module** ; un sweep « CWD différent » produirait des **faux positifs** (les + générateurs résolvent leurs entrées relativement au module par conception) — piège de faux-positif + signalé à répétition en mémoire, abandonné. + +**Le finding — axe de robustesse génuinement NON couvert.** `check_artifacts.sh` prouve la +direction **AVANT** : pour chaque fichier **produit** par `build` (`$tmp/*`), un jumeau commité +**identique** existe (l.71-93 : itère sur les fichiers produits). Il ne vérifie **jamais l'INVERSE** : +qu'un fichier `out/` **commité** est **toujours** produit par un `build` frais. Un fichier `out/` +**orphelin** — émis par un ancien générateur, plus produit — passerait **silencieusement** (aucune +boucle sur les fichiers commités). Sibling non-déterminisme des sweeps `hash-seed` / `locale-TZ` / +`forward-compat` déjà en mémoire, mais sur une propriété **différente** (complétude/orphelins des +artefacts commités, pas déterminisme). + +**Sweep exécuté (lecture seule, rejouable).** Pour chaque `out/` (21 répertoires, tous avec un +générateur `build`), `build` frais vers un `mktemp -d`, puis pour chaque fichier `git ls-files` +du `out/` commité : exiger sa présence dans le build frais. Résultat : +- **58** fichiers `out/` commités inspectés · **57 reproduits** par `build` (bijection inverse OK). +- **1 seul « orphelin »** : `qa/regression/out/regression_run.json` — **BY DESIGN**, artefact + d'**EXÉCUTION** (`run`, pas `build`) explicitement exclu du contrat `build` par la docstring de + `check_artifacts` (l.21-24) et **byte-gaté séparément** par `check_regression.sh` (régénère un + `run` frais, exige l'identité byte-for-byte · mémoire `regression-baseline-17-skips-by-design`). +- → **0 orphelin réel.** La bijection inverse **tient** ; confiance durable ajoutée. + +**Pourquoi PAS un gate (#5).** La direction AVANT est déjà gatée (`check_artifacts`) ; l'INVERSE +est empiriquement **propre** et un orphelin réel serait de toute façon **transitivement attrapé** +(tout consommateur à build reproductible lisant un `out/` périmé casserait sur `check_artifacts`). +Ajouter un gate N+1 pour une propriété tenue = machinerie redondante. Consigné comme **sweep +rejouable**, comme ses siblings déterministes — pas un `ci/*.sh`. + +**Portée / anti-churn.** **0 fichier de production édité**, **0 artefact reconstruit**, **0 gate +ajouté** (#5), **0 chiffre saisi à la main** (#6 — `8`/`24`/`33`/`58`/`57` recomputés en direct), +**aucune commande VPS** (#8). Seule édition : ce journal (+ mémoire projet). + +**Vérif.** `./run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** · `git status` propre après commit.