Skip to content

fix(nits,#13512): la ligne de verdict porte sa reserve au lieu de certifier le silence - #17233

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/nits-unevaluated-verdict
Sep 23, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/nits-unevaluated-verdict

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

Grain: FIX/scripts -- lane myia-po-2026:CoursIA -- prev: FIX/infra #17230

La ligne de verdict de check_unaddressed_nits porte sa réserve au lieu de certifier le silence

See #13512, See #13779

Le trou, nommé par l'arbitrage du 21/09

_print_unevaluated existe depuis #13512 pour que l'organe cesse de certifier son silence : ce qu'il n'a pas su classer, il l'imprime. #13779 a renforcé le bloc (sur-ensemble au lieu du repli exclusif, compte du total au lieu du sous-ensemble affiché).

Mais ce bloc s'imprime sous la ligne de verdict — et c'est la ligne qui circule. « OK PR #N — aucun nit non leve » est ce qu'on cite : dans les rapports de lane, dans les DM, dans les commentaires de levée. Un OK cité sans sa réserve certifie alors exactement le silence que cet organe s'interdit de certifier, et la promesse de #13779 s'arrêtait à la frontière du stdout : elle ne tenait que par la discipline du lecteur — ce que l'organe existe précisément pour ne plus demander.

Mesure fondatrice. Arbitrage ai-01 du 2026-09-21T14:36Z : l'organe rendait rc=0 — ligne OK citée — sur deux PRs (#16413, #16398) dont les réserves 🟡 vivaient dans le bloc « NON EVALUÉ(S) ». Le verdict n'était pas faux ; il était incomplet d'une manière qu'aucune citation ne rattrape, parce que seule la ligne se recopie.

Ce que fait la PR

  1. _ok_line(pr, result) extrait la ligne de verdict en fonction pure — donc testable sans réseau, gate() restant seul à appeler gh.
  2. La ligne porte le total non évalué, jamais le sous-ensemble affiché — même règle que l'en-tête (check_unaddressed_nits: un preflight de 3322 car. et le HOLD du coordinateur classent None -- et l'echappatoire n'affiche que 3 des 5 non-evalues (mesure #13712) #13779). Sous-déclarer dans la ligne ce qu'on déclare en entier en dessous déplacerait le défaut au lieu de le fermer.
OK  PR #16413 — aucun nit non leve parmi les commentaires evalues ; 3 commentaire(s) NON EVALUE(S) — lire le bloc A RELIRE ci-dessous.

Ce que la PR ne fait pas — et c'est délibéré : rc et blocked sont inchangés. Le commentaire du fichier posait le parti dès #13512 (« en cas de doute : avertir (A RELIRE), jamais bloquer ») ; bloquer sur un commentaire non classé serait un autre débat, avec ses propres mesures de faux positifs. Ici on ne change pas le verdict : on cesse de le laisser voyager nu.

Preuves

Mesure Résultat
test_check_unaddressed_nits_unevaluated.py 13 passed (+5)
test_check_unaddressed_nits.py (suite de l'organe) 465 passed, 1 skipped
scripts/tests entier 6156 passed, 34 skipped, 5 xfailed
Consommateurs de la ligne grep "aucun nit non leve" sur .github/workflows/*.yml, *.sh, *.md : 0 occurrence → changement de chaîne sans risque de parse

Les tests sont écrits par le faux négatif, comme la suite existante (analyse() est pur) :

  1. le compte voyage dans la ligne (mesure fondatrice) — c'est le test qui échoue sur le code d'avant ;
  2. le compte est le total, et le sous-ensemble n'y apparaît pas ;
  3. contrôle positif : rien à relire → la ligne d'origine, octet pour octet (précondition classify(...) is not None, sinon le test passerait pour la mauvaise raison — j'ai dû corriger ce point en cours de route : un corps sans marqueur tombait dans unevaluated) ;
  4. le préfixe historique reste un préfixe : un lecteur qui reconnaissait la ligne la reconnaît toujours ;
  5. le bloc de détail ne ré-émet pas la ligne de verdict (une seule source).

Falsification : la réserve retirée de _ok_line, les 2 tests de compte rougissent (2 failed / 11 passed), le test de préfixe restant vert par construction ; restauration par cp (jamais git checkout --).

Périmètre et collision

Un seul sujet, 2 fichiers (+103/−4). scripts/check_unaddressed_nits.py est aussi touché par #16768 (ouverte, fix/16764-nits-sha-dating-vs-proof) : j'ai vérifié par git diff origin/main...origin/<branche> que ses hunks sont lignes 233 / 3540-3600 / 4481-4600 (_cited_shas, analyse) alors que les miens sont 5032 / 5148 (_print_unevaluated, gate) — aucun recouvrement, fusion git propre dans les deux ordres.

🤖 Generated with Claude Code

…tifier le silence

`_print_unevaluated` imprime ce que l'organe n'a pas su classer, mais il
l'imprime SOUS la ligne de verdict -- et c'est la LIGNE qui circule : elle est
citee telle quelle dans les rapports de lane et les DM. Un `OK  PR #N — aucun
nit non leve` cite sans sa reserve certifie donc exactement le silence que cet
organe refuse de certifier (#13779), et la promesse s'arretait a la frontiere
du stdout.

Mesure fondatrice (21/09, arbitrage ai-01) : l'organe rendait `rc=0` -- ligne
`OK` citee -- sur deux PRs dont les reserves vivaient dans le bloc « NON
EVALUE(S) ». La lecture de ce bloc etait presentee comme une discipline de
lecteur ; elle devient une propriete de la ligne.

- `_ok_line(pr, result)` extrait la ligne de verdict (pure, donc testable sans
  reseau : `gate()` reste seul a appeler `gh`).
- La reserve nomme le TOTAL non evalue -- jamais le sous-ensemble affiche,
  meme regle que l'en-tete (#13779) : sous-declarer dans la ligne ce qu'on
  declare en entier en dessous deplacerait le defaut au lieu de le fermer.
- Verdict inchange (rc et `blocked` non touches) : l'organe n'a jamais eu
  mandat de bloquer sur un commentaire non classe, et ne l'a pas ici.

Tests (+5, 13 passed) ecrits par le faux negatif, comme la suite existante :
- le compte voyage dans la ligne (mesure fondatrice) ;
- le compte est le total, et le sous-ensemble n'y apparait pas ;
- controle positif : rien a relire -> la ligne d'origine, octet pour octet
  (avec precondition `classify(...) is not None`, sinon le test passerait pour
  la mauvaise raison) ;
- le prefixe d'origine reste un prefixe : un consommateur qui reconnaissait la
  ligne la reconnait toujours ;
- le bloc de detail ne re-emet pas la ligne de verdict (une seule source).

Falsification : la reserve retiree de `_ok_line`, les 2 tests de compte
rougissent (mesure : 2 failed / 11 passed), le test de prefixe reste vert par
construction ; restauration par `cp`.

Regression : 465 passed / 1 skipped sur `test_check_unaddressed_nits.py`.
Aucun workflow ni script ne parse la ligne (grep `.github/workflows/` : 0
occurrence) -- le seul consommateur est un lecteur, ce qui est precisement le
canal que ce commit corrige.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17233 (fix(nits,#13512): la ligne de verdict porte sa reserve au lieu de certifier le silence) 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.

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17233
head: e968c8b
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 958686ccaba70fad930eef808b859e892e92d236e31067a5d670e12a4a2119ca
diff-files: 2
diff-additions: 103
diff-deletions: 4
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17233
head: e968c8b
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 39581525225c5427d018cbcd6da0ccf4fd4c21a7f25d13f46b58fc73eaa4053b
diff-files: 2
diff-additions: 103
diff-deletions: 4
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 005ec76 into main Sep 23, 2026
16 of 19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

2 participants