Skip to content

fix(orchestration): make every well-known agent addressable as a group - #20549

Open
OrcaWin wants to merge 1 commit into
mainfrom
fix/orchestration-antigravity-first-class
Open

OrcaWin wants to merge 1 commit into
mainfrom
fix/orchestration-antigravity-first-class

Conversation

@OrcaWin

@OrcaWin OrcaWin commented Sep 14, 2026 •

Copy link
Copy Markdown
Collaborator
Files Added Deleted Net
Test 3 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​207 $\color{#cf222e}{\Huge{\mathbf{−}}}$​1 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​206
Prod 6 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​68 $\color{#cf222e}{\Huge{\mathbf{−}}}$​42 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​26

What this fixes

A coordinator sent --to "@antigravity" to a Run that had a live Antigravity worker and got back:

No recipients resolved for group address: @antigravity

Agent-name group addresses were a hand-kept literal of nine names (claude, openclaude, codex, opencode, mimo, gemini, droid, grok, cursor). The canonical agent list ALL_TUI_AGENTS had grown well past that, and the literal never followed. Twenty-eight launchable agents resolved to nobody — Antigravity among them. The host had correctly published agentIdentity: 'antigravity' for the pane; the resolver simply had no entry to match it against, so it returned an empty handle list.

The second half of the problem is what made it hard to diagnose. resolveGroupAddress returned [] for an unknown group and for a known group with no current members, so the two were indistinguishable at the call site. @antigravity (valid, live worker) and @antigravty (a typo) produced the identical sentence. And from a sender bound to no Run, the Run-binding check ran first, so a misspelled group was reported as a binding failure — pointing the author at --run instead of at the typo.

The full set that was unaddressable, taken verbatim from the failing ratchet test below: claude-agent-teams, devin, ante, trae, autohand, mimo-code, pi, omp, prime-agent, antigravity, aider, goose, amp, kilo, kiro, crush, aug, cline, codebuff, command-code, continue, kimi, mistral-vibe, qwen-code, rovo, hermes, openclaw, copilot.

The fix derives the addressable set from ALL_TUI_AGENTS — which the compiler makes exhaustive over TuiAgent — so a new agent is addressable the day it is declared, adds isRecognisedGroupAddress so orchestration.send can reject an unknown group as invalid_argument before it reads the sender's binding, and rewrites the guides generically so they cannot drift again.

Fix evidence

All commands run from the worktree root on branch fix/orchestration-antigravity-first-class.

Before — behavioural tests fail against the pre-fix resolver

With groups.ts and send-group.ts reverted to their pre-fix state and the new tests left in place:

$ npx vitest run --config config/vitest.config.ts src/main/runtime/orchestration/groups.test.ts

     × routes every canonical agent id to a pane the host resolved as that agent 8ms
     × routes @antigravity to a live Antigravity pane 2ms
     × separates a misspelled agent group from a recognised one 1ms
     × recognises every canonical agent id and the legacy alias 1ms
     × recognises the identity-free group forms 2ms
     × does not recognise the unknown-agent sentinel or a bare handle 0ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 6 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  src/main/runtime/orchestration/groups.test.ts > addressable agent coverage > routes every canonical agent id to a pane the host resolved as that agent
AssertionError: expected [ Array(28) ] to deeply equal []

- Expected
+ Received

- []
+ [
+   "claude-agent-teams",
+   "devin",
+   "ante",
+   "trae",
+   "autohand",
+   "mimo-code",
+   "pi",
+   "omp",
+   "prime-agent",
+   "antigravity",
+   "aider",
+   "goose",
+   "amp",
+   "kilo",
+   "kiro",
+   "crush",
+   "aug",
+   "cline",
+   "codebuff",
+   "command-code",
+   "continue",
+   "kimi",
+   "mistral-vibe",
+   "qwen-code",
+   "rovo",
+   "hermes",
+   "openclaw",
+   "copilot",
+ ]

 ❯ src/main/runtime/orchestration/groups.test.ts:226:27

 Test Files  1 failed (1)
      Tests  6 failed | 29 passed (35)

Honest caveat on that run: four of those six are TypeError: isRecognisedGroupAddress is not a function, because reverting the fix also removes the export the test imports. Those four are not a clean behavioural before/after — they demonstrate the function is new, not that the old code misbehaved. The two that are genuine behavioural failures are the 28-agent coverage assertion quoted in full above and routes @antigravity to a live Antigravity pane. The RPC-level run below is the clean behavioural pair, because send-group.test.ts goes through the RPC and imports nothing new.

Same revert, at the RPC layer — these are real assertion failures, not import errors:

$ npx vitest run --config config/vitest.config.ts src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts

 FAIL  src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts > orchestration.send group addresses > delivers @antigravity to the live Antigravity worker of the sender Run
OrchestrationError: No recipients resolved for group address: @antigravity
 ❯ sendGroupMessage src/main/runtime/rpc/methods/orchestration/messaging/send-group.ts:173:11

 FAIL  src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts > orchestration.send group addresses > separates an unrecognised group name from a recognised group with no members
AssertionError: expected OrchestrationError: No recipients resolve… { …(2) } to match object { code: 'invalid_argument', …(1) }

- Expected
+ Received

- {
-   "code": "invalid_argument",
-   "message": StringContaining "Unknown group address",
+ OrchestrationError {
+   "code": "terminal_not_found",
  }

 ❯ src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts:677:6

 Test Files  1 failed (1)
      Tests  3 failed | 34 passed (37)

That second failure is the diagnosis bug stated exactly: the typo @antigravty came back as terminal_not_found / "No recipients resolved", the same answer a correctly addressed empty group gives.

Before — the documentation ratchet fails against the old guides

With the source fix in place but the guides reverted to their pre-fix wording:

$ npx vitest run --config config/vitest.config.ts src/main/runtime/orchestration/group-address-doc-enumeration.test.ts

 FAIL  src/main/runtime/orchestration/group-address-doc-enumeration.test.ts > group address documentation > never enumerates the agent-name groups, which drift behind the resolver
AssertionError: Name at most one agent group per paragraph and write the set generically: `@all`, `@idle`, `@worktree:<id>`, `@<agent>`.: expected [ …(2) ] to deeply equal []

- Expected
+ Received

- []
+ [
+   "skill-guides/orchestration/references/messaging-and-gates.md:42 names claude, codex, cursor, droid, gemini, grok, opencode",
+   "docs/site/content/docs/cli/orchestration.mdx:118 names claude, codex, cursor, droid, gemini, grok, opencode",
+ ]

 Test Files  1 failed (1)
      Tests  1 failed | 2 passed (3)

This is a clean before/after: only prose changed between the two runs.

After — full fix, run post-squash on the final commit

$ pnpm test src/main/runtime/orchestration/groups.test.ts src/main/runtime/orchestration/group-address-doc-enumeration.test.ts src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts

 RUN  v4.1.11 /Users/m4air/orca/workspaces/orca/crashfix-antigravity

 Test Files  3 passed (3)
      Tests  75 passed (75)
   Start at  20:23:34
   Duration  31.19s (transform 25.17s, setup 325ms, import 30.49s, tests 576ms, environment 0ms)

Typecheck

$ pnpm tc > /tmp/tc.log 2>&1; echo "EXIT=$?"; cat /tmp/tc.log
EXIT=0
$ pnpm run typecheck
$ node config/scripts/run-typecheck-projects-in-parallel.mjs

Changed-code quality gate

$ pnpm run check:code-quality:changed
EXIT=0
$ node config/scripts/check-changed-code-quality.mjs
code quality: 0 new finding(s) across 7 changed file(s).
casting code quality: 0 new finding(s) across 7 changed file(s).
type-aware code quality: 0 new finding(s) across 7 changed file(s).
React Doctor: 0 new finding(s) across 7 changed file(s).
casting SAFETY: rationale: 0 new finding(s) across 7 changed file(s).
Changed-code quality gate passed since 16d1ab81d3fd.

Generated bundle stays in step

src/cli/bundled-skill-guides.ts is generated from skill-guides/, so the prose edit regenerates it:

$ pnpm run verify:bundled-skill-guides
EXIT=0
$ node config/scripts/generate-bundled-skill-guides.mjs --check

ELI5

Orca can run many different AI coding assistants side by side, each in its own terminal pane. A coordinator can send one message to all the panes running a particular assistant by writing an address like @codex — a bit like an email group alias.

The list of valid aliases was typed out by hand in one file, and it listed nine assistants. But Orca had quietly grown to support many more. Nobody went back and added them to the alias list. So if you addressed a message to @antigravity, the mail system looked up "antigravity" in its little list of nine, didn't find it, and told you "nobody is there" — even though an Antigravity assistant was sitting right there, running, waiting.

Worse, the system gave the exact same answer for two completely different situations: "that alias doesn't exist" and "that alias exists but nobody's currently in the group." So if you fat-fingered @antigravty, it told you the same thing as a correct address to an empty group, and you'd go hunting for the wrong problem. If you weren't part of a project group at the time, it got even more confusing — it would blame that instead of your typo.

Two changes. First, stop typing the alias list by hand. Build it automatically from the master list of assistants Orca supports, so the moment someone adds a new assistant, its alias works — no one has to remember. Second, teach the system to tell the two situations apart: if you use an alias that doesn't exist at all, it now says "Unknown group address" and lists the valid shapes, instead of shrugging and saying nobody's home.

There's also a bookkeeping change. The instruction manuals also listed the nine names by hand, and they'd drifted too. Those now describe the rule ("any agent id") instead of listing names, and there's an automated check that fails the build if anyone writes out a list of names in the docs again — so this particular drift can't come back.

Trade-offs

Real negatives, stated plainly:

  • A previously-silent address now throws. @nonsense used to resolve to zero recipients and then surface as terminal_not_found "No recipients resolved". It now throws invalid_argument "Unknown group address". Any caller — script, agent prompt, integration test — that catches terminal_not_found and treats it as "nothing to do" will now see an unhandled invalid_argument instead. This is an error-code change on an existing path, and it is user-visible.
  • This is an RPC error-shape change, which crosses the remote wire. A paired client and host update independently. An older client talking to a newer host will receive an invalid_argument code on orchestration.send where it previously got terminal_not_found. No new field, opcode, or param is introduced, so nothing is dropped or fails to decode — but a client with code-specific error handling for group sends sees different text and a different code. Reviewers who care about mixed-version behaviour should look here first.
  • The addressable namespace grew by 28 names in one step. Any agent id that happens to collide with something a user expected to be free is now a reserved group address. I am not aware of a collision, but the set was not audited name-by-name against user-chosen handles — isRecognisedGroupAddress returns false for a bare handle (no @), so the collision surface is limited to @-prefixed strings only.
  • The doc ratchet is a heuristic and can misfire. It flags any doc paragraph that backticks two or more names matching the agent-group set. continue, amp, crush, goose, pi, ante and copilot are ordinary English words or common product names. A future paragraph that legitimately mentions, say, `continue` and `copilot` in unrelated prose will fail this test with a confusing message. The mitigation is only that the assertion message names the remedy. The threshold (MAX_AGENT_GROUPS_PER_PARAGRAPH = 1) is a tuning knob that could need raising.
  • The ratchet reads the filesystem on every run. It walks skill-guides/ and docs/ for .md/.mdx. It uses the shared scanSourceTree so it skips node_modules, .next, .source and out — an earlier version did not, and failed on dependency markdown belonging to whoever had previewed the docs locally. It is still I/O in a unit test suite, and it will get slower as the docs grow.
  • Legacy @mimo is now an alias, not the name. Both @mimo and @mimo-code resolve to the mimo-code identity. That is two addresses for one group, which is mild clutter and something a future cleanup has to decide about rather than a clean state.
  • Merge-order friction. This edits src/cli/bundled-skill-guides.ts, which is generated with very long lines — any in-flight branch touching skill-guides/ will conflict there and must be resolved by regenerating (pnpm run verify:bundled-skill-guides to check), not by hand-merging. It also rewrites the group-address paragraph in both docs/site/content/docs/cli/orchestration.mdx and skill-guides/orchestration/references/messaging-and-gates.md.
  • No end-to-end proof. The evidence above is unit and RPC-level. I did not launch Orca and send @antigravity to a real Antigravity pane. The test asserts on agentIdentity: 'antigravity' as the host publishes it; if the host ever publishes a different identity string for that agent, these tests would still pass while the real path stayed broken.
  • What it does not fix: title-based matching is still deliberately refused (a pane titled "port the antigravity launcher" is not addressed by @antigravity — there's a test pinning that), and this changes nothing about how agent identity is detected. If the host never resolves a pane's identity, that pane remains unaddressable by agent group, exactly as before.

Adversarial review

Three loops. What each raised and how it was resolved:

Loop 1 — the fix was half a fix. The initial change replaced the nine-name literal with a derivation from ALL_TUI_AGENTS, which made @antigravity route. The review's objection was that this fixed routing but left the reported symptom's diagnosis untouched: an unknown group and an empty group still both resolved to [] and produced the same message, so a user who typo'd would still be misled, and a user in no Run would still be told it was a binding problem. Resolved by adding isRecognisedGroupAddress and a check in sendGroupMessage that runs before resolveAudienceRunId(), so the typo is reported as a typo regardless of binding state. resolveGroupAddress stays total and still returns [] — the distinction is a separate query, not an exception thrown from the resolver.

Loop 2 — the docs were still the old nine, and would drift again. The review pointed out that the resolver was now self-maintaining but every shipped description a coordinator actually reads (orchestration.mdx, messaging-and-gates.md, the CLI spec notes, and the generated bundled-skill-guides.ts) still enumerated the closed nine. So @antigravity would work while every piece of documentation said it didn't — and the same drift would recur on the next agent. Resolved by rewriting all four generically (@all, @idle, @worktree:<id>, @<agent> for any agent id --agent accepts) and adding group-address-doc-enumeration.test.ts as a ratchet that fails if any paragraph enumerates the set again. The generated bundle is covered transitively via verify:bundled-skill-guides.

Loop 3 — the ratchet itself was unsound. Two defects found in the new test. (a) Its recursive walk descended into docs/site/node_modules: docs/site is a self-contained Next.js app whose own README tells contributors to pnpm --ignore-workspace install there, so anyone who had previewed the docs had dependency markdown on disk, and the test failed on files the contributor neither owns nor can edit. Resolved by switching to the shared scanSourceTree, which skips node_modules, .next, .source, out and dot-directories — and pinned with a second test asserting no such path is ever scanned. (b) Its regex matched bare @name, so npm scopes like @opencode-ai/sdk counted as group addresses and produced false positives. Resolved by requiring the backticked form `@name`. The review also asked that the failure message carry the remedy rather than a bare array diff, which is why the assertion passes a message naming the generic form.

Final loop result: CLEAN — no findings.

Verification quoted in full under Fix evidence: 75 tests passing across the three files, pnpm tc exit 0, changed-code quality gate 0 new findings across 7 changed files.

Agent-name group addresses were a hand-kept literal of nine names that drifted
behind the canonical agent list. Twenty-eight launchable agents -- antigravity
among them -- resolved to nobody, and because an unknown group and an empty
group both resolve to zero handles, a misspelling was reported exactly like a
correctly addressed pane with no members.

Derive the addressable set from ALL_TUI_AGENTS, which the compiler makes
exhaustive over TuiAgent, so a new agent is addressable the day it is declared.
Keep the legacy @mimo alias pointing at the mimo-code identity. Add
isRecognisedGroupAddress so orchestration.send rejects an unknown group as
invalid_argument before it reads the sender's Run binding, separating a typo
from an empty group and from a binding problem.

Rewrite the guides generically (@ALL, @idle, @WorkTree:<id>, @<agent>) and add a
ratchet test that fails if any doc paragraph enumerates the agent groups again.
@coderabbitai

coderabbitai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

📝 Walkthrough

Walkthrough

Agent group addresses now derive from ALL_TUI_AGENTS, including antigravity, while preserving the mimo alias. Unknown addresses are rejected before sender binding and recipient discovery. Recognized empty groups retain a distinct terminal_not_found response. Tests cover routing, recognition, validation, and documentation enumerations. CLI and orchestration documentation now uses the generic @<agent> form.

Priority: ⬇️ Low

Severity of issue fixed: Low

Merge Risk: 🔵 Low · up to c72f5

The documented address forms omit the supported legacy @mimo alias, which can lead users to believe a valid routing address is unknown. Document the alias before merging.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 6 files. (2 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary change: making every well-known agent addressable as a group.
Description check ✅ Passed The description is detailed and covers the problem, implementation, rationale, trade-offs, review concerns, and verification results. It does not include the required Linked Issue, Visual Proof or exp…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 6 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 8190119a-991a-45dc-801a-d3cd76d06703

📥 Commits

Reviewing files that changed from the base of the PR and between 3ab2a1b and c72f556.

📒 Files selected for processing (9)
  • docs/site/content/docs/cli/orchestration.mdx
  • skill-guides/orchestration/references/messaging-and-gates.md
  • src/cli/bundled-skill-guides.ts
  • src/cli/specs/orchestration.ts
  • src/main/runtime/orchestration/group-address-doc-enumeration.test.ts
  • src/main/runtime/orchestration/groups.test.ts
  • src/main/runtime/orchestration/groups.ts
  • src/main/runtime/rpc/methods/orchestration/messaging/send-group.test.ts
  • src/main/runtime/rpc/methods/orchestration/messaging/send-group.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.

- Default `check` is the bound Run's oldest unacked Delivery (FIFO). Replay until `--ack`.
- `--peek` / `--all` do not consume mail.
- Group addresses: `@all`, `@idle`, `@claude`, `@codex`, `@opencode`, `@gemini`, `@droid`, `@grok`, `@cursor`, `@worktree:<id>` — never for `worker_done` / heartbeat.
- Group addresses: `@all`, `@idle`, `@worktree:<id>`, and `@<agent>` for any agent id `--agent` accepts (`@codex`, and every other launchable agent) — never for `worker_done` / heartbeat.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Document the legacy @mimo alias in every group-address reference. The runtime accepts @mimo as an alias for mimo-code, but these exhaustive-looking address descriptions omit it. Users can incorrectly treat a valid address as unknown.

  • docs/site/content/docs/cli/orchestration.mdx#L118-L118: state that legacy @mimo remains accepted; remove the @codex example if needed to preserve the one-named-agent paragraph rule.
  • skill-guides/orchestration/references/messaging-and-gates.md#L42-L44: state that legacy @mimo remains accepted; avoid naming it alongside @codex in the same paragraph.
  • src/cli/specs/orchestration.ts#L73-L73: state that legacy @mimo remains accepted alongside the generic @<agent> form.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Important

pnpm test fails on this branch. config/scripts/orchestration-skill-guidance.test.mjs:380 still requires messaging-and-gates.md to contain @grok and @cursor, which the rewritten paragraph removed. CI shard test / tests node 24 1/8 is already red.

Reviewed changes

  • Resolver derives agent groups from ALL_TUI_AGENTS — GROUP_AGENT_IDS replaces the hand-kept nine-name literal; every TuiAgent plus a mimo -> mimo-code legacy alias is now addressable, and resolveGroupAddress reads the map.
  • isRecognisedGroupAddress separates a typo from an empty group — sendGroupMessage throws invalid_argument "Unknown group address" before it reads the sender's Run binding.
  • Guides rewritten generically — orchestration.mdx, messaging-and-gates.md, the CLI spec notes, and the regenerated bundled-skill-guides.ts now describe @all, @idle, @worktree:<id>, @<agent>.
  • Documentation ratchet added — group-address-doc-enumeration.test.ts walks skill-guides/ and docs/ via scanSourceTree and fails any paragraph naming two or more agent groups.
  • Coverage tests added — all-agent routing, @antigravity delivery, the @mimo alias, and a typo from an unbound sender.

⚠️ A second test still pins the removed @grok / @cursor names

config/scripts/orchestration-skill-guidance.test.mjs:380 asserts the messaging reference contains @grok and @cursor, but this PR rewrote that paragraph to name only @codex. The unit suite therefore fails. Because the new ratchet allows at most one agent-group name per paragraph, the fix is to relax the guidance assertion to the generic forms, not to re-add the names.

Technical details
# Stale enumeration assertion in the guidance test

## Affected sites
- `config/scripts/orchestration-skill-guidance.test.mjs:380` — `for (const group of ['@all', '@grok', '@cursor', '@worktree:<id>'])` then `expect(reference).toContain(group)`.
- `skill-guides/orchestration/references/messaging-and-gates.md:42-44` — now names only `@codex`.
- `src/main/runtime/orchestration/group-address-doc-enumeration.test.ts:17` — `MAX_AGENT_GROUPS_PER_PARAGRAPH = 1` forbids putting `@grok` and `@cursor` back in one paragraph.

## Reproduction
`pnpm test config/scripts/orchestration-skill-guidance.test.mjs` → 1 failed, 28 passed, with `AssertionError: expected '# Messaging and gates...' to contain '@grok'`. CI job `test / tests node 24 1/8` in run 34802599249 is FAILURE.

## Required outcome
- `pnpm test` green on this branch.
- The guidance test stops pinning agent ids it does not own.

## Suggested approach
- Change the loop to the generic set (for example `['@all', '@idle', '@worktree:<id>', '@<agent>']`), matching the new paragraph.
- The new ratchet scans only `.md`/`.mdx` under `skill-guides/` and `docs/`; this `.mjs` assertion sits outside it, so agent names can still drift in test/prose files it never reads. If the "cannot drift again" claim is meant to cover those too, widen the scan or call out the boundary.

ℹ️ Nitpicks

  • agentGroupsNamed in group-address-doc-enumeration.test.ts matches only backticked, lowercase `@name`; an unbackticked or capitalized enumeration slips past the ratchet. A one-line comment scoping that limitation would keep the test's guarantee honest.

Pullfrog  | Fix it ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@OrcaWin

OrcaWin commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

Scope note: the user report behind this PR had three parts; this PR is part one

From the original Help-menu report (Orca v1.4.198, reporter fishtvlvoe, written in Traditional Chinese). Recording the full triage so the remainder is not lost:

# Claim Status
1 @antigravity and other well-known agents are not addressable in orchestration Fixed here
2 Trust-prompt block is mislabelled codex-trust-workspace for non-Codex agents Already fixed upstream by #19749 (agent-trust-workspace) — deliberately untouched here
3 --agent antigravity parks on the trust modal, so dispatch --inject returns agent_prompt_blocked and the worker never settles Not fixed — see below

On claim 3. The cause is that antigravity has no preflightTrust entry in src/shared/tui-agent-config.ts, so unlike codex/cursor/copilot nothing pre-writes its trust artifact before first launch. Implementing it requires the Antigravity CLI's real on-disk trust format, which could not be verified from this repo. Per AGENTS.md ("Agent Terminal Screens") and docs/reference/antigravity-readiness-evidence.md, Antigravity readiness has no captured transcript and five prior failed attempts without one, so this was deliberately left out rather than guessed at — a sixth attempt from a remembered screen would have been worse than none.

What would unblock it: a captured PTY transcript per docs/reference/agent-pty-transcript-capture.md, plus the CLI's actual trust-file path/format.

Also note #20485 (supervised Qwen Code workers) modifies src/shared/tui-agent-config.ts. It does not conflict with this PR, but it would conflict with any follow-up that implements claim 3.

@nwparker

Copy link
Copy Markdown
Contributor

I took over the canonical group-address fix in draft #21655, based on #20549 with contributor credit.

ELI5: Orca already recognized Antigravity panes, but the message router's separate name list did not include them. The router now uses the agent catalog, and a typo gets an unknown-group error instead of an unrelated Run-binding error.

Verification: 72 group/RPC tests pass; the Antigravity RPC regression fails against the parent with No recipients resolved. A separate check fed the resolver the isolated app's actual host snapshot from installed agy: all five Antigravity identities selected, none as Gemini. Live CLI typo probes before/after the rebuild confirm the diagnostic change; visual proof is attached to the draft. Full typecheck, changed quality, and guide verification pass.

Scope: group routing and diagnostics only. This does not establish successful agent execution, mailbox consumption, dispatch --inject readiness, or accepted worker_done; those and real Windows/remote checks remain open.

nwparker added a commit that referenced this pull request Sep 21, 2026
…#21655)

* fix(orchestration): address Antigravity groups from the agent catalog

Adopt group routing and unknown-address diagnostics from PR #20549; retain current generated guide content and omit the documentation enumeration ratchet.

Co-authored-by: OrcaWin <orcawin@users.noreply.github.com>

* test(orchestration): expect canonical agent group documentation

* test(orchestration): cover delayed agent identity routing

* test(orchestration): satisfy checked receipt typing

* test(orchestration): validate delayed group receipt

---------

Co-authored-by: OrcaWin <orcawin@users.noreply.github.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.

2 participants