diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index db06737..b1f265c 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -934,3 +934,64 @@ prouver la cohérence, il a mordu sur les 4 fiches/README stales) · **0 chiffre (#6 — tous recomputés par les générateurs) · **0 commande VPS** (#8). `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP**. Fichiers touchés : 1 test (+1 méthode) · 4 artefacts régénérés · 5 surfaces prose · ce journal. + +--- + +## Session `20260806_111534` — VÉRIF · axe NEUF « intégrité référentielle interne des `$ref` des 26 oracles-schémas » → CLEAN 108/108 refs · détecteur teeth-prouvé · 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 (Sprints 1→8 ; prod VPS / builds EAS / +dépôts ONAPI hors périmètre worker · #8). Registre `OPEN_DECISIONS_REGISTER.md` = arbitrages produit +**appartenant à Michel**, non éditables. Objectif anti-churn : un **axe teeth encore jamais balayé**. + +**Axe NEUF (absent de la mémoire).** Les 3 axes schéma déjà fermés portaient sur : la **non-vacuité** +(`schema-oracle-teeth-audit` — required + mots-clés de contrainte), la **fermeture/complétude** +(`schema-oracle-closedness` — `additionalProperties` + énumération des `properties`), et le **câblage** +(`schema-oracle-wiring` — chaque `*.schema.json` enforced par ≥1 test). Question **encore jamais posée** : +**tout `$ref` interne d'un oracle résout-il vers une définition existante ?** Un `$ref` pendouillant +(`#/$defs/Xxx` inexistant) est une **oracle-integrity failure** à double détente : +- côté oracle **`jsonschema`** (optionnel, skippé sous `python -S` / absent du runner Gitea pip-less) : + quand le `$ref` est **atteint** pendant la validation, `jsonschema` **lève `RefResolutionError`** → + le test passe de VERT à **ERROR/ROUGE** — mais seulement là où `jsonschema` est présent ; +- côté **validateur maison zéro-pip** (toujours exécuté) : un validateur qui **ignore** un `$ref` + inconnu **passe silencieusement** → **tout le sous-arbre de contraintes derrière le `$ref` n'est + jamais enforced** = **faux-vert**. (Un seul validateur maison honore réellement `$ref` : + `publiciste/lib/validator.py` ; les autres modules ne valident le schéma complet que via l'oracle + `jsonschema` optionnel — d'où l'enjeu.) + +**Balayage (résolveur JSON-Pointer maison, stdlib pur).** Collecte récursive de tous les `$ref` des +26 `*.schema.json`, résolution de chaque pointeur `#/…` contre le corps du schéma (`$defs` / +`definitions`, dé-échappement `~0`/`~1`), plus contrôle du **type de la cible** (doit être un objet-schéma) +et de l'**inverse** (définitions orphelines jamais référencées = schéma mort, cosmétique) : + +| Métrique | Résultat | +|---|---| +| Schémas portant `$ref` | **13 / 26** | +| Total `$ref` | **108** | +| `$ref` pendouillants (interne non résolu) | **0** | +| `$ref` externes involontaires (non-`#`) | **0** | +| Cibles non-objet-schéma | **0** | +| Définitions orphelines (`$defs`/`definitions` non référencées) | **0** | + +→ **CLEAN 108/108** : chaque `$ref` résout vers un objet-schéma existant, et chaque définition déclarée +est effectivement référencée (aucune contrainte silencieusement contournée, aucun schéma mort). + +**Détecteur teeth-prouvé (harnais /tmp, lecture seule — 0 fichier repo muté).** +1. **Mutation → morsure** : injection de `_MUTANT_DOESNOTEXIST` sur un `$ref` de + `fixtures.schema.json` → le résolveur **signale bien 1 pendouillant** (`#/definitions/role_MUTANT…`). + Preuve que le CLEAN 108/108 n'est pas un détecteur inerte. +2. **Preuve de la double détente** (pourquoi un pendouillant est un vrai faux-vert), au niveau mécanisme : + - `jsonschema` **lève `RefResolutionError`** dès qu'un `$ref` pendouillant atteint est validé + (schéma jouet `{"x":{"$ref":"#/$defs/Missing"}}` vs `{"x":1}`) → test ROUGE ; + - un validateur maison naïf (type/required seuls, `$ref` ignoré) **renvoie `[]`** sur le même doc + → sous-arbre **non enforced** = faux-vert. + (Note : les oracles `jsonschema` valident des objets **reconstruits en mémoire**, pas les `out/*.json` + à plat — cf. `verify-non-defects-reconciliation-traps` ; aucune paire schéma↔`out/`-plat ne valide à 0 + erreur, ce qui est **normal** et non un défaut.) + +**Portée / anti-churn.** **CLEAN → 0 correction de production** (aucun oracle défectueux). **0 gate +ajouté** (#5 — occurrence-zéro, rejouable à la demande comme les autres balayages teeth : +`schema-oracle-teeth-audit`, `test-shadowing-sweep`, `runtime-encoding-integrity-sweep`). **0 chiffre +saisi en dur** · **0 commande VPS** (#8). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**. +Fichiers touchés : ce journal + 1 entrée mémoire (`schema-oracle-ref-integrity`). Le résolveur est +consigné ci-dessus, rejouable tel quel (stdlib pur, sans réseau).