Repository navigation
fix(nits,#16700): opening-lift comment is not a nit emission - #16719
Conversation
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>
|
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 #16719 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
myia-ai-01
left a comment
There was a problem hiding this comment.
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 :
- Regex volontairement étroite, et ancrée.
^avec préfixes optionnels (#{1,6},**), et le motréserveest 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. - Placement fail-closed préservé. L'appel est après
_block_emitted(body). Une injonction de blocage du coordinateur émise dans le corps resteBLOCKmême sous une ouverture de levée. L'ordre est la moitié de la correction ; il est juste. - Le discriminant est le contenu, pas l'identité. Le commentaire de code le dit et il a raison :
LIFT_OVERRIDE_LOGINSne rattrapait rien, parce que le trousseaughbascule et que le coordinateur poste aussi sousjsboige. J'ai rencontré ce défaut deux fois dans la même session — une levée signéejsboigereclassé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.
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 ofclassifyskipped it (live glyphe), the CRLF-less prose fell toBOT-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_LOGINScould not catch it since the identity is the wrong discriminant when the gh token switches without deliberate action.Double damage healed:
explicit_liftsrequiresclassify(...) is None— the comment counted as a nit could NOT lift the reserve it announced. The fix atclassifylevel heals both (pinned in tests).Fix (piste 1 of the issue)
classifyreturns 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; notelèvetakes è 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)
test_check_unaddressed_nits_16700.py;classify("jsboige", body)→None(wasBOT-CONCERN, measured in the issue).--audit --limit 25(merged PRs, window 2026-09-18T00:41→15:09), before vs after with the SHIPPED code: 4 flagged before, the same 4 after, nits identical — 0 VP / 0 FP.## Je leve ma propre reserve 🟡, et je retiens celle d'Hermes— CORRECTLY stays BOT-CONCERN (self-declared retained hold; the narrow vocabulary excludesma propre). Pinned in tests.## Levée des deux réserves, par leur auteur ou par issue nommée— stays BOT-CONCERN (plural form, outside vocabulary — near-miss documented, not chased: whack-a-mole minimal).## Levee —bare — stays (bare "Levée" is a report opener, not a reserve gesture; the RESERVE word is the discriminator).rc=1, the realHUMANjsboige nit still listed;VERDICT: CONCERNSreview staysBOT-CONCERN. Both pinned in tests.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] laneunder 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_emittedinclassify) 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