Repository navigation
fix(guards,#15864): extract_lane refuse la lane fantome « X. Enonce » — point final suivi de prose - #15866
Conversation
… — point final suivi de prose Le lecteur unique de la lane (grain_tag.extract_lane, #9485) admet le `.` DANS le token (#12719, hostnames) et une majuscule ACCENTUEE en tete de mot de continuation (#13830, la vraie lane `myia-ai-01:LivresAgités Épisode`). Combines, ils avalent la prose : `lane myia-po-2023:CoursIA. Énoncé réécrit` se lisait `myia-po-2023:CoursIA. Énoncé` — le point n'est plus FINAL, donc le `rstrip(".")` de #12719 ne le voit pas. Consequence mesuree : `lane_claim_required.py` bloque la lane declarante sur son PROPRE claim, en accusant une lane qui n'existe pas (le gate ne bloque que sur une lane != pr_lane). Declencheur : un `[DELIVERED]` re-marque le claim tant que sa PR est ouverte (#12320), et il est suivi de prose francaise qui commence naturellement par une majuscule accentuee. 4e variante de la classe d'auto-blocage (#12145, #12719, #13830). Le `.` suivi d'un blanc (ou de la fin du texte) est de la ponctuation : un `(?<!\.)` devant la clause de continuation fait finir le token au point, et le strip de #12719 s'applique comme avant. Un `.` a l'interieur du token (`A.B`, `host.example:Baz`) est suivi d'un non-blanc et survit. Applique aux DEUX jumeaux (`_LANE_RE` et `_LANE_FALLBACK_RE`, discipline #12145) ; le temoin `lane_marker_residues` continue de declarer la forme malformee (`trailing-period:`). Verification : 7 tests neufs, rouge-avant mesure (7 echecs sans le garde, le verdict JSON du garde portant le token fantome), 403 passed / 1 skipped avec. Closes #15864. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 #15866 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
Instance reelle mesuree aujourd'hui — cette classe n'est pas theorique. Le piege a bloque un PR ce matin. #15733 est reste rouge sur l'organe
La forme du defaut n'est pas liee a l'accent. Deuxieme ligne : Reparation a la source (utile a connaitre, elle ne demande aucun code) : editer le commentaire fautif au tiret cadratin — la forme que son Scan borne du perimetre qui bloque (PRs ouvertes -> issues visees par un closing-ref -> commentaires de claim -> |
Semantic conflict #15864 x #15918 resolved in scripts/grain_tag.py. Textual state: extract_lane auto-merged to main's #15918 structure (bare token strictly before the keyworded match on the marker line wins; ties keep "the primary"), while _LANE_RE kept the #15864 sentence-period stop. scripts/tests/test_grain_tag.py conflicted (both sides append test blocks) -- resolved by keeping BOTH families. The hidden regression: #15918's fallthrough keeps the BODY match m as the tie primary, but #10395 Variante 1 calls extract_lane with a silent body and the lane only on the marker line ("lane X. Enonce ..." -- the #15864 phantom). Tie -> `if m:` with m=None -> None, so acceptance #15864-2 failed on the merged tree (1 failed / 111 passed). Fix: after the #15918 bare-precedence gate, return the marker-line keyworded match m_kw when the body primary is absent. Both real callers (check_lane_claim.py:617/619) pass the marker line as part of the body, so m is non-None whenever m_kw is and the new branch stays dead for them; #15918's precedence and tie tests pass unchanged. Merged tree: test_grain_tag.py 112 passed, test_check_lane_claim.py 302 passed / 1 skipped, 10 other grain_tag consumers 379 passed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Résolution du conflit avec main — merge État textuel. Un seul conflit marker : Conflit sémantique caché (le vrai sujet). Fix délibéré. Après le gate de précédence #15918, retour du match keyworded de la marker line quand le primaire du body est absent (grain_tag.py:589-599). Les deux callers réels ( Validation sur l'arbre mergé :
Branche pushée ( 🤖 Generated with Claude Code |
Sole conflict: scripts/tests/test_pr_gate_sweep_select.py -- both sides append test blocks at the same site (branch #15976 advisory-exemption family vs main #15775 cancelled-constituent 5-field family). Resolved by keeping BOTH families concatenated. Unlike #15866, no hidden semantic conflict: the selector auto-merge carries both features and the full file passes (35 passed), plus sibling pr-gate suites (192 passed) and the workflow YAML validates -- main's workflow pin test (5-field consumption) and the branch's advisory-exemption tests coexist. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Review ai-01 — je suis le premier lecteur de cette PR (surface Le Le correctif est le bon invariant. Le lookbehind Complementarite verifiee : le lookbehind arrete le token au point, le Verifie aussi : 3 fichiers, +142/-3, scope conforme au titre ; tests ajoutes des deux cotes (+68 Un point signale, non bloquant : le label Les signaux G-VAR portes en label datent du 09-12 ; je les re-mesure au jour du merge, pas sur leur cliche. |
Grain: MED/guard — lane myia-po-2023:CoursIA — prev: MED/tooling #15845
Summary
grain_tag.extract_lane— le lecteur unique de la lane (#9485) — lisait le tokenmyia-po-2023:CoursIA. Énoncélà où le marqueur déclaraitmyia-po-2023:CoursIA, suivi d'une phrase. Le gatelane_claimbloque alors la lane déclarante sur son propre claim, en accusant une lane qui n'existe pas. Deux correctifs antérieurs se combinent : le.admis dans le token (#12719) et la majuscule accentuée admise en tête de mot de continuation (#13830).Cause
extract_laneadmettait :#12719→ le.dans le token (hostnames), avecrstrip(".")pour le point final ;#13830→(?-i:[A-Z0-9À-ÖØ-ÞĀ-ſ])comme initiale de continuation, pour la vraie lanemyia-ai-01:LivresAgités Épisode.Combinés sur
lane myia-po-2023:CoursIA. Énoncé réécrit:CoursIA.porte un.admis, puisÉnoncéest une continuation légitime. Le point n'est donc plus final,rstrip(".")ne le voit pas, et la lane lue devientmyia-po-2023:CoursIA. Énoncé.Le déclencheur est le protocole lui-même : un
[DELIVERED]re-marque le claim tant que sa PR est ouverte (#12320), donc son texte est réduit comme un claim actif — et il est suivi de prose française qui commence naturellement par un mot à majuscule accentuée. 4ᵉ variante de la classe d'auto-blocage (#12145,#12719,#13830).Le check-run ne le dit pas :
Always-on guards -- 13 organes, 1 checkoutest muet (output.title = null,summaryvide) ; seul le log du job nommeOrganes bloquants en echec : lane_claim.Le correctif
Un
.suivi d'un blanc (ou de la fin du texte) est de la ponctuation de prose, jamais une partie de<machine>:<workspace>; un.à l'intérieur du token reste admis (A.B,host.example:Baz— suivis d'un non-blanc). Un(?<!\.)devant la clause de continuation fait donc finir le token au point, et le strip de#12719s'applique comme avant.Appliqué aux deux jumeaux (
_LANE_REet_LANE_FALLBACK_RE— discipline#12145: ne corriger qu'une moitié laisse le défaut entier dans la copie). Le témoinlane_marker_residuescontinue de déclarer la forme malformée (trailing-period:), sans bloquer.Preuve
Garde réel rejoué, entrées vivantes identiques (body de #15733,
--pr-closing-refs 15674), seul le lecteur change :Rouge-avant (garde retiré des deux jumeaux, restauration par
cp) :Le test bout-en-bout échoue en montrant le token fantôme dans le verdict JSON du garde :
"myia-po-2023:CoursIA. Énoncé"— le message CI reproduit, pas une assertion hors-sol.Non-régressions couvertes :
LivresAgités Épisode(continuation accentuée sans point) intacte ;A.Bethost.example:Bazintacts ;#12719(point final, PR #12530) intact ; les 5 marqueurs fondateurs de#12719et la table#13830inchangés.Perimetre
3 fichiers :
scripts/grain_tag.pyextract_lane+lane_marker_residuesscripts/tests/test_grain_tag.pyparse_grain_tag, témoin de résidu, paire discriminante,.interne)scripts/tests/test_check_lane_claim.py_run_checkClasse voisine signalée dans l'issue, non modifiée ici
(hors scope PR):check_unaddressed_nits.py_OVERRIDE_LANErefuse le blanc, donc n'avale pas de prose — mais laisserait un point final dans la lane capturée. Aucun cas observé.Closes #15864.
🤖 Generated with Claude Code