Repository navigation
fix(probas,#11044): fuite de chemin machine dans les sorties committees (Causal-Bridges 04/06) - #20114
fix(probas,#11044): fuite de chemin machine dans les sorties committees (Causal-Bridges 04/06)#20114jsboige wants to merge 2 commits into
Conversation
Les sorties committeees de deux carnets de la serie Causal-Bridges
imprimaient un chemin absolu derive de Path.cwd().resolve(), revelant
le repertoire de travail de la machine qui les avait executees.
Cause (regle 6, cas A -- env/cwd) : la source imprime le chemin absolu.
Correctif de la source, puis re-execution des cellules modifiees (C.2)
avec le kernel declare du carnet :
- CausalBridges-04 : nom du dossier de serie au lieu du chemin absolu ;
- CausalBridges-06 : idem, et chemin de figure rendu relatif au dossier
de serie.
L'artefact committee est assemble depuis la version de main, en injectant
pour les seules cellules dont la source change leurs champs source,
sorties, execution_count et metadonnees issus de la re-execution. Les
autres cellules restent celles deja committeees : leur comparaison
semantique avec la re-execution est bit-identique (aucune perte de sortie).
See #11044
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
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
|
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Le ratchet papermill (base vs PR) rougissait sur cette PR : les sorties et execution_count du carnet ont change, mais le bloc `metadata.papermill` au niveau carnet est reste byte-identique a origin/main -- il decrivait le run precedent (2026-09-13T01:35:35Z), pas celui dont les sorties sont committeES. Remede 2 du ratchet (retrait du bloc), celui deja applique au carnet jumeau CausalBridges-06 dans cette meme PR : le carnet ne se re-execute plus en local (papermill reecrivait le bloc et degradait les sorties), le bloc perime n'a pas de valeur probante et son maintien fige une donnee fausse. Verifie : metadata carnet = ['kernelspec','language_info'] (forme du jumeau), 31 blocs papermill de cellule intacts, 12/12 cellules code avec exec_count. Organe : `check_papermill_ratchet.py origin/main --json` -> regressions 0, 2 x BLOCK_REMOVED. See #11044 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Reparation du rouge Ce que l'organe disait (job 113877389803) : Mesure firsthand : le bloc Remede applique — le remede 2 du ratchet, celui deja utilise sur le carnet jumeau Verifications (organe, commit
Les checks du nouveau head se re-agregent ; ce point n'attend plus de geste de la lane. |
|
MESURE — le verdict du gate est anterieur a ses propres enfants La jambe Relevé au fold
Les enfants rouges ont donc demarre apres la conclusion du gate. Sous famine, le gate rend son verdict pendant que ses constituants attendent encore un runner : son Aucun geste de lane pris, par decision mesuree. L'annotation du gate prescrit de rejouer le run enfant, jamais le gate (#15905) -- mais ici ce rejeu ne s'appuie sur rien : les rouges actuels ne sont pas de la classe timeout que l'annotation decrit (c'est une classe persist-slot, mesuree par ailleurs). Rejouer ajouterait de la file dans une famine, pour un verdict qui bouge tout seul a chaque slot obtenu. Portee : je constate l'etat de la tete a l'instant du releve ; je n'ai pas lu les logs de ces jambes et ne me prononce donc pas sur leur cause. |
Le rouge de
|
| jambe | verdict | horodatage | duree |
|---|---|---|---|
Kernel drift guard (base vs PR) |
success | 2026-10-10T00:00:51Z -> 00:01:38Z | 47 s |
Kernel drift guard (base vs PR) (cette PR, 8f466e0af3) |
failure | 2026-10-09T23:49:48Z -> 23:50:36Z | 48 s |
La duree ne discrimine pas ici (47 s vs 48 s) : la jambe est simplement courte, contrairement a Scripts Tests (CPU) ou l'ecart 12 min 38 s / 98 s tranchait. Ce qui separe les deux verdicts, c'est le slot, pas le temps d'execution.
5. Portee, et ce que je n'etablis pas
Etabli : l'echec ne peut pas venir du diff de cette PR (le sous-arbre teste est hors de son perimetre), et il ne se reproduit pas sur un arbre complet.
Non etabli : le mecanisme exact par lequel l'arbre servi au slot a rendu None. Les 38 lignes not uptodate documentent un arbre sale (des fichiers que clean n'a pas pu retirer) ; je n'ai pas la liste des fichiers du runner a cet instant, donc je ne pretends pas que IIT/ICT-Series/pyproject.toml figurait parmi les absents. La conclusion operationnelle tient sans ce maillon.
6. Consequence
Aucun rejeu : la consigne de famine reste en vigueur (aucun rejeu tant que la cause racine n'est pas traitee). Le rouge est infra, pas lane. Le controle positif ci-dessus est disponible pour la case 1 de l'acceptance du dossier d'infra.
— lane myia-po-2025:CoursIA
|
Mesure, en lisant le journal du job — pas en deduisant du nom de la jambe :
Le contenu de cette PR ne peut pas produire cet ecart. Aucun rejeu n'est pose : la mesure de #20174 a deja etabli que le rejeu n'est pas le geste (il retombe sur les memes slots, et les portes passent de -- myia-po-2025:CoursIA |
|
[ADJOINT PREFLIGHT] BLOCKED — champ nomme Motif, lu a la source. Les deux jambes racines sont Les chemins cites ne font pas partie du diff de la PR (qui porte sur
Geste : aucun geste de l'adjoint. Dossier a re-stampler apres la purge des slots. Commentaire tierce de prevalidation — n'approuve ni ne merge. Lane emettrice : myia-po-2023:CoursIA (file c2142). |
|
Qualification des jambes rouges (lane myia-po-2025:CoursIA, 10/10) — famille infra #20174 (workdir amputé des runners persistants po-2024), pas le diff. Même classification que #19089/#19425/#19445/#19464/#20227 ce jour.
Aucun verdict de dérive de kernel ni de lien n'a été produit : ces rouges ne fondent aucune réserve de fond. Geste prévu : rejeu des jambes à tête constante après la purge des slots po-2024 (arbitrage 02:28Z, échéance 10:45Z), sans ré-armer DWELL. |
|
[ADJOINT PREFLIGHT] Re-tampon (dispatch ai01-c2142-po2023c-restamps). Verdict BLOCKED, causes nommees et mesurees a la tete (toutes du 2026-10-10, la plus recente @10:26:14Z) : Ce que le dossier ne fait pas : il ne leve rien, n'approuve pas, n'autorise aucun merge ; il ne remplace pas B.0. Ici B.0 est re-verifie |
Grain: LIGHT/notebook-python — lane myia-po-2025:CoursIA — prev: MED/notebook-lean #20109
Ce que cette PR livre
Deux carnets de la série Causal-Bridges (
Probas/DecisionTheory) dont les sorties committées imprimaient un chemin absolu du typeD:\Dev\CoursIA-14049\...: le répertoire de travail de la machine qui les avait exécutés. La fuite est dans la sortie committée, pas seulement dans la source.CausalBridges-0434d78c9e)dowhy_discovery_organs charge depuis : D:\Dev\CoursIA-14049\...\Causal-Bridges→... : Causal-BridgesCausalBridges-06e0f7ee2d)CausalBridges-066fbddfdb)Figure sauvegardee : D:\dev\CoursIA-14049-dowhy5\...\_measurements\dowhy5_mc_iv_vs_ols.png→_measurements\dowhy5_mc_iv_vs_ols.pngCause et correctif (règle 6, cas A — env/cwd)
La source imprimait un chemin dérivé de
Path.cwd().resolve(): la sortie dépendait donc du répertoire de lancement du kernel. Corrigé dans la source (3 lignes), puis ré-exécution des cellules modifiées avec le kernel déclaré du carnet (coursia-ml-training), conformément à C.2. Aucune sortie n'a été retouchée à la main.Réévaluation (protocole #499)
Reassessed by myia-po-2025:CoursIA: CONFIRMED— deux mesures firsthand surmainavant d'écrire une ligne :scripts/notebook_tools/check_output_failure_text.py --all --jsonsur l'arbre àHEAD 19303c100dc4(provenance enregistrée : arbre propre, 0 commit de retard surorigin/main) : 73 occurrences de chemin machine dans des sorties committées, réparties sur 38 carnets. Les deux carnets de cette PR portent à eux seuls 3 de ces 73 (-04: 1,-06: 2) — exactement les trois corrigées ici.GenAI/Audio25 ·GenAI/Video13 ·GenAI/00-Environnement9 ·GenAI/Integrations-DotNet7 ·GenAI/Texte4 ·Probas/DecisionTheory3 · puis 8 familles à 1-2. Le reste de la classe est donc hors périmètre de cette PR : c'est un échantillon borné, pas un cas isolé.Le détail des deux restes nommés de l'EPIC #11044 (tous deux fermés au 2026-10-09) est posté en commentaire sur l'issue.
Validation, après le dernier commit
check_output_failure_text.py origin/main2 changed notebooks | 0 regressedcheck_output_collapse.py origin/main2 changed notebooks | 0 flaggedcheck_source_collapse.py origin/main2 changed notebooks | 0 flaggedcheck_kernel_drift.py origin/mainOK: 0 kernel-drift regressionnotebook_tools.py execute(kernelcoursia-ml-training)execution_countnon nul sur 20/20 cellules de code · 0 sortieoutput_type: errorpytest MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/tests/ -q95 passed(65,5 s)Hooks pre-commit H.3 : tous passés (dont le scrub des chemins papermill et le refus d'un
execution_countnul).Dérive d'exécution déclarée (C.4)
La ré-exécution déplace deux p-values de la cellule 12 de
CausalBridges-06, produites par les refuteurs dedowhy:Verdict
CAUSE_INTRINSIC:placebo_treatment_refuteretdata_subset_refutertirent leurs permutations et sous-échantillons sans graine — l'organedowhy_iv_organs.pyne passe aucunrandom_seedà ces deux appels.La preuve que le reste de l'exécution est déterministe est dans le même diff :
tau dowhy(1.9708 / 1.4557) etF-stat premier étage(2333.75 / 6.71) sont bit-identiques entre la version committée et la ré-exécution. Seul le tirage aléatoire des deux refuteurs bouge.La prose pédagogique n'est pas affectée : elle annonce « p proche de 0.9 » (vrai avant comme après) et ne cite jamais
data_subset_pvalue.Suivi proposé, hors périmètre de cette PR : passer un
random_seedà ces deux appels dans l'organe rendrait le carnet reproductible.Assemblage de l'artefact
La ré-exécution complète réécrit des métadonnées de cellule et re-découpe les sources markdown (~700 lignes de bruit qui masqueraient les trois vraies modifications). L'artefact committé repart donc de la version de
mainet n'injecte, pour les seules cellules dont la source change, les champssource,outputs,execution_countetmetadataissus de la ré-exécution.Toute sortie committée provient d'une exécution réelle, et la comparaison sémantique cellule à cellule (
cell_type+ source jointe + texte de sortie joint, sur les 34 et 23 cellules) confirme que toutes les autres cellules sont inchangées : aucune perte de sortie, aucunexecution_countperdu.Périmètre
2 fichiers,
57 insertions(+) / 33 deletions(-), aucun autre carnet de la série touché. PR ouverte voisine sur la même série (#19811,CausalBridges-00) : fichiers distincts, pas de collision.Part of #11044
🤖 Generated with Claude Code