Verify every provider lane live on dev
## Original requirement (epic 8783, verbatim)
> Review implementation of model provider interfaces:
>
> - Claude, Codex, Antigravity, Pi, ACP,
>
> Identify opportunity to unify, move more code from specific to common, make it more industry standard, more reliable. Do web research to potentially adopt a better architecture.
>
> Implement top ideas.
Settled inputs: PRD (BA task 8784) and architecture (task 8785) — read them with `task_read` 8784 / 8785 and their `prd` / `architecture` artifacts. Decisions there are settled; realize them, do not reopen them.
## Scope — R7 / AC8 + AC4 live (architecture child V)
**Requirement (PRD R7, verbatim):** No regression. Every provider lane still works end to end on dev.
No code. Runs after every build child of this epic has merged (I1–I5 and the Antigravity ACP child); first confirm each merged (`task_search` children of 8783) — if any has not, stop and say so.
1. Confirm the last merge's **Jaah Deploy** on dev succeeded (GitHub). Sign in to `https://app.dev.jaah.ai` (credential `jaah/debug/main/operator-login`) and inventory accounts per AC8 lane (Settings › Accounts / Runners).
2. **Missing lane:** copy the account from main (`https://app.jaah.ai`, same credential) **through the console UI** (CLAUDE.md: operate Jaah only through the UI). If the UI cannot copy an account between control planes, that is a product gap: file a Task for it and sign the lane in on dev instead, where the operator's credential allows. An Antigravity OAuth lane may need a fresh sign-in against the ACP server's own token store anyway.
3. Run one task per lane on dev and record its task id. Per lane: the task settles; Audit › Sessions shows the row with a transcript and non-zero usage; where the lane supports questions, the task asks one (its body tells the agent to ask a trivial question through `AskUserQuestion`), the question shows once, and the answer is delivered. **"Nothing differs from before" baseline:** run the identical task on the same lane on **main** (`https://app.jaah.ai`, pre-change code; same credential). Compare the task page, the Sessions row and the Settings › Providers row side by side, with screenshots in the report. Antigravity's ACP gains are the only accepted difference. If main has no account for a lane, that lane's baseline is "not available" and the report says so.
4. **AC4 live, for both Antigravity oauth and api_key:** Settings › Providers shows both Antigravity switches ON by default; the Chat view streams normalised events (turns, tool calls); the task reaches its settled outcome; Audit › Sessions shows runtime ACP, a transcript and usage (if usage is unsupported per child A's measurement (c), say so); a steer sent from the chat view reaches the agent, where child A claimed steer; flip one switch OFF, observe a legacy launch, then restore it ON. If child A shipped the oauth pair `legacy_only` (infeasible path), verify the oauth lane runs legacy unchanged and cite A's follow-up task.
5. Any lane still without an account is reported "untested — no dev account" with a follow-up Task to add one. Never skip one silently.
6. A regression found → file a focused follow-up Task under epic 8783 naming the lane, task ids and evidence (do not fix it here). Per project instructions, also file a task with itemized UI suggestions for anything broken/inconvenient noticed while testing.
7. Settle `no_pr` (`no_code_needed`) with the per-lane evidence; the report lists task ids, screenshots and verdict per lane.
Credentials & reach:
Architecture §8 rows this child needs (verbatim):
- AC4 / AC8 dev console (`https://app.dev.jaah.ai`) — `jaah/debug/main/operator-login` (operator, covers dev and main) — verified: `credential_get` succeeded; HTTPS 200 from `h4-2-gmind`.
- AC8 copy-from-main (`https://app.jaah.ai`) — `jaah/debug/main/operator-login` — verified: `credential_get` succeeded; HTTPS 200 from `h4-2-gmind`.
- AC4/AC8 Antigravity oauth + Gemini api_key accounts on dev — Dev org accounts (Settings › Accounts) — deferred — operator answer A2: "Not sure — child checks; copy from main if they don't exist" (child V).
- AC8 other lanes' dev accounts (Claude sub/API/Bedrock, Codex, Gemini, DeepSeek, Pi, registry agent, SDK v2 agent) — Dev org accounts — deferred — same answer A2; child V inventories, copies, else "untested — no dev account" plus a follow-up.
Note: `gmind/skynet/dev` resolves to a base URL that did not answer; use the operator credential above.
Out of scope:
From PRD §6 (verbatim) — do NOT touch:
- **Do NOT** move Claude subscription (oauth) runs onto ACP, or change `Capabilities.runtime` for `claude` oauth (ADR-0167).
- **Do NOT** delete the legacy terminal launch path (`fleet_launch`/`fleet_dispatch` exec lines, `answer_delivery` tmux paste, `ComposerTui`). It still serves Claude subscriptions and non-Linux nodes.
- **Do NOT** redesign console pages (Settings › Providers, Brains roster, task page, Audit › Sessions). The only console delta is Antigravity runs gaining ACP chat/live-control views and their catalogue gap text.
- **Do NOT** build ideas ranked below the top 3–5. File them (AC6).
- Do NOT edit code or open a PR; do NOT operate Jaah through CLI/API/SQL — console UI only.
Done means:
**AC8 — Behaviour preserved, live on dev (R7, D6)** (PRD, verbatim).
After the last PR merges and Jaah Deploy succeeds on dev, one real task per lane completes end to end. Lanes:
- Claude subscription (legacy);
- Claude API key (ACP);
- Claude Jaah account / Bedrock (ACP);
- Codex oauth;
- Codex api_key;
- Gemini (api_key, and the guided/oauth lane if a dev account exists);
- DeepSeek api_key;
- Antigravity oauth + api_key (AC4);
- Pi api_key;
- one ACP-registry agent;
- one SDK v2 agent.
Pass per lane:
- The task reaches its settled outcome.
- Audit › Sessions shows the session with a transcript and non-zero usage.
- A question raised by the agent (where the lane supports it) shows once and its answer is delivered.
- Nothing differs from before the change in the task page, Sessions row or Settings › Providers row, except Antigravity's gains.
A lane with no account on dev is listed by name as "untested — no dev account", with a follow-up Task to add one. It is never silently skipped.
→ verify: in the dev console, for each lane:
1. Create a task bound to an account of that lane and Start it.
2. Watch the task page until it settles.
3. Open Audit › Sessions and confirm the row.
4. Record task ids per lane in the final report.
**AC4 live steps 1–4** (PRD, verbatim): 1. Open the dev console (dev.jaah.ai). Create a task in a project, bound to an Antigravity account (oauth; then repeat with api_key), and Start it. 2. Observe the task page's Chat view streaming normalised events (turns, tool calls) and the task reaching its settled outcome. 3. Audit › Sessions shows the session with runtime ACP, a transcript and usage. 4. Send a steer from the chat view and observe the agent receive it.
- Report has, per lane: task id on dev, task id on main (or "baseline not available"), side-by-side screenshots, verdict; every untested lane named with its follow-up task id.
Outcome
Lane check live on dev: no regression traced to epic 8783. Claude API key, Gemini key, DeepSeek, Pi and Antigravity oauth (legacy) settled. ACP transcript/usage gaps predate the epic (#8858, #8859). 6 lanes untested (no dev account, #8856). Echo SDK and Gemini oauth fail on dev and main too (#8860, #8857). Memory: proposed 1 recipe.
Artifacts
Activity
- Draft
- Ready
- Runner started
- Runner ended (done)