handoff
Skill15 starsChanged 15 days agoApache-2.0View on GitHub
Generate a structured cold-agent handoff brief (YAML frontmatter + Obsidian markdown + YON blocks) that any fresh LLM session can pick up and execute. Trigger when the user runs /handoff or says "create a handoff", "dispatch to a fresh agent", "hand this to a cold session", "switch to a new session", "I have N tasks for cold agents", "package this for another agent". Use /orchestrate-mode instead when you want to keep the *current* session as coordinator (no artifact produced).
191 other projects use a version of this.
Adopted by
Most recently taken up by
- xiaoxiaosrm/dsh-mattpocock-skillstheir own version, first seen Nov 8, 2026
- ethosagent/ethostheir own version, first seen Nov 8, 2026
- dsifry/metaswarmtheir own version, first seen Nov 8, 2026
- glebis/claude-skillstheir own version, first seen Nov 8, 2026
- domengabrovsek/agent-configtheir own version, first seen Nov 8, 2026
- domengabrovsek/claudetheir own version, first seen Nov 8, 2026
Used with
Projects with it also use decision-mapping, setup-ts-deep-modules and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
FabienDehopreSkilldecision-mapping
Turn a loose idea into a sequenced map of investigation tickets, then drive them to resolution one at a time.
Also in 8 projects that use this
liufeng1976Skillsetup-ts-deep-modules
Wire dependency-cruiser into a TypeScript repo so each package is a deep module — implementation hidden in subfolders, reachable only through its entry-point files. User-invoked.
Also in 42 projects that use this
AWSSkillto-questionnaire
Turn a decision you can't fully answer into a questionnaire for someone else to fill in.
Also in 93 projects that use this
GoogleSkillask-matt
Ask which skill or flow fits your situation. A router over the skills in this repo.
Also in 87 projects that use this
RoentekSkillloop-me
Grill me about specs for the workflows I want to build, within this workspace.
Also in 51 projects that use this
LesaniSkillwriting-beats
Shape an article as a journey of beats, choose-your-own-adventure style. The user picks a starting beat from the raw material, you write only that beat, then offer options for where to pivot next, beat by beat, until the article reaches a natural end. Use when the user has raw material and wants to assemble it as a narrative rather than an argument.
Also in 54 projects that use this
Other versions191 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 191
- mattpocock/skills★ 309ksame name
- QuivrHQ/quivr★ 40ksame name
- The-Vibe-Company/quivr★ 40ksame name
- GreyDGL/PentestGPT★ 16ksame name
- ykdojo/claude-code-tips★ 10ksame name
- ArcReel/ArcReel★ 6.3ksame name
- vinvcn/mattpocock-skills-zh-CN★ 5.5ksame name
- withcoral/coral★ 4.9ksame name
- epicenter-md/epicenter★ 4.8ksame name
- EpicenterHQ/epicenter★ 4.8ksame name
181 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository95 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- llms.txtllms.txt
- agent-mailboxSkill
- agent-outputSkill
- ask-gateSkill
- ask-meSkill
- audit-coupled-constantSkill
- budget-checkSkill
- build-prototypeSkill
- caller-optionsSkill
- cold-reviewSkill
- debug-taskSkill
- define-termsSkill
- defuddleSkill
- design-an-interfaceSkill
- diff-recapSkill
- directives-auditSkill
- domain-checkSkill
- double-checkSkill
- extract-signalSkill
- freshness-contractSkill
- github-syncSkill
- handoff-executeSkill
- headless-claudeSkill
- headless-codexSkill
- headless-geminiSkill
- headless-grokSkill
- headless-modelsSkill
- headless-update-modelsSkill
- headless-usageSkill
- human-drawSkill
- human-mergeSkill
- human-outputSkill
- human-rewriteSkill
- implement-taskSkill
- improve-codebase-architectureSkill
- insight-adversarialSkill
- insight-anglesSkill
- insight-assessSkill
- insight-critiqueSkill
- insight-cross-examineSkill
- insight-exploreSkill
- insight-premortemSkill
- insight-reference-classSkill
- insight-retroSkill
- insight-root-causeSkill
- insight-skill-gapSkill
- insight-test-assumptionSkill
- insight-value-of-informationSkill
- investigateSkill
- json-canvasSkill
- map-checkSkill
- map-initSkill
- map-maintainSkill
- map-rulesSkill
- map-thisSkill
- monorepo-depsSkill
- multi-agent-modeSkill
- next-skillsSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 7 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 172 edited versions we read keep these.
7
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 66
Ask the user: "What kind of handoff?"
- Distinctive: line 178
Every brief has YAML frontmatter conforming to vault schema:
- Distinctive: line 239
ALWAYS use absolute paths in target file references.
- Distinctive: line 240
ALWAYS check for verifiable acceptance.
- Very specific: line 241
ALWAYS mkdir -p before writing the brief file.
- Very specific: line 242
ALWAYS use wikilinks [[file]] for in-vault references.
- Distinctive: line 243
NEVER prescribe runtime-specific skill or tool names in the brief body (the cold agent may be Claude Code, Codex, or another LLM).
- Distinctive: line 244
NEVER write a brief that's smaller than the field schema requires — push back on under-specified tasks instead.
- Distinctive: line 245
NEVER assume the user wants chat-only output — file is canonical.
“Common” is measured: kept by at least 6 in 10 of the 172 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/handoff
Generates a structured handoff brief: YAML frontmatter (Obsidian-readable, vault-schema-compliant) + Obsidian-flavored markdown body containing YON-tagged structured blocks. The brief is the work item a fresh agent in a new session can pick up and execute autonomously.
Structured execution spec:
protocol.yon. It carries the workflow steps, the verify and sources gates, and the rules as validatable records; this file is the explanation. Keep the two in sync — edit one, update the other and refresh the@STAMPdate.
When to use
- UC1 — Dispatch a self-contained task to a fresh agent (
agentprofile) - UC4 — Dispatch a multi-step task that needs to be split into parallel sub-tasks (
orchestratorprofile) - UC3 — Switch the current session to a fresh one carrying in-flight state (
new-sessionprofile)
For UC2 (turn the current session into pure orchestrator mode), use /orchestrate-mode instead — that's a behavior switch, not a handoff artifact.
Output
Each handoff produces:
- A vault file (canonical) at
$VAULT/Handoffs/{project}/{YYYY-MM-DD}-{slug}.md(set$VAULTto your Obsidian vault root) - A chat surface (paste-convenience): full block if file < 500 lines; otherwise summary (first 30 lines) +
📄 Full brief: <path>
For multi-handoff (count=N): N files + a numbered index in chat (no per-brief content in chat).
The cold agent writes its retro to Handoffs/{project}/retros/{YYYY-MM-DD}-{slug}-retro.md (canonical file) AND emits it as a chat block (paste-back surface). Bidirectional brief↔retro linking is automatic via Obsidian's wikilink graph.
Workflow
1. Determine invocation path
| Path | Trigger | Behavior |
| 1. One-shot complete | /handoff agent task="..." where="..." evidence="..." acceptance="..." verify="..." | Parse, validate required fields present, write file, emit chat surface. |
| 2. One-shot partial | /handoff agent task="..." (missing required) | Parse, identify gaps, ask ONLY for missing required, then write. |
| 3. Interactive | /handoff (no args) | Full Q&A from "What kind?" through all required. |
| 4. Multi one-shot | /handoff count=3 | Each of N briefs runs independent profile-selection + Q&A. Emits N files + numbered index in chat. |
| 5. Multi interactive | /handoff then "I have 3 tasks" | Detect intent, ask "How many?", then run Path 3 N times independently. |
| 6. Orchestrator subtasks | orchestrator profile selected | If subtasks field unspecified → LLM auto-decomposes, surfaces for review. If specified → LLM validates 5 checks; pass = proceed; fail = findings + auto-/insight-assess. |
2. Profile selection (interactive)
Ask the user: "What kind of handoff?"
- "Dispatch a task to a fresh agent" →
agentprofile (UC1) — loadprofiles/agent.md - "Dispatch a task that needs to be split into sub-tasks" →
orchestratorprofile (UC4) — loadprofiles/orchestrator.md - "Continue this session in a new session" →
new-sessionprofile (UC3) — loadprofiles/new-session.md
Auto-suggest orchestrator if user describes a multi-step / parallelizable task, but default to agent (smaller blast radius).
3. Field collection
Required for all profiles:
task— one-paragraph description (max 1000 chars)where— absolute paths in scopeevidence— pointer to error/commit/file/line that prompted thisacceptance— acceptance sentenceverify— verifiable shell commands. Required unless profile=new-session and the continuation has no single-shot acceptance. Preserve known applicable checks; agent and orchestrator dispatch always require measurable acceptance.sources_required— file paths or wikilinks the cold agent MUST read before planning. Asked interactively as: "Which sources MUST the cold agent read before planning? (file paths or wikilinks, comma-separated.)" If the user supplies a non-empty list → write to@SOURCES.required, brief executes in gated mode. If the user supplies an empty list → push back with: "You haven't named any required sources. Either name what the cold agent must read before planning, OR explicitly confirm 'no sources required' — the brief will run in advisory mode with a prominent warning, and the cold agent will not gate on source ingestion. Confirm 'no sources required' to proceed." Default is to re-prompt for sources. Only after explicit confirmation does the brief write with empty@SOURCES.requiredandconfirmed_empty:bool=truein the same block. Never infer this confirmation from an empty list. Writes to the brief's@SOURCES.requiredblock (seehandoff-execute/references/SOURCES-BLOCK.md).
Optional with defaults:
sources_optional— additional sources surfaced for on-demand reading mid-execution. Asked as: "Any additional sources to surface as optional reading? (Empty = none.)" Writes to@SOURCES.optional.forbidden_actions— preservation guardstime-budget-min— wall-clock cap (default: 60)output_location— vault path override
For new-session profile, auto-collect from current session state instead of asking — see profiles/new-session.md.
The same profile provides compact continuation. Its verify field may be empty when no single-shot acceptance applies; retain known checks and name remaining verification. Mandatory acceptance commands continue for agent and orchestrator dispatch.
4. Project detection
project=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unsorted")Local folder name. Works on detached repos. Falls back to unsorted if not in a git repo.
5. Slug generation
slug=$(echo "$task" | head -c 200 | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/^-\|-$//g' | head -c 40)Lowercase-kebab from task description, max 40 chars.
6. Write file
Inspect the destination leaf and every existing ancestor without following links; refuse symlinks, junctions, mounts, unknown reparse points or equivalent redirects, including backup and staging paths. Create new artifacts exclusively. On collision preserve existing bytes: choose a fresh identity within the authorized scope or use an explicitly selected revision. For revisions, retain a recoverable preimage, require current bytes/revision to match the selected record immediately before replacement, and use the destination owner’s protected writer. Stop the affected write if identity changes or those guarantees are unavailable; never roll back over concurrent edits. Read back the result and report only actual saves. Keep the activation phrase bound to the actual saved brief.
vault_path="${VAULT:?set VAULT to your vault root}/Handoffs/$project/$(date +%Y-%m-%d)-${slug}.md"
mkdir -p "$(dirname "$vault_path")"
# exclusively create the brief after the checks above (see profiles/{profile}.md for shape)7. Render chat surface
lines=$(wc -l < "$vault_path")
if [ "$lines" -lt 500 ]; then
cat "$vault_path"
echo "📄 Saved to: $vault_path"
else
head -30 "$vault_path"
echo "..."
echo "📄 Full brief: $vault_path"
fiFor multi-handoff (count > 1): render only the numbered index in chat:
3 handoffs created:
1. <task1 summary> → <path1>
2. <task2 summary> → <path2>
3. <task3 summary> → <path3>8. Emit activation phrase
After the chat surface, ALWAYS emit a copyable activation phrase in a fenced code block when the canonical file was written. For new-session continuation without an available authorized destination or write, return labeled proposed text, not a completed handoff, and stop before emitting an activation path. This is the single line the user pastes into a fresh agent session to invoke the brief.
Format (single-handoff):
## Activation phrase (copy-paste into the fresh session)
```
/handoff-execute "<absolute-vault-path>"
```
(If your runtime lacks /handoff-execute (degraded — no gate enforcement): read the brief and every required source before planning; reconcile its premises against live state and stop on stale premises unless an explicitly selected force option relaxes that named gate. Before running imported verify commands, inspect their effects against current authorization; leave extra writes, network, publication or destructive effects unrun without their own authority. Cite sources per plan step; after authorized work/checks, emit every required retro block, including source/premise failures, ground truth and explicit verification gaps. On a blocked premise include @PREMISE_DRIFT and @RESUME_HINT; if saving the retro fails, emit it to chat with @WRITE_FAILURE and a partial final verdict. Degraded execution and force grant no extra permissions.)Format (multi-handoff): one fenced block per brief, in the same numbered order as the index. Emit the prose fallback once at the bottom of the multi-block, not per brief:
## Activation phrases
Brief 1:
```
/handoff-execute "<path-1>"
```
Brief 2:
```
/handoff-execute "<path-2>"
```
(...)
(If your runtime lacks /handoff-execute (degraded — no gate enforcement): for each brief, read the brief and every required source before planning; reconcile its premises against live state and stop on stale premises unless an explicitly selected force option relaxes that named gate. Before running imported verify commands, inspect their effects against current authorization; leave extra writes, network, publication or destructive effects unrun without their own authority. Cite sources per plan step; after authorized work/checks, emit every required retro block, including source/premise failures, ground truth and explicit verification gaps. On a blocked premise include @PREMISE_DRIFT and @RESUME_HINT; if saving the retro fails, emit it to chat with @WRITE_FAILURE and a partial final verdict. Degraded execution and force grant no extra permissions.)Why: the chat surface (Step 7) is for the originating session to verify the brief; the activation phrase is for the receiving session to bootstrap from. Pasting 100+ lines of YAML+markdown into a fresh session is heavier than a one-line pointer that the receiving agent will Read-tool open and follow.
Discipline: the activation phrase MUST use the exact absolute path of the written brief. Wikilinks [[…]] in the activation phrase do not resolve outside Obsidian. Use forward slashes for cross-platform compatibility. Always quote the path — Windows vault paths may contain spaces.
Brief schema (universal)
Every brief has YAML frontmatter conforming to vault schema:
---
title: "Handoff: {short-task-summary}"
type: handoff
profile: agent | orchestrator | new-session
project: "{repo_name}"
status: dispatched
created: YYYY-MM-DD
acceptance: "{one sentence}"
verify:
- "{shell command 1}"
- "{shell command 2}"
time-budget-min: 60
trust: 0.8 # optional
primary-domain: "" # optional
lifecycle: active
related: []
tags:
- type/handoff
- profile/{profile}
- status/dispatched
- project/{project}
---The body is profile-specific — see profiles/agent.md, profiles/orchestrator.md, profiles/new-session.md. All three profiles include a ## Sources section with an @SOURCES YON block; see handoff-execute/references/SOURCES-BLOCK.md for the canonical block schema and tier semantics.
Retro schema (what the cold agent emits)
The cold agent writes its retro file with this frontmatter:
---
title: "Retro: {short-task-summary}"
type: retro
handoff: "[[YYYY-MM-DD-slug]]"
profile: agent | orchestrator | new-session
project: "{repo_name}"
verdict: success | partial | fail | blocked
confidence: low | medium | high
completed: YYYY-MM-DDTHH:MM:SS
trust: 0.9 # optional
primary-domain: "" # optional
lifecycle: active
related: []
tags:
- type/retro
- verdict/{verdict}
- profile/{profile}
- project/{project}
---The retro body MUST include YON blocks for: @OUTCOME_DELIVERED, @GROUND_TRUTH (with artifacts_modified paths+hashes and git_diff_summary), @GATE_STATUS (per-clause verified|unverified|failed + gate-suite outcome), @DELTA_FROM_BRIEF, @RECOMMENDATIONS, @VERDICT. Narrative-only retros are rejected. For real task changes, paths, hashes and diff evidence remain required. If zero task changes are evidenced, use artifacts_modified="none" with the supporting observation; the retro file itself is not a task change. git_diff_summary records the actual scoped comparison or why it was unavailable, distinguishing pre-existing changes. Unknown mutation state must be reported as unknown with a blocked task outcome, never converted to "none"; a failed retro write still requires the existing partial final verdict. This branch preserves every mandatory block and any source/premise failures and resume hint.
The brief sign-off section instructs the cold agent on this, and points back to the originating session for /insight-critique (or any LLM-agnostic equivalent).
Rules
- ALWAYS use absolute paths in target file references.
- ALWAYS check for verifiable acceptance. Push back if it is absent, except for new-session continuation with no single-shot acceptance. This exception waives no other field, source gate or retro obligation.
- ALWAYS
mkdir -pbefore writing the brief file. - ALWAYS use wikilinks
[[file]]for in-vault references; absolute paths for code-repo references. - NEVER prescribe runtime-specific skill or tool names in the brief body (the cold agent may be Claude Code, Codex, or another LLM). Describe outcomes, not procedures. Where a step is genuinely runtime-specific, tag it explicitly (e.g. '(Claude Code only)').
- NEVER write a brief that's smaller than the field schema requires — push back on under-specified tasks instead.
- NEVER assume the user wants chat-only output — file is canonical.
Anti-patterns
- "I'll figure out the right place" — name the file path explicitly
- "Make sure not to break anything" — replace with
forbidden_actionslist - "Run /verify after" — skill availability and invocation permissions depend on the receiving runtime;
disable-model-invocationdoes not mean the skill cannot be installed elsewhere or explicitly invoked. Use outcome-based briefs (verifiable shell commands inverify:), and do not assume a skill name grants permission to invoke it. - "Use the Agent tool with isolation: worktree" — that's a Claude-Code-specific spawning mechanism; Codex and other runtimes have different (or no) equivalents. Describe the behavior you want ('spawn a fresh isolated agent session', 'run in a clean worktree') in runtime-agnostic prose, and let the cold agent's runtime supply the mechanism. If a step truly only works on one runtime, tag it (e.g. '(Claude Code only)').
- Skipping
@SOURCES.requiredbecause "the brief is small" — if it's worth a handoff, it has critical context. Declare what the cold agent must read; let the gate work for you. Only explicit no-required-sources confirmation plusconfirmed_empty:bool=truepermits advisory source ingestion; an empty list alone remains unresolved.
Companion skills
/handoff-execute— the receiving-side executor. Consumes the brief this skill produces, gates on@SOURCES.required, runs verify commands, writes the retro to the canonical vault path.
Source ingestion follows the receiving contract: nonempty @SOURCES.required is gated; an empty list with explicit confirmed_empty:bool=true is advisory with a warning, while the premise gate remains. Empty or missing required in a present block without confirmation is unresolved and blocks by default; explicit --force may proceed degraded but never supplies confirmation. Without @SOURCES, legacy @SCOPE.must_read takes precedence, then real required-read headings with enumerable paths or wikilinks; fenced or quoted examples do not count. Only when no such required tier exists are legacy reads advisory. The receiver's existing premise and --force rules remain in force.
Inspirations
/plan-create— phased structure/plan-phases—/verify-style checkpoint pattern/insight-critique— second-assessment workflow (or any LLM equivalent reading frontmatter + body)/insight-retro— informed the retro shape; handoff retro is stricter (mandatory ground-truth fields)- The host vault's note frontmatter schema (where present) — the brief frontmatter conforms to it
Human output. This skill's handler-facing output obeys the human-output contract (
human-output/SKILL.md).
Next skills. On completion, if
next-skillsis available, run its protocol to offer the canonical frontmatter successors. Never auto-invoke them. If unavailable, finish normally without recommendations.
Self-improvement. On completion, run the Self-Improvement Protocol (
self-improve/SKILL.md): apply its signal taxonomy and threshold to this run; surface any surviving proposal for handler approval. Conservative — silent otherwise. Never auto-apply.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

