Skip to content

v2.39.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 06:41
· 20 commits to main since this release

Fixed

  • The 97 agents/genius/*.md reasoning-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-route already cover this
    ground more cheaply: all three read agents/genius/<name>.md directly and
    apply the pattern inline, no subagent spawn. plugin.json now declares an
    explicit agents array 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 against hooks/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 the sonnet baseline
    (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 to agents/*.md only, 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:8 no longer carries the narrow
    read-only tool grant its dual-surface staging was justified by (widened in
    #116, commit 4006565, as a frontmatter-vs-body consistency fix), and
    refactorer is named by no skill's agents: 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.sh model-tier escalation banner (#119). A skill
    whose agents: 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.md is updated to act on it.
    scripts/generate-skill-agent-model-matrix.py computes 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-empty agents: 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
    any scripts/spawn-agent.sh delegation. 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 under skills/, agents/
    (incl. agents/genius/), commands/, and the packaged
    plugins/*/skills/ surface with PyYAML's strict safe_load, reporting
    stable {file, line, rule} records. Found and fixed 7 skill files whose
    unquoted input:/output: values contained a colon-space, parsed as a
    nested mapping key.

Fixed

  • scripts/spawn-agent.sh created 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.py first 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 under set -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 an if ! condition
    (exempt from set -e by 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.md already
    said push is delegation-controlled. All three now defer to the delegation
    contract's push_authority field, surfaced at runtime as
    DELEGATION_PUSH_AUTHORITY. Also fixed in the same pass: ux-designer.md
    declared tools omitted Bash/Edit/Write despite its required
    procedures using them, and orchestrator.md's frontmatter selected
    model: fable while its token-budget prose described Opus's budget.