[DTP-Worker 20260806_181623] VÉRIF axe NEUF « conformité JSON STRICTE ECMA-404 / JS JSON.parse : aucun NaN/Infinity non-strict » → CLEAN · 0 édition de prod

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) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-06 18:19:46 +00:00
parent be36d6600f
commit 558225a74d
+14
View File
@@ -1,5 +1,19 @@
# Activity Log · 2026-08-06 · Claude Code DTP Worker # 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=<callback qui lève>)` — 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 ## 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é**. **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é**.