Gap
#18-#24 decode task/goroutine state. #20 synthesizes the logical stack. #21 gives waker causality. #27 exposes a task timeline. All of these are inspection at a point in time.
Nothing in the repo lets you move through time along the task axis. rr, Undo, and Pernosco all step at the thread level; Delve's rr backend reverse-steps threads. But async tasks and goroutines are multiplexed M:N onto threads, so "reverse-step this thread" lands you in some unrelated task's poll. The operations users actually want are:
- step back to when this future was last polled (not: last thread instruction)
- reverse-continue until this task is the running task
- rewind this goroutine across the threads it migrated between
- who closed this channel / who dropped this waker — attribution to the responsible task, not the responsible thread
This is the sharpest thing Mirrorscope has and it is currently unfiled. It is the operation nobody else can perform.
Scope
- Replay engine gains task-scoped stop conditions: replay forward/backward until a predicate over the decoded
TaskTree holds, not until a thread hits a PC.
SemanticDecoder grows the ability to answer "is task T running / polled / woken at this sequence number" cheaply enough to drive a search (cache per checkpoint; don't decode the world at every step).
- Backward search strategy: nearest-preceding-checkpoint + forward replay, binary-searching sequence numbers on the predicate. Reuse the existing reverse-step search; parameterize the predicate.
- DAP surface:
stepBack / reverseContinue honor a task-scoped granularity when the client selects a logical (task) thread rather than an OS thread.
Dependencies
Needs #17 (landed), #20, and the replay engine from #6/#8. Go variant needs #23. Land the Rust-async variant first.
Done when
With a paused async-Rust program, stepBack on a selected logical task lands at that task's previous poll, and reverseContinue stops at the previous point where that task was running — regardless of what the OS threads did in between.
Ref: README §5.2, §7. Gap: "async-task semantics don't exist in any time-travel debugger."
Gap
#18-#24 decode task/goroutine state. #20 synthesizes the logical stack. #21 gives waker causality. #27 exposes a task timeline. All of these are inspection at a point in time.
Nothing in the repo lets you move through time along the task axis. rr, Undo, and Pernosco all step at the thread level; Delve's rr backend reverse-steps threads. But async tasks and goroutines are multiplexed M:N onto threads, so "reverse-step this thread" lands you in some unrelated task's poll. The operations users actually want are:
This is the sharpest thing Mirrorscope has and it is currently unfiled. It is the operation nobody else can perform.
Scope
TaskTreeholds, not until a thread hits a PC.SemanticDecodergrows the ability to answer "is task T running / polled / woken at this sequence number" cheaply enough to drive a search (cache per checkpoint; don't decode the world at every step).stepBack/reverseContinuehonor a task-scoped granularity when the client selects a logical (task) thread rather than an OS thread.Dependencies
Needs #17 (landed), #20, and the replay engine from #6/#8. Go variant needs #23. Land the Rust-async variant first.
Done when
With a paused async-Rust program,
stepBackon a selected logical task lands at that task's previouspoll, andreverseContinuestops at the previous point where that task was running — regardless of what the OS threads did in between.Ref: README §5.2, §7. Gap: "async-task semantics don't exist in any time-travel debugger."