session-handoff
Use to hand in-flight work across profiles or machines where --resume cannot reach.
Skill by Exploitacious
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/exploitacious-session-handoff
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: writing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/session-handoff
What's inside
- Skill name
session-handoff- Description
- Use to hand in-flight work across profiles or machines where --resume cannot reach. Write: hand off, leave a baton. Read: resume handoff, what was I doing.
- License
- MIT
- Instructions
- 53 lines in SKILL.md · view on GitHub
Files (2)
- SKILL.md
- mechanics.md
SKILL.md (first lines)
# Session handoff
You pass the baton between sessions that native `--resume` cannot bridge. Resume and chat history are per config dir: a session on a second profile (a different `CLAUDE_CONFIG_DIR`, e.g. `~/.claude-personal`) cannot resume a conversation from the default `~/.claude` profile, and neither crosses machines. A baton file in the shared OPS filesystem does, because both profiles and every synced machine see it once it is committed and pushed.
Batons are keyed by project so parallel sessions on different projects never surface or clobber each other's handoffs. One pending baton per project, at `~/OPS/.claude-handoffs/pending/<project-key>.md`. Compute the key with the shared helper, never by hand, so the write, the read, and the notifier always agree:
```bash
bash ~/OPS/.claude-handoffs/key.sh
```
The paths, the frontmatter fields, the baton template, the NTFS colon rule, and the legacy path all live in `mechanics.md`. Read it before you write or archive a baton.
## Two modes
Detect the mode from the user's phrasing, and from whether a pending baton already exists for this project.
## Write, leaving a session
A handoff write is a superset of pre-compact synthesis: the next session must resume cold from files alone. Do the full discipline, then write the portable baton.
1. Run the four-artifact synthesis. Reuse the `pre-compact-synthesis` skill's discipline, do not duplicate it: git committed and pushed (never to main without authorization), durable lessons saved and the `.claude-memory/` mirror pushed, tasks marked done or pruned. If something is dirty and needs a decision, surface it. Never write a baton that claims clean state when it is not.
2. Gather the frontmatter fields and, if the work lives in a project with its own `SESSION_HANDOFF.md`, update that file too and point to it. `mechanics.md` lists every field and how to derive it.
3. Write `pending/<project-key>.md` from the template in `mechanics.md`. Clobber guard: if a pending baton already exists for this same key, the previous handoff was never picked up. Tell the user and ask whether to archive the old one first or abort. Never silently clobber it. A baton for a different key is unrelated, leave it alone.
4. Commit and push the baton to the OPS repo with `chore(handoff): <goal>`. It crosses machines only once it lands on the remote. This is additive sync, the same exception the memory mirror uses, under the same rule: push only when `~/OPS/.claude-config/bin/origin-private-check ~/OPS` exits 0 with its `private` verdict; otherwise keep the commit local and tell the Operator why. The git-guard hook enforces this on every agent push of the OPS copy.
5. Confirm in one screen: the baton path, what it captures, and that the next session in this project on either profile will see the SessionStart banner. Say plainly that sessions in other projects will not, since that is the point.
## Read, arriving in a session
1. Read this project's baton. Compute the key and read `pending/<key>.md`. If none is pending, check the legacy path per `mechanics.md`. If still nothing, say so: nothing to resume for this project.
2. Re-ground in OPS global doctrine. `CONTEXT/core.md` is always loaded, but a resuming session usually jumped straight to "resume handoff" and skipped the normal startup, so the on-demand standing layer is not in context. Before acting on project work, sync OPS (`git -C ~/OPS pull --ff-only`) and read `CONTEXT/how-i-work.md` (the 15 principles, especially P14 falsifiable conclusions and P15 classify-by-altitude) and `CONTEXT/standing-orders.md`, and `USER.md` and `voice.md` if not already in context. The baton carries project context; doctrine is the standing layer the baton assumes. Never resume project work without it.
3. Note the crossing. If `written_by` differs from the current profile, say it ("resuming a DEFAULT baton on a SECOND profile") and flag that profile-specific MCP connectors may not be available when resuming tooling on the other profile.
4. Load the referenced context. Open the files in the baton's reading order, check git state of the named repo, and confirm HEAD matches `git_head`; if it moved, someone committed since, so reconcile before acting.
5. Summarize in one screen: the goal, where it was left, the proposed next action. Then ask whether to proceed or adjust.
6. Archive the baton only on an actual resume. Move it to `archive/<key>-<ts>.md` (colon-free `<ts>`, see `mechanics.md`), set `status: consumed`, record `consumed_by` and `consumed_at`, then commit with `chore(handoff): consume <goal>` and push under the same rule as Write step 4 (only when `origin-private-check` verifies origin private; the git-guard hook blocks it otherwise). This stops the banner re-firing. If the user only wants to look, leave the baton pending.
The RESUME PROTOCOL block in the baton is the contract. On pickup, verify before acting, act on the NEXT ACTION and DECIDED items, never touch DO NOT, and ask on ASK OPERATOR rather than guess.
## Anti-patterns
- Don't overstate readiness. If git is dirty or a decision is open, the baton says so. A false "all clean" wastes the next session's trust.
- Don't auto-load on arrival. The hook notifies; pickup is explicit. Never inject baton content into a session the user did not ask to resume.
- Don't clobber an unconsumed baton for the same project. One pending baton per project is one in-flight task. Archive the first deliberately before writing a second. Batons for other projects are never yours to touch.
- Don't write the legacy `ACTIVE_HANDOFF.md` path. Always `pending/<key>.md`. The single global baton was the bug that surfaced one project's handoff in every unrelated session.
- Don't push to main as housekeeping. The baton and memory commits to OPS are the additive-sync exception; project code is not.
- Don't leave a consumed baton pending. Archive on resume, or the banner cries wolf and the user learns to ignore it.
## Related pieces
- `pre-compact-synthesis` is the four-artifact discipline the write reuses. When the user is compacting and handing off at once, run the synthesis once and write the baton as the durable anchor.
- `handoff-check.sh` (`~/OPS/.claude-config/hooks/handoff-check.sh`, SessionStart) prints the banner only for a pending baton matching this project's key. Notify only.
- `key.sh` (`~/OPS/.claude-handoffs/key.sh`) is the single source of truth for the project key. Write, read, and notifier all call it so the filename never drifts.From Exploitacious/OPS, MIT.
More from Exploitacious/OPS
- 0.570score
memory-prune
Exploitacious
Use when the operator says prune, audit, or sweep memory, the memories are cluttered, or relocate a lesson.
SkillAFreshness: AClaude Code +9 - 0.570score
operating-model
Exploitacious
Use when shaping agent prose or making code changes: answer design, lazy-correct engineering, and the AI-tell editing catalog.
SkillAFreshness: AClaude Code +9 - 0.565score
grabit
Exploitacious
Use when the operator wants a real file off this headless box and onto their own machine: they say send me this, grab this, put it in my downloads, pull this…
SkillAFreshness: AClaude Code +9 - 0.565score
session-close
Exploitacious
Use when the Operator says close/shut down/end this session for good, or close out for the day.
SkillAFreshness: AClaude Code +9 - 0.565score
harness-update
Exploitacious
Use when the Operator says update the harness, sync from the template, or pull upstream OPS changes.
SkillAFreshness: AClaude Code +9 - 0.565score
grabit-screenshots
Exploitacious
Use when the operator says they pushed something to this box for you to look at: look at my screenshot, check the image I sent, I just sent you a diagram or…
SkillAFreshness: AClaude Code +9 - 0.565score
remote-session
Exploitacious
Use to start, attach, list, park, revive, or end a one-off Claude Code session in tmux that the operator remote-controls from another device (the claude.ai…
SkillAFreshness: AClaude Code +9 - 0.561score
pre-compact-synthesis
Exploitacious
Synthesize durable state before a /compact, then closeout.
SkillAFreshness: AClaude Code +9 - 0.561score
design-method
Exploitacious
Apply when designing or building any UI, web page, landing page, component, or email template.
SkillAFreshness: AClaude Code +9 - 0.561score
stewardship
Exploitacious
Apply when an MCP tool or a skill returns errors, wrong data, or instructions that do not match reality.
SkillAFreshness: AClaude Code +9 - 0.559score
operator-voice
Exploitacious
Use when writing anything in the operator's voice or for their readers: emails, client deliverables, marketing copy, chat posts, anything sent on their behalf.
SkillAFreshness: AClaude Code +9 - 0.519score
projects-map
Exploitacious
Use when working in a specific project repo, deciding which repo a request belongs to, routing by keyword, or scaffolding a new project.
SkillBFreshness: BClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 19, 2026 (10 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/Exploitacious/OPS
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Exploitacious
- 0.570score
memory-prune
Exploitacious
Use when the operator says prune, audit, or sweep memory, the memories are cluttered, or relocate a lesson.
SkillAFreshness: AClaude Code +9 - 0.570score
operating-model
Exploitacious
Use when shaping agent prose or making code changes: answer design, lazy-correct engineering, and the AI-tell editing catalog.
SkillAFreshness: AClaude Code +9 - 0.565score
grabit
Exploitacious
Use when the operator wants a real file off this headless box and onto their own machine: they say send me this, grab this, put it in my downloads, pull this…
SkillAFreshness: AClaude Code +9 - 0.565score
harness-update
Exploitacious
Use when the Operator says update the harness, sync from the template, or pull upstream OPS changes.
SkillAFreshness: AClaude Code +9 - 0.565score
grabit-screenshots
Exploitacious
Use when the operator says they pushed something to this box for you to look at: look at my screenshot, check the image I sent, I just sent you a diagram or…
SkillAFreshness: AClaude Code +9 - 0.565score
remote-session
Exploitacious
Use to start, attach, list, park, revive, or end a one-off Claude Code session in tmux that the operator remote-controls from another device (the claude.ai…
SkillAFreshness: AClaude Code +9
Cite this page
session-handoff skill. Agent Mart. https://agentmart.dev/skills/exploitacious-session-handoff (last updated 2026-10-24)