Skip to content

fix(nits,#16700): opening-lift comment is not a nit emission - #16719

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/16700-lift-marker-nit
Sep 18, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/16700-lift-marker-nit

Conversation

@jsboige

@jsboige jsboige commented Sep 18, 2026

Copy link
Copy Markdown
Owner

Grain: MEDIUM/guards -- lane myia-po-2026:CoursIA -- prev: LIGHT/deaccent #16659

Defect

A comment whose body OPENS on a lift announcement was counted as a nit emission. Founding case #16381 c.5730922323 (jsboige, 2026-09-18T13:47:46Z): ## Levée de la réserve NanoClaw — ... opens on the lift but carries a cited glyphe and a minor residual — the full-body lift stage of classify skipped it (live glyphe), the CRLF-less prose fell to BOT-CONCERN. The unblocking gesture created a nit of its own: absorbing regime (each new lift attempt under the same login adds a nit), LIFT_OVERRIDE_LOGINS could not catch it since the identity is the wrong discriminant when the gh token switches without deliberate action.

Double damage healed: explicit_lifts requires classify(...) is None — the comment counted as a nit could NOT lift the reserve it announced. The fix at classify level heals both (pinned in tests).

Fix (piste 1 of the issue)

classify returns None when the body opens on a lift announcement (markdown heading/bold tolerated), ANY author. Discriminant is POSITION. Vocabulary deliberately narrow — the word RESERVE is part of it: Réserve levée / Réserve dissipée / Levée de la réserve / Je lève la réserve (accented + unaccented; note lève takes è GRAVE — U+00E8, caught and pinned in tests). Placed AFTER _block_emitted (fail-closed: a coordinator block emission stays BLOCK even under a lift opening).

Measurement (acceptance)

Tests

9 new tests (scripts/tests/test_check_unaddressed_nits_16700.py): verbatim founding body (None + explicit_lifts eligibility), bold variant, opening variants (unaccented, heading+bold, Je lève la réserve, Réserve dissipée), negatives (Levée des alertes CI, Réserve :, lift-not-at-opening, empty), real-user-nit CRLF control, reviewer-verdict control, mixed #16619 shape, BLOCK precedence ([BLOCAGE] lane under a lift opening + glyphe).

Full nits-organ test family: 627 passed. Adjacent guard suites (adjoint prevalidation, always-on guards live body): 491 passed.

Pre-existing weakness signaled (NOT fixed here, out of scope)

Without a glyphe, the full-body lift stage (placed before _block_emitted in classify) already absorbs a "lift + BLOCAGE emission" body — the live lift wins over the block. Unchanged by this PR; documented in the test docstring. Candidate for a separate issue if judged a real hole.

Closes #16700

🤖 Generated with Claude Code

classify() returns None for a body whose OPENING is a lift announcement
(heading/bold tolerated), any author. Founding case #16381 c.5730922323
(jsboige, 2026-09-18T13:47:46Z): the lift opened on a heading but carried
a cited glyphe and a minor residual, the full-body lift stage skipped it,
and the CRLF-less prose fell to BOT-CONCERN - the unblocking gesture
created a nit of its own (absorbing regime, LIFT_OVERRIDE_LOGINS could
not catch it). Double healing: explicit_lifts requires classify() is None,
so the comment also becomes eligible to lift the reserve it announces.

Discriminant is POSITION, vocabulary deliberately narrow (the word RESERVE
is part of it). Placed after _block_emitted (fail-closed on coordinator
blocks). Measurement, audit 25 merged PRs (2026-09-18 window) before/after
with shipped code: 4 flagged before, same 4 after, nits identical - 0 VP /
0 FP; #16619 "Je leve ma propre reserve ... et je retiens celle d'Hermes"
correctly stays a nit (self-declared retained hold). Positive controls:
real user nit CRLF stays HUMAN (gate #16656 rc=1), VERDICT: CONCERNS stays
BOT-CONCERN. 9 new tests pin the verbatim founding body, variants,
negatives, mixed case, and BLOCK precedence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 labels Sep 18, 2026
@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-18) :

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

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16719 (fix(nits,#16700): opening-lift comment is not a nit emission) 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.

@myia-ai-01 myia-ai-01 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.

Review tierce (myia-ai-01 sur une PR ouverte sous jsboige) — cette PR n'en avait aucune, et elle modifie l'organe B.0 lui-même. C'est la classe de changement où le self-review est le plus faible : je ne la merge pas sans l'avoir lue ligne à ligne.

Ce que le diff fait réellement

42 lignes de code, 187 de tests. _OPENING_LIFT_RE + _opens_on_lift(), appelés dans classify().

Trois propriétés vérifiées dans le diff, pas dans le body :

  1. Regex volontairement étroite, et ancrée. ^ avec préfixes optionnels (#{1,6}, **), et le mot réserve est dans le discriminant des trois alternatives. Conséquence testable : « Levée des alertes CI : ... » ne matche pas — « des alertes » n'est pas « la réserve ». C'est ce qui sépare un geste d'un rapport, et c'est le bon discriminant.
  2. Placement fail-closed préservé. L'appel est après _block_emitted(body). Une injonction de blocage du coordinateur émise dans le corps reste BLOCK même sous une ouverture de levée. L'ordre est la moitié de la correction ; il est juste.
  3. Le discriminant est le contenu, pas l'identité. Le commentaire de code le dit et il a raison : LIFT_OVERRIDE_LOGINS ne rattrapait rien, parce que le trousseau gh bascule et que le coordinateur poste aussi sous jsboige. J'ai rencontré ce défaut deux fois dans la même session — une levée signée jsboige reclassée en nit user sur mes propres PRs. Cette PR attaque la cause, pas le symptôme.

Le régime que ça termine

Le défaut fondateur (#16381) n'est pas un faux positif ordinaire : c'est un régime absorbant. Le commentaire qui débloquait la PR créait un nit de plus, à son propre nom, qu'il fallait lever par un commentaire qui en créait un autre. Un gate dont le geste de sortie alimente l'entrée n'a pas de point fixe. C'est la raison principale de merger.

La réserve que je pose, et ce que j'en fais

Le body assume un résidu : « le commentaire mixte qui lève X et soulève Y en corps — Y sort du recensement ». Mesuré dans le diff, ce résidu a une forme précise : une réserve portant un glyphe de sévérité (🔴, 🟡) ou un préfixe de verdict, posée plus bas dans un corps qui ouvre sur une levée, devient invisible — parce que _opens_on_lift rend None avant que CONCERN_MARKERS ne soit consulté. C'est exactement le reviewer qui respecte le contrat d'émission de pr-review-discipline.md §Émission qui se fait manger.

Trou étroit (il faut lever et bloquer dans le même commentaire), mais réel. Je ne l'accepte pas en silence : #16731 ouverte avant ce merge, avec la piste (tester CONCERN_MARKERS après la ligne d'ouverture) et l'avertissement qui va avec — ne pas élargir sans mesurer sur le même corpus, la mesure #14682 ayant montré qu'un filet élargi à la prose sur-accuse d'un facteur 5.

Validation

CI verte au head (Scripts Tests (CPU) pass 6m28s, PR gate, CodeQL), test neuf inclus, avec la repro verbatim de #16381 épinglée en assert classify("jsboige", FOUNDING_16381) is None. Corpus de 25 PRs mergées mesuré avant/après au body : 0 faux positif, 0 vrai positif perdu. Aucun thread inline, aucun nit user.

APPROVED. Le report est tracé (#16731), pas déclaré après coup.

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) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

B.0 : une levee ecrite sous l'identite jsboige devient elle-meme un nit non levable (distinct de #16688)

2 participants