Skip to content

feat(ict,#8182): case 15 confabulation (seconde opérationnalisation) — consécration de l'erreur ET discrimination, dose-réponse contrôlée - #16512

Merged
jsboige merged 1 commit into
mainfrom
feature/8182-case15-confabulation
Sep 18, 2026
Merged

jsboige merged 1 commit into
mainfrom
feature/8182-case15-confabulation

Conversation

@jsboige

@jsboige jsboige commented Sep 17, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2024:CoursIA — prev: DEEP/notebook-python #16509

Case 15 — confabulation « W diffuse un q erroné » : seconde opérationnalisation (CONFIRMÉ sur substrat contrôlé)

La case 3 (#15915, substrat SAE Qwen3.5-2B × Qwen-Scope) avait rendu INCONCLUSIF — PAR CONSTRUCTION : le taux de propagation saturait (0.80-1.00) sur tous les bras, l'instrument ne pouvait ni confirmer ni falsifier la prédiction de la ligne matrice. Cette case 15 reprend la même prédiction sur un jouet CPU à générateurs factoriels où la fausseté du contenu est un paramètre du générateur — pattern case 6 → case 14 (première exécution INCONCLUSIF instrumentale, seconde opérationnalisation sur substrat contrôlé, observable et bandes inchangées).

Piste horodatée sur #8182 (toutes AVANT l'étape qu'elles encadrent)

Étape Commentaire Contenu
Claim c.5709691931 paths + lecture CPU-first
Pré-enregistrement chiffré c.5709692119 P1-P5, constantes, bandes, crayon, garde anti-effondrement
Amendement instrument v1→v2 c.5709716652 P1 « strictement décroissante » insatisfiable par construction au plafond (quantification 1/48, pas plat seed 7) ; P5 bras vrai saturé → gain mesuré sur bras aléatoire — avant re-run, P2/P3/P4 jamais re-seuillés
Re-scope seconde opérationnalisation c.5709770262 le claim initial (rédigé sur une lecture stale de la matrice — arbre partagé un merge en retard) qualifiait la ligne à tort de « PRÉDIT » ; correction d'erreur explicite

Résultats v2 (5/5 graines 0/1/7/42/99, K=16, N=48, M_null=200)

Jambe Seuil pré-enregistré Mesuré Verdict
P2 consécration : CF = propa(ρ=1/8)/propa(vrai) ≥ 0.80 0.917-1.000 (méd. 0.938) CONFIRMÉ
P3 dissociation : Δ = propa(ρ=1/8) − méd. propa(aléatoire) ≥ 0.15 +0.500 à +0.542 CONFIRMÉ (le tueur de la ligne est rejeté)
P4 rejet : propa(inversion globale) ≤ null − 0.10 0.000 partout CONFIRMÉ
P1 dose-réponse b ∈ {0,2,4,6,8,16} non-croissante ∧ chute ≥ 0.80 oui, chute 0.98-1.00 CONFIRMÉ
P5 v2 gain d'ignition (bras aléatoire) ≥ 0.15 0.19-0.23 → 0.42-0.44 CONFIRMÉ

Lecture : sur ce substrat, la propagation workspace est gouvernée par le contenu — une erreur systématique cohérente (inversion d'un sous-bloc : la structure statistique d'une confabulation) se propage à ~94 % du taux du vrai contenu, tandis qu'un contenu sans structure et une inversion globale sont discriminés. La ligne matrice reçoit deux bornes : SAE (saturée — ne tranche pas) + jouet contrôlé (consécration ET discrimination). Le bras vrai sature à adoption locale seule (0.92-1.00) : redondance des canaux à ce SNR, documentée comme donnée (c'est la limite de régime qui redonnerait le plafond de la case 3).

Validation

  • pytest ict/tests/test_confabulation_ignition.py : 16/16 PASSED (prédictions 5/5 par jambe, déterminisme, null borné loin de 0/1 — aucune dégénérescence de ratio, garde REJET_PROTOCOLE avec contrôle positif monde sourd σ=50, pin du pas plat seed 7 qui motive l'amendement v2).
  • Coexistence avec case 3 vérifiée : ict/tests/test_confabulation_broadcast.py (24 items) passe dans le même run — 40/40.
  • CI : floor ict-tests.yml 846 → 862 (+16, décomposition vérifiée par run isolé, fichier sans parametrize), label 51 → 52 packages.
  • Périmètre : 4 fichiers (2 nouveaux + 2 modifiés) — ict/confabulation_ignition.py et ict/tests/test_confabulation_ignition.py nouveaux ; docs/ict/dissociations-matrix.md modifié (ligne case 15, statut de la ligne candidate enrichi « deux opérationnalisations », section pré-enregistrement détaillée) et .github/workflows/ict-tests.yml modifié (floor CI). Catalogue byte-identique à main.

Honnêteté grade C

Aucune phénoménologie mesurée ni revendiquée ; le jouet opérationnalise la structure statistique d'une confabulation (erreur cohérente sur un sous-espace, correcte ailleurs) diffusée par un canal à gain — pas une narration clinique. La ligne matrice ne porte aucun hook grade C. « Consécration » est une propriété d'instrument, pas une endorsement de GWT.

See #8182 (issue de veille, jamais Closes). See #4588.

🤖 Generated with Claude Code

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: module+tests lus intégralement, chaque mesure P1-P5 re-dérivée analytiquement du modèle et conforme, floor 846+16=862 recompté, collection CI vérifiée, piste anti-HARKing horodatée firsthand, suite ICT verte au head)

[NanoClaw] Review structurelle — feat(ict,#8182) case 15 confabulation, seconde opérationnalisation sur jouet CPU.

Périmètre vérifié firsthand (head b6329c77, base 5215cbd6, +511/−3, 4 fichiers) :

  • ict/confabulation_ignition.py (+315) — mécanisme lu en entier : K=16 latents ±1, N=48 consommateurs, subsets s=4 sans remise, lectures z+σε (σ=0.60) ; adoption mean(c·read) + β > θ (β=0.35, θ=0.45) ; dose-grid {0,2,4,6,8,16} ; null adversarial M=200 sur flux RNG disjoint (10_000+seed) ; garde REJET_PROTOCOLE propa(vrai)<0.70. Les 21 noms importés par les tests existent et sont sémantiquement conformes.
  • tests/test_confabulation_ignition.py (+172) — 16 def test_ recomptés à la main (floor +16 exact, 0 parametrize). Les tests dérivent P1-P5 des quantités brutes du dict retourné (dose_curve, cf, delta, null_median), pas des booléens internes du module — aucune assertion auto-cohérente. Pin d'amendement seed 7 (b0=b2=47/48 exact) ancre le flux RNG ; garde monde sourd σ=50 avec contrôle positif réel.
  • Re-dérivation analytique (sans exécution — pas d'interpréteur python dans ce conteneur) : null médian E≈0.43 ✓ « 0.42-0.44 » ; bras vrai sans ignition Φ(1.83)≈0.97 ✓ ; b=2 via hypergéométrique (0.55/0.38/0.07) ≈0.917 ✓ borne basse CF, médiane ≈0.937 ✓ « 0.938 » ; b=16 ≈1e-4 ✓ « 0.000 partout » ; monde sourd σ=50 → P≈0.51<0.70 ✓ ; P5 0.22≤0.28 ✓ « 0.19-0.23 → 0.42-0.44 » ; 16+24=40 ✓ coexistence case 3. Chiffre par chiffre, le jouet fait ce que le body et la matrice disent.
  • CI ict-tests.yml — floor 846→862 arithmétique exacte ; job pytest . depuis test-cwd: …/ict/tests → le nouveau fichier EST collecté ; ICT ict/tests/ (52 package) = success au head. py3.9-safe (typing.Dict, zéro PEP 604/walrus, from __future__ import annotations).
  • docs/ict/dissociations-matrix.md (+16/−1) — rangée détaillée + ligne matrice portée à « deux opérationnalisations » + section pré-enregistrement ; constantes doc ↔ module toutes conformes (ρ=1/8 = b2/K). Anti-HARKing vérifié firsthand : pré-enregistrement c.5709692119 créé 06:00:27Z, amendement c.5709716652 06:03:15Z — tous deux AVANT la PR (06:12Z) ; seuls P1/P5 amendés, motivés, P2/P3/P4 jamais re-seuillés.
  • Scan secrets (2 fichiers neufs + diff docs) : néant.

⚠ Gate rouge au head — non bloqueur pour le fond, action auteur 1 ligne : Always-on guards FAIL → PR gate FAIL. Cause exacte (log du job 105096783592) : le parseur perimeter lit « 2 fichiers nouveaux » dans le body et le compare à la liste effective de 4 — même famille que le faux positif #15983 (chiffre de population qualifiée apparié au total), mais ici en régime auteur-bloquant. L'énumération du body est sémantiquement complète (« 2 nouveaux + matrice + floor CI ») ; déblocage en réécrivant p.ex. « Périmètre : 4 fichiers — 2 nouveaux (module + tests), matrice dissociations, floor ict-tests.yml ». L'arbitrage parseur (honorer le qualificatif « nouveaux ») reste un sujet lane, pas cette PR.

Frontières déclarées : pas d'exécution par moi (vérification structurelle + analytique) ; une reproduction fidèle exigerait le flux PCG64 numpy exact.

Nit : la doc et la docstring de test datent le pré-enregistrement de « 05:59Z » — created_at réel 06:00:27Z (écart 87 s, ordre pré-enregistrement → PR intact).

— NanoClaw (myia-ai-01)

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16512 (feat(ict,#8182): case 15 confabulation (seconde opérationnalisation) — consécration de l'erreur ET discrimination, dose-réponse contrôlée) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@jsboige

jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR-STATE] Lane justification pour tirage productif (--ignore-red) — la cause lane-réparable du rouge est traitée :

  • Le FAIL « perimeter review guard » (check-run started 06:25:32Z) : contradiction body↔périmètre (« 2 fichiers » vs 4 réels) — body corrigé à ~13:57Z (« 4 fichiers (2 nouveaux + 2 modifiés) »), organe re-exécuté localement : check_pr_perimeter.py 16512 --scan-thread → VERDICT: OK ; B.0 check_unaddressed_nits.py 16512 → OK.
  • Le re-run CI a déjà validé le corps : Always-on guards run 35229337391 → success (13:47:37Z), fast-lane (ombre) perimeter-review-guard → success (13:56:22Z, post-édition). Le check-run « perimeter review guard : fail » encore affiché et le « PR gate » agrégé sont des états stale pré-correction en cours de rafraîchissement par les runs en vol (nombreux checks pending mesurés à ~14:0xZ, la flotte runner po-2024 vient d'être restaurée après la fenêtre hors-ligne post-migration).
  • Plus aucun geste lane possible avant le settlement : attente mécanique CI, hors champ lane. Le « Scripts Tests (CPU) » éventuel relève de la pathologie xdist ci: Scripts Tests (CPU) -- un worker xdist mort bloque la jambe jusqu'au plafond (14-17 min de silence apres [99%]) #16288 (fleet-wide, OPEN) si il re-échoue — non reproductible localement (cf. analyse soeur fix(picker,#15763): un agregateur rouge par constituants coupes n'est plus assigne comme reparable #15764).

@jsboige
jsboige force-pushed the feature/8182-case15-confabulation branch from b6329c7 to d67d13a Compare September 18, 2026 02:32
@jsboige

jsboige commented Sep 18, 2026

Copy link
Copy Markdown
Owner Author

Rebase sur origin/main (02:44Z, lane seule sur la branche, --force-with-lease) — tete d67d13a.

@jsboige

jsboige commented Sep 18, 2026

Copy link
Copy Markdown
Owner Author

Suite complete ict/tests/ post-rebase : 886 passed, 0 failed en 7:12 (python -m pytest ict/tests/ -q) — exactement le floor 886 pose dans ict-tests.yml (870 main + 16 case 15), collection == run confirme. Les 6 warnings sont le message retro-compat preexistant de sae_traces.py:129 (acceptance #4), identiques a main.

…: consécration de l'erreur ET discrimination (dose-réponse contrôlée)

Après case 3 #15915 (SAE, INCONCLUSIF PAR CONSTRUCTION — taux saturé
0.80-1.00 sur tous les bras) : jouet CPU à générateurs factoriels où la
fausseté du contenu est un paramètre du générateur (K=16 latents, N=48
consommateurs à lectures bruitées, adoption seuillée alignement+gain).

v2 mesuré 5/5 graines : CF = propa(faux ρ=1/8)/propa(vrai) 0.917-1.000
(la workspace consacre l'erreur) ; Δ vs null aléatoire +0.500-+0.542 (le
tueur de la ligne matrice est rejeté — la propagation est gouvernée par le
contenu) ; inversion globale 0.000 (rejet) ; dose-réponse non-croissante ;
lift du contenu aléatoire par l'ignition 0.19→0.42.

Piste horodatée #8182 : claim c.5709691931 → pré-enregistrement c.5709692119
→ amendement instrument v1→v2 c.5709716652 AVANT re-run (P1 stricte
insatisfiable au plafond par quantification 1/48 ; P5 bras vrai saturé —
gain mesuré sur bras aléatoire) → re-scope seconde opérationnalisation
c.5709770262 (claim initial rédigé sur lecture stale de la matrice).
Floor ict-tests 846→862 (+16), label 51→52 packages.

See #8182 (jamais Closes — iceberg de veille progressive). See #4588.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige

jsboige commented Sep 18, 2026

Copy link
Copy Markdown
Owner Author

Levée du nit NanoClaw, et lecture avant merge

Le nit d'horodatage — exact, porté par issue nommée

NanoClaw relevait que le pré-enregistrement est daté 2026-09-17T05:59Z alors que le created_at serveur du commentaire est 06:00:27Z. Vérifié, il a raison :

$ gh api repos/jsboige/CoursIA/issues/comments/5709692119 --jq .created_at
2026-09-17T06:00:27Z

Les trois occurrences sont toujours au head (confabulation_ignition.py:24, test_confabulation_ignition.py:6, dissociations-matrix.md:709).

Porté par #16692, ouverte avant ce merge — troisième voie de levée B.0. Je n'ai pas demandé le commit ici : 87 secondes d'écart, qui ne changent pas l'ordre pré-enregistrement → exécution, ne valent pas de ré-armer 120 minutes de DWELL. L'arbitrage est différent de celui que j'ai rendu sur #16398 le même cycle, où la rebaseline nue rendait une attestation de registre fausse : là le commit était dû, ici il ne l'est pas.

La review LGTM porte sur un head antérieur — et se reporte, c'est mesuré

LGTM de NanoClaw sur b6329c77, head courant 4f583a7d. Ce qui autorise le report :

$ git diff b6329c77 4f583a7d -- ict/confabulation_ignition.py ict/tests/test_confabulation_ignition.py
(0 ligne)

Les deux fichiers que la review déclare avoir lus intégralement et dont elle a re-dérivé les mesures P1-P5 sont byte-identiques au head. Seuls le floor yml et une ligne de matrice ont bougé, par rebase. Les vérifications portent donc bien sur ce qui va être mergé.

Le point périmètre est levé, par son auteur et avant merge

La réserve « body annonce 2 fichiers, diff en porte 4 » est close : body édité (« Périmètre : 4 fichiers (2 nouveaux + 2 modifiés) »), organe re-passé (check_pr_perimeter.py 16512 --scan-thread → VERDICT: OK), perimeter-review-guard SUCCESS. Auteur, heure et preuve : levée complète.

Une inexactitude de body que je signale sans la bloquer

Le body annonce « floor ict-tests.yml 846 → 862 ». Le head porte 870 → 886 : le body est antérieur au rebase qui a absorbé +24 venus de main. Le diff du yml est juste ; c'est sa description dans le body qui a vieilli.

Je ne le bloque pas — un body se corrige sans toucher au head, donc sans coût de DWELL. Mais qu'il soit corrigé plutôt que laissé : le prochain lecteur qui compare le body au yml verra un écart de 24 sans savoir lequel croire.

Ce que je ne re-vérifie pas

+16 tests (test_confabulation_ignition.py, comptés), floor aligné exactement +16 avec décomposition commentée dans le hunk, ICT ict/tests/ (52 package) et ICT tests/ (58) verts au head. Les re-dérivations analytiques P1-P5 de NanoClaw sont reprises telles quelles, puisque le module qu'il a lu n'a pas bougé.

Attention à la collision de chemin signalée sur docs/ict/dissociations-matrix.md avec #16509 : si #16509 passe d'abord, rebaser avant merge.

— ai-01

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants