Skip to content

fix(android): derive Voice readiness from Gateway catalog#98269

Merged
steipete merged 11 commits into
openclaw:mainfrom
Solvely-Colin:codex/android-voice-talk-readiness
Jul 3, 2026
Merged

fix(android): derive Voice readiness from Gateway catalog#98269
steipete merged 11 commits into
openclaw:mainfrom
Solvely-Colin:codex/android-voice-talk-readiness

Conversation

@Solvely-Colin

@Solvely-Colin Solvely-Colin commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Closes #98268

AI-assisted: yes. Sanitized transcript logs were not included.

What Problem This Solves

Android Voice treated a connected Gateway as proof that both Realtime Talk and Dictation were ready. That produced false-ready UI when one selected provider lacked credentials and could not represent mixed provider state.

Why This Change Was Made

Gateway talk.catalog now additively exposes provider registry aliases plus an authoritative group readiness bit, and resolves every row through the canonical config owner used by runtime calls. Android consumes that response through one closed readiness model shared by Voice, Voice Setup, permission continuations, and Talk mode.

The rewrite removes the original PR's Android-owned alias table and parallel readiness flags. Unknown catalog state remains non-blocking so an older Gateway or newer provider stays authoritative; confirmed missing setup routes only the affected mode to the existing settings flow. Realtime close failures also retain their specific status instead of being overwritten by a generic phase label.

User Impact

Realtime Talk and Dictation can now show different, accurate readiness. For example, Google Live Voice may need setup while OpenAI Realtime Transcription is ready, and setup actions block only the affected mode.

Evidence

  • Rewritten exact head: 161b585d5a4b661b24fd6c75e50e4a7715705117.
  • Gateway/protocol proof: 122 focused Vitest tests passed.
  • Android proof: readiness and Talk manager unit tests, ktlint, and Play debug APK assembly passed.
  • Post-review regression proof: 82 Talk catalog tests, 46 protocol tests, Android readiness/Talk tests, and native i18n inventory tests passed after making runtime resolution authoritative—including alias collisions—aligning transcription model selection with session startup, retaining fail-open behavior only for legacy catalogs that omit readiness, and moving user-visible readiness reasons into a closed i18n-inventoried model.
  • Repository proof: full build, docs MDX, native i18n, and whitespace checks passed.
  • Exact-head hosted CI passed, including Android, Gateway/protocol, docs, lint, types, security, QA, and build checks.
  • Fresh Codex autoreview: clean, no actionable findings.
  • Real source Gateway + Android emulator mixed-provider proof: fix(android): derive Voice readiness from Gateway catalog #98269 (comment)

The live matrix used an intentionally non-production OpenAI credential. It proves catalog ownership, alias canonicalization, device pairing, Android routing, and mixed-state rendering; it does not claim a billed provider transcription turn. No physical Android device was available.

@openclaw-barnacle openclaw-barnacle Bot added app: android App: android size: L maintainer Maintainer-authored PR labels Jun 30, 2026
@clawsweeper

clawsweeper Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 3, 2026, 2:29 AM ET / 06:29 UTC.

Summary
The PR adds additive Gateway talk.catalog readiness and alias fields, routes Android Voice/Voice Setup through a shared catalog-derived readiness model, preserves realtime close failure status, and updates focused docs/tests/i18n inventory.

PR surface: Source +80, Tests +345, Docs 0, Other +682. Total +1107 across 16 files.

Reproducibility: yes. The linked issue describes a mixed Gateway catalog state, current main source still uses generic/static Android readiness, and inspected before/after emulator screenshots show the false-ready state versus the candidate behavior.

Review metrics: 2 noteworthy metrics.

  • Talk catalog output fields: 2 optional fields added. aliases and group-level ready expand a protocol result surface that Android now uses as the readiness contract.
  • Android readiness-gated modes: 2 modes gated independently. Realtime Talk and Dictation now make separate setup-routing decisions from Gateway catalog state.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #98268
Summary: This PR is the open candidate fix for the canonical Android Voice/Gateway Talk readiness issue, with adjacent provider-resolution and CI-guard work in the surrounding discussion.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Wait for exact-head CI to finish green.
  • Have a maintainer explicitly accept the upgrade-visible setup routing.

Risk before merge

  • [P1] Existing Android users with a selected but unconfigured Realtime Talk or Dictation provider will now be routed to Voice Setup for only that mode instead of attempting startup; this appears intentional but is upgrade-visible behavior.
  • [P1] Catalog readiness now depends on provider aliases, selected voice-model defaults, and configured credential checks across realtime voice and transcription providers; inspected proof covers a representative mixed-provider path, not every provider/auth combination.
  • [P1] Live exact-head checks were still in progress during this review, so maintainers should wait for terminal green CI before landing.

Maintainer options:

  1. Accept Catalog-Gated Routing After Checks (recommended)
    A maintainer can land once exact-head checks finish green if they accept the intentional behavior where confirmed missing setup blocks only the affected Voice mode.
  2. Ask For A Wider Provider Matrix
    If maintainers want more confidence before accepting the routing change, request additional proof or focused tests for specific provider/auth combinations.
  3. Keep Cold-Provider Loading Separate
    Do not fold the related missing-provider loading concern from Fix voice-call streaming provider resolution #97170 into this PR unless maintainers decide both provider-routing changes must land together.

Next step before merge

  • [P2] Manual review is appropriate because the PR has a protected maintainer label and intentionally changes compatibility-sensitive provider readiness routing; there is no narrow automated repair to queue.

Security
Cleared: No concrete security or supply-chain regression was found; the diff does not change workflows, dependencies, lockfiles, install scripts, or provider secret exposure.

Review details

Best possible solution:

Land after a maintainer accepts the upgrade-visible catalog-gated Android routing and exact-head CI is terminal green, while keeping the adjacent cold-provider loading work in #97170 separate unless maintainers intentionally combine them.

Do we have a high-confidence way to reproduce the issue?

Yes. The linked issue describes a mixed Gateway catalog state, current main source still uses generic/static Android readiness, and inspected before/after emulator screenshots show the false-ready state versus the candidate behavior.

Is this the best way to solve the issue?

Yes, with maintainer acceptance. Gateway-owned readiness plus one Android closed readiness model is the maintainable fix; an Android-owned alias table would duplicate provider policy, and the cold-provider loading concern remains separate in #97170.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 4e6933c84f18.

Label changes

Label justifications:

  • P2: This is a bounded Android/Gateway Voice readiness bug fix with medium setup-flow impact and limited blast radius.
  • merge-risk: 🚨 compatibility: The PR changes existing Android startup/setup routing for mixed Talk and Dictation provider setups during upgrade.
  • merge-risk: 🚨 auth-provider: The changed readiness path depends on provider aliases, selected models, and configured credential checks for realtime voice and transcription providers.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): The PR includes inspected before/after Android emulator screenshots and Voice Setup screenshots showing the catalog-derived mixed-provider readiness behavior after the fix.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR includes inspected before/after Android emulator screenshots and Voice Setup screenshots showing the catalog-derived mixed-provider readiness behavior after the fix.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR includes inspected before/after Android emulator screenshots and Voice Setup screenshots showing the catalog-derived mixed-provider readiness behavior after the fix.
Evidence reviewed

PR surface:

Source +80, Tests +345, Docs 0, Other +682. Total +1107 across 16 files.

View PR surface stats
Area Files Added Removed Net
Source 2 91 11 +80
Tests 3 350 5 +345
Docs 2 2 2 0
Config 0 0 0 0
Generated 0 0 0 0
Other 9 909 227 +682
Total 16 1352 245 +1107

What I checked:

