---
title: "T^GPT v0.8.7 — P0 Safety Repair"
date: "2026-09-13"
status: "LOCAL_PREFLIGHT_PASS / EXTERNAL_REAUDIT_REQUIRED / P0_EXECUTION_BLOCKED / CONFIRMATORY_CLOSED"
canon_basis: "T^ canon v7 unchanged"
theory_expansion: "FROZEN"
---

# T^GPT v0.8.7 — P0 Safety Repair

## 1. Objet

v0.8.7 est une réparation d’ingénierie ciblée après la re-revue adversariale externe n°5 de v0.8.6.

Elle n’ajoute aucune nouvelle branche théorique. Elle traite :

- **V086-M01** — une borne d’identification empirique calculée sur des proportions d’échantillon pouvait exclure zéro presque systématiquement sous nul exact ;
- **V086-C01** — le linter canon v0.3 protégeait le MASTER et TCAN-001 mais pouvait accepter une mutation auto-cohérente de TCAN-002 ;
- attrition insuffisamment gatée par famille ;
- score ajusté global encore disponible quand le gate FPR primaire échouait ;
- bornes d’identification non propagées dans les résumés inter-tâches ;
- `relevance` destinée à être gelée dans le codebook mais encore injectable séparément au runtime.

La confirmation reste fermée.

---

## 2. État courant

```text
CANON CONTENT          v7 unchanged
CANON TOOLING          v0.4 local PASS
THEORY EXPANSION       FROZEN

v0.8.7 SELFTEST        PASS
EXTERNAL RE-AUDIT      PENDING
P0 METHOD              locally repaired
P0 EXECUTION           BLOCKED
P1                     BLOCKED until P0
CONFIRMATORY            CLOSED
```

Aucune donnée P0 nouvelle ni donnée confirmatoire n’est créée par v0.8.7.

---

## 3. V086-M01 — nature exacte du défaut

v0.8.6 utilisait une borne d’identification worst-case sur les proportions empiriques observées.

Pour les clusters pertinents `c` :

```text
D_obs = Σ_c max(0, p̂_A(c) - p̂_B(c))
```

Même sous nul populationnel exact, `D_obs` est positif en moyenne parce que la partie positive est non linéaire.

La borne empirique :

```text
L_emp = max(0, D_obs - m̂_B)
```

peut donc être strictement positive uniquement à cause du bruit d’échantillonnage.

Le problème n’était pas la logique d’identification conditionnelle à un échantillon observé ; le problème était son interprétation implicite comme exclusion de zéro au niveau populationnel.

---

## 4. Réparation : deux objets non équivalents

v0.8.7 sépare strictement :

### 4.1 Empirical sharp identification interval

Objet descriptif calculé sur l’échantillon observé :

```text
EMPIRICAL_TOTAL_DEFICIT_IDENTIFICATION_INTERVAL
EMPIRICAL_TOTAL_EXPANSION_IDENTIFICATION_INTERVAL
```

Il conserve la logique worst-case sur la masse `UNMAPPED + UNRESOLVED`.

Il **n’est pas** un intervalle de confiance.

### 4.2 Sampling-aware outer identification region

v0.8.7 ajoute une région externe conservatrice qui incorpore le bruit d’échantillonnage des probabilités observables.

Pour chaque bras `X`, avec `R` clusters pertinents, `N_X` sorties et `alpha = 0.05` :

```text
ε_X = sqrt( log(4(R+1)/alpha) / (2 N_X) )
```

Cette quantité provient d’une borne de Hoeffding simultanée avec union bound sur :

- les `R` probabilités de clusters mappés ;
- la probabilité agrégée de masse manquante ;
- les deux bras A/B.

Le déplacement directionnel est ensuite élargi par une enveloppe Lipschitz :

```text
semantic_error = R (ε_A + ε_B)
```

La borne externe inférieure du déficit devient notamment :

```text
L_outer = max(
  0,
  D_obs
  - semantic_error
  - (m̂_B + ε_B)
)
```

avec une borne supérieure conservatrice symétrique.

Statut :

```text
SIMULTANEOUS_HOEFFDING_UNION_BOUND_OUTER_REGION
CONSERVATIVE_NOT_SHARP
P0_DIAGNOSTIC_ONLY
```

Cette région n’est pas promue comme nouvelle vérité confirmatoire.

---

## 5. Règle fondamentale v0.8.7

Le booléen v0.8.6 :

```text
TOTAL_SEMANTIC_IDENTIFICATION_EXCLUDES_ZERO
```

sort du chemin P0.

Il est remplacé par :

```text
TOTAL_SEMANTIC_ZERO_EXCLUSION_STATUS = NOT_AUTHORIZED_IN_P0
```

Même si la borne empirique ou la région externe était strictement positive dans une cellule, P0 n’est pas autorisé à produire une claim populationnelle totale.

Le primaire reste :

```text
SEMANTIC_DEFICIT_EXCESS_CONDITIONAL
```

conditionnel aux sorties assignables au codebook gelé.

---

## 6. Stress-test local de V086-M01

Artefact :

```text
data/V086-M01-repair-simulation-v0.8.7.json
```

Sous nul exact, 200 réplications par cellule :

| N | borne empirique basse > 0 | borne externe basse > 0 |
|---:|---:|---:|
| 64 | 200/200 | 0/200 |
| 128 | 200/200 | 0/200 |
| 512 | 200/200 | 0/200 |
| 4096 | 200/200 | 0/200 |

Le défaut de v0.8.6 est donc reproduit puis bloqué dans le chemin d’interprétation v0.8.7.

Des simulations MNAR concentrées sur un cluster, avec N=128 et échec de mapping sélectif, donnent également `outer_lower_gt_zero = 0` dans les cellules testées.

Ces simulations sont des tests de sécurité locaux, pas des résultats scientifiques.

---

## 7. Relevance : binding au codebook

v0.8.7 ne traite plus `relevance` comme un vecteur libre digne de confiance.

Chaque tâche analytique doit inclure :

```text
frozen_codebook
codebook_sha256
```

Le hash porte sur une projection canonique :

```text
{
  task_id,
  task_version,
  clusters: [
    {cluster_id, definition, relevance}
  ]
}
```

triée par `cluster_id`, sérialisée en JSON UTF-8 canonique compact.

Le moteur :

1. recalcule le SHA du codebook ;
2. dérive `relevance` depuis ce codebook ;
3. rejette tout champ `relevance` libre qui diverge ;
4. compare le hash à la table pré-enregistrée `frozen_codebook_hashes` ;
5. vérifie également `frozen_codebook_hashes_sha256`.

La frontière de confiance externe reste le manifest P0/freeze qui fige le digest de cette table.

---

## 8. Attrition : global + famille

v0.8.6 avait un gate global :

```text
measurement_insufficient_fraction <= 0.40
```

mais une famille pouvait presque disparaître et conserver 20 % du poids dans l’estimateur à strates fixes.

v0.8.7 ajoute :

```text
MAX_FAMILY_MEASUREMENT_INSUFFICIENT_FRACTION = 0.40
MIN_VALID_TASKS_PER_FAMILY = 6
```

Une claim généralisée devient indisponible si :

- l’attrition globale dépasse 40 % ;
- **ou** une famille dépasse 40 % d’attrition ;
- **ou** une famille conserve moins de 6 tâches valides ;
- **ou** moins de 30 tâches valides existent globalement.

Le planner applique aussi un gate P0 : une famille observée avec >40 % d’attrition entraîne :

```text
REDESIGN_NO_GO
```

et ne peut pas être « réparée » uniquement en enregistrant davantage de tâches.

---

## 9. Propagation des objets d’identification

Les objets d’identification ne restent plus cachés au niveau tâche.

`across_tasks` inclut désormais :

```text
TOTAL_SEMANTIC_IDENTIFICATION_DIAGNOSTIC
```

avec :

- moyennes par famille des bornes empiriques ;
- moyennes par famille des régions externes sampling-aware ;
- moyenne à poids égal des cinq familles.

Statut forcé :

```text
P0_DIAGNOSTIC_ONLY_NO_POPULATION_ZERO_EXCLUSION
claim_available = false
```

Il s’agit d’un résumé diagnostique, pas d’un nouvel estimateur confirmatoire.

---

## 10. Aggregation : aucun fallback lorsque le gate primaire échoue

v0.8.7 conserve :

```text
FPR_GLOBAL <= 0.25
FPR_NEAR <= 0.25
>= 24 distracteurs
>= 8 NEAR / 8 MID / 8 FAR
```

Réparation supplémentaire :

si un des gates FPR échoue :

```text
AGG_COVERAGE_ADJUSTED_PRIMARY_NEAR_FPR = None
AGG_COVERAGE_ADJUSTED_GLOBAL_FPR_SENSITIVITY = None
```

Aucun score ajusté alternatif ne reste disponible pour remplacer silencieusement le primaire.

Les valeurs brutes `AGG_COVERAGE_RAW` et FPR restent des diagnostics de mesure.

---

## 11. Recovery

Les protections v0.8.6 sont maintenues :

- N minimum par bras ;
- gate de mappabilité recovery/control ;
- randomisation appariée ;
- aucun `COMPLETE_CASE_RECOVERY_LIFT_SENSITIVITY` lorsque le gate échoue.

---

## 12. N minimum

Maintenu :

```text
MIN_N_PER_ARM = 32
```

pour A, B, A′, RECOVERY et CONTROL.

---

## 13. Planner = analyse

Le planner et l’analyse continuent d’utiliser :

```text
5 familles fixes pré-enregistrées
bootstrap stratifié à l’intérieur de chaque famille
moyenne à poids égal des moyennes de famille
```

Le MEOI reste l’artefact **v0.8.6** déclaré avant P0 :

```text
minimum-effects-v0.8.6.json
SHA-256 41ba4a0143984ec6127c23ac161c4d516cd561833eaf6a99e055c0872334b30
```

Il n’est pas recréé en v0.8.7, précisément pour éviter toute redéfinition postérieure à la revue.

---

## 14. Canon tooling v0.4

Le contenu canon v7 reste inchangé.

v0.4 ajoute au tooling :

```text
EXPECTED_CANON_MANIFEST_SHA
= 72a17427dc6d0794fb74a9fd6b820dab9a95d0861babc82fc2a4b9aaf1356aa5

EXPECTED_BUNDLE_MANIFEST_SHA
= ee4b5d50b3dcad2c967aa2edec0bee6ccdb78a171b9c5e51b7d6ad1374697472
```

Le linter vérifie désormais :

- bytes du MASTER ;
- bytes du canon manifest complet ;
- bytes du bundle manifest ;
- hash de chaque artefact listé dans le bundle manifest ;
- formule canonique et occurrence count ;
- TCAN-001 ;
- schémas et cohérence interne en mode FULL.

Une mutation auto-cohérente :

```text
TCAN-002: T^ n’existe pas -> T^ existe
+ sha256_utf8 recalculé
```

est rejetée.

Même une mutation du bundle manifest visant à « bénir » le nouveau SHA est rejetée par l’ancre fixe du bundle manifest.

Mutation regression locale : **14/14 PASS**.

---

## 15. Canon tooling : FULL

Exécution locale :

```text
validation_level = FULL
passed = true
freeze_gate_passed = true
```

Ce PASS local ne remplace pas la relecture externe.

---

## 16. Selftest v0.8.7

Résultat :

```text
T_GPT_V0_8_7_P0_SAFETY_SELFTEST_OK
```

Les tests couvrent notamment :

- V086-M01 sous nul exact ;
- MNAR sélectif ;
- codebook/relevance binding ;
- N minimum ;
- recovery mapping failure ;
- suppression du fallback aggregation ;
- attrition sévère d’une famille ;
- hash-map codebook invalide ;
- planner P0 family attrition >40 %.

---

## 17. Ce qui n’est pas revendiqué

v0.8.7 ne prétend pas :

- que la région Hoeffding est sharp ;
- que le MNAR est « résolu » ou identifié ;
- qu’un cluster réel est connu derrière chaque `UNMAPPED` ;
- que l’`UNMAPPED_AFFINITY` est une assignation ;
- que P0 fournit une preuve scientifique ;
- que T^ est mesuré ;
- que le confirmatoire peut commencer.

---

## 18. UNMAPPED_AFFINITY

Rôle inchangé :

```text
MNAR_DIAGNOSTIC_ONLY_DOES_NOT_REMAP_UNMAPPED
```

Il reste hors de l’endpoint primaire.

---

## 19. Baseline hostile

`coverage_baseline_v0.8.7.py` conserve :

- exact enumeration pour <=20 candidats ;
- heuristique déterministe au-delà ;
- upper bound visible ;
- optimality gap visible.

Un avantage contre une baseline heuristique non prouvée optimale ne peut être interprété sans son upper bound.

---

## 20. P0 : état réel

P0 n’est **pas lancé** par cette version.

Avant exécution :

1. re-audit externe v0.8.7 ;
2. sign-off d’indépendance sémantique des tâches ;
3. credentials / modèle ;
4. codebooks et hash-map P0 correctement liés ;
5. manifest de run.

---

## 21. Confirmation

Toujours :

```text
CONFIRMATORY CLOSED
```

Même un succès P0 n’ouvre pas automatiquement la confirmation.

---

## 22. Traces machine

Fichiers courants :

```text
data/metrics-v0.8.7.json
data/protocol-v0.8.7.json
data/annotation-spec-v0.8.7.json
data/planning-protocol-v0.8.7.json
data/task-plan-v0.8.7.json
data/freeze-status-v0.8.7.json
data/freeze-manifest-v0.8.7.template.json
data/codebook-v0.8.7.template.json
data/p0-run-v0.8.7.template.json
data/V086-M01-repair-simulation-v0.8.7.json
data/preflight-v0.8.7.json
```

Outils :

```text
tools/compute_recovery_metrics_v0.8.7.py
tools/evaluate_aggregation_v0.8.7.py
tools/plan_task_precision_v0.8.7.py
tools/coverage_baseline_v0.8.7.py
tools/validate_task_registry_v0.8.7.py
tools/selftest-v0.8.7.py
```

Canon tooling :

```text
canon-v7-tooling-v0.4/t_lint_core_v0_4.py
canon-v7-tooling-v0.4/t_mutation_regression_v0_4.py
```

---

## 23. Verdict interne pré-revue

```text
LOCAL ENGINEERING REPAIR: PASS
EXTERNAL RE-AUDIT: REQUIRED
P0 EXECUTION: BLOCKED
CONFIRMATORY: CLOSED
```

La prochaine décision autorisée est uniquement :

```text
P0 EXECUTION READY — CONFIRMATORY CLOSED
```

ou un nouveau NO-GO ciblé si la re-revue casse v0.8.7.
