Skip to content

v0.24.0

Choose a tag to compare

@github-actions github-actions released this 24 Aug 23:31
· 29 commits to main since this release
ffb2934

[0.24.0] - 2026-08-24

Added

  • Native Google Antigravity hooks compiler and subagent orchestration (#193, PR #194).
    • Implemented render_antigravity_hooks in scripts/compile_prompts.py supporting native Antigravity hooks.json schema ({"<hook_id>": {"PreInvocation": [...], "PostToolUse": [...], "Stop": [...]}}).
    • Switched harnesses/antigravity/marc/compile.json to "hook_dialect": "antigravity".
    • Upgraded Antigravity @techlead dispatch instructions with native invoke_subagent features: Workspace: "share" for parallel writer isolation, Gemini model tier selection (flash for @research, pro/inherit for @dev, @sec, @rev, @sre), dynamic specialization via define_subagent (e.g. enable_write_tools: false for read-only agents), and send_message coordination.
    • Added hook dialect structural schema validation in core/scripts/test_hooks_parity.py.
    • Updated harnesses/antigravity/marc/COMPATIBILITY.md and CI assertions.
  • @sec gains the Skill tool for /security-review (#191, PR #192). @sec
    (tools now Read, Grep, Glob, Bash, WebFetch, TodoWrite, Skill) invokes the
    harness's built-in /security-review as an additional input pass alongside
    its existing checklist, closing the capability gap with @rev's
    /code-review grant from #125. The skill never replaces the checklist or
    the deliverable: @sec still authors the ## @sec review comment with its
    own ranked findings and verdict, and treats a thin or empty
    /security-review result as inconclusive rather than a PASS.
    core/skills/tech-lead/SKILL.md now also records that granting a
    specialist a new tool is the operator's decision, made per demonstrated
    capability-need and never a blanket default.

Fixed

  • hooks.json is now compiled from core/, and Antigravity's hooks actually
    work (#173, #170).
    hooks.json was the one load-bearing plugin component
    hand-maintained per harness instead of generated — Claude Code's copy was
    de-facto canonical, Copilot's hand-written copy drifted independently (twice,
    per #166/#173), and Antigravity's was a bare symlink to Claude Code's
    hooks/ that hardcoded ${CLAUDE_PLUGIN_ROOT} with no fallback, so all five
    Antigravity hooks (outdated-check, invariants-card, token-guard,
    outdated-recheck, token-telemetry) silently no-op'd. core/hooks/ hooks.spec.json is now the single harness-neutral source; each harness's
    compile.json declares an explicit hook_dialect (Claude Code/Antigravity
    share one schema, Copilot has its own) and hook_ids (which hooks it
    ships — Copilot's narrower coverage is now a reviewable declaration, not an
    accident). scripts/compile_prompts.py renders each harness's own
    hooks/hooks.json and copies only the .sh scripts it actually needs; the
    Antigravity symlink is gone in favor of a real compiled directory. A hook
    whose script cannot be found now says so once per session, visibly, on
    stderr (deduped via a state-file marker keyed off the hook's own
    session_id, so a broken install doesn't flood the transcript on every
    PostToolUse call) instead of the old blanket 2>/dev/null; exit 0 that
    made a resolution failure indistinguishable from "ran, nothing to report"
    — ordinary quiet no-ops (e.g. no team.toml in a repo) are unaffected.
    outdated-check.sh/outdated-recheck.sh also now find the plugin manifest
    at either .claude-plugin/plugin.json (Claude Code) or a root-level
    plugin.json (Antigravity/Copilot). The compiler validates every
    spec/config value it interpolates into a hook command and refuses
    (fail-closed) to render one containing a shell metacharacter, so a future
    careless edit can't splice unescaped shell into the shipped hooks.json.
    A new core/scripts/test_hooks_parity.py gates CI against hand-edit drift,
    missing hook scripts, and that same class of unsafe interpolation,
    alongside the existing test_script_parity.py.