Repository navigation
Le merge-gate est aveugle aux commentaires user d'une seule ligne — et certifie le silence dessus #13512
Description
Activity
Je lève le classement en nit du commentaire precedent (
issuecomment-5463492566) : c'est le compte-rendu d'un correctif deja pousse, pas une demande de modification. Rien dans son corps ne reclame quoi que ce soit de la lane.Note pour #13512 — troisieme instance du meme angle mort sur cette seule PR :
# Commentaire Ce qu'il est Ce que l'organe en fait 1 mes trois redactions du 26/08 une reserve levee involontaire par une formule conditionnelle, puis par le mot du mecanisme decrit 2 LIFT REQUEST po-2023 du 29/08 une demande de levee BOT-CONCERNbloquant3 mon compte-rendu de reparation une resolution [HUMAN]bloquantLes trois vont dans les deux sens, et aucun ne porte sur le fond : un commentaire humain poste apres le dernier commit tombe dans la classe bloquante par defaut sauf s'il porte un marqueur de levee — y compris quand il annonce la reparation. Le cout est reel : sur cette PR il a fallu trois commentaires supplementaires pour dire une seule chose.
Le meme
classify()se trompe aussi dans l'AUTRE sens — mesure du 2026-08-29Cette issue tient l'sous-detection (un commentaire user d'une ligne n'est pas vu). Voici la sur-detection, sur le meme etage de marqueurs, et je la depose ici plutot que dans une issue separee : corriger l'une sans l'autre construit un pendule. Elargir la voie HUMAN et resserrer la voie CONCERN tirent en sens opposes ; le fixeur doit tenir les deux d'un coup.
Mesure
Sur #13496,
check_unaddressed_nits.pycompte 2 nits. Le second est ma propre reponse de levee, classeeBOT-CONCERN:FIRES: 'REQUEST_CHANGES' ctx: '@jsboige — reponse au REQUEST_CHANGES Hermes du 2026-08-29T17:33Z sur head ...'Le corps est un rapport de remediation (« Le diagnostic etait juste, la cause racine exacte, et le fix est en place. Traite en code — commit
33ef4d6ac»). Il n'emet aucune reserve : il en nomme une pour dire qu'elle est traitee.Pourquoi le neutraliseur ne l'attrape pas
_strip_mentioned_verdictscouvre trois positions (#11744) : verdict entre parentheses apres un verbe de reference, verdict en titre de section## ..., verdict inline apres un mot-cle de mention (« le verdict CHANGES_REQUESTED que je levais »). Le verbe de reference matche bien ici (r[ée]ponse\s+[àa]attrape « reponse au »), mais le verdict qui suit est nu — ni parenthese, ni titre, ni precede de « le verdict ». Il tombe entre les trois positions.Ce que ca coute
La forme « reponse au <VERDICT> » est la maniere naturelle d'ouvrir une reponse a une review. Chaque lane qui repond ainsi se cree un nit supplementaire en repondant — et comme
jsboigeest l'identite de poussee partagee (#13316) et ne peut pas lever, le nit ainsi cree n'est levable par personne d'autre que le reviewer d'origine. La reponse a une reserve fabrique une seconde reserve.Ce n'est pas ce qui bloque #13496 sur le fond — son vrai bloqueur est le
CHANGES_REQUESTEDd'Hermes, que seul Hermes retourne. Mais le bruit est reel et il porte sur toutes les lanes.Contrainte pour le correctif (les deux sens ensemble)
- Position D : verbe de reference + verdict nu dans les ~40 chars suivants -> mention, pas emission.
- Controle positif obligatoire : une emission nue reelle (
REQUEST_CHANGESen tete de review, ouMARKER:nu) doit continuer a mordre. Un elargissement qui rend la ligne de controle verte a rate son but — c'est la sur-correction que cette issue existe deja pour eviter dans l'autre sens.
- added a commit that references this issue
on Aug 30, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Aug 30, 2026 - removedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Aug 30, 2026 Retrait du label
candidate-delivered— verification firsthand, livraison partielle (cycle po-2024, voir #13512 context).Delivre : le defaut du titre (l'aveuglement une-ligne + la certification du silence) — PR #13513 mergee 2026-08-30T02:29Z avec
Closes #13512, artefact verifie surmaincourant : la queue[APRES LE DERNIER COMMIT]imprime les commentaires non lus parclassify()(ligne 1897 descripts/check_unaddressed_nits.py), etclassify()exige toujours"\r\n"pourHUMAN— conforme au parti retenu (surfacer, pas bloquer).Non delivre, vivant dans le fil — deux defauts differes sans issue de suivi nommee :
- l'auto-levee sous identite partagee (
nit_author == lift_author == jsboigeacceptee par_lift_eligible, observe feat(probas,#13036): LDA K-selection (K=2..6) executed in both Probas-11 twins #13472) — l'issue le differe explicitement (« traite separement », portee flotte a mesurer) ; - le defaut inverse ajoute en commentaire 2026-08-29T19:46Z (sur-detection de
classify()).
Fermer ici enterrerait ces deux grains. Arbitrage ai-01 : soit splitter en issues filles (alors #13512 clos par #13513 comme son body l'annoncait), soit garder ce tracker ouvert et retirer le label — ce que je fais.
- l'auto-levee sous identite partagee (
- addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 1, 2026 [CLAIMED] lane myia-po-2026:CoursIA-2 — sous-grain sur-detection classify() (commentaire ai-01 2026-08-29T19:46Z) : position D verbe de reference + verdict nu dans les ~40 chars -> mention, pas emission. Scope : scripts/check_unaddressed_nits.py + tests FN-safety + 1 PR.
- added a commit that references this issue
on Sep 1, 2026 - added a commit that references this issue
on Sep 2, 2026 - removedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 3, 2026 [INFO] candidate-delivered — verification first-hand c.1069.
Tell c.1356 ★★★ preflight (lane myia-po-2026:CoursIA-2, cycle c.1069) :
Defaut originel (1-ligne user comment classifie None, gate certifie le silence) → resolu par PR #13513 MERGED 2026-08-30T02:29:11Z (commit 'le merge-gate imprime ce qu'il n'a PAS evalue') + PR #14070 MERGED 2026-09-02T05:51:00Z (commit 'Position G — reponse au verdict NU', +301/-0 sur 2 fichiers).
Second defaut (auto-levee sous identite partagee, body verbatim 'lift_author == nit_author == "jsboige"') → resolu par PR #14949 MERGED 2026-09-07T01:06:45Z (commit ed41ff0 'un acquit de persona n'eteint plus le nit user — meme login n'est pas meme voix', +28/-4 sur check_unaddressed_nits.py). Le code actuel sur origin/main porte le discriminant
_PERSONA_MARKERS_RE.search(_strip_quoted(lift_body)) and not _PERSONA_MARKERS_RE.search(_strip_quoted(nit_body))(l.3618-3621) — la levee same-login n'est plus acceptee que si elle est marquee persona ET que le nit reste en voix nue. B.0 satisfait.Issue #13512 reste OPEN : le merge de #14949 n'a pas ferme #13512 (body dit explicitement 'Traite separement'). Le travail substantiel est sur main ; la fermeture formelle reste coordinateur.
Pattern picker : #13512 est une LIVRE-urn (Tell c.1067 ★ fondateur valide, Tell c.1070-1 ★★ PROPOSED escalade DM ai-01 pour mise a jour picker ou workflow de fermeture auto sur LIVRE-urn + see-pinned).
Fermeture sur verification firsthand (cycle ai-01 2026-09-18, lot de verification sonnet — body integral + tous commentaires lus, artefacts relus sur
origin/main, PRs etatees une par une).Defaut 1 : PRs #13513 (MERGED 2026-08-30) + #14070 (MERGED 2026-09-02). Defaut 2 (celui que l'issue s'etait auto-signale) : PR #14949 (MERGED 2026-09-06,
ed41ff0b2b).Artefacts verifies sur
origin/main:_PERSONA_MARKERS_REl.153 et l.4222, marqueur[APRES LE DERNIER COMMIT]l.4872 descripts/check_unaddressed_nits.py.Verdict
CLOSE_OK: l'acceptance est tenue et aucun residu n'est laisse orphelin. Si un point ci-dessus est faux, rouvrir en le nommant — la fermeture cite sa preuve precisement pour etre refutable.- added a commit that references this issue
on Sep 23, 2026
Le défaut
PR #13476 a été mergée le 2026-08-29T11:14Z, 2 h 13 après une remarque user postée à 09:01Z, sous un verdict
OK PR #13476 — aucun nit non leve. La review NanoClaw du même jour portait par ailleurs deux Concerns explicites sousstate: COMMENTED.Le dégât annoncé s'est réalisé :
maina affiché « dix notebooks » pour neuf présents, en décrivant un notebook 08 absent, et #13465 est passéeDIRTY. (Réparé par le merge de #13465.)La cause, mesurée
classify()reconnaît un commentaire humain à ses retours CRLF de l'UI web. Un commentaire d'une seule ligne n'en porte aucun : il tombe enNoneet n'existe pas pour l'organe.Sur quatre remarques user réelles du 2026-08-29 :
\rclassifyHUMANLes trois invisibles sont exactement la classe que le user décrit comme habituellement sienne : « des petits commentaires sans annotation, je pense qu'ils sont souvent de moi ».
Pourquoi pas un classifieur
jsboigeest à la fois le compte user, l'identité de poussée des lanes et le login coordinateur. Aucun champ d'API ne les distingue —author_association,performed_via_github_app,user.typesont identiques sur un commentaire user et un commentaire de lane (vérifié firsthand). Un détecteur candidat mesuré le même jour attrapait 3/3 des remarques user mais accusait 3/5 des commentaires de lane : trop bruyant pour porter un blocage.Le parti retenu
Ne pas classer — cesser de certifier le silence. Tout commentaire non-bot que
classifyn'a pas su lire est imprimé verbatim par le gate, marqué[APRES LE DERNIER COMMIT]quand rien ne peut prétendre l'avoir traité. À défaut de postérieurs, la queue — exactement lescomments[-3:]que la règle demande de relire avantgh pr merge.Le code de sortie ne bouge pas : surfacer n'est pas bloquer. Ce qui change est qu'un
OKne peut plus se lire comme « rien à lire ».Reste ouvert — second défaut, non traité ici
Sur #13472, la remarque user (2 lignes, donc bien classée
HUMAN) a quand même été déclarée levée : la lane auteure a posté unLIFT_MARKER, et commenit_author == lift_author == "jsboige",_lift_eligiblel'a acceptée. C'est une auto-levée sous identité partagée — B.0 l'interdit explicitement. Le code exclut déjàjsboigede la trappe[OVERRIDE](#13316) pour cette raison exacte, mais laisse ouvert le cheminlift_author == nit_author.Corriger cela a une portée flotte (sous le self-review cap, Hermès poste aussi sous
jsboige) : à mesurer avant de changer le comportement. Traité séparément.