0074: Google Antigravity adapter and hook lifecycle contract
Status: deferred (2026-09-20; accepted 2026-08-15, never implemented) · Scope: product tier (core/adapters, core/hooks, core/workflow, commands/init, commands/doctor)
Deferred. No Antigravity code exists in Harnery as of 2026-09-20; the four shipped adapters are Claude Code, Codex, Cursor, and OpenCode. The integration recipe below (registry profile, spawner with offline fixture, payload normalization,
init/doctorwiring) was reused by ADR 0189 and is the template to follow if this decision is picked up. Reactivate it with a dated status change and a plan; supersede it if Antigravity support is dropped for good.
Context
Section titled “Context”Harnery previously provided first-class support for three execution harnesses: Claude Code, Codex, and Cursor. Each harness has distinct invocation semantics, hook configuration schemas, event payload structures, and response protocols:
- Claude Code wires
.claude/settings.json, uses nestedhooks: [{ type: "command", command }]arrays, readsCLAUDE.md/@AGENTS.mdimports, and handles same-turnStopcontinuation natively. - Codex wires
.codex/hooks.json, uses strict top-level schema validation, enforces sandboxed workspace policies, and communicates authoritative results out-of-band via result files. - Cursor wires
.cursor/hooks.json(root version 1), uses flat{ command }entries with camelCase event names, and delivers JSON result envelopes.
Google Antigravity (agy CLI, Antigravity IDE, and Antigravity 2.0) has emerged as a major development environment. Antigravity establishes clear, standardized conventions:
- Customization Root: Discovers project-level configuration under
.agents/(.agents/skills/,.agents/rules/,.agents/hooks.json,AGENTS.md, andGEMINI.md) and user-level configuration under~/.gemini/config/. - Lifecycle Hooks (
.agents/hooks.json): Configured with named hook bundles (e.g."harnery": { ... }). SupportsPreToolUse,PostToolUse,PreInvocation,PostInvocation, andStop. Tool hooks require a regexmatcher(e.g."matcher": "*"). - Payload Encoding: Payloads sent to
stdinuse camelCase protojson (conversationId,workspacePaths,transcriptPath,artifactDirectoryPath,toolCall: { name, args },stepIdx,terminationReason,executionNum,modelName). - Stdout Contracts:
PreToolUse: Returns{ "decision": "allow" | "deny" | "ask" | "force_ask", "reason": "...", "overwrite": { ... } }.Stop: Returns{ "decision": "continue", "reason": "..." }to enforce turn policies and continue loops.PreInvocation: Returns{ "injectSteps": [...] }.
- Skills and Rules: Uses progressive disclosure on
.agents/skills/<name>/SKILL.mdand hierarchical rule loading onAGENTS.md.
Without a native adapter in Harnery, Antigravity users cannot take advantage of harn init, harn doctor, workflow child spawning, automated tool-use auditing, turn-stop governance, or offline adapter bench verification.
Alternatives Considered
Section titled “Alternatives Considered”- External plugin or bridge wrapper: Build an external wrapper script translating Antigravity payloads before invoking Harnery. Rejected because Harnery’s core design (ADR 0018) mandates that supported adapters are first-class, verified citizens in the adapter registry rather than unmonitored external shims.
- Separate adapters for CLI (
agy) vs IDE (antigravity-ide): Rejected because both surfaces share identical.agents/discovery roots, identical.agents/hooks.jsonschemas, and identical protojson payloads. A single adapter identifier (antigravity) cleanly covers both. - Coercing protojson upstream via jq/wrapper: Rejected because adding external shell dependencies breaks cross-platform portability. Tolerant normalization inside Harnery’s
parsePayloadis fast, zero-dependency, and type-safe.
Decision
Section titled “Decision”Add first-class "antigravity" adapter support across all Harnery subsystems:
1. Adapter Registry & Capabilities (core/adapters/)
Section titled “1. Adapter Registry & Capabilities (core/adapters/)”Register BUILTIN_ADAPTER_PROFILES["antigravity"]:
id: "antigravity"displayName: "Google Antigravity"binary: "agy"installHint: "https://antigravity.google/docs"loginHint: "run \agy` and complete authentication“`apiKeyEnv: "GEMINI_API_KEY"modelFamily: "multi"effortValues: [](Gemini model selection manages reasoning modes directly)- Declare explicit capabilities:
invocation: supported("Headless CLI subprocess via agy.")toolEvidence: supported("PreToolUse and PostToolUse capture full tool calls and execution state.")policyMapping: supported("PreToolUse maps ALLOW/DENY/ASK and tool-input overwrite directly.")sessionId: supported("Read from conversationId in protojson payloads.")preCompactionSignal: unknown()postCompactionSignal: unknown()
2. Event Schema & Hook Adapter (core/hooks/)
Section titled “2. Event Schema & Hook Adapter (core/hooks/)”- Add
"antigravity"to the canonicalAdapterunion incore/hooks/events/schema.ts. - Define
ANTIGRAVITY_EVENTSandADAPTER_SPECS["antigravity"]incore/hooks/adapter/events.ts:settingsFile: ".agents/hooks.json"entryShape: "antigravity"(named bucket wrapper withmatcherfields on tool events)- Map
PreToolUse→pre-tool-use,PostToolUse→post-tool-use,PreInvocation→session-start/user-prompt-submit,Stop→stop.
- Update
core/hooks/adapter/parse.tsto normalize camelCase protojson fields:conversationId→session_id/conversation_idtoolCall.name→tool_nametoolCall.args→tool_inputstepIdx→turn_idtranscriptPath→transcript_path
- Update
core/hooks/adapter/output.tsto format stdout decisions adhering to Antigravity’s schema ({ decision: "allow" | "deny" | "ask" }forPreToolUse,{ decision: "continue", reason: "..." }forStop). - Update
core/hooks/adapter/detect.tsto recognize--adapter antigravityandAGENT_COORD_ADAPTER=antigravity.
3. Workflow Subprocess Spawner (core/workflow/spawn-antigravity.ts)
Section titled “3. Workflow Subprocess Spawner (core/workflow/spawn-antigravity.ts)”- Implement
buildAntigravityInvocation(request, resultFile)to constructagysubprocess arguments. - Implement
normalizeAntigravityResult(raw)to map CLI output and exit codes into a unifiedSpawnResult. - Provide an offline deterministic test fixture in
registry.tsforharn adapter bench.
4. Setup, Diagnostics, and Instructions (commands/ & lib/instructions/)
Section titled “4. Setup, Diagnostics, and Instructions (commands/ & lib/instructions/)”harn init --adapter antigravity: Writes/merges.agents/hooks.jsonwithout disturbing custom user hooks, and injects managed orientation blocks intoAGENTS.md.harn doctor: Probesagyexecutable availability, verifies.agents/hooks.jsonhook registration, and checks instruction synchronization.lib/instructions/apply.ts: Deploys agent skills directly to.agents/skills/without needing import shims, as Antigravity natively loads this path.
Result
Section titled “Result”Not implemented. The decision was accepted on 2026-08-15 but no slice shipped:
there is no antigravity adapter id, profile, spawner, hook translation, or
init branch in the codebase. The expected outcomes when the work is picked up
are unchanged:
harn adapter listandharn adapter show antigravitydisplay verified capability claims.harn adapter bench antigravityexecutes offline conformance checks verifying invocation planning and result normalization without requiring live model calls.harn init --adapter antigravitybootstraps Harnery coordination in Antigravity projects in a single idempotent step.- Lifecycle events, tool auditing, and turn-stop policies function in Antigravity environments.
ADR 0189 delivered the same recipe for OpenCode on 2026-09-20 and is the worked example of every step above.