Repository navigation
feat(ict,#18808): ICT-47 section 8 split-half 2B — sorties réelles + lecture dérivée de la mesure - #19137
Conversation
…TRAIN, mesure TEST Section finale autonome selon la division convenue avec ai-01 (DM msg-20261003T181126-zcjys5, sources #18808 c.5972028502) : partition fixe graine 2026 orientation A, copies ACTS_TR/ACTS_TE sans reaffecter ACTS — le recit des sections 1-7 et 9 reste intact. Matrice 4D held-out (sondes ENTRAIN -> corpus TEST) puis organe causal_engine sur panneaux neutres TEST (cible/random apparie/sham, dose 4x std). 9B split-half cite en run externe #1454 ; nombres imprimes = substrat canonique 2B. Correctifs portes par les sources : p47-load getattr(hf_device_map) (l'attribut n'existe pas sans device_map), p47-resid len(ACTS[g][MID]) au lieu du 24 hardcode (comportement identique sur corpus complet). Plan et Synthese mis en coherence (items 9-10, ligne generalisation). Sorties : ATTENDUES — execution GPU 2 par ai-01 (papermill CLI, noyau coursia-sae) au head exact de ce commit, outputs committees au retour. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rivee de la mesure Sorties : run GPU 2 d'ai-01 a la tete f158439 (papermill 52/52, rc=0, 0 sortie d'erreur, 22 cellules de code numerotees) -- injectees par alignement des cellules code (22/22 sources identiques, verifie avant injection). Lecture md 45 reecrite : la prose attendait « la cible seule a deplacer la marge pain » ; la mesure donne cible -1,26 / aleatoire -1,44 / sham -1,45 sur un panneau neutre partant de -1,45 -- les DELTAS sont +0,19 / +0,01 / 0,00. La lecture est desormais derivee du tableau : specificite survivante (rapport ~19x) mais un ordre de grandeur sous le contrat en echantillon (section 5) et sous la moyenne 9B (+3,44 ; +4,58 pour la meme partition 2026/A), avec les deux causes candidates (12 enonces/groupe pour l'estimation, dose de reference sur le panneau TEST) et le balayage de partitions comme departage. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams). Scope = notebooks CHANGED in this PR, not the whole corpus. The |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
…ins machine en sortie Diagnostic du rouge `Output-failure ratchet (base vs PR)` : MACHINE_PATH 0 -> 2, les deux issus du MEME avertissement huggingface_hub (le chemin site-packages et le chemin du cache HF_HOME). Cause = environnement d'execution, pas le propos pedagogique du carnet. Correctif a la source (cellule de setup, avant tout import HF) : HF_HUB_DISABLE_SYMLINKS_WARNING=1 -- le commutateur que l'avertissement nomme lui-meme. Aucune sortie n'est editee a la main (Stop & Repair). Les sorties seront re-rendues sur la lane GPU qui porte le cache HF (le chemin D:/hf-cache-crosscoder n'existe pas sur cette machine) : commit suivant, sources des 22 cellules code verifiees identiques avant injection. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Diagnostic du rouge — une seule cause, et elle est à la source : la sortie porte deux chemins machine.
Ce n'est pas le propos du carnet : les deux viennent du même avertissement Correctif committé — tête os.environ.setdefault("HF_HUB_DISABLE_SYMLINKS_WARNING", "1")C'est le commutateur que l'avertissement nomme lui-même dans son texte. Aucune sortie n'est éditée à la main (Stop & Repair, Ce qui reste à faire, et pourquoi ce n'est pas fait ici. Le re-render exige CUDA + le cache Conséquence à connaître pour la revue : la tête actuelle porte donc une cellule code modifiée dont les sorties datent du render précédent. Elle n'est pas mergeable en l'état — le commit suivant injectera les sorties re-rendues après vérification que les 22 cellules code sont identiques à la source (la vérification faite au premier passage, refaite telle quelle). Je ne demande aucune review avant ce commit. |
Path-collision (organ #13359/#13615)Cette PR #19137 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
`Papermill ratchet (base vs PR)` rougissait : les sorties et `execution_count` ont change, mais le bloc `metadata.papermill` racine etait byte-identique a `origin/main` -- il certifiait le run du 2026-10-02T04:53 et non celui qui a produit les sorties committee. Cause : les sorties reelles (execution GPU ai-01) ont ete integrees cellule par cellule ; le bloc racine du notebook, lui, n'a pas suivi. Remede : retrait du bloc racine (12 lignes), pas de re-execution -- les sorties committee SONT celles du run reel. `check_papermill_ratchet.py origin/main` rejoue : regressions 0, BLOCK_REMOVED. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Etat des rouges — un repare, un route
|
…PATH 0 Le rouge requis `Output-failure ratchet` (MACHINE_PATH 0 -> 2) de la PR #19137 venait de la sortie committee de la cellule `p47-load`, qui portait encore l'avertissement de liens symboliques de huggingface_hub — deux chemins machine dans un seul UserWarning (le cache et le site-packages). Ce n'est PAS une edition de sortie a la main (Stop & Repair, secrets-hygiene regle 6). Les sorties viennent d'une re-execution reelle du carnet, faite par ai-01 sur son GPU 2 (kernel `coursia-sae`, CUDA_VISIBLE_DEVICES=2), a la tete exacte `49d48b48dd` de cette branche : papermill rc=0, 53/53 cellules, de 21:00:32Z a 21:03:12Z (carnet rendu par DM `ai01-ict47-s13-rendu`). Controles avant injection : - sources des 53 cellules comparees une a une : IDENTIQUES a ma tete ; - 22 cellules code, execution_count sans trou et croissants ; - 0 chemin machine dans les sorties du resultat ; - `metadata.papermill.input_path`/`output_path` ramenes au basename (normalisation toleree n.1) ; - aller-retour de serialisation verifie AVANT ecriture : le script refuse d'ecrire si le serialiseur ne reproduit pas le fichier a l'octet ; - aucune ligne de `source` ajoutee ni retiree (controle C.3). Le bloc `metadata.widgets` du run n'est pas repris : la tete portait deja des sorties widget-view sans ce bloc, et ajouter 35 Ko d'etat ephemere depasserait l'objet de ce commit. Gates rejoues localement, base `origin/main` : - `check_output_failure_text.py` : `1 changed notebooks | 0 regressed` (rc=0) - `check_papermill_ratchet.py` : `0 regressions`, `BLOCK_MOVED` (rc=0) See #18808 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
| Controle | Resultat |
|---|---|
| Sources des 53 cellules comparees une a une | IDENTIQUES a la tete 49d48b48dd |
Lignes de source ajoutees / retirees (C.3) |
0 / 0 |
Cellules code, execution_count |
22, aucun trou, croissants |
| Chemins machine dans les sorties du resultat | 0 |
metadata.papermill.input_path / output_path |
ramenes au basename (normalisation toleree n.1) |
| Aller-retour de serialisation avant ecriture | IDENTIQUE (le script refuse d'ecrire sinon) |
Le bloc metadata.widgets du run n'est pas repris : la tete portait deja des sorties widget-view sans ce bloc, et ajouter 35 Ko d'etat ephemere depasserait l'objet de ce commit.
Gates rejoues localement, base origin/main
check_output_failure_text.py origin/main
-> base origin/main | 1 changed notebooks | 0 regressed (rc=0)
check_papermill_ratchet.py origin/main
-> changed notebooks : 1 | regressions : 0 | BLOCK_MOVED (rc=0)
Le MACHINE_PATH 0 -> 2 est donc resorbe, et le Papermill ratchet (STALE_BLOCK, repare en 49d48b48dd par retrait du bloc racine perime) reste vert — le nouveau bloc certifie desormais le run qui a reellement produit ces sorties.
Le correctif de source de la tete (setdefault("HF_HUB_DISABLE_SYMLINKS_WARNING", "1")) tient : l'avertissement n'est plus emis, donc le chemin ne peut plus revenir par cette porte.
Tete a examiner : c8de96b41e.
|
[ADJOINT PREFLIGHT] Motif BLOCKED -- checks en re-agregation ; verification de substance demandee par le dispatch : FAITE, conforme :
— dossier myia-po-2027:CoursIA-2, dispatch ai-01 dossiers tiers (04/10 23:17Z). |
|
| base | tête | |
|---|---|---|
kernelspec.name |
py310-gpu |
py310-gpu |
language_info.version |
3.10.19 |
3.12.13 |
signature_drift_cells |
— | [] |
Classe KERNEL, pas SIGNATURE : le kernelspec est identique des deux côtés — le nom py310-gpu désigne une famille, pas un environnement, et sur la machine qui a rejoué il résolvait vers Python 3.12.13. Aucune cellule ne dérive ; c'est la métadonnée d'interpréteur qui a changé.
Le contrat du garde est explicite dans son propre en-tête, et c'est celui que j'applique : une classe KERNEL « requiert ## Diagnostic dérive dans le corps de la PR expliquant le changement ». La section est ajoutée au corps, et elle n'est pas une formalité — le parcours exact est (a) environnement / kernel : la série épingle requires-python = ">=3.9,<3.10" (contrainte pyphi==1.2.0) et aucune des deux versions en présence n'est sur ce pin — la base était déjà hors pin avant cette PR.
Le rouge n'est donc pas « corrigé » : il est documenté, avec la re-exécution routée vers #19160 (rejouer ICT-47 sous l'interpréteur de la base sur une lane GPU). Tant qu'elle n'a pas eu lieu, le carnet reste hors du pin de sa propre série.
Ce que je n'ai pas fait, et pourquoi : normaliser language_info à la main. Ce n'est pas une sortie de cellule, mais ce serait un quatrième geste toléré — hors des trois que Stop & Repair autorise (metadata.papermill, quantbooks QC, strip probeAddresses) — et un language_info réécrit est indiscernable d'une exécution qui n'a pas eu lieu.
Un run edited est reparti (37236744753) : le garde relit le corps live, donc il voit la section fraîche, pas la version de l'événement d'origine.
|
[ADJOINT PREFLIGHT] Dossier tiers (ai-01:CoursIA), à la tête
|
|
[ADJOINT PREFLIGHT] Dossier tiers (ai-01:CoursIA), à la tête
|
…derive kernel sur la base Le Kernel drift guard rougissait la PR : base py310-gpu @3.12.13 vs tete @3.11.15 (major.minor 3.12 -> 3.11). Le pin 3.9 du pyproject ICT-Series n'est pas une issue : sonde sur env 3.9.25 vierge -- transformers cp39 s'arrete a 4.57.6, qui rejette l'arch qwen3_5 (ValueError, checkpoint Qwen3.5-2B-Base). La strate LLM a toujours vecu en famille 3.12 ; la base elle-meme est 3.12.13. Geste : env conda py310-gpu reconstruit = Python 3.12.15 + torch 2.11.0+cu128 (CUDA actif, RTX 3080 Ti) + transformers 5.18.0 (qwen3_5 reconnu) + numpy 1.26.4 (pin <2.0 respecte) + accelerate. Kernel py310-gpu enregistre sous ce nom exact. Re-execution papermill complete, kernel py310-gpu. Validation post-exec : - PAPERMILL_EXIT=0, 54/54 cellules, 8 min 22 s - 23 cellules code, 0 erreur, 0 sans execution_count, 126 outputs - parite source verifiee byte-identique (aucune cellule injectee, aucun changement de source) - language_info.version 3.11.15 -> 3.12.15 = major.minor de la base (3.12) : la derive est reparee dans la direction canonique - metadata.papermill input/output_path normalises au basename (tolerance admise) J2 (sweep SPLIT_SEED 7/42 par injection) suivi dans #19404. See #19137 See #19238 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
#19238) * feat(ict,#19137): SPLIT_SEED parametrable -- tag parameters cellule 40 (papermill -p SPLIT_SEED) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(ict,#19238): re-execute patch po-2025 -- cellule parameters + cellule split-construction Le patch po-2025 (DM c24aec30-19238-split-handoff, c.184) restructure la cellule 40 (tag parameters) en 2 cellules : - cellule 40 (id=p47-split, tag parameters) : ne porte QUE le defaut SPLIT_SEED = 2026 (et les commentaires de protocole) ; - cellule 41 (id=221ed473, tag split-construction) : la construction complete de la partition, qui depend de SPLIT_SEED lu dans la cellule parameters. Garantit qu'une surcharge papermill -p SPLIT_SEED X est effective APRES la cellule parameters. Re-execution GPU 2 (CUDA_VISIBLE_DEVICES=2, kernel coursia-ml-training, cwd MyIA.AI.Notebooks/IIT/ICT-Series/) : - 23/23 cellules code executees (execution_count != null) - cell 41 (split-construction) output : "split-half (graine 2026 , orientation A) : TRAIN {'pain_physical': 12, ..., 'positive_valence': 12}" -- identique a la base pre-patch (meme construction, meme seed) - diff vs origine : 0 id retire, 1 id ajoute (221ed473), 7 cellules avec diff de sortie (timings VRAM/torch 2.11 vs 2.13 documentes, 1 PNG matplotlib, et la cellule 40 qui passe d'output a vide -- c'est la division parameters/construction qui est l'objet du patch) Reserve GPU 2 (CoursIA-gpu-reservation-ledger obs-bdf7fb83ae80f418, holder myia-ai-01:CoursIA-2) -> released au merge de cette branche. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(ict,#19137): re-exec ICT-47 sous py310-gpu @3.12.15 -- aligne la derive kernel sur la base Le Kernel drift guard rougissait la PR : base py310-gpu @3.12.13 vs tete @3.11.15 (major.minor 3.12 -> 3.11). Le pin 3.9 du pyproject ICT-Series n'est pas une issue : sonde sur env 3.9.25 vierge -- transformers cp39 s'arrete a 4.57.6, qui rejette l'arch qwen3_5 (ValueError, checkpoint Qwen3.5-2B-Base). La strate LLM a toujours vecu en famille 3.12 ; la base elle-meme est 3.12.13. Geste : env conda py310-gpu reconstruit = Python 3.12.15 + torch 2.11.0+cu128 (CUDA actif, RTX 3080 Ti) + transformers 5.18.0 (qwen3_5 reconnu) + numpy 1.26.4 (pin <2.0 respecte) + accelerate. Kernel py310-gpu enregistre sous ce nom exact. Re-execution papermill complete, kernel py310-gpu. Validation post-exec : - PAPERMILL_EXIT=0, 54/54 cellules, 8 min 22 s - 23 cellules code, 0 erreur, 0 sans execution_count, 126 outputs - parite source verifiee byte-identique (aucune cellule injectee, aucun changement de source) - language_info.version 3.11.15 -> 3.12.15 = major.minor de la base (3.12) : la derive est reparee dans la direction canonique - metadata.papermill input/output_path normalises au basename (tolerance admise) J2 (sweep SPLIT_SEED 7/42 par injection) suivi dans #19404. See #19137 See #19238 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(ict,#19238): coupe les barres tqdm au chargement (TQDM_DISABLE + filtre IProgress) -- ratchets flood/machine-path verts, re-exec 54/54 Cellule de config: TQDM_DISABLE=1 + warnings.filterwarnings IProgress not found. La barre transformers Loading weights s'emettait en ~27 outputs stream par modele sous kernel IPC (33+72 outputs sur les deux chargements -> 3+3), et tqdm.auto imprimait le chemin site-packages machine dans son warning. Aucune cellule n'affiche de barre volontairement (verifie). Re-exec complete py310-gpu @3.12.15, 0 erreur, 23 cellules code executees, parite source byte-identique 54/54. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/tooling #19135
Résumé
Section 8 « Validation split-half held-out » d'ICT-47 : direction, résidualisation et sondes estimées sur la moitié ENTRAIN (12 énoncés/groupe), organe
causal_enginemesuré sur la moitié TEST — plus les sorties réelles du run GPU.Exécution réelle (C.2)
coursia-sae, à la têtef1584390de cette branche (papermill CLI, garde device + garde thermique).Réécriture de la lecture (md 45) — dérive corrigée
La prose attendait « la cible seule à déplacer la marge pain, le sham à marge nulle ». La mesure donne, sur panneau neutre TEST (marge au repos −1,45) : cible −1,26, aléatoire apparié −1,44, sham −1,45 — les deltas valent +0,19 / +0,01 / 0,00.
La lecture est désormais dérivée du tableau imprimé :
selectivepour la cible et pour l'aléatoire apparié,not_selectivepour le sham — à cette dose, le verdict ne sépare pas cible et témoin, seul l'écart de marge le fait ;Rebase et périmètre
Branche rebasée sur
origin/main(f1584390→a2de7aed08→8cc06a4f9d) : la cellule 9B arrivée sur main via #19009 est préservée, le diff vs main ne touche que le carnet ICT-47.See #18808
🤖 Generated with Claude Code
Diagnostic dérive
Le check
Kernel drift guard (base vs PR)est rouge sur la têtec8de96b41e(run 37235456922). JSON de l'organe :
kernelspec.namepy310-gpupy310-gpulanguage_info.version3.10.193.12.13signature_drift_cells[]Cause (a) — environnement / kernel. Le re-rendu de la section 8 a été produit par un
interpréteur différent de celui de la base. Le
kernelspecest identique des deux côtés : le nompy310-gpudésigne une famille, pas un environnement — sur la machine qui a rejoué, ilrésolvait vers Python 3.12.13. Aucune dérive de cellule n'est détectée : la métadonnée
d'interpréteur a changé, les sorties sont réelles.
Ce que la série épingle.
MyIA.AI.Notebooks/IIT/ICT-Series/pyproject.tomlporterequires-python = ">=3.9,<3.10"(contraintepyphi==1.2.0:collections.Iterable, retiré en3.10). Aucune des deux versions en présence n'est sur ce pin — la base était déjà hors pin
avant cette PR ; la PR ne fait pas naître l'écart, elle le déplace (3.10.19 → 3.12.13).
Verdict :
CAUSE_DOCUMENTED_ONLY. La dérive n'est pas réparable sur cette lane : le carnet estGPU-bound et l'environnement épinglé de la série n'y existe pas (mesure :
jupyter kernelspec list,aucun
py310-gpu). Elle ne se répare pas non plus par réécriture de métadonnées —language_infon'est pas une sortie de cellule, donc le corriger à la main serait un quatrième geste toléré, hors
des trois que Stop & Repair autorise, et vaudrait falsification de la preuve d'exécution.
Issue de suivi : #19160 — rejouer
ICT-47sous l'interpréteur de la base (3.10.19) sur unelane GPU et vérifier que
Kernel drift guardrepasse au vert. La re-exécution n'est pas unalignement de nombre : c'est
language_infoque le garde compare, et il ne se réduit qu'en rejouant.