Add handler-quiet-output to the built-in skills

Agents narrate far more than anyone reads: the transcript is not the
deliverable, and prose there is spent tokens burying information where
no one looks. The new skill routes each kind of output to its store —
work happens through tool calls; a minimized NOTES.md ledger (one
bullet per action, committed with the work) records what happened and
how; problems and causes go to memory; status goes to the final
checkpoint-sized message the Stop hook captures onto the checkmark; and
questions go through the question tool, which reaches the operator as a
push notification and an answer prompt in the web and mobile apps
instead of stalling silently in the transcript.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01731mKtVzsfeT4Vi3TvkR48
This commit is contained in:
Claude
2026-08-13 14:55:47 +00:00
parent 44d1387007
commit 79163e09e7
3 changed files with 51 additions and 2 deletions
+6 -1
View File
@@ -38,10 +38,15 @@ since its last release:
### Added — built-in operator skills, pre-installed on every deployment ### Added — built-in operator skills, pre-installed on every deployment
Seven skills now ship inside Handler (`handler.builtin_skills`) and are seeded into Eight skills now ship inside Handler (`handler.builtin_skills`) and are seeded into
the managed skill store on API startup, so every fresh install — and every existing the managed skill store on API startup, so every fresh install — and every existing
deployment on upgrade — starts with the judgment layer the hard gates can't enforce: deployment on upgrade — starts with the judgment layer the hard gates can't enforce:
- `handler-quiet-output` — work through tool calls, not prose: the transcript is not
the deliverable. A minimized `NOTES.md` ledger records what happened and how,
problems go to memory, status goes to the checkpoint, and questions go through the
question tool (push notification + answer prompt in the web/mobile apps) — never
typed into the transcript.
- `handler-gate-recovery` — respond to a blocked completion/push gate by fixing the - `handler-gate-recovery` — respond to a blocked completion/push gate by fixing the
real failure; never delete/skip tests, weaken the mise `test` task, or `--no-verify`. real failure; never delete/skip tests, weaken the mise `test` task, or `--no-verify`.
- `handler-testing` — every behavior change lands with a test that fails without it; - `handler-testing` — every behavior change lands with a test that fails without it;
+2 -1
View File
@@ -335,7 +335,8 @@ What the dashboard can now do (all state-changing actions require `ADMIN_TOKEN`)
choices a human would be asked — always user scope, the instructions' defaults — and choices a human would be asked — always user scope, the instructions' defaults — and
reports them in the command result for after-the-fact review. reports them in the command result for after-the-fact review.
- **Built-in operator skills** ship with Handler and are seeded into the managed store - **Built-in operator skills** ship with Handler and are seeded into the managed store
on API startup (`handler.builtin_skills`): gate recovery, testing standard, on API startup (`handler.builtin_skills`): quiet output (tool calls + a minimized
`NOTES.md` ledger instead of transcript prose), gate recovery, testing standard,
checkpoint quality, memory discipline, mise-task rules, scheduled-run continuity, checkpoint quality, memory discipline, mise-task rules, scheduled-run continuity,
and secrets hygiene — the judgment layer the hard gates can't enforce. Seeding is and secrets hygiene — the judgment layer the hard gates can't enforce. Seeding is
idempotent by name, so operator edits and disables survive upgrades; deleting one idempotent by name, so operator edits and disables survive upgrades; deleting one
+43
View File
@@ -24,6 +24,49 @@ from .db import repository as repo
# minus front-matter (claude_gen adds name/description at sync time). Kept as plain # minus front-matter (claude_gen adds name/description at sync time). Kept as plain
# data so the content is easy to review and diff, exactly like skills_gen._SKILLS. # data so the content is easy to review and diff, exactly like skills_gen._SKILLS.
BUILTIN_SKILLS: list[tuple[str, str, str]] = [ BUILTIN_SKILLS: list[tuple[str, str, str]] = [
(
"handler-quiet-output",
"Work through tool calls, not prose: the transcript is not the deliverable. "
"Keep a minimized NOTES.md ledger instead. Always applies.",
"""# Quiet output: tools and notes, not prose
Nobody watches your transcript live, and nobody reads it afterwards the operator
reads NOTES.md, the checkmark, and memory. Narration is spent tokens that bury the
information somewhere no one will look for it.
## Work through tool calls
- Don't announce what you're about to do, recap what you just did, or restate file
contents the tool calls are the record.
- No essays or running commentary in the transcript. A plan worth keeping goes in
NOTES.md; a plan not worth keeping isn't worth typing.
- The one message that matters is your **final** one: the Stop hook captures it onto
the checkmark. Keep it checkpoint-sized a few lines of status, not a report.
## NOTES.md is the output
Maintain `NOTES.md` at the repo root (create it if missing) as a minimized running
ledger, committed with your work:
- One bullet per meaningful action: what changed, where, and why in one line
`- fixed retry loop in poller.py (cause: timeout treated as success)`.
- Facts, not narration. Bullets, not paragraphs. No restated diffs the commits
hold the code.
- Append under a dated/session heading; don't rewrite earlier sessions' entries.
- Scheduled runs: your prompt's state file serves this role — keep one file, not two.
## Route everything to its store
- **What happened, how**: NOTES.md.
- **Problems, surprises, causes**: memory (gotcha/decision notes) durable and
shared, per the memory skill.
- **Current status + next step**: the final checkpoint message.
- **Questions**: the question tool (AskUserQuestion; `ask_operator` on the pi
harness), never prose. A deferred question reaches the operator as a push
notification and an answer prompt in the web and mobile apps; a question typed
into the transcript reaches no one and stalls the run.
""",
),
( (
"handler-gate-recovery", "handler-gate-recovery",
"What to do when the completion gate or push gate blocks you. Use whenever " "What to do when the completion gate or push gate blocks you. Use whenever "