diff --git a/docs/superpowers/specs/2026-10-07-scope-features-design.md b/docs/superpowers/specs/2026-10-07-scope-features-design.md index d80f083..fd4dbc1 100644 --- a/docs/superpowers/specs/2026-10-07-scope-features-design.md +++ b/docs/superpowers/specs/2026-10-07-scope-features-design.md @@ -165,8 +165,14 @@ for the same reason every readout in this app quotes a stored sample: t0 has to buffer holds, because the cut is a binary search over the time ring and the axis is pinned to what the cut got. -A `Window` condition with `level == level2` degrades to an edge on that level, and must — a -band of zero width is not a special mode. +**A zero-width band is refused by the panel, not special-cased in the detector.** The band test +is `v >= lo && v <= hi` and the event is a change of side, so with `level == level2` the signal +is "inside" only on exact float equality — which a crossing essentially never lands on, making +the condition one that silently never fires. That is a worse failure than a refusal, and it +cannot be fixed by special-casing the detector into an edge trigger: the two state machines +answer different questions and conflating them is the divergence this design exists to prevent. +So the second level spin is clamped to differ from the first by at least its own increment, the +panel says why, and `EventDetector` keeps one unconditional band test. ### Panel and session