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.
🎛 row's ▲ returns to the *selected* chip, not the departed oneTonapseHome.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.
SongGridWindow loses focus on any rebuild it doesn't explicitly re-grab fromSongGrid.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 → ModeApply → RaiseChanged → focus dies. Structural fix: capture _scrollView.HasFocus() before dropping the mode and re-grab inside the same deferred, instead of relying on each caller.
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._
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.
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.
None.
No comments.