“Checkout is flaky sometimes, might be a race condition, someone should look into it.”
No file, no repro, no definition of done. The next agent starts below zero — now “might be a race condition” has to be told apart from an actual finding.
For Claude Code, Cursor and Codex
Your agent works something out, the session ends, and the next one starts from zero. taskr is where the work goes instead: an append-only record of what was tried, what was ruled out and what to do next, with a CLI the agent calls itself.
The cost
Compaction, a crash, a closed terminal — any of them ends the session, and nothing the agent worked out along the way was written anywhere. Here is a session on a webhook bug at the moment its context ran out.
15:47 what the session had worked out
Nothing errors. The next session re-reads the codebase, retries the path that was already eliminated, and sounds exactly as certain as the one that did the work. You pay for the investigation twice and only notice the second time.
How it works
The agent shells out to the same CLI you use. It orients before it starts, files what it finds without derailing, and stops by naming the next action. Whatever it wrote down is what the next session gets.
taskr context Which issue was in progress, what it was doing, and what the last session said to do next. Runs before the agent touches a file.taskr start PAY-212 Prints the resume packet: the issue, its attached spec, prior agent notes, and why work stopped last time.taskr offload "<title>" -m "<brief>" A bug in another file, mid-task. Offload it with a file:line and a definition of done — not fixed inline, not lost in the final message.taskr park -m "<next action>" The next session — you, the same agent, or a different one — reads that note first.Same bug as above, same compaction, same seventeen-hour gap — except the outgoing agent parked with a note, so the incoming one starts where the first one left off instead of where it started.
Move the 200 below the insert in internal/billing/webhook.go:88 and put a unique index
on stripe_events.event_id. Done when the replay test posts one
event twice and gets one invoice.The second agent never saw the first one’s context. It saw the record, and the record was enough.
Why not a notes file
You could have the agent append to a markdown file and hope the next one reads it. What that gets you is a document with no author, no order, and no way to tell a finding from a guess. Six things the ledger has that the file does not:
Setup
taskr ships a SKILL.md for Claude Code. Drop it in .claude/skills/, tell taskr where you are, and the agent runs taskr context before it touches anything. Any agent that can
run a shell can use it — the CLI is an HTTP client and nothing else.
export TASKR_REMOTE=$(git remote get-url origin)
export TASKR_ROOT=$(git rev-parse --show-toplevel)
export TASKR_HEAD=$(git rev-parse HEAD)
taskr context Those three variables are how taskr learns which project you are in and
whether a branch has moved. It never runs git itself —
you tell it, and it writes down that you did.
Groups
Big work is a group. Each child carries its own status, the group rolls them up, and bugs found along the way are filed into it rather than beside it. Nothing gets trimmed for a slide — the long title stays long because the next agent needs the whole sentence.
illustration · every ref on this page belongs to the same invented project
Merged as 7c1e2b4. The handler now inserts into stripe_events (event_id UNIQUE) before doing any work and returns 200 on conflict; the replay test posts the same event twice and asserts one invoice. Retry backoff was not touched — Stripe’s schedule was never the problem.
Issues close with prose, not a status flip. Six weeks from now the question is not whether the bug closed, it is whether the index went in and whether anyone changed the backoff — and both answers are in the record, not in anyone’s recollection.
What the agent writes
Every offload gets read by someone with none of your context, possibly days later. The skill file teaches the agent the four things a brief needs. The same report, twice:
“Checkout is flaky sometimes, might be a race condition, someone should look into it.”
No file, no repro, no definition of done. The next agent starts below zero — now “might be a race condition” has to be told apart from an actual finding.
“Checkout returns 500 when a coupon is applied after the cart total has been cached — app/checkout/total.ts:61, computeTotal() reads the memoised subtotal and never re-runs when the coupon changes. Repro: add any item, open /checkout, apply SAVE10, submit. Ruled out: not the coupon API — its response is correct, the total is stale. Done when a test next to testCouponAppliesToTotal covers apply-after-cache and passes.”
What it is not
taskr never runs git or gh, never opens a database
directly, and does not manage PRs, run CI, or replace GitHub Issues. No
sprints, no burndown, no roadmap. Any tree state in an issue — branch,
HEAD, dirty files — is there because somebody wrote it down. That
constraint is the point: a memory layer that invents nothing is a memory
layer you can trust cold.
Every write is stamped by the credential that made it — user when it’s you, agent when it’s the thing working beside you.