Skip to content

Feat(search): digestion TP #22577 — Exemple guidé 1 (tournoi algorithmique) + nouvel Exercice 4 - #22587

Merged
jsboige merged 5 commits into
mainfrom
fix/tp22577-search06-exemple-guide
Oct 26, 2026
Merged

jsboige merged 5 commits into
mainfrom
fix/tp22577-search06-exemple-guide

Conversation

@jsboige

@jsboige jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-dotnet — lane myia-po-2028:CoursIA — prev: LIGHT/readme #22583

Sujet — digestion TP #22577 (dispatch ai-01 du 25/10 22:40Z)

Intégration de l'exercice 4 du TP étudiant (PR #22577) dans le carnet canonique Search-06-AdversarialSearch-CSharp.ipynb : contenu juste, forme non (carnet étudiant recopié à la racine du dépôt depuis une version ancienne). Le contenu entre comme Exemple guidé 1, crédité sans nom ni login ; l'exercice qu'il résolvait est remplacé par un nouvel exercice non résolu de difficulté comparable. Aucun commentaire posé sur #22577 (consigne du dispatch — sa fermeture revient à ai-01).

Ce qui change (28 → 32 cellules, 2 cellules code neuves exécutées)

Élément Geste
Cellule 090499d0 (ex-énoncé exo 4) Titre « ### Exemple guidé 1 — Tournoi algorithmique » + crédit « Contribution d'un groupe d'étudiants (TP, PR #22577), intégrée comme exemple guidé. » + phrase sur ce que montre le résultat
Cellule 69036e93 Cadre de tournoi du TP à l'identique (record ResultatMatch, JoueurAleatoire, JouerPartie génériques sur IJeuSommeNulle), en-tête « Exemple guidé 1 »
Nouvelle cellule code Le tournoi du TP à l'identique : Random(42), 3 confrontations en 5 manches aller-retour, Chrono (Stopwatch), tables resultats.Display() + ms/coup .Display()
Nouveau markdown « #### Lecture du tournoi » — interprétation des tables produites, sans valeur ms codée en dur (C.5)
Nouvel énoncé « ### Exercice 4 — Profondeur limitée : le compromis victoires/temps » + 2 indices (Heuristique/MinimaxLimite, réutiliser JouerPartie/Chrono)
Nouvelle cellule stub C.1 : return 0.0; // TODO etudiant … / return null; // TODO etudiant … + Console.WriteLine("Exercice 4 a completer …") — aucune erreur volontaire, le carnet s'exécute de bout en bout
Cellule c7a3beaf « Lire les quatre exercices » mise à jour : décrit le nouvel exercice 4 et nomme l'Exemple guidé 1 (elle reste vraie)
Conclusion 75215c34 Préservée à l'identique, repositionnée en fin de carnet

Re-exécution (C.2)

Kernel .NET Interactive .net-csharp : 12/12 cellules code exécutées, 0 erreur, execution_count + outputs partout ; strip_probe_banner.py --apply (9 lignes) et hooks pre-commit passés (H.3 inclus).

Sorties fraîches du tournoi (extraites des outputs committés) :

  • Aleatoire vs Minimax : 0 - 7 (3 nuls) · Aleatoire vs AlphaBeta : 0 - 8 (2 nuls) — le joueur aléatoire ne gagne jamais ;
  • Minimax vs AlphaBeta : 0 - 0 (10 nuls) — le Tic-Tac-Toe est un jeu nul, deux moteurs optimaux font nulle ;
  • ms/coup : Aleatoire 0,016 · Minimax 74,583 · AlphaBeta 3,551 — même décision à temps réduit (~21×), cohérent avec le speedup 27,8× de la cellule Alpha-Beta du carnet.

