PR #335 follow-ups: 🎛-row up-target, window re-grab on rebuild, zero-sound probe nf-21s8 ← Beads

open priority 2 task unassigned

Twinned from https://github.com/cfsh/ninefold/issues/369 by tools/beads/import_github.py's reconcile pass.

Suggestions from ninefold-reviewer's review of #335. All are below the review gate#335 is CONVERGED and nothing here blocks it. Filed so the tension leaves the PR thread and lives in the tracker.

1. 🎛 row's ▲ returns to the *selected* chip, not the departed one

TonapseHome.WireFocusChain (TonapseHome.cs:220-222) wires the 🎛 row's up-link to _soundPicker.ChipAt(EditorState.CurrentSoundIdx), while SoundPicker.ApplyVerticalWiring wires *every* chip's down-link to the 🎛 button. Focusing a chip does not select it (SoundPicker.cs:107-113 sets ActiveZone only), so:

> browse ► to spark (unselected) → ▼ lands on 🎛 change keys sound → ▲ lands on keys, not spark.

Defensible as-is — the 🎛 row and the pills below it belong to the *selected* sound, and a fixed landing is more #251-doctrinal than restoring the departed chip (which is restore-by-history, the model #251 removed). Recommendation: keep the behaviour, add the rule to CONTROLS.md's retrace bullet (games/tonapse/CONTROLS.md:79-82), which currently says "up and down retrace the same chain" without recording this within-row exception — the way the window's down-exit row-continuity exception already is recorded.

2. SongGridWindow loses focus on any rebuild it doesn't explicitly re-grab from

SongGrid.Rebuild() (SongGrid.cs:436-437) does:

```csharp _scrollView.FocusMode = FocusModeEnum.None; Callable.From(() => _scrollView.FocusMode = FocusModeEnum.All).CallDeferred(); ```

Control::set_focus_mode(FOCUS_NONE) calls release_focus() when the control currently has focus, and the deferred restore only re-enables the mode — it never re-grabs. The ◯-cancel path patches this per-caller (SongGrid.cs:1441-1443, "re-grab after it"), so the hazard is known; every *other* RaiseChanged() raised while the window itself holds focus strands focus.

No pad-only route reaches it today (X / ▢ / △ / ▼ / ▲ at the window either raise nothing or move focus deliberately). The reachable case is mixed KVM+pad: window holds pad focus, right-click a cell → ModeApplyRaiseChanged → focus dies. Structural fix: capture _scrollView.HasFocus() before dropping the mode and re-grab inside the same deferred, instead of relying on each caller.

3. No probe leg for the zero-sound state

The E1 fix (PatternPicker.cs:117-124, the 🎛 row's dangling down-link) is structural and correct, but untested — reaching the state needs the rename radial's delete wedge (long-press + stick-drive + commit), which the coder explicitly deferred on #335 rather than bolt on. Same for the F4 ActiveZone set and the H5 +/− bar link. Worth a focus-grammar leg (or its own destructive probe) when the harness next grows.

---

_Added from ninefold-reviewer's pass 13 of #335 (296b03aa, CONVERGED) — both below the review gate._

4. Two canonical descriptions overstate the △-return rule

296b03aa ("Grammar pass 10", review K1) refined the △-return: a remembered _jumpCell is trusted when its slot still names the open pattern **or is empty**, so "△ back to grid" from the flow-walk's fill panel returns to the bar the panel just named. Two descriptions still state the pre-K1 rule:

- games/tonapse/CONTROLS.md:84 — "△ from the notes editor returns to that same open pattern's cell, however the editor was entered." - games/tonapse/TonapseHome.cs:745-753 — the block comment above the branch: "A remembered cell is only trusted while it still names the open pattern; otherwise the open pattern decides" — contradicted by the carve-out three lines below it at :769-772.

Behaviour is correct as shipped; this is a two-line doc edit. Same class as the F1 → G2 → H1 → E2 → J4 drift already fixed five times on that PR, which is why it is filed here rather than cycled on the thread.

5. Armed sticky mode at the window stop shows no hint (finding I1, pass 6)

games/tonapse/ui/ControlsGuide.cs:200 gates the armed-mode block on c is SongCellButton, so with a mode armed and focus popped out to SongGridWindow, the panel shows no state word and no ◯ cancel — while SongGrid.cs:1526-1537 implements exactly that cancel and the SONG butterbar still advertises it. Raised as I1 on #335 pass 6, acknowledged by the coder at pass 10 as belonging here.

Dependencies

None.

Comments

No comments.

Add a comment