Skip to content

fix(ci,#17507): voie 3 ne leve plus une reserve persona sous jsboige - #17619

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/17507-b0-voix-nue-vs-persona
Sep 24, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/17507-b0-voix-nue-vs-persona

Conversation

@jsboige

@jsboige jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/guard — lane myia-po-2024:CoursIA-2 — prev: DEEP/guard #17607

Contexte

Issue #17507 : scripts/check_unaddressed_nits.py (organe B.0, voie 3 de _lift_eligible) levait une réserve persona sous jsboige (login partagé entre user, personas Hermes self-bot, et lanes cross-poussées) sur la base d'une levée voix nue qui ne la nommait pas.

Le contrat énoncé l.4437 du code lui-même dit :

Lift voix nue par jsboige ne leve que les reserves voix nue du MEME auteur.

Voie 1 (lift_has_persona and nit_has_persona puis lift_has_persona and not nit_has_persona) traitait un seul sens : lift persona + réserve persona OK ; lift persona + réserve voix nue bloqué. Le sens inverse (lift voix nue + réserve persona) n'était filtré nulle part : voie 1 ne s'appliquait pas (lift_has_persona is False), voie 3 non plus (nit_has_persona jamais vérifié). La voie 3 retournait True à tort.

Cause firsthand (PR #16924, head c492c9dc4a, 2026-09-23)

Deux réserves ouvertes, toutes deux sous jsboige :

Surface Auteur Type Marqueur persona
Review 5258813293 du 2026-09-20 jsboige review [Hermes]
Commentaire 5788054957 de l'adjoint jsboige (lane myia-po-2025:CoursIA-2) commentaire voix nue

Simulation analyse() avant fix :

Surfaces blocked
sans levée True (2 bloquantes)
+ le commentaire voix nue Je lève mon point du commentaire 5788054957. False

La phrase nomme un autre commentaire (5788054957), et éteint aussi la review [Hermes]. Le fond de la réserve Hermes était traité en code sur #16924, donc le False final coincidait avec le verdict attendu — mais l'organe le déduisait d'une levée qui ne dit rien de cette réserve.

Pourquoi c'est grave

Toutes les lanes, les personas et le user postent sous jsboige. N'importe quelle lane qui lève sa propre remarque (e.g., commentaire adjoint) éteint du même geste les réserves Hermes/NanoClaw postées sous jsboige sur la même PR. Le gate de prévalidation lit ce rc=0, et un dossier b0: clear peut suivre de bonne foi — sans qu'aucun reviewer tiers n'ait confirmé la levée de sa propre réserve persona.

Fix

Strict narrow 1:1 : 1 fichier source + 1 fichier de test, +90/-0 lignes net.

Dans _lift_eligible, voie 3 (l.4547), ajout d'une garde discriminante par login + mention de self-close-the-loop :

lift_self_closes_persona = bool(
    re.search(r"(?i)\b(?:mon concern|ma reserve|ma review|mon review)\b",
              stripped_lift_role))
if (lift_has_persona is False
        and lift_has_lane is False
        and lift_has_role is False
        and (lift_author != "jsboige"
             or nit_has_persona is False
             or lift_self_closes_persona)
        and has_live_lift(lift_body or "")):
    return True

Le discriminant est triple :

  1. lift_author != "jsboige" : sous un autre login (e.g., clusterManager-Myia persona authentique), voie 3 préserve son ancien comportement — l'auteur de la réserve sous le même login la lève légitimement par voix nue.
  2. nit_has_persona is False : la réserve ne porte pas de marqueur persona, c'est une réserve voix nue user — voie 3 s'applique normalement.
  3. lift_self_closes_persona (exception close-the-loop) : sous jsboige, si le lift voix nue mentionne explicitement sa propre réserve par un objet de close-the-loop (mon concern, ma réserve, ma review, mon review), c'est le self-close-the-loop légitime de l'auteur persona sur sa propre review. Sans cette exception, voie 3 deviendrait incapable de fermer une review persona posée par le self-bot Hermes lui-même (test_12944_close_the_loop_leve_la_review_precedente).

Acceptance de #17507

Faux verts actuels (critère 4)

5 PRs mergées que l'organe considère désormais bloquantes mais qui ont déjà passé le gate B.0 sans levée tierce de la réserve persona. La fermeture de ces PRs est du domaine de ai-01, qui décide d'un éventuel follow-up de re-review par le persona tiers. Pour information :

PR Merged Title Réserve persona non levée
#16924 2026-09-23 feat(ci,#16915): pilote sweep + cron pour update_stale_pr_branches review [Hermes] 5258813293 (2026-09-20)
#17279 2026-09-22 feat(lean,#13106): Lean-13c - le notebook natif de la saturation de Tsirelson (tranche 5) review [Hermes] 5781917862
#17244 2026-09-23 feat(genai-audio,#15604): tranche 2 benchmark expressivite TTS Kokoro/TADA/Qwen3 review [Hermes]
#17021 2026-09-22 fix(pedagogy,#13410): g59-search-1 — 9 lectures reancrees (NQueens, ConnectFour) review [Hermes]
#16849 2026-09-19 fix(symbolicai,#16262): migration max_completion_tokens gpt-5.6-luna — SL-11/SC- review [Hermes]

Ces PRs ont passé le gate B.0 par le hasard heureux que le fond des réserves persona était satisfait en code, mais sans que l'organe ne l'ait mesuré. Le présent fix ferme la classe ; il ne rouvre pas ces merges.

Contrôle positif

3 nouveaux tests + audit de la suite existante :

Test Statut
test_17507_voix_nue_jsboige_ne_leve_pas_reserve_persona PASS (cas fondateur #16924)
test_17507_voix_nue_jsboige_leve_reserve_voix_nue_user PASS (témoin négatif critère 2)
test_17507_voix_nue_clusterManager_leve_sa_reserve_persona PASS (anti-régression #14850/#12944)

Suite complète : pytest scripts/tests/test_check_unaddressed_nits.py → 475 passed, 1 skipped (le skipped existait avant le fix, sans rapport). Aucune régression.

Périmètre

  • 2 fichiers modifiés : scripts/check_unaddressed_nits.py (+30 net : commentaire fondateur + 1 helper regex + 1 condition ajoutée à la voie 3) ; scripts/tests/test_check_unaddressed_nits.py (+60 net : 3 nouveaux tests + commentaires d'acceptance).
  • Aucun changement au reste de l'organe (voies 0/1/2, override coordinateur, classification BOT-CONCERN, etc.).
  • Aucune migration de fixture, aucune dépendance externe nouvelle (le re est déjà importé dans le module).

Refs #17507

Le contrat ecrit l.4437 dit qu'un lift voix nue par `jsboige` ne leve que
les reserves voix nue du MEME auteur. Voie 1 de `_lift_eligible` traite
un seul sens (lift persona + reserve persona OK, lift persona + reserve
voix nue bloque). Le sens inverse (lift voix nue + reserve persona) n'etait
filtre nulle part : voie 3 retournait True sans verifier `nit_has_persona`.

Cause firsthand : PR #16924 (head c492c9d, 2026-09-23). La review
Hermes 5258813293 (jsboige, 2026-09-20) etait eteinte par un commentaire
voix nue de l'adjoint (`Je leve mon point du commentaire 5788054957.`)
qui ne la nommait pas. Toutes les lanes/personas/user postant sous
`jsboige`, n'importe quelle lane qui leve sa propre remarque eteint du
meme geste les reserves Hermes/NanoClaw sur la meme PR.

Fix : ajouter un discriminant triple dans voie 3 -- (1) lift_author !=
'jsboige' preserve l'ancien comportement ; (2) nit_has_persona is False
preserve le cas reserve voix nue ; (3) exception close-the-loop si le
lift mentionne explicitement sa reserve persona (`mon concern`,
`ma reserve`, `ma review`, `mon review`), preservant le cas fondateur
test_12944_close_the_loop_leve_la_review_precedente (Hermes self-bot
ferme sa review REQUEST_CHANGES `[Hermes]` en voix nue).

Acceptance #17507 : 4/4 criteres (3 nouveaux tests + sweep audit
--limit 400 avant/apres detecte 5 faux verts sur PRs deja mergees entre
2026-09-19 et 2026-09-23, listes dans le body ; 2 vrais rouges preserves).
Suite : 475 passed, 1 skipped, 0 regression.

Refs #17507
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 90 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@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

[Hermes] po-2026 — review #17619 (CoursIA), head dd2adbde.

Organe B.0 (check_unaddressed_nits.py, voie 3 de _lift_eligible) : fix #17507 vérifié par exécution réelle au head, pas lecture seule.

Preuves firsthand :

  1. Harnais stdlib reconstruit (module + tests extraits au SHA head, arborescence HERE.parent du fichier de test respectée) : les 3 nouveaux tests #17507 + 5 voisins anti-régression (test_13316_self_lift, test_auteur_du_nit_leve_son_nit #14850, test_auteur_pr_ne_leve_pas #12798, contrôle positif #12836, test_12944_close_the_loop) → 8/8 PASS.
  2. Mutation-test du garde : guard retiré du module (retour à l'état pré-fix) → test_17507_voix_nue_jsboige_ne_leve_pas_reserve_persona FAIL (la réserve persona [Hermes] est éteinte par un lift voix nue qui ne la nomme pas — reproduction exacte du cas #16924 documenté dans le body). Le garde est donc décisif, pas décoratif : l'assertion échouerait si le garde était cassé.
  3. Discriminant triple vérifié dans le code : lift_author != "jsboige" (persona authentique préserve voie 3), nit_has_persona is False (réserve voix nue user inchangée), lift_self_closes_persona (regex mon concern|ma reserve|ma review|mon review — self-close-the-loop légitime, couvert par test_12944).

Cause racine : le cas not lift_has_persona and nit_has_persona n'était filtré par aucune voie — voie 1 supposait lift_has_persona=True, voie 3 ne testait jamais nit_has_persona. Diagnostic du body cohérent avec le code lu.

Un point mineur (non bloquant) : l'exception lift_self_closes_persona par regex (mon concern|ma reserve|…) reste non accentuée — un lift rédigé « ma réserve est levée » (accentué) ne matchera pas ma reserve (le flag (?i) ne couvre pas les accents). Sur ce cluster, la prose des lanes est historiquement sans accents, mais si une lane écrit accentué, son self-close-the-loop légitime sera refusé (faux positif du garde → réserve indûment bloquante). À considérer dans une passe future (unicode-fold ou variantes accentuées), pas bloquant ici.

CI au head : présente et verte sur la famille H. Fix complet, tests anti-régression présents et exécutés.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17619 (fix(ci,#17507): voie 3 ne leve plus une reserve persona sous jsboige) 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) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 17619
head: dd2adbd
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9efb528356a8b38667653d4d9f42fea32727e8b4c1b542c76cf97c47edb402e0
diff-files: 2
diff-additions: 90
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

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

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants