handoff
Checkpoints a work session — at its close (the main use), mid-session before clearing context or switching focus, or at the end of a `/iyu:run-cycle` run. Records where things stand, migrates completed work out of the continuity docs into the history index, derives and stages the next scope, flags (not briefs) the decisions waiting on a human for `/iyu:resume` to brief when the next session opens, and commits everything it can confidently attribute (this session's work, pre-existing uncommitted leftovers, and its own doc edits) toward a clean `git status` — never pushing, and reporting rather than guessing at anything ambiguous. Produces the document a fresh session (or another person) resumes from, so nothing depends on the current conversation surviving.
- License 许可
- MIT
- 最近更新
- 2026-11-12
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- handoff
- description
- Checkpoints a work session — at its close (the main use), mid-session before clearing context or switching focus, or at the end of a `/iyu:run-cycle` run. Records where things stand, migrates completed work out of the continuity docs into the history index, derives and stages the next scope, flags (not briefs) the decisions waiting on a human for `/iyu:resume` to brief when the next session opens, and commits everything it can confidently attribute (this session's work, pre-existing uncommitted leftovers, and its own doc edits) toward a clean `git status` — never pushing, and reporting rather than guessing at anything ambiguous. Produces the document a fresh session (or another person) resumes from, so nothing depends on the current conversation surviving.
- when_to_use
- User-invoked any time — "세션 종료를 위한 정리", "중간 정리", "컨텍스트 비우기 전에 정리", "HANDOFF/ROADMAP 업데이트", "다음 작업범위 제안", "로드맵 최신화", "wrap up and hand off", "checkpoint before /clear". Invoked by `/iyu:run-cycle` as the last step of every run. Model-invoked on its own (announce first, per Rule 7) only on a concrete signal that the session is ending — the user is closing out or the context window is nearly exhausted — or when HANDOFF.md/ROADMAP.md are visibly stale against what git log shows happened. Never as a substitute for asking what to do next.
- allowed-tools
- Read, Glob, Grep, Write, Edit, TodoWrite, Bash
- argument-hint
- [focus or scope note]
03 SKILL.md 正文
Session Handoff
Write down what the next session — or this one, after its context is cleared — needs, and nothing else. The output is judged by one test: could someone with no access to this conversation pick up the work from these files alone?
Work this like a capable team lead closing out the week. run-cycle is the employee who
executes a scope and reports back; this skill is the lead who says where the work stands and what the
team does next — and, for the calls that are the owner's to make, names them so /iyu:resume can
brief them properly when the next session actually opens (step 6).
When it runs
The output is the same in every case — a HANDOFF.md that stands on its own — but what surrounds it
differs:
| Occasion | Who starts it | What differs |
|---|---|---|
| Session close — the main use | the user, or the model on a concrete end signal (Rule 7) | nothing; this is the default below |
Mid-session checkpoint — before /clear, a topic switch, or when the context is getting heavy |
the user | the session goes on afterwards. ## In flight is often not "None" — say exactly where the work stopped. Half-done edits stay uncommitted and are named (## Commit step 3) |
End of a /iyu:run-cycle run |
run-cycle, as its last step |
the End-of-Run Report is already the run's chat report — read it as evidence (step 2) and keep your own chat report to a few lines pointing at HANDOFF.md. The run's cycles already updated STRANDS.md |
Every occasion ends the same way, too: once HANDOFF.md is written and committed, the conversation
is no longer needed to continue. Close the report with one line saying so — the context can be
cleared, and /iyu:resume picks up from HANDOFF.md.
Why this exists separately
A session that is not a cycle run ends the way a run does: work happened, the roadmap no longer
matches reality, decisions are pending, and the next scope lives only in a conversation that is about
to disappear. /iyu:run-cycle ends each run by invoking this skill rather than carrying its own copy
of the closeout, so both paths produce the same HANDOFF.md.
This skill is that closeout, detached from the cycle machinery. It shares its definitions with
run-cycle rather than restating them: continuity-docs.md
is the single source for where the documents live, what belongs in each, the hygiene pass, and how
next scope is derived, and
release-cadence.md is the single source for
where release work sits in the order. Read both first — this file only adds what is specific to
closing a session.
Briefing pending decisions is /iyu:resume's job, not this skill's. A briefing is analysis aimed
at whoever resumes; produced here it would be written once at close and then sit, possibly staling,
until someone acts on it. /iyu:resume grounds the same
decision in the repo as it stands the moment someone is about to act on it, and it is the one place a
decision gets written back the instant it is made. This skill's job stops at naming what is
undecided (step 6) — cleanup and continuity-doc upkeep, nothing more.
Scope
$ARGUMENTS, when given, narrows what to cover (a submodule, a phase, "just the decisions").
Without it, cover the whole session.
Process
1. Resolve the continuity root
Per continuity-docs.md §1. Resolve before reading or writing anything. In an umbrella repo, pick the root covering the code this session touched — and if the session touched several submodules, write one handoff per root rather than merging them into whichever was resolved first.
2. Reconstruct what happened — from evidence, not memory
The conversation may already be compacted, and it is not the record. Read the actual traces:
git log/git status/git diff --statsince the session started- The existing
HANDOFF.mdandROADMAP.md— what did they claim, and is it still true? - The most recent
cycle-logs/cycle-*.md, if the project runs cycles — its Carry-Forward, ledgers, and Next-Cycle Scope are inherited obligations, not history. At the end of a run, also that run'sRUN-SUMMARY-*.mdblock: its deferred (L2) decisions feed step 6's "Waiting on you", and its self-made (L1) decisions feed "Decided this session" - Any
<root>/issues/drafts written this session <root>/stages/stages.jsonand its newestevidence/file, if a stage contract exists (stages.md). Record the open stage and its progress (scenarios passing x/y, latest verdict) under## In flight; record anyowner_decisionsstillopenunder## Waiting on youwith the stage each one opens. Never copy scenario text into the handoff, and never edit the contract — it is not a continuity doc.- The project's external inbox, if it defines one (continuity-docs.md §6) — an item that arrived during the session belongs in the handoff even though nothing in git mentions it
- The existing
## Decided this sessionentries inHANDOFF.md, if/iyu:resumealready recorded one earlier in this same session — carry these forward as fact, not something to re-derive; a decision/iyu:resumewrote back the instant it was made may leave no distinguishing git diff to reconstruct it from. An entry marked already applied is applied to## Nextonly — a confirmed reorder still has to be carried intoROADMAP.md's phase order here (step 5), but do not re-apply it to## Next, which already holds it
Unobserved data stays "unknown". A handoff asserting a test passed, when no one ran it, is worse than one saying "unverified" — the next session builds on it. If something matters and is unknown, say so and name the command that would settle it.
3. Apply the hygiene pass
Per continuity-docs.md §3, in full: migrate
every completed item out of ROADMAP.md (including pre-existing leftovers) into HISTORY.md
(archiving overflow past its live window), rewrite HANDOFF.md to current + next only, update
STRANDS.md (the same transition procedure run-cycle applies per cycle, applied here per this
closing session — record the unit as session-{YYYY-MM-DD}, counted once per the rule in §3 step 4,
so a second handoff the same day and a handoff at the end of a run add nothing), settle the entries under
## 진행 중 that nothing advanced for over 14 days (continuity-docs.md §3 step 4 f: graduate, stop with a resume condition, or
keep with a dated reason), then compress it (archiving overflow
past its live window; ## 진행 중/## 중단됨 are never archived), keep the > History: link —
then run the structural checks (continuity-docs.md §7) on the result by running the script:
sh "${CLAUDE_SKILL_DIR}/../_shared/scripts/docs-lint.sh" <root>. Run it again after steps 5–6
have written their part, before ## Commit: an error-class failure (FAIL, exit 1) is fixed, never
committed. Its WARN and UNCHECKED lines, and any failure the rules forbid repairing, go in
## State of play.
This is the step that makes the skill worth running repeatedly. The docs converge toward
remaining-work-only on their own, without anyone scheduling a cleanup. It is also what keeps
STRANDS.md accurate on the majority of sessions, which close via this skill rather than
run-cycle — a session that finishes a phase graduates its strand in the same pass that
migrates the phase to HISTORY.md.
4. Derive the next scope
Per continuity-docs.md §4 — carry-forward
defects, then mid-session discoveries, then emergent scope across the user / developer / operator
lenses, then the backlog. Tag each candidate autonomous-eligible or discussion. When the
front of ROADMAP.md is blocked, ## Next descends the order to the startable phases behind it
(§4, order is not a gate) — never only its first few items.
Scope concretely for one next session, not five. Anything further out stays a phase-level
direction in ROADMAP.md. Concrete scope for sessions you cannot yet know about is the same failure
run-cycle guards against with its no-cycle-numbers rule.
Step 5 then decides where the rest sits — deriving the next item and ordering the remainder are different jobs, and skipping the second is how a release ends up scheduled mid-phase.
## Next still empty after this — carry-forward, mid-session discoveries, and the backlog all
came up empty. Write the goal-gap review (§4) as the next session's scope — one line; the
review itself is the next run's work, not this skill's — and name /iyu:backlog-discover as the
pointer for the wider, outward-looking lanes. Do
not generate options, a cross-lens read, or a recommendation here; that four-part briefing is
resume's job (rule 5 already reserves it for resume, never handoff). This mirrors the closing
line run-cycle's End-of-Run Report and resume rule 9 already carry, so all three skills
point the same way when the backlog runs dry.
5. Re-order what remains
Deriving what comes next is only half of it. The other half is what order the rest sits in — and the item that most often ends up in the wrong place is the release.
Apply release-cadence.md in full:
- §2, the placement test — for any push/publish/release item in the backlog, check what remains that would touch the same consumer-facing surface. Work still pending on that surface means the release belongs after it: publishing mid-phase buys a version the next few items obsolete, and every pushed pipeline spends a shared CI budget. Finished work that consumers are waiting on pushes the other way. When the two genuinely conflict, that is a decision for step 6's "Waiting on you", not one to settle here. A deferred release gets a frozen batch at its marker — the items known now that it waits on; an existing marker's batch is kept, not re-cut.
- §5, a held release from a run — when
/iyu:run-cycle's release review held a granted release (itsRelease review: held — …line in the run'sRUN-SUMMARY-{date}.md: batch open, no receiver, or the interval not passed), write the marker into## Nextat its boundary with the batch and what held it — for the interval, the earliest date — and the act into step 6 as a one-line owner-gated entry. The gate itself is placed, not asked about. That marker is the gate the next run fixes at its start. - §3 — follow the project's declared cadence; if there is none, infer it from tags and release history and say that you inferred it.
- §4 — the outcome is an edit to the order in
ROADMAP.md/HANDOFF.md, with a one-line reason at the marker (— after Phase 3; Phase 3 changes the same CLI output). A paragraph of reasoning is advice the next session skips; a reordered list is what it reads first.
The same test applies to ordinary items when one obviously blocks another, but the release is the recurring case: it is easy to add "release" the moment work feels done, and then it sits in the middle of a phase that will change the same surface again.
Report what moved. A silently reordered backlog is indistinguishable from drift. And reorder only — adding, dropping, or rescoping items is separate work with its own rules.
6. Flag the decisions — name them, don't brief them
Two lists, kept apart because they behave differently:
- Waiting on a human — irreversible or human-only decisions, plus anything blocked on a resource (a credential, an access grant, an external dependency).
- Decided along the way — reversible choices made during the session that carried a real trade-off. Each with its alternatives, the trade-off, and a one-line "to correct: <the reverse action>". Presenting these is what makes deciding-then-reporting safe rather than sneaky. Pure taste choices are not recorded.
Before writing any "waiting on you" entry, run the self-unblock check: is the resource actually missing (look, don't assume), and does a governing doc, an accepted issue, or a prior decision already answer the question? An assumed blocker parks work that could have proceeded.
Apply decision-briefing.md §1 for the entry shapes — but stop at naming, not briefing:
- Resource-blocked entries keep their short factual form (§1): blocker · what was tried · what would unblock it. This is a fact, not a decision, so it is written here in full, same as always.
- Decision-class entries get one line — plus the two facts every entry carries (below): the
decision, phrased so it can be answered.
Do not generate options, a cross-lens read, or a recommendation here — that analysis is
/iyu:resume's job, done fresh against the repo as it stands when someone is actually about to act on it, rather than produced now and left to stale until then. The flag is a placeholder for/iyu:resumeto brief and decide — it is not a question addressed to the owner, so do not phrase it as one ("A or B?"); name what is being chosen. - An owner-gated act (push, publish/release, GitHub issue registration, a major-version bump) whose underlying choice is already settled is resource-blocked, not decision-class — the owner is the resource: blocker = the gate · tried = the decision (pointer to it) · unblocks = approval to run the act. Do not re-flag the settled choice.
- An unanswered criterion request left by
/iyu:resume(the criterion at fault · proposed revision · decision taken under it) carries over as-is. It is not a decision to re-flag, and dropping it loses the one question the owner still owes. - Recommendable + reversible → not here at all. If you can already see the answer and it's reversible, that is not a pending decision — decide it, proceed, and record it under Decided along the way instead. The one-line-flag format makes it cheap to escalate; that is exactly why it must not become the default for anything you could have just decided.
- Nothing to decide → say "None". If everything remaining can be carried autonomously, that is the finding, and it is a good one. Never manufacture a decision to fill the section.
If the project already uses decision IDs (HD-01, D-03, …), continue that numbering rather than
starting a scheme of your own.
Every entry, whatever its shape, carries two facts — they are what lets a reader see what a gate holds up and how long it has stood, and neither is briefing:
- Registered — the date the entry first appeared. A carried-forward entry keeps its original
date through every rewrite; resetting it hides exactly the gates that have waited longest.
It keeps every other field it already has, too —
/iyu:resume'sDefaultandMeanwhileincluded. - Blocks — the
## Next/ROADMAP.mditems that cannot move until it clears, by ID or title. "Nothing" is a valid answer and worth knowing.
An entry that clears leaves the section — HANDOFF.md is current state, so removal is the
resolution, and the outcome goes where §2 of continuity-docs.md homes it. /iyu:resume adds
Default and Meanwhile to the entries it leaves standing; do not write them here.
Output
<root>/HANDOFF.md, rewritten:
# HANDOFF
> History: [HISTORY.md](HISTORY.md)
**Updated**: {YYYY-MM-DD} · **Root**: {resolved root}
## In flight
{What is half-done right now, and where exactly it stopped — the file, the step, the next command.
"None" if nothing is half-done. A mid-session checkpoint is read by this same session after `/clear`,
so this is the section that has to be exact.}
## Next
{Concrete scope for the next session — from carry-forward, discoveries, or an autonomous-eligible
emergent candidate. Anchored to a ROADMAP phase. One session's worth.}
## Waiting on you
{"None" — the right answer whenever everything left can be carried autonomously — or entries in the
two shapes below: the first decision-class (flagged, not briefed — `/iyu:resume` briefs and decides it), the
second resource-blocked.}
### {HD-01} {the decision, in one line — no options, no recommendation; `/iyu:resume` briefs and decides this next}
- **Registered**: {YYYY-MM-DD} · **Blocks**: {item IDs, or "nothing"}
### {HD-02} {what is blocked}
- **Registered**: {YYYY-MM-DD} · **Blocks**: {item IDs, or "nothing"}
- **Blocker**: {the missing credential / access / dependency}
- **Tried**: {what was actually attempted}
- **Unblocks**: {the specific thing you need}
## Decided this session
{Reversible self-made decisions: decision · trade-off · to correct. Or "None". When the project
keeps a decision ledger, the entry IDs and a link instead (continuity-docs.md §2).}
## State of play
{Build/test/lint status with the actual output, or explicitly "unverified". Branch, the **post-commit**
`git status` (see ## Commit below) — "clean", or the specific files still uncommitted and why.
Structural checks (continuity-docs.md §7): "passed", or each warning and unrepairable failure by code.}
Plus: ROADMAP.md with completed work removed (hygiene pass) and its remaining phases in the
order step 5 settled on, and HISTORY.md with the completed work appended.
Then report the same five sections in chat — the file is for the next session, the response is for
the person reading now (at the end of a run, a few lines instead: the End-of-Run Report already said
it). End with the one-line pointer: the context can be cleared now, and /iyu:resume continues from
HANDOFF.md. Carry the flagged decisions into the response too, exactly as one-liners; do
not improvise options or a recommendation in chat that step 6 deliberately left for /iyu:resume to
produce later.
Commit
Run this after the docs above are in their final form — it commits them too. The goal is git status
clean when the skill finishes, and that includes work this skill did not create: pre-existing
uncommitted changes already sitting in the tree when the session started (leftover from an earlier
session that never got committed) are in scope, not just this session's own edits.
- Survey everything, not just what this session touched.
git status/git diff --stat— include hunks that predate this session's first tool call. - Group into logical units and commit what you can confidently attribute. Follow the project's
own message convention (recent
git log); use its commit skill if one is available instead of hand-rolling the message. Don't commit file-by-file, and don't fold unrelated units into one commit — same anti-fragmentation barrun-cycleapplies at its own commit boundary. This includes the handoff's own edits (HANDOFF.md,ROADMAP.md,HISTORY.md,STRANDS.md, anyissues/drafts written this session) as their own logical commit, typically last since it describes everything before it. - Do not guess at the unclear. A change you cannot confidently attribute — unfinished work, an ambiguous partial edit, something you can't tell is safe to bundle or is even meant to be committed — is not committed. Leave it as-is and report it by name (file, what's ambiguous, what would resolve it) in "State of play" instead of folding it into a commit or a message that guesses at intent. A wrong guess here is worse than an honest "left uncommitted, because —".
- Never push, never open a PR. Commit only. Whether the tree ends up clean or not, push and PR creation stay the human's call (global git policy) — this skill's cleanliness goal is about local history, not what leaves the machine.
- The report carries the real result. "State of play" states the actual post-commit
git status, not an aspiration — if something is still uncommitted, that is itself a finding to hand to whoever reads the handoff next.
Rules
- Remaining work only. Completed work belongs in
HISTORY.md. Every run enforces this, not just runs where something was completed. - Evidence over assertion. Test/build claims carry their output or are marked unverified.
- Commit toward a clean tree, but never guess. See ## Commit — every logical unit you can confidently attribute (this session's work, pre-existing uncommitted leftovers, and the handoff's own doc edits) gets committed; anything ambiguous is left alone and reported instead. Never push.
- Do not implement. If step 2 surfaces a defect, record it — fixing it starts a new session's work and leaves the handoff describing a state that no longer exists.
- Flag, don't brief — but only where a decision exists. A decision-class entry leaves as one
line naming the choice; generating options, a cross-lens read, or a recommendation here is
/iyu:resume's job, not this skill's. An empty section is a complete one: if nothing left needs the human, "None" is the finding, not a slot to fill. And if you can already see the answer and it is reversible, it belongs in "Decided this session", not here. - One root per handoff. In an umbrella repo, several submodules touched means several handoffs, each in its own root.
- Model-invoked runs announce first. When this skill starts without an explicit user invocation
(
/iyu:handoff) — including when/iyu:run-cycleinvokes it at the end of a run — say in one line that a handoff is running and why, before touching any file — the rewrite is reversible, but a silent one still surprises whoever is reading the conversation. - Point, don't brief, when
## Nextis empty. Scope the goal-gap review as next and name/iyu:backlog-discover; do not produce options, a cross-lens read, or a recommendation — see step 4. That staysresume's job.
04 同仓库更多 Skills
drive
Pushes the open stage of a product to its agreed satisfaction bar — implement one failing scenario at a time, have an independent evaluator judge the running build, repeat until the stage passes or needs something only the owner can supply, then show the owner a demo. Use after `/iyu:charter` has a signed stage contract.
charter
Interviews the owner to set a product's goal and writes the stage contract — an ordered ladder of stages that each work on their own, with scenarios an observer can watch, a calibrated satisfaction bar, the promises each stage must keep, and every owner decision that could block it. Use before `/iyu:drive`, and again at each stage boundary.
accept
Judges the open stage by having an independent evaluator subagent drive the real, running build like a user — scenario by scenario, against the rubric — and record an evidence report and the status fields. Use to get a verdict without building anything; `/iyu:drive` dispatches the same evaluator each round.
telemetry-az
Analyzes Azure Application Insights telemetry since the last run to surface defects, performance regressions, and feature-drop signals, tracked run-over-run as a quality trend (error-rate/p95/issue-count direction, with closed-issue recurrence detection), plus a report-only user-analytics reading (active-user growth, feature/page preference shifts, engagement). Triages findings against project philosophy, files issues only for threshold-crossing ones, and leads every report with a both-purpose Trend section backed by a 12-run history.
ship
Takes finished work out — bumps the version, commits, pushes, and watches the CI run to completion, reporting what failed if it fails. Checks first whether now is the right moment — if remaining backlog work would touch the same consumer-facing surface, it says so and asks rather than publishing a version the next few items obsolete.
run-cycle
Executes adaptive iterative development cycles — each cycle is a self-contained plan/execute/verify/reflect loop that reshapes the roadmap and derives emergent follow-on scope from its own output