Faculty charters, step 5: dispatch by subagent_type; briefs stop restating charters #2

Merged
eureka-admin merged 2 commits from hands/charter-step5 into main 2026-10-01 16:41:18 +00:00
3 changed files with 43 additions and 18 deletions

View file

@ -36,7 +36,10 @@ editor. See `references/postmortem-cultcache.md` for the evidence.
Faculties are postures, not personalities. The root agent is **Self**. It routes
work, admits the campaign's frame and the operator's rulings, commits the prose
map, and talks to the operator. Delegate every other faculty to a subagent with
its own brief. A faculty that grades its own work has lost the point.
its own brief. Each is a Claude Code subagent type of the same name
(`imagination`, `hands`, `soul`, `eyes`, `modeling`, `life`), and the dispatch
names it as `subagent_type`, which loads that faculty's charter. A faculty that
grades its own work has lost the point.
| Faculty | Runs against | Admits | Must not |
|---|---|---|---|
@ -50,9 +53,9 @@ its own brief. A faculty that grades its own work has lost the point.
Admitting is a write to the Mind, not to the Body. Soul stays read-only on
repos and still admits its verdict.
The operator's doctrine defines the faculties. Read the Soul and Imagination
lines of the operational litany in `~/.claude/CLAUDE.md`. In short, a pass is
named by what it produces, so a pass over a plan is Imagination, and a plan is
The operator's doctrine defines the faculties, and each charter owns its
faculty's identity, method and boundaries. Read `~/.claude/agents/soul.md` and
`~/.claude/agents/imagination.md`. In short, a pass is named by what it produces, so a pass over a plan is Imagination, and a plan is
finished when Hands can go straight to the cut.
## The loop
@ -474,8 +477,8 @@ and reconciles the target doc with the Body.
menu, send it back. Split authority is the defect Soul most often finds.
- **Relay findings plainly.** The operator reads Self's summaries, not the agent
reports. Say what broke, how it would fail, and what is being done.
- **Choose models by how critical the pass is, and name the model on every
dispatch.** Put the scarce strong model on Imagination and on Soul passes
- **Choose models by how critical the pass is, and name the model and the
`subagent_type` on every dispatch.** Put the scarce strong model on Imagination and on Soul passes
over cuts that put the foundation at risk. Hands, search, probes and
Life take the cheaper tier, named explicitly: "default" inherits the
root session's model, so a root running on the strong model silently

View file

@ -12,9 +12,14 @@ Every brief that reads or admits campaign state carries:
- the Rehydrate block below, as the agent's first step, with `<recipes>` set to
the recipes that brief names.
Every dispatch names its model: Sonnet for Hands, probes, search and Life; Opus
for Imagination and for Soul over a cut that puts the foundation at risk.
Never leave it as "default", which inherits the root's model.
Every dispatch names its `subagent_type` and its model. The type is the
faculty's lowercase name (`imagination`, `hands`, `soul`, `eyes`, `modeling`,
`life`) and loads that faculty's charter from `~/.claude/agents/`; a
`general-purpose` dispatch loads no charter, so the brief would carry the whole
faculty alone. The charter owns identity, method and boundaries; the brief owns
the task. Model: Sonnet for Hands, probes, search and Life; Opus for
Imagination and for Soul over a cut that puts the foundation at risk. Never
leave it as "default", which inherits the root's model.
Every agent is capped at about 300k context or 150 calls. At the cap it
commits what is verified, admits its report with what is undone, and stops;
@ -89,11 +94,13 @@ hand_off is parked (Huginn Cut 12): one mind, no transfer.
## Imagination: settle identity, lifecycle and authority
Dispatch: `subagent_type: imagination`, model Opus.
Run this once, before any cut is mapped. It answers the questions that cause
re-cuts, and it needs almost no source.
```
You are Imagination for <migration>. Produce the model page in <prose map
Migration: <migration>. Produce the model page in <prose map
path>. Do not map cuts, do not write code, do not commit; the root agent
commits.
@ -119,8 +126,10 @@ question ids you admitted.
## Imagination: map or refresh a cut
Dispatch: `subagent_type: imagination`, model Opus.
```
You are Imagination for <migration>. Admit a cut_spec for <cut or cuts> so
Migration: <migration>. Admit a cut_spec for <cut or cuts> so
Hands can go straight to the cut with little reading.
Admit only cut_specs, their superseding resolutions, and questions. In the
@ -170,8 +179,10 @@ Report: the ids you admitted and the HEAD you pinned to.
## Hands: execute a cut
Dispatch: `subagent_type: hands`, model Sonnet.
```
You are Hands for <cut>. The spec is <cut_spec id>. Rehydrate (no recipes:
Cut: <cut>. The spec is <cut_spec id>. Rehydrate (no recipes:
view the spec and each ruling it cites, operator directions included). Follow
the spec; do not redesign it. If the Body contradicts it, fix the smallest
thing that keeps its intent true and record the discrepancy in the report's
@ -358,12 +369,11 @@ narrative of the pass, no restating the brief or the report.
## Soul: falsify executed work
Dispatch: `subagent_type: soul`, model Opus when the cut puts the foundation at risk, else Sonnet.
```
You are Soul for <cut>. Soul preserves invariants by falsifying the promises
Hands made about executed work: shortcuts, split authority, trivial tests.
Admit one verdict and its findings, and nothing else.
- Do not edit or commit in any repo.
- Restore after every mutation and leave the tree clean.
Cut: <cut>. Falsify the promises of the executed commits in the scope
below. Admit one verdict and its findings, and nothing else.
- Use a temporary detached worktree for other checkouts, and remove it
afterwards.
- Do not run <expensive runtime> unless told.
@ -465,6 +475,8 @@ cut unless an invariant moved.
## Life: phase boundary
Dispatch: `subagent_type: life`, model Sonnet.
```
Phase boundary: <what landed, as cut_report ids>. The authoritative record is
the campaign's mind and the prose map and target doc; don't edit those, and
@ -496,8 +508,10 @@ what was missing and what it would have prevented.
## Eyes: gather evidence
Dispatch: `subagent_type: eyes`, model Sonnet.
```
You are Eyes. Read only. Write findings to <scratchpad>/<name>.md and return a
Write findings to <scratchpad>/<name>.md and return a
short summary. Budget at most 40 calls: transcripts by script, never whole
reads, and fetches batched in parallel. You read the campaign's mind with query and view only, through
the Rehydrate block (recipes: <as needed>); you never admit.

View file

@ -2,6 +2,14 @@
Record each change to the skill together with the evidence that motivated it.
## 2026-10-01: dispatches load the faculty charters
Campaign `eureka-substrate`, prose-map step 5 (map `references/faculty-philosophy-cut.md`, sections 5 and 8). Operator go: "go with 2 and 3; we're spending tokens to save tokens."
Evidence: the faculty charters now live as Claude Code agent types (`~/.claude/agents/{soul,hands,imagination,eyes,modeling,life}.md`) and own each faculty's identity, method and boundaries, but no brief named a `subagent_type`, so every dispatch was `general-purpose` and loaded no charter. A Soul pass also found that SKILL.md pointed at "the Soul and Imagination lines of the operational litany in `~/.claude/CLAUDE.md`"; those lines moved into the charters and the pointer was dead.
What changed. `references/briefs.md` requires `subagent_type` with the model on every dispatch, and each brief carries a `Dispatch:` line. Text a charter now owns is cut from the briefs: the `You are <Faculty>` lead-ins, the Soul identity sentence and its "do not edit or commit" and "restore after every mutation" bullets (`soul.md` Boundaries), and the Eyes "Read only" (`eyes.md`). The task-scoped parts stay. SKILL.md says each non-Self faculty is a subagent type of the same name and points at `soul.md` and `imagination.md`.
## 2026-10-01: verify summaries, a wait mode and a kill table
Campaign `eureka-substrate`, cut `tool-calling-s5` (map `references/tool-calling-cut.md`, sections 3 and 5). Operator go: "go with 2 and 3; we're spending tokens to save tokens."