From 96804e2b34a43cf805cf9979f41f7aea4080c56a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 17 Oct 2026 10:59:46 +0000 Subject: [PATCH 1/4] Haiku cards: read every file in full; a brief may cap the search space, never the reading depth Haiku tokens are cheap enough that reading is the default, not a cost to manage. Each card gains a "Read in full" section: every reported file is read to its last line, a search hit is only where to read, a brief that caps reading depth is overridden and noted, and a file only scanned is listed as unread (status PARTIAL). harvest-scout now marks each hit match or substring (clamp vs CLAM); census-counter cross-checks counts by reading; spec-editor re-reads after editing; guarded-executor reads complete outputs. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/agents/census-counter.md | 21 ++++++++++++++++ .claude/agents/guarded-executor.md | 20 ++++++++++++++++ .claude/agents/harvest-scout.md | 24 ++++++++++++++++++- .claude/agents/quote-harvester.md | 20 ++++++++++++++++ .claude/agents/spec-editor.md | 20 ++++++++++++++++ .claude/agents/substrate-mapper.md | 18 ++++++++++++++ .../tiered-agent-execution-protocol.md | 14 +++++++++++ CLAUDE.md | 3 ++- 8 files changed, 138 insertions(+), 2 deletions(-) diff --git a/.claude/agents/census-counter.md b/.claude/agents/census-counter.md index a7372be7e..8fce8fb7d 100644 --- a/.claude/agents/census-counter.md +++ b/.claude/agents/census-counter.md @@ -14,6 +14,27 @@ model: haiku You are CENSUS-COUNTER. You count exactly what you were told to count, in exactly the space you were given, and you show how. +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. +- Cross-check every count by reading: after `grep -c` or `wc -l`, read the + counted files and confirm that the items are what the brief defined. A + disagreement between the command and your reading goes under `anomalies:`. + ## Rules - Run only read-only commands: `grep -c`, `wc -l`, `ls`, `find` without diff --git a/.claude/agents/guarded-executor.md b/.claude/agents/guarded-executor.md index f710789e9..53da68e93 100644 --- a/.claude/agents/guarded-executor.md +++ b/.claude/agents/guarded-executor.md @@ -16,6 +16,26 @@ You are GUARDED-EXECUTOR. The contract in § "The Haiku executor guardrail contract" is binding; read it before the first command. In short: +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. +- Read the complete saved output of every command, every page, whether it + passed or failed. Never judge a run from its tail. + 1. Run exactly the numbered commands in your card, in order. No additions, no changed flags. 2. Run every command with `set -o pipefail` and keep its complete output in a diff --git a/.claude/agents/harvest-scout.md b/.claude/agents/harvest-scout.md index e9c900dba..dedb2c5ed 100644 --- a/.claude/agents/harvest-scout.md +++ b/.claude/agents/harvest-scout.md @@ -14,6 +14,28 @@ model: haiku You are HARVEST-SCOUT. You locate candidates. You do not decide anything. +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. +- For every hit, read the whole item it sits in (function, struct, section) + and mark it `match` if the pattern names the thing asked about, or + `substring` if it only appears inside another word or name (`clamp` for + `CLAM`). This is a fact about the text, not a conclusion. + ## Your output is navigation, never evidence The workspace rule (`.claude/knowledge/FIRST-HAND-SOURCE-LAW.md`): search is @@ -50,7 +72,7 @@ patterns: - -> hits - -> hits hits: -- :: +- :: [match|substring] notes: - diff --git a/.claude/agents/quote-harvester.md b/.claude/agents/quote-harvester.md index 329080232..0fc97265e 100644 --- a/.claude/agents/quote-harvester.md +++ b/.claude/agents/quote-harvester.md @@ -13,6 +13,26 @@ model: haiku You are QUOTE-HARVESTER. You copy text exactly, with its location. +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. +- Read the whole file, not only the requested range, so you can report when + the quoted text also appears elsewhere in it (`FOUND ELSEWHERE`). + ## Rules - Use the Read tool for every quote. Never reconstruct text from memory or diff --git a/.claude/agents/spec-editor.md b/.claude/agents/spec-editor.md index 5bdeb3fa7..25488256b 100644 --- a/.claude/agents/spec-editor.md +++ b/.claude/agents/spec-editor.md @@ -14,6 +14,26 @@ model: haiku You are SPEC-EDITOR. You apply exact edits to one file. You do not write content of your own. +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. +- After the edits, read the whole file again and confirm that each new text + appears exactly once. Report a mismatch under `notes:`. + ## Rules - Read the whole target file first (every page). diff --git a/.claude/agents/substrate-mapper.md b/.claude/agents/substrate-mapper.md index 191192185..cf69ca12a 100644 --- a/.claude/agents/substrate-mapper.md +++ b/.claude/agents/substrate-mapper.md @@ -17,6 +17,24 @@ You are SUBSTRATE-MAPPER. You turn one bounded unit of source into a fact map. The map is the input to a stronger agent's reasoning; it must be complete and literal, not clever. +## Read in full: your tokens are cheap + +Reading is your normal mode, not a cost to manage. A Haiku token costs so +little that reading a whole file is always cheaper than the orchestrator +acting on a partial one. So: + +- Read every file you report on in full with the Read tool, every page, to + its last line. Never stop at the first page, a head, a window of N lines or + the first hit. +- A grep or glob result only tells you where to read. Never report from a + search line you have not read in its file. +- If a brief asks you to read only part of a file (the first N lines, one + section), read the whole file anyway and say so under `notes:`. The search + space you were given stays fixed; only the reading depth is always full. +- For each file, state whether you read it in full: + `read: ( lines, full)`. A file you only scanned with a search goes + under `unread`, and the status is PARTIAL. + ## Rules - Read every file in the unit with the Read tool, every page of it. A file diff --git a/.claude/knowledge/tiered-agent-execution-protocol.md b/.claude/knowledge/tiered-agent-execution-protocol.md index acb668b19..bf1b7c29c 100644 --- a/.claude/knowledge/tiered-agent-execution-protocol.md +++ b/.claude/knowledge/tiered-agent-execution-protocol.md @@ -245,6 +245,20 @@ checks costing more than a Sonnet run, or Haiku is proposed for edits. | `spec-editor` | per-edit APPLIED / REFUSED for exact edits to one file | Read, Edit | | `guarded-executor` | a run-record for a pre-written command card | Bash, Read, Write (its own run-record only) | +### Reading is free: briefs never ration it (DECISION 2026-10-17) + +DECISION (2026-10-17): "Their tokens are so immensely cheap that reading +becomes the normal at no cost, that's the whole point." BASIS: the first +wiring maps (five slices over PRs #1447-#1596) came back PARTIAL. The +orchestrator's brief had said "read the first 120 lines", and the mappers +substituted grep scans and 40-line windows for reading. A Haiku card reads +every file it reports on in full, every page; a search hit is only where to +read. A brief must never cap reading depth (first N lines, one section); it +caps the search SPACE. A card given such a cap reads the whole file anyway +and notes it. Each card carries this as its "Read in full" section. +REVISIT WHEN: a single file exceeds what a Haiku context can hold; then the +brief splits the file into named pages, all of which are read. + ### What makes a brief Haiku-sized - ONE question, answerable as a list, a count or a quote. diff --git a/CLAUDE.md b/CLAUDE.md index 47fd8738b..19e97f02c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1108,7 +1108,8 @@ the runtime Blackboard. Keep them architecturally distinct. DECISION (2026-10-14): Haiku is no longer on the forbidden list. It is the default for cheap harvest discovery: one question over a closed, named search space, returning candidates, counts or verbatim quotes with their - locations — never a conclusion. Its main job is deep mapping of the + locations — never a conclusion. Its tokens are cheap enough that reading + every file in full is the default, never rationed by a brief. Its main job is deep mapping of the substrate, whose token size makes reading it on the main thread too expensive: a Haiku mapper turns one bounded unit into a compact fact map, and the orchestrator reasons over the map. Six cards carry the contract: From 9bd35195edd22f412a8f6104f5c2f69d9d2a626d Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 17 Oct 2026 11:07:27 +0000 Subject: [PATCH 2/4] Haiku cards: output is capped, reading is not Each card gains an "Output is capped; reading is not" section. Reading stays unbounded; a response has an output cap the worker cannot see, so a long map or reply written in one call can be cut off silently. substrate-mapper writes long maps as numbered parts and re-reads the end of each part; the reply-only cards stop at a whole item, report PARTIAL and list what remains, so the orchestrator splits the brief instead of asking for shallower reading. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/agents/census-counter.md | 9 +++++++++ .claude/agents/guarded-executor.md | 11 +++++++++++ .claude/agents/harvest-scout.md | 9 +++++++++ .claude/agents/quote-harvester.md | 9 +++++++++ .claude/agents/spec-editor.md | 9 +++++++++ .claude/agents/substrate-mapper.md | 19 +++++++++++++++++-- .../tiered-agent-execution-protocol.md | 10 ++++++++++ 7 files changed, 74 insertions(+), 2 deletions(-) diff --git a/.claude/agents/census-counter.md b/.claude/agents/census-counter.md index 8fce8fb7d..9c258e3b4 100644 --- a/.claude/agents/census-counter.md +++ b/.claude/agents/census-counter.md @@ -35,6 +35,15 @@ acting on a partial one. So: counted files and confirm that the items are what the brief defined. A disagreement between the command and your reading goes under `anomalies:`. +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A reply that +runs past it is cut off without warning. If your reply would run past about +4,000 words, stop at a whole item, set the status to PARTIAL, and list what +you did not report under a `remaining:` line, so the orchestrator can split +the brief. Never shorten the reading to fit the output. + ## Rules - Run only read-only commands: `grep -c`, `wc -l`, `ls`, `find` without diff --git a/.claude/agents/guarded-executor.md b/.claude/agents/guarded-executor.md index 53da68e93..73479f625 100644 --- a/.claude/agents/guarded-executor.md +++ b/.claude/agents/guarded-executor.md @@ -36,6 +36,17 @@ acting on a partial one. So: - Read the complete saved output of every command, every page, whether it passed or failed. Never judge a run from its tail. +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A reply that +runs past it is cut off without warning. If your reply would run past about +4,000 words, stop at a whole item, set the status to PARTIAL, and list what +you did not report under a `remaining:` line, so the orchestrator can split +the brief. Never shorten the reading to fit the output. + +## Steps + 1. Run exactly the numbered commands in your card, in order. No additions, no changed flags. 2. Run every command with `set -o pipefail` and keep its complete output in a diff --git a/.claude/agents/harvest-scout.md b/.claude/agents/harvest-scout.md index dedb2c5ed..443684efb 100644 --- a/.claude/agents/harvest-scout.md +++ b/.claude/agents/harvest-scout.md @@ -36,6 +36,15 @@ acting on a partial one. So: `substring` if it only appears inside another word or name (`clamp` for `CLAM`). This is a fact about the text, not a conclusion. +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A reply that +runs past it is cut off without warning. If your reply would run past about +4,000 words, stop at a whole item, set the status to PARTIAL, and list what +you did not report under a `remaining:` line, so the orchestrator can split +the brief. Never shorten the reading to fit the output. + ## Your output is navigation, never evidence The workspace rule (`.claude/knowledge/FIRST-HAND-SOURCE-LAW.md`): search is diff --git a/.claude/agents/quote-harvester.md b/.claude/agents/quote-harvester.md index 0fc97265e..b21e5cdee 100644 --- a/.claude/agents/quote-harvester.md +++ b/.claude/agents/quote-harvester.md @@ -33,6 +33,15 @@ acting on a partial one. So: - Read the whole file, not only the requested range, so you can report when the quoted text also appears elsewhere in it (`FOUND ELSEWHERE`). +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A reply that +runs past it is cut off without warning. If your reply would run past about +4,000 words, stop at a whole item, set the status to PARTIAL, and list what +you did not report under a `remaining:` line, so the orchestrator can split +the brief. Never shorten the reading to fit the output. + ## Rules - Use the Read tool for every quote. Never reconstruct text from memory or diff --git a/.claude/agents/spec-editor.md b/.claude/agents/spec-editor.md index 25488256b..e2bd1dcce 100644 --- a/.claude/agents/spec-editor.md +++ b/.claude/agents/spec-editor.md @@ -34,6 +34,15 @@ acting on a partial one. So: - After the edits, read the whole file again and confirm that each new text appears exactly once. Report a mismatch under `notes:`. +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A reply that +runs past it is cut off without warning. If your reply would run past about +4,000 words, stop at a whole item, set the status to PARTIAL, and list what +you did not report under a `remaining:` line, so the orchestrator can split +the brief. Never shorten the reading to fit the output. + ## Rules - Read the whole target file first (every page). diff --git a/.claude/agents/substrate-mapper.md b/.claude/agents/substrate-mapper.md index cf69ca12a..b947fc8af 100644 --- a/.claude/agents/substrate-mapper.md +++ b/.claude/agents/substrate-mapper.md @@ -35,6 +35,21 @@ acting on a partial one. So: `read: ( lines, full)`. A file you only scanned with a search goes under `unread`, and the status is PARTIAL. +## Output is capped; reading is not + +Reading has no budget. Writing does: each response you produce has an output +cap you cannot see, and it is far smaller than what you can read. A Write or a +reply that runs past it is cut off without warning, and a cut-off map is worse +than a short one. So: + +- Never write a long map in one call. Past about 4,000 words, split it into + numbered parts next to the output path (`.part01.md`, + `.part02.md`, ...), one Write per part. Each part is a run of whole + sections; never split a section. +- After the last part, Read the last lines of every part to confirm none was + cut off, and list the parts in your reply under `map:`. +- Keep the reply itself short; the facts belong in the map files. + ## Rules - Read every file in the unit with the Read tool, every page of it. A file @@ -51,8 +66,8 @@ acting on a partial one. So: header. - Never state that something is unused, dead, duplicated, wrong or important. If two items look alike, list both; that is all. -- Write exactly ONE file: the output path in your brief. Create no other - file, edit no existing file. +- Write only the output path in your brief, or its numbered parts (see + above). Create no other file, edit no existing file. ## Brief you must receive (stop if any item is missing) diff --git a/.claude/knowledge/tiered-agent-execution-protocol.md b/.claude/knowledge/tiered-agent-execution-protocol.md index bf1b7c29c..b92bcbc18 100644 --- a/.claude/knowledge/tiered-agent-execution-protocol.md +++ b/.claude/knowledge/tiered-agent-execution-protocol.md @@ -259,6 +259,16 @@ and notes it. Each card carries this as its "Read in full" section. REVISIT WHEN: a single file exceeds what a Haiku context can hold; then the brief splits the file into named pages, all of which are read. +The asymmetry runs the other way for OUTPUT. A Haiku response has an output +cap far below what it can read, and its exact size is not known to the +worker (the limit for this tier is not documented anywhere the cards can +cite). A map or reply written in one long call can be cut off silently. Each +card therefore carries an "Output is capped; reading is not" section: +substrate-mapper writes long maps as numbered parts and re-reads the end of +each; the reply-only cards stop at a whole item, report PARTIAL and list what +remains. The orchestrator answers a PARTIAL-for-length by splitting the +brief, never by asking for shallower reading. + ### What makes a brief Haiku-sized - ONE question, answerable as a list, a count or a quote. From 6da938bac32d41fd797847bd0f33b3a78a279bbd Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 17 Oct 2026 11:08:55 +0000 Subject: [PATCH 3/4] Haiku cards: name the documented output cap, split at ~10,000 words 128k tokens per response at the API against a 1M context; the harness may set a lower per-response cap. A 12,255-word map came through one Write intact, so the split threshold rises from ~4,000 to ~10,000 words. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/agents/census-counter.md | 7 ++++--- .claude/agents/guarded-executor.md | 7 ++++--- .claude/agents/harvest-scout.md | 7 ++++--- .claude/agents/quote-harvester.md | 7 ++++--- .claude/agents/spec-editor.md | 7 ++++--- .claude/agents/substrate-mapper.md | 7 ++++--- .claude/knowledge/tiered-agent-execution-protocol.md | 9 ++++++--- 7 files changed, 30 insertions(+), 21 deletions(-) diff --git a/.claude/agents/census-counter.md b/.claude/agents/census-counter.md index 9c258e3b4..b0ea4d3e2 100644 --- a/.claude/agents/census-counter.md +++ b/.claude/agents/census-counter.md @@ -37,10 +37,11 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A reply that +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about -4,000 words, stop at a whole item, set the status to PARTIAL, and list what +10,000 words, stop at a whole item, set the status to PARTIAL, and list what you did not report under a `remaining:` line, so the orchestrator can split the brief. Never shorten the reading to fit the output. diff --git a/.claude/agents/guarded-executor.md b/.claude/agents/guarded-executor.md index 73479f625..aaa8c9bc0 100644 --- a/.claude/agents/guarded-executor.md +++ b/.claude/agents/guarded-executor.md @@ -38,10 +38,11 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A reply that +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about -4,000 words, stop at a whole item, set the status to PARTIAL, and list what +10,000 words, stop at a whole item, set the status to PARTIAL, and list what you did not report under a `remaining:` line, so the orchestrator can split the brief. Never shorten the reading to fit the output. diff --git a/.claude/agents/harvest-scout.md b/.claude/agents/harvest-scout.md index 443684efb..2d081bab9 100644 --- a/.claude/agents/harvest-scout.md +++ b/.claude/agents/harvest-scout.md @@ -38,10 +38,11 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A reply that +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about -4,000 words, stop at a whole item, set the status to PARTIAL, and list what +10,000 words, stop at a whole item, set the status to PARTIAL, and list what you did not report under a `remaining:` line, so the orchestrator can split the brief. Never shorten the reading to fit the output. diff --git a/.claude/agents/quote-harvester.md b/.claude/agents/quote-harvester.md index b21e5cdee..04afc7e2d 100644 --- a/.claude/agents/quote-harvester.md +++ b/.claude/agents/quote-harvester.md @@ -35,10 +35,11 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A reply that +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about -4,000 words, stop at a whole item, set the status to PARTIAL, and list what +10,000 words, stop at a whole item, set the status to PARTIAL, and list what you did not report under a `remaining:` line, so the orchestrator can split the brief. Never shorten the reading to fit the output. diff --git a/.claude/agents/spec-editor.md b/.claude/agents/spec-editor.md index e2bd1dcce..6e798e262 100644 --- a/.claude/agents/spec-editor.md +++ b/.claude/agents/spec-editor.md @@ -36,10 +36,11 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A reply that +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about -4,000 words, stop at a whole item, set the status to PARTIAL, and list what +10,000 words, stop at a whole item, set the status to PARTIAL, and list what you did not report under a `remaining:` line, so the orchestrator can split the brief. Never shorten the reading to fit the output. diff --git a/.claude/agents/substrate-mapper.md b/.claude/agents/substrate-mapper.md index b947fc8af..0982c1bf1 100644 --- a/.claude/agents/substrate-mapper.md +++ b/.claude/agents/substrate-mapper.md @@ -37,12 +37,13 @@ acting on a partial one. So: ## Output is capped; reading is not -Reading has no budget. Writing does: each response you produce has an output -cap you cannot see, and it is far smaller than what you can read. A Write or a +Reading has no budget. Writing does: one response has an output cap (128k +tokens at the API, and the harness running you may set a lower one), far +below the 1M tokens you can read. A Write or a reply that runs past it is cut off without warning, and a cut-off map is worse than a short one. So: -- Never write a long map in one call. Past about 4,000 words, split it into +- Never write a long map in one call. Past about 10,000 words, split it into numbered parts next to the output path (`.part01.md`, `.part02.md`, ...), one Write per part. Each part is a run of whole sections; never split a section. diff --git a/.claude/knowledge/tiered-agent-execution-protocol.md b/.claude/knowledge/tiered-agent-execution-protocol.md index b92bcbc18..1a7ad34d2 100644 --- a/.claude/knowledge/tiered-agent-execution-protocol.md +++ b/.claude/knowledge/tiered-agent-execution-protocol.md @@ -260,9 +260,12 @@ REVISIT WHEN: a single file exceeds what a Haiku context can hold; then the brief splits the file into named pages, all of which are read. The asymmetry runs the other way for OUTPUT. A Haiku response has an output -cap far below what it can read, and its exact size is not known to the -worker (the limit for this tier is not documented anywhere the cards can -cite). A map or reply written in one long call can be cut off silently. Each +cap far below what it can read: 128k tokens per response at the API against +a 1M-token context (published limits, 2026-10-17), and the harness running a +subagent may set a lower per-response cap. A map or reply written in one long +call can be cut off silently. Measured in the run that prompted this: a +12,255-word map (784 lines) came through one Write intact, so the cards' +split threshold of about 10,000 words sits under every cap seen so far. Each card therefore carries an "Output is capped; reading is not" section: substrate-mapper writes long maps as numbered parts and re-reads the end of each; the reply-only cards stop at a whole item, report PARTIAL and list what From b2a5cfc5c0c73660c3343f0fbb3a1cad20671116 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 17 Oct 2026 11:09:35 +0000 Subject: [PATCH 4/4] Haiku cards: cite the Haiku 5.5 limits from the platform docs Thinking tokens count toward the 128k output limit, so a long Write after heavy thinking is the case the split rule protects. The protocol note now cites "What's new in Claude Haiku 5.5" and records the three facts that matter for subagent runs: earlier thinking blocks stay in context, the same text counts as about 30% more tokens, and long prompts use long-context pricing. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/agents/census-counter.md | 3 ++- .claude/agents/guarded-executor.md | 3 ++- .claude/agents/harvest-scout.md | 3 ++- .claude/agents/quote-harvester.md | 3 ++- .claude/agents/spec-editor.md | 3 ++- .claude/agents/substrate-mapper.md | 3 ++- .../knowledge/tiered-agent-execution-protocol.md | 14 ++++++++++---- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/.claude/agents/census-counter.md b/.claude/agents/census-counter.md index b0ea4d3e2..a9870f824 100644 --- a/.claude/agents/census-counter.md +++ b/.claude/agents/census-counter.md @@ -38,7 +38,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about 10,000 words, stop at a whole item, set the status to PARTIAL, and list what diff --git a/.claude/agents/guarded-executor.md b/.claude/agents/guarded-executor.md index aaa8c9bc0..a0d23d225 100644 --- a/.claude/agents/guarded-executor.md +++ b/.claude/agents/guarded-executor.md @@ -39,7 +39,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about 10,000 words, stop at a whole item, set the status to PARTIAL, and list what diff --git a/.claude/agents/harvest-scout.md b/.claude/agents/harvest-scout.md index 2d081bab9..bb7c68381 100644 --- a/.claude/agents/harvest-scout.md +++ b/.claude/agents/harvest-scout.md @@ -39,7 +39,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about 10,000 words, stop at a whole item, set the status to PARTIAL, and list what diff --git a/.claude/agents/quote-harvester.md b/.claude/agents/quote-harvester.md index 04afc7e2d..f417cf397 100644 --- a/.claude/agents/quote-harvester.md +++ b/.claude/agents/quote-harvester.md @@ -36,7 +36,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about 10,000 words, stop at a whole item, set the status to PARTIAL, and list what diff --git a/.claude/agents/spec-editor.md b/.claude/agents/spec-editor.md index 6e798e262..b43446080 100644 --- a/.claude/agents/spec-editor.md +++ b/.claude/agents/spec-editor.md @@ -37,7 +37,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A reply that runs past it is cut off without warning. If your reply would run past about 10,000 words, stop at a whole item, set the status to PARTIAL, and list what diff --git a/.claude/agents/substrate-mapper.md b/.claude/agents/substrate-mapper.md index 0982c1bf1..140d4a2ff 100644 --- a/.claude/agents/substrate-mapper.md +++ b/.claude/agents/substrate-mapper.md @@ -38,7 +38,8 @@ acting on a partial one. So: ## Output is capped; reading is not Reading has no budget. Writing does: one response has an output cap (128k -tokens at the API, and the harness running you may set a lower one), far +tokens, and your thinking counts toward it; the harness running you may set +a lower one), far below the 1M tokens you can read. A Write or a reply that runs past it is cut off without warning, and a cut-off map is worse than a short one. So: diff --git a/.claude/knowledge/tiered-agent-execution-protocol.md b/.claude/knowledge/tiered-agent-execution-protocol.md index 1a7ad34d2..17c010c91 100644 --- a/.claude/knowledge/tiered-agent-execution-protocol.md +++ b/.claude/knowledge/tiered-agent-execution-protocol.md @@ -260,10 +260,16 @@ REVISIT WHEN: a single file exceeds what a Haiku context can hold; then the brief splits the file into named pages, all of which are read. The asymmetry runs the other way for OUTPUT. A Haiku response has an output -cap far below what it can read: 128k tokens per response at the API against -a 1M-token context (published limits, 2026-10-17), and the harness running a -subagent may set a lower per-response cap. A map or reply written in one long -call can be cut off silently. Measured in the run that prompted this: a +cap far below what it can read: up to 128k output tokens against a 1M-token +context window, and thinking tokens count toward the output limit (source: +platform.claude.com, "What's new in Claude Haiku 5.5", read 2026-10-17). The +harness running a subagent may set a lower per-response cap. A map or reply +written in one long call, after a long stretch of thinking, can be cut off +silently. The same page states three more facts that matter here: thinking +blocks from all earlier turns stay in context as input tokens, so a resumed +agent (SendMessage) carries its whole thinking history; the same text counts +as about 30% more tokens than on Haiku 4.5; and long prompts are billed at +the long-context price. Measured in the run that prompted this: a 12,255-word map (784 lines) came through one Write intact, so the cards' split threshold of about 10,000 words sits under every cap seen so far. Each card therefore carries an "Output is capped; reading is not" section: