Session Handoff
Use when the user wants to continue work from one agent in another agent, inspect recent sessions, or summarize a saved session or checkpoint for handoff
- Skill ID
- entireio/skills/session-handoff
- Publisher
- entireio
- Repository
- skills
- Installs
- 0
- Files
- 1
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
entireio/skills/session-handoffInstalls these files- SKILL.md
What this skill tells the agent
Hand-Off Session
Response Format
Begin the first response to this skill invocation with the line:
Entire Session Handoff:
followed by a blank line, then the content. Apply the header to the first response of the invocation only — not on follow-up turns and not on error / early-exit responses (no sessions found, transcript missing). Its presence signals the skill ran and produced real output. The "Unanswered Question" branch still gets the header.
STOP — Read these rules before doing ANYTHING
- Do NOT ask clarifying questions. Auto-detect the session and read the transcript.
- Do NOT run
git log,git status,git branch,ps aux, or any other exploratory commands. Use only theentireCLI commands listed below. - Do NOT say "Would you like me to continue?" or "Let me know if you want me to pick this up." Just read the transcript and start working. Exception: if the previous agent asked the user a question that was never answered, you MUST ask the user that question before proceeding.
Required CLI: entire 0.6.2+ (session list --json, session info --transcript, session current --json|--transcript, checkpoint explain --json|--transcript|--raw-transcript --session-index N). If a flag is rejected, tell the user to upgrade and stop.
Flow: Active session handoff (default — also covers bare invocation and "current"/"active")
Step 1: Resolve the canonical worktree path
entire session current --jsonIf the output is valid JSON, read its worktree_path field — that is the canonical worktree root for this invocation, set by Entire itself. Use it verbatim in the next step (no cwd heuristic needed; symlinks, /private/var//var quirks, and subdirectory invocation are all handled).
If the output is not JSON (Entire prints No active session found in this worktree. when nothing is active), set the canonical worktree path to null and rely on the bidirectional prefix-match fallback in Step 2.
Step 2: Pick the session
entire session list --jsonEach entry has session_id, agent, status, worktree_path, started_at, last_active, turns, last_prompt, files_touched. Apply filters in this order:
- Worktree scope. If you got a canonical worktree path in Step 1, keep entries where
worktree_pathequals it exactly. Otherwise, keep entries wherecwdstarts withworktree_pathorworktree_pathstarts withcwd. If either filter yields zero entries, fall back to the unscoped list — better to summarize a slightly-off session than to refuse the handoff. - User-named agent filter (optional). If the user said "codex", "claude", "kiro", "gemini", etc., keep only entries whose
agentmatches case-insensitively as a substring (sogeminimatchesGemini CLI). - Drop self. Drop entries where
agentmatches the agent currently running this skill (e.g.Claude Code,Codex,Cursor,Gemini CLI,Copilot CLI,Factory AI Droid,OpenCode). If this empties the list, undo this filter and keep self — the user is asking you to summarize your own current session for compaction. Note that fact in the announcement (Step 5). - Pick most recent. Sort by
last_active(fall back tostarted_at) descending; take the first.
If filtering still leaves zero entries (truly nothing in the list, even self), print a one-line error (no header) and stop.
Step 3: Stream the raw transcript
entire session info <session_id> --transcript > /tmp/handoff-<session_id>.jsonlSnapshot is bounded to the file size at command start. Output is JSONL for most agents and a single JSON document for Gemini CLI.
Step 4: Extract conversation content
JSONL agents (Claude Code / Codex / Cursor / Copilot CLI / Factory AI Droid / OpenCode):
grep -E '"type":"(message|function_call|user|assistant)"' /tmp/handoff-<session_id>.jsonl | cut -c1-2000 | head -20 # original task
grep -E '"type":"(message|function_call|user|assistant)"' /tmp/handoff-<session_id>.jsonl | cut -c1-2000 | tail -100 # final stateGemini CLI (single JSON document — no JSONL grep):
jq 'keys' /tmp/handoff-<session_id>.jsonlThe top-level shape varies by Gemini CLI version, but messages live under one of messages, contents, history, or turns. Each entry has a role (user/model/function/tool) and a content payload under one of parts[].text, content, or text. Extract role + text in chronological order:
# Example — adapt the path based on what `jq 'keys'` showed.
jq -r '.messages[] | "\(.role): \([.parts[]? | .text // ""] | join(" "))"' /tmp/handoff-<session_id>.jsonl | head -20
jq -r '.messages[] | "\(.role): \([.parts[]? | .text // ""] | join(" "))"' /tmp/handoff-<session_id>.jsonl | tail -100If neither shape works, fall back to the Read tool on the JSON file and locate the message array by inspection.
Do not show the raw extracted lines to the user. They are inputs for Step 5.
Step 5: Announce, summarize, present
Announcement. First line of the body: Handing off <agent> session — <turns> turns, last active <relative time>, ID <first-8-of-session-id>. If the picked session is your own (Step 2 self-filter fallback), prepend a one-clause note: Self-handoff (no other sessions in this worktree). This gives the user a chance to catch a wrong pick before reading the summary.
Summary structure (skip any section with no genuine content — do not hallucinate filler):
- Task Overview — the user's core request, success criteria, stated constraints.
- Current State — completed work: files created/modified, key decisions, artifacts produced.
- Important Discoveries — technical constraints found, rationale behind decisions, errors hit and how they were resolved, failed approaches and why.
- Next Steps — specific remaining actions, blockers, priority ordering.
- Context to Preserve — user preferences, domain details, commitments made during the session.
- Unanswered Question (only if applicable) — if the previous agent's last message asked the user a question or presented options that were never answered, capture it exactly as asked.
A one-bug-fix session might legitimately have only Task Overview + Current State + Next Steps. A pure-research session might have only Task Overview + Important Discoveries. Empty sections are a feature; pad them only if you have real content.
Continue. Show announcement + summary.
- If section 6 exists, ask the user that question and wait. Do NOT pick a default.
- Otherwise, immediately pick up the work — plan, code, or whatever the next step is. Do not ask permission.
Flow: Checkpoint handoff (user gives a checkpoint ID)
Step 1: Enumerate sessions
entire checkpoint explain <checkpoint-id> --jsonThe envelope's sessions array lists every session that contributed. Multi-session checkpoints are common (parallel agents, retries, multi-phase work) and earlier sessions often carry the rationale, failed approaches, and user constraints that the latest session takes for granted.
Step 2: Pick which sessions to stream
- 1 session. Stream the normalized compact transcript:
entire checkpoint explain <checkpoint-id> --transcript > /tmp/handoff-ckpt-<checkpoint-id>.jsonl- 2–8 sessions. Iterate every index 0..N-1. Do not rely on the
--transcriptdefault (latest session only):
# for N in 0 .. sessions.length-1
entire checkpoint explain <checkpoint-id> --raw-transcript --session-index <N> > /tmp/handoff-ckpt-<checkpoint-id>-<N>.jsonlMore from entireio
Use this skill in a project
Open any RiverX project, search the Skills panel for entireio/skills/session-handoff, and install it in one click.
