curl -L -o agent-handoff-playbook.skill "https://aiskillstore.io/v1/agent/skills/31f70f3d-557d-4916-910f-d4c00dee992c/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "31f70f3d-557d-4916-910f-d4c00dee992c",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
Playbook: write a session/agent handoff document the next agent can resume from instantly. Use when ending a session or passing work to another agent: structured HANDOFF.md (goal, state, decisions, failed attempts, verification, next 3 actions) plus an acceptance check. 세션 인수인계 문서(HANDOFF.md) 구조화·수락점검 플레이북.
Compatible Platforms any
✅ No security risks found.
AI Review Stage
스킬 메타데이터에 선언된 권한(네트워크, 파일 시스템, 서브프로세스 사용 안 함)과 코드의 실제 동작이 완벽하게 일치합니다. `main.py`와 `lib/common.py`는 표준 입출력(stdin/stdout)을 통해서만 데이터를 처리하며, `lib/common.py`의 독스트링에 명시된 대로 파일은 디스크에 쓰지 않고 `files` 배열 형태로 반환합니다. `lib/handoff.py`에 포함된 `_SECRET` 정규식은 인수인계 문서 내에 잠재적인 비밀 정보가 포함되어 있는지 스캔하는 기능으로, 이는 보안 취약점이 아니라 'placeholder_and_secret_scan' 기능에 해당하는 긍정적인 보안 검수 기능입니다. 코드 난독화나 악의적인 목적의 코드는 발견되지 않았으며, 사용자 데이터를 무단으로 수집하거나 외부로 전송하는 행위도 없습니다. 전반적인 코드 품질은 양호하며, 스킬의 목적에 부합하는 안전한 구현으로 판단됩니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
Complete fields produce a handoff that passes its own acceptance check; the failed attempt carries its evidence. (output abridged)
{
"action": "render",
"date": "2026-10-21",
"decisions": [
{
"decision": "Keep the sync wrapper for one release",
"why": "three downstream services still call invoice.create synchronously"
}
],
"definition_of_done": [
"pytest -q tests/billing exits 0",
"mypy billing/ exits 0"
],
"do_not_touch": [
"tests/billing/conftest.py"
],
"failed_attempts": [
{
"attempt": "Used asyncio.run inside refund()",
"evidence": "RuntimeError: asyncio.run() cannot be called from a running event loop",
"why_failed": "nested event loop error under pytest-asyncio"
}
],
"from_agent": "claude-session-14",
"goal": "Migrate billing/invoice.py from callbacks to async/await without changing the public API.",
"next_actions": [
{
"action": "Make `billing/refund.py::refund` a coroutine",
"verify": "pytest -q tests/billing/test_refund.py"
},
{
"action": "Update the call sites in docs/callers.md",
"verify": "git grep \u0027invoice.create(\u0027"
},
{
"action": "Remove the sync wrapper note from `CHANGELOG.md`",
"verify": "git diff CHANGELOG.md"
}
],
"open_questions": [
"Is a deprecation warning acceptable for the sync wrapper?"
],
"state": {
"branch": "feat/billing-async",
"build_status": "passing",
"commit": "3f9c2ab",
"dirty_files": [
"billing/refund.py"
],
"repo": "acme/shop",
"tests_status": "41 passed, 2 failing"
},
"title": "Handoff: billing async migration",
"verify_commands": [
{
"command": "pytest -q tests/billing",
"expected": "2 failures before the fix, 0 after"
}
]
}
{
"action": "render",
"files": [
{
"content": "# Handoff: billing async migration\n\nDate: 2026-10-21 | From: claude-session-14 -\u003e To: next agent\n\n## 1. Goal and definition of done\nMigrate billing/invoice.py from callbacks to async/await without changing the public API.\n\nDone when:\n- pytest -q tests/billing exits 0\n...",
"description": "The handoff document, six mandatory sections plus risks.",
"path": "HANDOFF.md"
},
{
"content": "# Acceptance check for the receiving agent\n\nRead HANDOFF.md only (no chat history, no other files). Answer without guessing:\n\n1. What is the goal and how will you know it is done?\n2. What is the first thing you will do? (a concrete file or command)\n3. How do you verify the current state in under a minute?\n4. What was already tried and must not be retried blindly?\n5. Which decisions are settled, and why?\n...",
"description": "Acceptance checklist the receiving agent answers from HANDOFF.md alone.",
"path": "HANDOFF-ACCEPTANCE.md"
}
],
"findings": [],
"lang": "en",
"playbook": "agent-handoff-playbook",
"version": "1.0.0"
}
The reader can state the first action, the first verification command and what not to retry from the document alone. (output abridged)
{
"action": "check",
"handoff": "# Handoff: billing async migration\n\nDate: 2026-10-21 | From: claude-session-14 -\u003e To: next agent\n\n## 1. Goal and definition of done\nMigrate billing/invoice.py from callbacks to async/await without changing the public API.\n\nDone when:\n- pytest -q tests/billing exits 0\n\n## 2. Current state\n- Repo: `acme/shop`\n- Branch: `feat/billing-async`\n- Commit: `3f9c2ab`\n- Tests: 41 passed, 2 failing (test_refund_partial, test_refund_idempotent)\n\n## 3. Decisions and why\n- Keep the sync wrapper for one release - because three downstream services still call invoice.create synchronously\n\n## 4. Failed attempts (do not retry blindly)\n- Used asyncio.run inside refund() -\u003e nested event loop error under pytest-asyncio\n\n## 5. Verification commands\n- `pytest -q tests/billing` -\u003e 2 failures before the fix, 0 after\n\n## 6. Next 3 actions\n1. Make `billing/refund.py::refund` a coroutine and await it from `invoice.py` (verify: pytest -q tests/billing/test_refund.py)\n2. Update the three call sites listed in docs/callers.md (verify: git grep \u0027invoice.create(\u0027)\n3. Delete the sync wrapper draft in `CHANGELOG.md` (verify: git diff CHANGELOG.md)\n"
}
{
"acceptance": {
"can_state_first_action": true,
"do_not_retry": [
"Used asyncio.run inside refund() -\u003e nested event loop error under pytest-asyncio"
],
"first_action": "Make `billing/refund.py::refund` a coroutine and await it from `invoice.py` (verify: pytest -q tests/billing/test_refund.py)",
"first_verification_command": "pytest -q tests/billing",
"questions": [
"What is the goal and how will you know it is done?",
"What is the first thing you will do? (a concrete file or command)",
"How do you verify the current state in under a minute?",
"What was already tried and must not be retried blindly?",
"Which decisions are settled, and why?"
]
},
"action": "check",
"findings": [],
"lang": "en",
"passed": true,
"playbook": "agent-handoff-playbook",
"score": 100,
"version": "1.0.0"
}
Placeholder text, missing sections and date, and a vague next action are all reported. (output abridged)
{
"action": "check",
"handoff": "# Handoff\n\n## Goal\nTODO\n\n## Next\n1. continue working\n"
}
{
"acceptance": {
"can_state_first_action": false,
"do_not_retry": [],
"first_action": "continue working",
"first_verification_command": null,
"questions": [
"What is the goal and how will you know it is done?",
"What is the first thing you will do? (a concrete file or command)",
"How do you verify the current state in under a minute?",
"What was already tried and must not be retried blindly?",
"Which decisions are settled, and why?"
]
},
"action": "check",
"findings": [
{
"code": "NO_DATE",
"message": "No date (YYYY-MM-DD) near the top: the next agent cannot judge how stale this is.",
"severity": "error"
},
{
"code": "NO_GIT_REF",
"message": "No commit hash or branch recorded: state cannot be tied to the code.",
"severity": "error"
},
{
"code": "PLACEHOLDER_LEFT",
"message": "Placeholder text left in: Goal and definition of done.",
"severity": "error",
"where": "goal"
},
{
"code": "MISSING_SECTION",
"message": "Missing section: Current state.",
"severity": "error",
"where": "state"
},
{
"code": "MISSING_SECTION",
"message": "Missing section: Decisions and why.",
"severity": "error",
"where": "decisions"
},
{
"code": "MISSING_SECTION",
"message": "Missing section: Failed attempts (do not retry blindly).",
"severity": "error",
"where": "failed"
},
{
"code": "MISSING_SECTION",
"message": "Missing section: Verification commands.",
"severity": "error",
"where": "verify"
},
{
"code": "FEWER_THAN_THREE",
"message": "Only 1 next action(s); give 3 unless the work is truly nearly done.",
"severity": "warning",
"where": "next"
},
{
"code": "ACTION_NOT_CONCRETE",
"message": "Next action 1 names no file, command or path: \u0027continue working\u0027.",
"severity": "warning",
"where": "next"
}
],
"lang": "en",
"passed": false,
"playbook": "agent-handoff-playbook",
"score": 0,
"version": "1.0.0"
}
Scaffold returns HANDOFF.md with placeholders to fill and HANDOFF-ACCEPTANCE.md for the receiving agent. (output abridged)
{
"action": "scaffold"
}
{
"action": "scaffold",
"files": [
{
"content": "# Handoff\n\nDate: \u003cfill in\u003e | From: \u003cfill in\u003e -\u003e To: next agent\n\n## 1. Goal and definition of done\n\u003cfill in\u003e\n\nDone when:\n- \u003cfill in\u003e\n...",
"description": "The handoff document, six mandatory sections plus risks.",
"path": "HANDOFF.md"
},
{
"content": "# Acceptance check for the receiving agent\n\nRead HANDOFF.md only (no chat history, no other files). Answer without guessing:\n\n1. What is the goal and how will you know it is done?\n2. What is the first thing you will do? (a concrete file or command)\n3. How do you verify the current state in under a minute?\n4. What was already tried and must not be retried blindly?\n5. Which decisions are settled, and why?\n...",
"description": "Acceptance checklist the receiving agent answers from HANDOFF.md alone.",
"path": "HANDOFF-ACCEPTANCE.md"
}
],
"lang": "en",
"next_steps": [
"Fill every \u003cplaceholder\u003e in HANDOFF.md.",
"Run the `check` action on the result."
],
"playbook": "agent-handoff-playbook",
"version": "1.0.0"
}
Render never leaves silent gaps: missing goal, definition of done and failed_attempts are reported and a placeholder is written. (output abridged)
{
"action": "render",
"date": "2026-10-21",
"next_actions": [
"Run `make test`"
],
"title": "Handoff"
}
{
"action": "render",
"files": [
{
"content": "# Handoff\n\nDate: 2026-10-21 | From: \u003cfill in\u003e -\u003e To: next agent\n\n## 1. Goal and definition of done\n\u003cfill in\u003e\n\nDone when:\n- \u003cfill in\u003e\n...",
"description": "The handoff document, six mandatory sections plus risks.",
"path": "HANDOFF.md"
},
{
"content": "# Acceptance check for the receiving agent\n\nRead HANDOFF.md only (no chat history, no other files). Answer without guessing:\n\n1. What is the goal and how will you know it is done?\n2. What is the first thing you will do? (a concrete file or command)\n3. How do you verify the current state in under a minute?\n4. What was already tried and must not be retried blindly?\n5. Which decisions are settled, and why?\n...",
"description": "Acceptance checklist the receiving agent answers from HANDOFF.md alone.",
"path": "HANDOFF-ACCEPTANCE.md"
}
],
"findings": [
{
"code": "MISSING_FIELD",
"message": "No goal provided; a placeholder was written.",
"severity": "warning",
"where": "goal"
},
{
"code": "MISSING_FIELD",
"message": "No definition_of_done; the next agent cannot tell when to stop.",
"severity": "warning",
"where": "definition_of_done"
},
{
"code": "MISSING_FIELD",
"message": "failed_attempts is required content: pass [] only if nothing was tried (a \u0027nothing tried\u0027 line is written).",
"severity": "warning",
"where": "failed_attempts"
},
{
"code": "MISSING_FIELD",
"message": "No verify_commands.",
"severity": "warning",
"where": "verify_commands"
},
{
"code": "NEXT_ACTIONS_COUNT",
"message": "next_actions has 1 item(s); exactly 3 is the standard.",
"severity": "warning",
"where": "next_actions"
}
],
"lang": "en",
"playbook": "agent-handoff-playbook",
"version": "1.0.0"
}
lang=ko returns the sections, rules and acceptance questions in Korean. (output abridged)
{
"action": "guide",
"lang": "ko"
}
{
"acceptance_questions": [
"\ubaa9\ud45c\ub294 \ubb34\uc5c7\uc774\uace0 \uc5b4\ub5bb\uac8c \ub05d\ub0ac\uc74c\uc744 \uc54c \uc218 \uc788\ub294\uac00?",
"\uac00\uc7a5 \uba3c\uc800 \ud560 \uc77c\uc740 \ubb34\uc5c7\uc778\uac00? (\uad6c\uccb4\uc801\uc778 \ud30c\uc77c\uc774\ub098 \uba85\ub839)",
"\ud604\uc7ac \uc0c1\ud0dc\ub97c 1\ubd84 \uc548\uc5d0 \uc5b4\ub5bb\uac8c \uac80\uc99d\ud558\ub294\uac00?",
"\uc774\ubbf8 \uc2dc\ub3c4\ud588\uace0 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc7ac\uc2dc\ub3c4\ud558\uba74 \uc548 \ub418\ub294 \uac83\uc740 \ubb34\uc5c7\uc778\uac00?",
"\ud655\uc815\ub41c \uacb0\uc815\uc740 \ubb34\uc5c7\uc774\uace0 \uc774\uc720\ub294 \ubb34\uc5c7\uc778\uac00?"
],
"action": "guide",
"lang": "ko",
"playbook": "agent-handoff-playbook",
"related": [
"agent-memory-compactor (compact long memory before handoff)"
],
"rules": [
"\ub9e5\ub77d\uacfc \ub300\ud654 \uae30\ub85d\uc774 \uc804\ud600 \uc5c6\ub294 \ub3c5\uc790\ub97c \uc704\ud574 \uc4f4\ub2e4.",
"\ube44\ubc00\uac12\uc740 \uc4f0\uc9c0 \ub9d0\uace0 \ubcf4\uad00 \uc704\uce58\ub9cc \uc801\ub294\ub2e4.",
"\uc778\uc0c1\uc774 \uc544\ub2c8\ub77c \uc99d\uac70(\ucee4\ubc0b, \uba85\ub839 \ucd9c\ub825)\uac00 \uc788\ub294 \uc0ac\uc2e4\uc744 \uc801\ub294\ub2e4.",
"150\uc904 \uc548\ud30e\uc73c\ub85c \uc720\uc9c0\ud558\uace0 \ubd99\uc5ec\ub123\uae30 \ub300\uc2e0 \ub9c1\ud06c\ud55c\ub2e4.",
"\uc138\uc158\uc744 \ub05d\ub0b4\uae30 \uc804\uc5d0 `check` \ub97c \uc2e4\ud589\ud558\uace0 \ubaa8\ub4e0 \uc624\ub958\ub97c \uace0\uce5c\ub2e4."
],
"sections": [
{
"content": "\ud55c \ubb38\uc7a5 \ubaa9\ud45c\uc640 \ud655\uc778 \uac00\ub2a5\ud55c \uc644\ub8cc \uc870\uac74.",
"order": 1,
"required": true,
"title": "\ubaa9\ud45c\uc640 \uc644\ub8cc \uc815\uc758"
},
{
"content": "\uc800\uc7a5\uc18c, \ube0c\ub79c\uce58, \ucee4\ubc0b, \ube4c\ub4dc\u00b7\ud14c\uc2a4\ud2b8 \uc0c1\ud0dc, \ubbf8\ucee4\ubc0b \ud30c\uc77c.",
"order": 2,
"required": true,
"title": "\ud604\uc7ac \uc0c1\ud0dc"
},
{
"content": "\uc7ac\ub17c\uc758\ub97c \ub9c9\uae30 \uc704\ud574 \ud655\uc815\ub41c \uacb0\uc815\uacfc \uc774\uc720.",
"order": 3,
"required": true,
"title": "\uacb0\uc815\uacfc \uadfc\uac70"
},
{
"content": "\ud544\uc218. \uc2dc\ub3c4\ud55c \uac83, \uc2e4\ud328 \uc774\uc720, \uc99d\uac70. \ub9c9\ub2e4\ub978 \uae38\uc758 \ubc18\ubcf5\uc744 \ub9c9\ub294\ub2e4.",
"order": 4,
"required": true,
"title": "\uc2e4\ud328\ud55c \uc2dc\ub3c4"
},
{
"content": "1\ubd84 \uc548\uc5d0 \ud604\uc7ac \uc0c1\ud0dc\ub97c \uc99d\uba85\ud558\ub294 \uba85\ub839.",
"order": 5,
"required": true,
"title": "\uac80\uc99d \uba85\ub839"
},
{
"content": "\uad6c\uccb4\uc801(\ud30c\uc77c \ub610\ub294 \uba85\ub839), \uc21c\uc11c \uc788\uc74c, \uac01\uac01 \uac80\uc99d \ubc29\ubc95 \ud3ec\ud568.",
"order": 6,
"required": true,
"title": "\ub2e4\uc74c \ud589\ub3d9 3\uac1c"
}
],
"version": "1.0.0"
}
Invalid input returns a structured error and exit code 2. (output abridged)
{
"action": "check"
}
{
"error": {
"code": "INVALID_INPUT",
"message": "\u0027handoff\u0027 (the HANDOFF.md text) is required."
}
}
All examples are also available via the agent API:
/v1/agent/skills/31f70f3d-557d-4916-910f-d4c00dee992c/schema
No reviews yet. Be the first to leave one!