diff --git a/05_activity_log/2026-08-05.md b/05_activity_log/2026-08-05.md index 6a37138..08bc8bb 100644 --- a/05_activity_log/2026-08-05.md +++ b/05_activity_log/2026-08-05.md @@ -1,5 +1,49 @@ # Activity Log · 2026-08-05 · Claude Code DTP Worker +## Session 151312 · SWEEP neuf : déterminisme sous hash-seed aléatoire des gates de reproductibilité → **CLEAN** + +**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre +propre, roadmap `ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée in-repo (restes +S3/S5/S6 = refactor BIM / builds EAS / dépôts ONAPI / déploiement prod = **hors périmètre worker**, +#8). Sept sweeps déjà consignés ce jour (docstring-vs-code, forward-compat warnings, roadmap↔repo, +ré-attestation canal…). Choix d'un axe d'intégrité **absent de la mémoire et orthogonal** à tous +les précédents. + +**Constat — la fragilité ciblée.** Les gates `check_artifacts` et `check_regression` prouvent que +chaque `out/*.json` versionné se régénère **byte-identique** depuis son générateur. MAIS ils ne +tournent **qu'une fois**, sous **le** `PYTHONHASHSEED` que le runner Gitea leur donne — et depuis +Python 3.3 ce seed est **randomisé par défaut**. Si **un seul** générateur sérialise un `set`/`dict` +en **ordre d'itération** (au lieu de trier), sa sortie varierait d'un seed à l'autre : le gate +serait alors **VERT aujourd'hui, ROUGE au hasard demain** sur le runner — un faux-vert +*forward-looking* qu'aucun rejeu à seed fixe n'attrape. C'est le pendant « déterminisme » du sweep +`-W error` (forward-compat interpréteur) : même famille, cause différente (ordre de hash vs API +dépréciée). + +**Méthode (lecture seule · 0 édition de prod).** Rejeu de **tous** les générateurs `build` des +**21** répertoires `out/` vers un `mktemp -d`, sous **5 seeds** (`1 7 42 1000` + `random`), chaque +fichier produit `diff`-é contre son jumeau commité. Puis `regression_run.json` (artefact d'**exécution**, +produit par `run` — hors périmètre `check_artifacts` mais **dans** celui de `check_regression`) rejoué +séparément sous `1 7 42 999 random random`. Harnais auto-vérifié : **57 fichiers effectivement +comparés**, **1 seul skip** = `qa/regression/regression_run.json` (artefact `run`, exactement +l'exclusion documentée de `check_artifacts`) — donc zéro faux-vert par skip silencieux. + +**Résultat — CLEAN.** **57 artefacts `build` byte-identiques sous les 5 seeds** + `regression_run.json` +**byte-identique sous 6 rejeux dont 2 `random`**. **Aucun** générateur ne dépend de l'ordre d'itération +d'un `set`/`dict` pour sa sérialisation → les deux gates de reproductibilité sont **robustes au +hash-seed**, ils ne peuvent pas flaper ROUGE sur le runner à cause de la randomisation. Le corpus +est prêt à un runner à seed non contrôlé sans régression aléatoire. + +**Portée / anti-churn.** **0 fichier de production édité** (`git status --short` vide avant/après le +sweep), **0 artefact reconstruit** (les rebuilds vont en `/tmp`, jamais dans `out/` → pas de rebuild +`quality_report`, cf. [[audit4big-rebuild-after-doc-edits]]), **0 gate ajouté** (#5 — c'est une +**propriété re-jouable** via la commande, pas une *classe de dérive* : attester ≠ multiplier les +gates, cf. le sweep forward-compat), **0 chiffre saisi à la main** (#6 — 21/57 dérivés de +`find … -name out` et du décompte de comparaisons), **aucune commande VPS** (#8 — 100 % local & +lecture seule). Éditions : ce journal + une ligne dans la table *veille d'intégrité* du daily_report ++ une mémoire neuve. `./run_ci.sh` après → **33 PASS · 0 FAIL · 0 SKIP**. + +--- + ## Session 114227 · AUDIT read-only roadmap↔repo (cross-refs numériques + liens) → **CLEAN** · clôture d'un **faux-positif « 7 dashboards vs 6 »** **Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, diff --git a/05_deliverables_mvp/daily_reports/2026-08-05.md b/05_deliverables_mvp/daily_reports/2026-08-05.md index 9938071..ed900c0 100644 --- a/05_deliverables_mvp/daily_reports/2026-08-05.md +++ b/05_deliverables_mvp/daily_reports/2026-08-05.md @@ -122,6 +122,7 @@ tables ci-dessus **recomputent à l'identique ce jour** (recompute `python3` ind |---|---|---|---| | Docstring-vs-code | `48b19b9` (`134254`) | 26 modules (docstrings ↔ comportement réel du code) | **CLEAN** | | Forward-compat warnings | `f311a1b` (`141301`) | 25 suites de `gate.needs` rejouées sous `-W error` (Deprecation/Syntax/Pending/Resource) sous Python 3.10.12 | **CLEAN 25/25 · 624 tests · 0 warning latent** | +| Déterminisme hash-seed | `151312` | Tous les générateurs `build` (57 artefacts) rejoués sous 5 `PYTHONHASHSEED` (`1/7/42/1000/random`) + `regression_run.json` sous 6 rejeux → `diff` vs commité | **CLEAN · 57 byte-identiques · 0 dépendance à l'ordre de hash** → gates `check_artifacts`/`check_regression` robustes au seed randomisé du runner | ### Ré-attestation du point courant (recompute indépendant ce jour, HEAD `f311a1b`)