Skip to content

feat(notebooks,#18393): deux textes, deux sequences -- la selection deleguee demontree - #20338

Open
jsboige wants to merge 4 commits into
mainfrom
feature/18393-delegating-strategy
Open

jsboige wants to merge 4 commits into
mainfrom
feature/18393-delegating-strategy

Conversation

@jsboige

@jsboige jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA-2 — prev: MED/test #20332

Summary

Livre les deux points que l'issue #18393 demandait, en une seule PR (meme branche, deux commits) :

  1. DelegatingSelectionStrategy vendoree dans argumentation_lib (commit 7284a39ef2) — copie verbatim de strategies.py du tronc EPITA (ecfd9b9, MIT), en-tete citant source/commit/licence + perimetre d'adaptation documente.
  2. Demonstration executee : deux textes contrastes traversent le meme pipeline a selection deleguee et produisent deux sequences d'agents differentes (ce commit).

Criteres de l'issue #18393 — preuve par critere

Critere Preuve
Le journal contient ≥1 designation du PM lue dans l'etat Trace de selection : InformalAgent, LogicAgent, ProjectManagerAgent marquees lu dans l'etat -> selectionne (sortie de la cellule 4.3, 2 executions reelles)
2 textes → 2 sequences differentes Texte A : PM -> Informal -> PM -> Logic -> PM (analyse formelle engagee) · Texte B : PM -> Informal -> PM -> PM -> PM (LogicAgent jamais invoque) — sequences A != B : True
Sans cle API : message explicite (pas de fallback silencieux) Deja porte par la cellule de setup (§4.2) : RuntimeError si OPENAI_API_KEY/OPENAI_CHAT_MODEL_ID absents — outputs committes inchanges

Ce que la demonstration change

Le levier vit dans PROMPT_DEFINE_TASKS (_runner.py). Version initiale (permissive) : « si aucun sophisme n'a ete detecte [...] vous POUVEZ sauter l'analyse formelle ». Mesure : deux executions reelles ont produit la meme sequence — le PM definissait la tache de formalisation malgre la permission (un texte percu comme propre s'est meme vu attribuer 3 sophismes par l'analyste informel, fallacy_count: 3).

La regle est donc devenue une directive a deux signaux : analyse formelle seulement si (a) un sophisme a ete detecte dans l'etat, ou (b) le texte porte une inference conditionnelle a verifier. Texte B reecrit en notes de version factuelles (ni visee persuasive, ni conditionnel). Deux executions consecutives divergent alors de facon stable.

Chemin d'echec honnete (montre dans la trace)

Sur le texte B, le PM ecrit deux fois « ProjectManager » — un nom absent du registre d'agents. La strategie ne devine pas : elle journalise l'erreur dans l'etat (error_1, error_2), retombe sur l'agent par defaut et poursuit la conversation. Une designation non resolue est tracee, jamais silencieuse (#1751).

Validation

  • Execution reelle : 2 appels reseau LLM complets par texte via la passerelle du cluster (glm-5.2), plafond 6 tours, 0 erreur. La cellule consomme les vraies sorties de cette execution (C.2).
  • Tests : suite argumentation_lib verte apres modification du prompt.
  • Organes : check_exec_sequence.py → CLEAN (1..11) · check_cell_source_parses → 0 finding · check_interp_positioning → 0 · check_duplicate_sections → 0 · prose-counts → aucun compteur quantitatif en prose.
  • execution_count renumérote positionnellement (1..11) — la cellule 4.3 est la 8e cellule de code.

Limite assumee

Les decisions du PM sont stochastiques : rejouer la cellule peut donner des traces legerement differentes. Le mecanisme — deux contenus differents, deux routages differents — ne depend pas d'un tirage ; la trace committee est une execution reelle, non un exemple fabrique.

Perimetre

  • MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/argumentation_lib/ : _delegating_selection.py (nouveau), _runner.py, __init__.py — commit 7284a39ef2
  • MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-07-Orchestration-Python.ipynb : section 4.3 (3 cellules) + prose 4.2 mise a jour

See #18393 — cloture au coordinateur/adjoint apres verification des criteres.

🤖 Generated with Claude Code

jsboige and others added 2 commits October 11, 2026 08:01
…chestrateur conversationnel

- argumentation_lib/_delegating_selection.py : vendoring verbatim depuis
  jsboigeEpita strategies.py L134-246 (commit ecfd9b9, MIT, en-tete SHA),
  adaptations documentees : record_unresolved_designation absent (#14026)
  -> state.log_error (#1751 : une ligne de log n'est pas un effet) ;
  selection_trace pour le journal du carnet.
- _runner.py : PROMPT_DEFINE_TASKS gagne la regle de routage (saut de
  l'analyse formelle si aucun sophisme) + l'instruction d'appeler
  StateManager-designate_next_agent ; AnalysisRunner.run_conversational()
  monte UN AgentGroupChat (PM+Informal+Logic) a selection deleguee.
- La fonction kernel designate_next_agent existait deja (plugin L416) :
  doublon introduit puis retire, l'existante fait foi.

Smoke test sans LLM (defaut/designation honoree/non resolue tracee) ;
141 tests passed (runner+plugin+state). Cellules carnet 2 textes
contrastes : livraison suivante.

See #18393

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…eleguee demontree

Section 4.3 du carnet d'orchestration : deux textes contrastes traversent le
meme pipeline a selection deleguee (DelegatingSelectionStrategy).

- Texte A (sophismes + conditionnel) : le PM designe LogicAgent, l'analyse
  formelle a lieu.
- Texte B (notes de version factuelles) : aucun sophisme, aucun conditionnel
  -- le PM saute l'analyse formelle, LogicAgent n'est jamais invoque.

La regle de routage du PM (_runner.py, PROMPT_DEFINE_TASKS) passe d'une
permission vague a une directive a deux signaux : analyse formelle seulement
si un sophisme a ete detecte OU si le texte porte une inference conditionnelle.
La trace d'execution montre aussi le chemin d'echec honnete : deux
designations non resolues ("ProjectManager") sont journalisees dans l'etat
(error_1, error_2) et la strategie retombe sur l'agent par defaut.

Sorties reelles : 2 executions LLM completes, 0 erreur, sequences A != B.
execution_count renumérote positionnellement (1..11, organe CLEAN).

See #18393

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

@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

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

github-actions Bot commented Oct 11, 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.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 21.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.1s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 15.3s

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

…ion-07

Le carnet a ete re-execute par un kernel local (l'hote MCP jupyter etant mort),
qui reecrit les sorties mais laisse le bloc `metadata.papermill` de la passe
ANTERIEURE. Un bloc inchange a cote de sorties fraiches date ces sorties au
mauvais run, et le ratchet le classe STALE_BLOCK (regression).

Mesure : le bloc de tete annoncait 2026-10-03T09:44:39 -> 09:53:02 (duree
503 s), soit huit jours avant les sorties qu'il pretendait decrire. Les 28
blocs `metadata.papermill` de cellule et les 10 `metadata.execution` portaient
la meme date.

Retrait par l'organe prevu (`_papermill_meta.strip_stale_papermill_metadata`,
#12722 / #18305), jamais a la main. Le remede alternatif -- re-executer via
Papermill -- a ete ecarte : l'agent interroge un LLM en ligne, un nouveau
passage produirait des sorties differentes et invaliderait la demonstration
sous revue (sequences A != B sur deux textes reels). Un metadata absent est une
information manquante ; un metadata perime est une information trompeuse.

Ratchet : BLOCK_REMOVED, 0 regression. Diff : 268 suppressions, toutes dans des
blocs metadata -- aucune cellule source, aucune sortie de cellule.

See #18393

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR] Rouge propre a la PR — Papermill ratchet (base vs PR) — corrige au commit 64dc95acfb.

Le rouge etait reel, et le diagnostic du picker avait raison (« Papermill ratchet : cause probable du requis »).

Cause. Argumentation-07-Orchestration-Python.ipynb a ete re-execute par un kernel local — l'hote MCP jupyter etant mort depuis plusieurs cycles. Un executeur de kernel reecrit les sorties et execution_count, mais laisse le bloc metadata.papermill de la passe precedente. Sorties fraiches + bloc inchange = le ratchet classe STALE_BLOCK : le bloc date les sorties au mauvais run.

Mesure. Le bloc de tete annoncait start_time 2026-10-03T09:44:39Z -> end_time 2026-10-03T09:53:02Z (duree 503 s) — soit huit jours avant les sorties qu'il pretendait decrire. Les 28 blocs metadata.papermill de cellule et les 10 metadata.execution portaient la meme date du 3 octobre.

Correctif. Retrait par l'organe prevu a cet effet, _papermill_meta.strip_stale_papermill_metadata (#12722, #18305) — jamais a la main. Le remede alternatif propose par le ratchet lui-meme (re-executer via Papermill) a ete ecarte sciemment : l'agent interroge un LLM en ligne, un nouveau passage produirait des sorties differentes et invaliderait la demonstration mise sous revue (sequences A != B sur deux textes reels). Un metadata absent est une information manquante ; un metadata perime est une information trompeuse.

Verification locale.

$ python scripts/notebook_tools/check_papermill_ratchet.py origin/main
changed notebooks : 1
regressions       : 0
  BLOCK_REMOVED   .../Argumentation-07-Orchestration-Python.ipynb
rc=0

Diff : 268 suppressions, 0 insertion, toutes dans des blocs metadata — aucune cellule source, aucune sortie de cellule touchee (Stop & Repair respecte : rien n'a ete maquille).

Autres rouges de cette PR — imputes a la base, pas a la lane (releve du picker, corroboration croisee) : check-nav-chain (cure #20302, OPEN), Always-on guards, Scripts Tests (CPU). Aucun n'est reparable ici.

Lecon a porter au harnais. La recette de re-execution hors MCP (jupyter_client local, collect_outputs) doit appeler strip_stale_papermill_metadata avant d'ecrire le carnet : sans cet appel, la re-execution reussit et le ratchet rougit quand meme. C'est ce qui s'est produit ici.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 11
  • 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)

@jsboige

jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Diagnostic des 4 jambes rouges a la tete 16d6d8f8b7 : toutes infra, aucune de contenu.

  • Scripts Tests (CPU) (job 114430343419) : XDIST-WATCHDOG COLLECT_CRASH -- KeyError: <WorkerController>, signature ci: Scripts Tests (CPU) -- un worker xdist mort en collecte leve KeyError WorkerController et rougit des PRs saines #19915 (collecte xdist impossible), plus « workers en collision : gw9 » — plantage transitoire connu, non imputable au contenu de la PR (corrobore cote main).
  • Exec-sequence ratchet (base vs PR) (114430340951) : Could not read <sha> x7 sous checkout.
  • Organ-duplication advisory (114430340652) et Source-output ratchet (advisory) (114430340634) : git failed with exit code 128 sous checkout.

Les trois derniers sont la pollution partial-clone/sparse-checkout du runner (famille #19548 / #19915) : le job meurt au Checkout, l'organe n'a jamais tourne.

Geste applique : rejeu des 4 jambes echouees (gh run rerun <id> --failed sur 38125990177, 38125990118, 38125990078, 38125990035). Aucun changement de branche, aucun fix de code — il n'y a pas de defaut a corriger.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant