From 558225a74d69319a353c0f0f512ffd02d83c6940 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Thu, 6 Aug 2026 18:19:46 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260806=5F181623]=20V=C3=89RIF?= =?UTF-8?q?=20axe=20NEUF=20=C2=AB=20conformit=C3=A9=20JSON=20STRICTE=20ECM?= =?UTF-8?q?A-404=20/=20JS=20JSON.parse=20:=20aucun=20NaN/Infinity=20non-st?= =?UTF-8?q?rict=20=C2=BB=20=E2=86=92=20CLEAN=20=C2=B7=200=20=C3=A9dition?= =?UTF-8?q?=20de=20prod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python json.load (validate_json.sh) ACCEPTE NaN/Infinity/-Infinity par défaut ; le JS JSON.parse de la Console Helios lève SyntaxError dessus → un artefact NaN (dérivé div-par-zéro sérialisé allow_nan=True) passerait tous les gates + byte-repro tout en cassant le rendu navigateur = faux-vert invisible à la chaîne Python. Détecteur stdlib json.loads(parse_constant=raise), teeth 5/5 (NaN/Infinity/-Infinity MORDENT, float+chaîne 'NaN' épargnés) + e2e mutant sur fichier réel flagué. CLEAN 114/114 out/*.json. run_ci 33 PASS 0 FAIL 0 SKIP inchangé, rejouable, pas de gate (#5). Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-06.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index 2ba778b..b1b3519 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1,5 +1,19 @@ # Activity Log · 2026-08-06 · Claude Code DTP Worker +## Session `20260806_181623` — VÉRIF · axe NEUF « conformité JSON STRICTE (ECMA-404 / JS `JSON.parse`) : aucun `NaN`/`Infinity` non-strict » → CLEAN · 0 édition de production + +**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 (prod VPS / builds EAS / dépôts ONAPI hors périmètre worker · #8), `OPEN_DECISIONS_REGISTER.md` = arbitrages produit de Michel (non éditables). Objectif : un **axe teeth encore jamais balayé**. + +**Axe NEUF (absent de la mémoire).** Tous les balayages JSON précédents valident le parse via **Python** — `validate_json.sh` fait `json.load(...)`, et Python **ACCEPTE par défaut** les constantes non-standard `NaN` / `Infinity` / `-Infinity` (elles retournent `float('nan')`/`inf`). Or ces tokens sont **illégaux en ECMA-404** : le `JSON.parse` de la Console Helios (frontend JS qui consomme les `out/*.json`) **lève une `SyntaxError`** dessus. Donc un artefact contenant un `NaN` (ex. champ dérivé div-par-zéro sérialisé avec `allow_nan=True`, défaut de `json.dumps`) **passe tous les gates** (`validate_json` vert, byte-repro identique) tout en **cassant le rendu navigateur** — faux-vert direct, invisible à toute la chaîne Python. Distinct de `artifact-internal-set-semantics` (valeurs) et de la « FORME scalaire int/float/str » (qui checke le TYPE, pas les valeurs-sentinelles non-strictes) : ici c'est la **conformité au sous-ensemble JS-parseable**, jamais éprouvée. + +**Détecteur (stdlib pur, rejouable).** Re-parse chaque `.json` suivi avec `json.loads(text, parse_constant=)` — le callback `parse_constant` n'est invoqué QUE pour `NaN`/`Infinity`/`-Infinity` en position de **valeur** (pas les chaînes `"NaN"`, légales) → réplique exacte de la sémantique de rejet de `JSON.parse`. + +**Dents prouvées (synthétique 5/5 + bout-en-bout).** `{"x":1.5}` **épargné** ; `{"x":NaN}`, `{"x":Infinity}`, `{"x":-Infinity}` **MORDENT** ; `{"x":"NaN"}` (chaîne) **épargné** — 5/5 discriminés. Bout-en-bout sur un fichier réel (`…/commissions/bareme.schema.json`) : baseline = strict ; injection `{"_probe":NaN}` → **correctement flaguée** non-strict. + +**Résultat.** Sur **114 fichiers JSON** suivis : **0 constante numérique non-stricte**. **CLEAN** — tous les artefacts sont consommables tels quels par `JSON.parse` côté navigateur. Autres divergences Python↔JS déjà couvertes ailleurs : BOM (`runtime-encoding-integrity-sweep` = 0 BOM, or `JSON.parse` rejette le BOM), clés dupliquées (`manifest-count-field…`/dup-keys = 0, or JS garde la dernière). Le delta neuf ici = les **sentinelles NaN/Infinity**. + +**Conformité.** 0 édition de production (sweep read-only). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**. Fichiers : ce journal + 1 entrée mémoire. Sweep **rejouable** (stdlib pur) — **NON promu en gate** (#5, occurrence-zéro ; note résiduelle : `validate_json` reste tolérant NaN par design Python, à durcir seulement si un générateur commence à émettre des dérivés flottants risqués). + ## Session `20260806_174619` — VÉRIF · axe NEUF « intégrité des ancres-fragment Markdown `](#slug)` : résolvent-elles vers un titre réel ? » → CLEAN · 0 édition de production **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 (prod VPS / builds EAS / dépôts ONAPI hors périmètre worker · #8), `OPEN_DECISIONS_REGISTER.md` = arbitrages produit de Michel (non éditables). Les 7+ derniers commits sont des sweeps vérification-only à rendement décroissant ; `daily_reports` n'a pas de vrai snapshot stakeholder à ajouter. Objectif : un **axe teeth encore jamais balayé**.