Take the workshop
Not Rest Inc. · Session Harness · 7 of 8 · The deck, and building your own
The workshop's home is learn.not.rest. The full sixty-slide deck lives there: every stop on this walk at greater depth, plus a page for each of the thirty-two tools and each of the eleven hooks. It is browsable there, and inside this field.
Build your own
The rest of this stop is the part people actually ask for: how to add to a harness once it is running. Four additions, in rising order of blast radius.
Add a session — a role
There is no role variable. A role is set by prompt, and banked verbatim so it stays auditable afterwards.
text version
There is no role variable. A role is set BY PROMPT:
"You are the DIRECTOR for <project>" as the first message,
or a lane's commission text — which agent-ledger banks to
briefs/ verbatim, so the role is auditable afterwards.
owner ──► prompt names the role ──► session binds its scope
director ──► commission (contract + touch-only + NOTREST-GATES)
──► builder lane (lessons injected) ──► return + card
──► director gates; the card is banked by the hook
For a multi-session arrangement: new-fable-project.sh seeds one
blackboard per lane; fable-director runs them.
Add a session — a new project
Establishing the harness in a new folder is four steps, and an estate at an older protocol upgrades in place.
text version
1. cd the project · /notrest establish check ──► exit 6 (nothing established) establish ──► writes COORD.md + protocol block v3 establish check ──► exit 0 2. Open a session there: SessionStart hands the packet. 3. Work. Append ledger lines as the nudge asks. 4. /sessionend, or just close — the cushion covers you. An estate at an older protocol shows STALE (exit 5) and upgrades in place on the next establish, byte for byte.
Add a tool — a skill
Each step names the check that goes red if you skip it.
text version
1. skills/<name>/SKILL.md — folder name = front-matter name;
description carries a /verb trigger (eval TRIGGER-SANITY)
2. Contract, self-check, finish sections (eval WORKER-CONTRACT)
3. scripts/<tool>.py, named by the SKILL.md (eval SCRIPT-OWNS-SCANNING)
4. scripts/fixture.sh — exit 0 = all held (the battery)
5. Every cited path exists (eval REFERENCES-CITED)
6. Routable? add the verb to router.sh AND
oracle's routing table (eval ROUTE-TABLE-PARITY)
7. Name it on README, plugin README,
marketplace, tutorial, the render (doctor ROSTER PARITY,
RENDER SURFACES)
8. Add its files to the golden release
surface, say why in CHANGELOG (eval RELEASE-SURFACE)
Each step names the check that goes red if you skip it.
Add a tool — a hook
A hook is a kernel surface: it must fail open and silent, and it ships only through an adversarial round.
text version
1. hooks/<name>.sh — reads stdin with a bounded wait, exits 0 and prints nothing on any failure (fail open, silent), honors NOTREST_UNATTENDED=1 2. Wire it in hooks.json under its event, with a timeout on the command object 3. Add its arms to the hooks fixture: no-hang with an idle stdin, and the real effect with a real payload 4. eval HOOK-CONTRACT and doctor HOOKS go green 5. It is a kernel surface: a refuter round before it ships
Adding to a harness is the same discipline as working inside one: write it, measure it, enforce it — then let the checks tell you what you forgot.