Skip to content

Add a handoff skill and point .cn at it - #2

Merged
joshwand merged 4 commits into
mainfrom
handoff-skill
Aug 3, 2026
Merged

Add a handoff skill and point .cn at it#2
joshwand merged 4 commits into
mainfrom
handoff-skill

Conversation

@joshwand

@joshwand joshwand commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Adds skills/handoff/ — the third skill alongside memory-bank and interactive-planning — and points .cn at it.

The eval suite that was here has moved to #4, stacked on this branch, since it isn't ready.

Why

.cn currently carries its whole definition in one alias line: "give me a standalone prompt for the next agent to continue this process." That leaves the document's shape to the model, and what comes back is a session recap — what we covered, what was confirmed, what's next — addressed to nobody in particular. Fine to read, not much use to act on.

The comparison that motivated this: a handoff written to that shape opens with "This is for Josh, the developer of..." and closes with a suggestion. A good one opens with "You are continuing a multi-session implementation... steps 1-4 are done, committed at 1a0e936" and closes with a checklist. The difference is the sections, not the writing.

What the skill does

Output is written to the agent picking the work up, in the second person, and the sections are operative rather than retrospective:

Section Carries
What you are picking up what's being continued, what's already approved
Read first exact paths and commands, in load order, and which are authoritative over the handoff itself
State you inherit what's true now — SHAs, test counts, what's half-built and where, what's broken
Your scope what to do, in order, and explicitly where to stop
Standing constraints protected paths, hook/permission denials, things already ruled out, what to hand back
Open questions what's undecided, and which need a human rather than a judgment call
Definition of done verifiable exit criteria and what the final report should contain

Standing constraints is required — it's the section recaps never have and the one that saves the most rework. If a session produced none, the handoff says so in a sentence rather than dropping it.

Two deliberate rules. Precision is exempt from the prose rule: output stays plain prose, but paths, SHAs, test counts and error strings are reproduced verbatim, because a path the next agent can't paste is a broken handoff. And the old 200-400 word cap is gone — it was forcing exactly the vagueness the skill exists to prevent.

Notes

  • .cn moves from the command aliases into the prompt aliases, where the skill-backed ones (.ip, .um) live.
  • A section in the skill separates it from .ts: memory is the durable project record, a handoff is a one-shot briefing aimed at a specific next step. The handoff points at memory rather than duplicating it.
  • Merged main after Trim ruleset for the Claude 5 generation, and drop the installer #1 landed. The alias-table conflict resolved in main's favour on everything it touched (named agreements, .pi/.nd/.nyr); the only thing kept from this branch is .cn's move into the prompt aliases, which fits main's new convention of alias entries pointing at a name or a skill.

Verification

Cold read, plus a check against two real handoffs: every substantive block of a known-good one (ordered read list, inherited state with SHAs and counts, scope-and-stop boundary, protected paths and hook constraints, hand-back instruction, done criteria) has a home in the new format, and a discussion-only planning session still produces something sensible rather than collapsing into empty sections.

Net diff against main is three files: AGENTS.md, README.md, and the new skills/handoff/SKILL.md.

🤖 Generated with Claude Code

.cn described the whole behavior inline in one alias line: "give me a
standalone prompt for the next agent to continue this process." That
leaves the shape of the document entirely to the model, and what comes
back is a session recap — what we covered, what was confirmed, what is
next — addressed to nobody in particular.

The sections are the fix. A briefing for an agent is operative, not
retrospective: what to read and in what order, the state it inherits,
its scope and where to stop, the standing constraints, and a definition
of done. Constraints are the section that recaps never have and the one
that saves the most time, so it is required; if a session produced none,
the handoff says so rather than dropping it.

Output stays plain prose, but precision is exempted from the prose rule
— paths, SHAs, test counts and error strings are reproduced verbatim,
because a path the next agent cannot paste is a broken handoff. The old
200-400 word cap is gone; it was forcing exactly the vagueness the
skill is meant to prevent.

Moves .cn from the command aliases into the prompt aliases, alongside
.ip and .um, which is where the skill-backed ones live.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@joshwand
joshwand marked this pull request as ready for review August 3, 2026 01:11
The rewrite in the previous commit was justified by comparing two real
handoffs, one useful and one not. That comparison was the whole method,
and it was done by hand and thrown away. This keeps it.

Prompts regress in a way code doesn't: an edit can leave a skill still
producing something fluent and well organised that has quietly stopped
being actionable. Nothing fails. You find out two sessions later when an
agent starts on the wrong thing.

Two layers, because there are two kinds of failure. Format regressions
are mechanical, so lint_handoff.py decides them in stdlib Python — the
seven sections present and ordered, prose rule held, constraints not
empty, something paste-able actually named. Substance regressions need
judgment, so rubric.md carries 21 assertions for a model to grade,
weighted so that four load-bearing ones cap the score if failed.

The calibration pair is the part worth keeping honest. good.md and
bad.md are both written from case 01, and the grader scores them before
it scores anything real: good must clear 18, bad must stay under 10. A
grader that can't separate them is rewarding fluent prose, which is
precisely the failure this exists to catch — bad.md is fluent, well
organised, and useless, because it is what the skill produced before.

Three cases: the hard one with real state and constraints, a
planning-only session that tests whether required sections get padded
when there's nothing to put in them, and one blocked on a human where
two live options have to survive unchosen.

Fixtures are synthetic. evals/local/ is gitignored for grading real
handoffs without publishing project details.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@joshwand joshwand changed the title Add a handoff skill and point .cn at it Add a handoff skill, point .cn at it, and an eval suite Aug 3, 2026
Base automatically changed from worktree-trim-rules-for-claude5 to main August 3, 2026 01:24
joshwand and others added 2 commits August 2, 2026 18:27
Conflict was in the alias table, which both sides restructured. Main's
version wins on everything it touched: the named agreements, .pi and .nd
pointing at ProveItToMe and ItsNotDoneUntilItCompletelyWorks, and .nyr
moved up beside them.

The one thing kept from this branch is .cn's location. Main still had it
in the command aliases; here it sits in the prompt aliases next to .ip
and .um, because it now expands into a skill rather than a one-line
instruction, which is exactly the distinction that block draws.

That also fits main's new convention rather than fighting it: the alias
table entries point at a name or a skill instead of restating the rule
inline, so .cn describing its own output in two lines was the odd one
out either way.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The evals aren't ready and shouldn't hold up the skill. Moved to
handoff-evals, stacked on this branch, so this PR is just the skill,
the .cn wiring, and the README entry.

Removed here rather than rewritten out of the history, because this
branch is already pushed and under review and a force-push would throw
that away.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@joshwand joshwand changed the title Add a handoff skill, point .cn at it, and an eval suite Add a handoff skill and point .cn at it Aug 3, 2026
@joshwand
joshwand merged commit d0d55e5 into main Aug 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant