From 0f2aee6bc95ec27552dbd6cbda1085fa93542ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabor=20K=C3=B6rber?= Date: Sat, 17 Oct 2026 00:50:01 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Guidance=20pass=20fixes:=20attac?= =?UTF-8?q?ker=20structure=20carry-over,=20reviewer=20test/flag=20checks,?= =?UTF-8?q?=20gremlin=20handoff=20note,=20stale=20fork=20and=20Zathras=20t?= =?UTF-8?q?ext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/spire/agents/athanor.md | 2 +- plugins/spire/agents/attacker.md | 3 ++- plugins/spire/agents/reviewer.md | 3 ++- plugins/spire/skills/gremlins/preamble.md | 8 ++++---- .../implementation/references/spawning-claude-code.md | 6 +++--- plugins/spire/skills/zathras/SKILL.md | 3 ++- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/plugins/spire/agents/athanor.md b/plugins/spire/agents/athanor.md index b920aca..b815c0b 100644 --- a/plugins/spire/agents/athanor.md +++ b/plugins/spire/agents/athanor.md @@ -36,7 +36,7 @@ The plan you receive has already been attacked and reshaped into phases and bloc - Stop a gremlin with `TaskStop` on its background Bash call. - Each brief says whether the gremlin commits and which paths it may touch. 3. **Gate between blocks.** The cheap check the plan or project config names (compile, typecheck). Not a review. -4. **Tests once**, at phase end. Fix the fallout in that last block. A child's "tests pass" is a claim: report green only from your own test run, and if a fix changed a test, name it in the phase close and leave judging it to the reviewer. +4. **Tests once**, at phase end. Fix the fallout in that last block. A child's "tests pass" is a claim: report green only from your own test run, and if any block or fix changed or deleted an existing test, name it in the phase close and leave judging it to the reviewer. 5. **Run log.** One short handoff note per block, then the phase close with the deviations and flags for the reviewer; "none" is a normal answer, and a real deviation is never left out. 6. **Hand back.** Igor dispatches the phase review. diff --git a/plugins/spire/agents/attacker.md b/plugins/spire/agents/attacker.md index 1b136ca..0bd486e 100644 --- a/plugins/spire/agents/attacker.md +++ b/plugins/spire/agents/attacker.md @@ -28,7 +28,8 @@ Test the plan adversarially against the code as it is now: Write a new build plan; the original stays as written. - Phases that each end in a testable state; blocks that one owner can finish. -- Per block: owner model, gate, what may stay broken until the next block (defaults from `spire:project` `## Build`). The build runs a cheap gate between blocks and the tests once per phase; an extra review at a hotspot needs a stated reason. +- Per block: owner (a gremlin for a complex block, a fresh Sonnet or Haiku agent for a mechanical one), gate, what may stay broken until the next block (defaults from `spire:project` `## Build`). The build runs a cheap gate between blocks and the tests once per phase; an extra review at a hotspot needs a stated reason. +- Carry over the plan's code structure (signatures included) and per-module size estimate, adjusted where the attack changes them. - Scope cut back to the goal: each block traces to a box, and cutting never removes a failure path or a test a box names. Code in the plan only where its exact form is the decision. - Decisions the user must make, listed. - A risk list for the build. It is not the reviewer's scope. diff --git a/plugins/spire/agents/reviewer.md b/plugins/spire/agents/reviewer.md index 9fad17d..74974e4 100644 --- a/plugins/spire/agents/reviewer.md +++ b/plugins/spire/agents/reviewer.md @@ -17,8 +17,9 @@ You review a phase you did not build. The brief names the build plan, the run lo - Run the gates and tests named in the brief or in `spire:project` `## Build`. - Trace concrete scenarios through the changed code. -- Read every flag in the run log's handoff notes; answer one in the report only where it changes a finding or a verdict. +- Check every flag in the run log's handoff notes; report one only where it changes a finding or a verdict. - Check the phase's diff for **weakened checks** (loosened assertions, downgraded errors, deleted tests) and **tests that cannot fail**; each one you find is a finding, and the search stays inside the diff. +- A behaviour or failure path the plan names with no test is a finding. - End with a short **Size and unrequested surface** section: size against the plan's estimate, and what was built that no plan box asked for, one line each. You list; Igor and the user decide, and an unplanned addition may be a good one. - The attack's risk list is not your scope. Look where the code tells you to. diff --git a/plugins/spire/skills/gremlins/preamble.md b/plugins/spire/skills/gremlins/preamble.md index c1dbbdc..752e39b 100644 --- a/plugins/spire/skills/gremlins/preamble.md +++ b/plugins/spire/skills/gremlins/preamble.md @@ -6,16 +6,16 @@ You run headless under `claude -p` in a Spire build: first as the trained base, - Never use `run_in_background` on Bash. Run every command in the foreground. - Stage and commit by explicit paths only, and only when your brief says this gremlin commits. Never push, rebase or reset. - Write gate and test output to `.txt` files under the state dir's `logs/` folder (the brief names the state dir). -- When you finish a block, write the handoff note to the path the brief names, in this format, and stamp your exact model id: +- When you finish a block, write the handoff note to the path the brief names, in this format, and stamp your exact model id. A few lines: findings, not narration. "none" is the normal answer for deviations and flags, and a real deviation or doubt is never left out. ```markdown ### Block — - Model: <exact model id> - Start / end: <`date` output> / <`date` output> - - Done: <what changed, in a few lines> - - Deviations from plan: <what, and why> — or "none" - - Flagged for review: <anything the reviewer should look at> + - Done: <what changed, in one or two lines> + - Deviations from plan: <what, and why, including size well over the plan's estimate> — or "none" + - Flagged for review: <a point you are unsure of, e.g. a semantic the plan left open> — or "none" - Left for later: <work deferred to a later block or phase> - Expected broken: <areas that do not build or pass yet, and which block fixes them> - Commits: <hashes> — or "none" when your brief says you do not commit diff --git a/plugins/spire/skills/implementation/references/spawning-claude-code.md b/plugins/spire/skills/implementation/references/spawning-claude-code.md index efef541..91d9093 100644 --- a/plugins/spire/skills/implementation/references/spawning-claude-code.md +++ b/plugins/spire/skills/implementation/references/spawning-claude-code.md @@ -14,7 +14,7 @@ The harness changes. When a claim fails, fix it here with a new date. ## Rules of thumb - **Foreground for sequential work.** Pass `run_in_background: false` when the next step depends on the result. Background only for independent leaves whose result can go to the session root. -- **Resume only from the session root.** Igor may `SendMessage` a finished agent (the Athanor between phases, an adept). A subagent should not resume its own children; it dispatches fresh foreground agents instead. +- **Resume only from the session root.** Igor may `SendMessage` a finished agent (the Athanor for the fix pass, an adept). A subagent should not resume its own children; it dispatches fresh foreground agents instead. - **Pinned agents: omit `model`.** The per-call alias overrides the agent's frontmatter pin. Pass `model` to a pinned agent only when you mean to override it, and say so in the journal or run log. - **Unpinned agents: pass `model`.** Otherwise they inherit the caller's model, which may be Fable. - **Stamp the model id.** Every agent reads its exact id from its system prompt and writes it into its output. @@ -59,9 +59,9 @@ The harness changes. When a claim fails, fix it here with a new date. |---|---| | The Agent tool schema documents `subagent_type: "fork"`: a fork always inherits the caller's model; the `model` parameter is ignored. | verified 2026-10-05 (schema text) | | `fork` is actually offered as an agent type in a given session. | unverified: the schema mentions it, but on 2026-10-05 it was not in the list of agent types offered to the reviewer | -| A fork copies the **caller**, not an arbitrary agent. Only the agent holding a context (e.g. the Athanor as trunk) can fork it. | assumed (no parameter names a fork source) | +| A fork copies the **caller**, not an arbitrary agent. Only the agent holding a context can fork it. Not used by Spire since 2026-10-16; trunk + gremlins replaces it. | assumed (no parameter names a fork source) | | A fork starts with the caller's full transcript, so it starts at the caller's token count. | assumed, not measured | -| Can a fork fork again? Does a foreground fork return its result to the caller? Does it see the caller's preloaded skills? | unknown; check in a throwaway preflight before relying on trunk and forks | +| Can a fork fork again? Does a foreground fork return its result to the caller? Does it see the caller's preloaded skills? | unknown; check in a throwaway preflight before relying on forks | ## Agent types diff --git a/plugins/spire/skills/zathras/SKILL.md b/plugins/spire/skills/zathras/SKILL.md index 03bc181..ed1bc04 100644 --- a/plugins/spire/skills/zathras/SKILL.md +++ b/plugins/spire/skills/zathras/SKILL.md @@ -60,11 +60,12 @@ Same model tiers as Igor (the `## Delegation` table in `skills/igor/SKILL.md`). | Skill/agent authoring, template changes | Implementer (Sonnet or Opus depending on complexity) | project-pinned or `model: "sonnet"`/`"opus"` (needs write access) | | Investigating plugin behavior, format questions | `search` agent or adept | `subagent_type: "search"` (read-only) or `"adept"` | | Gitea issues | Route through `gitea:*` skills | — | +| Plan, attack, phase review | `planner`, `attacker`, `reviewer` (pinned; never the author or builder) | `subagent_type` as named, `model` omitted | | Building an attacked, reshaped plan; non-build multi-part jobs | Athanor | `subagent_type: "athanor"` | | Test runs, verification, mechanical sweeps | Haiku subagent | `model: "haiku"` (needs Bash access) | | Deep research (design decisions, prior art) | `researcher` agent | `subagent_type: "researcher"` (Opus, writes reports) | -**Model rule.** Pinned agents: omit `model` (the alias overrides the pin). Unpinned agents: pass the alias. Leaf tasks say "do this yourself; do not dispatch further agents." +**Model rule.** Pinned agents: omit `model` (the alias overrides the pin). Unpinned agents: pass the alias, never Fable unless the user asks. Leaf tasks say "do this yourself; do not dispatch further agents." ## Adepts