Make the phone say what it thinks is happening #24

Closed
opened 2026-08-10 16:53:41 +00:00 by aiko · 1 comment
Owner

Parent

#1

Why

Two bugs have survived two rounds of fixes because they are timing races against a client that reports on a ten-second throttle, and nothing about them is visible from the sofa:

  • Pressing back twice goes back one, then forward one. (#21 was supposed to fix this.)
  • Swiping the Cue strip is very inconsistent. (#22 was supposed to fix this.)

Guessing a third time is a bad plan. The phone should say what it thinks is happening.

What to build

A diagnostic readout, behind a new settings row (Show diagnostics, off by default, phone-local like the others). It is a development tool and may be removed once the races are understood — build it to be cheap to delete, not to live forever.

A state line, readable while swiping and pressing, so it cannot live in the sheet: the clock's current estimate; the last report's position and how long ago it arrived; whether that report was treated as news or as an echo; the last seek's target and whether it has been confirmed; the scrub run's anchor and whether it is active; the strip's panelIndex and what it has outstanding in awaitingSettle; and whether the session accepts commands.

A rolling event log of roughly the last ten events, newest first, each with a timestamp relative to the previous one. Events worth recording: a press (which control), a seek issued (target), a report arriving (position, and the verdict — news, echo, or resync), a settle (which panel, and whether it was judged the reader's or the app's), a run starting or ending (and why it ended).

The ordering is the whole point. A state snapshot alone will not show a report arriving between a press and its seek, which is the leading hypothesis for the back-twice bug.

Constraints

  • Off by default and entirely absent when off — no cost, no layout effect, nothing on screen.
  • When on, it may sit over the Cue region. It is diagnostic, so it earns its space by definition; DESIGN.md's "no decoration that is not carrying information" is not in tension with it.
  • It must not change the behaviour it is measuring. In particular it may not add a paint, a scroll, or a request, and recording an event must not be able to throw.
  • Monospace, small, muted. Legibility over beauty; this is read once and turned off.
  • The footer still never changes shape.

Acceptance criteria

  • A settings row turns it on and off, persisted like the others
  • Off means absent, not hidden — no elements, no listeners, no recording
  • The state line shows every field listed above and updates as things change
  • The event log preserves ordering and relative timing across at least ten events
  • A report arriving between a press and its seek is visible as such in the log
  • Turning it on and off mid-episode does not disturb playback, the strip, or a run
  • Recording an event cannot throw, whatever the state
  • The recorder's own logic is tested

Blocked by

## Parent #1 ## Why Two bugs have survived two rounds of fixes because they are timing races against a client that reports on a ten-second throttle, and nothing about them is visible from the sofa: - **Pressing back twice goes back one, then forward one.** (#21 was supposed to fix this.) - **Swiping the Cue strip is very inconsistent.** (#22 was supposed to fix this.) Guessing a third time is a bad plan. The phone should say what it thinks is happening. ## What to build A diagnostic readout, behind a new settings row (`Show diagnostics`, off by default, phone-local like the others). It is a development tool and may be removed once the races are understood — build it to be cheap to delete, not to live forever. **A state line**, readable while swiping and pressing, so it cannot live in the sheet: the clock's current estimate; the last report's position and how long ago it arrived; whether that report was treated as news or as an echo; the last seek's target and whether it has been confirmed; the scrub run's anchor and whether it is active; the strip's `panelIndex` and what it has outstanding in `awaitingSettle`; and whether the session accepts commands. **A rolling event log** of roughly the last ten events, newest first, each with a timestamp relative to the previous one. Events worth recording: a press (which control), a seek issued (target), a report arriving (position, and the verdict — news, echo, or resync), a settle (which panel, and whether it was judged the reader's or the app's), a run starting or ending (and why it ended). The ordering is the whole point. A state snapshot alone will not show a report arriving between a press and its seek, which is the leading hypothesis for the back-twice bug. ## Constraints - Off by default and entirely absent when off — no cost, no layout effect, nothing on screen. - When on, it may sit over the Cue region. It is diagnostic, so it earns its space by definition; `DESIGN.md`'s "no decoration that is not carrying information" is not in tension with it. - It must not change the behaviour it is measuring. In particular it may not add a paint, a scroll, or a request, and recording an event must not be able to throw. - Monospace, small, muted. Legibility over beauty; this is read once and turned off. - The footer still never changes shape. ## Acceptance criteria - [ ] A settings row turns it on and off, persisted like the others - [ ] Off means absent, not hidden — no elements, no listeners, no recording - [ ] The state line shows every field listed above and updates as things change - [ ] The event log preserves ordering and relative timing across at least ten events - [ ] A report arriving between a press and its seek is visible as such in the log - [ ] Turning it on and off mid-episode does not disturb playback, the strip, or a run - [ ] Recording an event cannot throw, whatever the state - [ ] The recorder's own logic is tested ## Blocked by - #21 - #22
Author
Owner

This was generated by AI during triage.

Merged to main. Suites: 79 C#, 366 phone.

An event log with ordering, behind a settings row, off by default and absent when off.

It earned its cost immediately: two rounds of inference had missed the back-twice bug, and one screenshot of this log named the mechanism exactly. Kept for the next race — #25's log entry gained a stale verdict.

> *This was generated by AI during triage.* Merged to `main`. Suites: 79 C#, 366 phone. An event log with ordering, behind a settings row, off by default and absent when off. It earned its cost immediately: two rounds of inference had missed the back-twice bug, and one screenshot of this log named the mechanism exactly. Kept for the next race — #25's log entry gained a `stale` verdict.
aiko closed this issue 2026-08-11 21:14:52 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mobrule/kurageyomi#24
No description provided.