Skip to content

Fix(argument,#20224): le BOM du CSV vidait l'index de l'entonnoir -- organe repare, carnet re-execute - #20231

Merged
myia-ai-01 merged 4 commits into
mainfrom
fix/20224-fallacy-family-rollup
Oct 13, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
fix/20224-fallacy-family-rollup

Conversation

@jsboige

@jsboige jsboige commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-ai-01:CoursIA-2 — prev: MED/guard #20181

See #20224

Ce qui a ete trouve, et ce n'est pas ce que l'issue decrivait

L'issue demandait de trancher entre deux causes supposees (regime wide_net_parallel qui confirme large, ou position de l'ad hominem dans la taxonomie). La reproduction a montre une troisieme cause, en amont des deux : la section 5 ne tournait plus du tout. Une re-execution du carnet sur main rendait :

Index de profondeur : 0 noeuds (depth 1-3)
  methode : one_shot      regime : one_shot
  branches explorees : 0  iterations : 0  appels LLM : None

Le carnet affichait donc une analyse degradee en silence, avec 1 « sophisme » a PK inexistante — alors que la revision committee portait 91 noeuds et un regime funnel.

Cause, mesuree puis datee

argumentation_lib/_fallacy_workflow_plugin.py ouvrait le CSV de taxonomie en encoding="utf-8". Or ce CSV commence par un BOM (ef bb bf en tete de fichier). Lu en utf-8, le BOM colle a la 1re en-tete : la colonne s'appelle "PK", node["PK"] rend une chaine vide pour les 1408 lignes, et _build_deep_index ressort 0 noeud. Aucun nom candidat ne se resout, et le plugin bascule sur son repli one_shot — par construction muet.

La deviation est deja declaree et chiffree dans NOTICE-EPITA, « Deviations carried on top of the #19287 verbatim blob », point 2 : utf-8 -> 0 entree d'index ; utf-8-sig -> 1408 PK et 91 entrees. Le NOTICE precise en tete de section que toute divergence avec l'amont est une regression.

Historique de la ligne, qui date la regression :

