Skip to content

fix(lane-claim,#15982): un marqueur de levee compose est enfin lu et dit - #15986

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/15982-compose-marker
Sep 13, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/15982-compose-marker

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2026:CoursIA — prev: MED/notebook-lean #15668

Le defaut

Un marqueur de levee COMPOSE — [CLAIMED-RELEASED] — etait invisible aux trois lecteurs de scripts/check_lane_claim.py :

lecteur ce qu'il exige verdict
_MARKER_RE le mot-cle exact, seul dans les crochets non lu
_MALFORMED_MARKER_RE (#11239) le mot-cle nu, sans crochets non lu
_QUASI_MARKER_RE (#12624) presque-mot (distance <= 2 ou mot-cle + suffixe) non lu

Le troisieme est le point : _QUASI_MARKER_RE capture son premier groupe avec la classe [A-Za-z][A-Za-z_-]{2,}, qui contient le tiret. Le groupe valait donc le token entier, la partie « suffixe » etait vide, et la classification tombait dans la branche « distance <= 2 » — ou aucun mot-cle n'est proche d'un token de 16 caracteres. Les deux branches de classification etaient esquivees par le meme token.

La mesure, sur le payload REEL de #15835

A/B sur gh issue view 15835 --json comments (la levee de po-2023 y est verbatim), meme payload, deux versions du code :

=== AVANT (HEAD) ===
QUASI 0

=== APRES (fix #15982) ===
QUASI 1
   compose CLAIMED-RELEASED -> canonical RELEASED

Et de bout en bout sur l'organe qui BLOQUE (lane_claim_required.check, payload reel de #15835, PR synthetique Closes #15835 d'une autre lane) :

guard_pass: False
blocking_lane: myia-po-2023:CoursIA
WARN: #15835: un marqueur COMPOSE `[CLAIMED-RELEASED]` poste par @jsboige
      ressemble a une levee mais n'est PAS lu par l'organe (il n'enacte que le
      mot-cle seul entre crochets). Demander a cette lane de reposter la forme
      canonique `[RELEASED]` plutot que d'attendre 48h (#15982).

Le blocage lui-meme reste correct (la levee n'a jamais ete enregistree) : ce qui manquait est la raison. Le verdict se lisait « une lane tierce tient ton grain », ce qui envoie l'auteur demander un [OVERRIDE] ou attendre 48 h, alors que la titulaire avait deja rendu le grain — dans une forme que rien ne lit.

Ce qui change

  1. scripts/check_lane_claim.py — le token compose dont la TETE est un mot-cle connu est classe kind="compose" (branche dediee) et dit dans le WARN : "CLAIMED-RELEASED" (deux mots-cles joints ; tete CLAIMED -- l'organe ne lit QUE le mot-cle seul entre crochets). Doctrine Un claim perdu en silence : quasi-marqueur non signale, et marqueur compose reduit a sa tete #12624 respectee : signale, jamais enacte, jamais auto-corrige — c'est a l'auteur de reposter la forme canonique.
  2. scripts/ci/lane_claim_required.py — la surface qui bloque porte desormais l'avertissement quand une quasi-levee est presente sur l'issue bloquante. Le lint quasi ne vivait que dans le stderr de la CLI ; le blocage restait muet, ce qui etait precisement le defaut.

Deux corrections trouvees en chemin

  • La recommandation du WARN visait la MAUVAISE forme. Le message generique rend Reposter la forme canonique "[<nearest>]", ou nearest est la tete du token. Pour [CLAIMED-RELEASED], tete = CLAIMED : conseiller [CLAIMED] a l'auteur d'une levee lui dit de reprendre le grain qu'il vient de rendre — pire que le silence. Un champ canonical porte desormais le mot-cle operatif (le mot de fermeture present dans le token), et c'est lui que le WARN recommande. nearest reste la tete (il nomme la famille, et le WARN l'imprime comme telle).
  • Pas de seconde liste de vocabulaire. Ma premiere version introduisait un _CLOSE_KEYWORDS local qui omettait DELIVERED et derivait en silence de _CLOSE (le set du reduceur, check_lane_claim.py:289). Le predicat is_release_shaped lit maintenant _CLOSE — une seule source de verite.

Un predicat public is_release_shaped(quasi) separe la question de vocabulaire (« ce quasi-marqueur est-il une LEVEE ou une PRISE ? ») de la mecanique de classification : le gate bloquant ne doit avertir que sur une levee quasi — conseiller de « lever » sur une quasi-prise serait un conseil que son auteur n'a pas a suivre.

Validation

  • Piege de regression ferme : [CLAIMED-AMEND] est un marqueur reel (_MARKER_RE le liste comme alternative de premier rang) mais n'est pas dans _KEYWORDS — ma premiere version le classait compose et l'aurait inventé en faux positif. Garde _ENACTED_MARKERS + return None en tete de _composed_keyword, avec test de controle negatif dedie.
  • Acceptance feat: add stiegler or tools #1 : [CLAIMED-RELEASED] et la variante [CLAIMED_RELEASED] produisent un quasi-marqueur kind="compose", token verbatim (CLAIMED-RELEASED, casse d'origine preservee).
  • Acceptance Genetic sharp playground #2 (controles NEGATIFS) : [RELEASED], [CLAIMED], [CLAIMED-AMEND] restent muets — plus prose sans motif de claim, plus citation en bloc clos.
  • Acceptance Ajout du notebook TP #3 : le verdict de blocage porte l'avertissement (assertion sur warnings, avec le token, la forme canonique et le numero d'issue) ; controle negatif : une quasi-prise ([CLAIMED-NOTES]) ne le declenche PAS.
  • Acceptance Fort-Boyard #4 : les deux surfaces de test apparies portent les nouveaux cas.
  • Suite complete : python -m pytest scripts/tests -q sur la tete de cette branche — 5428 passed, 30 skipped, 5 xfailed in 541.27s, exit 0.
  • Catalogue : byte-identique a main (git diff --name-only origin/main -- COURSE_CATALOG* | wc -l = 0).

Perimetre

4 fichiers, +301/-10 : scripts/check_lane_claim.py, scripts/ci/lane_claim_required.py, scripts/tests/test_check_lane_claim.py, scripts/tests/test_lane_claim_required.py.

Closes #15982
See #15846 (la victime) · See #12624 (l'organe etendu) · See #11239 · See #10223

🤖 Generated with Claude Code

`[CLAIMED-RELEASED]` etait invisible aux trois lecteurs de
`scripts/check_lane_claim.py` : `_MARKER_RE` exige le mot-cle seul entre
crochets, `_MALFORMED_MARKER_RE` exige l'absence de crochets, et
`_QUASI_MARKER_RE` capture son premier groupe avec la classe
`[A-Za-z][A-Za-z_-]{2,}` -- qui contient le tiret. Le groupe valait donc le
token entier, la partie « suffixe » etait vide, et aucun mot-cle n'est a
distance <= 2 d'un token de 16 caracteres : les deux branches de
classification etaient esquivees par le meme token.

Mesure : po-2023 a leve son claim sur #15835 avec cette forme ; l'organe a
continue de le dire vivant et la PR #15846 est restee bloquee 48 h, avec un
verdict qui conseillait de demander a la titulaire de lever -- ce qu'elle
venait de faire. Sur le payload reel de #15835 : 0 quasi-marqueur avant, 1
apres (kind compose, token verbatim, forme canonique RELEASED).

- `check_lane_claim.py` : branche de classification `compose` + WARN dedie.
  `_ENACTED_MARKERS` ferme le faux positif `[CLAIMED-AMEND]` (marqueur REEL
  lu par `_MARKER_RE`, absent de `_KEYWORDS`).
- `is_release_shaped` / `_close_keyword` distinguent une quasi-LEVEE d'une
  quasi-PRISE ; le vocabulaire lu est `_CLOSE`, la constante du reduceur,
  pas une seconde liste qui deriverait.
- Le WARN recommande desormais le mot-cle OPERATIF (`canonical`), pas la
  tete du token : pour `[CLAIMED-RELEASED]`, conseiller `[CLAIMED]` dirait
  a l'auteur de reprendre le grain qu'il vient de rendre.
- `ci/lane_claim_required.py` : la surface qui BLOQUE porte l'avertissement.

Doctrine #12624 respectee : le quasi-marqueur est SIGNALE, jamais enacte.

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

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15986 (fix(lane-claim,#15982): un marqueur de levee compose est enfin lu et dit) 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.

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

Labels

None yet

Projects

None yet

2 participants