v2.39.0
Fixed
- The 97
agents/genius/*.mdreasoning-pattern agents were auto-registered as
invocable Agent-tool subagents with zero measured usage. An audit of every
past Claude Code session transcript (~768MB across 31 projects) found 97 of
98 genius agents were never invoked via the Agent tool, and the one that was
(lamport, once) was never run in parallel with anything, no isolation or
parallelism benefit was ever exploited, and tool restriction was already
ruled out (every genius agent shares the orchestrator's own toolset).
/genius-invoke,/genius-compose, and/genius-routealready cover this
ground more cheaply: all three readagents/genius/<name>.mddirectly and
apply the pattern inline, no subagent spawn.plugin.jsonnow declares an
explicitagentsarray listing only the 23 team agents, so Claude Code no
longer auto-registers the genius agents as a second, redundant invocation
path. The genius agent files themselves are untouched, still fully
readable by the three commands above, still 97 in number, still never a
removal candidate under this repo's own standard. Also re-synced
plugin.json's embedded hooks copy againsthooks/hooks.json(authoritative
since the Stop-hook dedup fix,4bd2f1d0), which had drifted and still
carried the duplicate registration that fix already resolved in the
canonical file.
Added
-
rules/agent-vs-skill-classification.md: five-test rule deciding whether a
team agent may be inlined as a skill (#120). Tests are tool-grant
guardrail, isolation need, model-tier delta from thesonnetbaseline
(tools/skill-runner.sh:31,35), packaged assets, and authority transfer.
Applied as a worked table over all 23 team agents with per-agent file:line
evidence: 9 subagent-only, 1 dual-surface, 13 skill-frontable. A verdict is
a candidacy, never an authorization to remove an agent, and the rule is
scoped toagents/*.mdonly, never to the 97 genius agents. Two premises
the plan asked the table to assume were checked and corrected against
origin/main:agents/ux-designer.md:8no longer carries the narrow
read-only tool grant its dual-surface staging was justified by (widened in
#116, commit4006565, as a frontmatter-vs-body consistency fix), and
refactoreris named by no skill'sagents:field. Recorded follow-up:
#119's escalation banner keys on model tier only, so it stays silent for
the four subagent-only agents that sit at the sonnet baseline
(code-reviewer, git-historian, research-scientist, reviewer-academic). -
tools/skill-runner.shmodel-tier escalation banner (#119). A skill
whoseagents:frontmatter names an agent above the sonnet baseline
(opus, fable) now gets a!!! MODEL-TIER ESCALATION REQUIRED !!!banner
before the procedure body, naming the agent and directing the caller to
spawn it as a real subagent instead of inlining its procedure at the
caller's own tier.commands/skill/run.mdis updated to act on it.
scripts/generate-skill-agent-model-matrix.pycomputes the full
skill-to-agent-to-model matrix from the tree (docs/skill-agent-model-matrix.md,
drift-checked): 65 skill files carry a non-emptyagents:field, and 63
of them name at least one escalation-tier agent. -
Delegation-contract schema + fail-closed validator (#116).
schemas/delegation-contract.schema.yaml
declares ownership, worktree policy, push authority, handback artifacts, an
external acceptance oracle, model, tool grant, and checkpoint policy for
anyscripts/spawn-agent.shdelegation.tools/delegation_contract.py
(stdlib-only, no new dependency) validates it and is now called BEFORE
git worktree add: a missing, malformed, or ownership-overlapping
contract is denied with a non-zero exit and creates nothing. -
Strict, full-tree frontmatter validator (#116).
tools/frontmatter_validator.py
parses every declared frontmatter block underskills/,agents/
(incl.agents/genius/),commands/, and the packaged
plugins/*/skills/surface with PyYAML's strictsafe_load, reporting
stable{file, line, rule}records. Found and fixed 7 skill files whose
unquotedinput:/output:values contained a colon-space, parsed as a
nested mapping key.
Fixed
-
scripts/spawn-agent.shcreated a git worktree before any precondition
check (#116). No ownership, scope, push-authority, handback, or
acceptance-oracle validation happened before the mutation. It now calls
tools/delegation_contract.pyfirst and refuses to create anything on an
invalid or missing contract. A follow-up review found that three of its
VAR="$(cmd)"assignments were bare statements underset -e, which
triggers on the assignment's own exit status before a subsequent
VAR_RC=$?check runs: a rejected contract exited 1 with the intended
"deny: ..." reason silently swallowed. Moved each into anif !condition
(exempt fromset -eby design) so the reason reaches stderr. -
Push authority was stated three different, contradictory ways (#116).
The generated zetetic-spine text (scripts/generate-spine.py) said "push,
and hand back immediately" unconditionally; ~116 agents' own inline
<worktree>sections said "do NOT push";worktree-protocol.mdalready
said push is delegation-controlled. All three now defer to the delegation
contract'spush_authorityfield, surfaced at runtime as
DELEGATION_PUSH_AUTHORITY. Also fixed in the same pass:ux-designer.md
declared tools omittedBash/Edit/Writedespite its required
procedures using them, andorchestrator.md's frontmatter selected
model: fablewhile its token-budget prose described Opus's budget.