[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:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user