From a39c05aeda915399973dac58d905c5258b23b713 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Wed, 5 Aug 2026 15:19:24 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260805=5F151312]=20SWEEP=20neuf?= =?UTF-8?q?=20d=C3=A9terminisme=20hash-seed=20:=20les=2021=20g=C3=A9n?= =?UTF-8?q?=C3=A9rateurs=20`build`=20(57=20artefacts)=20rejou=C3=A9s=20sou?= =?UTF-8?q?s=205=20PYTHONHASHSEED=20(1/7/42/1000/random)=20+=20regression?= =?UTF-8?q?=5Frun.json=20sous=206=20rejeux=20=E2=86=92=20diff=20vs=20commi?= =?UTF-8?q?t=C3=A9=20=3D=20CLEAN=2057=20byte-identiques,=200=20d=C3=A9pend?= =?UTF-8?q?ance=20=C3=A0=20l'ordre=20d'it=C3=A9ration=20set/dict.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Classe absente de la mémoire, orthogonale aux axes teeth ET au sweep forward-compat warnings : même famille faux-vert FORWARD, cause différente (ordre de hash vs API dépréciée). check_artifacts/check_regression prouvent le rebuild byte-identique MAIS ne tournent QU'UNE fois, sous LE seed que le runner Gitea donne (randomisé par défaut depuis Python 3.3). Un seul générateur sérialisant un set/dict en ordre d'itération → gate VERT aujourd'hui, ROUGE au hasard demain sur le runner. Sweep prouve : aucun ne le fait → les deux gates de reproductibilité sont robustes au hash-seed randomisé. Harnais auto-vérifié (57 comparés · 1 skip = regression_run.json sous la passe build-only = l'exclusion documentée de check_artifacts, pas un skip silencieux). 0 fichier de prod édité (rebuilds → /tmp), 0 artefact reconstruit, 0 gate ajouté (#5 · propriété re-jouable via commande, pas classe de dérive), 0 chiffre saisi (#6 · 21/57 dérivés de find+décompte), 0 VPS (#8 · 100% local lecture seule). run_ci 33 PASS. Éditions : activity_log + daily_report (table veille) + mémoire neuve. Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-05.md | 44 +++++++++++++++++++ .../daily_reports/2026-08-05.md | 1 + 2 files changed, 45 insertions(+) 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`)