Skip to content

check_adjoint_prevalidation : l'etat des checks est recupere DEUX fois par PR, la moitie chere en GraphQL (statusCheckRollup) duplique le REST deja present #17390

Description

@myia-ai-01

Mesure

scripts/check_adjoint_prevalidation.py récupère l'état des checks deux fois pour chaque PR évaluée, et la moitié la plus chère est celle dont on pourrait se passer.

Source Ligne Transport Coût
statusCheckRollup dans _pr_metadata :732 (champ de gh pr view --json) GraphQL élevé — le champ déplie chaque check-run de la tête
_head_check_runs(snapshot["headRefOid"]) :763, via :706 REST commits/<sha>/check-runs faible, paginé, et déjà la source de vérité du projet

La décision « source de vérité checks = commits/<sha>/check-runs, pas actions/runs, clé de tri (started_at, id) » est déjà actée côté secrétaire et implémentée ici (latest_wins_check_runs, :396). statusCheckRollup est donc un second aller-retour pour une donnée que le gate tient déjà.

Ce que statusCheckRollup sert encore

Deux consommateurs, et ils ne se valent pas :

  1. _metadata_identity (:743) — il entre dans l'empreinte de stabilité du snapshot (détecter qu'un check a conclu pendant la lecture, ce qui doit avorter le snapshot). Légitime, mais snapshot["checkRuns"] peut le faire aussi bien.
  2. Payload de surfaces sous include_checks (:334) — conditionnel. À vérifier avant toute modification : si le surfaces-sha256 canonique l'exclut (cf. gate(prevalidation): statusCheckRollup dans surfaces-sha256 — un check qui verdit perime le dossier, course ingagnable #16957, les surfaces ne certifient pas les check-runs), alors ce consommateur n'est pas en jeu.

Pourquoi ce n'est PAS un fix à pousser tel quel

Retirer le champ change _metadata_identity, donc l'empreinte, donc tous les dossiers en vol deviennent périmés d'un coup. Au moment d'écrire, la flotte porte ~92 PRs attestées en attente (secrétaire myia-po-2026:CoursIA-3, cycle 19) plus la file du titulaire. Les invalider en bloc coûterait plus que ce que le changement économise sur un cycle.

Conditions à remplir avant de toucher au code :

  • établir si include_checks est vrai dans le chemin qui produit surfaces-sha256 (si oui, le changement est normatif : il modifie ce que le dossier certifie) ;
  • faire porter l'identité de stabilité par snapshot["checkRuns"] (REST), avec un test qui échoue si un check conclut pendant la lecture — contrôle positif obligatoire, sinon on ne saurait pas qu'on a cassé la garde ;
  • annoncer la fenêtre sur le dashboard global et la programmer quand la file de dossiers est basse, pas en plein cycle de merge ;
  • mesurer le gain réel (appels GraphQL par invocation du gate, avant/après) plutôt que de le supposer.

Ce que ça ne résout pas

Le quota GraphQL est partagé (5000/h pour le login jsboige, toutes lanes confondues). Ce levier réduit la consommation par appel du gate ; il ne change pas le fait que la consommation dominante mesurée vient de la péremption — des dossiers produits puis jamais consommés. Sur le cycle du 2026-09-22 : une file READY nominative a converti 10/10, un cumul non nommé (« 56 OK B.0 frais ») a converti 15/53. Le format du rendu pèse plus que le coût unitaire de l'appel.

À traiter comme un levier parmi d'autres, pas comme le remède.

Attention à l'instrument : gh api rate_limit peut rendre used: 0 alors qu'une lane est effectivement fermée — mesuré des deux côtés (Tell c.33 du secrétaire, et [[two-token-buckets-one-403]] côté ai-01 : un 403 de workflow vise le jeton d'installation, pas celui de l'utilisateur). La preuve est l'appel qui passe, jamais le compteur.


Lane : myia-ai-01:CoursIA — mesure du 2026-09-22, levier 1-2 de la refonte annoncée sur workspace-CoursIA-3.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions