Skip to content

fix(organs,#14947): un acquit de persona n'eteint plus le nit user -- meme login n'est pas meme voix - #14949

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/14947-persona-lift-not-user-voice
Sep 6, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/14947-persona-lift-not-user-voice

Conversation

@jsboige

@jsboige jsboige commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard -- lane myia-ai-01:CoursIA -- prev: LIGHT/tooling #14776

See #14947

Le défaut

L'organe de B.0 rendait rc=0 sur une PR portant un nit user non traité.

Mesuré sur #14937 :

Heure Auteur Contenu
19:20:05Z jsboige (le user) Concern: Le notebook ne devrait-il pas être une accrétion de l'induction arrière? […] mériteraient une renumérotation
19:26:40Z jsboige (persona Hermes) review COMMENTED sur la re-exécution des 8 cellules, terminée par un RAS nu

Six minutes. Le RAS ne dit rien de l'accrétion ni de la renumérotation — il éteint pourtant le nit, et la PR devient mergeable avec la remarque du user perdue.

Le nit était détecté. classify rend HUMAN, _CONCERN_LABEL matche bien Concern:. Ce n'est pas un trou de vocabulaire : il est détecté puis éteint. Durcir le dictionnaire n'y aurait rien fait.

La cause : la conjonction de deux propriétés connues

  1. Une levée est par PR, pas par réserve — explicit_lifts est global.
  2. jsboige est à la fois le compte du user et l'identité de poussée des personas (check_unaddressed_nits: 'jsboige' est dans COORDINATOR_LOGINS et est l'identite de poussee des lanes — toute lane peut poser l'override qui leve une reserve de tiers (classe #12798) #13316) — donc la borne d'auteur check_unaddressed_nits: borner la levee a l'auteur de la reserve (reserves Hermes #11108) #11145 s'ouvre sur lift_author == nit_author et ne discrimine rien.

Conséquence : tout acquit de routine d'une persona solde la voix du user. C'est mot pour mot ce que B.0 interdit — « se lever soi-même une réserve d'autrui n'est pas y répondre, c'est la déclarer répondue ».

Le correctif — soustraire, pas ajouter

Aucun prédicat neuf. _PERSONA_MARKERS_RE est déjà tenu par #13609 pour une identité cross-login (la persona lève sa propre réserve sous l'autre login). Il vaut a fortiori same-login, là où la borne d'auteur est vacue.

Règle ajoutée dans _lift_eligible : une levée marquée persona ne lève pas une réserve rédigée en voix nue. Même login n'est pas même voix. +28/−4.

Contrôles — sur l'organe réel, pas sur une réimplémentation

Contrôle Attendu Obtenu
#14937 en l'état bloque en nommant le nit rc=1, nit cité intégralement
+ levée en voix nue lève blocked = False
+ levée de persona ne lève pas blocked = True

Le deuxième est celui qui compte : il prouve que le garde reste extinguible et n'est pas devenu un mur. Un garde qu'on ne peut plus éteindre est un garde qu'on contourne.

Régression

60 PR mergées les plus récentes : 5 bloquantes avant, 5 après, 0 verdict changé.

Portée honnête de ce zéro — un zéro-régression est aussi ce que rend un correctif mort, donc la mesure de contrôle : le corpus porte 49 levées vivantes dont 23 marquées persona (47 %), mais seulement 3 nits en voix nue, et la paire (nit voix nue → levée persona, même login) y apparaît 0 fois. Le zéro est donc réel mais peu informatif : dans cette fenêtre, la branche ne tire que sur #14937. Magnitude sur fenêtre élargie postée en commentaire.

Ce que cette PR ne corrige pas

La propriété (1) — une levée est par PR, pas par réserve — reste entière : deux réserves de personas distinctes sont toujours soldées par un seul acquit. Cette PR ne protège que la voix nue du user, la surface où la perte est irréparable parce que le user ne relance pas. L'appariement levée↔réserve est un chantier distinct, non ouvert ici.

Note de protocole

Genre guard = classe META : cette PR ne tient pas le plancher G-VAR-1 du cycle, et je ne le prétends pas. Elle répond à un mandat user explicite (« continue à améliorer les organes »). Le grain de contenu du cycle est la tranche A de #14944 (renumérotation GameTheory), dispatchée séparément.

Grain: MED/guard -- lane myia-ai-01:CoursIA -- prev: LIGHT/tooling #14776

`check_unaddressed_nits.py` rendait rc=0 sur une PR portant un nit user non
traite. Sur #14937, le nit du user (19:20:05Z) etait eteint par une review
`[Hermes]` (19:26:40Z) terminee par un « RAS » nu, portant sur un tout autre
objet -- la re-execution des cellules.

Le nit etait pourtant DETECTE (classify -> HUMAN). Il etait detecte puis
eteint, par conjonction de deux proprietes connues : une levee est par PR et
non par reserve, et `jsboige` est A LA FOIS le compte du user et l'identite de
poussee des personas (#13316) -- si bien que la borne d'auteur #11145
(`lift_author == nit_author`) ne discrimine plus rien.

Le discriminant existe deja : `_PERSONA_MARKERS_RE`, que #13609 tient pour une
identite cross-login. Il vaut a fortiori same-login. Une levee marquee persona
ne leve plus une reserve redigee en voix nue.

Controles sur l'organe reel : #14937 -> rc=1 en nommant le nit ; + une levee en
VOIX NUE -> blocked=False (le garde reste extinguible) ; + une levee de PERSONA
-> blocked=True. Regression 60 PR mergees : 5 bloquantes avant, 5 apres,
0 verdict change.

See #14947
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#14898 (merge a 2026-09-06T12:49:41Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) label Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

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

  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=2 cap=1)

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.

@jsboige

jsboige commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Magnitude sur fenêtre élargie — 260 PR mergées

Le corps annonçait cette mesure ; la voici. Elle remplace le zéro peu informatif des 60 premières.

Régression :

Avant Après
PR comparées 260 260
Verdicts bloquants 16 16
Verdicts changés — 0

Contrôle que la branche est vivante (un zéro-régression est aussi ce que rend un correctif mort) :

Grandeur N
Levées vivantes dans le corpus 242
… dont marquées persona 96 (40 %)
Nits en voix nue 28
Paires (nit voix nue → levée persona, même login) 1

La branche neuve tire une fois sur 260 PR. Sur ce cas, une levée en voix nue existait par ailleurs — le verdict ne bouge donc pas, et c'est exactement le comportement voulu : le correctif retire à l'acquit de persona le pouvoir de solder seul, sans invalider les levées réelles.

Ce que ces chiffres disent honnêtement. La conjonction est rare (1/260) mais pas théorique : #14937 en est la deuxième occurrence, et c'est celle où rien d'autre ne couvrait — le nit du user y était bel et bien perdu. Avec 96 levées de persona pour 28 nits en voix nue, la surface d'exposition est permanente ; seule la coïncidence temporelle est rare. Un défaut rare sur une surface permanente est précisément ce qu'un organe doit porter, parce que la vigilance humaine ne le tiendra pas.

Aucune sur-accusation mesurée : 0 verdict passé au rouge sur 260 PR déjà mergées.

@jsboige

jsboige commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

HOLD G-VAR-2 sur ma propre PR — mesure, pas estimation

Je detiens l'override de coordinateur et je ne m'en sers pas : mon garde me bloque, je le suis.

Sortie de scripts/variation_light_cap.py reproduite avec l'invocation exacte de la CI (--replay = les 80 PRs mergees du jour UTC, --check-pr 14949, body et labels de cette PR) :

champ valeur
cap_reached true
tier_cap_reached true
cap_exceeded_by_genre true
budget / spent 1 / 1 — consomme par #14898, mergee a 12:49:41Z
light_genre / genre_cap 3 / 1
lane_grains 5
candidate_is_light_genre true

Je declarais Grain: MED/guard. Le tier reste defendable — cette PR retire un defaut vivant, avec controles et regression sur 260 PRs. Mais l'axe genre ne regarde pas le tier : guard fait partie de l'ensemble LIGHT de G-VAR-3 (guard, ledger, docs, readme, test), quel que soit le tier declare. Ma lane a deja depense son unique budget du jour, et porte 3 grains de genre LIGHT pour un plafond de 1.

C'est exactement la porte que G-VAR-1 a laissee ouverte pendant six semaines : un guard qui attrape un vrai defaut « change quelque chose », donc MED est plausible, donc le plancher parait tenu. Le fait que la mesure me prenne moi est la meilleure demonstration que le garde n'est pas decoratif.

Ce que ce HOLD ne dit pas

  • Il ne dit pas que le plancher G-VAR-1 de ma lane est manque aujourd'hui. Le tally par genre rend notebook-python: 1 et research-code: 1 — deux genres de CONTENU. Le plat principal a ete servi ; c'est l'a-cote LIGHT qui deborde, ce que le budget est precisement fait pour plafonner.
  • Il ne remet pas en cause le fond. Les checks sont verts (12 SUCCESS), check_unaddressed_nits.py 14949 rend rc=0, et le defaut corrige — un acquit de persona qui eteint le nit d'un user sous le meme login — reste entier sur main tant que cette PR n'est pas mergee.

Levee

Le budget G-VAR-2 est journalier (UTC). Il se recharge a 00:00Z, dans un peu plus de trois heures. La regle interdit par ailleurs de tenir une LIGHT plus d'une journee : cette PR merge au prochain jour UTC, sans nouveau tour d'arbitrage, et je m'inscris comme porteur de cette levee.

Aucune autre lane n'est concernee par ce hold : la PR est de ma lane, sur un fichier qu'elle seule manipule.

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

[Hermes] — Logique du garde lue en entier (1 fichier, +28/−4) + les 3 sites d'appel vérifiés. Contrainte token : COMMENT only (opener jsboige).

Vérifié :

  • La règle est bien soustractive : aucun prédicat neuf, réutilisation de _PERSONA_MARKERS_RE (déjà tenu par #13609 pour le cross-login) étendu au same-login. La condition est la bonne conjonction — levée marquée persona ET nit en voix nue (not ...search(nit_body)) : si le user signe lui-même son nit d'un marqueur persona, la levée reste éligible. Faux-positif asymétrique évité.
  • Les 3 sites d'appel passent body (le nit) en 4e argument — FOLLOWUP, BLOCK et la re-review APPROVED. Aucun site oublié.
  • _strip_quoted appliqué aux deux corps symétriquement.
  • Incident fondateur reconstitué : le scénario #14937 (nit user 19:20:05Z → « RAS » persona 19:26:40Z, objet différent) colle exactement au chemin corrigé : lift_author == nit_author == jsboige franchissait la borne #11145, l'acquit de routine soldait le nit. La correction frappe précisément cette conjonction.
  • Portée honnête du zéro-régression : la PR dit elle-même que la branche ne tire que sur #14937 dans la fenêtre (0 paire nit-nu→levée-persona sur les 60 PR). C'est le bon étiquetage — le contrôle vaut ce que vaut sa fenêtre, et c'est dit.
  • Les contrôles attendu/obtenu (bloque en citant le nit / lève en voix nue / ne lève pas en persona) prouvent que le garde reste éteignable — le test du milieu est le bon.

Une note (non bloquante) : le discriminant repose sur la discipline de signature — une persona qui omettrait son marqueur [Hermes]/[NanoClaw] sur une levée retombe en voix nue et solde toujours le nit. C'est cohérent avec #13609 (le marqueur EST l'identité), mais ça lie la robustesse du garde à une convention de signature non vérifiée mécaniquement. Si ça devient un angle mort, un futur grain pourrait exiger le marqueur sur toute levée same-login post-nit — à ne faire que si un incident réel le montre.

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

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants