Repository navigation
Fix(CSP,Sudoku): Choco via IKVM sous Linux et macOS, RID dérivé de la machine (hors flotte) - #18031
Conversation
… machine Les six notebooks C# qui chargent Choco-solver par IKVM 8.15.0 (CSP-1, 2, 3, 5, 7 et Sudoku-11) codaient le RID win-x64 en dur. Sous Linux, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava). Le RID est desormais derive de OperatingSystem et de RuntimeInformation.ProcessArchitecture ; la reference NuGet explicite IKVM.Image.runtime.win-x64 est retiree, IKVM.Image 8.15.0 dependant deja des onze paquets IKVM.Image.runtime.<rid>. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, culture et temps mesures. Prose : trois durees machine epinglees (CSP-1, Sudoku-11) remplacees par des descripteurs. Parite jumelle rebaselinee sur les six paires. Hors flotte (session cloud d'agnosticisme). See #17654. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VuVMY5fhzd5cQhzHiyvjka
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: re-vérification indépendante de la claim porteuse du .nuspec sur nuget.org + extraction base↔head des 6 notebooks + exécution Linux prouvée par les sorties committées + ancrage des valeurs de prose re-contrôlé cellule par cellule)
[NanoClaw] — Review CoursIA #18031 (agnosticisme Linux/macOS des 6 notebooks Choco C# — CSP-1/2/3/5/7 + Sudoku-11, EPIC parité #10643, session cloud hors flotte #17713), head f9dac269, 18 fichiers +3558/−1396 (6 notebooks + 12 YAML twins). Protocole v2 : extraction raw contents base↔head, outputs par empreintes uniquement — toutes les cellules changées lues intégralement (7 code + 8 markdown), cellules inchangées intégrées par hash (byte-identiques base↔head, comptes de cellules égaux ×6).
Vérifications exécutées firsthand
- La claim porteuse du retrait du
#rest exacte, re-vérifiée à la source (nuget.org, .nuspec IKVM.Image 8.15.0) : les 3 groupes TFM (.NETFramework4.7.2/net6.0/net8.0) déclarent inconditionnellement les 11 paquetsIKVM.Image.runtime.*— 6 linux (dont les 3 musl), 2 osx, 3 win — en 8.15.0. La restauration transitive couvre donc le RID de n'importe quelle machine ; retirer la référence explicitewin-x64est sûr, etikvm.image.runtime.<rid>sera présent pour le home assemblé. Le « onze paquets » du body est exact, chiffre pour chiffre. - Code de dérivation RID correct et uniforme :
OperatingSystem.IsWindows/IsMacOS→win/osx/linux+RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant()— couvre win-x64, linux-x64, linux-arm64, osx-arm64… (noms d'enum .NET valides en minuscules). Cellule de configuration lue intégralement sur CSP-1 et Sudoku-11 (recette identique #4711 : fusion any/any + natif par copie récursive,AppContext.SetDataavant tout appel Java) ; les 4 autres notebooks portent les mêmes marqueurs (RID calculé, zérowin-x64dur, zéro#rruntime explicite). - L'exécution Linux est prouvée par les sorties committées, pas déclarée : le stream de la cellule de configuration rend
IKVM 8.15.0 pret (home=ikvm-home-8.15.0-linux-x64, tzdb=True)dans CSP-1 ET Sudoku-11 — le RID dérivé est dans la sortie elle-même, ettzdb=Trueprouve que la fusion du home a fonctionné. Séquences d'exécution 1..N strictes, zéro null, comptes 19/23/12/11/17/12 = exactement le claim du body (recompté firsthand). - Anti-régression recompté, pas recopié : zéro occurrence de
ikvmRid = "win-x64"et de#r "nuget: IKVM.Image.runtime.win-x64"dans les 6 notebooks au head ; aucun pattern banni (le premier hit1/0d'un grep naïf était un sous-chaîne de date — faux positif résolu par motif strict). - Ancrage des valeurs de prose (le point que l'organe advisory signale en générique) : la lecture du brute-force CSP-1 cite 2187 combinaisons / 18 solutions / 0,82 % — les trois valeurs sont présentes verbatim dans la sortie committée (
Combinaisons testees : 2187 / Solutions trouvees : 18 / Ratio : 0.82 %), et le temps (1,2 ms dans la sortie) est volontairement non ré-épinglé (« valeur qui dépend de la machine ») — discipline #9434 appliquée dans les deux sens : ancrer ce qui est stable, décrire ce qui ne l'est pas. Les 8 cellules markdown changées sont toutes de la synchronisation documentaire du nouveau mécanisme (en-tête pattern CSP-3, doc config CSP-5, notes techniques Sudoku ×5) — aucune suppression de contenu pédagogique. - État cumulatif sain : balayage de quasi-doublons sur TOUTES les cellules markdown des 6 notebooks au head (124 cellules > 60 car.) — aucune paire au-dessus du seuil. Les sorties re-exécutées différent de la base uniquement sur ce qui doit différer (chemins/temps/RID).
- Registre twins tenu : entrée
known_differences2026-09-27 documentant le drift unilatéral C# (mesure avant correctif, re-exécution, prose #9434) + pins de re-baseline par notebook daté (python_sha du jumeau inchangé piné aussi). Cohérent avec l'historique du registre.
CI au head
Relevée ce tour (bare exit 1) : tout est vert côté contenu — les ~100 contrôles (organes 16+3, CodeQL, gitleaks ± contrôles positifs, twin parity #8057 et SHA mismatch, validate-notebooks, Quarto, golden-set, ratchets base↔PR) passent, corroborés au niveau check-run. La seule rouge est la PR gate (step « Aggregate check verdicts ») : elle a échantillonné une tentative transitoire de l'agrégat des organes rouge à 07:43Z puis repassée verte au même head à 07:48Z (motif vérifié : pas un exit-128 checkout), et le plancher DWELL 120 min n'était pas écoulé (PR âgée de 22 min au moment du relevé). Ré-évaluation attendue une fois le plancher passé — pas un verdict de contenu. Pas d'APPROVE sur une lecture checks non verte (doctrine #17807) → COMMENT.
Valeur de cadrage
Le défaut était borné et déterministe, le correctif l'est aussi : une seule recette de configuration, dupliquée à l'identique, dont le comportement Windows est inchangé (RID calculé = win-x64 sur les machines de la flotte — la lecture du code est identique, seules les sorties re-exécutées diffèrent). Le report des 17 notebooks Tweety (même classe, variantes IKVM 8.14/8.15) dans une PR séparée est le bon découpage : ce paquet-ci reste lisible et auditable en un seul passage.
Review deep — lecture intégrale des cellules changées ×6 notebooks + hash du reste, nuspec vérifié à la source nuget.org, sorties committées re-contrôlées, checks relevés au head (bare exit 1, unique rouge = rollup non-contenu documenté — COMMENT par doctrine). Static depuis ai-01 (pas de dotnet local : exécution vérifiée via les sorties committées et l'organe Golden-Set, pas re-jouée).
|
[ADJOINT PREFLIGHT] Lecture firsthand
VerdictREADY. Note : PR hors-flotte par session cloud d'agnosticisme du mainteneur ; le dossier tiers d'une lane flote (myia-po-2026:CoursIA-2) reste valide car le porteur est explicitement exempt par CLAUDE.md global §agent-cloud-agnosticisme.md. |
…de la machine Tweety-02, 02b, 02c, 3-Advanced-Logics, 3-Conditional-Logics, 3-Dung, 3-ModalLogic et 3-QBF (IKVM 8.14.0 et 8.15.0) codaient le RID win-x64 en dur. Sous Linux, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur Tweety-3-Dung). Le RID est desormais derive de OperatingSystem et de RuntimeInformation.ProcessArchitecture ; la reference NuGet explicite IKVM.Image.runtime.win-x64 est retiree, IKVM.Image (8.14.0 comme 8.15.0) dependant deja des onze paquets IKVM.Image.runtime.<rid>. Meme recette que #18031 pour les notebooks Choco. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, culture et ordre d'affichage d'un ensemble Java. Prose : trois mentions de win-x64 generalisees. Parite jumelle rebaselinee sur les deux paires concernees. Hors flotte (session cloud d'agnosticisme). See #17654. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VuVMY5fhzd5cQhzHiyvjka
…de la machine (#18067) Tweety-02, 02b, 02c, 3-Advanced-Logics, 3-Conditional-Logics, 3-Dung, 3-ModalLogic et 3-QBF (IKVM 8.14.0 et 8.15.0) codaient le RID win-x64 en dur. Sous Linux, l'init de la JVM IKVM echouait au premier appel Java (TypeInitializationException sur IKVM.Runtime.LibJava, mesure sur Tweety-3-Dung). Le RID est desormais derive de OperatingSystem et de RuntimeInformation.ProcessArchitecture ; la reference NuGet explicite IKVM.Image.runtime.win-x64 est retiree, IKVM.Image (8.14.0 comme 8.15.0) dependant deja des onze paquets IKVM.Image.runtime.<rid>. Meme recette que #18031 pour les notebooks Choco. Re-execution complete sous Linux (dotnet-interactive 1.0.617701) : 0 erreur, sorties identiques a la base hors RID du home IKVM, culture et ordre d'affichage d'un ensemble Java. Prose : trois mentions de win-x64 generalisees. Parite jumelle rebaselinee sur les deux paires concernees. Hors flotte (session cloud d'agnosticisme). See #17654. Claude-Session: https://claude.ai/code/session_01VuVMY5fhzd5cQhzHiyvjka Co-authored-by: Claude <noreply@anthropic.com>
Hors flotte : PR de la session cloud d'agnosticisme du mainteneur (branche
claude/*, exemption #17713, rôle décrit dansdocs/reference/agent-cloud-agnosticisme.md). Pas de tagGrain:, pas de lane. See #17654, sous l'EPIC de parité Linux #10643.Summary
win-x64en dur. Sous Linux, le notebook s'arrêtait au premier appel Java. Mesure avant correctif sur un clone vierge (CSP-1) :System.TypeInitializationException: The type initializer for 'IKVM.Runtime.LibJava' threw an exception, à la cellule 34.OperatingSystemetRuntimeInformation.ProcessArchitecture). Les six notebooks s'exécutent de bout en bout sous Linux, et le code se lit à l'identique sous Windows.Changes
Cellule de configuration IKVM, dans les six notebooks :
string ikvmVer = "8.15.0", ikvmRid = "win-x64";est remplacé par un RID calculé :win/osx/linux+-+ l'architecture du processus en minuscules (x64,arm64...), avecusing System.Runtime.InteropServices;.#r "nuget: IKVM.Image.runtime.win-x64, 8.15.0"est retirée : elle est redondante. Le.nuspecdeIKVM.Image8.15.0 déclare déjà comme dépendances les onze paquetsIKVM.Image.runtime.<rid>(win-x64, win-x86, win-arm64, linux-x64, linux-arm64, linux-arm, linux-musl-*, osx-x64, osx-arm64). Ils sont donc restaurés quel que soit le système, et Windows retrouvewin-x64comme avant. Cela fait aussi une restauration NuGet de moins dans la cellule quedocs/reference/dotnet-restore-rfc-17361.mddésigne comme la plus exposée au bug de restauration.Markdown :
CSP-3 (cellule 0), CSP-5 (cellule 2), Sudoku-11 (cellules 1, 6 et 19) décrivaient
IKVM.Image.runtime.win-x64ethome=ikvm-home-8.15.0-win-x64. Ils nomment maintenant<rid>, avec les exempleswin-x64,linux-x64etosx-arm64.Durées machine épinglées dans la prose :
check_machine_dep_timing.pypasse de 5 à 0. C'est le geste notebooks(#9377,#8052): porter le mandat « quantitatif tenu par le CI, pas par la prose » a l'interieur des notebooks — la vague #8052 re-epingle des valeurs qui rebougeront #9434 :La re-exécution contredisait ces valeurs (1.2 ms et 356 ms ici).
Registre de parité jumelle (
scripts/notebook_tools/twin_pairs.d/) :known_differencesdatée dans chacune des six paires ;--update --by claude-cloud:hors-flottepar paire, posée après les strips outillés.Le diff compte 18 fichiers : les 6 notebooks et 12 fichiers de registre (6 YAML de paire et 6 attestations). Une seule fonctionnalité, un seul domaine.
Diagnostic dérive
Les sorties changent entre la base (exécutée sur la flotte, Windows) et cette tête (clone vierge Linux). La comparaison a été faite cellule par cellule, sur le texte des sorties, CRLF normalisés :
11,4→11.4), tempsrésolu en 72 ms→84 ms…)473 ms→356 ms)Classement des causes :
(a) env/kernel, pour trois écarts :
ikvm-home-8.15.0-linux-x64) : c'est l'objet même de la PR.language_info.versionpasse de12.0à13.0sur CSP-1 et CSP-5. Ces deux notebooks avaient été exécutés pour la dernière fois sous un kernel qui déclarait C# 12.0. Le pindotnet-interactive 1.0.617701déclare 13.0, comme 219 des 266 notebooks C# demain(29 déclarent encore 12.0). C'est ce qui fait réagir le garde kernel-drift.Verdict : CAUSE_FIXED. Le RID est la correction ; la version de langage s'aligne sur le pin du dépôt.
(e) mesures de temps non déterministes : ce sont des sorties de chronomètre. Verdict : CAUSE_INTRINSIC. La prose qui les épinglait a été remplacée par des descripteurs (voir Changes).
Les valeurs calculées (solutions, comptes de nœuds, makespans, coûts optimaux, grille Sudoku) sont identiques à la base. Aucune n'a été touchée à la main.
CSP-2, cellule 11 : dotnet-interactive affiche
Loading extensions from `/root/.nuget/packages/skiasharp/…`au premier chargement du paquet.strip_machine_paths.py --scanrend 0 fuite, car le chemin est celui du conteneur, sans nom d'utilisateur. Le ratchet output-failure rend 0 régression.Verdict SOTA : SOTA-OK. Le vrai moteur (Choco-solver 4.10.17 via IKVM) s'exécute. Il n'y a ni substitution ni réimplémentation. L'organe-first ne s'applique pas : rien n'est réimplémenté.
Review Checklist
validate_pr_notebooks.py origin/main(6 PASS),check_output_failure_text.py origin/main(0 regressed),check_output_collapse.pyetcheck_source_collapse.py(0 flagged),check_twin_parity.py --per-pair --base origin/main --check(INTRO=0 ; les 3 PRE sont antérieurs et hors périmètre),check_prose_quantitative_claims.py --diff origin/main...HEAD --strict(OK),check_docs_links.py --check --base origin/main(0 nouveau lien cassé),check_markdown_claims_output.py(43 findings, les mêmes que sur la base : aucun nouveau ; avant la correction de la prose de CSP-1, « 3,9 ms » en était un de plus).notebook_tools.py execute <nb> --kernel .net-csharpsur les six, sous Linux (dotnet-interactive 1.0.617701, .NET 9) : exec_count 19/19, 23/23, 12/12, 11/11, 17/17, 12/12, et 0 erreur. Puisstrip_probe_banner.py --applyetscrub_papermill_paths.py --apply.grep -rl 'ikvmRid = "win-x64"\|IKVM.Image.runtime.win-x64'ne rend plus aucun notebook Choco. Il reste les notebooks Tweety (PR suivante) etSymbolicAI/Tweety/_probes/.Anti-regression
#rredondante retirée, justifiée par le.nuspec.Notebook-specific
raise NotImplementedError/assert False/1/0introduit.execution_countet des sorties cohérentes.Test plan
Sur un poste Linux ou macOS, avec .NET 9 et
dotnet-interactive 1.0.617701:La cellule de configuration doit afficher
IKVM 8.15.0 pret (home=ikvm-home-8.15.0-linux-x64, tzdb=True)(ouosx-arm64), et le notebook doit aller au bout sans erreur. Surmain, il s'arrête à la cellule 34.Sous Windows, le RID calculé vaut
win-x64: c'est le même home qu'avant.Environnement de mesure : conteneur Linux x64, 4 threads, clone vierge. Machine hors flotte : les résultats ne dépendent d'aucun chemin ni d'aucun kernel de la flotte.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VuVMY5fhzd5cQhzHiyvjka