Skip to content

fix(guards,#20175): le point final de phrase ne forme plus une lane fantome dans les gates adjoint/dossier/B.0 - #20176

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/lane-phantom-period-closure-gate
Oct 10, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/lane-phantom-period-closure-gate

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

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 marqueur lane <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 lane myia-po-2023:CoursIA-2. — une lane qui ne matche rien.

Le lecteur canonique grain_tag.extract_lane a été durci quatre fois pour cette classe d'auto-blocage (#12145, #12719, #13830, #15864), avec le principe single-reader #9485 documenté dans check_lane_claim.py. Cinq copies inline du motif vivaient dans trois autres organes sans aucun de ces durcissements — et le commentaire de GRAIN_LANE_RE affirmait « 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) :

'myia-po-2023:CoursIA-2.'   ← entrée fantôme, point final capturé

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)

Organe Motif Effet du fix
check_adjoint_prevalidation.py GRAIN_LANE_RE (+ LANE_TOKEN partagé) lane porteuse lisible même ponctuée
check_closure_dossier.py _DELIVERED_LANE_RE (reprend LANE_TOKEN) delivering_lanes sans entrée ponctuée
check_unaddressed_nits.py _PR_LANE_FROM_BODY_RE lane carrier du PR Grain tag
check_unaddressed_nits.py _LIFT_LANE_FOOTER_RE (2 alternatives + \.?) pied -- lane X. de nouveau reconnu

Un token ne peut plus se terminer par un point ; les points internes survivent (foo.bar:CoursIA-2 inchangé). 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

  • Smoke de comportement : 8 cas (formes ponctuées/propres, hostname interne, double point, machine/workspace vides) — tous conformes.
  • +3 tests (un par organe) : test_check_unaddressed_nits_18149.py, test_check_adjoint_prevalidation.py, test_check_closure_dossier.py.
  • 220 passed sur les trois suites cibles (1.45 s).
  • Filet élargi -k "unaddressed_nits or lane_claim or grain_tag" : 1226 passed / 1 skipped.
  • Rouge préexistant, base-inherited : test_check_lane_claim.py::test_18341_no_scope_declared_leg_not_called échoue (assert 3 == 0) sur origin/main pristine — mesuré avec ce diff stashé (échec identique). Ce PR ne touche ni check_lane_claim.py ni grain_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

…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>
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20176 (fix(guards,#20175): le point final de phrase ne forme plus une lane fantome dans les gates adjoint/dossier/B.0) 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.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 98 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Oct 9, 2026
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA
pr: 20176
head: 2b34eb6
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a1cc5ac11417b52e5259917bf89f9dae73499c9b4e28526902a236a1df362229
diff-files: 6
diff-additions: 90
diff-deletions: 8
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20176
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(guards): le point final de phrase entre dans le token de lane -- 5 motifs, 3 organes (delivering_lanes rend une lane fantome)

2 participants