✨ Apply Fable voice/philosophy review + audit fixes to Spire agents

Igor: clan opening, wired lifecycle (classification gate, conversation-to-work
trigger, proactive skim, wrap-up accretion), spawn template with branch/name/model,
synthesis-not-verification rule, model pinned to opus-4-6[1m], skill namespace
fixed to spire:igor. Task-notification plumbing extracted to harness-notes.md.
New mindset.md restores philosophical root lost in cross-repo extraction.

Adept: earned authority stance, strict-domain gravity well, compression-means-
successor in end-of-life.

Athanor: furnace opening paragraph, fixed broken @include path.

Implementation: fixed frontmatter name mismatch.

Journal template: Assistant -> Igor, contexts-as-paths comment.

Includes both review reports (Fable agent review, Sonnet skill audit).
This commit is contained in:
2026-09-14 16:14:44 +02:00
parent ca0e582b9f
commit dd9a49a6a2
10 changed files with 377 additions and 50 deletions
@@ -0,0 +1,65 @@
# Spire Plugin Skill Audit
Scope: all files under `plugins/spire/skills/`, `plugins/spire/agents/`, and the two plugin manifests. Mechanical review for namespace consistency, frontmatter correctness, cross-references, tome opt-in, and stale content.
## Errors
### 1. `skills/implementation/SKILL.md` — frontmatter `name` doesn't match its directory or its cross-references
- **File**: `plugins/spire/skills/implementation/SKILL.md:2`
- **Issue**: Frontmatter is `name: implementation-orchestration`, but the skill lives at `skills/implementation/` and is referenced elsewhere as `spire:implementation` (`agents/athanor.md:15`, `README.md`'s component table). If skill identity resolves from the `name` field, `spire:implementation` is a broken reference — the real id would be `spire:implementation-orchestration`. If identity resolves from directory name instead, the `name` field itself is just wrong/misleading.
- **Root cause**: this file is a verbatim carry-over from the old `g4b_ai:implementation-orchestration` skill (description text is byte-for-byte identical to the pre-migration `g4b_ai` version) — the folder was renamed to `implementation` but the frontmatter `name` was never updated to match.
- **Fix**: change frontmatter to `name: implementation`, matching the directory and every cross-reference.
### 2. `agents/athanor.md` — broken `@`-include path
- **File**: `plugins/spire/agents/athanor.md:25`
- **Issue**: `@.claude/skills/igor/references/project.md` assumes the consuming project vendors a copy of the igor skill under its own `.claude/skills/igor/`. That directory doesn't exist anywhere in this plugin or in the described "swappable per-project reference" design — the actual file lives at `plugins/spire/skills/igor/references/project.md` and is included correctly elsewhere via a relative path (`skills/igor/SKILL.md:13` uses `@references/project.md`).
- **Impact**: this include will not resolve for any project that installs `spire` as a normal plugin (i.e., doesn't hand-copy `igor/` into its own `.claude/skills/`). Athanor loses its per-project knowledge injection.
- **Fix**: use the same relative-path convention as `igor/SKILL.md`, or reference the skill's canonical resource path consistently (whatever that resolves to for agent frontmatter includes in this plugin system) — but not a project-local `.claude/skills/...` guess.
## Warnings
### 3. `agents/igor.md` — missing `model` field
- **File**: `plugins/spire/agents/igor.md`
- **Issue**: Every other agent (`adept`, `athanor`, `researcher`, `scout`, `search`) declares `model` explicitly. `igor.md` has `name`, `description`, `memory`, `skills` but no `model`. The plugin's own `model-tiers.md` reference is emphatic that model must always be explicit ("Always pass `model` on `Agent` calls... never dispatch a Fable-tier subagent unless the user explicitly asks"). If this omission means Igor inherits the invoking session's model, that may be intentional (Igor is user-invoked via `/igor`, not dispatched), but it's inconsistent with the rest of the plugin and worth a deliberate comment if intentional.
- **Fix**: either add an explicit `model:` (e.g. pin to Opus 4.6 per user's stated preference for coordinator-tier agents) or add a one-line comment/note explaining the intentional inheritance.
### 4. `agents/igor.md` — unnamespaced skill reference
- **File**: `plugins/spire/agents/igor.md:11`
- **Issue**: `skills:` lists `- igor` (bare), while every other cross-reference to a spire skill in this codebase is namespaced (`spire:workpad`, `spire:implementation`). Every other agent's `skills:` list uses `spire:workpad`. This is the only bare, unnamespaced entry.
- **Fix**: change to `spire:igor` for consistency, unless the agent's own self-referencing skill preload is meant to be resolved differently (worth confirming against how the harness treats an agent preloading "its own" named skill).
### 5. Tome sub-skills use a stale `tome:` namespace in prose, not `spire:`
- **Files**: `skills/tome/skills/navigate/SKILL.md:56`, `skills/tome/skills/check/SKILL.md:33`, `skills/tome/skills/init/SKILL.md:76,139`
- **Issue**: These reference sibling tome skills as `/tome:handoff`, `/tome:check`, `/tome:curate`, `tome:navigate` — a bare `tome:` namespace. Since `tome` is not its own plugin (no `plugin.json` under `skills/tome/`) but a nested skill group inside the single `spire` plugin, these are the exact kind of "leftover tome: namespace" the audit was asked to flag. They read as untouched holdovers from a time when tome may have been (or was modeled as) a standalone plugin.
- **Also affected**: `README.md:14` says tome setup happens "via `spire:init`" — but the actual skill is `skills/tome/skills/init/SKILL.md` with frontmatter `name: init`, cross-referenced everywhere else as bare `init`/`tome:init`, never as `spire:init`. Three different spellings of the same reference (`spire:init` in README, `tome:init`-style prose in the tome skills themselves, bare `init` in frontmatter) appear across the plugin — pick one and apply it uniformly.
- **Fix**: decide the real invocation form once tome's actual namespace resolution is confirmed (likely `spire:navigate`, `spire:check`, `spire:curate`, `spire:handoff`, `spire:init` given the single-plugin structure) and normalize all cross-references and the README to match.
### 6. `agents/adept.md` — non-standard model string, inconsistent with sibling Opus agent
- **File**: `plugins/spire/agents/adept.md:9`
- **Issue**: `model: claude-opus-4-6[1m]` (literal model id + a `[1m]` suffix, presumably a 1M-context variant flag) vs. `athanor.md`'s `model: claude-opus-4-6` (no suffix) and `researcher.md`'s `model: opus` (tier alias, not a literal id). Three different styles of specifying "Opus" appear across five agent files. This may be deliberate (adept is long-lived and journal-heavy, so a bigger context window is a reasonable ask), but it's worth confirming the `[1m]` syntax is actually a recognized model-id modifier in this harness rather than a copy-paste artifact.
- **Fix**: confirm intent; if deliberate, a short comment in the frontmatter block or agent body would help; if not, align to `claude-opus-4-6` like `athanor.md`.
## Nits
### 7. `skills/igor/references/journal-template.md` — stale "Assistant" heading
- **File**: `plugins/spire/skills/igor/references/journal-template.md:4`
- **Issue**: Template heading reads `# <Topic> — Assistant Session Journal`. Everywhere else in this plugin the session coordinator is named **Igor**, not "Assistant" — "Assistant" is the name of the analogous skill/agent that Spire is meant to replace (per `README.md:5`, "Replaces `g4b_ai`", and the currently-installed `assistant` skill elsewhere in this environment plays exactly Igor's role: session journal + delegation). This is a leftover from the pre-Igor template.
- **Fix**: `# <Topic> — Igor Session Journal`.
### 8. `.codex-plugin/plugin.json` is byte-identical to `.claude-plugin/plugin.json`
- **Files**: `plugins/spire/.claude-plugin/plugin.json`, `plugins/spire/.codex-plugin/plugin.json`
- **Issue**: Both manifests are word-for-word identical (name, version, description, author). Both are valid JSON and both correctly name the plugin `spire`, so nothing is broken today. But Codex's plugin/skill loading conventions are not confirmed to be schema-identical to Claude Code's (e.g. whether Codex expects a different manifest shape, additional fields, or a different skill-discovery mechanism). Flagging for manual confirmation rather than as a hard defect — could not verify the Codex plugin spec from this repo alone.
### 9. README's component table doesn't reflect that `tome` is 5 sub-skills, not 1
- **File**: `plugins/spire/README.md:14`
- **Issue**: Minor documentation completeness gap — the single README row for `tome` ("Navigate, curate, check, handoff, init.") is fine as a summary, but combined with finding #5 (namespace confusion) a reader has no single place that states the actual invocable names. Not a defect, just worth tightening once #5 is resolved.
## Confirmed correct
- **Tome opt-in (audit item 5)**: confirmed via `grep -rn '^skills:' -A5 agents/*.md` — no agent (`adept`, `athanor`, `igor`) lists any tome skill (`spire:navigate`, `tome:navigate`, `warpspace-tome:navigate`) in its `skills:` frontmatter. Tome is correctly absent from all agent preload lists; it's referenced only conditionally in prose ("if available in the project") in `agents/athanor.md:23` and `agents/adept.md:28`.
- **No `warpspace-*` or `g4b_ai` leftovers in code paths**: `grep -rniE 'g4b_ai|warpspace|forge\b'` across the whole plugin returns only `README.md:5` ("Replaces `g4b_ai`"), which is an intentional, correctly-worded historical note, not a leftover bug.
- **`svg` skill and its two reference docs** (`inline-svg.md`, `layout-legibility.md`): internally consistent, no namespace issues, no broken paths — clean.
- **Agent tool restrictions match their descriptions**: `researcher`, `scout`, `search` all correctly omit the `Agent` tool (leaf agents, matching their "cannot spawn sub-agents" descriptions); `athanor` correctly has `tools: "*"` (needs Agent tool to fan out); `adept` has no `tools:` restriction listed but its description and body correctly describe dispatching Explore subagents, consistent with unrestricted tool access.
- **`igor/SKILL.md`'s own `@references/project.md` include**: resolves correctly (relative to the skill file, matching the actual file at `skills/igor/references/project.md`) — this is the correct pattern that `agents/athanor.md` should have copied instead of inventing a different (broken) path.
- **Plugin manifests are valid JSON** and both declare `"name": "spire"` correctly.
- **`research` and `research-tree` skills**: frontmatter names match their directories, cross-reference each other and `workpad` correctly, and their described agent tiers (`scout`/`search`/`researcher`) match the actual agent files' models and tool sets exactly.