Skip to content

Release 0.4.0: gateway Auto-mode arbiter, GPT-6.1 Terra and Gemini 4 Argon - #48

Merged
greenpolo merged 16 commits into
mainfrom
fix/auto-mode-arbiter
Oct 30, 2026
Merged

greenpolo merged 16 commits into
mainfrom
fix/auto-mode-arbiter

Conversation

@greenpolo

@greenpolo greenpolo commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Summary

Auto mode on a Claude subscription runs Anthropic's server-side check whenever ANTHROPIC_BASE_URL points at the gateway. When a reply has no verdict, Claude Code falls back to its local classifier, which is billed as token usage. A reply that never carries safeguard_results also locks the session onto that local classifier. Multi now acts as the arbiter itself: every tool call it serves gets an evaluated verdict before the reply finishes.

Provider Auto-mode review
Claude Anthropic's server check, passed through unchanged
OpenAI inline Codex reviewer on the user's ChatGPT plan, under the user's autoMode and permission rules
Cursor the harness reviews its own actions
Zen, Antigravity, Grok, OpenAI with no reviewer found at launch unreviewed, and the session says so; Plan still refuses actions
  • A failure or timeout in the reviewer counts as flagged.
  • Read-only tools and coordination tools skip review: TodoWrite, handbacks, plan mode, AskUserQuestion, Agent, Skill, Task*.
  • Removed the parsing of Claude Code's private classifier prompt, pending-action attribution, approval.ts/tool-observer.ts/permission-hook.ts/safeguards.ts, and the /multi/permission route.
  • Existing native sessions and archived replies migrate on load.
  • The e2e Anthropic stub now returns safeguard_results as the real API does.

Closes #20.

This PR also contains the two unmerged fix/models-and-issue-45 commits (GPT-6.1 Sol and #45).

Verification

  • npm run check: 630/630, no DEP0190
  • npm run test:mod: 95/95
  • test:e2e: 115 pass. The one failure, "interactive plan: approve ExitPlanMode", also fails on the base commit under Claude Code 2.1.310.
  • Live on Max OAuth with Codex, Claude Code 2.1.310:
    • test:live:auto-mode passed for sonnet-main, gpt-6-luna-main and gpt-6-luna-worker, each allowing one command and denying another, with zero local Bash classifier requests and no latch.
    • test:live:reviewer passed.

Agent model naming

Claude Code's Agent schema accepts only Claude aliases. Multi used to remove a provider model (for example gpt-6-luna) in a tool.call hook. Claude Code treats a hook rewrite of a not_flagged call as server_input_rewritten and runs one billed local classifier per spawn. The gateway now removes the model from Agent calls to multi-* worker types before Claude Code sees the reply. This covers Claude passthrough SSE/JSON and gateway-built replies. The gateway records the model by tool_use id, and agent.spawn resolves it from that record. This is a narrow, documented exception to byte-for-byte Claude passthrough.

Live result: named-model spawns from both Claude and OpenAI main loops now trigger 0 local classifier requests (previously 1). Worker hand-backs were already free, because in auto mode workers report through SubagentHandback, which receives not_flagged.

Local e2e on Claude Code 2.1.311 passes 118/118 after 0f0a46f, which updates the test stubs for 2.1.311 (<summary> blocks, retrying dialog keys). 46e1c7a fixes a real race in which a message sent right after stopping a native worker could fail.

Release 0.4.0

Merging this PR publishes v0.4.0. It also contains the GPT-6.1 Sol and #45 commits from fix/models-and-issue-45.

  • npm run release -- <version> --summary "<line>" sets every manifest version, the ~x.y.z pins, the lockfile and the Codex client version, and turns ## Unreleased into a dated section.
  • npm run check:versions, run by npm run check, fails when any of those disagree.
  • .github/workflows/release.yml creates the v<version> tag and the GitHub release when that version reaches main and has no tag yet. It takes the title from the CHANGELOG summary line and the notes from that section.
  • Model strings: the OpenAI Terra row now runs gpt-6.1-terra, which Codex's live model/list lists, and Antigravity workers default to gemini-4-argon (from agy models).

🤖 Generated with Claude Code

https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn

greenpolo and others added 11 commits October 14, 2026 13:16
- Codex now lists gpt-6.1-sol first, so it is the multi-openai default and
  leads the OpenAI picker rows; gpt-6-astra stays selectable.
- Zen gains minimax-m3 (open-weight, text only; it served a live text
  request on 2026-10-14 and ignored an attached image). kimi-k2.6 answers
  "Endpoint is unavailable" and Qwen3.8 and Mistral Large 4 are closed-weight,
  so they are not added.
- The MULTI_CURSOR_EXTRA_MODELS help text names Grok 4.7, the row the Cursor
  picker already shows.
- A test pins that a newer Gemini generation (gemini-4-argon) becomes the
  Antigravity default once agy serves it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EydnYh64eSL17m398TTtu7
- A plugin agent whose frontmatter fails strict YAML (an unquoted `: ` in a
  description, as in pr-review-toolkit's silent-failure-hunter) is reparsed
  with its plain top-level values quoted, which Claude Code also accepts.
- An agent that still cannot be read keeps its name with a
  nativePermissionError, reported once on stderr: only native workers of
  that type are refused. Previously the error emptied the whole plugin
  inventory and made checkHarnessSettings refuse every native harness run.
- An enabled agy or Grok CLI that cannot list models (for example, not
  signed in) now warns and drops only its own rows instead of aborting the
  launch.

Fixes #45

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EydnYh64eSL17m398TTtu7
Harness replies carry only rows for finished native actions and the
hand-back; the harness applied the prompt-boundary mode itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
A Claude reply without safeguard_results latches Claude Code to local
classification for the whole session, so workers stopped carrying
safeguards and the plan-mode OpenAI worker case reached the stub's
classifier instead of the gateway verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
…ts live

The reviewer now receives auto_mode and permission rules from the request's
classifier context, so settings-level hard_deny/allow rules bind OpenAI
actions as they bind Claude's. The live auto-mode check now asserts that
server verdicts decide every Bash call with no local classifier request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
Copilot AI balanced review requested due to automatic review settings October 27, 2026 03:20

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

greenpolo and others added 5 commits October 27, 2026 01:31
Claude Code's Agent schema admits only Claude aliases, so the tool.call hook
removed a provider model from Agent calls. Claude Code treats any hook rewrite
of a not_flagged call as server_input_rewritten and runs a billed local
classifier, one per named-model spawn. The gateway now removes the model from
Claude passthrough and gateway-built replies before Claude Code sees them,
records it by tool_use id, and agent.spawn resolves it from the record.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
Since 2.1.311, Claude Code asks for a compaction summary again when the reply
has no <summary> block, so the stub summaries now carry one. The interactive
tests pressed Enter while a dialog still ignored keys, or before the paste
debounce settled. They now retry until the dialog closes or the prompt leaves
the input box.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
Stopping a Cursor, Antigravity or Grok worker aborts its exchange, but the lease
is released only after the run records its interruption. A message sent in that
window was refused as busy, and the worker failed. A lease now carries its
turn's signal. The next turn waits, bounded, for an aborted holder to release;
a live holder is still refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
npm run release -- <version> --summary "<line>" sets every manifest version,
the lockfile root, the ~<version> multi-core pins and the Codex client
version, and renames ## Unreleased to the dated release section with the
summary line under it. It refuses non-semver, non-increasing versions and a
missing or empty Unreleased section, and writes nothing when it refuses.

npm run check now runs check:versions, which fails when any field, pin or
the current CHANGELOG section disagrees with package.json. A new release
workflow tags v<version> on main when the tag is missing and publishes the
GitHub release titled from the summary line, with the section as notes.

Run for 0.4.0: gateway Auto-mode arbiter, GPT-6.1 Sol by default and the
#45 startup fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
… 4 Argon

Codex's live model/list serves gpt-6.1-terra on ChatGPT plans, so the OpenAI
Terra row moves off gpt-5.6-terra. agy models lists gemini-4-argon, which the
version-ranked Antigravity default already picks; a unit test pins that a new
generation without a Pro suffix outranks 3.8 Pro. Docs examples follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nFcG3gv5jZ5UkvyRDvdrn
@greenpolo greenpolo changed the title Make the gateway the Auto-mode arbiter Release 0.4.0: gateway Auto-mode arbiter, GPT-6.1 Terra and Gemini 4 Argon Oct 28, 2026
@greenpolo
greenpolo merged commit e959b96 into main Oct 30, 2026
12 checks passed
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.

Can't spawn subagent in auto mode

2 participants