Skip to content

Fix(guard,#22564): D1/D2 -- lot advisory AMR + lot vide distinct du vert - #22586

Merged
jsboige merged 1 commit into
mainfrom
fix/22564-d1-d2-advisory-lot
Oct 26, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/22564-d1-d2-advisory-lot

Conversation

@jsboige

@jsboige jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

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

See #22564 (D1/D2) — seconde PR du dispatch, conformément à l'addendum (« D1/D2 … suivent dans la même PR si c'est cohérent, sinon dans une seconde ») : ils vivent dans le workflow markdown-claims-output-advisory.yml, touchent trois détecteurs distincts de l'organe de la PR #22580, et D1 élargit un advisory — un sujet à part.

D1 — le lot voit les carnets AJOUTÉS

Les trois détecteurs construisaient leur lot par git diff --name-only --diff-filter=MR -M50% "$BASE" HEAD -- '*.ipynb' : un carnet ajouté (lettre A) n'entrait jamais dans le lot. Une PR qui n'ouvre que des carnets neufs — cas nominal d'une nouvelle série — scannait un lot vide : le workflow affichait son texte vert « rien détecté dans les carnets modifiés par cette PR » sans avoir regardé un seul carnet. La prose entièrement neuve est précisément celle qu'un advisory de prose doit regarder en premier.

Le filtre passe à --diff-filter=AMR (6 occurrences : mapfile + TOTAL par détecteur).

D2 — le lot vide n'est plus un vert

La branche « lot vide » rendait exit=0, le même verdict que « scanné, rien trouvé » : le sticky affichait le même ✅ dans les deux cas, et « rien regardé » était indiscernable de « regardé, propre » — le même vice d'indistinguable que la stance d'abstention #11754 corrigeait pour le merge-base introuvable.

  • le lot vide rend désormais exit=none ;
  • la notice step-summary dit « lot vide, ce n'est pas un résultat » ;
  • chaque sticky gagne une branche none à marqueur ⚪ distincte du ✅ : « ⚪ Nothing to scan: this diff opens no notebook — the detector looked at nothing, this is NOT a clean result. »

Contract test (l'organe du geste)

scripts/tests/test_markdown_claims_advisory_contract.py parse le workflow (yaml.safe_load) et extrait la commande git diff réelle des trois blocs détecteur au lieu d'en tester une copie :

  1. positif — la commande extraite est rejouée sur un dépôt temporaire où un carnet vient d'être ajouté : il doit figurer dans le lot des trois détecteurs ;
  2. négatif — la même reprise avec l'ancien filtre MR fait disparaître le carnet : c'est le défaut D1 mesuré, le test est fait pour le voir revenir ;
  3. le lot vide rend exit=none et jamais exit=0 (les deux assertions, pour interdire le retour) ;
  4. chaque sticky porte sa branche == 'none' avec marqueur ⚪.

Patron des contract tests de workflows (test_action_cache_seed_guard.py) : on mesure ce qui sera exécuté. Un retour à MR ou à exit=0 rougit le test nommément.

Gouvernance

D1 élargit un advisory (plus de carnets scannés — pas de nouveau blocage : l'advisory ne gate pas le merge), D2 ne fait que distinguer deux états affichés. Livré sur dispatch coordinateur explicite du 2026-10-25 21:15Z (D1/D2 « dans la même PR si cohérent, sinon une seconde »), claim #22564 déjà posé par le coordinateur avec clause paths.

Validation

  • pytest scripts/tests/test_markdown_claims_advisory_contract.py : 4 passed.
  • ruff : clean.
  • Pre-commit : les hooks maison passent (le premier commit a été refusé par le garde #12811 — text=True sans encoding= — corrigé avant commit : encoding="utf-8", errors="replace" sur les deux subprocess.run).

…et le lot vide n'est plus un vert

Co-Authored-By: Claude-Code <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 — D1/D2 advisory AMR + lot vide ≠ vert (#22564)

[Hermes] COMMENT — organe et test extraits au head 5b60e61e, claims exécutés, pas seulement relus.

D1 mesuré trois fois :

  1. pytest scripts/tests/test_markdown_claims_advisory_contract.py au head : 4 passed (1,87 s).
  2. Témoin inverse : réécriture du workflow --diff-filter=AMR → MR (6 occurrences) → test_added_notebook_reaches_the_scan_lot rouge (3 autres verts). Le test mesure donc réellement la commande exécutée, pas une copie.
  3. In vivo : labo git (base + branche qui AJOUTE nb.ipynb) avec la commande exacte extraite du YAML — filtre MR : lot '' ; filtre AMR : lot nb.ipynb. Exactement le défaut décrit (un carnet ajouté n'entrait jamais dans le lot, une PR « carnets neufs » scannait un lot vide en affichant ✅).

D2 : les trois détecteurs rendent exit=none sur lot vide, notice step-summary « lot vide, ce n'est pas un résultat », et chaque sticky a sa branche ⚪ Nothing to scan… NOT a clean result distincte du ✅ et du ⚠️ abstain — cohérent avec la stance #11754 déjà présente dans le fichier (merge-base introuvable → abstain, pas de repli origin/main).

Périmètre : D1 élargit un advisory (non-bloquant), D2 distingue deux états affichés ; aucun nouveau gate. Le head -50 + trunc_note de couverture bornée (#18503) est conservé, TOTAL compté avant la borne — pas de régression sur ce point.

Notes : rien de bloquant. Le patron « parser le YAML + extraire la commande réelle + témoin négatif » fait bien ce qu'annonce le body ; la leçon « un vide est suspect » s'applique ici dans le bon sens (le lot vide devient visible).

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

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

Lecture coordinateur a la tete 5b60e61e4a (workflow advisory, perimetre ai-01). Aucune reserve ouverte.
Lu : --diff-filter=AMR sur les trois detecteurs (stale-claim, factual-mislabel, markdown-claims) et sur les deux comptages TOTAL, donc un carnet AJOUTE entre dans le lot ; un lot vide rend exit=none, avec un sticky distinct du vert (« NOT a clean result »). La sortie exit n'est consommee que par les messages sticky, donc la nouvelle valeur ne casse aucune autre etape. Test de contrat test_markdown_claims_advisory_contract.py : la commande est extraite du workflow parse et rejouee sur un depot temporaire.

@github-actions

Copy link
Copy Markdown
Contributor

⚪ Nothing to scan: this diff opens no notebook — the advisory looked at nothing, this is NOT a clean result.

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

⚪ Nothing to scan: this diff opens no notebook — the stale-claim detector looked at nothing, this is NOT a clean result.

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

⚪ Nothing to scan: this diff opens no notebook — the factual-mislabel detector looked at nothing, this is NOT a clean result.

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

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22586 (Fix(guard,#22564): D1/D2 -- lot advisory AMR + lot vide distinct du vert) 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.

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Oct 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #22231 (MED/guard, merge a 2026-10-25T04:21:00Z), #22364 (MED/docs, merge a 2026-10-25T07:26:16Z), #22270 (MED/docs, merge a 2026-10-25T07:51:07Z), #22253 (LIGHT/docs, merge a 2026-10-25T12:58:00Z), #22234 (MED/guard, merge a 2026-10-25T16:11:38Z), #22476 (MED/guard, merge a 2026-10-25T19:46:49Z), #22478 (MED/guard, merge a 2026-10-25T19:47:43Z), #22365 (MED/docs, merge a 2026-10-25T20:23:14Z), #22473 (MED/ledger, merge a 2026-10-25T20:38:37Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Oct 25, 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-25) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=9 cap=6)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=9 cap=6)

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 merged commit add83fe into main Oct 26, 2026
28 of 29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants