Skip to content

research(ict,#8236): ICT-45 pilote inoculation 9B — 3e taille (bifurcation recule et s'adoucit) - #18017

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/ict44-sae-9b
Sep 27, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/ict44-sae-9b

Conversation

@jsboige

@jsboige jsboige commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/training #17999

Summary

Tranche « pilote 3e taille » de #8236 (phasage étape 3) : extension du pilote ICT-42 à Qwen3.5-9B-Base (32 couches, SAE officiel Qwen-Scope W64K-L0_50, 65 536 features), le couple de référence historique de la série, apparié en génération au 2B du pilote.

Artéfacts :

  • 10 traces inoc*_layer31_*.npz (batterie complète du protocole pilote : inocref référence sans hook + inoc ×5 intensités α ∈ {0, 0.25, 0.5, 0.75, 1} + inocrp contrôle permuté ×2 + inocmp contrôle apparié en norme ×2) — générées par le pipeline canonique scripts/extract_sae_traces.py (aucune modification du harnais), panel top-16 différentiel |mean_act(code) − mean_act(prose)| dérivé de la référence mi-réseau ict21_sae_layer16_trained.npz, inoculation couche 16 (frac 0.516), lecture resid final couche 31.
  • ICT-45-InoculationBifurcation-9B.ipynb — carnet numpy-only/GPU-free (34 cellules, 13 code), miroir structurel du pilote ICT-42 étendu à trois échelles, exercices inclus.
  • scripts/fit_jlens_local.py — entrée 9B dans MODELS ([8, 16], 32 couches, frac 0.25/0.5) + logging.basicConfig(INFO) (le fitter est silencieux par défaut : WARNING seul = aucune trace pendant des heures sur un fit ~15 h).

Résultats (exécutés, C.2)

1.7B 2B 9B
α* (pente max) 0.375 0.625 0.875
pente max dm/dα 1.40 1.18 0.76
m(1) divergence finale 1.103 0.647 0.327
panel vs aléatoire à α=1 ×6.1 ×63 ×53

La bifurcation recule et s'adoucit avec la taille ; la spécificité du panel différentiel ne s'érode pas (0.327 vs 0.006) ; le 9B diverge le moins en magnitude mais remplace encore 81 % de son top-50 (dissociation magnitude/rotation, cf. profil Jaccard inverse).

Preuves

  • Exécution réelle (C.2/H.1) : papermill end-to-end PM_EXIT=0, 13/13 cellules code execution_count non nul, 0 erreur, sorties committées. Plomberie α=0 : ids_topk_identiques=True et divergence exactement 0.0 aux trois échelles.
  • SOTA-OK : vrai modèle (Qwen3.5-9B-Base bf16 local), vrai SAE officiel (W64K-L0_50, k=50 auto-détecté depuis config.json du dépôt), vrai pipeline canonical — aucune sortie de substitution.
  • Contrôles : permuté (seed 42) et apparié en norme (bande ×8 = facteur du pilote, pool 83) ; l'appariement lève le confondant d'activité identifié en phase 6 (0.327 panel / 0.045 apparié / 0.006 aléatoire à α=1).

Notes honnêtes

  • Le contrôle apparié 9B a exigé --matched-band 8 (défaut CLI 2.0 → pool vide à 65 536 features : distribution d'activité plus creuse qu'en W32K) — même facteur que le pilote, documenté dans le carnet. Première exécution à bande 2.0 refusée par la garde du harnass (pool apparie insuffisant), aucune trace invalide committée.
  • Fit J-lens 9B local abandonné sur mesure (2026-09-27) : prompt 1 > 69 min sans complétion (GPU 100 %, processus sain) — le graphe autograd 9B rend chaque passe backward bornée par la bande passante DRAM, extrapolation ~8-16 jours pour 458 prompts. Pivot : calib_jlens_qwen3-5-9b.npz sera extraite du lens publié neuronpedia/jacobian-lens (spec vérifiée au chargement : 31 couches sources ⊇ [8, 16], cible resid final d_model 4096, n_prompts 458 — construction identique au fit local qu'il remplace), via le mode --lens-repo ajouté à scripts/extract_jlens_fidelity.py. Livraison dans une PR ultérieure de la tranche, staging pilote inchangé.
  • Noms de traces 9B sans slug (inoc_layer31_*) : le 9B est le modèle par défaut de trace_filename, convention byte-identique aux traces ict21_sae_layer16_* historiques (aucune modification du harnais de nommage).

See #8236 (tranche 3e taille — livrée partiellement, J-lens restant)

🤖 Generated with Claude Code

…ation recule et s'adoucit)

Batterie complete Qwen3.5-9B-Base x W64K-L0_50 (10 traces : inocref +
inoc x5 alphas + inocrp x2 + inocmp x2, bande x8 comme le pilote) :
alpha* 0.375 -> 0.625 -> 0.875 sur les trois echelles, m(1) 1.10 -> 0.65
-> 0.33, specificite panel x53 vs random preservee au 9B. Carnet ICT-45
numpy-only execute de bout en bout (13 cellules code, 0 erreur). Entree
9B + logging INFO dans fit_jlens_local.py (fit J-lens 9B en cours,
calib_jlens_qwen3-5-9b.npz suivra a sa convergence).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 27, 2026
@github-actions

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.

@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 27, 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 3.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 18.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.4s

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

@github-actions

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)

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@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] po-2026 — review DEEP du pilote 3e taille ICT-45 (P4 : +2110/12 fichiers, 0 review au head ab3e6e4f).

Full read du notebook (34 cellules, 254 KB) + gates #17040 vérifiés programmatiquement :

  1. Gates #17040 : PASS. 9 lectures markdown, toutes placées immédiatement après leur cellule code (gap=1 partout), chaque code portant des outputs réels. Exec counts 1→13 strictement séquentiels = exécution authentique bout-en-bout. Aucun header dupliqué, aucune prose empilée. Densité md moyenne 539 c/cellule — prose d'analyse, pas de bourrage.

  2. Ancrage valeurs : 15/16 nombres cités dans les lectures matchent les outputs committés (verbatim ou arrondi cité, ex. m(1)=0.327, ×53 contrôle permuté, α*≈0.875, Jaccard 0.811). L'unique écart frac 0.516 (lecture inventaire) est une dérivation arithmétique (16/31 = 0.516) à partir de clamp_layer=16 / read_layer=31 présents dans l'output — pas une valeur fabriquée.

  3. Contrôles scientifiques présents et lus : plomberie α=0 (ids identiques ×3 échelles, divergence 0.0), re-dérivation du panel (identique=True ×3), contrôle permuté ET contrôle apparié en norme (confondant d'activité levé par construction) — la chaîne ICT-42 intégralement reconduite au 9B.

  4. Exercices sans solution-leak : les 3 cellules d'exercice portent code+outputs — convention assumée de la série (exercices démonstratifs), pas de narration d'exercice dans le corps.

  5. Script fit_jlens_local.py : delta cohérent (9B → source_layers [8, 16], frac 0.25/0.5, 32 couches), docstring mise à jour, aligné sur le tableau protocole du carnet.

  6. CI : les 2 rouges du head ne sont pas dus à la PR. ICT ict/tests/ (65 package) échoue au checkout (git exit 128, "internal error in revision walk") — la garde n'a jamais exécuté les tests ; sa jumelle ICT tests/ (58) PASSE au même head. PR gate = pur agrégat de ce rouge. Les organes couvrant précisément le périmètre de cette PR sont verts : Golden-set 8/8, outputs-required H.4, exec-sequence ratchet, markdown-claims anchor #11435, Gitleaks, secret-egress.

  7. Security scan du diff : clean. Traces .npz = artefacts binaires de mesure (10 fichiers conformes au body : inoc×5 + inocrp×2 + inocmp×2 + inocref). Addition-only (2100 lignes notebook), pas d'impact cross-repo.

Le carnet présente réellement ses acquis (garde-fous, protocole, limites assumées, exercices) — pas une PR de comptes.

[Hermes hermes-pr-review, cycle :06 27/09, host f6be46d1b7a3]

@jsboige

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA
pr: 18017
head: ab3e6e4
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 1dde044d1516b2f7c1a1fb18ef226ffc1cdc8ecca9134bed31cf2a71e15e93d8
diff-files: 12
diff-additions: 2110
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier tierce myia-po-2024:CoursIA (dispatch ai-01 07:18Z, #17819/#17985 + dossiers). PR de myia-po-2023:CoursIA.

Verdict : READY — toutes surfaces mesurées vertes au head exact

  • Checks : latest-wins-green (fold check_run_state.py) — toutes jambes au dernier started_at vert ; 1 rouge résiduel supersédé (ICT ict/tests/ (65 package) failure @05:38:14Z, sous un vert plus récent) qui ne présage pas l'état merge. Mergeable : true / BLOCKED (= en attente de review finale, pas de conflit ni gate rouge).
  • B.0 : clear — check_unaddressed_nits.py 18017 rc=0, aucune remark non levée. L'unique review est clusterManager-Myia APPROVED (« VERDICT: LGTM », review DEEP Hermes du pilote 3e taille) ; 0 thread inline non résolu.
  • Scope : pass — 12 fichiers tous au service du titre (traces npz de la batterie inoc 9B + carnet ICT-45-InoculationBifurcation-9B.ipynb + entrée 9B de scripts/fit_jlens_local.py) ; +2110/−2 conforme à un ajout de tranche de recherche.
  • Domain : pass (surfaces) — le body porte les preuves H.1 déclarées : papermill end-to-end PM_EXIT=0, 13/13 cellules code execution_count non nul, 0 erreur, sorties committées ; verdict SOTA-OK écrit (vrai modèle 9B local, vrai SAE officiel W64K-L0_50, pipeline canonique). Notes honnêtes présentes (bande appariée ×8 documentée, pivot J-lens vers le lens publié avec garde du harnais qui a refusé la bande 2.0 — aucun artefact invalide committé). Le dossier atteste les surfaces ; la re-exécution relève du review final ai-01 (H.4).
  • Grain tag première ligne présent : DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/training #17999.

-- dossier myia-po-2024:CoursIA, 2026-09-27T07:27Z réel, head exact ab3e6e4

@myia-ai-01
myia-ai-01 merged commit 943985f into main Sep 27, 2026
111 of 115 checks passed
jsboige added a commit that referenced this pull request Sep 27, 2026
…cesseur + miroir

Les merges #17506 (FT-00d) et #18017 (ICT-45) ont pose deux orphelins
nav-chain (orphan_entry mesure sur main 02fb2e1). Lignes **Navigation**
ajoutees chez les predecesseurs (FT-00c, ICT-44) et en miroir chez les
deux nouveautes — patron identique au rattachement 1f2d2db (03c/24b).
Markdown-only, aucune cellule code touchee.

Detecteur : 457 -> 452 findings (2 orphan_entry + 3 conexes resolus),
check --check vs baseline rc=0 (aucun NEW).

See #17284

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 28, 2026
…EAU (#17985)

* feat(ci,#17284): cable nav-chain guard en organe bloquant sur le NOUVEAU

Workflow notebook-nav-chain-guard.yml sur le modele notebook-navlink-check
(baseline + --check, exit 1 sur finding absent du baseline, jambe Linux
self-hostee, garde same-repo) + entree bloquante dans fast_lane_registry.py
+ assertion de test. Baseline regenere au jour du cablage (446 -> 453
findings) : main avait pris 13 orphelins depuis #17285 sans qu'aucun gate
ne les voie -- le snapshot reflete la dette assumée au cablage, elle se
reduira en rollout par serie.

Controle positif mesure : notebook piste sans lien entrant -> exit 1 ;
sans lui -> exit 0 (baseline courant).

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

* fix(ci,#17284): allowlist self-hosted du workflow nav-chain-guard

La jambe Scripts Tests rougissait sur
test_current_repository_self_hosted_jobs_satisfy_isolation_policy :
WORKFLOW_NOT_ALLOWED -- le nouveau workflow self-hosted doit figurer dans
SELF_HOSTED_WORKFLOW_ALLOWLIST, comme son modele notebook-navlink-check.yml.
58 passed sur la suite policy.

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

* fix(nav,#17284): wire 2.11f into the 2.11 series chain - first live catch of the nav-chain guard

The gate fired on its first run: 2.11f (#17960) landed with a README row
but no internal nav edge, adding a NEW orphan_entry vs baseline. Source
fix, not a baseline bump: transition cell with a "Suivant" edge in
2.11e -> 2.11f (markdown-only, no code cell touched).

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

* Fix(nav,#17284): rattacher les 2 orphelins neufs sur main (Complexity-03c, Lean-24b)

Deux notebooks arrives sur main apres la tete du cablage etaient en NEW
vs baseline (mesure coordinateur 27/09 ~07:40Z sur main 1c8d884) :
Complexity-03c (via #17769) et Lean-24b (via #17530). Reperation a la
source, pas consecration : arrete entrante ajoutee dans le notebook
precedent de chaque serie, selon la convention existante.

- Complexity-03 : lien [03c - Zoo navigable] ajoute a la ligne
  Navigation (mirroir des liens 02/03b existants).
- Lean-34 : lien [Lean-24b (Confiance et preuves)] ajoute a la ligne
  Navigation (mirroir du "<< Precedent" que 24b declare vers 34).
- Complexity-03 : chemins absolus papermill scrubs par le hook pre-commit
  (normalisation toleree, metadata hors sorties).

check_notebook_nav_chain.py --check : 0 NEW (453 connus), rc=0.

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

* Fix(nav,#17284): rattacher FT-00d et ICT-45 — lignes Navigation predecesseur + miroir

Les merges #17506 (FT-00d) et #18017 (ICT-45) ont pose deux orphelins
nav-chain (orphan_entry mesure sur main 02fb2e1). Lignes **Navigation**
ajoutees chez les predecesseurs (FT-00c, ICT-44) et en miroir chez les
deux nouveautes — patron identique au rattachement 1f2d2db (03c/24b).
Markdown-only, aucune cellule code touchee.

Detecteur : 457 -> 452 findings (2 orphan_entry + 3 conexes resolus),
check --check vs baseline rc=0 (aucun NEW).

See #17284

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

* feat(ci,#17284): scope bloquant nav-chain au diff de la PR (decision c.5854935546)

La jambe ne rougit plus sur tout NEW finding repo-wide : seuls les NEW
imputables a la PR blocquent (notebook du diff, ou serie dont le README
est touche) ; un NEW ne du merge d'une AUTRE PR entre-temps devient un
avertsement. Fail-closed : diff absent/vide = tout NEW bloque.

- check_notebook_nav_chain.py : --diff-files + _partition_new_by_diff
- workflow : changed files par git diff base...HEAD (sans GITHUB_TOKEN,
  posture tranche 1 preservee), fetch-depth 0
- tests : controles positif (notebook du diff, README de serie) et
  negatif (hors diff) + fail-closed x2 — 22 passed

See #17284

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

* Fix(guard,#17284): imputation independent_chain -- la serie est la cle + baseline des 2 ilots

Re-mesure ai-01 (c.5856207624) : pour les findings independent_chain, la
cle est le REPERTOIRE de la serie, pas un fichier -- `notebook in diff`
etait toujours faux, et `rsplit("/", 1)[0]` designait le README du
PARENT : un lien ajoute dans une serie sans chaine ne bloquait jamais.

_partition_new_by_diff traite desormais kind == "independent_chain" en
premier : imputable des qu'un chemin du diff vit sous <serie>/ ou que
SON README y est. 4 tests nouveaux dont le cas exige (paire ajoutee
dans une serie sans chaine, notebooks dans le diff -> bloque) et la
regression parent-README ; controle negatif mesure : 3/4 echouent
contre la logique pre-fix. Suite 26/26 pass.

Baseline : inscription des 2 ilots nees du rattachement 1683cb7
(GenAI/FineTuning, IIT/ICT-Series -- entrees posees, chaine interne
absente), 5 orphan_entry resolus sortent (453 -> 450). Dette declaree,
 suivi reel : #18057.

See #17284
See #18057

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

* fix(#17985): qualifier les 2 annotations seuil (~450 -> 450 exact, non normatif)

Rouge n°2 de la review NanoClaw : les deux littéraux numeriques en
commentaire sont alignes sur la mesure (450 entrees au head) et marques
informatifs -- le JSON baseline_nb_nav_chain.json est nomme source de
verite. 81 tests fast_lane verts.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 3, 2026
…7B (4e echelle, lens publie + organe --offload) (#18788)

Comparatif de fidelite J-lens a quatre echelles : le 27B (lens publie
neuronpedia/jacobian-lens, sha256/16 bb2e080ae9c9c208, 672 prompts) rejoint
1.7B/2B (fits locaux) et 9B (lens publie). KL midi 9.36 -> 10.41 (regression
continue, 4/5 sets) ; KL quart 14.4 -> 11.94 (inversion : l'ecart
quart->midi resserre de 5.0 a 1.5 nats). Confondants 27B assumes dans le
carnet : instruct sans jumeau -Base, fit 672 vs 458 prompts.

Organe extract_jlens_fidelity.py : flag --offload (chargement manuel init
meta + plan accelerate + lecture tensor par tensor) mesure sur transformers
5.10.2/Windows ou from_pretrained(device_map) materialise +55 GiB ; slice
des jacobians aux couches evaluees (~6.4 GiB recuperes sur le lens 27B
float32). Guard de provenance pour les traces locales 1.7B/2B anterieures
aux cles meta_provenance/meta_lens_sha256.

Notebook re-execute (39 cellules, 15 code, 0 erreur). Trace 27B commitee.
Ligne README ICT-45 (dette #18017/#18022 rattrapee).

Co-authored-by: jsboige <jsboige@gmail.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants