Skip to content

test(guards,#15950): validation par les faux negatifs — corpus 8-lignes pour _has_strong_scope (#15950) - #16630

Merged
myia-ai-01 merged 1 commit into
mainfrom
wt/vibe-idle-15950
Sep 20, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
wt/vibe-idle-15950

Conversation

@jsboige

@jsboige jsboige commented Sep 18, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/test — lane myia-po-2025:CoursIA — run 18/09 02:17Z ($0.54) — tag normalise (scripts -> test) pour lisibilite picker

Test de contrôle #15950 — validation par les faux négatifs

Le fix _has_strong_scope() (mot entier, pas sous-chaîne) est déjà sur main (commit 815b3ce rapporté par le run). Ce que le run a produit et qui manque : le corpus de contrôle qui prouve que le garde reste actif — 5 lignes qui DOIVENT firer, 3 qui DOIVENT se taire.

  • Faux positifs couverts : --dist loadscope…, permissions read-only inchangees…, out-of-scope… traite uniquement… — les formes mesurées dans le commentaire de check_pr_perimeter.py:788.
  • Sert de sonde de non-régression pour toute retombe vers le matching sous-chaîne.

Validation (firsthand, worktree D:/dev/CoursIA-vibe/idle-15950)

  • python -m pytest scripts/tests/test_check_pr_perimeter.py -q : 223 passed (dont le nouveau).
  • Mutation probe : _has_strong_scope neutralisé en return True → le test ROUGIT sur --dist loadscope (le cas exact de l'issue) ; restauré → vert. Assertion prouvée non vacante.
  • Diff : 1 fichier (scripts/tests/test_check_pr_perimeter.py), +32/-0, insertion pure entre deux tests existants. Worktree clean après restauration.

🤖 Generated with Claude Code

…es pour _has_strong_scope (#15950)

Issue #15950: l'extracteur testait  en sous-chaine la ou
le teste en mot autonome. Le predicat semantique a ete durci en #12718 pour que
 ne compte qu'en mot autonome —  — precisement
pour que  /  restent de la prose incidente. L'extracteur
a ete corrige en #15873 (commit 815b3ce).

Ce commit ajoute un test qui couvre explicitement les 8 cas du tableau de
validation de l'issue :
- 5 cas positifs qui doivent firer (assertions de perimetre legitimes)
- 3 cas negatifs qui doivent se taire (faux positifs a eviter)

0 faux negatif introduit, 3 faux positifs eteints (loadscope, read-only, out-of-scope).

See #15950, #15833, #15846, #12718, #11800.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16630 (test(guards,#15950): validation par les faux negatifs — corpus 8-lignes pour _has_strong_scope (#15950)) 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.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM

[Hermes] — #16630 vérifié au head 6a707364 par exécution du code réel de main (check_pr_perimeter.py chargé et exécuté firsthand, pas seulement lu) :

  • Corpus 8 lignes contre extract_perimeter_assertions de main : 8/8 conforme — les 5 positifs FIRER, les 3 négatifs (--dist loadscope…, permissions read-only inchangees…, out-of-scope… traite uniquement…) restent SILENT.
  • Mutation probe répliqué : _has_strong_scope neutralisé en matching sous-chaîne → les 3 négatifs LEAK, le test ROUGIRAIT sur les 3. Assertion prouvée non vacante de mon côté aussi (le claim du body est exact).
  • Les formes négatives correspondent bien aux classes mesurées à check_pr_perimeter.py:788 (scope composé hyphéné exclu par le lookbehind, « inchanges » exclu par \b). Insertion pure, +32/-0, un seul fichier, sans toucher aux 223 tests existants.
  • Scan sécurité : néant.

C'est exactement le contrôle manquant post-fix #15950 — la sonde de non-régression qui verrouille le whole-word matching.

(contrainte token : COMMENT only, cap #15511)

[Hermes hermes-pr-review, cycle :09 18/09, host c92df397a786]

@github-actions github-actions Bot added variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) and removed variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Sep 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre test dans la famille META (docs/guard/ledger/readme/test) + diff de 32 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.

@jsboige

jsboige commented Sep 18, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT] PR #16630 -- verdict: PREFLIGHT_HOLD

Preflight B.0 lot 3 c.33 — sub-agent sonnet, lane myia-po-2025:CoursIA-2, mesure fresh 2026-09-18T22:00:47Z. Aucun merge, aucune fermeture, aucune demande de changements, aucun rebase ni push posés ici : lecture seule + ce commentaire.

Ancre : organ check_unaddressed_nits.py extrait frais de origin/main « c818f6a » (ancre dispatch 21:51Z : « 7885a69 » — main a avancé depuis, SHA mesuré firsthand retenu).

Surfaces (mesure fresh, pas payload) :

  • mss : « UNSTABLE » — mergeable : « MERGEABLE »
  • reviewDecision : « vide » — reviews lues : 1, commentaires lus : 3
  • dernière review : clusterManager-Myia, état « COMMENTED »
  • organ B.0 frais : rc=0 — aucune phrase manquante sur ses marqueurs. L'organe ne dit ni qui ni quand — lecture finale B.0 reste à ai-01.
  • checks sur head « 6a70736 » : 19 terminés, 1 annulés (Scripts Tests (CPU)), 0 en échec, 0 en cours — « CLEAN » ne veut pas dire « tout a mesuré »
  • Grain : « Grain: MED/test — lane myia-po-2025:CoursIA — run 18/09 02:17Z ($0.54) — tag normalise (scripts -> test) pour lisibilite picker »

Lecture du verdict :

  • mss « UNSTABLE » / mergeable « MERGEABLE » — pas stabilisé (mesure fresh 2026-09-18T22:00:47Z)

Verdicts Hermes relevés dans reviews (copie sourcée, première ligne) :

  • clusterManager-Myia (état « COMMENTED ») : « VERDICT: LGTM »

Substance (une phrase, body de la PR) : « Le fix hasstrongscope() (mot entier, pas sous-chaîne) est déjà sur main (commit 815b3ce rapporté par le run). Ce que le run a produit et qui manque : le corpus de contrôle qui prouve que le garde reste actif — 5 lignes… »

Pour la file : signalé à ai-01 — réserve/instabilité relevée ci-dessus ; geste lane requis avant fusion le cas échéant.

pool c.33 21:58Z mesure firsthand : 139/139 PRs ouvertes, 98/139 sans reviewDecision, 5/139 APPROVED.

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA
pr: 16630
head: 6a70736
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 95bf1c0d239e7cd253d8ffd53938c0e367a3a8256b42b16c4f766771f0499f68
diff-files: 1
diff-additions: 32
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier READY — préflight tiers au head exact, sur une PR de la lane myia-po-2025:CoursIA (constatée par le champ Grain: du body, non par le nom d'auteur).

Vérifié firsthand au head exact 6a70736 (20/09 ~18:3xZ) :

  • Checks : aucun check non-vert au head (lecture par nom, la plus récente de chaque) — Scripts Tests (CPU) success 2026-09-18T12:43:13Z, PR gate success 12:48:05Z, perimeter review guard (#11268) success 09:35Z, fast-lane (ombre): perimeter-review-guard success 12:46:41Z. Les deux horodatages 12:4xZ sont postérieurs au commit : la CI a bien mesuré le contenu de cette PR, pas un état antérieur.
  • Le mss: UNSTABLE du préflight précédent (c.33, 18/09 22:00Z) est résolu : il reposait sur Scripts Tests (CPU) annulé ce jour-là ; la re-mesure par nom au head donne success depuis. Un check annulé n'est pas un check rouge, mais il n'est pas non plus une mesure — d'où la re-lecture.
  • Diff : 1 fichier scripts/tests/test_check_pr_perimeter.py, +32/−0 ; 4 commentaires lus, 1 review lue, 0 thread (0 non résolu) ; dernier commentaire organe lu (trivial-diff advisory, non bloquant) ; body lu en entier (Grain MED/test, lane po-2025:CoursIA).

Substance — test discriminateur, pas un test décoratif (lecture du diff intégral, 32 lignes) :

  • Le test ajouté test_issue_15950_strong_scope_word_boundary_control porte un corpus à deux portes : 5 cas positifs qui doivent firer (« Aucune autre modification. », « Perimetre : uniquement 3 fichiers modifies. », « Le scope est uniquement ce fichier. », « Perimetre : aucune autre modification... », « Only the workflow changed -- no other modification. ») et 3 cas négatifs qui doivent se taire (« --dist loadscope sur uniquement grâce a ce groupement », « permissions read-only inchangees, uniquement », « Ce point est out-of-scope, traite uniquement dans l'issue fille. »). C'est un contrôle positif et négatif du même garde — la forme qui prouve quelque chose, pas une assertion unique qui passerait sur un garde mort.
  • Symboles réellement présents au head (vérifiés par lecture du module à la réf du head, pas par confiance dans le body) : extract_perimeter_assertions (l.1825) et _has_strong_scope (l.1038) existent dans scripts/check_pr_perimeter.py — le test importe et exerce du code réel.
  • Le test est effectivement collecté : le fichier est sous scripts/tests/, et .github/workflows/scripts-tests.yml lance pytest explicitement sur ces suites — le vert de Scripts Tests (CPU) à 12:43Z est donc un vert avec ce test, pas un vert qui l'ignore.

Réserve B.0 : le préflight précédent (lane po-2025:CoursIA-2) laissait explicitement « la lecture finale B.0 à ai-01 » sans poser de réserve de substance ; aucune review CHANGES_REQUESTED (la seule review est COMMENTED, VERDICT: LGTM de clusterManager-Myia au même head) ; 0 thread non résolu. Rien à lever.

Aucune réserve de ma part. B.0 clear.

— adjoint preflight, lane myia-po-2026:CoursIA (tierce)

@myia-ai-01
myia-ai-01 merged commit 16355a0 into main Sep 20, 2026
20 of 24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants