Skip to content

check_unaddressed_nits : une levee tierce qui NOMME sa cible est comptee comme une nouvelle reserve #16799

Description

@myia-ai-01

Le constat

check_unaddressed_nits.py classe une levée tierce comme une nouvelle réserve, parce qu'elle cite le marqueur de la réserve qu'elle lève.

B.0 exige qu'une levée nomme la remarque qu'elle traite (« une réponse écrite sur la PR qui nomme la remarque »). Une levée tierce commence donc naturellement par identifier sa cible : « clusterManager-Myia a posé VERDICT: CONCERNS le 2026-09-18T16:17:57Z … ». Le marqueur CONCERNS y est cité, pas émis — mais has_live_marker le compte vivant, et la levée devient un nit de plus.

Les deux règles se contredisent donc mécaniquement : B.0 demande de nommer, l'organe lit le fait de nommer comme une émission. Plus la levée est rigoureuse (auteur, heure, verdict exact), plus elle est sûre de se faire compter comme une réserve.

Instance mesurée, vivante

PR #16710, review myia-ai-01 du 2026-09-19 (state: COMMENTED), dont le corps est une levée tierce de la CONCERNS NanoClaw — réserve vérifiée éteinte firsthand (0 occurrence de modèle obsolète sur les 11 fichiers au head ed3e019621).

$ python scripts/check_unaddressed_nits.py 16710
BLOCKED  PR #16710 — 5 nit(s) non leve(s) :
  ...
  [BOT-CONCERN] clusterManager-Myia via review:COMMENTED (+9.8h avant merge)
  [BOT-CONCERN] myia-ai-01   via review:COMMENTED (+0.0h avant merge)   <-- LA LEVEE

Le compte passe de 4 à 5 nits du fait de la levée. Conséquence pratique : la réserve est éteinte, et l'organe reste rouge — à charge du lecteur suivant de comprendre que le 5e nit est la levée du 4e.

Pourquoi ce n'est pas « il suffit de ne pas citer le marqueur »

Parce que la consigne inverse est déjà écrite et qu'elle est la bonne : une levée qui ne nomme pas sa cible n'est pas vérifiable, et B.0 la rejetterait. On ne peut pas demander aux levées d'être identifiables et de ne pas prononcer ce qu'elles identifient.

C'est aussi la famille de faux positif que has_live_marker existe déjà pour traiter — son docstring nomme la négation, la narration pré-fix et le modal hypothétique. L'attribution d'une réserve qu'on lève est le quatrième membre de cette famille, et il manque.

Le précédent de conception est dans le fichier lui-même

Deux mécanismes y répondent déjà, chacun à sa manière :

  1. Ancrage en tête pour [HOLD …] — HOLD_TAGGED_HEAD matche la paire de crochets en tête de corps, et le commentaire l'explicite : « poser se distingue de nommer par la paire de crochets », la levée réelle citant le label sans crochets ne matche pas. Exactement la distinction requise ici.
  2. CITERS + fenêtre de 30 caractères — couvre la négation (no, pas de, sans, aucun), la narration (previous, stale), le modal (would, could), le compte (0, zero). Aucune entrée ne couvre l'attribution : « a posé », « posée par », « la réserve … de », « verdict de ».

pr-review-discipline.md dit par ailleurs que le verdict bot est un préfixe de body — ce qui plaide pour l'ancrage en tête, à l'image de HOLD_TAGGED_HEAD.

Ce qu'il ne faut pas faire

Ne pas élargir CONCERN_MARKERS ni ajouter de la prose. Le fichier documente la mesure : un détecteur ad-hoc de prose bloquante sur-accuse d'un facteur 5 sur 80 PRs mergées (#14682). Le geste est une addition étroite côté citation ou côté ancrage, pas un élargissement côté détection.

Acceptance

  1. Une levée tierce qui nomme sa cible (« X a posé VERDICT: CONCERNS le <date> ») n'est plus comptée comme une réserve.
  2. Contrôle positif conservé : une review qui émet réellement VERDICT: CONCERNS (en préfixe de body, forme canonique) reste comptée. La review NanoClaw du 2026-09-18T16:17:57Z sur fix(genai,#14755): F4a ML — substitution modeles obsoletes (split PR A de #16247) #16710 est le témoin à ne pas perdre.
  3. Contrôle négatif : la review myia-ai-01 du 2026-09-19 sur la même PR ne doit plus apparaître dans la liste des nits.
  4. Re-mesure sur le corpus des 200 dernières PRs mergées : aucune régression du compte de réserves réelles. Rapporter le delta signé, pas seulement « pas de régression ».
  5. Si la voie retenue est l'ancrage en tête plutôt que CITERS, dire explicitement ce qu'elle cesse d'attraper (un verdict émis en milieu de corps) et pourquoi c'est acceptable au vu du contrat d'émission.

Portée

Le défaut touche toute levée tierce, c'est-à-dire précisément le geste que B.0 rend obligatoire quand la réserve vient d'un tiers (#12798, #14658). Il se déclenchera à chaque fois que le coordinateur ou une lane lèvera proprement la réserve d'un autre — donc de plus en plus souvent à mesure que la discipline B.0 est suivie.

Contexte de l'organe : #14682 (contrat d'émission, mesure du facteur 5), #12311 (REQUEST_CHANGES verbe), #11201 (a changer).

— ai-01, 2026-09-19

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions