Skip to content

Releases: RedRobotKK/Replay

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 21:30
13b9ca8

Changelog

Fixes

Documentation

Other

Read more

v0.5.4

Choose a tag to compare

@github-actions github-actions released this 09 Sep 00:51

Changelog

Features

Documentation

Other

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.5.3

Choose a tag to compare

@github-actions github-actions released this 08 Sep 23:16

Changelog

Features

Documentation

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 08 Sep 22:44

Changelog

Features

Fixes

Documentation

Other

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 08 Sep 03:02
5944ba4

Changelog

Other

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 07 Sep 11:08
4392696

Changelog

Documentation

Other

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 18:33

The number in this release was retracted the same day it shipped

At 09:40 this morning Replay measured a fan-out session and reported that 98.8% of its re-billed tokens came from one cause. That went into a commit message as fact.

By 17:50 the number was 4.2%.

Nothing about the workload changed. The instrument was wrong. stats.observe compared each request's cacheable prefix against one session-wide field, so in a session running parallel sub-agents, lane A's request overwrote it and lane B was judged against lane A. Neither had changed anything. Both were recorded as having changed. Thirty-one of the thirty-four events had never happened.

Both figures are in the git history. The wrong one is still there.

What was actually broken

Six fields compared "this request" against "the previous one" while holding a single session-wide slot. cachemodel's own vocabulary always said laneReadFirst is documented as "the first request in a lane; nothing to compare against" — and the proxy gated it on a session-wide request count.

Field What it broke
prefixHash Phantom prefix changes, and every break attributed to them
last ClassifyRead measured one lane's usage against another's, manufacturing breaks and overruns
model, lastSeen An opus main loop with haiku sub-agents reported "model changed between requests" for lanes that never changed model
context, whatIf, reReads A quiet sub-agent erased a busy one's live breakdown on /replay/status
the first-request gate Every sub-agent's opening request scored as a cache hit that never happened

The last one is the one to take away. It produced no error, no break and no anomaly. It only inflated a success metric — the direction nobody audits — and it was found by a mutation that survived, not by anyone reading the code.

The lesson was already written down, against a seventh field, with a comment explaining exactly why it had to be keyed per lane. It had been applied to one field out of six.

Your breaks now name the tool that caused them

"System prompt or tool definitions changed" covered every prefix change and named a cause that mostly did not happen: across the entire trial, system_bytes never moved once.

cache break session=a3f2 lane=main: read 0 of 157080 expected, 157080 tokens
  re-billed; likely cause: tool definitions changed (added 3 tool(s):
  mcp__claude_ai_Otter_ai__otter_fetch, otter_get_user_info, otter_search;
  removed 1 tool(s): WaitForMcpServers)

157,080 tokens re-billed because three Otter.ai tools finished connecting. A cached prefix is keyed on content, so a connector completing its handshake mid-session voids everything before it. All three real breaks in the corrected trial were exactly this shape.

If you load MCP tools dynamically, this is the line worth grepping for.

Also in 0.4.0

  • Per-lane telemetry on /replay/statuscontext_by_lane, re_reads_by_lane, what_if_by_lane. Added additively: the existing keys keep their shapes and now mean the main loop specifically, because the endpoint carries no schema version and a consumer has nothing to branch on.
  • A pre-flight deficit warning, off by default. Warns before a changed prefix is re-billed. A ceiling landing inside the estimate's own ±15% band suppresses the refusal rather than deciding it.
  • A throughput guard for rescore, which re-walks the whole lane per request. Measured at 17.8 ms of proxy CPU for a 200-request session. Measured, not fixed.
  • Two data races fixed. Introduced this morning by the lane-map change; no tagged release ever carried them.

Windows is unsupported, and has never been tested

Not a gap in the roadmap. The CI job listed Windows and failed earlier, at go vet, on a helper behind //go:build unix. Fixing that today produced the first Windows test run there has ever been. Fourteen tests failed, and the ones that matter assert Unix file-mode semantics guarding the ledger and the masking vault.

A Windows binary that runs while not keeping those promises is worse than no Windows binary. macOS and Linux are tested on every push with go vet and go test -race. WSL works.

Install

curl -fsSL https://redrobot.jp/replay.sh | sh

Zero dependencies. go.mod is 45 bytes with no require block.

Full evidence: Lane isolation, 2026-09-06 · Changelog · Release criteria

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 15:17

Changelog

Features

  • 4c04609: feat(doctor): name the flags that fix an unenforced cap (@saitodaniel)
  • 2f3e839: feat(doctor): stop telling people to add a cap they already have (@saitodaniel)
  • 8965c5f: feat(proxy): read streamed OpenAI responses, and ask for the usage they omit (@saitodaniel)
  • 94c24ff: feat(proxy): read, guard and ledger OpenAI-compatible requests (@saitodaniel)
  • ab9e64d: feat(rules): carry what the provider documents beside what traffic showed (@saitodaniel)
  • d79a7dd: feat(usage): defend the inclusive-versus-exclusive counting trap, and record the Cursor spike (@saitodaniel)
  • b18e6c4: feat(usage): normalise the usage record, and keep the provider's payload verbatim (@saitodaniel)

Fixes

Documentation

  • 24d54d5: docs: a metrics reference, and why none of them is labelled by session (@saitodaniel)
  • 605b42c: docs: add a CLA so the licence stays a decision rather than an accident (@saitodaniel)
  • 94ed17f: docs: alerting expressions, and the two thresholds you should not copy (@saitodaniel)
  • 7a89146: docs: catch the guide, the evidence index and the architecture note up with what shipped (@saitodaniel)
  • 4a02ccf: docs: date the figures that come from a corpus that keeps growing (@saitodaniel)
  • 2ecdf04: docs: lay the README out for a public front page, and kill the last stale claim (@saitodaniel)
  • f18b2ab: docs: mark v0.2.0 released, and correct two roadmap statuses spike 4 disproved (@saitodaniel)
  • c5af963: docs: record what the metrics requirement asked for and what shipped instead (@saitodaniel)
  • 4058781: docs: the proxy was never agnostic, and the README said it was (@saitodaniel)

Other

  • 18ad452: test(masking): an adversarial matrix against the rehydration boundary (@saitodaniel)
  • f2c77cb: test(masking): assert which denial reason, not just that one was denied (@saitodaniel)

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 06:52

Changelog

Features

  • 359bfe5: feat(context): attribute what entered a session's context, by tool (@saitodaniel)
  • 8d258e2: feat(context): measure the eviction gap instead of disclaiming it (@saitodaniel)
  • 7e06e98: feat(cost): --compare, the one measurement an invoice could contradict (@saitodaniel)
  • c2aa5a5: feat(guards): make the guards visible, and derive their thresholds from your own ledger (@saitodaniel)
  • 98914d0: feat(route): the structural half of a model switch, without the fabricated constant (@saitodaniel)
  • 4f5ac9c: feat(trim): score a byte cap offline, and probe whether it would have hurt (@saitodaniel)

Fixes

Documentation

Other

  • f650725: spike 4: the proxy runs against the real provider, and refusals get attributed (@saitodaniel)

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt

v0.1.2

Choose a tag to compare

@github-actions github-actions released this 05 Sep 04:14

Changelog

Features

  • c04eac1: feat(advise): --apply proposes the one setting evidence can decide (@saitodaniel)
  • 26472c4: feat(cost): cost per task, and reposition the README around unit economics (@saitodaniel)
  • 7907354: feat(rules): provider rules become a dated document, not compiled constants (@saitodaniel)
  • 3aedc8e: feat(statusline): price the cache misses while the session is still running (@saitodaniel)

Fixes

Other

  • a02fdc2: Publish a 1363-session corpus, and stop understating it by two orders of magnitude (@saitodaniel)

Verify a download

Every release ships checksums.txt signed with Sigstore keyless signing. Verify before running anything:

cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
  --certificate-identity-regexp 'https://github.com/RedRobotKK/Replay/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
sha256sum --check --ignore-missing checksums.txt