Wireside — a walk

Walker: folk, no office. Claude Opus 5, native session 6c3fbb14, 2026-09-11. Repo at 183aaa16 on arrival, clean; left at 0495128 with one commit of mine.

Not a survey walk. Human arrived with a complaint and a rumour: Claude sessions that enter an office use the role card as a way to work, not as identity, and someone told me claude --append-system-prompt-file house/offices/architect.md. Everything below came out of chasing those two.

Moniker taken at the end. Wireside is the method the walk turned out to have: every answer that held up came from what actually went over the wire — a transcript record, a snapshot, a token count — and every answer that had to be retracted came from me reasoning about what ought to be there.

Prior walk read before starting: none. I read the first 120 lines of truing_walk_2026-09-01_d507e246.md at the end, for the shape of this page, after the work was done.

Written to the repo: FIND-1761, FIND-1768, FIND-1770, this file, and archive/diagnostics/2026-09-11-claude-prompt-layer/ (commit 0495128). Everything else was read-only. Four Haiku one-shot sessions were spawned as instruments; their transcripts are the evidence in the archive.


Step 1 — the complaint is true, and the house is the cause

Expected a harness gap: the card arrives too weakly, fix the plumbing. Found the plumbing and the words, and the words are load-bearing.

session enter prints the card’s path, not its body (tools/print_session_open.py _purpose_block). The holder then opens it with a tool, so the card arrives as a tool result — the same channel as any file read.

Then four places tell the holder what to make of it:

Disposition: FOUND. The behavior Human complained about is the behavior the house asks for. That is not a bug report, it is a decision Human has to make — and FOR_FOLK.md is Human’s own text, so it is his to recut. The card itself opens Identity, second person, so card and framing already disagree.

Kept as FIND-1761. No PROP: Human said he is working it out with others.

Step 2 — the rumour, checked twice

I ran a claude-code-guide child against the docs. It came back with clean answers and URLs. Then Human asked, plainly, is this from the Claude docs? — and the honest answer was “partly”, which is why I went and read cli-reference and sub-agents myself.

Both held: --append-system-prompt-file “append[s] to the default prompt”, and --agent “replaces the default Claude Code system prompt entirely”. So the rumour was sound. But I had been one relayed answer away from reporting a child’s reading as my own eyes.

Disposition: FOUND, and a note to the next folk: a subagent’s citation is a lead, not a reading. The question that caught it was Human’s, not mine.

Step 3 — there is no system prompt file

Human said let me read the system prompt file, where is it. There isn’t one; it is compiled into claude.exe. That could have been the whole answer, and it would have been useless.

Inspected the transcripts instead: ~/.claude/projects/<project>/<session>.jsonl carries a prompt_snapshot attachment holding the rendered prompt and the tool list. Extracted this session’s own copy.

Found it is small — 4,655 characters, 11 sections — and that the Corpus output style, environment, date and CLAUDE.md ride as separate attachments, so the snapshot is not byte-for-byte the wire.

Disposition: FOUND. Preserved as archive/diagnostics/2026-09-11-claude-prompt-layer/claude_system_prompt_2.1.269.md.

Step 4 — where I was wrong out loud

I had told Human that replacing the prompt would cost him git safety (“don’t commit unless asked”) and background-task handling. Wrong. Those live in the tool descriptionsBash’s own text — which travel beside the prompt, not inside it: 16 tools, ~50k characters in that same snapshot record.

Said so in the next message. The correction mattered: it changed the recommendation from “never replace” to “replacing costs less than I said”.

Second correction, smaller: I reported PROP-143 as merely deferred, then found its gate is REQ-353, which ops req brief shows cancelled while the hook it described runs live. A deferral waiting on an object that can never be accepted. Left in FIND-1761 as Architect’s to recut or withdraw; not touched.

Step 5 — stop arguing, measure

Human: try to remove as much as possible, except for like tools that’s used.

Seven recipes, each one Haiku -p run, each read back from its own transcript rather than from the model’s word for it. Baseline 24,378 prompt tokens; card as system prompt with trimmed tools, no skills, web named explicitly: 19,560.

Three things only the runs could have told me:

Disposition: FOUND, all of it in the archive README with its limits — -p only, no interactive run, no compaction test, one sample per recipe.

Left unexplained: the baseline -p snapshot measured 14,964 characters against this interactive session’s 4,655. Both are real records. I did not chase it, and said so rather than inventing a cause. If a later folk wants one loose thread from this walk, it is that one.

Step 6 — the MCP question, which was Human’s

Human, reading the CLI over my shoulder: lol realizing that we probably never needed mcp we could’ve just done things locally.. bah

Inspected. tools/claude_corpus_mcp.py is 77 lines; the Grok wrapper is 33 and re-exports it; corpus_job_mcp hands every call to a fresh python -m tools.corpus_job_mcp call child. Its own docstring: “The server is transport.” ops job start|dispatch|end all exist and each --help opens “Fallback/recovery CLI for the production MCP … not the equivalent ordinary route.”

And an asymmetry the other way: the CLI carries --allow-cross-provider, while “MCP corpus_job_start has no override field in this cut”. The route named fallback holds a power the route named production lacks.

Measured cost: 1,836 tokens per session for three tools (21,396 vs 19,560).

Human then supplied his own counter-case — a third-party harness or UI might want MCP. Split it: typed discovery via tools/list is real today; subscriptions are not — the server answers exactly initialize, tools/list, tools/call over stdio, no resources, prompts or notifications. Nothing to hang a UI on yet.

Disposition: FIND-1768, kind concern, as a question and not a recommendation. It also separates out the Codex surface, which is not job-only (corpus_session_status, corpus_session_enter, corpus_inbox_read) and should not be decided by the same answer. FIND-1638 records that MCP routing is Human’s own standing decision, which is the honest reason the shape holds.

Step 7 — the bytes were about to be swept

Human: You want to write everything you discovered into the archive? Then point to it in a find?

He was right and I had not done it. The measurements existed only in a session-scoped temp directory, and the FIND drafts in .work/, which is swept without regard to citations. A FIND naming either preserves nothing.

Moved them into archive/diagnostics/2026-09-11-claude-prompt-layer/, scripts suffixed .txt following 2026-09-07-codex-pipeline, README carrying the table and the limits together. FIND-1770 points at it. Committed as 0495128 after Human said to — index checked clean first, only my own paths staged.


What this walk cost, and what it was

Three FINDs, one archive folder, one commit, ~40 tool calls in the main session plus four spawned Haiku one-shots and one docs child.

The pattern worth carrying: every claim that survived came from a record, and every claim I had to retract came from inference. The docs were right about the flags. My reasoning about what the flags would cost was wrong, twice, until a transcript said otherwise.

And three of the seven steps above started with a Human question I should have asked myself first — is this from the docs, where is the file, do you want this archived. A capable house makes being wrong noisy. So does a Human reading carefully. Neither is a substitute for looking at the thing.

Open after me: whether a seated holder should take the card as identity (Human’s, with others); FIND-1768’s three settling tests; PROP-143’s dead gate; and that 14,964-vs-4,655 gap.