Likely related people:

  • steipete: Authored the current PR head commits and has recent main-branch Gateway Talk/session/catalog history in the same server-methods area. (role: current branch implementer and recent Gateway Talk contributor; confidence: high; commits: 161b585d5a4b, c434d7720b2e, f1636d5e2831; files: src/gateway/server-methods/talk.ts, src/gateway/server-methods/talk-shared.ts, apps/android/app/src/main/java/ai/openclaw/app/GatewayTalkSetupReadiness.kt)
  • Solvely-Colin: Beyond opening this PR, prior merged history includes Android overview/control-surface work and realtime voice OAuth/control work near the affected Voice/Talk surfaces. (role: recent Android Voice contributor and PR opener with relevant prior history; confidence: medium; commits: 5e342c774d8d, a77d2c142c3e, 7a2a31dede80; files: apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt, apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsScreens.kt, src/gateway/server-methods/talk-shared.ts)
  • obviyus: Recent main history includes Android Voice surface styling, offline voice routing, and TalkModeManager realtime relay stabilization around the affected paths. (role: adjacent Android Voice/Talk runtime contributor; confidence: medium; commits: c4525104e9e0, cec52bd279b9, ffb02a59199f; files: apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceScreen.kt, apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt)
  • vincentkoc: Recent history includes voice model cataloging, voice-call config extraction, and normalization refactors used by the Gateway readiness path. (role: adjacent provider/model catalog contributor; confidence: medium; commits: 27b15a19e84c, 59683978e146, 83f7203bdb95; files: src/gateway/server-methods/talk.ts, src/gateway/server-methods/talk-shared.ts, packages/gateway-protocol/src/schema/channels.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 30, 2026
@Solvely-Colin
Solvely-Colin force-pushed the codex/android-voice-talk-readiness branch from 2f48b09 to eb2d810 Compare June 30, 2026 20:40
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 30, 2026
@Solvely-Colin
Solvely-Colin force-pushed the codex/android-voice-talk-readiness branch 5 times, most recently from c6d2aef to 159c1c6 Compare June 30, 2026 21:11
@Solvely-Colin
Solvely-Colin marked this pull request as ready for review June 30, 2026 21:16
Copilot AI review requested due to automatic review settings June 30, 2026 21:16

Copilot AI 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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Solvely-Colin

Copy link
Copy Markdown
Contributor Author

Real Android emulator proof for the Voice/Talk readiness changes is attached here and mirrored in the PR body.

  • Device/profile: OpenClaw_FinalProof_API_36, Play debug app
  • Secret check: local visual artifact directory scanned for common key/token patterns before upload; no matches found

Voice tab readiness and persistent setup issue panel:

Android Voice readiness showing Realtime Talk needs setup and Dictation ready

Voice Setup using the same Gateway catalog-derived rows:

Android Voice Setup showing Realtime Talk needs setup and Dictation ready

Voice to Voice Setup flow proof:

Android Voice setup flow GIF

@Solvely-Colin

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 30, 2026
@openclaw-barnacle openclaw-barnacle Bot added the app: web-ui App: web-ui label Jul 1, 2026
@openclaw-barnacle openclaw-barnacle Bot added app: ios App: ios extensions: diagnostics-otel Extension: diagnostics-otel commands Command implementations agents Agent runtime and tooling channel: feishu Channel integration: feishu extensions: nvidia extensions: memory-wiki extensions: codex extensions: tokenjuice Changes to the bundled tokenjuice extension extensions: google extensions: openrouter labels Jul 3, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8c98b68daa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/gateway/server-methods/talk.ts Outdated
// Provider priority belongs to the runtime resolver; catalog consumers must not infer it from row order.
try {
return {
activeProvider: configuredProvider ?? resolveAutomaticProvider(),

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.

P1 Badge Validate explicitly selected Talk providers before marking ready

When talk.realtime.provider or the voice-call streaming provider is explicitly set, this short-circuits the runtime resolver and returns ready: true without checking credentials. In the common setup flow where a provider is selected but its API key is missing, the row below still has configured: false, but Android treats the group ready flag as authoritative and enables Talk/Dictation instead of routing to setup; the actual session resolver would reject the same config as not configured. Call the resolver for explicit selections too, and only use the configured id as the active provider after that succeeds.

Useful? React with 👍 / 👎.

@steipete

steipete commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

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

Labels

app: android App: android app: web-ui App: web-ui docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Android Voice setup readiness is inconsistent with Gateway Talk catalog

3 participants