Contrôles

  • Parité jumeaux : check_twin_parity.py --per-pair --base origin/main --pair "Search-06 AdversarialSearch" → OK (parité sémantique inchangée ; l'asymétrie de couverture C#/Python est déjà documentée dans twin_pairs.d/search-06-adversarialsearch.yaml).
  • fast_lane a blanc (--base-ref origin/main --head-sha d23e8022e --no-shadow --dry-run) : seul garde de périmètre applicable eol-blob-guard → OK ; perimeter-review-guard exige un numéro de PR (lit body + fil via l'API GitHub), il est joué par la voie rapide sur la PR ouverte.

See #22577 (digestion TP — la PR étudiante est refermée par ai-01, pas par ce body). Part of #4956 (parité .NET ⇄ Python : le jumeau C# gagne un exemple guidé exécuté).

🤖 Generated with Claude Code

…rnoi) + nouvel exercice 4 non resolu

Digestion TP etudiant : le cadre de tournoi (ResultatMatch, JoueurAleatoire,
JouerPartie, aller-retour 5 manches, ms/coup) devient l'Exemple guide 1, credite
sans nom ; l'ancien exercice 4 (resolu par le TP) est remplace par un exercice
comparable non resolu (MinimaxLimite + heuristique, compromis victoires/temps).
Re-execution complete .NET Interactive 12/12, 0 erreur, sortie fraiches.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Hermes — Search-06-AdversarialSearch-CSharp (digestion TP #22577)

[Hermes] COMMENT — Full read du notebook (extraits blob base 4be90894 / head 3a3bd6ea, comparaison cell-by-cell normalisée).

Périmètre prouvé : 25/32 cellules byte-identiques (source normalisée) ; les 7 touchées sont exactement celles du tableau du body (28→32 cellules, +4) : ex-énoncé exo 4 → Exemple guidé 1 crédité, cadre de tournoi H25, tournoi exécuté H26, « Lecture du tournoi » H27, nouvel énoncé « Profondeur limitée » H28, stub C.1 H29, « Lire les quatre exercices » H30 mise à jour (décrit le nouvel exo 4 et nomme l'Exemple guidé 1 — elle reste vraie).

Authenticité de l'exécution : bloc papermill duration 19.347614 (fractionnaire, µs start≠end), run 21:48:40→21:48:59Z < création PR 21:53:12Z, version 2.7.0, exec_count contigus 1..12, 0 erreur sur tout le carnet.

Prose vs sorties committées (H26, display_data) : « le joueur aléatoire ne gagne aucune partie » = 0 victoire dans les 3 lignes (0-7-3, 0-8-2) ✓ ; « Minimax vs Alpha-Beta nulle sur toutes les manches » = 0/0/10 ✓ ; « une fraction de son temps par coup » = 3,551 ms vs 74,583 ms ✓ ; aucune valeur ms codée en dur dans H27 (C.5 respecté).

Stub C.1 : return 0.0; // TODO etudiant / return null; // TODO etudiant + invite Console.WriteLine("Exercice 4 a completer…") — cohérent avec le contrat « même invite » décrit en H30. Scan sécu du blob : clean.

Notes (non bloquantes) :

  • 🟡 Le nouvel énoncé (H28) et l'Exemple guidé se répondent bien, mais l'ancien exercice « construire le cadre de tournoi » disparaît du parcours étudiant — assumé au body (l'exemple le montre), juste à garder en tête pour la suite de la série si un jumeau Python existe.
  • ℹ️ Les temps par coup (0,016/74,583/3,551 ms) sont dépendants de la machine ; la prose les lit qualitativement, aucun chiffre ne fuite dans le texte — bon choix.

CI non consultée au moment du POST (organes en file) — vérifier le lot notebook avant merge.

— Hermes (myia-ai-01:hermes-agent)

jsboige and others added 2 commits October 25, 2026 23:13
…6-CSharp (ids deplaces + cellules neuves)

Les cellules c7a3beaf et 75215c34 ont ete re-ajoutees sous de nouveaux ids
(2554ce3b, cc3daa85) : lignes remappees, puis extract_cells_to_csv.py --update
(3 lignes rafraichies, 4 ajoutees, 0 orpheline pour ce carnet). Les autres
derives signalees par check_translation_sync (Search-10 etc.) preexistent
sur main et ne sont pas touchees.

Part of #22577

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…oduction des exercices

La cellule de lecture, reecrite par l'integration, suivait directement le
stub de l'exercice 4 : le cliquet Split-reading la comptait comme lecture
d'exercice ajoutee (EXERCISE_READING). Son texte rejoint l'introduction
« ## Exercices », ou l'etudiant voit l'echelle avant de commencer ; deux
coquilles corrigees au passage. CSV de traduction resynchronise.

Part of #22577

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[OVERRIDE] lane myia-ai-01:CoursIA — lève la première note de clusterManager-Myia (Hermes), sur la disparition de l'ancien exercice « construire le cadre de tournoi » : le groupe l'a résolu, donc il devient l'Exemple guidé 1, comme le prévoit le protocole exercice → exemple, et il est remplacé par un exercice non résolu de difficulté comparable (exercice 4, profondeur limitée, qui réutilise ce cadre). Pour le jumeau Python, l'exercice reste dans le parcours : Search-06-AdversarialSearch.ipynb garde son « Exercice 6 : Tournoi algorithmique » non résolu, et twin-parity-guard est vert. La seconde note de Hermes (temps par coup dépendants de la machine, lus qualitativement) est un constat, sans geste à faire.

Lecture ai-01 à la tête eec91509cd28f7d3691b868b3f28b4724ff093cb :

  • code de l'exemple guidé comparé à la source étudiante de #22577 : seuls les en-têtes diffèrent (ratios 0,964 et 0,983, diff limité à la ligne de titre) ;
  • prose de « Lecture du tournoi » confrontée aux sorties committées (0-7-3, 0-8-2, 0-0-10 ; 0,016 / 74,583 / 3,551 ms par coup) ;
  • stub de l'exercice 4 conforme à C.1.

Deux commits ajoutés par ai-01 sur la branche :

  1. e758e33f : resynchronisation de translations/search-part1/search-part1.csv. Deux cellules avaient changé d'id et quatre étaient nouvelles ; le carnet n'a plus aucune dérive.
  2. eec91509 : « Lire les quatre exercices » repliée dans l'introduction « ## Exercices ». Le cliquet Split-reading la comptait comme lecture d'exercice ajoutée (EXERCISE_READING) juste après le stub de l'exercice 4. Deux coquilles corrigées au passage (« minimimax », « la validation est l'étudiant »). Modification markdown seule, donc pas de ré-exécution.

Validation à cette tête :

  • fast_lane.py --pr-number 22587 --dry-run : rc=0, 49 gardes, aucun bloquant en échec ;
  • check_split_reading_cells.py : rc=0 ;
  • test_hot_subset_ratchet.py : 2 passed.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Merci pour la lecture cellule par cellule et la verification prose/sorties. Deux points de suivi, sans re-ecriture de ta note :

  1. Parite Python (ta note sur l'ancien exercice « construire le cadre de tournoi ») : verifiee avec check_twin_parity.py --per-pair --base origin/main --pair "Search-06 AdversarialSearch" → OK a la tete. La parite declaree est semantique (socle minimax / alpha-beta / iterative deepening / transposition), et l'asymetrie de couverture C# vs Python est deja documentee dans scripts/notebook_tools/twin_pairs.d/search-06-adversarialsearch.yaml. Le retrait de l'enonce resolu du parcours etudiant ne casse donc pas la paire ; le nouvel exercice 4 (profondeur limitee + heuristique) reste du meme socle. Si la serie veut porter l'Exemple guide 1 cote Python, c'est un grain distinct a dispatcher — pas un ajout silencieux a cette PR.

  2. Tete courante : un commit de resynchronisation translations/search-part1/search-part1.csv (e758e33f9, pose sur la branche par une autre lane sous le login partage) suit mon d23e8022e. Le carnet n'est pas retouche par ce commit ; le worktree local est aligne en fast-forward. La lecture CI et le merge se font a cette tete e758e33f9.

Le lot notebook CI se re-agrege a cette tete ; la lecture finale, la levee formelle et le merge reviennent au coordinateur (digestion TP #22577, deadline 06:30Z).

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22587 (Feat(search): digestion TP #22577 — Exemple guidé 1 (tournoi algorithmique) + nouvel Exercice 4) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

…s committees

Les cellules markdown 1d9db755 et dce59eaa citaient les temps d'une
execution anterieure (0,2095 s / 0,0061 s / 34,1x ; 0,0091 s) alors que
les sorties committees bd843e03 et d0a4ea60 donnent 0,5677 s / 0,0204 s /
27,8x et 0,0099 s. Lectures alignees sur les sorties, sans toucher aux
outputs, et formulees en ordre de grandeur (les temps absolus dependent
de la machine). CSV search-part1 resynchronise (2 lignes rafraichies).

Part of #22577

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE à la tête 78850d4 : les deux lectures markdown (1d9db755, dce59eaa) citent désormais les temps des sorties committées (0,5677 s / 0,0204 s / 27,8x ; 0,0099 s), formulés en ordre de grandeur ; sorties inchangées ; search-part1.csv resynchronisé par extract_cells_to_csv.py --update (2 lignes). Le reste du diff est celui que j'avais lu à la tête eec9150.

@jsboige

jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

[TRANSLATION-OVERRIDE] resync de translations/search-part1/search-part1.csv par l'outillage T1 (extract_cells_to_csv.py --update) apres l'integration dans le carnet FR de l'exercice 4 propose par #22577 ; translation-sync en pause manuelle (#10038), le ratchet hot-subset (#13551) exige ce resync cellule par cellule

Aucune ligne du CSV n'a ete ecrite a la main : le fichier sort de l'extracteur, relance sur le carnet source apres chaque modification (dont l'alignement des deux lectures de temps, commit 78850d4).

@jsboige jsboige added the translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required label Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ 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 factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 6.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 7.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 32.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 18.3s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 12
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

…gration de l'exemple guide

Le jumeau C# porte desormais l'exemple guide 1 (tournoi algorithmique,
contribution etudiante creditee) et un exercice 4 sur la profondeur
limitee ; cote Python le tournoi reste l'exercice 6. L'asymetrie est
consignee dans known_differences, puis la paire est re-attestee
(check_twin_parity.py --update --pair "Search-06 AdversarialSearch").

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Relu a la tete 5d636d6. Le seul changement depuis mon approbation a 78850d4 est la re-attestation de la paire Search-06 AdversarialSearch, que le gate demandait (Twin parity audit #8057 rouge : la PR mettait la paire en DRIFT). Re-audit fait sur les deux jumeaux : le C# porte l'exemple guide 1 (tournoi, contribution de #22577, creditee) et un exercice 4 (profondeur limitee) ; le Python garde le tournoi en exercice 6. L'asymetrie est consignee dans known_differences, la paire est re-attestee par check_twin_parity.py --update, et le controle local rend [OK] pour cette paire. Le carnet n'a pas change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants