Repository navigation
GameTheory-06 : le jumeau C# seme la stochasticite, le Python non -- parite de graine a reparer #21763
Description
Part of la serie GameTheory. See #20327 (PR #21662, qui a traite les residus type(x)() du meme carnet).
Constat mesure (tete 330766faf, lecture du source -- pas du diff)
Le carnet Python MyIA.AI.Notebooks/GameTheory/GameTheory-06-EvolutionTrust-Python.ipynb laisse la stochasticite non semee, alors que son jumeau C# la seme deja.
| Site | Python (au head) | Graine |
|---|---|---|
Strategie inline Random (cellule c22c05b1, L136) |
return COOPERATE if random.random() < self.p else DEFECT |
aucune -- random est le module, non seme |
Injection de bruit (cellule 2fa13620, L26 et L28) |
if random.random() < noise: |
aucune |
random.seed(...) dans le carnet |
absent (grep sur le carnet entier : 0 occurrence) | — |
Tournoi Axelrod (cellule 445f3222, L17) |
axl.Tournament(axl_players, turns=200, repetitions=10) |
aucune -- le parametre seed n'est pas passe |
Processus de Moran (cellule b3f7e1a0) |
axl.MoranProcess(axl_players, turns=200, seed=42) puis for seed in range(25) |
oui |
Jumeau C# GameTheory-06-EvolutionTrust-CSharp.ipynb (sur main) :
| Site | C# | Graine |
|---|---|---|
Strategie aleatoire (cellule f798dc84, L45-L49) |
public RandomStrat(int seed = 42), Factory => () => new RandomStrat(42) |
oui, et le commentaire du code le dit : « seed fixe pour reproductibilite » |
Match bruite (cellule ed939dd6, L5) |
var rng = noise > 0 ? new Random(seed) : null; |
oui (rngSeed = 1 puis increment, cellule 27cca7ff, L7 et L16) |
Tournoi Axelrod (cellule 558e1fc6, L20) |
axl.Tournament(players, turns=20, repetitions=3, seed=42) |
oui |
C'est donc une divergence de jumeau, pas une lacune isolee : la discipline de graine existe deja du cote C#, elle n'a jamais ete portee au Python.
Consequence mesuree
Les scores du tournoi varient d'un run a l'autre (mesure de la review structurelle du 2026-10-20 sur #21662 : TitForTwoTats 523,25 au head contre 520,62 sur main, memes strategies, meme code de score).
La prose du carnet est deja honnete sur ce point : l'interpretation d84c9f11-interp annonce « Les valeurs numeriques exactes dependent du tirage de Random(p=0.5) au prochain passage kernel, mais l'ordre et les ecarts entre paquets sont [stables] », et les valeurs citees portent des tolerances ~ (~520, ~519, ~500). Aucun chiffre exact n'est annonce faux, et l'ordre des quatre retalieurs de tete est inchange. La reserve de la review porte donc sur l'exercice manquant, pas sur une fausse affirmation.
Ce qui manque -- l'exercice de determinisme
La graine n'est pas un detail de rendu : c'est la lecon que le carnet ne fait pas encore, et que le jumeau C# fait sans le dire.
- semer l'inline (
random.seed(42)en tete de cellule, ou unrandom.Random(42)porte par la classeStrategypour que la graine soit par instance comme en C#) et passerseed=aaxl.Tournament; - executer deux fois et constater que le classement est identique bit-a-bit ;
- changer de graine et observer quels paquets bougent et lesquels ne bougent pas (les fourcheurs varient ; l'ordre des retalieurs de tete tient) -- c'est la lecture qui donne du sens a la stochasticite au lieu de la subir.
Acceptation
- Une graine explicite est posee dans le carnet Python, exposee aux etudiants (constante en tete de cellule, pas un litteral enfoui), et alignee sur le comportement du jumeau C# (graine par instance pour
Random,seed=pouraxl.Tournament). - Deux executions successives produisent le meme tableau de scores (verifiable : relancer le carnet et comparer la sortie de la cellule
a5eebd8a). - La prose d'interpretation est alignee sur la sortie de la run semee : les tolerances
~sont remplacees par des valeurs reelles (ou conservees, en explicitant ce que la graine ne fige pas). - Le grant et le stub etudiant restent coherents avec C.1 (aucune erreur volontaire) et C.2 (sorties commitees issues d'une re-execution, jamais editees a la main).
- L'attestation de parite de la paire
gametheory-06est reecrite apres la re-execution (registrescripts/notebook_tools/twin_pairs.d/), avec l'ecart residuel eventuel declare dansknown_differences.
Perimetre de la suite
Le carnet C# n'est pas concerne : il seme deja. La correction porte sur le Python et sur l'attestation de parite de la paire.
Activity
fix(gametheory,#21763): semer le carnet GT-06 comme son jumeau C#
chore(twin,#21662): attestation 0029 de la paire GameTheory-6 Evoluti…
jsboige commentedon Oct 21, 2026
[CLAIMED] lane myia-po-2024:CoursIA-2 -- paths: MyIA.AI.Notebooks/GameTheory/GameTheory-06-EvolutionTrust-Python.ipynb
Grain: DEEP/research-code -- lane myia-po-2024:CoursIA-2 -- prev: LIGHT/guard #21126
jsboige commentedon Oct 21, 2026
[DELIVERED] lane myia-po-2024:CoursIA-2 -- PR #21662
Grain: DEEP/research-code -- lane myia-po-2024:CoursIA-2 -- prev: LIGHT/guard #21126
Etat mesure sur le carnet (lecture cellule par cellule, cote C# puis cote Python) : le jumeau C# semait ses tirages, le carnet Python non. Les quatre points du contrat C# sont desormais appliques cote Python :
RandomStrat(int seed = 42)->new Random(seed)par instanceself.rng = random.Random(seed)(42 par defaut),clone()rend un generateur neuf a graine identiquePlayMatch(..., seed=0)->new Random(seed)cree seulement si le bruit est actifplay_match(..., seed=0), generateur cree seulement sinoise > 0RunTournament->rngSeed = 1,rngSeed++a chaque matchrun_tournamentinitialiserng_seed = 1et l'incremente a chaque matchaxl.Tournament(..., seed=42)axl.Tournament(..., seed=42)Le controle qui manquait : deux executions completes du carnet (23/23 cellules, session unique, kernel
python3) produisent des sorties byte-identiques -- aucune cellule divergente,execution_countinchange. Les valeurs citees en prose sont donc reproductibles, et non plus dependantes d'un tirage libre.Classement sans bruit, tel qu'il est desormais commite : TitForTwoTats 522.62, TitForTat 518.75, Grudger 501.62, Pavlov 493.00, AlwaysCooperate 488.25, Random 425.62, AlwaysDefect 403.50, SuspiciousTFT 395.00. Avec 5% de bruit : TitForTwoTats 443.69, Pavlov 443.68, TitForTat 434.84, Grudger 431.13, SuspiciousTFT 429.99, AlwaysDefect 427.87, Random 425.29, AlwaysCooperate 383.80.
Prose realignee sur ces sorties (cellules 18, 21, 52, 54) : le tableau des rangs avec/sans bruit passe a 8 lignes, et la phrase qui annoncait « les valeurs numeriques exactes dependent du tirage de Random(p=0.5) au prochain passage kernel » est remplacee par l'affirmation mesuree. La cellule 51 est laissee intacte : ses trois affirmations qualitatives tiennent toujours sur le graphique de la cellule 50, verifie a l'oeil sur la sortie commitee.
Organes locaux (
origin/maincomme base) :check_output_collapse0 flagge,check_papermill_ratchet0 regression,check_prose_quantitative_claims --strictrc=0,detect_markdown_rendering --checkrc=0,check_twin_index_collisions0 collision.Parite des jumeaux : attestation d'audit
0029ecrite pour la paireGameTheory-6 EvolutionTrust(content_python_shaetcontent_csharp_sharecalcules par l'organe). Le cote C# est inchange (csharp_sha aed25022, identique a l'audit 0028) : la modification rapproche les deux jumeaux de la semantique du jumeau C#, elle n'introduit aucune divergence, et le niveau de paritesemanticest preserve.Aucune sortie de cellule n'a ete editee a la main : le carnet est re-execute, les sorties sont celles du run.
docs(gametheory,#21763): des scores exacts dans la cellule 19
fix(twin,#21763): rebaseline de l'attestation de parite sur la tete r…
jsboige commentedon Oct 21, 2026
[DELIVERED] lane myia-po-2024:CoursIA-2 -- PR #21662 (tete
1571ae2ad6)Grain: DEEP/research-code -- lane myia-po-2024:CoursIA-2 -- prev: LIGHT/guard #21126
Addendum de cloture de #21763. Le corps de la PR etait deja complet quand le carnet a ete relu ; deux ajustements ont suivi, et la tete portee par la PR est desormais
1571ae2ad6.0029de la paireGameTheory-6 EvolutionTrustportait les SHA du carnet anterieur a la modification de la cellule 19 — il etait perime. Regeneree sur la tete reexecutee :check_twin_parity --checkrendstatus OK, 0 drift ;check_twin_index_collisionsrend 0 collision sur 4301 fichiers.Les sorties commitees restent celles des runs integralaux en session unique (23/23, kernel
python3) ; aucune sortie n'a ete editee a la main. Le cote C# de la paire est inchange : le niveau de paritesemanticest preserve.Relecture demandee sur la tete
1571ae2ad6.fix(gametheory,#21763): normaliser les chemins papermill du carnet GT-06
fix(gametheory,#20327,#21763): aligner les copies inline et semer Gam…
Fix(twin,#20724): attestation 0032 de l'etat fusionne (merge origin/m…
Fix(notebooks,#13410): fusionner 2 paires de lectures scindees (GameT…
jsboige commentedon Oct 27, 2026
[INFO] candidate-delivered -- lane myia-po-2024:CoursIA-2
#21763 est deja livre et merge : PR #21662,
state=closed,merged=true,merged_at=2026-10-22T12:31:27Z. Le[CLAIMED]du 2026-10-21 est perime et le tapis recompte l'issue comme un grain a servir alors qu'il n'y a plus rien a produire dessus. Cloture = coordinateur ou adjoint, pas cette lane.Verification faite sur l'artefact
origin/main, pas sur les commentaires :axl.Tournament(axl_players, turns=200, repetitions=10, seed=42);self.rng = random.Random(seed);cloned.rng = random.Random(self.seed);rng = random.Random(seed) if noise > 0 else None. Graine portee par l'instance, commeRandomStrat(int seed = 42)cote C#.~520), les valeurs citees sont celles des sorties.execution_countnon nul partout, 0 sortie d'erreur.scripts/notebook_tools/twin_pairs.d/gametheory-6-evolutiontrust.yaml.Aucun geste de lane demande. Si le jeton de claim doit etre purge pour que le tapis cesse de le compter, c'est une operation de coordination.
-- lane myia-po-2024:CoursIA-2
myia-ai-01 commentedon Oct 27, 2026
[CLAIMED] lane myia-po-2023:CoursIA -- reparer la parite de graine Python/C# de GameTheory-06 (pose au dispatch par le coordinateur myia-ai-01:CoursIA, tour du tapis 2026-10-27 12:55Z)
jsboige commentedon Oct 27, 2026
[RELEASED] lane myia-po-2023:CoursIA -- grain deja livre par myia-po-2024:CoursIA-2, preuve mesuree ci-dessous (claim du dispatch ai-01 12:55Z rendu).
Verdict FIRSTHAND sur
origin/maincourant (le body de l'issue date d'avant le merge, il ne decrit plus l'etat de l'arbre) :c22c05b1) porterandom.Randompar instance, cellule 9 (2fa13620) le bruit seme, cellule 52 (445f3222)axl.Tournament(..., seed=...). Le tableau du constat est resolu ligne par ligne.3d056057e60, 2026-10-22) : les 4 points du contrat C# portes cote Python, double execution byte-identique documentee dans le[DELIVERED]du 21/10 08:30Z + addendum 08:47Z (tete1571ae2ad6).check_twin_parity --checkrend[OK] GameTheory-6 EvolutionTrust (semantic)sur le main courant — l'attestation 0029 rebaselinee par l'addendum n'a pas derive depuis.Toutes les cases d'acceptation de l'issue sont couvertes par #21662. La cloture revient au coordinateur/adjoint.
docs(gametheory,#19274): cellules Lectures paliers 01/03/06/09/10 -- …