Skip to content

fix(nits,#14705): voie 3 B.0 — élargir la borne nommeur au coordinateur (LIFT_OVERRIDE_LOGINS) - #15625

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/14705-voie3-coordinator-namer
Sep 12, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/14705-voie3-coordinator-namer

Conversation

@jsboige

@jsboige jsboige commented Sep 11, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2026:CoursIA — prev: MED/docs #15577

Le défaut (cas mesuré #14673 / #14704)

La voie 3 de B.0 — « une issue de suivi ouverte et nommée AVANT le merge (reportée sciemment) » — ne pouvait pas être exercée par le coordinateur. Les 3 surfaces voie 3 de check_unaddressed_nits.py créditaient un report uniquement quand le nommeur est l'auteur du nit ou l'auteur de la PR (borne c.705, élargie une fois à l'auteur de la PR par #13563 — jamais au coordinateur).

Sur #14673 (réserve Hermes du 2026-09-04, issue de suivi #14704) : toutes les conditions de substance passaient (cond. 5 « issue créée après la réserve » ✓, cond. 6 « référence la PR » ✓, fenêtre ✓), seule l'identité échouait (namer='myia-ai-01', login='jsboige', pr_author='jsboige'). collect_followup_lifts collectait bien le report — c'est la borne d'identité appliquée dans analyse() qui le jetait. Conséquence : merge passé par [OVERRIDE] lane (porte d'arbitrage exceptionnel) pour un report que B.0 prévoit comme voie ordinaire.

Pourquoi la garde ne transpose pas

La borne d'auteur existe pour une bonne raison sur les voies 1 et 2 : se lever soi-même la réserve d'un tiers n'est pas y répondre (#11145, #12798). Cette raison ne transpose pas à la voie 3 : une voie-1 affirme que la réserve est traitée (d'où la borne), une voie-3 affirme le contraire — la réserve est reportée, tracée, datée. Un report se falsifie en n'ouvrant pas l'issue, et cela, les conditions 1-6 (#14218) le vérifient déjà côté serveur (issue réelle, ouverte, postérieure à la réserve, référençant la PR).

Le correctif

Les 3 sites voie 3 reçoivent or namer in LIFT_OVERRIDE_LOGINS — réutilisation de la constante existante qui nomme le coordinateur pour l'override, aucune surface neuve. Les voies 1 et 2 gardent leur borne d'auteur inchangée.

Site Surface Lignes
analyse, réserve Hermes / re-review lifted = (...) ~l.3857
analyse, blocage (#13495) elif kind == "BLOCK" ~l.3885
analyse, nit en commentaire/review COMMENTED elif (...) ~l.3906
or any(when < t < cutoff
       and (namer in (login, pr_author) or namer in LIFT_OVERRIDE_LOGINS)
       and when < info.created_at
       and _issue_references_pr(info, pr_number)
       for (t, namer, info) in followup_lifts))

Docstring de collect_followup_lifts et commentaires de site mis à jour (#14705 cité).

Validation

Acceptance #14705 → tests

Critère d'acceptance Test
Report nommé par myia-ai-01, conditions 1-6 → lève sans [OVERRIDE] test_14705_coordinateur_leve_reserve_hermes (le cas mesuré #14673) + les 2 autres surfaces (_leve_blocage, _leve_changes_requested)
Contrôle négatif : tiers quelconque ne lève pas test_14705_tiers_non_coordinateur_ne_leve_pas (bystander ≠ coordinateur) + test_voie3_bystander_ne_leve_pas existant
Contrôle négatif 2 : voies 1/2 fermées à l'auto-levée 493/493 sur les fichiers existants (dont test_trappe_refusee_pour_lauteur_de_la_pr)
Cas mesuré : nit-auteur == pr-auteur == jsboige, nommeur == myia-ai-01, issue postérieure référençant la PR → lève test_14705_coordinateur_leve_reserve_hermes
Mutation : si la borne coordinateur est retirée, les tests rougissent test_14705_mutation_sans_constante_les_fp_rougissent (LIFT_OVERRIDE_LOGINS vide → le report coordinateur ne lève plus)

Un 7ᵉ garde inattendu s'est révélé utile : test_14705_coordinateur_conditions_toujours_exigees — le coordinateur reste soumis à la condition 6 (l'issue doit citer la PR) : l'élargissement d'identité ne remplace pas la substance.

Closes #14705

🤖 Generated with Claude Code

Les 3 surfaces voie 3 (reserve Hermes, blocage, nit en commentaire)
creditaient un report nomme uniquement par {auteur du nit, auteur de la
PR} (borne c.705/#13563). Or B.0 est le gate du coordinateur : pour le cas
mesure #14673/#14704, toutes les conditions de substance passaient et
seule l'identite du nommeur echouait -- le merge a du passer par
[OVERRIDE] lane, porte d'arbitrage exceptionnel, pour un report que B.0
prevoit comme voie ordinaire.

La garde d'auteur garde sa raison d'etre sur les voies 1/2 (se lever
soi-meme n'est pas repondre, #11145/#12798) ; elle ne transpose pas a la
voie 3, qui affirme le contraire -- la reserve n'est pas traitee, elle est
reportee. Un report se falsifie en n'ouvrant pas l'issue ; les conditions
1-6 (#14218) le verifient cote serveur.

Reutilise LIFT_OVERRIDE_LOGINS (deja la constante qui nomme le
coordinateur pour l'override) : aucune surface neuve.

Tests: 6 ajoutes (3 surfaces coordinateur, tiers non-coordinateur,
conditions 6 toujours exigees, mutation LIFT_OVERRIDE_LOGINS vide).
31/31 followup + 493/493 sur les 5 autres fichiers du script.

Closes #14705

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

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-11) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=7 genre=15 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=7 genre=15 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.

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Sep 11, 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.

VERDICT: LGTM (vérifié: fichiers base+head téléchargés et comparés localement — exactement 3 sites voie 3 élargis dans analyse(), conditions d'admission préservées verbatim, voies 1/2 intactes, 6 tests neufs lus intégralement ; non exécutés, python absent du conteneur)

[NanoClaw] structural review — fix(nits,#14705): voie 3 B.0 — élargir la borne nommeur au coordinateur, 2 fichiers (check_unaddressed_nits.py +17, test_followup.py +105), head f7e77652.

Vérifié firsthand

  • Élargissement chirurgical, confirmé au diff local base d14b1ac0 ↔ head : 4 hunks au total — 1 extension de docstring (collect_followup_lifts, séparation conditions 1-4 / 5-6 documentée) + exactement 3 sites dans analyse() (l.~3869/3904/3926) où namer in (login, pr_author) devient namer in (login, pr_author) or namer in LIFT_OVERRIDE_LOGINS. Le fichier ne contient que 3 occurrences de namer in — toutes trois en voie 3, toutes trois élargies. Les voies 1/2 (_lift_eligible, _approved_lifts_reserve) sont intactes, et LIFT_OVERRIDE_LOGINS = {"myia-ai-01"} (l.134) est préexistante, réutilisée telle quelle — aucune valeur neuve, cohérent avec le « aucune surface neuve » du corps de PR.
  • Conditions d'admission préservées verbatim sur les 3 sites : when < t < cutoff (fenêtre), when < info.created_at (review antérieure à l'issue), _issue_references_pr(info, pr_number) (l'issue référence la PR). L'élargissement ne touche que l'identité du nommeur crédité, pas les gardes — la levée reste bornée aux issues de suivi délibérées, post-review, référençant la PR.
  • Tests bien conçus (+105/-0, 6 nouveaux) : 3 positifs (issue de suivi du coordinateur lève une réserve Hermes / un blocage / un CHANGES_REQUESTED), 1 négatif (un tiers ne lève pas), 1 de préservation des conditions (issue ne référençant pas la PR → pas de levée), et 1 test de mutation qui vide LIFT_OVERRIDE_LOGINS et vérifie que les faux positifs rougissent — il rebind le global du module et attend blocked is True, donc il lie la lecture au moment de l'appel et attraperait toute régression silencieuse du mécanisme. Tous les helpers (run, resolver, make_issue, at, fixtures HERMES_NIT/REPORT_COORD) préexistent à la base — aucun fixture welding.
  • 0 secret, 0 chemin personnel dans les deux fichiers au head.

Notes (non bloquantes)

  1. Granularité PR-level de la condition 6 (préexistante, désormais aussi au coordinateur) : _issue_references_pr est vérifié au niveau PR, pas au niveau nit — une seule issue de suivi du coordinateur lève donc toutes les réserves éligibles de la PR (toutes les reviews Hermes antérieures à l'issue). C'est la sémantie déjà en vigueur pour pr_author, cohérente avec l'intention (une issue de suivi = arbitrage global), mais l'élargissement augmente le nombre d'identités capables de le faire : la valeur de confiance du compte coordinateur myia-ai-01 monte d'un cran. À garder en tête si la liste grandit un jour.
  2. Aliasing sémantique de LIFT_OVERRIDE_LOGINS : la constante sert désormais deux rôles — acteur OVERRIDE (voie 1, préexistant) et nommeur crédité en voie 3 (neuf). Ajouter une machine à la liste pour un motif voie 1 élargirait silencieusement le crédit voie 3. Une constante distincte (ex. FOLLOWUP_LIFT_LOGINS) ou un commentaire reliant explicitement les deux rôles éviterait la dérive future. Pas un défaut de ce diff — le partage est délibéré et annoncé dans le corps de PR.

Portée (honnêteté) : diff intégral des 2 fichiers vérifié localement, hunk par hunk (le script hôte de 4 286 lignes est inchangé partout ailleurs). Les 6 tests ont été lus statiquement, pas exécutés — python est absent de mon conteneur ; l'exécution CI de la suite reste la preuve runtime. Je n'ai pas rejoué le script complet sur un corpus réel de PR.

Merge = Emerjesse.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15625 (fix(nits,#14705): voie 3 B.0 — élargir la borne nommeur au coordinateur (LIFT_OVERRIDE_LOGINS)) 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) signifie que la substance est deja sur main : le cote merge n'est plus une collision a arbitrer, c'est du travail deja integre.

@myia-ai-01
myia-ai-01 merged commit 702ae53 into main Sep 12, 2026
16 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

check_unaddressed_nits: la voie 3 de B.0 (issue de suivi nommee) est fermee au coordinateur -- borne de nommeur trop etroite

3 participants