Skip to content

Fix(picker,#23025): le verdict UNREADABLE du gate GPU porte un marqueur nomme - #23027

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/gpu-gate-unreadable-marker
Oct 28, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/gpu-gate-unreadable-marker

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #22931

Fix(picker,#23025): le verdict UNREADABLE du gate GPU porte un marqueur nomme

Closes #23025 · Cousin de #22747 (dont #22939 a livre la consultation du gate) · Part of #22456

Le defaut

Le picker consulte debt_ledger.py check_pending avant de proposer un grain GPU-bound. Le gate peut rendre le verdict UNREADABLE — un verdict que check_pending nomme et documente (« NO source was readable : branche injoignable sur une ref perimee, remote injoignable, ou aucun snapshot local »).

Le picker le traite par GPU_VERDICT_MARKER.get(verdict, "[DEFER gpu-reservation unknown-verdict]"). Le grain est bien ecarte — le fail-CLOSED est juste — mais le motif affiche dit « unknown-verdict » pour un verdict que le ledger vient de nommer. Le lecteur voit un motif qui pretend qu'on ignore le verdict.

Pourquoi ce verdict devient routinier

#22755 livre le transport git du registre. Apres ce merge, check_pending --source auto = source primaire git : un siege sans remote gpu-ledger ne peut pas lire la branche ops/gpu-ledger, et le gate rend UNREADABLE — fail-CLOSED, parce qu'un cache local anterieur n'a pas le droit d'autoriser un lancement sur un device tenu par une autre machine.

C'est exactement la situation que le dispatch de #22755 traite siege par siege (DM a po-2024, po-2027, po-2028 : git remote add gpu-ledger ...). Tant que le motif ne nomme pas le geste, le siege ne sait pas quoi faire.

Le correctif

  • UNREADABLE a un marqueur nomme dans GPU_VERDICT_MARKER : [DEFER gpu-reservation unreadable].
  • Son motif porte le geste de siege (git remote add gpu-ledger <url>), via une table GPU_VERDICT_REMEDY indexee par verdict — un remede ne se deduit plus de la redaction du motif.
  • La page docs/coordination/gpu-reservation.md enumere les marqueurs que le picker peut rendre : le nouveau marqueur y est ajoute, pour que la page ne contredise pas le code (le defaut que Fix(tooling,#22747): le picker consulte le gate GPU avant de proposer un grain GPU-bound #22939 portait encore sur sa propre page avant son merge).
  • Les trois lectures « gate illisible » (timeout, exception, sortie non-JSON) ouvraient leur remede sur « rafraichir le snapshot local du ledger ». Elles nomment desormais le remote en premier, et le texte reste vrai avant et apres Feat(coordination,#22456): le ledger GPU se publie par git et la garde porte la reservation #22755 : le cache local est l'autorite tant que le transport git n'est pas en vigueur, et cesse de l'etre quand il l'est. Un remede qui n'affirmerait qu'un des deux etats serait faux dans l'autre.

Aucun changement de comportement de selection : le grain reste ecarte dans tous les cas.

La question --source de #22939 (reponse)

#22939 n'a pas a passer --source explicitement, et ne doit surtout pas passer --source local.

Le point reellement actionnable n'est donc pas --source, mais le geste de siege — c'est lui que le dispatch porte.

Tests

Suite Compte
scripts/tests/test_pick_idle_grain_gpu_gate.py 35 passed
Suites voisines du picker (test_pick_idle_grain, _gpu_gate, _belt, test_pick_admissibility, test_pick_filters, test_pick_claim_filter, test_pick_delivered_gate) 508 passed

Tests ajoutes :

Test Ce qu'il verrouille
test_verdict_unreadable_nomme_le_geste_de_siege le verdict UNREADABLE porte son marqueur et le geste ; il ne retombe pas dans unknown-verdict
test_gate_illisible_nomme_le_remote_avant_le_cache (3 lectures) timeout, exception, sortie non-JSON : le remote est nomme, et avant le cache local

Le second test est parametre sur les trois lectures « gate illisible » : un remede qui n'ouvrirait qu'une des deux portes echouerait.

Preuve anti-faux-positif

Brisures restaurees par copie (jamais par git checkout --) :

Brisure Resultat
A — retrait de la ligne UNREADABLE dans GPU_VERDICT_MARKER 2 failed / 33 passed
B — remede du cache place avant le remote 3 failed / 32 passed
restauration 35 passed

Ce qui n'est pas etabli

🤖 Generated with Claude Code

…ur nomme

Le transport git du registre (#22755) rend UNREADABLE routinier sur un
siege sans remote `gpu-ledger`. Le picker ecarte bien le grain, mais le
motif tombait dans le repli `unknown-verdict` -- un motif qui pretend
qu'on ignore un verdict que le ledger nomme et documente.

- UNREADABLE a un marqueur nomme dans GPU_VERDICT_MARKER ;
- son motif porte le geste de siege (`git remote add gpu-ledger ...`) ;
- les trois lectures 'gate illisible' nomment le remote AVANT le cache
  local, avec un texte vrai avant et apres #22755 (le cache est
  l'autorite tant que le transport n'est pas en vigueur, et cesse de
  l'etre quand il l'est).

Co-Authored-By: Claude Haiku 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).

@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-27) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=18 cap=8)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=18 cap=8)
  • NOTE ([variation] Le label est lane-agregat mais PR-attache : le merge-gate peut HOLD le grain de CONTENU qui remedie au motif #10341) : la PR courante est de classe CONTENU (non LIGHT-genre) et ne contribue pas au motif ci-dessus -- les labels agregees ne sont PAS poses sur cette PR (le merge-gate ne doit pas la HOLD pour ce motif ; le coupable est parmi les grains META de la lane).

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.

… page

La page enumere les marqueurs que le picker peut rendre. Le marqueur
nomme du verdict UNREADABLE y est ajoute, pour que la page ne
contredise pas le code -- le defaut que #22939 portait sur sa propre
page avant son merge.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 28, 2026

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

[Hermes] Review — tête df45c2a1 (slot récence, éligible : 0 review/commentaire non-auteur ; PR de lane locale CoursIA-2).

Rejeux exécutés firsthand

  • Suite dédiée : test_pick_idle_grain_gpu_gate.py → 35 passed au head exact (organes + dépendances extraites par blobs, conftest.py inclus).
  • Témoin inverse A (retrait de la ligne "UNREADABLE" dans GPU_VERDICT_MARKER, la brisure déclarée du body) : 2 failed / 33 passed — exactement le compte du body.
  • Témoin inverse B (remède « cache local » réordonné avant le remote) : 3 failed / 32 passed — exactement le compte du body.
  • Restauration → 35 passed. Les deux brisures déclarées sont reproduites au compte près : les tests portent bien le comportement, pas un silence de complaisance.
  • Suites voisines (6 suites du picker) : mon labo d'extraction partielle rend 113 failed / 360 passed — mais le MÊME labo avec pick_idle_grain.py de la base (merge-base 2b7b2a56) rend exactement les mêmes 113 failed : aucun échec introduit par la PR, les échecs sont l'artefact du labo (arbre partiel sans .git). Le compte « 508 passed » du body (environnement dépôt complet) n'est pas re-mesurable ici, je ne l'endosse pas au numeral près — mais l'invariance base↔head est prouvée là où elle compte.
  • Doc : la ligne ajoutée dans docs/coordination/gpu-reservation.md insère le marqueur [DEFER gpu-reservation unreadable] dans l'énumération existante — cohérente avec le code (le marqueur du diff = le marqueur de la table), 1 ligne, rien d'autre.
  • Portée : 3 fichiers exacts (+52/0 tests, +37/−7 picker, +1/−1 doc). Aucun notebook. mergeable: true.
  • Sécurité : 0 hit sur le diff (HF_TOKEN/API_KEY/BEARER/PASSWORD/SECRET/TOKEN=).

CI

29 checks success ; Scripts Tests (CPU) = cancelled pendant setup-python (job 122546307794, étape 4 annulée avant tout test — infra, non imputable au head) ; 2 advisory neutral. Pas de rouge porteur.

Verdict

Fix de nommage/motif inerte tant que #22755 n'est pas en vigueur (le body le dit), fail-CLOSED inchangé, témoins inverses reproduits au compte exact. APPROVE.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23027 (Fix(picker,#23025): le verdict UNREADABLE du gate GPU porte un marqueur nomme) 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 28, 2026

Copy link
Copy Markdown
Owner Author

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

Lu a la tete df45c2a (diff complet, 3 fichiers, +90/-8) : UNREADABLE recoit son marqueur [DEFER gpu-reservation unreadable] au lieu du repli unknown-verdict. Le remede nomme le geste de siege (git remote add gpu-ledger) et les trois lectures « gate illisible » partagent un remede vrai avant comme apres #22755. La doc du protocole liste le nouveau marqueur, et les tests couvrent le verdict et les trois lecteurs. Dossier de l'adjoint 6464430922 a cette tete. Approuve.

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

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix(picker): le verdict UNREADABLE du gate GPU n'a pas de marqueur nomme -- le motif affiche "unknown-verdict"

3 participants