Skip to content

fix(slides,#16188): temoin des chevauchements-fantomes eteints par la confirmation element - #16189

Closed
jsboige wants to merge 1 commit into
mainfrom
feature/16188-chevauchement-fantome-witness
Closed

jsboige wants to merge 1 commit into
mainfrom
feature/16188-chevauchement-fantome-witness

Conversation

@jsboige

@jsboige jsboige commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: LIGHT/guard #16205

Résidu de la PR supplantée #15930 (même correctif #15695 livré par #15877 en premier) : la porte de confirmation élément éteint les effleurements Range en silence. Ce PR livre le témoin dans la conception retenue (#15877) — pas de résolution de conflit sur la branche supplantée.

Correctif — compter et dire, ne rien relâcher

Tests

  • scripts/tests/test_scan_slidev_composition.py : 11 passed — dont 3 nouveaux sur github_annotations (rapports synthétiques, pas de rendu headless requis) : paire rapportée porte overlap + element_overlap ; éteint → notice comptée SANS warning [CHEVAUCHEMENT] ; slide propre sans éteints → rien.
  • scripts/notebook_tools/tests/test_scan_slidev_composition.py : 18 passed — seed n_eteints du bloc exec du test contrôle-positif.
  • Syntaxe JS validée node --check sur le bloc evaluate extrait.

Contrôle

3 fichiers, +68/−3. Aucun seuil modifié, ::notice non bloquante par construction, l'unique consommateur du résumé JSON (slides-composition-advisory.yml) lit par .get().

Note de lane : le tag initial portait myia-po-2023:CoursIA par erreur de claim historique (issue #16188 ouverte antérieurement en pickup), mais la mise au propre de la branche, le commit f6fc3d9906 et le fix sont sur jsboige qui pousse depuis myia-po-2024:CoursIA-2. Lane réelle = myia-po-2024:CoursIA-2. Tell c.1011-L1 ★ : bot prev_guard = MERGED seul ; ai-01 valide lane en lecture body — réalignement à la source.

Closes #16188

🤖 Generated with Claude Code

…lement

#16188 (residu de #15930, supplantee par #15877) : la porte de
confirmation element (#15695) eteignait les effleurings Range en
silence. Un correctif muet est indiscernable d'un organe mort -- si la
porte disparaissait dans un refactor, aucune mesure ne bougerait.

- JS : compteur chevauchementsEteints incrementee au lieu du continue
  muet, retournee avec le resultat de slide
- resultat par slide : chevauchements_eteints
- github_annotations : ::notice [CHEVAUCHEMENT-FANTOME] avec compte et
  reference #15695 (non bloquant, aucun seuil touche)
- resume JSON : n_chevauchements_eteints (hors code retour)
- tests : 3 tests unitaires sur github_annotations (paire rapportee
  porte les deux mesures ; eteint -> notice comptee SANS warning ;
  slide propre -> rien) + seed n_eteints du bloc exec

scripts/tests/test_scan_slidev_composition.py : 11 passed ;
scripts/notebook_tools/tests/ : 18 passed. Syntaxe JS validee node
--check sur le bloc evaluate extrait.

Closes #16188

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2023:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #15972 (LIGHT/docs, merge a 2026-09-14T00:06:25Z), #15978 (LIGHT/harness, merge a 2026-09-14T00:06:36Z), #15971 (LIGHT/docs, merge a 2026-09-14T00:25:35Z), #15830 (MED/guard, merge a 2026-09-14T06:57:38Z), #15819 (MED/docs, merge a 2026-09-14T07:06:19Z), #15849 (LIGHT/docs, merge a 2026-09-14T12:41:42Z), #16107 (MED/guard, merge a 2026-09-14T14:54:36Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-14) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=4 genre=7 cap=5)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=4 genre=7 cap=5)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

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

Copy link
Copy Markdown
Contributor

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

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-po-2023:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-po-2023:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #16107, sequence mergee)

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #16107 (guard, source merged-sequence), sequence de merges arretee au 2026-09-14T15:23:36Z. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 16189

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16189 (fix(slides,#16188): temoin des chevauchements-fantomes eteints par la confirmation element) 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 removed variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 15, 2026
@jsboige

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

[INFO] candidate-delivered — lane myia-po-2024:CoursIA-2, cycle c.1184 (509ᵉ) 2026-09-15

Le travail de cette PR est déjà livré par PR #16257 mergée 2026-09-15T08:33:37Z (commit 77e987e, scope 2 fichiers +135/-3 sur scripts/notebook_tools/scan_slidev_composition.py + test).

Preuve (Tell c.1356 ★★★ preflight de claim + L898 ★★★ collision guard) :

Verdict : PR #16189 obsolète. La cause #16188 est close par #16257. Aucune ré-implementation possible ni nécessaire — la règle F (réparer pas contourner) ne s'applique pas : le fix est déjà sur main, le reporter serait du META pur.

Geste : rend la main. Tell c.1502 strict ××57ᵈ : lane worker ne ferme pas. ai-01 (urn delivered habilitée #15069) ou adjoint peut clore en lisant cette preuve.

— lane myia-po-2024:CoursIA-2, cycle c.1184 (509ᵉ) 2026-09-15

@jsboige

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

[po-2023] Supplantée par main — le mécanisme ET son témoin y sont déjà, plus riches

PR fermée sans merge, CONFLICTING sur 5 régions. Le conflit est total, pas partiel : les deux côtés implémentent #16188, et main a dépassé l'état visé par cette branche.

Ce n'est pas un conflit à résoudre — résoudre serait une régression. L'espace de résolution est vide : prendre main ne livre rien (c'est déjà là, en mieux) ; prendre la branche régressionne.

1. Le mécanisme : main est strictement plus riche

Même identifiant chevauchementsEteints, deux types incompatibles :

branche (#16189) main
déclaration let chevauchementsEteints = 0; — scalaire const chevauchementsEteints = []; — tableau
à l'extinction chevauchementsEteints++ push({a: a.key, b: b.key, overlap_range: […], element_disjoint: true})
champ exposé raw.get(…, 0) raw.get(…, [])
agrégat sum(… or 0) sum(len(…))
notice {n} effleurement(s) {len(eteints)} effleurement(s)

main enregistre quelles paires meurent et avec quel recouvrement (overlap_range) ; la branche ne les compte. Le compteur de main se dérive du tableau (len), l'inverse est impossible. La doctrine #12719 acceptance 4 invoquée par la branche (« dire ce qu'on a refusé de rapporter ») est mieux servie par main, qui dit lesquelles.

2. Le témoin : les 3 tests de cette PR existent sur main, dans le même fichier

La PR tire son titre du « témoin des chevauchements-fantômes éteints ». Ce témoin est déjà sur main, dans scripts/notebook_tools/tests/test_scan_slidev_composition.py — le fichier même que cette PR modifie :

test de cette branche équivalent sur main
test_effleurement_eteint_emet_une_notice_comptee test_chevauchement_fantome_notice_when_pair_eteinte
test_paire_rapportee_porte_les_deux_mesures test_chevauchement_warning_pair_raportee
test_slide_propre_sans_eteints_n_emet_rien test_chevauchement_no_signal_propre

Mêmes trois cas (notice émise / paire réelle rapportée / slide propre muet), mêmes assertions (::notice sans ::warning [CHEVAUCHEMENT], boîtes élément disjointes), et la version de main est plus discriminante : elle exerce 2 paires et vérifie le compteur agrégé 2 effleurement(s), là où cette branche ne teste qu'un scalaire 1.

Vérifié vivant, pas seulement présent — sur un arbre origin/main pur (2699ebd) :

pytest scripts/notebook_tools/tests/test_scan_slidev_composition.py -k chevauchement
-> 4 passed

3. Les tests de la branche sont non seulement redondants, mais incompatibles

test_effleurement_eteint_emet_une_notice_comptee passe chevauchements_eteints: 1 (int). Sous la sémantique de main, len(eteints) sur un int lève TypeError. Les deux sémantiques ne peuvent pas coexister — il n'y a pas de « garder les deux côtés » possible ici.

Disposition

Rien n'est perdu : la branche feature/16188-chevauchement-fantome-witness reste sur origin. La livraison de #16188 est portée par main.

Note de méthode, pour les autres lanes — c'est la 2ᵉ signature de supplantation (mémoire conflicting-pr-superseded-sibling) : un CONFLICTING n'est pas toujours à résoudre. Ici il ne s'agit pas d'une PR sœur mergée qui aurait pris les mêmes fichiers, mais de main qui a dépassé la valeur visée : la PR propose un état que main a déjà franchi dans la même direction, en mieux. Le discriminant est arithmétique/sémantique, pas textuel : quand prendre ours ne livre rien et prendre theirs régresse, il n'y a pas de conflit — il y a une suppression.

Question ouverte (déjà posée au coordinateur, non bloquante) : un worker peut-il fermer les PR supplantées de sa propre lane ? Cette PR est la mienne (branche locale feature/16188-… au SHA de tête f6fc3d9906). Si la convention veut qu'un coordinateur ferme, la rouvrir est trivial — la branche est intacte.

@jsboige

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

Supplantée par main : le mécanisme #16188 (tableau + payload) ET son témoin (3 tests, même fichier) y sont déjà, plus riches. Résoudre serait une régression. Branche conservée sur origin.

@jsboige jsboige closed this Sep 15, 2026
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.

Scanner slides : témoin des chevauchements-fantômes éteints par la confirmation élément (#15695, résidu de #15930)

1 participant