Files
reliquary/docs/workpad/reports/2026-10-16-23-spire-guidance-text-audit.md
T

247 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Spire guidance-text audit: size, filler, steering
- Date: 2026-10-16 22:58 · Model: `claude-opus-5-5` · Branch audited: `main` (plus the `headless-forks` worktree for gremlins and the branch Athanor)
- Scope: `plugins/spire/` skills (SKILL.md + references; no `templates/` dirs exist on main), agents, plugin CLAUDE.md, README. Also the injected `.claude/spire/project.md`.
- Method: `wc -w` for size; tokens ≈ words × 1.3 (tables and code blocks tokenize worse, so real numbers run higher). I read every file in the load bundles in full and sampled the rest (svg references and parts of init only skimmed). Class percentages are estimates from reading, not measurements.
- Findings and options only. Nothing here is a verdict.
## 1. Sizes
### Per file (main)
| Group | File | Words | ≈ Tokens |
|---|---|---:|---:|
| **igor** | skills/igor/SKILL.md | 3473 | 4515 |
| | references/mindset.md (`@`-included) | 348 | 452 |
| | references/model-tiers.md | 713 | 927 |
| | references/journal-template.md | 153 | 199 |
| | references/project.md (blank template) | 351 | 456 |
| | references/harness-notes.md (moved-stub) | 107 | 139 |
| | agents/igor.md | 85 | 111 |
| **implementation** | skills/implementation/SKILL.md | 1395 | 1814 |
| | references/spawning-claude-code.md | 1172 | 1524 |
| | references/models.md | 691 | 898 |
| | references/superpowers.md | 461 | 599 |
| | references/run-log.md | 410 | 533 |
| **workpad** | skills/workpad/SKILL.md | 1768 | 2298 |
| **project** | skills/project/SKILL.md | 45 | 59 |
| | + injected `.claude/spire/project.md` (reliquary) | 216 | 281 |
| **adepts** | skills/adepts/SKILL.md (+ roster output, ~6 words here) | 100 | 130 |
| **research** | skills/research/SKILL.md | 1155 | 1502 |
| | skills/research-tree/SKILL.md | 1213 | 1577 |
| **svg** | SKILL.md + inline-svg.md + layout-legibility.md | 859 + 1318 + 757 | 3814 |
| **other skills** | init | 1835 | 2386 |
| | zathras | 1011 | 1314 |
| | curator | 327 | 425 |
| | knowledge | 319 | 415 |
| **agents** | adept | 1431 | 1860 |
| | athanor | 980 | 1274 |
| | researcher | 450 | 585 |
| | search | 396 | 515 |
| | attacker | 326 | 424 |
| | planner | 288 | 374 |
| | reviewer | 276 | 359 |
| | scout | 268 | 348 |
| | zathras | 92 | 120 |
| **misc** | plugin CLAUDE.md | 27 | 35 |
| | README.md (not loaded by agents) | 353 | 459 |
| **Total (main)** | | **24 953** | **≈ 32 400** |
Branch worktree `headless-forks` for comparison: gremlins/SKILL.md **2052** (≈ 2670 tok), preamble.md 247, templates 463 (gremlin briefs, not Athanor reading), `where` injection ≈ 133. On the branch the Athanor's text also grows: athanor.md 980 → **1658**, implementation SKILL 1395 → 1474, spawning-claude-code 1172 → **3077**, run-log 410 → 552, models 691 → 854.
Fixed overhead in every main session: skill descriptions ≈ 620 words and agent descriptions ≈ 630 words (≈ 1.6k tok). workpad (102), svg (114), research-tree (102) and athanor (127) have the longest descriptions. The repo CLAUDE.md (117 words) loads too.
### Load bundles (what one agent carries at start)
"Preloaded" = frontmatter `skills:` plus `@`-includes plus CLAUDE.md. "+ mandated" = files the preloaded text tells the agent to read before it can do its job. I assumed the `@references/mindset.md` include expands inside a skill. Nobody has checked that.
| Bundle | Preloaded | Words | + mandated reads | Words | ≈ Tokens (with mandated) | Agent-specific share |
|---|---|---:|---|---:|---:|---:|
| **Igor boot** | igor.md, igor SKILL, mindset, project (+project.md), adepts, workpad, repo CLAUDE.md | 6 152 | journal-template | **6 305** | **≈ 8 200** (+1.6k listings) | igor SKILL+mindset ≈ 61% |
| **Athanor start (main)** | athanor.md, project, workpad, implementation, CLAUDE.md | 4 521 | spawning (impl:67 "Read … before dispatching"), run-log | **6 103** | **≈ 7 930** (+ models.md 691 → ≈ 8 830) | athanor.md 16% |
| **Athanor start (branch)** | + gremlins, longer athanor/impl | 7 330 | spawning 3077, run-log 552 | **10 959** | **≈ 14 250** (+ models 854 → ≈ 15 360) | athanor+gremlins 34% |
| **Planner** | planner.md, project, workpad, implementation, CLAUDE.md | 3 829 | — | 3 829 | **≈ 4 980** | 7.5% |
| **Attacker** | attacker.md + same | 3 867 | — | 3 867 | **≈ 5 030** | 8.4% |
| **Reviewer** | reviewer.md + same | 3 817 | — | 3 817 | **≈ 4 960** | 7.2% |
| Adept (for reference) | adept.md, workpad, adepts, CLAUDE.md | 3 416 | adepts/CLAUDE.md + handoff (project data) | 3 416+ | ≈ 4 440+ | 42% |
| Zathras (for reference) | zathras.md + skill, project, workpad, adepts | 3 349 | — | 3 349 | ≈ 4 350 | 33% |
The bundles look like this: **workpad (1768 words) is preloaded into seven agents**, and **implementation (1395) is preloaded into planner, attacker and reviewer**. In each of those three, workpad plus implementation makes up ~83% of what the agent carries. Only 7–8% is its own job description.
## 2. Content classes
Classes: **a** agent-specific operational instruction · **b** project/harness facts · **c** general knowledge the model has · **d** filler (persona, motivation, history, repetition, hedges, examples restating a rule) · **e** stale or contradicting.
### Overall split
Weighted over all 24 953 words on main: **a 42% · b 22% · c 9% · d 23% · e 4%** (≈ 10.5k / 5.5k / 2.2k / 5.8k / 0.95k words).
Per bundle (with mandated reads):
- **Igor boot:** a 41 · b 16 · c 10 · d 30 · e 3
- **Athanor start (main):** a 41 · b 27 · c 10 · d 18 · e 4
- **Planner/attacker/reviewer:** a ~45 · b ~12 · c ~17 · d ~23 · e ~3. Much of the "a" is somebody else's job (the reviewer carries the attack procedure and the bug-hunting rules; the planner carries the phase-review rules).
### Per file (estimates)
| File | a | b | c | d | e | Notes |
|---|---:|---:|---:|---:|---:|---|
| igor SKILL | 45 | 12 | 5 | 33 | 5 | Persona/voice 9–41 ≈ 544 words; delegation rule restated ~8×; three near-identical adept spawn templates (133–161, 164 words) |
| mindset.md | 15 | 0 | 5 | 80 | 0 | Philosophy plus a note to future editors ("Protect them in any rewrite") |
| model-tiers.md | 40 | 30 | 0 | 25 | 5 | Table near-duplicates igor SKILL 77–89 |
| harness-notes.md | 0 | 0 | 0 | 90 | 10 | Moved-stub restating spawning rules |
| journal-template | 60 | 10 | 0 | 30 | 0 | |
| project skill + project.md | 40 / 85 | | | | 20 / 15 | project.md is stale (see e) |
| adepts SKILL | 20 | 40 | 0 | 40 | 0 | 40-word developer HTML comment loaded into every boot |
| workpad SKILL | 45 | 10 | 25 | 20 | 0 | Ticket context 48–68 ≈ 346 words; document-kind definitions |
| implementation SKILL | 55 | 10 | 10 | 20 | 5 | Rationale paragraphs; Bugs section is generic |
| spawning-claude-code | 10 | 75 | 0 | 10 | 5 | Good "b" content; history rows |
| run-log | 70 | 10 | 0 | 20 | 0 | Field-heavy (see §4) |
| models.md | 10 | 50 | 0 | 40 | 0 | Sources list, withdrawn notes |
| superpowers.md | 30 | 40 | 0 | 25 | 5 | Only read on demand |
| athanor.md | 55 | 10 | 0 | 25 | 10 | Furnace persona; stale fork step |
| planner.md | 80 | 0 | 10 | 10 | 0 | Tightest file in the plugin |
| attacker.md | 45 | 0 | 0 | 45 | 10 | ~70% restates implementation 24–34, which it also preloads |
| reviewer.md | 40 | 0 | 0 | 55 | 5 | ~60% restates implementation 51–58 |
| adept.md | 60 | 15 | 5 | 20 | 0 | Folder tree duplicates the scaffolded adepts/CLAUDE.md it reads at genesis |
| researcher / search / scout | 20–40 | 0 | 30–50 | 15–30 | 0–5 | Tool lists, "start narrow" |
| zathras SKILL | 25 | 25 | 0 | 40 | 10 | Persona plus a contradicting model rule |
| research / research-tree | 35–50 | 0–5 | 20–25 | 25 | 5–10 | |
| init / curator / knowledge / svg | mostly a+b | | | | | Human-triggered or on-demand, outside the bundles |
### (c) General knowledge: quotes
- `agents/search.md:27-29`: "**Start narrow.** Use Grep with a specific symbol or pattern before broadening." / "**Read strategically.** Don't read entire large files"
- `agents/researcher.md:31`: "**Synthesize, don't summarize.**"; `:41-42` "Use clear headings and short paragraphs" / "Lead with the answer"
- `agents/researcher.md:13-18`, `search.md:12-17`, `scout.md:12-17`: tool lists that restate the frontmatter (`- Search code and files (Glob, Grep)` …)
- `skills/research/SKILL.md:55-56`: explains what `WebFetch` and `WebSearch` do
- `skills/workpad/SKILL.md:97-103`: textbook distinctions ("A brainstorm is divergent … A design is convergent")
- `skills/research-tree/SKILL.md:44`: topological layering explained ("always one past its deepest prerequisite")
- `skills/implementation/SKILL.md:63`: "**Explore before you focus.** Look one or two layers up from the symptom, skim recent commits …"
- `skills/igor/SKILL.md:63`: "**Fearlessness means flagging misconceptions.** When the user has a factual error, say so directly."
### (d) Filler: quotes
- `skills/igor/SKILL.md:9`: "Says \"yeth, marthter\" exactly zero times."
- `skills/igor/SKILL.md:21`: "Every minute spent doing work yourself is a minute you are unavailable to the user. Your value is proportional to your presence." (again at `:65` and `mindset.md:27`)
- `skills/igor/SKILL.md:23`: "This directive governs everything below. … If any instruction below seems to conflict with delegation, delegation wins."
- `skills/igor/SKILL.md:34`: the furnace grammar rule ("never 'the Athanor is in the oven' or similar inversions"). The same metaphor repeats at `:91`, `athanor.md:4-6`, `athanor.md:21` ("You ARE the oven"), `zathras SKILL:15`, README:32
- `skills/igor/SKILL.md:36-41`: four example flourishes
- `skills/igor/references/mindset.md:21-29`: "The five voice lines … Protect them in any rewrite". This is an editor instruction that loads into every Igor run
- `skills/zathras/SKILL.md:13`: "Not Zathras the great leader, not Zathras the quiet one. This Zathras." and `:37-40` example lines
- `plugins/spire/CLAUDE.md:1`: "a wizard's private workshop where knowledge accumulates"
- `skills/implementation/SKILL.md:30`: "This step is what pays for dropping per-task review. … Without it, lean is just less review." (and again in `igor SKILL:99`)
- `skills/igor/SKILL.md:93`: "(in spacecraft it overrode 4.6 pins in 184 of 184 spawns)". This is history inside a rule
- `skills/research/SKILL.md:12-14`: the "core problem this solves" narrative
- `skills/adepts/SKILL.md:7-10`: "Note: This skill uses Bash(bash:*) … a novel pattern. … Per harness design this should pre-approve"
- `references/spawning-claude-code.md:51`: a row that says it "is not evidence for alias-over-pin"
- `references/models.md:26`: withdrawn 4.6/Opus-5 notes kept in the active file
- `agents/planner.md:33`, `attacker.md:39`, `reviewer.md:35`: "Do this yourself; do not dispatch further agents." None of these agents has the Agent tool in its `tools:`, so the sentence does nothing. The same goes for `search.md:21`: "You do not have the Agent tool. Do not attempt to use it. Do not suggest that work be delegated"
- Gremlins (branch): 17 review-finding tags the model cannot resolve, such as "(P0.1)", "(M16)", "(N1)", "(Minor 13)", "(Phase 1 M3)", "(C4)". "N1" names two different things (`gremlins/SKILL.md:105` delta-section rule, `:111` orphan watchdog)
### (e) Stale or contradicting: quotes
- `agents/athanor.md:32`: "A complex block in the area you just read can go to a fork of yourself" and `skills/implementation/SKILL.md:49` "**trunk and forks** … go to a fork of the builder". The goal decision of 2026-10-16 (`goals/headless-forks.md:47`) drops Agent-tool forks, and `spawning-claude-code.md:61` records the `fork` type as not offered. On main this tells the Athanor to use a path that is not there. The branch fixes it.
- `skills/igor/SKILL.md:66`: "**Fork sparingly.** Forking yourself is a last resort." Same unavailable mechanism.
- `skills/zathras/SKILL.md:74`: "**Model must be explicit.** Always pass `model` on `Agent` calls." This contradicts `igor SKILL:93` and `spawning:18` ("Pinned agents: omit `model`"). Passing the alias overrides the pins (184/184).
- `skills/zathras/SKILL.md:70`: "Multi-file refactors, cross-cutting changes → Athanor" vs `model-tiers.md:22` "the `athanor` gets a reshaped build plan, never an unplanned build brief".
- `skills/igor/SKILL.md:173`: "Give every dispatched agent an explicit output file path". `scout` and `search` have no Write tool.
- `skills/igor/SKILL.md:99`: "Igor with user or Pinky" and "(trial since 0.2.2)". Pinky does not exist ("Pinky, when it exists", `spawning:54`).
- `skills/igor/SKILL.md:43`: "If it loaded the blank template (the hint says 'run /spire:init')". `skills/project/SKILL.md` never loads the blank template. It echoes a one-line message, so `igor/references/project.md` (351 words) is unreachable through that path.
- `.claude/spire/project.md` (injected into every bundle): the agent list "igor, athanor, adept, researcher, scout, search, zathras" has no planner/attacker/reviewer. There is no `## Build` section, though implementation:82 reads it. The field is called "Verification commands", not Gate/Tests. "Legacy: `plugins/g4b_ai/` still exists (… being phased out)".
- `skills/research/SKILL.md:121`: "Which model to use — out of scope" right below its own model table (`:26-30`). Same at `research-tree:100`.
- `agents/researcher.md`: three fetch caps, "at most 3–5" (`:23`), "1–3 key sources" (`:30`), "at most **5** … hard cap" (`:36`).
- `skills/research/SKILL.md:59-63`: MCP server names (`@anthropic/fetch`, `markdownify`, `jina-reader`) that are not verified.
- `skills/init/SKILL.md:219,226`: the adept template frontmatter has two `status:` keys (`generated` and `active`).
- `skills/adepts/SKILL.md:9-10`: "should pre-approve the command at load time". The gremlins work found that `allowed-tools` did *not* pre-approve in a subagent (`gremlins/SKILL.md:27`, P0.8).
- `athanor.md:60` and `implementation:87`: two paragraphs on superpowers, which the user no longer runs, loaded at every Athanor start to say it is "not part of the loop".
## 3. Duplication
| Rule | Where (file:line) | Count |
|---|---|---:|
| Igor delegates / "work vs conversation" | igor SKILL 15–21, 29, 54, 65, 67, 186; mindset 19, 25–29; zathras 21 | ~9 |
| Stamp the model id / check the stamp | igor 93; model-tiers 39; spawning 20; implementation 53, 68; run-log 9, 37; athanor 45; planner 34; attacker 40; reviewer 37 | 11 |
| Pinned → omit `model`, unpinned → pass alias, no Fable | igor 93; model-tiers 35–40; spawning 18–19, 47–49; athanor 45; models.md 31; (contradicted: zathras 74) | 6 |
| Leaf briefs "do this yourself; do not dispatch" | igor 181; harness-notes 12; spawning 21; implementation 67; athanor 46; zathras 74; model-tiers 33; research 111; planner/attacker/reviewer | 11 |
| Gate between blocks, tests once per phase | igor 99; implementation 18, 41; athanor 33–34; attacker 32; init 72–73; project template 27–28 | 7 |
| Review: answer every flag, hunt weakened checks / tests that cannot fail, list unplanned additions | igor 99; implementation 54–55; reviewer 22–24; athanor 34; run-log 54 | 5 |
| One fix pass, re-check only Critical/Important, stop | igor 104–105, 177; implementation 19, 56–57; athanor 40; reviewer 29–31; superpowers 20 | 7 |
| Separation of roles | igor 101; implementation 22; planner 15; attacker 15; reviewer 16; athanor 51; model-tiers 11–13 | 7 |
| Attack checklist | implementation 26–28; attacker 19–25; igor 99 | 3 |
| Code in a plan only where its form is the decision | implementation 34; planner 29; attacker 33; superpowers 21 | 4 |
| Times from `date`, not feel | igor 174; implementation 76; run-log 7–8; journal-template 14 | 4 |
| Agents write their own reports | igor 173; athanor 54; zathras 82; model-tiers 21 | 4 |
| Goals read-only | igor 178; athanor 53; zathras 86 | 3 |
| Notifications = turn ending | igor 180; harness-notes 9; spawning 22 | 3 |
| Research agent tiers and fetch caps | research 26–32, 49; model-tiers 8–10; igor 79–81; researcher 23/30/36; search 38; scout 33 | 6+ |
| Athanor furnace metaphor | igor 34, 91; athanor 4–6, 21; zathras 15; README 32 | 6 |
| Adept folder tree | adept.md 114–131; init 181–198 (→ adepts/CLAUDE.md, read at genesis) | 2 |
| Delegation table | igor 77–89; model-tiers 5–17; zathras 65–72 | 3 |
Inside the planner/attacker/reviewer bundles, the agent body restates rules that are also in the preloaded implementation skill, so each agent reads the same rule twice per start.
## 4. Steering risk
The user's earlier finding is that a single sentence steers Opus 5.5 strongly. These sentences most likely push toward over-building, over-verifying or audit-style notes.
**Toward audit-style review and long notes**
1. `agents/reviewer.md:22`: "Answer **every** deviation and flag in the run log's handoff notes, one by one." This is reinforced at `implementation:54` and `igor SKILL:99` ("it answers every handoff flag"). Together with item 2, the review turns into a point-by-point audit, and its length follows the builder's flag count, not the risk.
2. `references/run-log.md:54`: "Flags for the reviewer: every deviation and every 'flagged for review' line above, one per bullet". `:41` invites "anything the reviewer should look at". Builders flag freely and reviewers answer each one.
3. `references/run-log.md:37-44`: eight fields per block (model, start/end `date`, done, deviations, flagged, left for later, expected broken, commits), plus a Tokens column, provisional status and "Not run / untested". The branch adds usage tables. Nothing caps the length.
4. `agents/reviewer.md:23`: "**Hunt** weakened checks … and tests that cannot fail". "Hunt" invites a search that keeps going until it finds something.
**Toward over-building (scope)**
5. `agents/attacker.md:25`: "Missing function: a thing planned that does nothing, a path with no way back (onboarding without offboarding), error handling, security." This asks the attacker to add scope, against its own `:33` "Scope cut back to the goal". It is probably the strongest single scope-widener in the cycle.
6. `agents/attacker.md:23` / `implementation:26`: "consumers of changed semantics … other readers, stats, migrations, callers in other crates". Useful, but with no stopping rule.
7. `agents/planner.md:26`: "within a phase, **steps** with a completion criterion each". `models.md:17` already notes that 5.5 plans ran ~11× larger, yet planner.md has no size cap.
8. `research-tree:41`: "List every sub-topic you can think of, even ones that feel redundant."
**Toward over-verifying**
9. `igor SKILL:93`: "check the stamped id before acting on the result; if it is not the intended model … re-dispatch". The stamping rule appears 11 times across the bundles (§3).
10. `athanor.md:34`: "read the fix's diff for loosened assertions or deleted checks before you report green". This is the reviewer's job, done a second time by the builder. The branch makes it a mechanical per-block grep (`git diff … | grep -c '^-.*assert'`).
11. `implementation:62-63`: "If you cannot write the failing test, keep investigating" plus four exploration acts before any bug fix ("Skip this for obvious bugs" helps).
12. `igor SKILL:187`: every wrap-up runs adept handoffs, accretion, and graduation candidates. `mindset`/`igor:61`: "**Best over fastest.**" pushes toward thoroughness over speed in general.
13. `adept.md:81`: refresh `handoff.md` after every state-changing consultation, plus journal entries and `search` dispatches ("Don't guess").
**Sentences that are missing (would push toward small and simple)**
- No size limit for plans, build plans, run logs, review reports, session journals or the Athanor's deliverable. The only caps in the plugin are adept `handoff.md` ≤ ~40 lines, adept `CLAUDE.md` ≤ ~60 lines, docs split at ~200 lines, and trunk notes "a page".
- No "the smallest change that meets the goal" or "prefer deleting to adding" for planner, attacker or builder.
- No "happy path first; edge cases only where the plan names them."
- No reviewer rule like "report findings only; do not list what you checked and found fine; an empty section is omitted."
- No "flag only what you are unsure of; 'none' is the normal answer" for handoff notes.
- No cap on tests added per block, and no "a test per behaviour the plan names, not per branch."
- The attacker has no "cutting is the main job; adding a function needs the goal to require it."
## 5. Sweet-spot options
Options for discussion, not decisions. The target sizes are rough and assume the content classes above.
### Igor boot (now ≈ 6.3k words / 8.2k tok)
- **Option I-1, lean (≈ 2.2–2.6k words / ~3k tok).** Persona in two lines, one flourish rule, no examples. Delegation stated once with the line test (code, commands or artifacts → delegate). Drop mindset.md from boot and keep "Orienting is not deciding" as one bullet. One delegation table: delete model-tiers.md or turn it into the only table. One adept spawn template with a variant line. The cycle as stage list plus decision tree (~250 words), pointing to implementation for detail. Replace the workpad preload with a 150-word placement card (folders, `YYYY-MM-DD-hh-slug`, stage→folder), since Igor delegates the writing. Remove the history and Pinky.
- **Option I-2, moderate (≈ 4k words / ~5.2k tok).** Keep the Voice section but cut it to ~150 words and keep workpad preloaded. Remove only the duplicates (delegation ×8, model rules, notification rules) and the stale fork and Pinky lines.
- Either way: fix the injected project.md (agent list, a `## Build` section), drop the adepts dev comment, and fix the zathras model contradiction.
### Athanor start (main ≈ 6.1k words / 7.9k tok; branch ≈ 11k / 14.3k)
- **Option A-1, lean core (main ≈ 1.8–2.2k words; branch ≈ 3.5–4k).** athanor.md at ~500 words: procedure plus keepers, no furnace description, no superpowers, no fork step. A "builder core" excerpt of implementation (~400 words: build-phase rules, deviation logging, project settings) instead of the whole skill. The run-log template cut to ~200 words: block row, a handoff note of Done / Deviations / Flags (default "none") / Commits, and a phase close. The spawning reference split into a ~250-word rules card (preloaded or mandated) and the claim tables on demand. No workpad preload, because the brief and the run-log template give the paths. On the branch: split gremlins into a core of ~800–1000 words (setup, the call sequence, waiting, failure → action) and an on-demand results/flags reference, and strip the finding IDs.
- **Option A-2, keep structure (main ≈ 4k).** Keep the skills preloaded but delete the duplicates (stamp ×4, leaf ×3, fork, superpowers paragraph) and cap the run log ("a handoff note is at most 8 lines").
### Planner / attacker / reviewer (now ≈ 3.8–3.9k words each, 7–8% their own)
- **Option P-1, self-contained (≈ 500–800 words each).** Each agent body carries its whole procedure: planner as now, attacker as now minus "Missing function", reviewer as now. Add a ~200-word shared "cycle contract" (roles, gate/test cadence, severity grades, where outputs go), duplicated on purpose or put in a tiny `spire:cycle` skill. Preload neither workpad nor implementation, because the brief names the output path. That makes each start about 5–7× smaller.
- **Option P-2, preload a slim implementation.** Shrink implementation itself to ~700 words (move Bugs, Context and Composition into references), keep the preload, and drop the agent-body restatements.
- Either way, add size and simplicity sentences: planner "a plan fits in ~N lines; cut anything the goal does not need"; attacker "cutting is the main job; added scope needs the goal to require it"; reviewer "findings only; answer a handoff flag only when it hides a finding; no 'checked, fine' lines".
### Read-only agents (scout/search/researcher)
- About 100–200 words each would do: the budget, the output form, the fetch cap (one number). Drop the tool lists and the "you do not have the Agent tool" paragraphs, which the tool restriction already enforces.
### Order of savings (rough, per start)
1. Stop preloading workpad where the brief gives the path: −1.8k words in each of 6 bundles.
2. Stop preloading full implementation into planner/attacker/reviewer: −1.4k words each.
3. Cut Igor persona, mindset and delegation repetition: −1.2 to −1.8k words at boot.
4. Split spawning and gremlins into a core card plus on-demand tables: −1 to −2.5k on the branch Athanor.
5. Remove stale and contradicting lines (fork, Pinky, zathras model rule, project.md): small in words, large in steering.