Skip to content

feat: task-scoped time-travel (reverse-step over a task/goroutine, not a thread) #32

Description

@chayan-bit

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."

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureProduct feature workflagshipHeadline differentiator

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions