| **edit.script** (python heredoc editors) | **6.5%** | **7.3%** | each agent re-invents a CRLF/BOM-preserving `def edit(p,f)`; its inputs were the largest context item in 3 of 5 heavy Hands (39-56k tok) |
| git.write | 2.4% | 2.5% | add/commit/push, plus Write for the message file and a `git log -1` check |
- search 28.5%, git.read 24.5%, read.file 18.6%. Orientation by single shell
calls, where probe scripts would do the same work in fewer calls.
### Baseline prefix
- The global `~/.claude/CLAUDE.md` is 56k chars and `F:\Projects\CLAUDE.md` is
14k chars, about 17.5k tokens together. Both load into every subagent.
- Over about 28.8k subagent calls since 09-29 that is about 500M re-read, about
9% of subagent cache reads.
## 2. Target call shape per faculty
These are the target numbers per faculty. "Script per phase" means one Bash
call that runs a written script and prints a bounded result. It replaces
chained single commands.
| faculty | calls | peak ctx | phases (one script or one parallel batch each) | lifetime |
|---|---|---|---|---|
| **Self** | ≤ 3 per dispatched agent (dispatch, read the final notification, triage) | **≤ 300k**, rotate past it | rehydrate is one recipe batch; triage is parallel `view`s | rotates at phase boundaries (§4) |
| **Imagination** | 40-80 | ≤ 250k | (1) an orient script that dumps `git log`, file:line excerpts and grep hits to a scratch file and prints ≤ 150 lines; (2) probe scripts, one per question, each run in one verify job; (3) one admit batch | one map pass per agent; a refresh is a new agent |
| **Hands** | **60-150** | **≤ 300k** | (1) an orient script: status, base, spec `view`, and `sed -n` excerpts of the spec's anchors in one call; (2) edits through Edit, with independent edits in one parallel message; (3) **one verify job** (build, scoped tests, mutation) through `ygg-verify` summary mode, waited in the foreground (§3a); (4) **one commit call** per commit; (5) the report admit | **hand off at ~300k** or ~150 calls: commit what is verified, admit the `cut_report` with `undone`, stop. Self dispatches a continuation |
| **Soul** | 50-120 | ≤ 300k | (1) dump the range once: `git diff base..head > $S/range.diff` plus `--stat`, then grep that file instead of re-running `git show` per file; (2) **one probe job** carrying all probes, the hand mutants as a list (§3b) and the scoped reruns; (3) **one final job**: full suite plus the mutation tool; (4) the verdict admit | a second pass covers only the fix delta (already ruled) |
| **Eyes** | ≤ 40 | ≤ 200k | parallel WebFetch and search batches; transcript work as scripts, never whole reads | one question set per agent |
| **Life** | ≤ 25 | ≤ 150k | one inventory script over the surfaces, then the edits | per phase boundary |
Rules common to every faculty:
- **Observation bounds.** No command prints more than ~150 lines. Logs go to a
file. You read `tail -n 60`, or `grep -n` hits with `-m`. You never `cat` a
whole log or source file over ~300 lines; read the anchor's range instead.
Reading in 100-line windows matches the SWE-agent ablation (18.0% against
12.7% for full-file views). Reading a file twice is a smell. Write what you
need to keep to a scratch notes file instead.
- **Parallel tool calls.** Independent reads, views and greps go in one
message. This saves wall time and turns, not reads.
- **No turn ends before the report.** A subagent's turn end is a paid wake of
Self (§1).
## 3. Tooling ledger, and the shared script body
Code is a liability, so deletions come first:
- Delete the `git log -1 --format=%B` check (briefs.md 305).
- Delete "poll the log" (briefs.md 309).
- Delete "Run long builds detached … and poll" for agents (SKILL.md 577-579).
- Delete the raw-output paste in the Hands report (briefs.md 334-336).
- Delete the per-agent harness reinvention, by replacing it with the shared
| **(a) `ygg-verify` summary mode + foreground waiter.** `SUMMARY=1` keeps the full log in a file and prints a bounded summary: exit verdict, pass/fail/skip counts per test binary (and a `ZERO TESTS RAN` line when the count is 0), failing test names, and the last 30 lines of each failure, capped at ~80 lines. The companion `wait` mode blocks ≤ 270 s per call on a done-file and prints `RUNNING <elapsed>` or the summary. | the stopgap's owner (the skill repo). It dies with the stopgap when Idunn's typed verify verdict lands, and must not outlive the deletion line in `ygg-verify.sh` | Hands, Soul, Imagination probes | Observation calls fall from 2.7 to ~1-2 per job: about **−2,400 Hands and −1,000 Soul calls per two days, ~13% of calls.** Because of N², that is ~15-20% of reads | ~60 lines of bash plus a parser per ecosystem (cargo test, dotnet test, vitest, pytest). **Verdict-bearing**: a summarizer that drops a failure forges a green. It gets a Soul pass before merge, plus a fixture test per parser: a failing run, a zero-test run, a killed run and a no-verdict run |
| **(b) mutation runner.** It takes the ecosystem tool's diff scope, *or* a list of hand mutants (`file`, `before`, `after`, `tests`), and returns a kill table (label, outcome, killing test) in one job. Hand mutants are applied in the container clone, so the tree is never touched | same | Soul primarily, Hands for the scoped run | Replaces the reinvented `mutrun`/`strykrun`/`runmut` scripts. One job instead of one per mutant: in aba0348c, 11 launches with their wait/read pairs become ~2. **Estimate (inferred): −20-40 calls per Soul pass** | ~100 lines. **Verdict-bearing**: same Soul and fixture rule. It must report `unviable` and `timeout` separately from `caught` (the brief's totals already require this) |
| **(c) commit helper.** **Not built.** In Git Bash, `git add <paths> && git commit -F- <<'MSG' … MSG && git push` is one call. The BOM and here-string scar is PowerShell-only (SKILL.md 568-571) | — | Hands, Self | ~1.5 calls per commit, ~1.5% of Hands calls, at **zero code** | none. A brief and SKILL text change only |
| **(d) CRLF/BOM-preserving edit.** **Probe first**: does Edit preserve CRLF and BOM on these repos? If yes, the brief says "use Edit; no python editors" and nothing is built. If no, one shared `edit.py` replaces 1,097 reinvented editors | probe: Self, now | Hands | 6.5% of Hands calls, and the largest tool-input context item | zero if the probe passes, ~30 lines if not |
| (e) an orient script per faculty | — | — | not a shared tool: one line in each brief ("orient in one script") | none |
### 3x. The shared script body (operator: "Is that too ambitious?")
**Direct answer: no, provided it stays a directory in a git repo with ordinary
review.** It is small and it already exists: `tools/stopgap/` in the skill
repo. What the data shows is the opposite problem. Every Hands and Soul writes
its own `runmut.sh` or python editor and throws it away, and that costs calls
and context in every pass. The ambitious part would be a bespoke admission
process, and per the operator's follow-up none is needed: collaborating on code
is a solved problem.
**Facts (gamecult-ops):**
- Forgejo 16.0.3 runs on Yggdrasil at `127.0.0.1:3300` behind nginx as
`git.erycina.org`.
- Its purpose is "public, anonymously readable source hosting for Erycina".
The inventory says Erycina is "not a GameCult subdomain by intent … meant to
read as creator-owned and separately stewarded".
- Actions are **deliberately not enabled**: "CI runners on the same host as the
state store … Revisit when there is something to run".
- Registration is disabled, and accounts are created by an admin through the
forgejo CLI.
- Git runs over SSH through the host `sshd` as the `git` user, with keys
registered in Forgejo. Agents would authenticate with an SSH key registered
to a dedicated bot account (for push) and a Forgejo API token held outside
briefs (for PRs). No secret appears in any brief or in this map.
- No mirroring is documented. Forgejo supports push mirrors natively.
- As of 09-05 TLS was staged pending DNS. Whether it is issued now is unverified.
- The skill repo's `origin` today is `github.com/GameCult/Eureka`.
**Shape (recommended, pending Q4):**
- **Where it lives:** in the skill repo itself, in `tools/`, with the stopgap
staying under `tools/stopgap/`. It does not go in a separate repo. Scripts
and briefs change together, since a brief names a script's flags, so one
revision pins both. Agents already have the checkout at
`~/.claude/skills/eureka`, so there is no clone path to manage and nothing
separate to pin. Self records the skill SHA in the campaign's first brief
line, which pins it for the run.
- **Contribution:** an agent that writes a reusable script pushes a branch
`tools/<name>` and opens a PR. It never pushes to `main`. The PR carries the
script, its fixture test, and one line of evidence: which calls it replaces
(a transcript count from `tc_classify.py` or a named pass) and its live
consumer, the brief line that will call it. **A PR without a consumer line is
Verbatim: "Q1 A, Q2 yes, Q3 agreed, Q4 B, Q5 yes, but see Epiphany's approach where each subagent gets its own targeted philosophy centered on its role".
- Q1 = A: subagents wait in the foreground, in calls of at most 270 s, and never end a turn before their report. This supersedes `92bf6f7`.
- Q2 = A: Self runs one bounded probe of `CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL=1h`.
- Q3 = C: rotate at about 300k or at a phase boundary, with a handoff and the operator's `/clear`. A lower `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` is the backstop.
- Q4 = B: the shared scripts stay in the skill repo on GitHub (`tools/`, `tools/INDEX.md`), contributed by branch and pull request.
- Q5 = yes: slim the global CLAUDE.md along Epiphany's per-role philosophy. A separate Imagination pass maps it.
- **`CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL=1h`: CONFIRMED, though undocumented.**
- With it, the post-gap call read 112,158 cached tokens and created 401, all `ephemeral_1h`.
- Without it, the call read 29,331 and created 83,366, all `ephemeral_5m`; the context had expired and was rewritten.
- The official docs list only `CLAUDE_CODE_PROMPT_CACHE_TTL`, for the main conversation.
- **`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`** is documented as a percentage of the auto-compact window. It can only lower the threshold and it applies to subagents too. A value sized for the root would compact subagents early, so the Q3 backstop is not set; rotation carries Q3.
Q4 is now **A**: the Eureka repo, prose and `tools/`, moves to Yggdrasil's Forgejo and is shipped open source with contributions welcome. See `faculty-philosophy-cut.md` "Rulings" Q3 for the verbatim reason. Contributions use Forgejo PRs. Whether the GitHub copy is archived, mirrored or deleted is still open; ask the operator.
## 11. Follow-ups from the tools' Soul passes (2026-10-01)
The `tools/` work merged after four Soul passes (last at `838b859`). Recorded, not blocking:
- **Jest `infail` scope.** `infail` resets only on `PASS` or `Test Suites:`, so a crash after an earlier failing file is named as a failing test. The verdict stays right; the name is wrong. Reset at a blank line or the next non-indented non-`●` line.
- **No automated guard for the RUN_ON_HOST watchdog (exit 124).** It is proven only by the probe recipe in `tools/fixtures/mutation-probe/README.txt`; `tools/test-tools.sh` never starts the stopgap, so reverting the fix stays green.
- **Shared volumes are outside the isolation.** The cargo registry, nuget and `eureka-sccache` volumes carry state across the control and mutant containers. A test that counts into one could pass the control and read CAUGHT later. The runner header names the limit; no probe was built.