Repository navigation
fix(guards,#20175): le point final de phrase ne forme plus une lane fantome dans les gates adjoint/dossier/B.0 - #20176
Conversation
…antome La classe de token [A-Za-z0-9_.-]+ admet le point (les hostnames en ont besoin), donc "lane myia-po-2023:CoursIA-2." etait capture comme la lane "myia-po-2023:CoursIA-2." -- une lane qui ne matche rien. Le lecteur canonique grain_tag.extract_lane a ete durci quatre fois pour cette classe (#12145, #12719, #13830, #15864) ; cinq copies inline du motif, dans trois organes, n'ont recu aucun de ces durcissements : - check_adjoint_prevalidation.py GRAIN_LANE_RE - check_closure_dossier.py _DELIVERED_LANE_RE - check_unaddressed_nits.py _PR_LANE_FROM_BODY_RE + _LIFT_LANE_FOOTER_RE Instance mesuree : #14549, 2026-10-09 -- delivering_lanes rendait la lane fantome "myia-po-2023:CoursIA-2." ; une lane nommee uniquement sous forme ponctuee est absente de l'ensemble d'exclusion, donc son dossier d'auto-attestation passe le gate. Correctif : un token ne peut plus se TERMINER par un point (les points internes survivent). Les deux pieds de signature du gate B.0 tolerent un point final explicite (\.?) pour que l'ancre \s*$ ne casse plus la forme "-- lane X.". Tests : +3 (un par organe) ; 220 passed sur les trois suites cibles ; filet elargi 1226 passed / 1 skipped. L'unique rouge (test_18341_no_scope_declared_leg_not_called) est PREEXISTANT sur origin/main pristine -- echec identique avec ce diff stashe, cite comme base-inherited. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Path-collision (organ #13359/#13615)Cette PR #20176 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
Trivial-diff advisory (#15740, non bloquant). |
|
[ADJOINT PREFLIGHT] |
Grain: LIGHT/guard — lane myia-po-2023:CoursIA — prev: DEEP/research-code #20036
Closes #20175
Ce que le fix ferme
La classe de token
[A-Za-z0-9_.-]+admet le point (les hostnames en ont besoin), donc un marqueurlane <machine:workspace>terminé par une phrase capturait le point final comme partie du nom :lane myia-po-2023:CoursIA-2. Enoncéétait lu comme la lanemyia-po-2023:CoursIA-2.— une lane qui ne matche rien.Le lecteur canonique
grain_tag.extract_lanea été durci quatre fois pour cette classe d'auto-blocage (#12145, #12719, #13830, #15864), avec le principe single-reader #9485 documenté danscheck_lane_claim.py. Cinq copies inline du motif vivaient dans trois autres organes sans aucun de ces durcissements — et le commentaire deGRAIN_LANE_REaffirmait « Same grammar as scripts/check_lane_claim.py », faux depuis #13830.Instance mesurée (fondatrice)
Issue #14549, 2026-10-09, calcul firsthand
delivering_lanes(snapshot):Le trou, pas juste le bruit : une lane nommée uniquement sous forme ponctuee est absente de l'ensemble d'exclusion anti-auto-attestation — son propre dossier passe alors le gate. Côté gate B.0, un pied
-- lane X.ponctué n'était pas attribué à la lane carrier (faux rouge, fail-closed).Le diff (5 motifs, forme identique)
check_adjoint_prevalidation.pyGRAIN_LANE_RE(+LANE_TOKENpartagé)check_closure_dossier.py_DELIVERED_LANE_RE(reprendLANE_TOKEN)delivering_lanessans entrée ponctuéecheck_unaddressed_nits.py_PR_LANE_FROM_BODY_REcheck_unaddressed_nits.py_LIFT_LANE_FOOTER_RE(2 alternatives +\.?)-- lane X.de nouveau reconnuUn token ne peut plus se terminer par un point ; les points internes survivent (
foo.bar:CoursIA-2inchangé). Le\.?explicite des pieds de signature est nécessaire : sans lui, l'ancre\s*$ne matchait plus du tout la forme-- lane X.(détecté par smoke-test avant livraison).Voie (a)
[lane X]hors périmètre : délimitée par des crochets, jamais suivie de prose.Validation
+3 tests(un par organe) :test_check_unaddressed_nits_18149.py,test_check_adjoint_prevalidation.py,test_check_closure_dossier.py.-k "unaddressed_nits or lane_claim or grain_tag": 1226 passed / 1 skipped.test_check_lane_claim.py::test_18341_no_scope_declared_leg_not_calledéchoue (assert 3 == 0) surorigin/mainpristine — mesuré avec ce diff stashé (échec identique). Ce PR ne touche nicheck_lane_claim.pynigrain_tag.py. À traiter en sujet séparé.Dette nommée (hors acceptance de #20175)
Les cinq copies devraient à terme déléguer au lecteur canonique ou partager un fragment unique ; ce fix resserre la classe localement, il ne supprime pas la duplication.
🤖 Generated with Claude Code