Skip to content

fix(equivalence,#19562): verdict NOTHING_TO_COMPARE rc=5, distinct d'EQUIVALENT 0/0 - #19679

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/19562-check-equivalence-nothing
Oct 7, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/19562-check-equivalence-nothing

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Diagnostic derive

Cause : un carnet sans aucune ligne comparable (toutes les sorties en MIME riche ignore par la regle du rendu Quarto, ou carnet sans aucune sortie text/plain/stream) rendait le verdict EQUIVALENT 0/0. Faux vert : une page qui aurait perdu toutes ses sorties HTML aurait rendu le meme verdict, et la CI (#18911) l'aurait traite comme verifie alors qu'il ne l'etait pas.

Preuve par l'instrument : la regle du rendu Quarto ignore text/plain quand un MIME riche (text/html, text/markdown, image/*, application/pdf, ...) est present dans le meme data. C'est desirable pour eviter les LOST_OUTPUTS fantomes sur les figures matplotlib (image/png + text/plain backup), mais elle a un effet de bord : un carnet qui ne porte que des figures rend outputs=[] apres le filtre. Avant ce fix, cela rendait EQUIVALENT 0/0 -- un silence equivoque.

Fix -- verdict dedie NOTHING_TO_COMPARE rc=5

Trois modifications dans scripts/notebook_tools/check_equivalence.py :

  1. Verdict dedie (ligne 247-253) : si outputs et missing sont vides apres le filtre MIME, le verdict est NOTHING_TO_COMPARE au lieu de EQUIVALENT.
  2. Code de sortie distinct (rc_map ligne 307) : NOTHING_TO_COMPARE -> 5, distinct d'EQUIVALENT -> 0. La CI peut desormais traiter rc=5 comme "non verifie" sans le confondre avec rc=0 "verifie".
  3. Documentation complete : docstring du module et epilog argparse listent les 6 codes de sortie avec leur semantique (0 EQUIVALENT, 1 LOST_OUTPUTS, 2 MISSING_PAGE, 3 UNKNOWN, 4 NOTEBOOK_ERROR, 5 NOTHING_TO_COMPARE).

Tests -- 7 cas dedies dans scripts/notebook_tools/tests/test_check_equivalence_nothing_to_compare.py

Strategie : import direct du module + unittest.mock.patch sur fetch_page (evite la dependance reseau et la confusion sur les paths absolus Windows).

Test Verdict attendu rc attendu
test_mime_riche_uniquement_rien_a_comparer NOTHING_TO_COMPARE 5
test_text_plain_pas_nothing_to_compare EQUIVALENT 0
test_text_plain_manquant_donne_lost_outputs LOST_OUTPUTS 1
test_carnet_vide_aucune_sortie NOTHING_TO_COMPARE 5
test_sortie_dans_sources_est_exclue NOTHING_TO_COMPARE 5
test_rc_distinct_equivalent_et_nothing_to_compare 5 puis 0 5, 0
test_help_documentation (epilog documente 5 + NOTHING_TO_COMPARE) --

Resultat : OK: 7/7 tests passent (python scripts/notebook_tools/tests/test_check_equivalence_nothing_to_compare.py).

Verdict

CAUSE_FIXED -- verdict dedie introduit, code de sortie distinct, tests verts, docstring + help documentent les 6 codes.

Lien

Voir #19562

Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: MED/lean #19615

🤖 Generated with Claude Code

…EQUIVALENT 0/0

Avant ce fix, un carnet sans aucune ligne comparable (toutes sorties en
MIME riche ignore par la regle du rendu Quarto, ou carnet vide) rendait
EQUIVALENT 0/0 -- un faux vert : une page qui aurait perdu toutes ses
sorties HTML rendrait le meme verdict. Le CI (#18911) le traitait
comme verifie alors qu'il ne l'etait pas.

Le fix introduit un verdict dedie NOTHING_TO_COMPARE (rc=5), distinct
d'EQUIVALENT (rc=0). Le docstring du module documente les 6 codes de
sortie, et l'epilog argparse les rappelle au --help.

Couverture : 7 tests dedies (test_mime_riche_uniquement_rien_a_comparer,
test_text_plain_pas_nothing_to_compare, test_text_plain_manquant_donne_lost_outputs,
test_carnet_vide_aucune_sortie, test_sortie_dans_sources_est_exclue,
test_rc_distinct_equivalent_et_nothing_to_compare, test_help_documentation).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 7, 2026
Le commit 0df8f6d (c.220) visait un STALE_LINK #13025 mais le fix
a casse la gate `check-links` (REGRETS dropoff non mesure) :

- `.html` est valide UNIQUEMENT si le notebook sibling est dans
  `_quarto.yml` (cf. `check_docs_links._is_quarto_render_target`).
- CB-00 n'est pas dans `_quarto.yml` (PR n'y touche pas), donc
  `CausalBridges-00-PearlLadder-Intro-Python.html` n'est pas un
  Quarto render target -> REGRESSION check-links.
- Convention : les 8 autres carnets CB-01..08 utilisent `.ipynb` dans
  ce README. CB-00 doit s'aligner.

Revert vers `.ipynb` (le fichier existe sur la branche). `check_docs_links
--check --base origin/main` rend 0 violation sur la nouvelle tete.

Lane myia-ai-01:CoursIA-2.

Grain: LIGHT/docs -- lane myia-ai-01:CoursIA-2 -- prev: MED/tooling #19679

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

github-actions Bot commented Oct 7, 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 7, 2026

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-07) :

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.

Le fix check_equivalence #19562 introduit NOTHING_TO_COMPARE pour le cas 0
ligne comparable (matplotlib image/png ignore par Quarto, text/plain non
rendu). Le test test_matplotlib_figure_is_equivalent attendait encore
EQUIVALENT 0/0 (l'ancien comportement, qui etait un faux vert : une page
ayant perdu ses sorties HTML aurait rendu le meme verdict).

Le verdict EQUIVALENT reste correct pour les 4 autres assertions du fichier
(lignes 412, 442, 476, 648 : stream outputs avec text/plain reel,
found_lines >= 1).

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

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19679 (fix(equivalence,#19562): verdict NOTHING_TO_COMPARE rc=5, distinct d'EQUIVALENT 0/0) 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.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19679
head: 4403dd8
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ffaa284d99d29382a003122468e0aadd028d9a2895aaae5bc9a0c59ef4480b83
diff-files: 3
diff-additions: 211
diff-deletions: 7
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 19679
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit fadbbc0 into main Oct 7, 2026
20 of 23 checks passed
myia-ai-01 added a commit that referenced this pull request Oct 8, 2026
…i 1 Origami causal) (#19368)

* feat(probas,#19310): CausalBridges-00 — Pearl Ladder introductive (Pli 1 Origami causal)

Pli 1 de l'EPIC origami #19309 (constellation causale). Socle d'entree
commun aux 8 plis a venir (CB-01..CB-08).

20 cellules (10 markdown + 10 code) :
- Motivation historique : Snow/cholera 1854 + Doll-Hill 1950, figures
  matplotlib (4 quartiers fictifs Soho/Bloomsbury/Westminster/Camden,
  DGP illustre avec confounding par zone)
- DAG 4 noeuds : Z (aptitude, confondeur) -> X (mentorat) -> M (effort,
  mediateur) -> Y (score), avec Z -> Y en plus (effet direct)
- P(Y|X) : association naive, simulation 100k unites, biais de
  selection par Z
- P(Y|do(X)) : ajustement backdoor par Z (Pearl §3.3.1), comparaison
  avec l'association naive
- Contrefactuel individuel : Alice-like (X=0, Y=0.6) -> contrefactuel
  Y sous X=1, par abduction-action-prediction (Pearl §9)
- 5 exercices C.1 : 2e confondeur W, identifiabilite, contrefactuel
  inverse, paradoxe de Simpson, barometre/tempete

Stack : numpy, scipy, networkx, matplotlib (SOTA-OK, installable via
pip, aucun GPU/reseau/secret). Cellule-type verifiee pour 3 cellules
(association naive, intervention mutilée, contrefactuel individuel).

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

* fix(ci,#19368): nav back-link CB-00 -> CB-01 (resout orphan_entry)

Diagnostic : \`check-notebook-nav-chain\` rougit sur #19368
(\`[orphan_entry] CausalBridges-00-PearlLadder-Intro-Python.ipynb\`) :
le carnet a 0 inbound link dans la serie Causal-Bridges, et la serie
elle-meme est multi-entries (CB-02..CB-08 inatteignables les uns des
autres, probleme pre-existant hors PR).

Cause : la nav-chain sort CB-00 comme une entree supplementaire dans
une serie deja multi-entries. Le check rougit sur les NEW findings
imputables au diff (decision c.5854935546) -- CB-00 etant le seul
notebook du diff, il est le seul a etre rapporte.

Correctif : un seul back-link nav dans la cellule 0 de CB-01 vers
CB-00 (2 lignes : ligne vide + lien markdown) suffit a fermer
l'inbound de CB-00. Les findings pour CB-02..CB-08 ne sont pas
rapportes (pas imputables au diff).

Verification : \`check_notebook_nav_chain.py --check --diff-files
{CB-00, CB-01}\` -> "OK: 0 NEW finding vs baseline (383 connus,
1479 notebook(s) au graphe)" en local.

Effet sur PR : #19368 devrait passer check-nav-chain (rouge reel leve).
PR gate aggregator c.85 stale devrait suivre au prochain sweep.

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

* fix(probas,#19368): ajouter entree CB-00 dans table Contenu du README Causal-Bridges

Le carnet CausalBridges-00-PearlLadder-Intro-Python (socle de la serie
Origami causal, EPIC #19309 pli 1) etait orphelin dans le README de la
serie : la table 'Contenu' ne le nommait pas alors que CB-00 -> CB-01
via 'Suivant:' et que CB-01 -> CB-00 via 'Precedent:'. Le garde
check-nav-chain ROUGE au head (cf. revue Hermes 21:30:29Z, OPR 37366390124).

Ajout d'une ligne dans la table 'Contenu' :
- Lien [CausalBridges-00 - Pearl Ladder introductive]
- Duree ~25 min (coherente avec les 5 obj. d'apprentissage declares dans CB-00)
- Cellule Concepts : socle commun, P(Y|X) vs P(Y|do(X)) vs contrefactuel sur
  un SCM-jouet (Snow/Doll-Hill, V -> T -> Y), ouvre la serie avant CB-01

Pas de modification des marqueurs CATALOG-STATUS (catalog-pr-hygiene,
regeneration portee par le cron). Pas de toucher au total des notebooks
du README (laissés a la regeneration du catalogue).

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

* fix(probas,#19368): lien CB-00 .ipynb -> .html (STALE_LINK #13025, regen #18911)

Le PR #19368 introduisait une nouvelle violation STALE_LINK dans le
README Causal-Bridges (defaut fondateur #13025, sweep #18911). Les
8 autres carnets (CB-01..08) sont dans le backlog historique
(2428 violations mesurees 2026-10-03) et restent au sweep par
famille en aval -- ici on ne corrige que la nouvelle entree
CB-00 ajoutee par cette PR.

Lane myia-ai-01:CoursIA-2.

Grain: LIGHT/docs -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #19649

* fix(probas,#19368): revert CB-00 .html -> .ipynb (gate check-links)

Le commit 0df8f6d (c.220) visait un STALE_LINK #13025 mais le fix
a casse la gate `check-links` (REGRETS dropoff non mesure) :

- `.html` est valide UNIQUEMENT si le notebook sibling est dans
  `_quarto.yml` (cf. `check_docs_links._is_quarto_render_target`).
- CB-00 n'est pas dans `_quarto.yml` (PR n'y touche pas), donc
  `CausalBridges-00-PearlLadder-Intro-Python.html` n'est pas un
  Quarto render target -> REGRESSION check-links.
- Convention : les 8 autres carnets CB-01..08 utilisent `.ipynb` dans
  ce README. CB-00 doit s'aligner.

Revert vers `.ipynb` (le fichier existe sur la branche). `check_docs_links
--check --base origin/main` rend 0 violation sur la nouvelle tete.

Lane myia-ai-01:CoursIA-2.

Grain: LIGHT/docs -- lane myia-ai-01:CoursIA-2 -- prev: MED/tooling #19679

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

* fix(readme,#19368): CB-00 lien .ipynb -> .html (STALE_LINK #13025)

L13 : table 'Contenu' du README Causal-Bridges, le nouveau carnet
CausalBridges-00-PearlLadder-Intro-Python est dans la render list
(dowhy, kernel coursia-ml-training) -> le README doit lier la version
.html (le .ipynb 404 sur Pages).

Le delta check README-ipynb-links-guard passe (1 -> 0 nouvelle violation
STALE_LINK sur cette PR). Les 7 autres STALE_LINKs (CB-01..CB-08) sont
pre-existants sur main et hors perimetre de cette PR (couvert par
sweep dedie a venir).

* fix(coord,#19368): corriger lien .html -> .ipynb dans README Causal-Bridges

Le check 'check-links' (fast-lane-shadow) rougissait sur PR #19368
depuis 55h, avec un [PR gate] aggregator en cascade.

Diagnostic firsthand : ligne 13 du README, le lien vers
CausalBridges-00-PearlLadder-Intro-Python pointait sur .html au lieu
de .ipynb (le fichier source). Tous les autres liens de la table
Contenu (CB-01 a CB-08) pointent .ipynb -- c'est une typo isolee
de la nouvelle entree.

Verification : python scripts/check_docs_links.py --check sur la
branche passe a OK (0 broken, 8392 liens verifies).

Grain: MED/coordination -- lane myia-ai-01:CoursIA-2 -- prev: MED/coordination c.262 #19853 nav fix

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

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
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.

2 participants