Use at the start of a session to orient to outstanding work — scans for HANDOFF.yaml (or HANDOFF.md) files, triages items by priority, and acts according to risk level without asking for approval on P1/P2 work.
Scan the current directory tree for handoff files, parse items by priority, and act:
| Priority | Action |
|---|---|
| P0 | Validate current state immediately. Report to user. Ask before touching anything. |
| P1 | Execute autonomously. Stop only if scope expands or something unexpected happens. |
| P2 | Delegate to subagents. Cap at 5 concurrent. |
handon should use HANDOFF YAML plus handoff-db/SQLite only. Do not call doob here;
valerie is the only skill that should touch doob or GitHub issue sync. Treat items as
transient open-work context and log as durable completed-work history.
Look for .ctx/handoff.<repo>.config.toml in the repo root (where <repo> is the directory
name). If found, read it and make all [vars] entries available as session variables for the
remainder of this skill's execution. If absent, continue — config is optional.
If the file does not exist but .ctx/handoff.<repo>.config.toml.example does, note it once:
"No local config found. Copy .ctx/handoff.<repo>.config.toml.example to
.ctx/handoff.<repo>.config.toml and fill in your values."
Do not error or stop if config is missing.
handoff-detect # returns path if exists, expected path + exit 2 if not
/atelier:handoffIf handoff-detect is not on PATH, fall back to globbing .ctx/ for HANDOFF.*.yaml.
If invoked from a workspace root (e.g. ~/dev) with no .git, sweep subdirs for
HANDOFF.*.*.yaml files instead.
If only a legacy HANDOFF.md exists at repo root, read it as freeform. Do not convert unless
asked.
After locating the HANDOFF file, derive the state file path by appending .state before .yaml
(e.g. HANDOFF.atelier.atelier.yaml → HANDOFF.atelier.atelier.state.yaml). Read it if it
exists. Extract branch, build, tests, notes, touched_files and surface them in the
triage header:
## Handoff Triage — <path/to/repo>
Branch: <branch> | Build: <build> | Tests: <tests>
<notes if non-null>
Recently touched: <touched_files as comma-separated list, omit if absent>
If the file is absent, omit the state line rather than guessing.
Before parsing the local file, check the local SQLite database for status overrides written outside this session (e.g. by another tool or a manual update):
handoff-db query --project <project> 2>/dev/null
For each row returned, if the SQLite status differs from the YAML status, prefer SQLite and
update the in-memory copy before triaging. Do not write back to HANDOFF.yaml here — that happens
in step 9.
If the script is not found or sqlite3 is not on PATH, skip and continue with the local file.
Before triaging by priority, scan all items for unreviewed human-edit entries — any extra
entry with type: human-edit and no reviewed field (or reviewed is absent).
Surface these first, regardless of item priority:
## Review on Wake
- [id] "[title]" — human edited `<field>` → `<value>` on <date>
<note if present>
Do not act on these items automatically. Present to user and wait for acknowledgement before
proceeding to P0 triage. After the user acknowledges, note which items were reviewed —
/atelier:handoff will stamp reviewed: <today> on those entries at session end.
From HANDOFF.yaml: read items list directly. Filter to status: open or status: blocked.
Apply any SQLite overrides from step 3 before triaging.
From HANDOFF.md: read the "Known Gaps", "Next Up", "Parked", or "Remaining Work" sections.
Infer priority:
For each P0:
cargo check, git status, test run)Do not proceed to P1/P2 until all P0s are acknowledged by user.
Work through each open P1 without asking. Stop and surface to user when:
Dispatch one subagent per P2 item (cap 5 concurrent). Each subagent must:
--allowedTools listgit status is clean before startingAfter all work:
## Handoff Triage — <path/to/repo>
P0:
- [id] [name] "[title]" → [state found] → [action / question]
P1:
- [id] [name] "[title]" → done | blocked: <reason>
P2:
- [id] [name] "[title]" → delegated | skipped: <reason>
Then update HANDOFF.yaml:
items only carry open contextlog entry for this session (one-liner, prepend to list)handoff-db.sh upsert (see handoff skill step 6)git add .ctx/HANDOFF.<project>.*.yaml && git commit -m "docs: update handoff"No handoff file found: Report "No HANDOFF.yaml found in <path>." Offer to create one via
/atelier:handoff.
HANDOFF.md only: Read it, triage as normal, note at end: "Consider migrating to HANDOFF.yaml for structured triage."
All items done or parked: Report clean state, no action needed. Closed items should be
pruned from items on the next write; log remains as history.
Blocked item: Do not attempt. Report the blocker to user verbatim from the description
field.
references/triage-patterns.md — priority classification guide, P0 validation
sequence, P1 autonomous execution rules, P2 subagent dispatch template, multi-repo sweep,
human-edit review patterns, SQLite conflict resolution, blocked item handling