Skip to content

✨ [feat] lanes: headless Build, QA and Review on Antigravity (run --agy) - #83

Draft
danielegaleazzi92 wants to merge 6 commits into
EricTechPro:mainfrom
danielegaleazzi92:feat/agy-lane
Draft

danielegaleazzi92 wants to merge 6 commits into
EricTechPro:mainfrom
danielegaleazzi92:feat/agy-lane

Conversation

@danielegaleazzi92

@danielegaleazzi92 danielegaleazzi92 commented Oct 23, 2026 •

Copy link
Copy Markdown

Note

⏳ Draft · slice 3 of #80 (Antigravity host) · stacked on #82 (which stacks on #81): merge in order, the diff shows the earlier slices until then

Problem

Solution

  • scripts/super-board-agy-lane.sh, the Codex lane's twin: same brief, same lane schema, same exit protocol (9 / 10 / 79 / 78 / 1); the brief goes in a file under inflight/ and agy -p gets a pointer (Windows caps a command line at 8 KB) and so does the card JSON, which the brief hands to the first skills check as a file rather than via stdin (a here-string was the one shell form the lane kept reaching for); --output-format json --json-schema <lane schema> --print-timeout <agy.timeout>; the result is the run's structured_output, checked with the same conforms as Codex. Model: --agy=<model> > agy.model > agy.ladder[tier][grade] > CLI default. Effort: agy.effort > review high > AGY_EFFORT[tier][grade]; a slug that already names an effort (gemini-3.8-flash-low) gets no --effort, since agy refuses the pair. Over quota (RESOURCE_EXHAUSTED, exit 3) is a halt (79), not a failure; denied_actions are named in detail with the permissions command; any other non-result fails closed and keeps the raw run under inflight/agy-<n>-<lane>.last.json
  • scripts/super-board-codex-wave.sh takes --codex|--agy and picks the launcher and the router (agy.router_model at --effort low, else the CLI default); process groups and the bash lookup now work on Windows too (taskkill /T, and shutil.which('bash') because a bare bash resolves to WSL's before PATH there). scripts/super-board-agy-wave.sh is the entry point that adds --agy; the PID marker, stop path and reconcile contract are shared
  • scripts/super-board-skills-ready.py --host agy: .agents/skills from the cwd up to the repository root, the project's .claude/skills (the brief tells lanes to read them) and ~/.agents/skills
  • config-schema.json: the agy block (model, ladder, effort, timeout, router_model) and usage_fallback: "agy"; install.sh ships the two scripts
  • Tests: tests/fixtures/fake_agy.py (prints the one JSON line agy 1.4.6 prints), tests/test-agy-lane.sh (consent, precedence, ladders, slug rule, failures, wave routing, router, halts, the workflow's summary keys), tests/test_agy_lane_schema.py (pins the lane schema to STAGE_SCHEMA)

Acceptance criteria

  • Review refuses without explicit --agy (78); the brief pins the reviewed head to the merge gate and forbids invoke_subagent
    ↳ verified: tests/test-agy-lane.sh
  • Model and effort follow the precedence above, review is always high, an effort suffix in the slug suppresses --effort, agy.timeout reaches --print-timeout
    ↳ verified: tests/test-agy-lane.sh ladder table (9 cells) and slug case; live on Windows with the fixture against a real repo: build lane --model gemini-3.8-flash --effort high --print-timeout 60m
  • No structured_output fails with the raw run kept; run status ERROR fails with its error; quota exhaustion halts (79); denied tool calls are named; every malformed result is refused and valid ones print unchanged
    ↳ verified: tests/test-agy-lane.sh
  • The wave routes Ready → build → qa → review, qa labels skip Build, a pinned model skips the router, the router uses agy.router_model at --effort low, halts stop dispatch (79 / 9), the summary carries the workflow's keys
    ↳ verified: tests/test-agy-lane.sh; live on Windows: one card build:advanced → qa:advanced → review:advanced with efforts low, low, high on --tier low, and a quota run review:halted, exit 79, no PID marker or lock left
  • End-to-end with this stack installed from the branches (install.sh --hosts agy --protect-main), agy 1.4.6 / gemini-3.8-flash on Windows 11, 2026-10-23: card feat: dynamic-workflow worker backend (worker_backend: "workflow") #3 of the playground went Ready → Done, ✨ [feat] cart: clearCart empties the cart and drops its discount danielegaleazzi92/super-board-agy-playground#4 (squash cc1b8ef), Build 8.5 min, QA + Review 19 min, every lane returning a valid structured result. The one lane that failed in between was denied on its first command because agy had rewritten its own settings file with a UTF-8 BOM and loaded no permissions from it; the helper now strips it (✨ [feat] install: guard hooks and permissions for Antigravity (agy) #82).
  • A real card with the earlier implementation: a card went Ready → Done on agy 1.4.6 / gemini-3.8-flash (✨ [feat] host: run the board on Google Antigravity (agy) #80, ✨ [feat] cart: percentage discount applied to the total danielegaleazzi92/super-board-agy-playground#2); the two lane-result losses seen there (work done, no structured_output) are what the raw-run file is for

Iteration history

Lane Done Time Details
🔨 author ✅ Oct 23 lane launcher + wave engine + resolver + fixture and tests · schema pin and smoke green on Git Bash (see note)

Risk

🟡 Medium · a new backend; the shared wave engine changes for Codex too.

  • Door: two-way · revert and the Codex path is byte-for-byte the previous logic (the host flag parsing, kill_group and BASH are the only shared lines)
  • Blast radius: super-board-codex-wave.sh for every Codex run (covered by test-codex-lane.sh and test-codex-wave-contract.sh, unchanged) · the new lane path for Antigravity runs only

Part of #80 (slice 3 of 4), stacked on #82. Note on tests: written on Windows Git Bash, where the stubbed gh of these suites cannot be executed by Windows Python (the same reason test-codex-lane.sh exits 79 there on main), so test-agy-lane.sh was exercised piecewise against a real repository with the fixture; the schema pin passes; the CI matrix is the check for the suite.

🤖 Generated with Claude Code

danielegaleazzi92 and others added 3 commits October 23, 2026 17:52
…g host

- super-board-host.sh answers agy on ANTIGRAVITY_AGENT=1 (observed on agy 1.4.6), after the Codex ids and OPENCODE, before CLAUDECODE; SUPER_BOARD_HOST and config host take agy
- setup check accepts host agy; schema, onboard and run-workflow name it (no lane backend yet: the run halts like opencode)
- docs/hosts.md: agy row, detection step and env evidence; tests for the sign, the override, the config key and the empty/id-only cases

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…vity (--hosts agy)

- hooks/agy-hook-adapter.py translates Antigravity PreToolUse payloads, runs the unchanged guard-*.py and answers deny/ask/allow; hooks/agy-hooks.json wires it
- install.sh --hosts agy: entry merged into .agents/hooks.json (other entries kept, --protect-push with --protect-main and kept on re-install, python on Windows), host detected from config/host.sh/an existing entry, no link folder, adapter not counted as a guard
- scripts/super-board-agy-permissions.py writes the lane profile (command/read_file/write_file * + deny rules for dangerous forms and secret paths) or --from-allowlist regex rules; dry run, --apply with backup
- tests: test-agy-hook-adapter.sh, test-agy-permissions.sh, test-install.sh scenario 25; CLAUDE.md install contract

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- the agy install line names it, the SCRIPTS list did not carry it

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
danielegaleazzi92 and others added 3 commits October 23, 2026 22:28
…ithout one

- agy 1.4.6 rewrites its settings.json with a UTF-8 BOM and then loads permissions=<nil>: every lane tool call denied until the file is rewritten; --apply now strips it (test 7)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…run --agy)

- scripts/super-board-agy-lane.sh: brief file + `agy -p --output-format json --json-schema`, model from --agy=/agy.model/agy.ladder, effort from agy.effort or the tier x grade ladder (review high; none when the slug names one), agy.timeout; result = structured_output validated like the Codex lane; raw run kept under inflight/ on failure; quota exhaustion halts (79); denied_actions named in detail
- scripts/super-board-codex-wave.sh takes --codex|--agy and picks the launcher and router (agy.router_model at effort low); process groups and bash resolution work on Windows; super-board-agy-wave.sh is the entry point
- super-board-skills-ready.py knows host agy (.agents/skills up to the repo root, .claude/skills, ~/.agents/skills)
- config-schema: agy block and usage_fallback agy; tests: fake_agy fixture, test-agy-lane.sh, test_agy_lane_schema.py

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… not stdin

- a PowerShell here-string was the one form the lane kept using for it and the permission check kept refusing; the brief now names .claude/super-board/inflight/agy-<n>-<lane>.card.json, removed with the brief

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant