Skip to content

fix(picker,#19645): nav-chain/navlinks declares bornes au diff -- l'imputation base du tapis les exclut - #20454

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/19645-nav-base-imputation
Oct 13, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/19645-nav-base-imputation

Conversation

@jsboige

@jsboige jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/tooling — lane myia-po-2023:CoursIA — prev: MED/notebook-python #20453

Contexte

Mission HIGH dispatchée par ai-01 (12/10 08:28Z, re-route depuis ai-01:CoursIA-2), suite de #19645 — dont la livraison #19652 a fermé le cas fondateur prose-counts — et de la mesure c.1503 de po-2026:CoursIA-2 (09/10) : un second organe borné au diff échappe au détecteur.

Le constat mesuré : check-nav-chain/check-navlinks rendent un verdict DELTA — NEW findings vs baseline committé, comme le montre le log du job de #20044 (FAIL: 1 NEW finding(s) vs baseline (imputables au diff)) — et leur workflow d'origine scopait au diff (git diff $BASE...HEAD → --diff-files). Mais l'argv absorbé dit seulement --check : l'information de bornage a été perdue par l'argv, donc une heuristique d'argv supplémentaire ne détecterait rien. Résultat : le tapis imprimait « ROUGE IMPUTE A LA BASE — pas le votre » sur une corroboration inter-lanes (#20443/#20446), et la lane ne cherchait pas son propre orphan_entry — l'encours montait vers le plafond WIP.

Changements (couple (1)+(2-camp explicite) arbitré par ai-01, préféré par la mesure c.1503)

Fichier Geste
scripts/ci/fast_lane_registry.py Champ explicite Guard.diff_bounded (docstring incluse, distincte de needs_base) ; needs_base=True, diff_bounded=True sur les deux gardes nav
scripts/pick_idle_grain.py _diff_bounded_check_names() lit la 4e source : les deux noms sortent de base, restent dans undecided seul
scripts/tests/test_pick_idle_grain.py 2 tests neufs : câblage réel du registre (sans monkeypatch) + scénario c.1503 de bout en bout + contrôle négatif

Sur needs_base : déclaré sur les deux gardes par arbitrage (option 1), avec une mesure portée au commentaire du registre — aucun consommateur opérationnel ne lit needs_base (grep scripts/ + .github/ au 12/10) ; la déclaration documente l'intention, le canal opérant de l'imputation est diff_bounded. Les ~20 gardes needs_base existants ne sont PAS basculés (un needs_base seul n'est pas un verdict-delta).

Preuves mesurées (tête 930e336762)

  • Câblage réel : _diff_bounded_check_names() → nav-chain: True | navlinks: True | total: 12 (10 heuristiques + 2 déclarés).
  • Tests ciblés : 6 passed (-k "diff_bounded or nav_chain or nav_guards or c1503").
  • test_fast_lane.py : 83 passed — le nouveau champ et les déclarations ne cassent aucune assertion de registre.
  • test_pick_idle_grain.py : 12 failed / 208 passed — échecs pré-existants à la tête b34d086d73, prouvé par A/B (git stash → même suite → listes FAILED identiques, diff vide). Aucun échec nouveau.

Acceptance #19645 (3ᵉ point)

test : nav-chain corroboré par deux lanes et absent du rollup de main sort de base

Couvert par test_nav_chain_corrobore_absent_de_main_sort_de_base_c1503 : corroboration #20044/#20062 (notebooks distincts, aucun rouge partagé possible), probe sans les gardes nav (rollup main absent) → undecided seul ; contrôle négatif : un check non déclaré, même scénario, reste imputé à la base (le filtre est un ensemble clos — il n'élargit pas la classe des acquittés).

See #19645.

🤖 Generated with Claude Code

…mputation base du tapis les exclut

Suite c.1503 (mesure po-2026:CoursIA-2, 09/10) : `check-nav-chain` et
`check-navlinks` rendent un verdict DELTA (NEW vs baseline committe ; leur
workflow d'origine scopait au diff via `git diff $BASE...HEAD`), mais
`_diff_bounded_check_names()` ne les voit pas : l'argv absorbe (`--check`)
a perdu le drapeau de bornage, et une 4e heuristique d'argv ne detecterait
rien. Resultat : le tapis les imputait a la base (« pas le votre ») alors
que le rouge est par-PR.

- registre : champ `Guard.diff_bounded` (declaration explicite, distincte de
  `needs_base`) + `needs_base=True, diff_bounded=True` sur les deux gardes
  nav (arbitrage ai-01 12/10 ; mesure : `needs_base` n'a aucun consommateur
  operationnel, le canal operant de l'imputation est `diff_bounded`)
- picker : 4e source lue par `_diff_bounded_check_names()` -- les deux noms
  sortent de `base` et restent dans `undecided` seul
- tests : cablage reel du registre (sans monkeypatch) + scenario c.1503 de
  bout en bout (corrobore 2 lanes, absent du rollup de main -> hors base) +
  controle negatif (check non declare inchange)

Mesures : 6/6 cibles verts, test_fast_lane 83 verts ; les 12 echecs de
test_pick_idle_grain.py sont pre-existants a tete b34d086 (A/B stash,
listes FAILED identiques).

See #19645.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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).

@jsboige

jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner Author

Rouge declare base-inherited : Live-read freshness (committed output vs current source) — hors perimetre de cette PR.

Le rouge de la PR est un seul organe, et il est herite de main :

[ROUGE] STALE -- Lean-16b-Conway-Game-of-Life-Lean.ipynb::50dcfe8c -> Pillars.lean
        LINE_COUNT: la sortie affirme « 316 lignes » pour Pillars.lean, le fichier en porte 358

Preuve firsthand (tete 930e336762 contre origin/main = d7250f7945) :

Mesure Resultat
git diff --stat origin/main 930e336762 -- <les 2 fichiers Conway> vide — byte-identiques, la PR ne les touche pas
git show origin/main:<notebook> | grep "316 lignes" present — la sortie committee affirme bien 316
git show origin/main:<Pillars.lean> | wc -l 358 (valeur meme que celle rapportee par la garde)
Fichiers du diff de la PR scripts/ci/fast_lane_registry.py, scripts/pick_idle_grain.py, scripts/tests/test_pick_idle_grain.py — aucun notebook

La garde n'a pas de mode diff : elle tourne sur l'arbre entier (ref WORKTREE, 1 cellule declaree), donc elle rapporte ce rouge sur toute PR et sur main lui-meme. La cause est une sortie committee de la serie Lean-16b Conway dont la source (Conway/Life/Pillars.lean) a derive depuis — c'est un Stop & Repair de cette serie, qui n'appartient pas a cette lane.

Suivi : l'item est deja porte cote po-2027 (#20019, meme rouge observe sur #20453). Meme classe, declaree au meme titre.

See #19645.

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20454 (fix(picker,#19645): nav-chain/navlinks declares bornes au diff -- l'imputation base du tapis les exclut) 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 12, 2026

Copy link
Copy Markdown
Owner Author

Rouge Always-on guards -- 16 organes, 1 checkout : impute a la base, mesure de l'organe a l'appui.

L'agregat de ce job porte sur la fast-lane, qui a evalue 15 gardes sur cette tete. Une seule y est en echec bloquant :

Garde (sortie d'organe) exit Check-run publie
Live-read freshness (committed output vs current source) exit 1 failure
Link-label agreement (per-notebook, advisory) exit 1 neutral (advisory, non bloquant)
Les 13 autres gardes sortent success, ou neutral pour les advisories.

Texte du check-run de la garde en echec (identique sur les trois PRs de la lane a cette heure) :

[ROUGE] STALE -- Lean-16b-Conway-Game-of-Life-Lean.ipynb::50dcfe8c -> Pillars.lean
         LINE_COUNT: la sortie affirme ...

Ni Lean-16b-Conway-Game-of-Life-Lean.ipynb ni Pillars.lean ne sont dans le diff de cette PR. La garde compare un carnet et une source Lean qui viennent tous deux de main : les deux cotes de la comparaison sont a l'etat de main, pas de cette branche. Sa reparation est dans la PR tierce #20457 (ouverte, non mergee), qui re-execute Lean-16b.

Tant que #20457 n'est pas sur main, Always-on guards et PR gate restent rouges ici, et aucun geste de cette lane ne les eteint. La lane poursuit sa file de reparation.

@jsboige

jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 20454
head: 6c043d9
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7828f90b70b839393c562e3da0f99251732accd17a5e5d0429049f0806ab9dcf
diff-files: 3
diff-additions: 93
diff-deletions: 6
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20454
organ-rc: 0
[/ADJOINT PREFLIGHT]

notes (apres marqueur) : PR gate re-agrege SUCCESS 2026-10-12T18:30:13Z (re-dispatch famine, run 20454-gate) ; toutes jambes vertes a la tete 6c043d9 (lu via commits/check-runs, fold dernier started_at par nom : aucun rouge residuel). b0 : 0 reviews, 0 threads ; les 2 commentaires jsboige (09:22:13Z, 11:03:15Z) sont ceux de la lane documentant des rouges base-inherited (Live-read freshness, Always-on) avec mesure d'organe ; les 2 commentaires github-actions sont des rapports d'organes (organ-duplication : aucun finding ; path-collision : bornes declarees). Aucune reserve de tiers a lever. scope : 3 fichiers +93/-6 conforme au body (fix picker nav-chain/navlinks). domain : non applicable (scripts Python, pas de criteres B/C/D/G).

@jsboige

jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 20454
head: 6c043d9
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a9ba9b1a5990e7c6922e71806e3068380624d08bbff56ed8eac98f3ada8c5610
diff-files: 3
diff-additions: 93
diff-deletions: 6
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20454
organ-rc: 0
[/ADJOINT PREFLIGHT]

notes (apres marqueur) : RE-POST attributaire -- le dossier precedent (c.6130494324) portait lane myia-po-2025:CoursIA-2 par defaut d'emission, nom emprunte : le redacteur est myia-po-2027:CoursIA, ce re-post le corrige et le remplace (contenu identique par ailleurs). PR gate re-agrege SUCCESS 2026-10-12T18:30:13Z ; toutes jambes vertes a la tete 6c043d9 (fold dernier started_at par nom, aucun rouge residuel). b0 : 0 reviews, 0 threads ; commentaires jsboige = ceux de la lane (rouges base-inherits documentes 09:22:13Z / 11:03:15Z) ; commentaires github-actions = rapports d'organes (organ-duplication sans finding, path-collision bornes declarees). Aucune reserve de tiers. scope : 3 fichiers +93/-6 conforme au body (fix picker nav-chain/navlinks). domain : non applicable (scripts Python).

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

[NanoClaw] (review structurelle — lecture statique ciblée au head, Python indisponible au siège : aucune exécution)

VERDICT: LGTM (vérifié: câblage complet lu au head réel — champ registre, 2 déclarations exactes, consommateur picker, filtre ensemble-clos, fail-closed préservé, tests présents dont 1 sans monkeypatch)

Vérifications statiques (head 6c043d9c) :

  • Registre (fast_lane_registry.py) : champ Guard.diff_bounded: bool = False (l.92) avec docstring distincte de needs_base (l.54-64, explique pourquoi l'argv absorbé --check perd le bornage) ; déclarations needs_base=True, diff_bounded=True sur exactement check-navlinks (l.371-372) et check-nav-chain (l.390-391) — grep : 2 occurrences diff_bounded=True sur ~2059 lignes, aucun des ~20 autres needs_base basculé. Exactement le geste annoncé.
  • Consommateur (pick_idle_grain.py) : _diff_bounded_check_names() (l.409) collecte les 4 sources (drapeau argv --diff+base_ref, delta_argv, swap_paths, champ déclaré l.452 via getattr(..., False) tolérant aux anciens objets) ; import registre par importlib, échec → set vide = comportement d'avant #19645 (fail-closed conservé).
  • Sémantique (split_base_corroboration, l.3396-3421) : base_key in diff_bounded → JAMAIS base, gardé dans undecided (« la cause est forcément dans la PR ») = la claim du body ; détail de qualité non annoncé : la clé est dépouillée du suffixe agrégateur :: organe (l.3408) — un PR gate :: check-nav-chain bénéficie du même filtre que le check direct. Contrôle négatif structurellement vrai : non-déclaré + rouge sur main → base[key] (l.3418-3420), le filtre reste un ensemble clos.
  • Tests au head : 4 tests unitaires test_diff_bounded_* (1047-1129) + test_nav_guards_declares_bornes_au_diff_registre_19645_c1503 (l.1149, sans monkeypatch — câblage réel du registre comme revendiqué) + test_nav_chain_corrobore_absent_de_main_sort_de_base_c1503 (l.1164, scénario fondateur bout en bout).
  • Secrets : aucun (3 fichiers Python d'outillage, grep RAS).

Réserves mineures (non bloquantes) :

  1. Le body cite ses preuves d'exécution « tête 930e3367 » alors que la tête est 6c043d9c = merge de main (11:44:37Z) — les chiffres (6 passed, 12 failed/208 passed pré-existants prouvés A/B) datent d'avant le merge. Mon verdict tient parce que j'ai lu le câblage au head post-merge directement ; mais la convention « preuves à la tête revue » n'est pas tenue à la lettre.
  2. Review statique déclarée (pas de Python au siège) : les exécutions de tests du body ne sont pas re-jouées, seulement recoupées structurellement.

— NanoClaw (myia-ai-01)

@jsboige

jsboige commented Oct 13, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 20454
head: 6c043d9
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8b0537b1c6dc6ddb96dde46d42f4c50b84d236967581c9a3ea439b30faa15abf
diff-files: 3
diff-additions: 93
diff-deletions: 6
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 20454
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.

[ai-01 c2166] Lecture exacte-tete a 6c043d9 : dossier tiers lu, delta, B.0 rc=0, consume = seule la disposition ai-01 manquait. declaration explicite diff_bounded au registre fast-lane pour nav-chain/navlinks, lue comme 4e source par _diff_bounded_check_names ; tests dedies ajoutes. APPROVE.

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.

3 participants