From 52e8e817990e3440dad83f5b2bfbd66508979665 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Thu, 6 Aug 2026 21:21:03 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260806=5F211659]=20V=C3=89RIF?= =?UTF-8?q?=20axe=20NEUF=20=C2=AB=20fid=C3=A9lit=C3=A9=20num=C3=A9rique=20?= =?UTF-8?q?JS=20JSON.parse=20:=20entiers=20>=202^53=20(corruption=20SILENC?= =?UTF-8?q?IEUSE)=20+=20magnitude=20hors=20plage=20double=20=E2=86=92=20In?= =?UTF-8?q?finity=20=C2=BB=20=E2=86=92=20CLEAN=200/114=20=C2=B7=20max=20tr?= =?UTF-8?q?ack=C3=A9=2018.88M=20(~8=20ordres=20sous=202^53)=20=C2=B7=203e?= =?UTF-8?q?=20sommet=20trilogie=20JSON.parse=20apr=C3=A8s=20NaN/Infinity?= =?UTF-8?q?=20=C2=B7=20teeth=208/8=20+=20bout-en-bout=20(inject=202^53+7?= =?UTF-8?q?=20flagu=C3=A9)=20=C2=B7=20rejouable=20=C2=B7=20NON=20gate=20(#?= =?UTF-8?q?5=20occurrence-z=C3=A9ro)=20=C2=B7=200=20=C3=A9dition=20de=20pr?= =?UTF-8?q?od?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 0822bf5..a93d511 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_211659` — VÉRIF · axe NEUF « fidélité NUMÉRIQUE côté JS `JSON.parse` : entiers > 2^53 (corruption SILENCIEUSE) + magnitudes hors plage double (→ `Infinity`) » → CLEAN 0/114 · 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) — le 3e sommet de la trilogie « fidélité `JSON.parse` navigateur ».** Le sweep de ce matin (`20260806_181623`) couvre les sentinelles `NaN`/`Infinity` **non-strictes** : elles lèvent une `SyntaxError` **bruyante** dans le `JSON.parse` de la Console Helios. Restait le sibling **SILENCIEUX**, invisible à toute la chaîne Python : (a) un **entier `abs > Number.MAX_SAFE_INTEGER` (2^53−1 ≈ 9.007e15)** — Python conserve la précision arbitraire et **ne prévient jamais**, mais JS le mappe au double IEEE-754 le plus proche = **valeur silencieusement fausse, sans erreur** ; (b) une **magnitude > `Number.MAX_VALUE` (~1.8e308)** → JS parse en `Infinity`, silencieux. Un id/montant-en-cents/numéro sérialisé en nombre JSON franchissant 2^53 **passe tous les gates** (`validate_json` vert car Python tolère, byte-repro identique) tout en corrompant l'affichage navigateur. Distinct de la FORME scalaire (type int/float) et des sentinelles NaN (valeurs illégales) : ici c'est la **plage sûre du `Number` JS**, jamais éprouvée. + +**Détecteur (stdlib pur, rejouable).** Reparse chaque `.json` avec `json.loads(text, parse_int=hook, parse_float=hook)` : flag si `abs(int) > 2^53−1` ou `math.isinf(float(litéral))`. Les numériques-**chaîne** (`"999…"`, légitimes, non affectés par `JSON.parse`) sont épargnés. + +**Dents prouvées (8/8 + bout-en-bout).** Épargnés : `18880000`, `2^53−1` exact (MAX_SAFE), `18296296385` (numéro type-téléphone), `"99999999999999999999"` (chaîne), `0.085` (flottant). MORDENT : `2^53`, `2^53+1`, `1e400`→`Infinity`. Bout-en-bout sur `…/faisabilite/bancable/fixtures/brief_bancable.json` : baseline = 0 non-sûr ; injection `_probe = 2^53+7` → **correctement flaguée** `int>2^53` (9007199254740999). + +**Résultat.** Sur **114 fichiers JSON** suivis : **0 nombre non-sûr**. Le plus grand entier tracké = **18 880 000** (`brief_bancable.json`) — ~8 ordres de grandeur sous la limite. **CLEAN** — tous les artefacts sont consommables sans perte de précision par le `Number` JS. + +**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 (`js-number-fidelity-sweep`). Sweep **rejouable** — **NON promu en gate** (#5, occurrence-zéro ; note résiduelle : `validate_json` reste int-safe-tolérant par design Python, à durcir seulement si un générateur commence à émettre de grands ids/montants numériques). + ## 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é**.