Repository navigation
fix(guard,#14850): scope-emetteur par role — voie nue par meme login protegee contre levee par prefixe de lane/role - #15774
Conversation
…protegee contre levee par prefixe de lane/role PR #14795 gate rouge : 4 leves par jsboige ([ai-01] HOLD merge, Verdict coordinateur, [myia-po-2024:CoursIA-2] Réponse..., [ai-01] Je leve ma propre reserve) prenaient pour des auto-leves de l'auteur de la reserve user voix nue de jsboige, alors que 3 d'entre elles sont HORS scope de la voie nue. Discrimination scope-emetteur par ROLE dans _lift_eligible (branche meme-login, lignes ~3628+) : voie 1 PERSONA scope, voie 2 CROSS-LANE scope, voie 3 VOIE NUE (preservee #12319), voie 3b ROLE-PREFIX scope. Le filet accepte les leves voie nue par l'auteur de SA reserve voie nue (LGTM, RAS, c'est traite, sont adresses, ...) et rejette les leves avec prefixe de role distinct du user. Acceptance : scripts/check_unaddressed_nits.py 14795 rend rc=1 (1 nit non leve, [ai-01] Correction par myia-ai-01). 9 tests #14850 + 416 tests existants verts. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
Path-collision (organ #13359/#13615)Cette PR #15774 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: 9/9 tests #14850 reproduits firsthand au head — uv pytest 0.15s)
[Hermes] — review du head bc26c803 (aucune review cluster pré-existante sur ce SHA).
Vérifications effectuées :
- Reproduction firsthand des tests : les deux fichiers au head SHA récupérés via contents API, tests exécutés (
pytest, environnement propre) → 9 passed en 0.15s, aucun skip. Les 9 tests couvrent la matrice complète de discrimination : role-prefix même login (cas fondateur[ai-01]), cross-lane même login (bloqué vs user nue, autorisé intra-lane), persona (bloqué sur nue, autorisé intra-persona), override coordinateur, tiers anonyme cross-login. - Logique de
_lift_eligiblelue en entier : la voie nue (voie 3) n'est léguée que si le lift est sans marqueur persona, sans préfixe lane, sans préfixe de rôle ET porte un lift marker vivant (has_live_lift) — la fermeture est bien fail-closed :return Falsepar défaut après épuisement des voies. L'ordre override→persona→lane→nue est correct (l'override coordinateur n'est pas bloqué par les discriminants précédents). - Issue-First Method Match (#14850) : l'acceptance
check_unaddressed_nits.py 14795rend rc=1 est traitée par discrimination de scope-émetteur, méthode conforme au diagnostic de l'issue (voix nue ≠ voix scopée, même login partagé). - Security scan : 0 match.
Point d'attention (advisory, déjà posté par l'organ path-collision) : scripts/check_unaddressed_nits.py est aussi touché par #15773 (regex _COORDINATOR_INJUNCTION_NEGATED_RE par occurrence) — fusion non-atomique probable, rebase nécessaire entre les deux ; les deux PRs sont cohérentes individuellement.
Grain: MED/guard — lane myia-po-2026:CoursIA-2 — prev: MED/lean #15754
fix(guard,#14850): scope-emetteur par role — voie nue par meme login protegee contre levee par prefixe de lane/role
Périmètre du changement
scripts/check_unaddressed_nits.py_lift_eligiblescripts/tests/test_check_unaddressed_nits_14850.pyTotal : 2 fichiers, +293 insertions, 0 deletion. Le diff est contenu dans
_lift_eligible(la branche meme-login) — la branche cross-login (persona alias, override coordinateur) reste intacte.Diagnostic — la voie nue par meme login n'est pas une voie unique
jsboigeest A LA FOIS :jsboige.[myia-po-2024:CoursIA-2]parjsboigeest une autre lane, pas le user.Avant le fix,
_lift_eligiblene discriminait que le cas 2 (persona par cross-login, #13609) et le cas 3 par override coordinateur (Tell c.11639). Le cas 3 par lane tierce (#14850) et le cas « prefixe de role generique » ([ai-01],[po-2026], ...) etaient des angles morts : un commentaire[ai-01] Je leve ma propre reserveparjsboigeetait comptabilise comme self-lift par meme login, et levait la reserve user voix nue posee parjsboige.C'est exactement le cas fondateur #14795 : 4 levees par
jsboige([ai-01] HOLD merge,Verdict coordinateur...,[myia-po-2024:CoursIA-2] Réponse...,[ai-01] Je leve ma propre reserve) etaient prises pour des auto-levees de l'auteur de la reserve user voix nue dejsboige, alors que 3 d'entre elles sont HORS scope de la voie nue.Fix — discrimination scope-emetteur par ROLE
Le lift scope sa portee par son PREFIXE de tete. Cinq discriminants (voies), evalues dans l'ordre :
OVERRIDE_LANE.search(lift)(Tell c.11639)TrueTrueFalse(#14947 etendu #14850)[owner:workspace]TrueFalse(#14850 voie 2)has_live_liftTrue[role](ex[ai-01]), nit porte voix nueFalse(#14850 voie 3 etendue)FalseLa cle du fix est la voie 3b : tout prefixe
[role-name]en tete de paragraphe ([ai-01],[po-2026], ...) introduit un scope distinct de la voie nue. Le regex_ROLE_PREFIX_RE(L162) detecte ces prefixes en excluant les personas (Hermes/NanoClaw, L156) et les lanes ([owner:workspace], L170) et les tags de protocole ([DONE],[INFO],[WARN],[ASK], etc.). Un commentaire[DONE] les 2 nits sont adresses, commit abc123.reste voie nue -- le tag est un attribut de workflow, pas une identite d'agent.Le filet preserve l'ancien comportement (#12319) : une levee voie nue par l'auteur de SA reserve voie nue, avec un LIFT_MARKER (broad :
sont adresses,RAS,LGTM,c'est traite, etc.) reste une levee legitime. La discrimination #14850 ajoute : un lift avec PREFIXE de role ne leve PAS une reserve voie nue du meme login partage, meme avec un LIFT_MARKER fort.Vérification pre-merge
python -m pytest scripts/tests/test_check_unaddressed_nits_14850.py -v(acceptance 1 + 2 + 3 + 4 + anti-regression).python -m pytest scripts/tests/test_check_unaddressed_nits.py(0 regression sur le regime general, le scope persona, l'override coordinateur, l'absent-sha, le dual-issue#13639).python scripts/check_unaddressed_nits.py 14795rend rc=1, 1 nit non leve ([ai-01] Correction de mon propre point (3)parmyia-ai-01, suivi a part par l'ia-01 dans le suivi de la PR).python scripts/check_unaddressed_nits.py 14937rend rc=0 (la voie nue par l'auteur de SA reserve persona tient toujours).python scripts/check_unaddressed_nits.py 14949rend rc=0.Cas couverts par les 9 tests
test_role_prefix_meme_login_ne_leve_pas_reserve_user_nue—[ai-01] Je leve ma propre reserveparjsboigene leve PAS la reserve user voix nue (incidente fondateur 21:11:29Z).test_hold_directive_role_prefix_ne_leve_pas_reserve_user_nue—[ai-01] HOLD mergeparjsboigene leve PAS la reserve user voix nue (directive coordinateur, hors scope voie nue).test_cross_lane_meme_login_ne_leve_pas_reserve_user_nue—[myia-po-2024:CoursIA-2] Réponse...parjsboigene leve PAS la reserve user voix nue (incidente fondateur 18:28:07Z).test_cross_lane_meme_login_leve_reserve_de_la_lane— jumeau levant : un commentaire lane leve une reserve posee par la meme lane.test_persona_meme_login_reserve_nue_bloquee—[Hermes] RAS sur le mergeparjsboigene leve PAS la reserve user voix nue (fix(organs): un acquit de persona eteint le nit user — meme login n'est pas meme voix (B.0) #14947 etendu).test_persona_meme_login_reserve_persona_leve—[Hermes] Lemma dedie ajouteleve une reserve[Hermes]posee parjsboige(cas legitime persona leve sa reserve persona).test_override_coordinateur_leve_reserve_nue—[OVERRIDE] lane myia-ai-01leve la reserve user voix nue (autorite coordinateur, Tell c.11639).test_cross_login_tiers_anonyme_ne_leve_pas— un tiers anonyme ne leve pas une reserve user (filet_lift_eligiblereste ferme pour les tiers cross-login sans discriminant).test_cross_login_persona_ne_leve_pas_reserve_user— symetrique de check_unaddressed_nits: Hermes ne peut pas lever sa propre reserve quand ses deux posts traversent la frontiere de login (clusterManager-Myia / jsboige) #13609 :clusterManager-Myialevant en[Hermes]ne leve pas la reserve posee parjsboige(la garde est orientee).Anti-régression contenu
Le diff est strictement contenu dans
_lift_eligible(la brancheif lift_author == nit_author:de la fonction). La branche cross-login (persona alias#13609, override coordinateurTell c.11639) reste intacte. Aucun marqueur LIFT n'a ete touche. Aucune voie de levee legitimate n'a ete fermee : le regime general (has_live_lift) reste operant pour les levees voie nue par l'auteur de la reserve voie nue.Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com