From pulp
Coordinates cross-session handoffs by snapshotting open work, writing a status doc, and generating a goal prompt for a fresh session to continue.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pulp:handoffThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn "coordinate a handoff" into three artifacts: a **status doc committed to
Turn "coordinate a handoff" into three artifacts: a status doc committed to
pulp-planning main, a simple goal prompt that links it, and a list of
open items for the next session to track. The point is a fresh session — often
on a different machine, with none of this conversation's context — can start cold
and finish the work.
Keep the goal short (one or two sentences + a link + the issue numbers). Put all the detail in the doc. A goal the user pastes should fit in a glance; the doc is where the elaboration lives.
Carry the original ask forward faithfully — this is the #1 job. A handoff exists to hand off the goal the user actually gave, not a reconstruction of it. A handoff most often happens mid-project, and the failure mode is quietly narrowing the goal to "whatever's left in flight," or paraphrasing it into something subtly different from what was asked. Guard against both:
planning/*-goal.md or the "original ask" block of a prior handoff
doc), the standing objective the session was given (e.g. a Claude Code /goal
or the opening prompt), and the earliest user messages that framed the project.
Quote it; don't restyle it.Capture the goal at ask-time (the durable fix). The reliable way to hand off a goal is to have written it down when it was given. When a user sets a project goal or standing objective, persist it verbatim to a durable, agent-neutral, machine-portable place (a planning goal file) so any later session — Claude or Codex, any machine — can rediscover the last known goal without depending on one CLI's memory or slash-command state. The handoff is the fallback when that wasn't done; the capture is the fix.
Reference, don't duplicate. The doc is a map to the work, not a copy of it. Anything already captured in another artifact — a plan/spec, an ADR, a GitHub issue, a commit message, a diff, an existing skill — gets linked by path or URL, never re-pasted. Re-leverage the docs the work already produced. A handoff that restates a tracking issue's item list drifts from it the moment the issue is edited; one that links the issue stays correct for free. The doc's own content is only what exists nowhere else: the current honest status, which tracker to drive vs monitor, the working pattern, and the traps this work paid for.
The user says any of: "coordinate a handoff", "hand this off to a new session", "move this work to a new machine", "we're retiring you / this session", "write a status doc and a goal so someone can finish this", "make an easy handoff."
Find the goal the user actually gave, in the user's own words, per the "carry the
original ask forward faithfully" principle above. Prefer a captured record (a
planning/*-goal.md, a prior handoff's "original ask" block, the session's
standing objective / opening prompt); fall back to the earliest framing messages.
Quote it. If no durable record exists, reconstruct it faithfully and plan to
persist it (step 2's "original ask" block) so it stops being lost. Do not
proceed to snapshot open work until you can state the objective the way it was
asked — otherwise the whole handoff risks describing the tickets instead of the
goal.
ghapp pr list --state merged filtered to the PRs you
actually opened this session (by branch/title — do NOT use --author @me, it
returns every PR the account opened across all sessions and will pollute the doc).ghapp issue view <N> for each.git worktree list.ci skill's
auto-release-gap note and memory auto-release-drops-pending-run-orphan-tag).ghapp for every GitHub read, never plain gh.Path: planning/<YYYY-MM-DD>-<slug>-handoff.md. Get planning onto main first:
cd planning && git fetch -q origin main && git checkout -q main && git pull -q origin main
Structure the doc so a cold reader can act:
shipyard pr).ghapp/SSH..agents/skills/* the next session should invoke
for this work, each with one line on why. Point at the skill, don't restate
it. Keep this agent-neutral: these skills are read by both Claude Code and
Codex, so name skills, not agent features.main; if worktrees were
removed, say so ("do not look for them"); tell the reader to start from a fresh
worktree off origin/main, not a reused one. This is the item that most often
confuses a cold session on a new machine.Optionally add a short provenance note only as theoretical last-resort backup: the originating session-transcript path and host, explicitly framed "prefer the committed artifacts; you should not need this." Do not encourage routine use of the transcript — committed code + issues are the source of truth, and a transcript path is machine-local and non-portable. Omit it entirely if the committed artifacts fully cover the handoff.
Always save the doc to the pulp-planning submodule on main (durable,
identical on every machine), not a temp directory — a handoff whose whole purpose
is to survive the session must not live in scratch space.
Honesty bar: report merged/tagged/done from live state, never from a PR body or a planning claim — PR prose routinely overclaims. If something is partial, say so with the missing sub-step.
cd planning && git add <the-doc>.md && git commit -m "handoff: <slug> — <one line>" && git push origin main
Do NOT bump the parent repo's planning gitlink as a side effect. Stage only
the doc inside planning/; never git add the submodule pointer in the pulp
repo without a Planning-Bump: reason="..." trailer (see the planning-gitlink
guard). The doc is reachable on planning main regardless of the parent pointer.
Give the user a ready-to-paste block: a simple objective naming the goal, a
link to the doc on planning main
(https://github.com/danielraffel/pulp-planning/blob/main/<doc>.md), and the
open-item issue numbers. Keep the objective itself to a couple of sentences —
tell the reader the detail is in the doc.
Write it agent-neutral so it drops into whichever session picks it up:
/goal, or
ralph-loop for a sustained autonomous loop — but neither is a repo asset and
Codex has no equivalent, so never depend on one: the prompt text itself must
carry the persistence instruction.)codex exec "<prompt>". Codex reads AGENTS.md (which redirects to
CLAUDE.md), so keep repo conventions in the doc it links, not in the prompt.Because no slash-command or persistent-objective feature is guaranteed on either side, the prompt must state its own persistence — "keep going until the doc's definition-of-done is met" — and must not name a mechanism only one agent has.
Example shape:
Goal: Finish the remaining per the handoff doc
<planning-url>, and monitor issues #A / #B / #C until each is landed-or-parked. The doc has the full item list, the working pattern, new-machine setup, and the gotchas — follow it; verify every "done" against merged code, not PR bodies.
List the open issues/PRs explicitly in the reply (not only in the doc) so the user can point the next session at them, and note who should drive vs monitor.
The user often wants to end this session — or kill whatever background jobs, watch
loops, or monitored agents it left running — and be confident nothing under
active watch is dropped. (What "background work" means varies: a Claude Code
session may hold agent-tracked run_in_background jobs / Monitor loops / teammate
agents; a Codex or plain-CLI session more likely left a shell job running in
another terminal. The check is the same either way.) Before you say "safe to
retire," prove every monitored thing is in a terminal state:
MERGED (or explicitly closed).ci skill).State the result plainly in the doc's §0 / monitoring-status section and in the reply: "everything monitored is terminal; background tasks can be killed with zero loss; the remaining work is issues, driven by the next session, not polled." If something is NOT terminal (a queued release, an un-landed tag, a PR mid-merge), either finish it or name it as a live item the next session must pick up before anything is killed. A handoff that leaves a pending release unwatched is a dropped release.
AGENTS.md → CLAUDE.md) and the doc you write. Write the doc as if
the reader has only the repo and the doc — nothing else.npx claudepluginhub generous-corp/pulpProduces a compact handoff document that transfers context, state, and next objective without copying source material. Use when ending a session or passing work to another agent.
Produces a handoff document so a fresh agent can continue work from the current session. Handles both mid-arc continuation and backlog handoffs.
Generates a structured handoff document capturing progress, open tasks, key decisions, and resume context when ending a session or planning to continue later.