Skip to content

Fix(tooling,#19937): check_run_state -- head resolu par REST, repli GraphQL - #19938

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/check-run-state-rest-head
Oct 8, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/check-run-state-rest-head

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner

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

Le defaut

scripts/check_run_state.py resout le head d'une PR par gh pr view --json headRefOid — GraphQL. Sous throttle GraphQL l'instrument entier meurt, alors que core est ouvert et que le meme champ est servi par REST :

$ python scripts/check_run_state.py --pr 19912
instrument error: gh pr view 19912 --repo... -> 1: GraphQL: API rate limit already exceeded for user ID 3159389.

$ gh api repos/jsboige/CoursIA/pulls/19912 --jq .head.sha
359ea17fa33b3770346c091aa024c182876d6f5c          # core: 5000/5000, graphql: 4461/5000

Pourquoi ce n'est pas cosmetique : la panne devient un diagnostic sur la PR

scripts/pick_idle_grain.py appelle cet organe. Le 2026-10-08 il a classe trois PR de la lane en :

ROUGE IMPUTE A LA BASE -- pas le votre, pas reparable par la lane : PR gate : organe non lisible sur #19910, #19912, #19913, #19916, #19917, #19923 -- pas pu trancher, le rouge RESTE a la lane

Une panne de transport y est lue comme une categorie de diagnostic de la PR. Cout double : le picker ne classe plus, et la lane lit « le rouge reste a la lane » la ou il n'y a aucun rouge a lire.

Ce que le correctif retablit — et ce qu'il a immediatement rendu visible

PR avant apres
#19912 instrument error 101 jambes / 101 noms — dont un vrai [RED] Always-on guards -- 16 organes, 1 checkout: failure @2026-10-08T12:10:46Z
#19913 instrument error 4 jambes / 4 noms
#19917 instrument error 20 jambes / 20 noms, vertes

Le correctif s'est paye au premier run : le rouge reel de #19912 etait invisible tant que l'organe etait mort. Un instrument qui tombe ne dit pas seulement « je ne sais pas » — il retire ce qu'il aurait vu.

Portee

Les deux chemins rendent le meme SHA : REST en tete parce que c'est le transport qui survit au throttle qui a produit le defaut ; GraphQL garde en repli pour le cas inverse (endpoint pulls indisponible, jeton sans scope). Ce n'est pas un choix de source, c'est une redondance de transport — et elle est documentee comme telle dans la docstring, pour qu'un futur lecteur ne la lise pas comme une preference.

Validation

  • python -m pytest scripts/tests/test_check_run_state.py -q → 15 passed (12 existants + 3 ajoutes).
  • Non-regression organes voisins : test_pick_idle_grain.py + test_check_run_state.py → 219 passed.
  • Les 3 tests ajoutes : le fondateur (GraphQL throttle / REST debout, avec assertion que aucun appel GraphQL n'est tente), son inverse (REST tombe / GraphQL debout — meme SHA), et un controle negatif : les deux chemins tombes doivent lever, pas rendre un SHA vide, pour que l'echec ne redevienne pas silencieux.

Fichiers

  • scripts/check_run_state.py — _head_sha() : REST puis repli
  • scripts/tests/test_check_run_state.py — 3 tests

Closes #19937

🤖 Generated with Claude Code

…raphQL

`gh pr view --json headRefOid` est GraphQL : sous throttle l'instrument
mourait entierement (`instrument error`) alors que `core` etait ouvert
(5000/5000) et que REST sert le meme champ.

Consequence mesuree : `pick_idle_grain.py`, qui appelle cet organe, classait
trois PR de la lane en « organe non lisible -- pas pu trancher, le rouge
RESTE a la lane ». Une panne de transport devenait une categorie de
diagnostic sur la PR.

REST en tete, GraphQL en repli -- meme SHA, redondance de transport.
Mesure apres correctif : #19912/#19913/#19917 passent de `instrument error`
a 101/4/20 jambes lues, et le rouge REEL de #19912 (`Always-on guards`
failure 12:10:46Z) etait invisible tant que l'organe etait mort.

3 tests : le fondateur (GraphQL throttle, REST debout), son inverse, et un
controle negatif (les deux chemins tombes doivent lever, pas rendre vide).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 8, 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).

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19938
head: 1f969e2
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 75618e50d643991cd228f71a276e5ca064446f8999180896d99975bfeb0fb717
diff-files: 2
diff-additions: 69
diff-deletions: 2
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 19938
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.

Lecture finale ai-01 : body, commentaires, reviews, threads et diff lus ; B.0 rc=0. Correctif REST puis repli GraphQL valide a cette tete : 219 tests passes et py_compile exit 0, controle negatif des deux transports indisponibles inclus. Aucun catalogue ni harnais modifie.

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

Labels

None yet

Projects

None yet

2 participants