/handoff — Express Session Handoff
Generate a passoff package so the next reader can pick up cleanly. Two audiences:
- Next-session handoff (default +
auto) — For future-you in a new session (typically when context is high and you need to restart). Synthesizes the session, applies PROGRESS.md / CLAUDE.md / memory updates, commits, runs/extract, and emits a paste-ready next-session opener as the headline artifact. - Coworker brief (
brief) — For another person. Produces a copy/paste prose block (Slack/email-ready) summarizing the session. Does NOT update PROGRESS/CLAUDE/memory, does NOT commit, does NOT run /extract. Output-only — paste it and you're done.
For "I'm done, close it out cleanly" with no passoff intent, use /wrapup instead.
Four modes:
- Default (
/handoff) — Generate ALL drafts (session summary, PROGRESS entry, CLAUDE.md edits, memory updates, commit message, next-session prompt) into one scroll, ask once for combined-go, then apply atomically. Per-item edits allowed. auto(/handoff auto) — Implicit-yes on all gates. Run silently. Apply all drafts without confirmation. Emit final report only. Use when the session is short and unambiguous.brief(/handoff brief) — Generate a coworker-facing prose brief (80-150 words, copy/paste-ready). Skips PROGRESS/CLAUDE/memory/commit/extract entirely. Emits the brief as the only artifact.snap(/handoff snap) — Likeauto(silent, apply all drafts, emit the next-session opener), but archives the raw transcript via/snapshotfor later extraction instead of running/extractnow. Use when context is high: you still get the full handoff package + opener + commit, but defer the expensive, compaction-risky knowledge synthesis to a later session (or the next/audit-knowledgedigest pass, which reads the snapshot automatically).
The next-session opener is the headline artifact in default + auto + snap modes — always produced, even when no other surface changed. That is what distinguishes /handoff from /wrapup. Brief mode is a different shape — handoff to a person, not to a session.
snap is auto plus one swap. snap follows auto's behavior exactly (silent, implicit-yes, apply all drafts, emit the opener) — wherever a step below applies to auto, it applies identically to snap. The single difference is the capture step (Step 6): snap runs /snapshot (archive the transcript for later) while auto runs /extract (synthesize now). Nothing else differs. (snap is NOT brief — it produces the full next-session package, not a coworker prose block.)
Runtime Gate (per ADR-094)
Canonical resolution: This is the Claude Code variant. When both plugin-claude-code and plugin-claude-cowork are loaded in the same session (most common in Claude Desktop), bare /handoff resolves to this skill — aria-knowledge (Code) is the canonical owner of all 24 dual-port skills per ADR-094 §Part 1. The Cowork variant is namespaced-only: /aria-cowork:handoff.
Before Step 0: Check that the Bash tool is available in this session. If Bash is NOT available (you are running in Claude Cowork or another non-Code runtime), surface the following notification and wait for explicit user confirmation:
⚠️ Runtime mismatch — you invoked aria-knowledge's /handoff from a non-Code runtime.
This variant runsgit status/git commitvia Bash, which isn't available here. The runtime-appropriate variant is/aria-cowork:handoff, which emits a copy-paste commit message instead.
Use/aria-cowork:handoffinstead? (y/n)
Wait for an explicit reply:
y/yes— Use theSkilltool to invokearia-cowork:handoffwith the same arguments the user provided to this invocation (e.g., if invoked as/handoff auto, invoke the cowork variant withargs: "auto"). Do not proceed with this skill's steps; the cowork variant takes over and runs to completion. This is the default-yes path — auto-redirect is the helpful action.n/no— Proceed with this (aria-knowledge) variant anyway despite the runtime mismatch. The user has explicitly opted in; subsequent Bash failures are expected.- No response / any other reply — Treat as "do not proceed" and exit cleanly without running either variant.
This gate applies even when mode = auto or mode = snap per ADR-094 §Part 3. Auto/snap's "implicit-yes on all gates" rule is suspended for the runtime-mismatch check — they trust that the user invoked the correct variant, and this gate enforces that precondition. All other auto/snap-mode gates remain bypassed. The friction cost is now low: on y, the auto-redirect runs the correct variant with the original args; the user loses ~1 keystroke vs. fully silent auto. (snap especially depends on Bash — its /snapshot capture step runs save-transcript.sh — so the gate is load-bearing for snap.)
If Bash is available, proceed to Step 0.
Step 0: Resolve Config and Parse Mode
Read ~/.claude/aria-knowledge.local.md and extract knowledge_folder. If missing, stop: "aria-knowledge is not configured. Run /setup to get started."
Parse the argument:
- No arg, or arg is empty →
mode = combined-go(default) - Arg matches
auto(case-insensitive) →mode = auto - Arg matches
brief(case-insensitive) →mode = brief - Arg matches
snap(case-insensitive) →mode = snap - Any other arg → stop: "Unknown argument '{arg}'. Use '/handoff', '/handoff auto', '/handoff brief', or '/handoff snap'."
Use {knowledge_folder} as the base path for all file operations.
Step 1: Identify Project Context
Same logic as /wrapup Step 1 — detect:
- Project root — directory containing PROGRESS.md and/or CLAUDE.md (search upward from cwd)
- PROGRESS.md path — if exists
- CLAUDE.md path(s) — root + relevant subfolder
- Memory files — any
project_*.mdfiles in~/.claude/projects/matching the current path - Git repos — run
git statusin each git repository within the project to detect uncommitted changes
Additionally, determine the project marker for the next-session opener (Step 9):
- Match the working directory against the project codes documented in the user's root CLAUDE.md (e.g.,
cs,ss,df,kn,ar,jpif those conventions exist). - If no SessionStart-hook project-code convention is detected, use the project's folder name as the marker.
- If no project is identifiable, use the literal
[no-project]— the opener will still work, just without auto-routing.
If no PROGRESS.md or CLAUDE.md is found, note this — proceed with the steps that apply.
Step 2: Synthesize Session Work (silent)
Build the session synthesis internally — do NOT print it yet:
- Files changed — list files created/modified/deleted during this session (from conversation context, not git)
- Key decisions — architectural choices, approach selections
- Current state — what's working, in-progress, blocked
- Next steps — what the user indicated should happen next, or what logically follows
- Open threads — anything explicitly deferred or flagged for later
This synthesis feeds every subsequent step.
Mode branch: If mode = brief, jump to Step 2B (Brief Output) and stop there. Skip Steps 3-8 entirely. Otherwise continue to Step 3.
Step 2B: Brief Output (brief mode only)
Skip this step entirely if mode != brief.
Brief mode produces a single copy/paste artifact — a coworker-facing prose brief. No PROGRESS update, no CLAUDE.md edit, no memory write, no commit, no /extract call. Just the prose, formatted for paste into Slack / email / chat.
2B.1: Build the brief from Step 2 synthesis
Compose an 80-150 word prose block following this template (cap at 200 words). Fill placeholders from the Step 2 synthesis; if a section has no relevant content for this session, omit the section line entirely (don't leave empty bullets).
Hey [coworker] —
Quick brief on