Skip to content

GameTheory-06 : le jumeau C# seme la stochasticite, le Python non -- parite de graine a reparer #21763

Open

Description

@jsboige

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.

  1. semer l'inline (random.seed(42) en tete de cellule, ou un random.Random(42) porte par la classe Strategy pour que la graine soit par instance comme en C#) et passer seed= a axl.Tournament ;
  2. executer deux fois et constater que le classement est identique bit-a-bit ;
  3. 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= pour axl.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-06 est reecrite apres la re-execution (registre scripts/notebook_tools/twin_pairs.d/), avec l'ecart residuel eventuel declare dans known_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

  1. added 2 commits that reference this issue on Oct 21, 2026
  2. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    [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

  3. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    [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 :

    Point Jumeau C# (verifie dans la source) Carnet Python (apres)
    Strategie aleatoire RandomStrat(int seed = 42) -> new Random(seed) par instance self.rng = random.Random(seed) (42 par defaut), clone() rend un generateur neuf a graine identique
    Bruit par match PlayMatch(..., seed=0) -> new Random(seed) cree seulement si le bruit est actif play_match(..., seed=0), generateur cree seulement si noise > 0
    Bruit sur un tournoi RunTournament -> rngSeed = 1, rngSeed++ a chaque match run_tournament initialise rng_seed = 1 et l'incremente a chaque match
    Tournoi de la librairie axl.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_count inchange. 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/main comme base) : check_output_collapse 0 flagge, check_papermill_ratchet 0 regression, check_prose_quantitative_claims --strict rc=0, detect_markdown_rendering --check rc=0, check_twin_index_collisions 0 collision.

    Parite des jumeaux : attestation d'audit 0029 ecrite pour la paire GameTheory-6 EvolutionTrust (content_python_sha et content_csharp_sha recalcules 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 parite semantic est preserve.

    Aucune sortie de cellule n'a ete editee a la main : le carnet est re-execute, les sorties sont celles du run.

  4. added 2 commits that reference this issue on Oct 21, 2026
  5. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    [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.

    • Cellule 19 : les trois scores du classement passent de la tolerance « ~520 / ~519 / ~500 » aux valeurs exactes (TitForTwoTats 522.62, TitForTat 518.75, Grudger 501.62). La phrase qui rappelait que « les valeurs exactes dependent du tirage au prochain passage kernel » est remplacee par l'affirmation mesuree : la graine est fixee, un second passage kernel rend exactement ces valeurs. La reserve de non-reproductibilite de la relecture structurelle est donc close sur le fond, pas seulement sur la forme.
    • Attestation de parite rebaselinee : l'audit 0029 de la paire GameTheory-6 EvolutionTrust portait les SHA du carnet anterieur a la modification de la cellule 19 — il etait perime. Regeneree sur la tete reexecutee : check_twin_parity --check rend status OK, 0 drift ; check_twin_index_collisions rend 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 parite semantic est preserve.

    Relecture demandee sur la tete 1571ae2ad6.

  6. added a commit that references this issue on Oct 21, 2026
  7. added a commit that references this issue on Oct 22, 2026
  8. added a commit that references this issue on Oct 22, 2026
  9. added a commit that references this issue on Oct 26, 2026
  10. jsboige commented on Oct 27, 2026

    @jsboige
    OwnerAuthor

    [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 :

    • Graine explicite cote Python, alignee sur le jumeau C# : 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, comme RandomStrat(int seed = 42) cote C#.
    • Deux executions rendent le meme tableau : les sorties committeess portent les valeurs exactes 522.62 (TitForTwoTats), 518.75 (TitForTat), 501.62 (Grudger), 493.00 (Pavlov), 488.25 (AlwaysCooperate).
    • Prose alignee sur la run semee : les tolerances ont disparu de l'artefact (0 occurrence de ~520), les valeurs citees sont celles des sorties.
    • C.1 / C.2 : 23 cellules de code, execution_count non nul partout, 0 sortie d'erreur.
    • Attestation de parite presente : 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

  11. myia-ai-01 commented on Oct 27, 2026

    @myia-ai-01
    Collaborator

    [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)

  12. jsboige commented on Oct 27, 2026

    @jsboige
    OwnerAuthor

    [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/main courant (le body de l'issue date d'avant le merge, il ne decrit plus l'etat de l'arbre) :

    1. Graine partout, mesure dans le source : cellule 6 (c22c05b1) porte random.Random par instance, cellule 9 (2fa13620) le bruit seme, cellule 52 (445f3222) axl.Tournament(..., seed=...). Le tableau du constat est resolu ligne par ligne.
    2. Livrée par PR fix(gametheory,#20327,#21763): aligner les copies inline et semer GameTheory-06 comme son jumeau C# #21662 (merge 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 (tete 1571ae2ad6).
    3. Attestation a jour aujourd'hui : check_twin_parity --check rend [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.

  13. added a commit that references this issue on Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions