v0.20.6: one press, sixteen hundred songs

A single Right-arrow press skipped 1,676 tracks in 81 s and hard-froze the
desktop. On Wayland key repeat is generated by the client until the
compositor delivers the release, and the key filter treated every repeat as
a new press. Each skip sent gnome-shell an MPRIS Metadata whose xesam:artist
was a plain Python list, which marshals as "av" instead of "as". gnome-shell
logged an error for every one (50k/min) and reloaded the cover, and that load
is what kept it from ever delivering the release.

Space/Left/Right now act once per press and swallow the repeats.
xesam:artist goes out through mpris.string_array, which build_properties_changed
now shares for invalidated_properties. The new test round-trips the signal
into GDBus, which is what gnome-shell validates with, and fails 'av' == 'as'
against the old code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 21:52:45 -07:00
co-authored by Claude Opus 5
parent f091a545f5
commit 0e726af0da
6 changed files with 186 additions and 8 deletions
+20
View File
@@ -1,5 +1,25 @@
## Done
### Round 56 (2026-09-17) — one press, sixteen hundred songs (v0.20.6)
One Right-arrow press skipped 1,676 tracks in 81 s and hard-froze GNOME badly
enough to need SysRq (incident log `~/claude-diag/logs/issue-log-2026-09-17.md`).
It was a feedback loop, and both halves were ours.
- [x] **Transport keys act once per press.** On Wayland key repeat is
generated by the *client* until the compositor delivers the release, and
`MainWindow.eventFilter` treated every repeat as a new press. Space, Left
and Right now swallow auto-repeats (swallow, not pass through, so a held
Right doesn't walk the table cursor instead).
- [x] **`xesam:artist` goes out as `as`.** A plain `[str]` inside `Metadata`
marshals as `av`; gnome-shell logged an error for it (32k–50k/min during
the incident) and reloaded the cover per track change. That load is what
kept it from delivering the key release, so the repeats never stopped.
`mpris.string_array` builds the typed array, shared with
`build_properties_changed`'s `invalidated_properties` (Round 17's same
pitfall). The test round-trips the signal into GDBus, which is what
gnome-shell validates with, and fails `'av' == 'as'` on the old code.
### Round 55 (2026-09-14) — the song that wasn't there (v0.20.4, andTunes 0.2.2)
trav couldn't play the first track of his playlist: shuffle off gave him song