🤖 Apply lean Athanor review fixes

Adept dispatches no longer pass a model alias over the pin. Igor checks
the stamped model id of plan, attack and phase-review outputs before
acting on them. Implementation work no longer goes to the Athanor as an
unplanned brief. The spawning reference says plainly that "verified"
means read from the schema, marks fork availability unverified, and
cites the 184/184 evidence for alias-over-pin. Minor consistency fixes:
trunk notes, re-check failure path, staging, fallout diffs, run-log
timing.
This commit is contained in:
2026-10-05 22:18:14 +02:00
parent 146a48c343
commit 5909221022
7 changed files with 25 additions and 22 deletions
+7 -7
View File
@@ -81,16 +81,16 @@ Pick the tier by task type (details in `references/model-tiers.md`). Prefer proj
| Planned implementation | implementer agent | project-pinned or `model: "opus"` (needs write access) |
| Complex summaries, git fixes, small code changes | Sonnet subagent | `model: "sonnet"` (needs write access) |
| Test runs, compiles, commits, linear-data summaries | Haiku subagent | `model: "haiku"` (needs Bash access) |
| Domain knowledge, repeated consultation on a subsystem | `adept` agent (long-lived, domain-scoped) | `subagent_type: "adept"`, `model: "opus"` |
| Domain knowledge, repeated consultation on a subsystem | `adept` agent (long-lived, domain-scoped) | `subagent_type: "adept"` (`model` omitted; pinned) |
| Building a reshaped plan; large multi-part jobs needing their own subagent fan-out | `athanor` | `subagent_type: "athanor"`, `model` omitted (pinned to Opus 5.5) |
The `athanor` is the forge — your heavy lifter. A build furnace pinned to Opus 5.5 that may use the Agent (Task) tool itself and runs its own subagents. Load it with the reshaped build plan (for non-build jobs: a brief with scope, output paths, completion criteria), close the door, and let it cook. It builds one phase per turn and hands back.
**Model must be explicit — and deliberate.** The per-call `model` is an alias and it overrides an agent's pinned model: `model: "opus"` gives the agent the Opus that alias resolves to, not its pin (a 4.6 Igor passing `opus` got a 4.6 Athanor). So: for agents pinned in their frontmatter (e.g. athanor) omit `model` unless you deliberately override the pin; for unpinned agents (general-purpose) always pass `model` (`"opus"`, `"sonnet"`, `"haiku"`), since omitting it inherits your model, which may be Fable. Note the choice in the journal, and have the agent stamp the model id it ran on. Subagents are Opus or lower; never dispatch a Fable-tier subagent unless the user explicitly asks. Model traits: the implementation skill's `references/models.md`.
**Model must be explicit — and deliberate.** The per-call `model` is an alias and it overrides an agent's pinned model: `model: "opus"` gives the agent the Opus that alias resolves to, not its pin (in spacecraft it overrode 4.6 pins in 184 of 184 spawns). So: for agents pinned in their frontmatter (e.g. athanor) omit `model` unless you deliberately override the pin; for unpinned agents (general-purpose) always pass `model` (`"opus"`, `"sonnet"`, `"haiku"`), since omitting it inherits your model, which may be Fable. Note the choice in the journal, and have the agent stamp the model id it ran on. For the plan, the attack and the phase review, check the stamped id before acting on the result; if it is not the intended model (Opus 5.5 by default), re-dispatch or tell the user. Subagents are Opus or lower; never dispatch a Fable-tier subagent unless the user explicitly asks. Model traits: the implementation skill's `references/models.md`.
## Development Cycle
Igor routes work through six stages. Not every task enters the cycle — one-off fixes, ad-hoc questions, and maintenance stay outside it. The line: if writing the plan would take longer than doing the work, it is not in the cycle.
Igor routes work through the stages below. Not every task enters the cycle — one-off fixes, ad-hoc questions, and maintenance stay outside it. The line: if writing the plan would take longer than doing the work, it is not in the cycle.
**Stages:** (1) Brainstorm — Igor with user or Pinky; skip when direction is clear. (2) Research — researcher/adept answers open questions. (3) Design — independent Opus agent produces one buildable approach. (4) Plan — independent Opus 5.5 agent (never the designer) produces steps with completion criteria. (4b) Attack the plan — Igor dispatches a fresh Opus 5.5 agent (never the planner) that tests the plan adversarially against the code (blockers, design errors, missed consumers of changed semantics), then reshapes it into a build plan: phases that end testable, blocks one owner can finish. One step. It is what pays for dropping per-task review. Show the user the build plan and its open decisions before the door closes. (5) Build — the Athanor builds one phase per turn: blocks, a cheap gate between them, tests once, a run log. (6) Phase review — Igor dispatches a fresh Opus 5.5 reviewer per phase, without the attack's risk list as its scope; it answers every handoff flag, hunts weakened checks and tests that cannot fail, and stamps its model id. Details in `spire:implementation`.
@@ -98,7 +98,7 @@ Igor routes work through six stages. Not every task enters the cycle — one-off
**Review decision tree:** Igor routes the outcome:
1. No Critical or Important findings — the phase is done. Minors are fixed in a fix pass if one runs, otherwise logged; never loop for minors.
2. Critical or Important — one fix pass (resume the Athanor), then a fresh reviewer re-checks only those findings. Then stop and go to the next phase. Findings too large for a fix pass go into a new plan (stage 4).
2. Critical or Important — one fix pass (resume the Athanor), then a fresh reviewer re-checks only those findings. Then stop and go to the next phase; a Critical or Important that survives the re-check goes to the user or into a new plan, not into the next phase. Findings too large for a fix pass go into a new plan (stage 4).
3. Approach is wrong, not the code — back to design (stage 3). Append a dated amendment.
4. Unresearched unknown surfaced — back to research (stage 2). Only for a genuinely new problem space.
5. Goal is wrong — stop. User's call.
@@ -130,7 +130,7 @@ Adepts are domain-scoped knowledge agents that persist within a session. They ac
When the roster shows the domain slug (successor):
```
Agent(subagent_type: "adept", name: "<slug>-adept", model: "opus",
Agent(subagent_type: "adept", name: "<slug>-adept",
prompt: "Your domain is <Name>. Your folder is <workpad>/adepts/<slug>/ — you are a
successor; it has a handoff.md. We are on branch <branch>. Session journal:
<journal-path>.
@@ -139,7 +139,7 @@ Agent(subagent_type: "adept", name: "<slug>-adept", model: "opus",
When the domain is new (slug not in roster — founding):
```
Agent(subagent_type: "adept", name: "<slug>-adept", model: "opus",
Agent(subagent_type: "adept", name: "<slug>-adept",
prompt: "Your domain is <Name> (<brief scope description>). Your folder is
<workpad>/adepts/<slug>/ — it does not exist; you are the founding adept.
We are on branch <branch>. Session journal: <journal-path>.
@@ -148,7 +148,7 @@ Agent(subagent_type: "adept", name: "<slug>-adept", model: "opus",
When the roster shows "(unmigrated: no frontmatter)":
```
Agent(subagent_type: "adept", name: "<slug>-adept", model: "opus",
Agent(subagent_type: "adept", name: "<slug>-adept",
prompt: "Your domain is <Name>. Your folder is <workpad>/adepts/<slug>/ — it predates the
tiered layout (no frontmatter, journals at the root). Migrate it during genesis
per adepts/CLAUDE.md, then orient. We are on branch <branch>. Session journal: