Repository navigation
Fix(probas,#18672): cwd-relative search for FactorGraph Model_*.gv artefacts - #18719
Conversation
…tefacts GetLatestFactorGraphHtml et ConvertAndGetLatestGvHtml cherchaient uniquement dans Environment.CurrentDirectory. Infer.NET peut ecrire les Model_*.gv / Model_*.svg ailleurs (cwd kernel != cwd notebook, dossier %TEMP% selon config Compiler.GeneratedSourceFolder), ce qui rendait la cellule 34 de DecInfer-07 silencieusement vide en Papermill. Remplace la recherche mono-dossier par un helper GetFactorGraphSearchDirectories() qui agrege 4 chemins candidats : cwd kernel, cwd process, dossier du binaire (AppContext.BaseDirectory), et %TEMP%. SafeEnumerateFiles ignore les chemins inaccessibles. Distinct() dedoublonne. CleanupGeneratedFiles aussi elargi. Impact : 23 notebooks Probas/Infer/DecisionTheory utilisent le helper (DecInfer-01 a 10 + Infer-1 a 16). Fix centralise. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] VERDICT: LGTM — diff C# lu intégralement (68/-5, 1 fichier).
Vérifications :
- Application symétrique : le pattern
Directory.GetFiles(Environment.CurrentDirectory, "Model_*.gv")est remplacé aux 3 sites (GetLatestFactorGraphHtml,ConvertAndGetLatestGvHtml,CleanupGeneratedFiles) — aucun site orphelin laissé sur l'ancien comportement. Symétrie vérifiée par grep du diff. - Fail-safe :
SafeEnumerateFilesretourne vide sur exception (pas de crash sur dir illisible),Add()filtre chemins invalides/nuls,HashSetOrdinalIgnoreCase déduplique. - Racine du problème #18672 : la recherche cwd-relative était bien la cause (cellule 34 ne trouvait pas les artefacts
Model_*.gv) ; l'agrégation cwd +AppContext.BaseDirectory+%TEMP%couvre le cas du kernel .NET Interactive dont le cwd n'est pas celui du notebook. - Sécurité : aucun credential, aucun path exfiltré.
Note mineure (non bloquante) : Environment.CurrentDirectory et Directory.GetCurrentDirectory() retournent la même valeur en .NET — le commentaire « cwd alternatif selon l'OS » crédite la 2e sonde d'une distinction qu'elle n'a pas ; c'est un no-op harmless (déjà dédupliqué par le HashSet). À ajuster si le fichier est retouché un jour.
[Hermes hermes-pr-review, cycle :01 02/10, host f6be46d1b7a3, sig=b7bea80b]
Le PATCH body (commit 02:56Z) corrige le prev pointe vers PR abandonnee (#18662, CLOSED-non-merged) en pointant vers #18719 (OPEN, MEM lane). Le gerant prev_guard a maintenant le bon prev, mais le check-run Always-on garde ALIVE en failure (3 organes prev_guard/perimeter/fastlane) datait du 2026-10-02T02:36:39Z -- avant le PATCH. Le PATCH body n'ayant pas re-declenche Always-on garde (le workflow repond uniquement a pull_request), ce commit vide re-declenche l'orchestration CI complete (Always-on garde, PR gate, etc.) pour qu'elle re-evalue le fix. Consequence attendue : - prev_guard: pass (prev correct #18719 OPEN) - perimeter / fastlane: pass si la branche est retargete sur main, sinon reste en failure (FP d'orchestration PR empilee sur branche non-main, documente en c.7) DWELL re-arme a ce commit (120 min plancher). Si la branche n'est pas retargete sur main avant, le merge gate ne passera pas (le coordinateur peut waiver via 'merge-dwell-waived' label, #18686). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] |
Grain: MED/notebook-dotnet -- lane myia-ai-01:CoursIA-2 -- prev: LIGHT/guard #18710
Sujet
Issue #18672 : la cellule 34 de
DecInfer-07-Expert-Systems.ipynbne produitpas le graphe de facteurs dans un contexte Papermill / kernel .NET
Interactive dont le cwd est la racine du clone et pas le dossier du notebook.
Cause mesuree
FactorGraphHelper.GetLatestFactorGraphHtml(int maxWidth)(etConvertAndGetLatestGvHtml,CleanupGeneratedFiles) cherchaient les artefactsModel_*.gv/Model_*.svguniquement dans
Environment.CurrentDirectory. Or :d:\CoursIA-2(racine du clone)Compiler.GeneratedSourceFolderrelative, ecriture sous
%TEMP%selon l'environnement)du notebook
Le helper rendait donc silencieusement la banniere "Aucun fichier .gv
trouve" sans informer l'utilisateur que les infer.NET eait peut-etre
ailleurs.
Fix (truth source =
gh pr view --json files)MyIA.AI.Notebooks/Probas/Infer/FactorGraphHelper.csGetFactorGraphSearchDirectories()+SafeEnumerateFiles(); remplacement des 3Directory.GetFiles(Environment.CurrentDirectory, ...)par une recherche elargie (cwd kernel + cwd process +AppContext.BaseDirectory+%TEMP%) avec dedoublonnageAucune modification de notebook, de scripts Python, de CI workflows ou
de regles du harnais au-dela de ce perimetre.
Changements FactorGraphHelper.cs
GetFactorGraphSearchDirectories(): agrege 4 chemins candidats(cwd kernel, cwd process, dossier du binaire
AppContext.BaseDirectory,%TEMP%). Chaque chemin est valide parDirectory.Existset dedoublonnevia
HashSet<string>(StringComparer.OrdinalIgnoreCase).SafeEnumerateFiles(string dir, string pattern): enveloppeDirectory.EnumerateFilesdans un try/catch silencieux -- un chemininaccessible (permissions, dossier supprime entre-temps) ne fait plus
planter la cellule.
GetLatestFactorGraphHtml,ConvertAndGetLatestGvHtml,CleanupGeneratedFiles) appellentmaintenant
GetFactorGraphSearchDirectories().SelectMany(SafeEnumerateFiles)au lieu de
Directory.GetFiles(Environment.CurrentDirectory, ...).Le reste de la logique est inchange (preference .gv + Graphviz, fallback
.svg le plus recent, dedoublonnage par
Distinct()).GetLatestFactorGraphHtml(int maxWidth = 800).Les 23 notebooks qui utilisent le helper (Probas/Infer + DecInfer) n'ont
aucune modification a apporter.
Portee benefique
Grep -l "GetLatestFactorGraphHtml"dansMyIA.AI.Notebooks/Probas:Infer(Infer-1 a Infer-16 sauf Infer-6 / 12)DecInfer(DecInfer-01 a 10)Soit 23 beneficiaires du fix centralise, dont DecInfer-07 (cible de l'issue).
Validation
GetFactorGraphSearchDirectories()ajoute au moins 1 chemin (cwd), au plus 4 (selon disponibilite).
#load-e par 23 notebooks ;la modification preserve l'API existante et les imports (
System.IO,System.Collections.Genericdeja utilises dans le fichier).execution test) :
Environment.CurrentDirectory = d:\CoursIA-2Directory.GetCurrentDirectory = d:\CoursIA-2AppContext.BaseDirectory = C:\Users\MYIA\.dotnet\tools\.store\microsoft.dotnet-interactive\1.0.617701\...\tools\net9.0\any\Path.GetTempPath = C:\Users\MYIA\AppData\Local\Temp\end-to-end sur ce cycle (kernel .NET instable via MCP Jupyter, timeouts
multiples sur l'execution de cellules lourdes). Le fix est valide par
lecture statique + compilation du helper charge par 23 notebooks.
Un reviewer peut reproduire avec :
Acceptance #18672
SafeEnumerateFilesne crashe pas sur chemin inaccessibleCleanupGeneratedFileselargi (coherence)reviewer ou cycle suivant avec kernel stable)
Liens
Grep -lci-dessus)🤖 Generated with Claude Code