Twinned from https://github.com/cfsh/ninefold/issues/496 by tools/beads/import_github.py's reconcile pass.
aedanpope, 2026-08-04 playtest: *"the Playhead on the notes editor only showing a few frames / lagging"*, and crucially — *"works fine in the current release/prod version of tonapse (maybe a few PRs behind head)"*.
It is NOT from #453 or #455. I compared the two head-to-head rather than reasoning about it: same probe, song playing, notes editor open, three shots nine frames apart, diffing the changed region.
``` BRANCH (feat/text-scale-200) a-b (28, 80, 541, 1027) b-c (34, 125, 928, 1027) MAIN a-b (28, 78, 535, 1040) b-c (34, 121, 928, 1040) ```
Near-identical. So whatever changed, it is already on main and came from another merged PR — which matches his "a few PRs behind head".
Loop mode is fine on head. playhead-glow.json (Space with focus in the roll → loop) shows the roll region changing between every pair of shots. So the per-frame path is intact: PlaybackDriver._Process → PublishPlayhead() → RaisePlayheadMoved() → PianoRoll.OnPlayheadMoved() → QueueRedraw() runs every frame.
The gate is PianoRoll.ShouldShowPlayhead() (PianoRoll.cs:1275):
```csharp if (!EditorState.IsPlaying) return false; if (EditorState.PlayMode == PlayMode.Loop) return true; // always draws // Song mode: only when the bar under the playhead, for the selected sound, // holds the pattern currently shown here. return bar >= 0 && bar < slots.Count && slots[bar] == EditorState.CurrentPatternId; ```
So in song mode the playhead only draws while the open pattern is the one in the playing bar. With the demo's keys row alternating HOME/LIFT, that is on-off-on-off — *"only showing a few frames"* is an exact description of that gate, not of a frame-rate problem.
That behaviour is deliberate (#102: the roll used to animate a playhead for a pattern that was not sounding). So the question is what changed such that it now reads as broken when it did not before. Two candidates worth checking first, neither of which I have confirmed:
CurrentPatternId or CurrentSoundIdx during playback, so the match fails where it used to hold.PlayBar semantics, or slots being rewritten mid-playback.git bisect between the release tag and main, using the diff-the-shots method above as the test — it is mechanical and does not depend on judging a screenshot by eye. The two probes to drive it are playhead-glow.json (loop, currently passing) and a song-mode sibling, which does not exist yet and is worth adding either way: nothing in the sweep asserts the playhead advances in song mode, which is why this reached a playtest.
Filed unclaimed. Raised as critical by Aedan, but explicitly not a blocker for #453/#455 — measured, not assumed.
None.
No comments.