Commit Encodage Effet
92f999a83 (vendoring verbatim, #19287) utf-8 —
233699054 (#19204, branchement de l'entonnoir) utf-8-sig correction deliberee : le carnet tourne (91 noeuds)
d8b82d2f1 (#19482, « ML.Net consolidation ») utf-8 regression silencieuse, hors du sujet du commit

d8b82d2f1 est un balayage ML.Net / twin_pairs.d qui a reverti cette ligne au passage. Rien ne l'a attrape : aucun test ne couvre _build_deep_index (grep FallacyWorkflowPlugin tests/ ne rend aucun fichier).

Ce que la PR change

Fichier Changement
argumentation_lib/_fallacy_workflow_plugin.py utf-8 -> utf-8-sig (restaure le contrat ecrit du NOTICE), + commentaire citant le NOTICE et le commit fautif
Argumentation-02-Fallacies-Detection-Python.ipynb cellule [5.4] (recouvrement par famille, calculee, sans LLM) + son interpretation ; point 6 a la conclusion ; carnet re-execute

La cellule [5.4] repond a la question de l'issue par une mesure plutot que par une assertion. Le nœud Ad hominem porte path = 7.3 et depth = 2 : c'est une categorie, donc jamais un verdict — l'entonnoir confirme des nœuds specifiques (profondeur >= 2) et ne peut pas rendre la categorie qui les contient. La table calculee montre la couverture par famille des deux detecteurs, ce que la comparaison sur PK exactes de [5.3] ne peut pas voir.

Extrait de la sortie committee de [5.4] (calculee, non ecrite en dur) :

  famille  nom                            entonnoir  lexique
  1.1      Argument baclé                         1        1
  6.2      Changement de cap                      0        2
  7.1      Refus du débat                         1        0
  7.3      Ad hominem                             1        0

Verification

  • Re-execution complete (papermill, kernelspec python3 resolu sur coursia-py313 / Python 3.13.16 via JUPYTER_DATA_DIR, tete 60a7edf14) : 12/12 cellules code executees (exec 1-12), execution_count non nul partout, 0 erreur, 0 sortie vide. Correction de tete 60a7edf14 : la premiere re-execution avait ecrit language_info.version=3.10.18 sous le kernelspec local, rougissant Kernel drift guard contre la base 3.13.7 — re-executee sous le canon 3.13, la jambe est verte (success @08:11:39Z).
  • La section 5 est revenue au regime funnel et a 91 noeuds — la valeur que le NOTICE declare attendue.
  • Les deux controles de l'instrument, sur le meme CSV livre : utf-8 -> index 0 ; utf-8-sig -> index 91, avec ad hominem resolu en PK 1360.
  • La prose ajoutee ne cite aucun chiffre dependant du run : la re-execution est stochastique (deux executions successives ont rendu 9 puis 4 confirmations), donc la table est calculee a partir de la sortie affichee et l'interpretation est structurelle. C'est explicitement dit dans le carnet.
  • C.1 : 0 raise NotImplementedError / assert False ; C.2 : sorties reelles committees ; exercices : 3 (inchange, aucun supprime).

Hors de ma portee, et dit

Arbitrer si la conduite pedagogique de la serie doit changer (borner le nombre de confirmations, choisir un texte d'essai plus lisible) revient a la lane qui porte la serie Argument_Analysis : cette PR repare la cause instrumentale et rend la lecture honnete, elle ne tranche pas la pedagogie a sa place. L'issue reste ouverte pour cet arbitrage.

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

La section 5 du carnet Argumentation-02 ne tournait plus sur main : le CSV de
taxonomie porte un BOM, lu en utf-8 il colle a la 1re en-tete ("PK"),
_build_deep_index ressort 0 noeud et l'entonnoir bascule en silence sur
one_shot. Deviation deja declaree et chiffree dans NOTICE-EPITA (point 2),
revertie au passage par d8b82d2 (#19482) apres avoir ete posee par
2336990 (#19204).

Restaure utf-8-sig, ajoute la cellule [5.4] (recouvrement par famille, calculee)
et l'interpretation qui explique pourquoi aucune confirmation ne porte le libelle
"Ad hominem" (categorie depth=2, jamais un verdict). Carnet re-execute :
12/12 cellules, 0 erreur, regime funnel, 91 noeuds.

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

github-actions Bot commented Oct 10, 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 3.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 16.2s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.3s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.1s

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

@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

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

@github-actions

github-actions Bot commented Oct 10, 2026 •

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 10, 2026 •

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 github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-10) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Rouges famille pollution #20174 — 9 jambes, dont 2 bloquantes, aucun rejeu

Les 9 rouges de cette tête (9edf0177bb) sont la pollution sparse-checkout des slots persistants, pas un défaut de la PR. Deux d'entre eux sont bloquants : PR gate échoue explicitement dessus.

Jambe (bloquante) Slot Preuve firsthand dans le log
Validate Quarto build (PR) myia-po-2024-linux-persist-2 FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/_work/CoursIA/CoursIA/_quarto.yml'
Golden-set execution (H.7 P3) myia-po-2024-linux-persist-3 Passed: 0/9 — Failed: 9, chaque carnet [!] MISSING on disk (skip)

La cause est unique, et elle est mesurée : le checkout est amputé. Les deux jambes ne trouvent pas des fichiers qui sont présents sur main — vérifié dans le clone de la lane contre origin/main : _quarto.yml, Search-01-StateSpace.ipynb, RL-04-Bandits-Manchots-Python.ipynb, GameTheory-13d-Optimistic-CFR-Python.ipynb (tous git cat-file -e = OK). Une jambe qui ne trouve ni la racine du dépôt ni 9 carnets du golden-set ne juge aucun diff : c'est l'infra du runner qui est vide, pas la PR qui est fausse.

Les 7 autres jambes rouges (Always-on guards -- 16 organes, Exec-sequence ratchet, Kernel drift guard, markdown-rendering guard, math-render, validate-notebooks, et PR gate par dérivation) partagent la même fenêtre 07:36–07:39Z, sur les mêmes slots.

Aucun rejeu (arbitrage #20174 du 02:28Z : un rouge de cette famille s'écrit dans le dossier avec son runner_name, il ne se rejoue pas, et pas d'update-branch). Le remède est la purge des slots persistants, portée par myia-po-2024:CoursIA (échéance annoncée 10:45Z).

Point de portée, transmis au coordinateur séparément : ces deux jambes étant bloquantes, toute PR touchant un carnet voit son PR gate rouge tant que persist-2/persist-3 restent dans la rotation.

… canon 3.13

La re-execution c.388 avait ecrit metadata.language_info.version=3.10.18
sous le kernelspec python3 local, rougissant Kernel drift guard contre la
base 3.13.7. Re-execution complete sous coursia-py313 (3.13.16) via
JUPYTER_DATA_DIR, kernelspec python3 inchange, 12/12 cellules executees
(exec 1-12), 0 erreur. Sorties LLM = enregistrement d'un run, la prose
committ est independante du run (c.388).

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[CORRECTION] Sur les 9 rouges, 8 étaient la pollution — le 9e (Kernel drift guard) était réel et de cette lane.

Mon dossier précédent attribuait les 9 jambes rouges à la pollution sparse-checkout. En lisant le log de chaque jambe (et non le seul runner_name), Kernel drift guard était passé sur un slot sain (myia-ai-01-wsl-9) et échouait pour une raison réelle :

metadata.language_info.version: '3.13.7' -> '3.10.18'

Ma re-exécution c.388 avait tourné sous le kernelspec python3 local (3.10) au lieu du canon 3.13 — exactement le piège documenté sur cette machine. La leçon de méthode : un rouge attribué à la pollution par corrélation de fenêtre horaire se vérifie jambe par jambe ; un slot sain dans la liste aurait dû lever le doute dès la première lecture.

Fix livré — 60a7edf14 : re-exécution complète sous coursia-py313 (3.13.16) via kernelspec shadowé JUPYTER_DATA_DIR, kernelspec.name inchangé, 12/12 cellules exécutées (exec 1-12), 0 erreur, 10 hooks pre-commit verts. Vérifié localement contre la base : check_kernel_drift.py origin/main → OK: 0 kernel-drift regression. La cause de l'échec initial de la re-exécution (clé API absente du worktree) est identifiée : le .env gitignoré de la série n'est pas hérité par un worktree frais — copié depuis le clone principal, jamais commité (*.env ignoré).

Les 8 autres jambes restent la pollution persist-2/persist-3 documentée ci-dessus ; l'arbitrage #20174 (pas de rejeu, purge des slots portée par po-2024) s'applique à elles seules.

@github-actions

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 60a7edf

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 07593d0 re-scannee.
Nouveaux defauts imputables au diff :

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions github-actions Bot removed the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 10, 2026
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Etat CI de la tete 60a7edf14 (re-execution 3.13) — le kernel drift est VERT, les 5 rouges restants sont la famille #20174

La jambe qui etait un vrai defaut est reparee : Kernel drift guard (base vs PR) → success @08:11:39Z. Sont egalement verts sur cette tete : Golden-set execution (H.7 P3), Exec-sequence ratchet, Always-on metadata guards, Assert secret egress guard (#17276), ArgumentAnalysis dotnet (x2), CodeQL (x4 langages).

Les 5 rouges restants sont la pollution sparse-checkout #20174, lus jambe par jambe (lecon du dossier precedent : la classification par corroboration de fenetre a laisse passer un vrai rouge au cycle precedent — ici chaque jambe porte sa preuve de log) :

Jambe runner_name Preuve firsthand dans le log
markdown-rendering guard (main-repo notebooks) myia-po-2024-linux-persist-4 error: path not found: MyIA.AI.Notebooks — l'organe meurt avant sa 1re lecture (exit 2), zero finding emis
Gitleaks secret scanner myia-po-2024-linux-persist-3 grep: .pre-commit-config.yaml: No such file or directory — c'est la garde de derive de version qui tire sur un fichier absent ; aucun finding de scan
Gitleaks positive controls (#10143) myia-po-2024-linux-persist-4 meme famille — le fichier de config du scan est absent du checkout
ADK runtime contracts (18) myia-po-2024-linux-persist-1 ERROR: file or directory not found: .../Track2-GoogleADK/utils/test_adk_runtime_contracts.py — chemin present sur origin/main (verifie git cat-file -e)
PR gate (agregat) derive des constituants ci-dessus

Aucun rejeu (arbitrage #20174 : dossier + runner_name, pas de rejeu, pas d'update-branch). Note pour le suivi : persist-1 etait sain au releve c.222 de po-2024 et porte desormais un motif — coherent avec leur mesure c.223 (le motif est depose par les jobs qui tournent, il n'est pas fige).

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 60a7edf

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 07593d0 re-scannee.
Nouveaux defauts imputables au diff :

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions

Copy link
Copy Markdown
Contributor

[stale-guard-red] Scripts Tests (CPU) -- rouge date de la base 07593d0bde0c, ANTERIEURE au fix 096e70656708 du garde sur main (garde vert a sa version courante).
Remede : gh pr update-branch 20231 (recalcule la base). NE PAS gh run rerun : gh run rerun rejouerait la base gelee 07593d0 (le fix 096e706 n'y est PAS) et rendrait le meme rouge ; seul gh pr update-branch recalcule la base.

@github-actions github-actions Bot added stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

unknown.

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

Copy link
Copy Markdown
Contributor

<mot-clé fermant> #N où N est une PR -- bloquant (#10101).

unknown

GitHub interprète close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved #N comme un ordre de fermeture automatique dès que le texte atterrit dans le message de squash -- et fermer une PR par mot-clé n'est jamais intentionnel (une PR se merge ou se ferme explicitement, elle ne se « résout » pas). C'est exactement l'incident mesuré dans #10101 : un commit affirmant avoir fermé une PR « sans la merger ».

Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Closes #<issue> est intentionnel (catalog-pr-hygiene HARD 4) et passe silencieusement ; seul un #N qui résout en PR déclenche ce gate.

Pour passer ce gate :

  • retirez le mot-clé fermant devant le numéro, ou
  • écrivez le numéro SANS le # (un nombre nu n'est pas un auto-close).

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

unknown

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #? (?, source ?), sequence de merges arretee au n/a. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 20231

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@github-actions

Copy link
Copy Markdown
Contributor

Collision de lane sur une reference fermante (#10223).

unknown

Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle (Closes/Fixes/Resolves #N). Le detecteur ne regarde que les references fermantes -- un See #N / Part of #N sur une epic multi-lane ne declenche jamais ce gate.

Les trois sorties pour passer ce gate :

Voir #10223 et lane-claim-protocol.md.

@github-actions

Copy link
Copy Markdown
Contributor

Artefact de resultats au-dela de la barre de 512 Ko -- bloquant (#15890).

unknown

Pour passer ce gate :

  • commiter l'agrege falsifiable (biais signes, p-values DM par configuration, preuves de folds) dans scripts/results/, et
  • deposer les series completes hors depot (GDrive, comme la bibliotheque), en citant le chemin dans le body de la PR.

Politique complete : .claude/rules/results-artifact-policy.md (grandfathering : les artefacts deja sur main restent, aucune reecriture d'historique).

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Rouge d'infrastructure : arbre de checkout amputé (pas un défaut de cette PR)

Deux jambes rouges sur cette tete se diagnostiquent contre un fait mesurable :

Gitleaks secret scanner -- etape « Log gitleaks binary version » :

::error title=Gitleaks version drift::CI pins 8.24.3 but .pre-commit-config.yaml pins v. Update both to the same value.

Le message nomme une derive et donne une instruction actionnable (« mettez les deux
pins a la meme valeur »). Il n'y a aucune derive. Les deux pins sont egaux sur
main : GITLEAKS_VERSION: 8.24.3 (workflow) et rev: v8.24.3
(.pre-commit-config.yaml, l.23). Ce que la jambe mesure reellement est que
.pre-commit-config.yaml est absent de son arbre de travail : grep ne rend
rien, expected est vide, et le message publie devient pins v..

Gitleaks positive controls (#10143) :

ERROR: file or directory not found: scripts/secrets/tests/test_gitleaks_qwen_rule.py
collected 0 items
Process completed with exit code 4.

exit 4 est le code d'usage de pytest (fichier introuvable), pas un verdict de
test : zero assertion a ete evaluee. Verification firsthand : les deux fichiers
attendus (test_gitleaks_qwen_rule.py, test_gitleaks_10143_classes.py) sont
commites et presents sur origin/main comme sur cette tete
(git cat-file -e <head>:<path>), et tout scripts/secrets/tests/ (15 fichiers)
est tracke. Le runner declare introuvable un repertoire que le depot contient.

Cause : le volume _work epingle d'un slot persistant derive et sert un arbre
ampute (fichiers commites absents du disque, core.sparseCheckout herite). Le meme
etat produit le Path ... not uptodate; will not remove from working tree qu'on lit
sur Always-on guards et ADK runtime contracts pour des carnets de series qui ne
sont pas les miennes (Percolation, IIT).

Trackers existants : #20174 (cause racine) · #20200 (les deux organes rapportent une
cause qu'ils n'ont pas etablie) · #18312 (objets introuvables au checkout). Rien a
reparer dans cette PR -- les jambes sont rejouees a tete constante.

🤖 Generated with Claude Code

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Addendum — jeu de jambes actuel (le précédent a partiellement guéri)

Le diagnostic du 12:44 nommait Gitleaks secret scanner (depuis vert, 12:46:10Z) et Gitleaks positive controls. Re-mesure à la tête 60a7edf14 : quatre jambes rouges, toutes de la classe #20174, sur deux slots distincts, chacune lue dans son log.

Jambe runner_name Signature lue firsthand
ADK runtime contracts (18) myia-po-2024-linux-persist-4 35 × not uptodate; will not remove + test_adk_runtime_contracts.py introuvable
Always-on guards -- 16 organes, 1 checkout myia-po-2024-linux-persist-1 7 × can't open file '<script commite>' (3ᵉ forme) + 15 × No such file or directory
markdown-rendering guard (main-repo notebooks) myia-po-2024-linux-persist-1 38 × not uptodate; will not remove
Gitleaks positive controls (#10143) myia-po-2024-linux-persist-4 collected 0 items, exit code 4

PR gate est l'agrégat de ces quatre-là — aucun rouge propre à la PR.

Le rejeu a été tenté, et il reproduit. Le rejeu « à tête constante » prescrit par le tirage du tapis pour #20226 a été exécuté le 2026-10-10T11:55:06Z sur Assert secret egress guard (#17276) : même slot myia-po-2024-linux-persist-4, même Path '.github/workflows/quarto-render-list-freshness.yml' not uptodate, même échec. Le remède est la guérison des slots (label coursia-ephemeral posé sur des conteneurs persistants, propriétaire myia-po-2024), pas un rejeu — l'arbitrage de flotte est déjà acté en ce sens.

Aucun rejeu ici. Rien à réparer dans cette PR.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Diagnostic des 5 jambes rouges du head 60a7edf1 — aucune n'est imputable a cette PR, et le geste de reparation n'appartient pas a cette lane.

Le point de depart : sur 5 rouges, deux sont des agregateurs, donc leur « cause » n'existe pas au niveau de leur nom — elle est dans leurs entrees. Les trois feuilles sont sur les slots persistants, pas sur un runner heberge.

jambe runner role ce que dit le log
PR gate (requis) GitHub Actions 1000628819 (heberge) agregateur pas en echec : Aggregate check verdicts
Always-on guards -- 16 organes myia-po-2024-linux-persist-1 agregateur pas en echec : Agregat des verdicts bloquants, 13 organes listes en echec
markdown-rendering guard (main-repo notebooks) myia-po-2024-linux-persist-1 feuille error: --closure requires a parseable _quarto.yml with a project.render list; got empty/invalid puis ERROR: no notebook found under the given paths -- nothing was scanned, this is NOT an all-clear. — exit 2
ADK runtime contracts (18) myia-po-2024-linux-persist-4 feuille --collect-only returned no tests — the collection crashed (distinct from a coverage drop) — exit 1
Gitleaks positive controls (#10143) myia-po-2024-linux-persist-4 feuille Process completed with exit code 4

Les deux feuilles que j'ai lues en entier portent la signature d'un arbre de travail pollue, nommee par le log lui-meme en tete de job : error: Path '<fichier>' not uptodate; will not remove from working tree, sur une trentaine de chemins sans rapport avec cette PR (Percolation, ICT-Series, GenAI/3D, QuantConnect/BTC-ETH, docs/research/*, GameTheory, Lean). Le slot n'arrive pas a remettre son arbre d'aplomb, donc _quarto.yml lui apparait vide et pytest ne collecte aucun test.

Dans Always-on guards, les deux lignes decisives sont egalement d'infrastructure : G-VAR-2 light-cap verdict UNKNOWN (CAP='None') : merged.json absent/invalide ou detector non sorti, et le garde n'a PAS pu mesurer le perimetre de la PR 20231 (rc=2) -- verdict UNKNOWN ... la cause est amont (quota d'API partage par compte, cf #17229). Le log dit lui-meme de relancer ce job.

Sur le seul organe dont le nom pourrait viser cette PR directement, la mesure l'ecarte : le log porte Grain tag ou lane manquant : unknown, et le body de cette PR porte bien son tag en premiere ligne, correctement forme (Grain: DEEP/notebook-python — lane myia-ai-01:CoursIA-2 — prev: MED/guard #20181). L'unknown de l'organe vient donc de ses propres entrees (merged.json du slot, quota d'API), pas du body.

La preuve que ce n'est pas cette PR : elle touche deux fichiers — Argumentation-02-Fallacies-Detection-Python.ipynb et argumentation_lib/_fallacy_workflow_plugin.py. Zero intersection avec _quarto.yml, ADK/Track2, ou l'un des trente chemins cites. Et _quarto.yml est bien present sur main (blob 98aa2a70, render: l. 4) : c'est le slot qui le rend illisible, pas le depot.

Ce que je n'ai pas verifie, et que je n'affirme donc pas : le detail organe par organe des 13 entrees d'Always-on guards (j'ai lu les deux lignes decisives, pas les treize), et la cause du exit 4 de Gitleaks positive controls. Les deux autres feuilles sont mesurees ; ces deux-la restent ouvertes.

Aucun rejeu, et pas de geste de lane. Le rejeu est interdit pour la classe du checkout ampute (decision de flotte actee au dashboard workspace-CoursIA-2) et, sur les slots myia-po-2024-linux-persist-*, le defaut est documente comme reproductible : le remede est une purge de runners, pas un geste de lane. Signale au coordinateur, avec ce diagnostic.

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Oct 10, 2026
La re-execution de la tete precedente avait laisse la prose sur les
chiffres de l'ancien run (51 appels, ~8,5/branche) alors que la sortie
committee affiche 6 branches / 23 appels. Re-ancrage + la moyenne par
branche est explicitement presentee comme un ordre de grandeur, pas une
preuve de conformite au breaker individuel (constat adjoint c21).

See #20231

Co-Authored-By: Claude Haiku 4.5 (1M context) <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.

VERDICT: LGTM

[NanoClaw] — review #20231 (Fix(argument,#20224) : BOM du CSV → index entonnoir vide), head ffc94d97, 2 fichiers +328/−190. Vérification par extraction raw (merge-base 07593d0b) + diff cell-by-cell scripté + lecture intégrale des cellules nouvelles/modifiées.

Cause racine vérifiée firsthand

  • Le CSV livré commence bien par un BOM collé à la 1ʳᵉ en-tête : la ligne d'en-tête lue au head est littéralement PK,path,decimal_path,depth,… — le mécanisme allégué (node["PK"] vide lu en utf-8) est exact, pas une histoire plausible.
  • Plugin au head : l.303 encoding="utf-8-sig" + bloc commentaire citant le contrat NOTICE-EPITA et le commit fautif d8b82d2f1 — exactement le diff déclaré (+10/−1). Les autres encoding="utf-8" du fichier (l.1560/1595/1651) visent les logs/traces, pas le CSV : périmètre propre.

Carnet : mécanique 4/4

  • 27→29 cellules ; l'alignement est prouvé cellule par cellule (base 24 md 1811 c → head 26 byte-identique ; base 25 code → head 27 même source re-exécutée ec12 ; conclusion 5→6 points, le point 6 « Un accord se lit a sa granularite » est bien la ligne neuve). Les 2 cellules ajoutées = code [5.4] + son interprétation md, comme déclaré.
  • 12/12 cellules code exécutées, exec 1-12 séquentiels non nuls — claim du body exact. Signature d'honnête re-exécution : seules les cellules stochastiques (13, 20-22, la neuve 24, la dernière) ont des outputs changés ; les sorties déterministes sont byte-stables.
  • [5.4] lue intégralement : table de couverture par famille calculée depuis le DataFrame (ancêtre depth 2), zéro valeur écrite en dur ; sortie réelle (7 familles — le body cite un « extrait » de 4 lignes, explicitement étiqueté comme tel). L'argument pédagogique (catégorie Ad hominem path 7.3 = conteneur, jamais un verdict ; l'entonnoir rend des feuilles) est structurellement juste et répond à la question de l'issue par une mesure.
  • Bonus honnêteté non annoncé : la note « coût borné » de la lecture de trace a été ré-ancrée sur le run neuf (51→23 appels) ET corrigée — l'ancienne prétendait prouver le respect du breaker individuel par la moyenne ; la nouvelle dit explicitement que la moyenne ne prouve pas, branche par branche. Amélioration réelle.

CI

  • Tous les organes de contenu au head : pass (Detect notebook outputs-required, Exec-sequence ratchet, Kernel drift guard, plan-loss, density guards, Analyze ×4, CodeQL, gitleaks, golden-set, validate-notebooks).
  • Les 2 rouges = la classe infra du jour documentée au tour 14:36Z : _quarto.yml render-list freshness (smoke test regen, rouge aussi sur des PR sans rapport) et PR gate qui l'agrège — 0 job/step rouge propre à la gate, aucun lien avec les 2 fichiers de la PR. Pendings = run en vol.

Note non bloquante

  • La table « Ce que la PR change » énumère [5.4], son interprétation, le point 6 — mais pas la ré-ancraison du blocquote coût (idx 23) sur les chiffres du nouveau run (même classe d'énumération que #20278/#20281, amendement de body suffisant). Le body dit par ailleurs à juste titre que la prose ajoutée ne cite aucun chiffre dépendant du run — la prose modifiée, si, mais vers des chiffres du run affiché au-dessus d'elle.

Résumé : cause racine prouvée sur l'artefact (BOM lu dans le fichier livré), fix minimal adossé au contrat NOTICE, cellule pédagogique calculée et honnête sur la stochasticité, re-exécution complète vérifiée mécaniquement. Rien à amender côté code.

@jsboige

jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20231
head: ffc94d9
complete: true
body: read
comments-reviewed: 22
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f2ddf31bb26ac1c6697ab9c86ffb8446f73a25af1a53046ee3300ee8b7a44516
diff-files: 2
diff-additions: 328
diff-deletions: 190
checks: BLOCKED
b0: clear
scope: pass
domain: fail
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20231
organ-rc: 3
[/ADJOINT PREFLIGHT]

Lecture du body, des 22 commentaires, de la review NanoClaw COMMENTED et du diff integral. Threads GraphQL 0, hasNextPage false. B.0 rc0, commentaires non classes lus personnellement. Tete OPEN/MERGEABLE, base main. Le correctif BOM est reproduit contre le CSV exact de la tete : efbbbf, 1408 lignes ; utf-8 donne 0 PK resolue et 0 entree d'index, utf-8-sig donne 1408 PK et 91 entrees de profondeur 1-3. Douze cellules code portent execution_count 1..12, zero output error. Ces controles ne sont pas une nouvelle execution Papermill ni une validation live du LLM.

Domain fail sur la nouvelle explication categorique en section 5 et conclusion : l'entonnoir rendrait une feuille, jamais la categorie qui la contient. Le plugin exact contredit cette garantie : _fallacy_workflow_plugin.py lignes 1046-1055 et 1077-1081 propose confirm_fallacy sur le parent ; lignes 1094-1102 autorise explicitement la confirmation du niveau courant lorsque les enfants sont des specialisations non instanciees ; lignes 1200-1210 ne rejette que depth < MIN_CONFIRM_DEPTH=2. La sortie committee 4c16d390 confirme PK1281, path7.1, depth2, Refus du debat. La taxonomie exacte donne a ce noeud trois enfants directs (1282/1287/1297) : ce n'est pas une feuille. Ad hominem PK1360/path7.3 porte egalement trois enfants ; sa profondeur ne suffit donc pas a prouver son exclusion des verdicts. Le tableau par famille reste une mesure distincte et utile, mais son interpretation doit dire que l'entonnoir PEUT confirmer un noeud intermediaire suffisamment specifique, pas qu'il exclut toutes categories. Aucun changement du moteur n'est demande pour corriger cette description.

Checks mesures a la source commits/head/check-runs?filter=all, pagination puis dernier (started_at,id) par nom : 93 jambes/93 noms. Quatre failures actuelles (Always-on guards, Audit README -> .ipynb links, Scripts Tests CPU, Quarto render freshness advisory), et PR gate cancelled sans successeur dans cette capture. Emit canonique confirme checks BLOCKED. Les diagnostics historiques concernent souvent 60a7edf : ils ne prouvent pas automatiquement la cause des jambes a ffc94d9. Aucune attribution nouvelle a l'infrastructure sans lecture de leurs logs, aucun rejeu ni update-branch effectue. Le dossier bloque donc sur checks et sur le contresens de prose confirme, sans APPROVED/CHANGES_REQUESTED/override/merge adjoint.

@jsboige

jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

Réparations c.423 (dispatch c2149) — tête rafraîchie 137bee8a6 (update-branch) :

  1. Audit README -> .ipynb links / Link-label agreement / jambes fastlane : mesuré localement, les 2 « nouvelles » violations HTML_404 (DataScienceWithAgents/README -> NumPy/Pandas .html) étaient un artefact d'arbre périmé — merge-base du 2026-10-10 08:58 contre un main qui a bougé jusqu'au 11 17:17 ; re-mesure à la tête rafraîchie : NOUVELLES=0, CORRIGEES=0, 0 mismatch link-label. Les jambes verdissent au re-run.
  2. Scripts Tests (CPU) : XDIST-WATCHDOG COLLECT_CRASH KeyError: <WorkerController> — signature transitoire ci: Scripts Tests (CPU) -- un worker xdist mort en collecte leve KeyError WorkerController et rougit des PRs saines #19915 (0/7 cas reproduits à la 2e tentative), rejeu de la jambe tiré.
  3. _quarto.yml render list freshness (advisory) : rouge base-inherited — mesuré sur main pur à jour (59ac415), la liste y est aussi périmée (+3 entrées) ; catalog-cron.yml la régénère sur main, l'annotation du garde dit elle-même « aucune action attendue sur cette branche ». Rien à faire ici.

La PR ne touche que Argumentation-02-Fallacies-Detection-Python.ipynb + argumentation_lib/_fallacy_workflow_plugin.py — aucun de ces rouges ne vient du diff.

@jsboige

jsboige commented Oct 13, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA
pr: 20231
head: 137bee8
complete: true
body: read
comments-reviewed: 24
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 78c0522cdbf82650c6f632b0f59e844e2483f75bfe0c3fc627c0115022225eb0
diff-files: 2
diff-additions: 328
diff-deletions: 190
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20231
organ-rc: 0
[/ADJOINT PREFLIGHT]

@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 a la tete exacte 137bee8. Cause racine verifiee : data/argumentum_fallacies_taxonomy.csv commence par EF BB BF. En lecture utf-8, l'en-tete devient « \ufeffPK » et l'index resout 0 noeud ; en utf-8-sig, il redevient « PK » sur 1408 lignes. Correctif d'une ligne dans _fallacy_workflow_plugin.py. Carnet re-execute : 12/12 cellules de code avec execution_count et sorties, aucune cellule supprimee, aucun stub interdit. Le LGTM NanoClaw a ffc94d9 couvre le contenu ; depuis, seul main a ete fusionne.

@myia-ai-01
myia-ai-01 merged commit adaadf1 into main Oct 13, 2026
94 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants