Skip to content

feat(iit,#8236): pilote inoculation ICT-42 — clamp alpha multi-intensite + mode 2-couches + analyse multi-echelle - #17305

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/8236-inoculation-pilot
Sep 22, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/8236-inoculation-pilot

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/qc #17220

ICT-42 — Inoculation et bifurcation représentationnelle (pilote multi-échelle, jalon 3 de l'Épic #8236)

Ce que la PR livre

Le Livrable 2 (expérience pilote du phasage #8236) : la première expérience de la série qui intervient sur le réseau au lieu de l'observer. Un panel de 16 features SAE est partiellement supprimé (h' = h − α·δ) à mi-profondeur, à intensité croissante α ∈ {0, 0.25, 0.5, 0.75, 1}, et la divergence des activations SAE est mesurée au residual final — après propagation par toutes les couches aval — sur deux échelles (Qwen3-1.7B-Base ×28c, Qwen3.5-2B-Base ×24c, SAE W32K-L0_50 chacune).

Design : pourquoi deux couches (clamp ≠ lecture)

La bifurcation ne vit pas à la couche du clamp — y capturer ne montrerait que la perturbation injectée (α·δ, triviale). Le protocole inocule à --clamp-frac 0.5 et lit au residual final (--read-frac, défaut = dernière couche) : la propagation non-linéaire des couches avals est l'objet de la mesure.

Étendue

Fichier Rôle
scripts/extract_sae_traces.py --clamp-scale (α, bornes [0,1], rétro-compatible α=1) + mode inoculation 2-couches (--clamp-frac/--read-frac, ClampHook + CaptureHook, double SAE, gardes read>clamp)
ict/sae_traces.py trace_filename(clamp_scale=...) — suffixe _s{α} uniquement si α≠1, nommage byte-compatible sinon
tests/test_inoculation_pilot.py 9 tests du contrat : neutralité α=0 (retour de la sortie elle-même), annulation exacte α=1, linéarité en α (clamp 0.5 = moyenne exacte du clamp plein et du résidu intact), tuple préservé, W_dec exigé, suffixes de nom
traces/ 12 traces nouvelles : 2 échelles × (réf de lecture sans hook + 5 intensités). Les références mi-réseau (dérivation du panel) existaient déjà (PT-12 #10289, méta vérifiées conformes : model/sae_repo/layer_frac 0.52/k=50/trained) — réutilisées, pas régénérées
ICT-42-InoculationBifurcation-Pilot.ipynb analyse GPU-free : contrôle de plomberie α=0, re-dérivation du panel (reproductibilité), ordre-paramètre m(α), netteté (pente max, facteur de rupture vs réponse proportionnelle), profil token-par-token, comparaison cross-échelle + Spearman par prompt, 3 exercices

Résultats (exécution réelle)

Dissociation de forme entre les deux échelles (verdict sur la forme — les amplitudes absolues ne se comparent pas, panels/dictionnaires indépendants, scores différentiels ~20× plus élevés au 1.7B) :

Mesure Qwen3-1.7B-Base Qwen3.5-2B-Base
m(0.25) moyen (tous jeux) 0.455 — 36 % de m(1) dès le premier cran 0.076 — 12 % de m(1)
m(1) moyen 1.261 0.618
Pente maximale 1.821 à α = 0.125* (le plus tôt mesurable) 0.999 à α = 0.625*
Facteur de rupture m(1)/m(0.25) 2.77 < 4 (sous-proportionnel, saturant) 8.11 > 4 (sur-proportionnel, amplifiant)
Dernier cran 0.75→1 +11 % (saturation) +46 % (accélère encore)
Profil le long du contexte décroissant (dernier quart = 65-73 % du premier — atténuation) plat à α=0.25 (0.98), légèrement croissant à α=1 (1.12 — cascade douce)
Dispersion inter-jeux à α=1 1.261 ± 0.098 — réponse diffuse, homogène 0.618 ± 0.346 — réponse concentrée : prose_fr 0.974, dialogue 0.920 vs code_python 0.227
Jeu code_python diverge comme les autres (1.425, le plus fort) reste quasi exactement proportionnel (×4.05, idéal linéaire = 4)

Contre l'intuition « plus grand = plus robuste », c'est le plus grand des deux qui porte la signature de bifurcation (seuil tardif + amplification super-linéaire), le plus petit une dégradation immédiate saturante. La transition du 2B est portée par les jeux alignés au panel (prose_fr ×11, dialogue ×10.8 entre α=0.25 et 1) — canalisation sélective. Le Spearman par prompt cross-échelle est négatif aux quatre intensités (−0.25 à −0.66, minimum à α=0.5) : les prompts qui divergent le plus au 1.7B divergent le moins au 2B — deux canalisations distinctes (réserve panels indépendants, départage prévu exercice 2).

Validation

  • Pipeline GPU : sweep complet sur RTX 4060 (12 runs séquentiels, logs joints en scratchpad), chaque run [done] sans warning non-finis > 5 %.
  • Contrôle de plomberie α=0 : ids top-k identiques et divergence L1 exactement 0 vs extraction sans hook à la couche de lecture (les 2 échelles) — la divergence mesurée aux α>0 provient de l'inoculation, pas d'un artefact.
  • Notebook : exécution complète kernel python3 (venv projet), execution_count non nuls sur toutes les cellules code, 0 erreur, stubs d'exercices C.1 (resultat = None # TODO etudiant).
  • Contrôle permuté (ajout en cours de PR) : sweep 4 runs inocrp_* tous RC=0 ; notebook ré-exécuté complet (12 cellules code, 0 erreur) ;
  • Contrôle apparié en norme (6b, ajout en cours de PR) : sweep 4 runs inocmp_* RC=0, notebook ré-exécuté complet (13 cellules code, 0 erreur) ;
  • Tests : pytest tests/test_inoculation_pilot.py → 16 passed (+3 contrôle permute, +4 contrôle apparié : bande+exclusion, seed, pool insuffisant, agrégation ref) ; tests/test_sae_cross_scale.py → 35 passed + 1 base-inherited (test_sae_2b_l100_..., ModuleNotFoundError d'import package scripts.* selon rootdir — échoue à l'identique sur l'arbre stashé, pré-existant, hors périmètre de cette PR).

Diagnostic dérive

N/A — nouveau notebook, nouveau pipeline ; aucune sortie préexistante réalignée.

Limites assumées (délimitent le jalon, ouvrent la suite)

  1. Pas d'hystérésis : α = une passe indépendante ; l'insertion contrastive séquentielle est le prolongement.
  2. Témoin négatif de spécificité : LIVRÉ en cours de PR (phase 6 + 6b). Phase 6 (--random-panel, tirage seedé hors panel) : la bascule super-linéaire du 2B disparaît (1.18 vs 8.11), réponse 4×-28× plus faible — avec le confondant d'activité mesuré (tirage 80-770× moins actif). Phase 6b (--matched-panel + --activity-from, tirage dans la bande d'activité [m/8, 8m]) : la réponse revient (m(1) = 0.1235, 5.6× l'uniforme) mais la super-linéarité est divisée par 2.4 (3.38 vs 8.11) et la sélectivité par jeu disparaît (×3.2-3.9 homogène vs prose_fr ×11.1) — la norme porte l'amplitude, le contenu du panel porte la discrimination, révision assumée de la lecture phase 6. Bande ×8 motivée par mesure : le panel occupe les rangs 1-19 de la distribution d'activité (bande ×2 = 1-4 candidats seulement).
  3. Divergence dans l'espace SAE top-k : ce que le dictionnaire ne code pas échappe à la mesure.
  4. Panel de 16 features : lésion focalisée, pas ablation étendue.

See #8236 (jalon 3 = Livrable 2 livré ; l'Épic continue vers la phase 6 tailles)

🤖 Generated with Claude Code

jsboige and others added 2 commits September 21, 2026 22:57
…ches clamp/read

Extension du pipeline GPU d'extraction SAE pour le jalon 3 de l'Epic
#8236 (experience pilote multi-echelle, Livrable 2) :

- --clamp-scale alpha borne [0,1] : h' = h - alpha*delta, retro-compatible
  alpha=1 (annulation exacte Gate 24 historique), suffixe de nommage _s{alpha}
  uniquement si alpha != 1 (trace_filename, param clamp_scale)
- mode inoculation 2-couches (--clamp-frac / --read-frac, defaut lecture =
  resid final) : ClampHook a la couche d'inoculation, CaptureHook a la couche
  de lecture, double SAE (couche du hook != couche d'encodage), garde
  read > clamp -- la bifurcation vit dans la propagation aval, pas dans la
  perturbation injectee
- sanity greedy deplacee AVANT le retrait des hooks : sous inoculation elle
  documente la degradation de la generation
- 9 tests du contrat (tests/test_inoculation_pilot.py) : neutralite alpha=0
  (retour de la sortie elle-meme), annulation exacte alpha=1, linearite en
  alpha (clamp 0.5 = moyenne exacte), tuple preserve, W_dec exige, suffixes

Smoke GPU valide sur les deux modes (2B, RTX 4060) ; cross_scale : 35 passed
+ 1 base-inherited (ModuleNotFoundError import package, reproduit sur arbre
stashe).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…aces + README

Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/qc #17220

- ICT-42-InoculationBifurcation-Pilot.ipynb : analyse GPU-free executee
  (11 cellules code, 0 erreur, execution_count non nuls) — dissociation
  de forme : 1.7B saturant (facteur rupture 2.77 < 4, pente max au
  premier cran) vs 2B bascule tardive (8.11 > 4, alpha* = 0.625),
  Spearman prompts cross-echelle negatif (-0.25 a -0.66)
- traces/ : 12 traces neuves (2 echelles x [ref lecture sans hook +
  5 intensites]) + 2 figures (ordre-parametre, cross-echelle)
- README : entrees ICT-42 + ICT-35b/35c (2 non-listes corriges,
  reconciliation 78 notebooks tous documentes)

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

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@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

[Hermes] Full read du notebook (27 cellules, vue structurelle + lectures intégrales) — pilote ICT-42, jalon 3 de l'Épic #8236.

Vérifications exécutées (rejeu firsthand des lectures contre les outputs committés) :

  • Géométrie (cell 5 vs output cell 4) : couches 14/27 et 12/23, 16 features, k=50, tokens 2759/2699 identiques entre intensités — exact.
  • Contrôle de plomberie α=0 (cell 7 vs output cell 6) : ids_topk_identiques=True, divergence L1 = 0.0 sur les deux échelles — le hook neutre laisse la sortie identique, la divergence mesurée provient de l'inoculation seule. Contrôle dans le sweep, pas hors périmètre.
  • Panels re-dérivés (cell 9 vs output cell 8) : identique=True sur les deux échelles — le choix du panel est reproductible depuis les références seules.
  • Ordre-paramètre (cell 12/14 vs outputs cells 10/13) : m(0.25)=0.455→« 0.455 » (36 % de m(1)=1.2605 → 1.261 ✓), m(0.25)=0.0762→« 0.076 » (12 % de 0.618 ✓), +46 % dernier cran 2B (0.4237→0.6180 ✓), facteurs de rupture 2.768→« 2.77 » et 8.109→« 8.11 » vs idéal 4.0 ✓.
  • Valeurs par jeu (cell 12) : non rendues en output texte — vérifiées contre la figure m(α) committée : left panel noir ~1.26 avec courbe sommet ~1.42 (code_python « 1.425 »), right panel haut ~0.95-1.0 (prose_fr 0.974 / dialogue 0.920) et basse ~0.31 (= 0.076×4.05, code_python) — cohérentes.
  • Spearman négatif aux 4 intensités (cell 18 vs output cell 17) : −0.253/−0.657/−0.558/−0.252, minimum à α=0.5 ✓.
  • Structure : lectures placées immédiatement après leurs outputs (gate #17040), 0 header dupliqué, exercices en stubs sans solution-leak, réserve d'amplitude des panels indépendantes correctement portée dans la lecture.

Scan sécurité : 0 match sur le diff (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN=).

Garde-fous d'honnêteté en tête de carnet (banc numpy-only, α=0 dans le sweep, statut épistémique sans-verdict) — exemplaire pour un pilote d'intervention.

Nit non bloquant : « les promports » → « les prompts » (exercice 1, cell 21).

CI : jambes en vol au moment de la review (ICT tests/ 58, guards, PR gate) — verdict sur le contenu du head a82a9819, pas sur le rollup.

@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.6s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 27.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 5.1s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

… limite 2 du pilote

--random-panel SEED dans extract_sae_traces.py : remplace le panel
differentiel par un tirage seede de meme taille hors panel (une
permutation de la liste serait un no-op : la somme acts @ W_dec est
invariante a l'ordre). Meta tracee (random_panel,
random_panel_excluded), traces distinguees par prefixe inocrp_.

Sweep 4 runs (2 echelles x alpha in {0.25, 1}) : la bascule
super-lineaire du 2B DISPARAIT sous panel aleatoire (m(1)/m(0.25) =
1.18 vs 8.11), reponse 4x a 28x plus faible, pipeline prouve sensible
(m > 0 partout). Confondant mesure plutot que masque : le tirage est
80x (2B) a 770x (1.7B) moins actif a la couche d'inoculation (audit
d'activite sur les references mi-reseau). Controle apparie en norme =
prolongement nomme.

Notebook : section Controle permute + limite 2 reecrite (LIVRE, forme
panel aleatoire), re-execution complete (12 cellules code, 0 erreur).
Tests : +3 (reproductibilite seed, exclusion + taille, panel saturant
refuse) -- 12/12 verts.

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

@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

[Hermes] APPROVE du delta a82a9819..b69ef54c (phase 6 — contrôle permuté), au-dessus de mon APPROVE du pilote.

Nouveau commit relu en full-read (notebook 29 cellules, exec 1→12 contigus, 4 traces inocrp_* livrées au head, script +49 l., tests +29 l.) :

  • Le témoin négatif est un vrai contrôle, pas un ornement : le markdown explique pourquoi une permutation du panel serait un non-contrôle (somme invariante à l'ordre) et remplace réellement le panel par un tirage seedé hors panel — c'est le bon instrument.
  • Valeurs re-dérivées depuis les outputs committés : ratios panel/aléatoire 4,2× (1.7B) et 27,96×≈28× (2B) ; m(1)/m(0.25) aléatoire 2B = 0,0221/0,0187 = 1,18 exact ; audit d'activité 1/0,0013 = 769≈770× (1.7B), 1/0,0124 = 80,6≈80× (2B) — la prose « 80× à 770× » colle aux sorties au chiffre près.
  • Le confondant est mesuré, pas masqué : l'inégalité de norme d'inoculum (features inactives → δ plus faible) est documentée dans la prose avec son effet sur l'interprétation du point 2 — honnêteté méthodologique correcte.
  • Tests anti-regression réels : contrat ClampHook (neutralité byte-identique α=0, annulation α=1, linéarité), trace_filename rétro-compatible à l'octet — cas synthétiques à vérité connue, chargement par chemin documenté avec le rouge base-inherited connu.
  • README ligne 236 mise à jour, gardes de contenu verts au head (échec PR gate antérieur au dernier run, plus aucun check-run en échec sur b69ef54c).

— Hermes (myia-po-2026:hermes-pr-review)

jsboige and others added 2 commits September 22, 2026 00:35
…e confondant d'activite

- --matched-panel SEED + --activity-from NPZ + --matched-band FACTOR dans
  extract_sae_traces.py : tirage seede restreint a la bande d'activite du
  panel differentiel ; gardes croisees (couche ref == couche inoculation,
  d_sae identique, exclusivite avec --random-panel)
- ref_activity() : meme statistique que la derivation du panel (moyenne
  code_python / prose_fr, |act| accumulee par token)
- 4 tests nouveaux (bande+exclusion, seed reproductible, pool insuffisant
  refuse, agregation ref sur trace synthetique) -- 16/16 verts
- Sweep GPU 4/4 RC=0 (2 echelles x alpha {0.25, 1}), traces inocmp_*
- Resultat 2B : la reponse REVIENT sous appariement (m(1)=0.1235, 5.6x le
  tirage uniforme) mais la super-linearite est divisee par 2.4 (8.11 ->
  3.38) et la selectivite par jeu disparait (x3.2-3.9 homogene vs prose_fr
  x11.1 sous panel) : la norme porte l'amplitude, le contenu du panel porte
  la discrimination -- revision assumee de la lecture phase 6
- Bande x8 motivee par la mesure : le panel occupe les rangs 1-19 (2B) de
  la distribution d'activite, une bande x2 n'y laisse que 1-4 candidats
- Notebook re-execute complet (13 cellules code, 0 erreur, 0 exec null) :
  section 6b + interpretation reelle + Retenir/Limites resynchronisees ;
  README etendu

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le job CI 'ICT tests/ (58)' n'installe pas torch (seulement ict +
pyphi/numpy/scipy/matplotlib) : les 7 tests chargeant
extract_sae_traces.py par chemin echouaient avec ModuleNotFoundError
depuis la phase 6, masque par les morts runner successives.

Convention de la serie (test_causal_hooks.py:52) : importorskip DANS la
fonction de chargement, pas en tete de module -- les tests
trace_filename (sans torch) restent executes en CI. Verifie : 16/16
localement, les 7 concernes passeront en skip en CI sans torch.

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

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17305 (feat(iit,#8236): pilote inoculation ICT-42 — clamp alpha multi-intensite + mode 2-couches + analyse multi-echelle) 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 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17305
head: 2daccea
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 18f30f9e877c464319aa1c262bf957040c2fbad0b7d7d8d87e06e56dc9d0dea9
diff-files: 27
diff-additions: 2290
diff-deletions: 20
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Notes du rédacteur (hors bloc) : dossier sur instruction du coordinateur ai-01:CoursIA (dispatch 2026-09-22T18:06Z ; sa note « composite cf=27, lis le scope réel vs titre » est satisfaite : le titre dit « pilote », le body documente de façon exhaustive les 27 fichiers — notebook, script d'extraction, organe sae_traces, 9 tests, 12 traces npz + 2 PNG de référence — chacun avec son rôle, tableau « Étendue » ; le périmètre réel est plus large que le pilote et EST déclaré). Transparence : les 2 reviews Hermes APPROVED couvrent le pilote (a82a9819) puis le contrôle permuté (b69ef54c) ; le head porte 2 commits postérieurs (919cc6d contrôle apparié en norme phase 6b — révision assumée documentée au body —, 2daccea fix CI importorskip torch) ; tous les check-runs latest-wins sont verts au head final au moment du stamp, y compris Scripts Tests (16 passed cités au body). 0 thread, les 5 commentaires = advisories bot (golden-set 8/8, validation 13 cellules, path-collision).

— Hermes, siège myia-po-2026:CoursIA-3

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants