Skip to content
Agentmart
Submit a tool

call-handoff

Cold-start briefing from the project's newest handoff, open bugs and next-session prompt in two round-trips, then stop.

Skill by mhshaon98

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/mhshaon98-call-handoff

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Cold-start briefing from the project's newest handoff, open bugs and next-session prompt in two round-trips, then stop. Use at session start or on "call handoff", "catch up", "where did we leave off".

Use cases: agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/call-handoff

What's inside

Skill name
call-handoff
Description
Cold-start briefing from the project's newest handoff, open bugs and next-session prompt in two round-trips, then stop. Use at session start or on "call handoff", "catch up", "where did we leave off".
License
MIT
Instructions
157 lines in SKILL.md · view on GitHub

Files (3)

  • SKILL.md
  • layouts.md · references/
  • sibling-handshake.md · references/

SKILL.md (first lines)

# Call Handoff — token-efficient cold start

Goal: **one pass, ≤2 tool round-trips to the briefing** (script + ToolSearch, then
Step 3's first message, alongside any one follow-up Read; the other-session renames follow),
know what the project is, where the last session stopped, what is open, what must not
break — brief the user, fix session titles, then stop. This is the single session-start
ritual (the `session-start` skill is a stub that points here): orientation only, with
the code read later, once a task is chosen (last section).

## Budget

- Every round-trip re-reads the session's entire fixed context (tens of k tokens), so
  batching is the saving. Target: the one-shot script below + at most one
  follow-up Read (a >600-line handoff sliced, or one superseded handoff the newest one
  explicitly defers to) + the Step-3 pass (one message: self-rename + Remote Control on +
  `list_sessions`; then one batched rename message).
- **Load the Step-3 tools with the script, not after it.** The `ccd_session_mgmt` tools
  are deferred: send ONE `ToolSearch` (`select:mcp__ccd_session_mgmt__set_session_title,mcp__ccd_session_mgmt__list_sessions,mcp__ccd_session_mgmt__set_remote_control`)
  in the same message as the Step-1 Bash call, so loading costs no round-trip.
- **No dollar sign followed by a digit in this file**: the Skill tool replaces it with a
  word of the invocation's arguments, which breaks shell and awk code.
- **No codebase exploration.** No directory walks, no grep sweeps, no source files, no
  subagents. The handoff is the index; code gets read later, when a task is chosen.
- The project's `CLAUDE.md` and memory are already auto-loaded into context, so a
  re-read spends a round-trip on nothing. Skim what's in context instead.

## Step 1 — the one-shot script (single Bash call; Git Bash works on Windows)

Set `S` to the local clone of your skills repo if you keep one in git (leave it empty
to skip the sync block).

```bash
S="${SKILLS_REPO:-}"; echo "=== SKILLS SYNC (${S:-none configured})"
if [ -n "$S" ] && [ -d "$S/.git" ]; then D=$(git -C "$S" status --porcelain=v1 | head -3); if [ -n "$D" ]; then echo "DIRTY skills clone - not pulling:"; echo "$D"; else B=$(git -C "$S" rev-parse HEAD); git -C "$S" pull --ff-only 2>&1 | tail -1; git -C "$S" diff --name-only "$B" HEAD | grep -qE '^(skills|agents|hooks)/' && echo "SKILLS CHANGED -> re-install needed"; fi; git -C "$S" log -1 --format='skills @ %h %ad %s' --date=short; git -C "$S" status -sb | head -1
elif [ -n "$S" ]; then echo "NO CLONE at $S - clone your skills repo there first"; fi
echo "=== ENTRY POINT?"; if [ -z "$(find _claude _claude/handoffs . docs handoffs -maxdepth 1 -name 'HANDOFF-*.md' 2>/dev/null | head -1)" ] && [ ! -d .git ] && ! grep -q '^## Topic table' CLAUDE.md 2>/dev/null; then for P in _claude/WHERE-IS-THE-CODE.md WHERE-IS-THE-CODE.md CLAUDE.md; do [ -f "$P" ] || continue; T=$(grep -oE '([A-Za-z]:[\/]|~/)[^`"<>|*?]+' "$P" | head -1 | tr '\134' '/' | sed -e "s|^~|$HOME|" -e 's|[[:space:]]*$||'); case "$T" in [A-Za-z]:/*) T="/$(printf %s "${T%%:*}" | tr 'A-Z' 'a-z')${T#?:}";; esac; [ -n "$T" ] && [ -d "$T" ] && { echo "pointer $P -> $T (cd there; this folder is the entry point only)"; cd "$T" || true; break; }; done; fi; pwd
echo "=== PROJECT SYNC"; if git remote get-url origin >/dev/null 2>&1; then if [ -z "$(git status --porcelain=v1 -uno)" ]; then git pull --ff-only 2>&1 | tail -1; else echo "dirty tree - not pulling"; fi; git status -sb | head -1; else echo "no remote"; fi
C=_claude; if [ ! -d _claude ]; then C=.; [ -n "$(ls -d HANDOFF-*.md NEXT-SESSION-PROMPT.md BUG_LIST.md WHERE-IS-THE-CODE.md handoffs 2>/dev/null)" ] && echo "LEGACY LAYOUT: continuity files at project root -> update-handoff moves them into _claude/"; fi
if grep -q '^## Topic table' CLAUDE.md 2>/dev/null; then echo "=== LAYERED HANDOFFS (router = CLAUDE.md topic table, already in context - read ONE topic file)"; find "$C/handoffs" -maxdepth 1 -name '*.md' 2>/dev/null | sort | while read -r f; do echo "$f · $(grep -m1 -i '^Last updated' "$f")"; done
else
HL=$( { find "$C" docs -maxdepth 1 -name 'HANDOFF-*.md'; find "$C/handoffs" -maxdepth 2 -name 'HANDOFF-*.md'; } 2>/dev/null | while read -r f; do printf '%s|%s\n' "${f##*/}" "$f"; done | sort)
H=$(printf '%s\n' "$HL" | tail -1 | cut -d'|' -f2)
echo "=== NEWEST HANDOFF: ${H:-NONE} · prior: $(printf '%s\n' "$HL" | tail -3 | sed '$d' | cut -d'|' -f2 | tr '\n' ' ')"
[ -n "$H" ] && sed -n '1,600p' "$H"; fi
echo "=== RECENCY"; git log --oneline -5 2>/dev/null; git status --porcelain=v1 -uno 2>/dev/null | head -10; ls -t | head -8
B="$C/BUG_LIST.md"; [ -f "$B" ] || B=BUG_LIST.md; echo "=== OPEN BUGS ($B)"; [ -f "$B" ] && grep -n "^## \|Status:" "$B" | head -40 || echo "no BUG_LIST.md"
N="$C/NEXT-SESSION-PROMPT.md"; [ -f "$N" ] || N=NEXT-SESSION-PROMPT.md; echo "=== NEXT SESSION PROMPT ($N)"; [ -f "$N" ] && cat "$N" || echo "none"
```

Optional final line, if you use the `usage-here` skill — it records a usage baseline
for the session so a later report can isolate this session's burn:

```bash
echo "=== USAGE BASELINE"; "$(command -v python3 || command -v python)" "$HOME/.claude/skills/usage-here/usage_report.py" --snapshot
```

## Step 2 — reconcile and (rarely) follow up

- **Sync lines first.** `SKILLS CHANGED` ⇒ the installed copies under `~/.claude/skills`
  are stale: re-run your install step from the clone in one Bash call of its own and
  report its last lines. `DIRTY skills clone` or `ahead` in the status line ⇒ a previous
  session on THIS machine left work uncommitted/unpushed: say so in the briefing (it is
  invisible to other machines) and offer `update-handoff` to finish it. `NO CLONE` ⇒
  tell the user to clone the repo and stop. A pull that fails (offline, diverged) is
  reported, never retried with force.

- **`_claude/NEXT-SESSION-PROMPT.md`** (written by `update-handoff`) is the fastest
  orientation: if its date matches or post-dates the newest handoff, build the
  briefing around it. If it's OLDER than the handoff or the latest commits, it's
  stale — say so and trust the handoff instead (on any conflict the handoff wins).
- Commits or mtimes post-dating the handoff's date ⇒ handoff is **STALE** — say so in
  the briefing and treat git/files as truth.
- Bug entries: read in full only open/reopened ones (one targeted Read if the grep
  headers aren't enough). A ✅ entry matching a fresh symptom ⇒ suspect regression.
- Script printed `pointer …` or `LAYERED HANDOFFS`? Read this skill's
  `references/layouts.md` before the briefing (one extra Read that only these two
  layouts pay).
- **`LEGACY LAYOUT` printed?** The assistant's continuity files (handoffs, prompt, bug
  ledger, pointer) still sit at the project root; they belong in `_claude/` (layout:
  `update-handoff` → "The `_claude/` folder"). Say so in one briefing line; the next
  `update-handoff` moves them. Don't move them during orientation.
- **Flat handoff juggling several independent issues** (≥2 unrelated threads — different
  devices, vendors, customer contacts, or source folders — each with its own TODO)?
  Mention once in the briefing that `update-handoff` can split it into layered topic files.
- **No handoff at all?** The script output already shows it: orient from `README.md`
  (one Read) + the git log, say plainly there is no handoff, note one must be created
  before session end (`update-handoff` skill).

## Output — the briefing (≤200 words; written once Step 3's first message has returned, so the title and Remote Control lines are real; then the other renames, then STOP)

- **Project:** 1–2 sentences. · **Last session (date, source file):** what landed.
- **Freshness:** current, or stale vs. git (evidence).
- **Open now:** unfinished work, open bugs, NOT-verified items.
- **Highest-value next item.** · **Dead paths / must-not-break** (constraints, not
  suggestions). · **Session title:** `<topic> · <YYYY-MM-DD>` · **Remote Control:**
  the state the Step-3 call returned.
- **Ready — what do you want to work on?**

## Step 3 — Remote Control on + session-title hygiene (desktop app only; skip in the plain CLI)

*Requires the desktop app's `ccd_session_mgmt` MCP tools. If they aren't available,
skip this whole step silently.*

Order: script result → ONE message with the self-rename, Remote Control on and
`list_sessions` (plus any Step-2 follow-up Read) → the briefing → ONE batched message
renaming the other sessions.

**Remote Control on.** Invoking this skill is the user's standing request to reach the
session from claude.ai/code and the phone: call
`mcp__ccd_session_mgmt__set_remote_control` `{"session_id": "self", "enabled": true}`
(the app may ask them to approve). Report the returned state in the briefing (`on`,
`connecting`); a refusal (phone-started sessions have it on and locked), `unavailable`, or
a declined/auto-mode-denied approval → one line saying which, never a retry. THIS
session only; `update-handoff` Step 6 switches it off.

Skill-started sessions all get auto-titled "Call handoff", making the session list
unsortable. `mcp__ccd_session_mgmt__set_session_title` renames the CURRENT session
too — pass `session_id: "self"`.

From mhshaon98/agent-skills, MIT.

More from mhshaon98/agent-skills

Signals

Stars
0
Forks
0
Open issues
0
Last commit (this folder)
Oct 23, 2026 (7 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from mhshaon98

Cite this page

call-handoff skill. Agent Mart. https://agentmart.dev/skills/mhshaon98-call-handoff (last updated 2026-10-24)