Session Handoff Document
thedotmack/claude-mem
Writes a HANDOFF.md capturing goal, state, files, failed attempts and next steps so a fresh agent session can continue exactly where this one stopped.
EXPERIMENTAL. An agent skill from Ovid/paad.
$ npx skills add Ovid/paad --skill handoff -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Ovid/paad handoff --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/paad/skills/handoff .claude/skills/handoff && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .claude/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoffType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Ovid/paad --skill handoff -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Ovid/paad handoff --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/paad/skills/handoff .agents/skills/handoff && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .agents/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ovid/paad --skill handoff -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Ovid/paad handoff --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/paad/skills/handoff .cursor/skills/handoff && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .cursor/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Ovid/paad.git --path plugins/paad/skills/handoff--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Ovid/paad --skill handoff -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Ovid/paad handoff --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/paad/skills/handoff .gemini/skills/handoff && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .gemini/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Ovid/paad handoffInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Ovid/paad --skill handoff -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/paad/skills/handoff .github/skills/handoff && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .github/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ovid/paad --skill handoff -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Ovid/paad handoff --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ovid/paad.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/paad/skills/handoff .opencode/skills/handoff && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "handoff" agent skill from https://github.com/Ovid/paad/tree/main/plugins/paad/skills/handoff into .opencode/skills/handoff/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "handoff", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
handoffEXPERIMENTAL. An agent skill from Ovid/paad.
Handoff is an agent skill from Ovid/paad. EXPERIMENTAL. Use when a session is running out of context and the work needs to continue in a fresh one, or when starting a session meant to pick up where an earlier one stopped. Not for compacting in place — that is /compact — and not for specifying work that has not started, which is a plan.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: The practices that made software work didn't stop working. They stopped keeping up. PAAD brings them back at AI speed. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 9b0b57f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitbashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Handoff loads about 3.4k tokens when it runs. Until then it costs about 76 tokens; SKILL.md has 1,504 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Ovid/paad at commit 9b0b57f, republished under its MIT licence (© Ovid). 1,504 words, ~3,441 tokens.
.claude/skills/handoff/SKILL.md (or your agent's skills folder).On invocation: announce "Running paad:handoff v1.31.0" before anything else.
Experimental. Arguments, file format, and behavior may change — or this skill may be withdrawn — in any release, including a patch release. The semver promise the settled skills carry does not apply here. If you build a workflow on it, pin your plugin version and file what breaks.
Writes a handoff.md that lets a fresh session continue this one's work, and reads it back on the other side.
Claude Code already solves most of this, and knowing which part it doesn't is the whole point. /compact summarizes and keeps working, but the summary it carries is machine-authored, lands unreviewed, and lives inside the transcript where you cannot edit it. --continue and --resume restore the full prior conversation, which re-pays the context cost you were trying to escape. /clear gives a genuinely empty session and carries nothing forward. handoff is worth running for exactly one reason: the carried state is a file a human can read and correct before anything is built on it. A handoff nobody reviews is a worse /compact — same summary, more ceremony. Say so rather than letting the review get skipped.
The failure mode is not omission. Left to itself, a competent agent writing a handoff keeps the expensive material well: the approaches that were tried and abandoned, the reasons behind them, constraints the user stated once in passing. What it gets wrong is the cheap material — a test's file path, which changes are in the last commit, a line number, who said a quoted sentence. Those are the claims a tool could have settled in seconds, and they arrive in exactly the same confident register as the parts that are right. A fresh session has no memory to catch them with. So verify what is checkable before writing it down, and mark what is not.
Mode selection and saving:
digraph handoff_save {
"Argument given?" [shape=diamond];
"Use the named mode" [shape=box];
"Conversation above this invocation?" [shape=diamond];
"Say: saving, session has history" [shape=box];
"Resume flow, below" [shape=box];
"handoff.md in .gitignore?" [shape=diamond];
"Suggest adding it, never add it silently" [shape=box];
"Verify every checkable claim with tools" [shape=box];
"Claim survived verification?" [shape=diamond];
"Write it as fact" [shape=box];
"Correct it, or mark it inferred" [shape=box];
"Write handoff.md with the Write tool" [shape=box];
"Name the unverified claims, ask for review" [shape=box];
"Announce the artifact" [shape=box];
"Argument given?" -> "Use the named mode" [label="save or resume"];
"Argument given?" -> "Conversation above this invocation?" [label="no"];
"Conversation above this invocation?" -> "Say: saving, session has history" [label="yes"];
"Conversation above this invocation?" -> "Resume flow, below" [label="no"];
"Use the named mode" -> "Say: saving, session has history" [label="save"];
"Use the named mode" -> "Resume flow, below" [label="resume"];
"Say: saving, session has history" -> "handoff.md in .gitignore?";
"handoff.md in .gitignore?" -> "Suggest adding it, never add it silently" [label="no"];
"handoff.md in .gitignore?" -> "Verify every checkable claim with tools" [label="yes"];
"Suggest adding it, never add it silently" -> "Verify every checkable claim with tools";
"Verify every checkable claim with tools" -> "Claim survived verification?";
"Claim survived verification?" -> "Write it as fact" [label="yes"];
"Claim survived verification?" -> "Correct it, or mark it inferred" [label="no"];
"Write it as fact" -> "Write handoff.md with the Write tool";
"Correct it, or mark it inferred" -> "Write handoff.md with the Write tool";
"Write handoff.md with the Write tool" -> "Name the unverified claims, ask for review";
"Name the unverified claims, ask for review" -> "Announce the artifact";
}Resuming:
digraph handoff_resume {
"handoff.md exists?" [shape=diamond];
"Say so, offer to save one instead" [shape=box];
"Read it, summarize in a few lines" [shape=box];
"Recorded commit matches HEAD?" [shape=diamond];
"Report the drift before asking" [shape=box];
"Ask: proceed?" [shape=diamond];
"Stop, leave the file alone" [shape=box];
"Check the files and state it names" [shape=box];
"Everything matches?" [shape=diamond];
"Report every mismatch, ask again" [shape=box];
"Start the recorded next step" [shape=box];
"Leave handoff.md in place" [shape=box];
"handoff.md exists?" -> "Read it, summarize in a few lines" [label="yes"];
"handoff.md exists?" -> "Say so, offer to save one instead" [label="no"];
"Read it, summarize in a few lines" -> "Recorded commit matches HEAD?";
"Recorded commit matches HEAD?" -> "Ask: proceed?" [label="yes"];
"Recorded commit matches HEAD?" -> "Report the drift before asking" [label="no"];
"Report the drift before asking" -> "Ask: proceed?";
"Ask: proceed?" -> "Check the files and state it names" [label="yes"];
"Ask: proceed?" -> "Stop, leave the file alone" [label="no"];
"Check the files and state it names" -> "Everything matches?";
"Everything matches?" -> "Start the recorded next step" [label="yes"];
"Everything matches?" -> "Report every mismatch, ask again" [label="no"];
"Report every mismatch, ask again" -> "Start the recorded next step" [label="user confirmed"];
"Start the recorded next step" -> "Leave handoff.md in place";
}/handoff — infer the mode. Conversation above this invocation means you are saving; an empty session means you are resuming. Say which way it went, in one line, before acting./handoff save — write a handoff regardless/handoff resume — read the existing handoff regardlessThe inference is a convenience, not a guess worth defending. If it picks wrong, the user says save or resume and you obey without arguing.
.gitignoreIf handoff.md is not ignored, say so and suggest adding it. Suggest — do not edit .gitignore yourself. It is a tracked file and the user may have reasons.
This is the step that makes the skill worth running. Every claim below is checkable with a tool in seconds, and every one of them is a claim agents get wrong from memory:
| Claim | Settle it with |
|---|---|
| Current commit, branch, dirty state | git rev-parse --short HEAD, git status --short |
| What is actually in the last commit | git show --stat HEAD — not the commit message, which lies |
| A file path | Read it, or ls it |
| A line number | Read the file and look |
| A test's name or file | Grep for it |
| Whether the suite passes, and what fails | Run it |
| A quoted sentence and who said it | Find it in the conversation, or do not quote it |
If a claim cannot be settled, it does not become a fact. Either drop it or mark it inferred.
Use the Write tool, never a shell redirect. Claude Code snapshots files its own file tools touch; a bash > handoff.md has no recovery copy anywhere, and neither does git, since the file is ignored.
# Handoff — <one-line task name>
Written <date time> · branch `<branch>` · commit `<short sha>`
Uncommitted: <one line — what is dirty, what is staged>
## Goal
What we are trying to achieve, and what "done" looks like.
## Decisions
Chose X over Y, because Z. One line each.
## Ruled out
What was tried, how it failed, and how far it got. One line each.
## Constraints
Things the user said that exist nowhere on disk. Quote them.
## Next step
The single immediate action, with the file and line to start at.
## Verify
The command that says whether it worked.
## Unverified
Anything above that could not be checked, marked as inferred.
Delete this section if it is empty — do not pad it."Ruled out" is the section that earns the file. Everything else is recoverable — a fresh session can read the code, run git log, work out the goal. What it cannot recover is that forty minutes already went into proving an approach doesn't work. Without that line, it spends them again.
Write down what a fresh session cannot reconstruct, and nothing else. No architecture tour, no narrative of how the session went, no restating what git diff already shows. Those feel thorough and are pure padding, and padding is not harmless here: it makes the file long enough that the review gets skimmed, and the review is the only reason this skill beats /compact.
Do not close with a general disclaimer. "Please review, AI can make mistakes" is true of everything and therefore aims at nothing — it gets skimmed, and inference reads exactly like recall.
Name the specific claims you are least sure of and say what depends on them:
Two things to check before you rely on this. I inferred the next step from what we were doing rather than from anything you said outright, and I could not confirm the second constraint is still live — it came from early in the session. Everything downstream is built on both.
If everything in the file was verified, say that instead, plainly. An honest "all of this was checked against the repo" is a better prompt to read it than a manufactured doubt.
End with the file you touched. Say it even though the user asked for it and watched it happen — a handoff sitting unnoticed in the working directory is the same as no handoff:
Files written or updated:
new handoff.mdOn a resume, the same block covers whatever the recorded next step changed. Source and test files need only a count and a pointer — 4 source files changed in src/dbsync/ (see git diff) — but handoff.md itself is named every time.
handoff.md. If there isn't one, say so and offer to save one instead.Never delete handoff.md. Not after reading it, not on success. It is the only written record of the reasoning, and it is untracked, so git cannot bring it back. If the resume goes sideways the user needs to re-read what it actually said. The next save overwrites it; that is the whole lifecycle.
| Mistake | What to do instead |
|---|---|
| Writing file paths, line numbers, or test names from memory | These are the errors. Check each one with a tool first — it costs seconds. |
| Quoting the user's constraint and attributing it to a name | The conversation may never state who said it. Quote the sentence; do not invent the speaker. |
| Trusting the last commit's message for what it contains | git show --stat HEAD. Messages describe intent, not content. |
| Including an architecture tour or a file-by-file layout | Recoverable by opening the repo. It buys nothing and costs the review. |
| Narrating how the session unfolded | The next session needs the conclusions, not the journey. |
| Stating inferred and verified claims in the same register | Mark the inferred ones. Uniform confidence is what hides the errors. |
| Filing a claim under "Unverified" instead of checking it | That section is for what a tool genuinely cannot settle. If git show --stat HEAD or one grep would answer it, run it. An Unverified list longer than a few lines, in a repo you can read, means verification got skipped and relabelled. |
| Closing with "review this, AI makes mistakes" | Name the two or three claims that actually need checking. |
| Deleting the handoff after resuming | It is untracked; git cannot restore it. Let the next save overwrite it. |
| Resuming straight into the work without checking the tree | The handoff may be describing a state that no longer exists. |
Writing the file with echo or > | Use the Write tool. A shell redirect leaves no recovery copy. |
| Running this to compact the current session | That is /compact. This skill exists to produce a file for a different session. |
rm handoff.mdAll of these mean: go check, cut it, or mark it inferred.
© Ovid, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/paad/skills/handoff of Ovid/paad.
Open the folder on GitHubat commit 9b0b57f
Handoff next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Handoff this skillOvid/paad | 131 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Session Handoff Documentthedotmack/claude-mem | 98k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Handoffnexu-io/open-design | 100k | — | ~547 | Automated safety check: Pass | Apache-2.0 | |
| Handoffalirezarezvani/claude-skills | 28k | — | ~2.5k | Automated safety check: Notes | MIT | |
| Handoffalirezarezvani/claude-skills | 28k | — | ~532 | Automated safety check: Pass | MIT | |
| Session Handoff Writercodewhale-hq/Codewhale | 41k | — | ~1.2k | Automated safety check: Pass | MIT |
thedotmack/claude-mem
Writes a HANDOFF.md capturing goal, state, files, failed attempts and next steps so a fresh agent session can continue exactly where this one stopped.
nexu-io/open-design
Push the run's accepted artifact to a downstream collaboration surface (cli, other code agents, cloud, desktop) and stamp the artifact manifest with the export target.
alirezarezvani/claude-skills
Compact the current conversation into a handoff document for another agent to pick up.
alirezarezvani/claude-skills
Compact the current conversation into a handoff document for another agent to pick up.
codewhale-hq/Codewhale
Writes a compact handoff note from real git and CI state so the next session or a teammate can pick up the work without rebuilding the context.
sickn33/agentic-awesome-skills
A skill your agent uses when context approaches capacity, before /clear or /compact, when switching tasks, or when ending a coding session: produces a structured handoff artifact for the next session.
Ovid/paad
A skill your agent uses when reviewing current branch for bugs before pushing or merging, when wanting a thorough multi-agent review of local changes, or when preparing work for human review.
Ovid/paad
EXPERIMENTAL. An agent skill from Ovid/paad.
Ovid/paad
A skill your agent uses when verifying that requirements/specs/PRDs and their implementation plans match — before starting work, after a spec or plan update, or when suspecting coverage gaps, scope…
Ovid/paad
EXPERIMENTAL. An agent skill from Ovid/paad.
Ovid/paad
A skill your agent uses when creating or updating a Makefile for a project, especially when standard targets (build, test, lint, format, etc.) are missing or when modifying targets that may already…
Ovid/paad
EXPERIMENTAL. An agent skill from Ovid/paad.
EXPERIMENTAL. An agent skill from Ovid/paad. Handoff is an agent skill from Ovid/paad. EXPERIMENTAL.
Handoff fits situations like: A session is running out of context and the work needs to continue in a fresh one; starting a session meant to pick up where an earlier one stopped.
Run `npx skills add Ovid/paad --skill handoff -a claude-code`. Or copy the skill folder (plugins/paad/skills/handoff in Ovid/paad) into .claude/skills/handoff in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Ovid/paad --skill handoff -a codex`. Or copy the skill folder (plugins/paad/skills/handoff in Ovid/paad) into .agents/skills/handoff in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ovid/paad --skill handoff -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/handoff, .gemini/skills/handoff, .github/skills/handoff and .opencode/skills/handoff in your project.
Going by SKILL.md and its folder, Handoff needs the command-line tools its instructions call (git and bash).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Handoff is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Handoff: Session Handoff Document (thedotmack/claude-mem, 98k stars), Handoff (nexu-io/open-design, 100k stars), Handoff (alirezarezvani/claude-skills, 28k stars) and Handoff (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Ovid (a GitHub user) maintains it in Ovid/paad, which has 131 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on October 7, 2026.
Source: Ovid/paad on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.