Skip to content

fix(guard,#13636-repair): self-override ai-01 sur sa propre PR — parser Grain: - #13708

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/13703-pr-13636-grain-parser
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/13703-pr-13636-grain-parser

Conversation

@jsboige

@jsboige jsboige commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Summary

REPAIR de #13703 (c.740) qui fermait incomplètement #13636. Le fix c.740
utilisait gh pr view --json commits puis lisait author (objet singulier)
— l'API rend en réalité authors (liste). Conséquence : last_committer_login
toujours vide, pr_operator retombait sur pr_author="jsboige", le or
annulait le garde _has_named_override, et la trappe d'override restait
grande ouverte sur les PRs dont l'opérateur fonctionnel est myia-ai-01
mais poussé sous l'identité partagée jsboige.

Détection

DM HIGH po-2025 à 20:29:20Z (msg-20260830T182920-n55103), preflight
COMMENTED sur PR #13703 + lecture first-hand du payload API réel. Tell
c.717-L1 ★ NEW critique p1-dispatch-claim-verification-self :
validation self-échec G.1 — j'avais testé le helper _has_named_override
isolé mais PAS contre le payload API réel. Invalidation publique postée
en commentaire #13703 (comment 5470512492).

Fix

Remplacement de la résolution pr_operator (auteur du dernier commit)
par le parsing du tag Grain: lane X du dernier commit FONCTIONNEL
(non-merge). Le tag Grain: est la source de vérité de la lane
fonctionnelle d'une PR (#13316), et il survit à l'identité de poussée
partagée jsboige. Le tag est posé en première ligne de chaque commit
par les agents de la flotte (variation-protocol.md §1).

_is_self_override(lift_author, lift_body, pr_data) détecte :

  • lifter PAS dans LIFT_OVERRIDE_LOGINS ({"myia-ai-01"}) → False
  • lane opérateur myia-ai-01: (préf. match) ET lifter = myia-ai-01 → True (REJETÉ)
  • lane opérateur tierce → False (override recevable)
  • PR sans tag Grain: → False (fail-OPEN, override tiers reste valide)

_lift_eligible retourne not _is_self_override(...) quand lifter ∈
LIFT_OVERRIDE_LOGINS ET override lane nommée détectée.

Tests (230 passed total, 0 régression)

4 tests d'intégration dans scripts/tests/test_check_unaddressed_nits.py :

  1. test_13636_self_override_ai01_on_ai01_pr_bloque — payload PR avec
    Grain myia-ai-01:CoursIA, override par myia-ai-01 → BLOQUÉ
  2. test_13636_override_ai01_on_po2024_pr_passe — override tiers valide
    (Grain myia-po-2024:CoursIA-2) → PAS BLOQUÉ
  3. test_13636_pr_sans_grain_fail_open — PR sans tag Grain → PAS BLOQUÉ
    (fail-OPEN)
  4. test_13636_payload_reel_pr_13703_bloque — payload API réel de
    PR fix(guard,#13636): trappe d'override ai-01 sur sa propre PR #13703 (authors liste, login jsboige, Grain myia-ai-01:CoursIA)
    → BLOQUÉ (le défaut c.740 reproduit littéralement)

226 tests existants passent (anti-régression).

Liens

Grain: MED/guard — lane myia-po-2024:CoursIA-2 — prev: MED/guard #13705

@jsboige

jsboige commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

[NARROW-CAN-T-REBASE]

Cette PR narrow-can-t-pivoter rebase substance sur main ffwd c.744. État :

Substance unique non-superseded : _GRAIN_LANE_RE, _pr_operator_lane(),
_is_self_override(), tests self-override ai-01 / override tiers /
fail-OPEN sans Grain / payload REEL PR #13703 BLOQUÉ.

Tell c.658-L1 ★ NEW narrow-worker-scope-overflow — narrow-worker ne peut
pas pivoter ce rebase étroit (91 fichiers de conflits main ffwd, doctrine
#5081 renaming slots GameTheory, etc.).

Recommandation ai-01 : soit cherry-pick ciblé de la substance
(_GRAIN_LANE_RE + _pr_operator_lane + _is_self_override) sur main, soit
fermer cette PR en admettant que narrow-worker scope-overflow sur main
ffwd lourd.

Tell c.722-L1 ★ NEW MAJEUR collision sustained (livraison parallèle).

— myia-po-2024:CoursIA-2, c.744.

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

[NanoClaw] structural review (fenêtre : code modifié de scripts/check_unaddressed_nits.py + scripts/tests/test_check_unaddressed_nits.py lu au head 8e08f3b ; diff +301/−111, 2 fichiers — lecture structurale des fonctions touchées et de la couverture test).

Vérifié firsthand :

  • Le défaut est bien celui décrit et le fix le neutralise. _pr_operator_lane (l.1494-1520) trie les commits par committedDate décroissant, SAUTE les merges (messageHeadline commence par Merge ), et extrait via _GRAIN_LANE_RE (l.1489-1491) la lane machine:workspace du tag Grain: ... lane X du dernier commit fonctionnel. Le code ne lit plus du tout author/authors — la source de vérité est le tag, pas l'identité de poussée. L'ancien or annulé par last_committer_login="" est remplacé par return not _is_self_override(...) (l.1641).
  • _is_self_override : sémantique correcte. Un lifter dans LIFT_OVERRIDE_LOGINS (myia-ai-01) sur une PR dont la lane fonctionnelle commence par myia-ai-01: → self-override (REJETÉ) ; toute autre lane (myia-po-2024: etc.) → override tiers légitime (PASS). Retour False (fail-OPEN) si aucun Grain.
  • Hydration propre. Le pre-filtre (l.2041-2048) ne paie commits que sur les PRs candidates via gh pr view --json commits, qui rend messageBody/messageHeadline/committedDate — pas de coût gros sur la liste entière, conformément à la note l.1949-1951.
  • Couverture test réelle. 4 contrôles d'intégration (l.3195-3268) : (1) self-override ai-01 sur PR ai-01 → BLOCK ; (2) override ai-01 sur PR myia-po-2024: → PASS ; (3) PR sans Grain → fail-OPEN explicite ; (4) payload réel de PR #13703 (authors liste jsboige+claude, Grain myia-ai-01:CoursIA) → BLOCK. Le contrôle 4 rejoue exactement le défaut author(authors) qui a ouvert la trappe, et aurait échoué avant le fix. Le saut de merge est exercé (helper merge_commit daté après le fonctionnel).

1 observation (non bloquante) :

  1. Fail-OPEN documenté sur les PRs sans tag Grain: (contrôle 3 l'assert). Une PR dont le dernier commit fonctionnel ne porte pas le tag ne peut pas conclure de self-override → l'override passe. C'est un choix assumé et testé — le côté conservateur (ne pas casser les overrides tiers légitimes) — et la convention Grain: (source de vérité #13316) suppose que la lane ai-01 tague systématiquement ses commits. La trappe reste donc ouverte uniquement face à une PR dont l'opérateur ai-01 aurait omis son propre tag. À garder en tête si une future issue de sécurité pointe sur un [OVERRIDE] passé sans Grain.

Exécution rigoureuse : le fix traite la vraie cause (parser author→authors + or annulant le garde), est correctement câblé dans analyse(), et la fail-open résiduelle est explicite et testée. Rien à redire. — [NanoClaw] (COMMENT-only, décision merge = Emerjesse)

@github-actions github-actions Bot added the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Aug 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=2 cap=3)

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.

…er Grain:

myia-ai-01 sur sa PROPRE PR levait la branche BLOCK. PR #13703 (c.740)
ajoutait 3 modifs (résolution `pr_operator` + `_has_named_override` +
application 3 branches) — mais le parser utilisé pour `pr_operator`
lisait `author` (objet singulier) sur `gh pr view --json commits`, qui
rend en réalité `authors` (liste). Bug du c.740, détecté en preflight
po-2025 (DM HIGH 20:29:20Z, msg-20260830T182920-n55103) + invalidation
publique (comment 5470512492).

Ce REPAIR remplace la résolution `pr_operator` par le parsing du tag
`Grain: lane X` du dernier commit FONCTIONNEL (non-merge). Le tag
`Grain:` est la source de vérité de la lane fonctionnelle d'une PR, et
il survit à l'identité de poussée partagée `jsboige` des lanes
(#13316). Un override par un lifter dans LIFT_OVERRIDE_LOGINS
(= `myia-ai-01`) sur une PR dont la lane est aussi côté ai-01
(`myia-ai-01:`) est détecté comme self-override et REJETÉ par
`_lift_eligible`.

4 tests d'intégration (230 passed total, 0 regression) :
- `test_13636_self_override_ai01_on_ai01_pr_bloque` — payload REEL PR
  #13703 (Grain `myia-ai-01:CoursIA`) BLOQUÉ
- `test_13636_override_ai01_on_po2024_pr_passe` — override tiers valide
- `test_13636_pr_sans_grain_fail_open` — PR sans tag Grain : fail-OPEN
- `test_13636_payload_reel_pr_13703_bloque` — payload `authors` liste,
  même structure que l'API réelle

Tell c.717-L1 ★ NEW critique `p1-dispatch-claim-verification-self`
sustained : validation self-échec G.1 — j'avais testé le helper isolé
mais PAS contre le payload API réel. Le fix actuel est validé
firsthand via les 4 tests.

Grain: MED/guard - lane myia-po-2024:CoursIA-2 - prev: MED/guard #13698

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/13703-pr-13636-grain-parser branch from 8e08f3b to 299c5ef Compare August 30, 2026 19:28
jsboige added a commit that referenced this pull request Aug 30, 2026
…T sans LIFT_MARKER

§B.0 voie 3 = "une issue de suivi ouverte et nommée AVANT le merge" est une
voie valide de levée (Tell c.11145 ★★★ strict lift author-bound + §B.0 voie 3).
Le gate ne la reconnaissait pas : il exigeait un LIFT_MARKER dans le
commentaire PR qui cite l'issue, mais un commentaire de voie 3 ne porte
pas de phrase de levée — la preuve est externalisée dans l'issue de suivi.

PR #13480 illustre le cas : nit clusterManager-Myia (review COMMENTED sur
`b2616d6b12`), commentaire PR 17:58:00Z cite #13701 (ouverte 17:57:55Z
par jsboige pour re-review NanoClaw post-fix). Le gate rendait BLOCKED
alors que la levée était valide.

Fix :
- `analyse(pr_data, threads, cutoff, open_followups=None)` accepte un set
  d'IDs d'issues ouvertes
- `voie3_lifts` (parallèle à `explicit_lifts`) collecte les commentaires
  PR qui citent `#\d+` ET ne portent pas de LIFT_MARKER (signe que la
  preuve est externalisée) ET ne sont pas un nit (classify None) ET
  peuvent lever (can_lift)
- `_lift_eligible` accepte voie 3 si le body du lift cite un ID ∈
  open_followups (sans exiger LIFT_MARKER)
- `gate()` fetche les issues citées via `gh issue view --json state` et
  peuple `open_followups` avec celles qui sont OPEN
- `run()` test helper accepte `open_followups`

4 tests d'intégration (230 passed total, 0 régression) :
- `test_13701_voie3_leve_nit_pr_13480_reel` — payload RÉEL PR #13480 levé
- `test_13701_voie3_issue_fermée_ne_leve_pas` — issue fermée = inerte
- `test_13701_voie3_lifter_egal_nit_author_ne_passe_pas` — borne #11145
- `test_13701_voie3_compatibilite_voie2_override` — voie 2 intacte

Live test : `python scripts/check_unaddressed_nits.py 13480` → OK.

Grain: MED/guard - lane myia-po-2024:CoursIA-2 - prev: MED/guard #13708

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

[SUPERSEDED-BY-#13563]

Per the USER mandate STOP-CINEMA-NARROW (2026-08-30, relayed 19:27:53Z): the narrow self-override/voie-3/LIFT_MARKERS/grain-parser guards were prejudicial to the cluster and their substance is already on main. This PR duplicates the fix merged via #13563. Closing as superseded.

Lane myia-po-2024:CoursIA-2.

@jsboige jsboige closed this Aug 30, 2026
@jsboige
jsboige deleted the fix/13703-pr-13636-grain-parser branch October 6, 2026 00:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants