checkpoint — deliberate mid-task snapshot
Bank a durable snapshot of where a long task stands without stopping the session — the user keeps working, or the agent keeps going, right after writing it. This is the lightweight, frequent counterpart to handoff: handoff is a heavier session-end/pause snapshot (branch state, unpushed commits, running jobs, a PR note); checkpoint is a quick “here’s what’s been decided and done so far,” written mid-task so a crash, a context compaction, or a session restart doesn’t lose the plan.
When this fires
- “checkpoint”, “save a checkpoint”, “snapshot where we are”, “note our progress”
- Proactively, without being asked, at natural stop-points inside a long task:
- right before a risky or hard-to-reverse step (a force-push, a destructive migration, a large refactor) — so the pre-step state is recoverable
- immediately after finishing a distinct phase of a multi-phase task (e.g. “design agreed, starting implementation”)
- before a long-running operation whose completion you might not be present for (kicking off a background build, handing work to a subagent, before a
ScheduleWakeup)
Skip it for short tasks with no distinct phases — there’s nothing worth snapshotting yet.
Distinction from compress-session and handoff
Three different triggers, three different jobs — don’t conflate them:
| Skill | Trigger | Session continues? | What it captures |
|---|---|---|---|
checkpoint |
Deliberate, mid-task | Yes | Plan state, decisions, next actions |
compress-session |
Approaching auto-compaction | Yes (context shrinks) | A structured distillation of the whole conversation so far |
handoff |
Ending/pausing the session | No | Full resumption state: branch, unpushed commits, running jobs, PR note |
A checkpoint note is a strict subset of what handoff captures — it skips the branch/job/PR-note mechanics because the session isn’t ending. If you’re about to genuinely stop, run handoff instead (or in addition, if the checkpoint predates the stop by a while and the state has moved on).
Procedure
1. Write the checkpoint note
Capture, concretely, in a short note (not a session history — this is a snapshot, not a transcript):
- What’s been decided — the plan or approach agreed on so far, and any option explicitly ruled out (so it isn’t re-litigated later).
- What’s done — concrete progress: files touched (
path:linepointers, not just names), commits made, PRs/issues opened. - What’s next — the specific next action, not a vague “continue implementing.”
- Anything fragile — a value that might go stale (a fetched API result, a timestamp), an assumption worth re-verifying if much time has passed before resuming.
Save it as a topic file in the project’s auto-memory directory (the same one handoff/memorize write to, and Claude’s own auto memory uses for MEMORY.md): ~/.claude/projects/<project-slug>/memory/checkpoint-<slug>.md. Unlike MEMORY.md itself, a topic file isn’t auto-reloaded after compaction (only MEMORY.md’s first 200 lines/25KB are) — that’s fine here, since a checkpoint’s job is resuming after a deliberate pause, not surviving mid-session compaction (that’s compress-session’s job). Reuse (update in place) an existing checkpoint file for the same task rather than piling up one file per checkpoint — a checkpoint supersedes the last one for the same task, it doesn’t append to a log.
2. Confirm briefly
One or two lines: what was checkpointed, and where. This isn’t a session wrap-up, so don’t produce a long report — the point is that it happened, not a recap of it.
Relationship to other skills
handoff— the heavier session-end/pause counterpart; see the distinction table above.compress-session— the pre-auto-compaction counterpart; see the distinction table above. The two can coincide (a checkpoint written just before compaction hits also happens to serve as compression fodder), but they’re triggered independently.wrap-up— closes out the whole session (every open PR/issue/branch) plus a UMS pass;checkpointis scoped to the current task’s plan state, not the whole session’s state.memorize— general-purpose fact persistence;checkpointis the specialized “resumable task state” case, structured likehandoff’s note rather than a single durable fact.
Anti-patterns
- ❌ Writing a checkpoint for every trivial step — reserve it for genuine phase boundaries or risky steps, or it becomes noise no one reads back.
- ❌ Treating a checkpoint as a full
handoff— it doesn’t need branch/job/PR state; if you need that too, runhandoff. - ❌ Appending a new file per checkpoint instead of updating the task’s one checkpoint file in place.