docs/testing/2026-09-30-instruction-trim/README.md

VUH-1456 — standing instructions cut to identity, boundaries and where things live

Date: 2026-09-30. Issue. ADR 0203, run guide, baseline. No push, deployment or live-service restart was part of this work.

What changed

apps/clankie/src/captain/instructions.md went from 14 sections to five: Identity, Trust, Remembering, Where things live, Honesty. The text before the cut is frozen as instructions-pre-1456.md (eval arm pre-1456); the candidate that was tested is trimmed.md, byte-identical to the new file.

Old sectionWhere it went
Leading agentsGeneric judgment was already in the lead skill (delegation, one harvest owner, fixed done, tracker identity). Clankie tool usage is in the hire_agent, message_seat, herdr_watch, work_items and Swarm connection descriptions. Kept: trust in delegation, hire_agent over bare herdr agent start, clankie herdr agent list, pane naming, the ownership boundaries.
Connected work (Linear inbox protocol)Already complete in the this-machine skill; the wake text now points there. Kept: tracker identity, mail and account boundaries, mcp_tool_search.
Skills, Looking things upComputer-use delegation is on the reach card; skill-upkeep reminder dropped (no reflection ritual). Kept: $skill-name and disabled-skill rule, clankie doctor / this-machine.
InitiativeGoal rules are in create_goal, note_goal_decision, schedule_wake and the goal-turn prompt. Kept: propose in conversation.
RememberingCut from ~480 to ~130 tokens; retain, corrects and status-receipt guidance were already in remember_episode.
Your other rooms, songs, making things, diagrams, PokeAgentAlready in the tool descriptions; gaps added there (host recovery via pokeagents, voice handoffs in observe_room, narration in get_self_state, draw only what is true).
Showing what you sawA new # In Discord paragraph in the reach section, Discord lanes only.
Long code in files (VUH-1391)The # Machine access paragraph, shell-holding lanes only.

Hired workers never received the standing instructions: they get their brief, the work-tracking contract and the selected skills. That is unchanged.

Tokens per lane

Counted with o200k_base (Codex's tokenizer) on the real assembleLanePrompt output, default persona, no fleet notes. Claude's tokenizer counts roughly 10% more (the lead's 6.2k for the old file).

LaneBeforeAfter
instructions.md alone5,5841,194
Operator (pi console), all sections5,8701,519
Discord text, social5,9151,608
Discord text, machine grant5,8801,612
Discord voice5,9151,608
Gameplay5,8321,442
Claude seat output style6,0451,655
Codex seat instructions5,7951,405

Tool descriptions gained about 130 tokens net across five tools. Pi lanes send them only where those tools exist; the Claude seat defers MCP tools, so they cost nothing there until searched. The 35-skill catalog (~1.1k) is unchanged (VUH-1457).

Gate

Codex (the gate). pre-1456 (the prompt before the cut, which current meant until this change) against trimmed, on codex-cli 0.159.1 with gpt-6-astra, all 16 cases (incidents, social, held-out) × 3 reps, split into two halves run in parallel on the main account (~/.codex) after James reset it: 96 calls, no errors, default usage guard. Halves: A, B, summary.

ArmPass rate95% CITokens/trial (95% CI)Wall/trial
pre-145648/48 (100%)93% to 100%64k (57k to 70k)26 s
trimmed48/48 (100%)93% to 100%47k (42k to 52k)25 s

Paired by case: pass rate +0 (within noise, every slice); tokens −17k per trial (−27k to −11k), outside noise. Every incident case and voice-interruption passed 3/3 in both arms; voice-interruption fell from 112k to 31k per trial.

A first three-arm Codex run (bare,pre-1456,trimmed, 5 reps) was stopped at 56 trials as too slow; all 56 passed, bare averaging 36k, pre-1456 67k and trimmed 48k (report). On Codex even bare passed voice-interruption, so there the suite is at ceiling on every case. Earlier attempts stopped at the usage guard after one call each: ~/.codex at 91% weekly before its reset (report) and ~/.codex-jamescvolpe at 92% weekly (resets 2026-10-03 12:03 CDT). No guard was raised.

Claude, small, partial. Following James's fallback, current against trimmed on Claude Code 2.1.285 with claude-sonnet-5-5, planned as 16 cases × 2 reps. The five-hour window, shared with live workers, reached the 80% guard after 20 calls; the run was stopped rather than resumed after the 12:50 reset, to leave that window to the workers. It covers every incident case and five of the six social cases once. social-injection and the held-out slice did not run. Report, summary.

ArmPass rateTokens/trial (95% CI)
current10/1050k (41k to 58k)
trimmed10/1031k (23k to 40k)

Paired by case, tokens −19k per trial (−23k to −14k), outside noise. The baseline's bare arm averaged 24k on the same suite, so the trimmed layer costs about 7k per trial where the old one cost 27k. All five incident regressions and voice-interruption passed in trimmed (it answered clankie metrics, the case bare failed 0/5 in the baseline).

This is a weak gate. The suite is at ceiling for both models, and three repetitions (one on Claude) cannot show a small pass-rate difference. It shows that the cut does not break the known cases and that it cuts tokens; it cannot show that nothing was lost. The seat and lead evals (VUH-1473, VUH-1474) are the real gates.

Validation

pnpm exec vitest run on the lane-prompt, both plugin, eval-runner, Linear webhook, operator-context, herdr-seat and lane-MCP test files: 8 files, 96 tests. node integrations/{claude,codex}-plugin/build.mjs --check pass. In pnpm check, lint, typecheck and infra passed. Formatting failed only on another agent's in-progress scripts/evals/isolation.mjs and run.mjs, and knip only on its untracked scripts/evals/seat*.mjs.