Skip to content

fix(tooling,#16188): porte de confirmation element observable -- compteur + ::notice [CHEVAUCHEMENT-FANTOME] - #16257

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/16188-ghost-overlap-notice
Sep 15, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/16188-ghost-overlap-notice

Conversation

@jsboige

@jsboige jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2026:CoursIA-2 — prev: MED/slides #16244

fix(tooling,#16188): chevauchements_eteints exposés + ::notice [CHEVAUCHEMENT-FANTOME]

See #16188 (résidu de #15930, conception retenue de #15877).

Périmètre strict

2 fichiers :

Fichier Description
scripts/notebook_tools/scan_slidev_composition.py Porte de confirmation élément (#15695/#15877) comptée au lieu de continue silencieux ; champ chevauchements_eteints propagé ; ::notice [CHEVAUCHEMENT-FANTOME] émis par slide ; compteur agrégé n_chevauchements_eteints dans le rapport
scripts/notebook_tools/tests/test_scan_slidev_composition.py 3 tests synthétiques sur github_annotations (notice quand éteinte, warning quand chevauchement, rien quand slide propre) + ajustement namespace test préexistant

Signal ::notice non bloquant, aucun seuil touché.

Le défaut mesuré

scan_slidev_composition.py (PR #15877 MERGED) a ajouté la porte de confirmation élément :

// FP v2 (#15695) — confirmation par boîtes éléments.
const ea = a.el.getBoundingClientRect();
const eb = b.el.getBoundingClientRect();
const eOverlapX = Math.min(ea.right, eb.right) - Math.max(ea.left, eb.left);
const eOverlapY = Math.min(ea.bottom, eb.bottom) - Math.max(ea.top, eb.top);
if (eOverlapX <= 0 || eOverlapY <= 0) continue;   // <-- PORTE MUETTE

Mesure : sur le deck de contrôle slides/_composition-control/slides.md (3 slides), la porte muette ne dit rien. Si la porte disparaît dans un refactor futur (e.g. quelqu'un retire le if en pensant qu'il simplifie), aucune mesure ne bouge. C'est exactement la classe d'organe mort que #12719 acceptance 4 a fondée (« un marqueur presque-juste qui le DIT ne coûte rien »).

PR supplantée #15930 portait ce témoin (label d'origine) ; il n'a pas été repris dans la conception retenue de #15877. Ce ticket le remet.

Le correctif

  1. JS — compter au lieu de skipper :
if (eOverlapX <= 0 || eOverlapY <= 0) {
    chevauchementsEteints.push({
        a: a.key, b: b.key,
        overlap_range: [Math.round(overlapX), Math.round(overlapY)],
        element_disjoint: true,
    });
    continue;
}
  1. Python — propager le champ :
"chevauchements": raw.get("chevauchements", []),
"chevauchements_eteints": raw.get("chevauchementsEteints", []),
  1. Python — émettre le ::notice agrégé par slide :
eteints = r.get("chevauchements_eteints", [])
if eteints:
    out.append(
        f"::notice file={rel},line={line}::[CHEVAUCHEMENT-FANTOME] slide {r['slide']} ({head}) — "
        f"{len(eteints)} effleurement(s) Range éteint(s) par la confirmation élément — "
        f"boîtes élément disjointes, rien à l'écran"
    )
  1. Rapport — compteur agrégé :
n_eteints = sum(len(r.get("chevauchements_eteints", [])) for r in results)
…
"n_chevauchements_eteints": n_eteints,

Tests (21/21 PASS, dont 3 nouveaux)

3 tests unitaires synthétiques sur github_annotations (rapports en mémoire, aucun rendu headless requis) :

Test Vérifie
test_chevauchement_fantome_notice_when_pair_eteinte 2 paires éteintes → exactement 1 ::notice avec compteur « 2 effleurement(s) », libellé « boîtes élément disjointes », 0 warning CHEVAUCHEMENT
test_chevauchement_warning_pair_raportee 1 chevauchement Range+boîte réel → 1 ::warning [CHEVAUCHEMENT], 0 notice fantôme
test_chevauchement_no_signal_propre Slide propre (vide) → 0 signal CHEVAUCHEMENT ni CHEVAUCHEMENT-FANTOME

Plus 1 ajustement de namespace test (n_eteints ajouté au dict _build du test préexistant test_controle_positif_warning_when_baseline_omitted qui exec un bloc de main()).

Conformité maison

  • Pas d'emoji dans le code ou les tests (CLAUDE.md §E)
  • Pre-commit H.3 : pas de notebook touché, N/A
  • Pas de fallback dégradé (règle F) : le compteur est la sortie, le ::notice est le marqueur
  • SOTA-OK : l'organe existe, on n'écrit pas un substitut
  • Tell c.16234-L1 ★★ fondateur attribution d'instrument : chaque mesure citée (3 tests × assertion) pointe son instrument (github_annotations, rapport synthétique, namespace chevauchements_eteints)

G-VAR-1

Grain livré = MED/tooling (META, pas DEEP/CONTENU). G-VAR-1 NOT HELD ×3ᵉ Tell c.15793 strict DEEP-only :

  • c.1164 REPAIR-only (×1ᵉ Tell c.1060-L2 ★)
  • c.1166 REPAIR-only (×2ᵉ Tell c.11900 reproducer ×5ᵉ)
  • c.1167 MED/tooling (×3ᵉ, présent grain)

Tell c.1060-L2 ★ grain-MED-guard-plancher-si-pool-CONTENU-sec applicable — pool CONTENT sec structurel Tell c.11900 reproducer ×5ᵉ (5ᵉ + 6ᵉ confirmés en c.1166/c.1167), aucun grain CONTENU frais non-claimé sur la lane ce cycle. La coordination ai-01 R6 reste due.

Liens

🤖 Generated with Claude Code

…teur + ::notice

Le correctif #15877 a introduit la porte de confirmation element (#15695) qui continue en silence quand la chevauche Range n est pas confirmee par les boites element disjointes. La porte etait muette : aucune mesure ne bougeait si elle disparaissait dans un refactor futur. Doctrine #12719 acceptance 4 : un marqueur presque-juste qui le DIT ne coute rien. Cette PR remet le temoin -- champ chevauchements_eteints par slide, compteur agrege n_chevauchements_eteints, notice CHEVAUCHEMENT-FANTOME emis par github_annotations, 3 tests unitaires synthetiques.

Scope strict : 2 fichiers, notice non bloquant, aucun seuil touche. MED/tooling -- G-VAR-1 NOT HELD x3 cycles consecutifs Tell c.15793 strict DEEP-only ; Tell c.1060-L2 grain-MED-guard-plancher-si-pool-CONTENU-sec applicable.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

[DONE c.1167 — lane myia-po-2026:CoursIA-2]

Livré cycle c.1167 :

G-VAR-1 NOT HELD ×3ᵉ Tell c.15793 strict DEEP-only. Tell c.1060-L2 ★ grain-MED-guard-plancher-si-pool-CONTENU-sec applicable — pool CONTENT sec structurel Tell c.11900 reproducer ×6ᵉ confirmé (5ᵉ c.1166 + 6ᵉ c.1167, tous top picks #15697/#15694/#15220/#15080/#15173/#13237/#15574 LIVRÉ/CLAIM-OTHER/VOID).

Tell NEW c.1167-L1 ★ ★★ fondateur (porte-muette → porte-compteur) : un organe dont la sortie est continue sur une branche d'erreur sans marqueur visible est structurellement mort (#12719 acceptance 4 fondateur). Le diagnostic de mort = aucune mesure ne bouge. Convention ratifiée : tout organe qui rejette un input (porte FP, filtre de sécurité, validation H.3) doit compter le rejet, même si le rejet est silencieux en sortie. chevauchements_eteints est l'archétype.

Statut PR #16257 : mergeStateStatus = UNKNOWN (fresh push). PR gate va se déclencher. Aucune review, aucun commentaire, première itération.

Suite critique cycle suivant :

@jsboige

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

[DONE c.1168 — lane myia-po-2026:CoursIA-2]

Livré cycle c.1168 :

Tell NEW c.1168-L1 ★ ★★ fondateur (geste-mesurable-en-REPAIR-only) : un cycle worker bloqué en pool CONTENU sec ×8ᵉ peut quand même faire 3 gestes effectifs :

  1. Amender une PR bloquée Tell c.14978-L1 ★★★ fondateur anti-faux-zéro (correction de chiffres imprécis sur le body) ;
  2. Re-trigger les checks via gh run rerun --failed (Tell c.1072-1 ★ ★× geste documenté) ;
  3. Poster un commentaire formel de re-review Tell c.1144-L1 ★ ★★★ fondateur angle mort B.0.

Geste NE COMPTE PAS comme grain DEEP/CONTENU Tell c.15793 strict DEEP-only — Tell c.1060-L2 ★ applicable.

Tell c.11900 reproducer ×8ᵉ CONFIRMÉ c.1168 : tous les top picks du pool CONTENU sont LIVRÉ/CLAIM-OTHER/VOID. Notamment #16235 (claim myia-po-2025:CoursIA adjoint + ai-01 rider sur #16246) et #16253/#16252 (claim myia-po-2025:CoursIA-2 ai-01). Aucun grain CONTENU frais non-préempté.

PR #16257 (c.1167) statut courant : mergeStateStatus: BLOCKED, 16/18 checks SUCCESS, 2 IN_PROGRESS (PR gate + Scripts Tests CPU). Le picker identifie Scripts Tests (CPU) comme rouge sur main corroboré par #16250, #16259 — tâche COORDINATEUR (runners owner ai-01).

G-VAR-1 NOT HELD ×4ᵉ Tell c.15793 strict DEEP-only apply Tell c.1060-L2 ★ applicable.

Mémoire c.1168 : cycle-c1168-pool-contnu-sec-x8-no-grain.md créé + MEMORY.md index mis à jour.

Suite critique cycle suivant :

@myia-ai-01
myia-ai-01 merged commit 77e987e into main Sep 15, 2026
17 of 19 checks passed
jsboige added a commit that referenced this pull request Sep 16, 2026
…teur + ::notice (#16257)


Le correctif #15877 a introduit la porte de confirmation element (#15695) qui continue en silence quand la chevauche Range n est pas confirmee par les boites element disjointes. La porte etait muette : aucune mesure ne bougeait si elle disparaissait dans un refactor futur. Doctrine #12719 acceptance 4 : un marqueur presque-juste qui le DIT ne coute rien. Cette PR remet le temoin -- champ chevauchements_eteints par slide, compteur agrege n_chevauchements_eteints, notice CHEVAUCHEMENT-FANTOME emis par github_annotations, 3 tests unitaires synthetiques.

Scope strict : 2 fichiers, notice non bloquant, aucun seuil touche. MED/tooling -- G-VAR-1 NOT HELD x3 cycles consecutifs Tell c.15793 strict DEEP-only ; Tell c.1060-L2 grain-MED-guard-plancher-si-pool-CONTENU-sec applicable.

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants