[DTP-Worker 20260806_111534] VÉRIF axe neuf « intégrité référentielle des $ref des 26 oracles-schémas » → CLEAN 108/108 (0 pendouillant/externe/orphelin), détecteur teeth-prouvé (double faux-vert jsonschema/maison)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-06 11:22:09 +00:00
parent 3710253c02
commit 27cfe2fe59
+61
View File
@@ -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` = (#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 · **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. 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).