From 2ded65bbb42fc79967228a8387ae83c9ba154f34 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Thu, 6 Aug 2026 16:52:27 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260806=5F164612]=20V=C3=89RIF?= =?UTF-8?q?=20axe=20NEUF=20=C2=AB=20int=C3=A9grit=C3=A9=20de=20la=20FORME?= =?UTF-8?q?=20scalaire=20JSON=20(type=20int-vs-float-vs-str,=20pas=20la=20?= =?UTF-8?q?valeur)=20=C2=BB=20des=2057=20out/*.json=20=E2=86=92=20CLEAN=20?= =?UTF-8?q?=C2=B7=200=20=C3=A9dition=20de=20prod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Axe NEUF absent mémoire : tous les axes numériques testent la VALEUR (accord inter/intra, re-dérivation, arithmétique) ou la forme-date ; aucun ne teste la FORME scalaire JSON. Un compte '3.0'/'"3"' au lieu de 3 se lit pareil mais casse type:integer / == strict / colonne typée = aveugle au byte-repro ET aux oracles (tous type:number accepte int+float, un sequence_id float passe). 3 sous-checks teeth-prouvés (/tmp stdlib) : (A) cohérence type intra-fichier par chemin structurel, (B) clés-compte nb_*/…_total/passed = int obligatoire, (C) 0 NaN/Infinity. Dents : un sequence_id int-parmi-floats MORD, nb=5.0/"44" MORD, comptes réels épargnés. Résultat CLEAN : B=0 C=0 ; A flague seulement run_sheet valeur (colonne clé-valeur hétérogène by-design) ; divergences inter-fichiers = collisions de nom per-module. 2 formes délibérées NON-défauts (sequence_id float = cast wslib/frappe.py:162 fidélité Frappe Float ; is_submittable 0/1 int = convention DocType Frappe). 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 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index ef76458..59e51ad 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1,5 +1,25 @@ # Activity Log · 2026-08-06 · Claude Code DTP Worker +## Session `20260806_164612` — VÉRIF · axe NEUF « intégrité de la FORME scalaire JSON (type int-vs-float-vs-str), pas la valeur » des 57 out/*.json → 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 6+ derniers commits sont des sweeps vérification-only à rendement décroissant. Objectif : un **axe objectif encore jamais balayé**. + +**Axe NEUF (absent de la mémoire).** Tous les axes numériques existants portent sur la **valeur** d'un nombre (accord inter/intra-artefact, re-dérivation, arithmétique dérivée) ou sur la **forme-date**. Aucun ne vérifie la **FORME scalaire JSON** elle-même : un compte sérialisé `3.0` (float) ou `"3"` (string) au lieu de `3` (int) **se lit à l'identique** mais casse `type:integer` / une comparaison stricte `== 3` / une colonne DB typée. C'est **aveugle au byte-repro** (build==committed rejoue le type tel quel) et **aveugle aux oracles-schémas** (tous déclarent `type:"number"`, qui accepte int ET float → un `sequence_id` float passe au vert). Sœur-FORME de `cross-artifact-numeric-agreement` (qui, lui, teste la valeur) et de l'axe forme-date. + +**Détecteur — 3 sous-checks, teeth-prouvés** (`/tmp`, stdlib pur, hors réseau, rejouable) : +- **(A) cohérence de type intra-fichier par chemin structurel** — un chemin répété (ex. `[].sequence_id`) dont les occurrences divergent de type scalaire = flag. Le regroupement par **chemin structurel complet** (pas le nom-feuille) évite les faux-positifs de collision de nom inter-schéma. +- **(B) clés à sémantique-compte** (`nb_*` / `*_total` / `*_count` / `passed`/`failed`/`ran`…) **doivent** être des int JSON, jamais float ni string-numérique. +- **(C)** aucun littéral `NaN`/`Infinity` (JSON strict invalide). +- **Dents** : basculer **un seul** `sequence_id` int-parmi-des-floats → **MORD** (`{int,float}`) ; `nb_portails=5.0` et `roles_total="44"` → **MORD** ; les comptes réels de `regression_run.json` **épargnés** (0 faux-positif). Détecteurs non-inertes. + +**Résultat → CLEAN.** B = 0, C = 0. A ne flague qu'**1** chemin = `run_sheet.json … evidence.[].valeur` (str/int/bool) = la **colonne clé-valeur hétérogène par design** (même piège `valeur` générique déjà en mémoire), **pas un bug** ; les 56 autres fichiers sont parfaitement cohérents en type par chemin. Les divergences de type **inter-FICHIERS** (`role`/`passed`/`verdict`/`is_submittable`/`a_confirmer`/`roadmap_line`) = **collisions de nom de clé per-module-local**, le piège générique documenté (chaque schéma distinct). + +**Deux formes float/int DÉLIBÉRÉES — NON-défauts, à NE PAS « corriger » :** (1) `workspace.json sequence_id` = `float(1.0..5.0)` via un cast explicite `float(...)` dans `wslib/frappe.py:162` — **fidélité au champ Float `sequence_id` du Workspace Frappe** ; (2) `is_submittable` = **int 0/1** dans les `doctype_*.json` — convention booléen 0/1 des DocType Frappe. Les deux sont by-design + épinglés byte-repro. Investigués avant conclusion (#5/#6) — pas de correction. + +**Périmètre / décision.** VÉRIF pure : **0 fichier de production modifié** · **0 chiffre inventé** (#6) · **0 commande VPS** (#8) · **aucun gate ajouté** (#5 — axe CLEAN + formes Frappe isolées, comme les précédents CLEAN). `./run_ci.sh` **33 PASS · 0 FAIL · 0 SKIP** inchangé. Détecteur rejouable. Mémoire : `json-scalar-type-integrity`. + +--- + ## Session `20260806_161610` — VÉRIF · axe NEUF « intégrité arithmétique des champs DÉRIVÉS des artefacts committés » (moyennes/taux/sommes-pondérées/écarts/verdicts-seuil + nombres dans la prose) → CLEAN · 0 édition de production **Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, roadmap