the problem
Your agent crashes on step 47 of 50. To see it again you re-run 46 steps, pay for every token, and hope the model takes the same path. It won't. Temperature moves, models get updated underneath you, tools resolve in a different order.
So the bug you reproduce is never quite the bug you were chasing. Observability tools show you what happened. None of them let you run it again.
the build
how it works
rewind injects one custom fetch into the Anthropic SDK client. That is the entire integration. Every request and response is journaled into a single SQLite file, with bodies content-addressed by SHA-256, so the system prompt repeated across all 50 steps is stored once instead of fifty times. Replay matches a request by canonical fingerprint: JSON with recursively sorted keys, volatile headers stripped before hashing. Same request in, recorded response out. No network, no key, no cost.
the call
Which headers count as part of a request's identity?
chose
Strip a known-volatile blocklist before fingerprinting: auth, request ids, dates, idempotency keys, SDK telemetry. Treat every header that survives as semantic.
rejected
Allowlisting the headers I already knew mattered. An unknown header that genuinely changes API behavior would then be ignored, and two different requests would collide on one fingerprint.
consequence
A blocklist miss causes a replay miss, which is loud and debuggable. An allowlist miss causes a wrong hit, which is silent corruption. Fingerprints fail loud rather than lie.
where it stands
Live and open source. Record, replay, step, fork, and diff all ship in the CLI. The demo agent carries a real bug that only surfaces on the last step, so you can watch a fix get verified offline for nothing.