EXAMPLES.md
# handoff worked examples
## 1. Resume with an open question
User: "Where were we?"
Project cwd: `/Users/dev/app`. Invocation:
```json
memory_sessions { "limit": 20 }
```
Response:
```json
{
"sessions": [
{ "id": "7f3a9c21", "cwd": "/Users/dev/app", "title": "Auth refresh rework",
"status": "completed", "startedAt": "2026-06-07T09:00:00Z",
"summary": "Reworked refresh rotation. Open: should logout revoke all device tokens?",
"concepts": ["jwt-refresh-rotation", "logout"] }
]
}
```
Pull supporting context:
```json
memory_recall { "query": "jwt-refresh-rotation logout", "limit": 10 }
```
Present:
> Resuming `7f3a9c2` "Auth refresh rework".
> **Open question:** should logout revoke all device tokens or just the current one?
> Touched `auth/refresh.ts`, `auth/logout.ts`. Refresh rotation is done.
> **Next step:** decide the revoke scope, then finish `auth/logout.ts`.
## 2. Sibling-repo guard
Project cwd: `/Users/dev/repo-a`. Sessions include one with `cwd:
/Users/dev/repo-a-staging`.
A raw prefix would match `repo-a-staging`. The boundary check rejects it because
`/Users/dev/repo-a-staging` does not equal `/Users/dev/repo-a` and does not start
with `/Users/dev/repo-a/`. Pick the real `repo-a` session instead, or fall back
to the most recent session overall if none matches.
## 3. Empty session
User: "Resume."
If the matched session has zero observations:
> The most recent session `c98f110` for this project has no recorded
> observations. Nothing to hand off. Want to start fresh from the current state?
SKILL.md
---
name: handoff
description: Resume the most recent agent session for the current working directory, leading with any unanswered question. Use when the user says "where were we", "resume", "handoff", "pick up where I left off", or starts a session with no fresh context.
argument-hint: "[optional cwd override]"
user-invocable: true
---
The user wants to resume work. Optional cwd override: $ARGUMENTS
## Quick start
```json
memory_sessions { "limit": 20 }
```
Pick the most recent session whose `cwd` matches this project, then:
`memory_recall { "query": "<session top concepts>", "limit": 10 }`.
Expected output:
```text
Resuming 7f3a9c2 "Auth refresh rework".
Open question: should logout revoke all device tokens or just the current one?
Next step: decide revoke scope, then update auth/logout.ts.
```
## Why
Match the session by directory boundary, not raw prefix, so a sibling repo never
gets mistaken for this one. Never invent observations for an empty session.
## Workflow
1. Resolve the project path: if `$ARGUMENTS` is given, normalize it to absolute
(`path.resolve(process.cwd(), $ARGUMENTS)`); else use the cwd.
2. Call `memory_sessions`. Pick the most recent session whose normalized `cwd`
matches by directory boundary: equality, OR `cwd.startsWith(projectPath + sep)`,
OR `projectPath.startsWith(cwd + sep)`. Prefer `completed` over `abandoned`.
No match: fall back to the single most recent session overall.
3. If the session ended on an unanswered user-facing question, surface it FIRST.
Look in `summary` or recent `conversation` observations whose `narrative`
ends in `?`.
4. Summarize: title/summary, key files, key decisions or errors, using
`memory_recall` on the top concepts, limit 10.
5. End with one concrete "next step?" pointer.
## Anti-patterns
WRONG: `session.cwd.startsWith(projectPath)` matches `/repo-a-staging` when the
project is `/repo-a`, resuming the wrong repo's session.
RIGHT: `session.cwd === projectPath || session.cwd.startsWith(projectPath + sep)`,
a directory-boundary check that cannot cross sibling repos.
## Checklist
- cwd override resolved to an absolute, normalized path.
- Match used a directory-boundary check, not a raw prefix.
- Unanswered question (if any) leads the response.
- Empty session is reported plainly, with an offer to start fresh.
## See also
- `recap`, `session-history`, `recall`: same session data, broader views.
## Troubleshooting
See ../_shared/TROUBLESHOOTING.md if `memory_sessions` or `memory_recall` is not available.