Skip to content

Le gate de Phase 4 n'accepte qu'UN auteur de dossier : troisieme plafond de debit, mesure sous rate-limit secondaire #17020

Description

@myia-ai-01

Le constat

Le gate de Phase 4 (scripts/check_adjoint_prevalidation.py) exige que le commentaire-dossier soit ecrit par un seul compte GitHub :

SHARED_GITHUB_LOGIN = "jsboige"
...
    if dossier.author != SHARED_GITHUB_LOGIN:
        errors.append(f"comment author must be {SHARED_GITHUB_LOGIN!r}")

(lignes 108 et 397-398 sur main au 2026-09-20)

Le dossier etant l'unique ticket d'entree de la passe de merge, la production de dossiers de toute la flotte passe par un seul compte, dont le quota d'API est partage par toutes les lanes.

La mesure qui rend le plafond visible (2026-09-20, ~17 h UTC)

Identite gh api user gh api rate_limit
jsboige 403 API rate limit exceeded for user ID 3159389 core 5000/5000, graphql 5000/5000, toutes ressources pleines
myia-ai-01 200 idem, pleines

Deux faits se lisent ensemble :

  1. Le refus est un rate-limit SECONDAIRE (anti-rafale). Il n'apparait pas dans /rate_limit : l'endpoint affichait quota plein sur les 15 ressources pendant que les appels reels rendaient 403. Le seul instrument fiable est la sortie d'un vrai appel.
  2. Pendant ce refus, aucun dossier ne peut etre emis par personne — ni l'adjoint, ni une lane, ni le coordinateur — alors que myia-ai-01 etait a quota plein et que les organes, une fois epingles sur lui (GH_TOKEN=$(gh auth token --user myia-ai-01)), fonctionnaient normalement.

Autrement dit : la flotte disposait d'un reservoir intact et n'avait pas le droit de s'en servir, parce que le gate reconnait l'auteur, pas la lane.

Pourquoi c'est le meme defaut que #16907, une couche plus bas

#16907 a elargi quelle lane peut declarer (ADJOINT_LANE -> QUALIFYING_LANES). Le controle d'auteur est reste : le goulot a simplement change d'etage. C'est [[a-gate-with-one-producer-is-a-throughput-ceiling]] qui recidive, et le troisieme plafond en serie apres le monopole de lane et la course d'empreinte (#16957 / PR #16967).

Piste de correctif (a arbitrer, pas encore un mandat)

Remplacer le scalaire par une allowlist de comptes du cluster, exactement la forme retenue pour les lanes dans #16907 :

DOSSIER_AUTHORS = frozenset({"jsboige", "myia-ai-01", ...})

Le champ lane: reste ce qu'il est aujourd'hui — une declaration fail-closed, pas une preuve cryptographique d'identite — et la regle anti-auto-prevalidation (self-prevalidation refused, deja presente lignes 390-396) continue d'empecher une lane d'attester sa propre PR. L'elargissement porte sur qui tient le stylo, pas sur qui peut se valider soi-meme.

Ce qui reste a etablir avant d'ecrire une ligne

  • Le rate-limit secondaire est-il par utilisateur ou par (utilisateur, IP) ? Le message nomme un user ID, mais si la portee inclut l'IP, les lanes distantes n'etaient peut-etre pas bloquees — ce point change l'ampleur du probleme, et il est SUPPOSE, pas mesure.
  • Quel elargissement conserve la propriete que le gate cherche a garantir : qu'un dossier ne soit pas ecrit par la lane qui porte la PR.
  • Mesurer, apres correctif, ce qu'il libere reellement — et non ce qu'il devrait liberer (cf. l'ecart attendu 29 / mesure 2 de harness(gate,#16906,#16928): la prevalidation Phase 4 accepte une lane tierce, et un dossier suivi de sa prose #16907).

Gouvernance

Changement normatif substantiel du harnais : PR + sign-off user avant merge (CLAUDE.md §A). Cette issue porte la mesure et la piste ; elle ne prejuge pas de l'arbitrage.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions