Skip to content

Integrate TOB mobile collaboration and two-Host Agent work - #2157

Merged
DoodleBears merged 67 commits into
mainfrom
codex/2155-cloud-host-binding
Oct 18, 2026
Merged

DoodleBears merged 67 commits into
mainfrom
codex/2155-cloud-host-binding

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Issue #2155 | Work claim | TOB protocol #24

Why the change

Users can sign into TOB from mobile, create workspaces and channels, invite people or Agents, and send a bounded request through two local PersonaBots with durable authorization and retry checks.

Special things to note

  • One-way schema door; medium blast radius. Generations 100–101 add public cloud connection metadata, checkpoints and bounded-work intent/result records; old Hosts enter the existing upgrade-required recovery mode. Review credential-write recovery, disable-before-delete, original-Human policy, current binding fences and checkpoint ordering. Do not downgrade a migrated Profile without its pre-upgrade backup or a forward fix.
  • Integration of the previously validated cloud stack; UAT runtime only. Human authorized merge on 2026-10-18; no Prod deployment or release. Two real isolated Hosts passed transport, permission/context boundaries, removal and crash recovery, then native model A→B fixed work and replay after both Host restarts. This is not T4 completion: WebSocket, organization-wide Agent membership, remote Agent revocation in the Host path and broader current-policy revocation remain separate gates. The fresh mobile→A→B path is now qualified below.
  • Validation is layered. Source73tests/typecheck/lint/format/build and exact-runtime UAT f02c2423b passed. Its CI passed 2,672 affected tests and failed one direct-tool inventory assertion; this head corrects that assumption and requires the dedicated cloud-work runner. The focused catalog/owner/checker set passed19; all applicable CI checks passed at 247a727 (run39095884899). This evidence-only head adds an assigned iOS Simulator run and recordings; Android and Human QA are not claimed. Earlier screenshots retain their runtime labels.

Change outline

Integration scope and merge strategy

This PR now targets main and preserves the reviewed commits of #2103 → #2121 → #2131 → #2138 → #2146 → #2150 → #2152 → #2154 → #2157. Every earlier exact PR head is an ancestor of the unchanged tested head c183a2df0ed891c351da90a7937c81b38ee4597e; current main 810ae5398 is already integrated. This avoids reintroducing conflicts from the oldest individual branches. Use a merge commit, not squash/rebase. Historical bodies/comments retain the limits of each original run; this authorization does not turn pending platform or identity-event gates into passes.

Trusted instance import + native WorkOS PKCE/session lifecycle (#2103)
  → mobile/CLI organizations + owner/member isolation (#2121)
  → ordinary user/default/multiple workspaces (#2131)
  → durable HTTP channels/text (#2138)
  → org invitations (#2146) / single-channel guests (#2150)
  → scoped Agent credentials (#2152) / fixed health requests (#2154)
  → existing Host Messaging + two-Host forwarding (#2157)

Service counterparts are TOB #17–24. No automatic production deployment: TOB deployment is manual and product publication is tag-triggered; this merge creates no release tag. Native callback/dependency changes from #2103 require a compatible development/release build; this PR does not install or distribute one. Broader T1–T5 and UX #2161 remain tracked separately. Each original PR contains its own UI evidence; below is the final Host/mobile path evidence.

private stdin → authenticated Host cloudConnections RPC
  → pinned discovery → canonical remote Agent identity
  → native Credentials secret + Operational DB public metadata
  → existing Apps/Bot binding
  → HTTP channel history → Source Event / Admission / Inbox
  → canonical commit → cursor checkpoint

existing Outbox operation ID → stable cloud idempotency key → checked send

Remote Agent authorship remains distinct from the original Human requester. A current cloud admission guard separates readable context from executable work. Even explicit ordinary-message immediate wake and local-group all-message wake cannot override the original Human allow-list. Source tests also fence another local Bot and policy revocation after admission; live UAT did not start a model turn for plain or unauthorized requests. Replay changes to requester/delegation are source conflicts. Removal disables traffic and aborts pending calls before native secret cleanup; failed cleanup is explicit and retryable. Plain import does not grant shell or work execution.

deepseekbot cloud list|import|policy|remove has authenticated Host parity; private input uses stdin, and removal needs the current revision and --confirm. Existing im-bind/im-status and Apps UI remain the binding surface. deepseekbot cloud-work <bot> --input-stdin invokes the same native Tool implementation as the model. Its owner derives authority from the canonical Source Event, never caller-supplied Human identity or arbitrary commands.

Human typed request → A Source Event / Inbox → native model cloud_work inspect/forward
  → durable forwarding intent → same cloud channel / original Human / unchanged deadline
  → B Source Event / Inbox → native model cloud_work inspect/execute
  → remote authorization + current local policy → durable execution claim
  → fixed runtime check → durable result outbox → same cloud channel

uncertain forward → retry same target only; no execute fallback
interrupted execution → needs-review; never silently rerun
completed result → retry delivery only; restart preserves execution count

Native two-Host assertions: canonical sequences13–15 are Human parent, A child and B result; A executed0, B1. Both Host restarts retained the same child and zero extra executions/messages. First A attempt executed locally; a fresh request after explicit dispatcher instruction passed forwarding. Retained evidence distinguishes this model-choice result from the passing run. Evidence and limits.

Agent task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9. Refs #2155; not a completion claim.

Apps binding — 1440 × 900

Before shows the imported account before binding, not a base-revision comparison. After shows the same binding surviving a preserved-Profile restart on runtime eee4047bf; evidence-only head 7c7f1e7. No video in this checkpoint. These older binding images remain labeled with their runtime; the permission follow-up is below.

Before: imported cloud Agent is unbound

After: Cloud Host A remains bound after restart

After: restored binding in dark theme

UAT evidence and limits: two distinct canonical Agent sends, both cursors through sequence 4, identical Outbox receipts after restart/resend. This proves transport and recovery, not the full A-to-B task.

Permission and interrupted checkpoint — 1440 × 900

Runtime 416ac3bec6f5ce095220feb84f09538ea7e748db, evidence head 94b1749c60365a006ce8c8fbf31667c44314d802. The actual Messages panel shows ordinary text, an unauthorized health request and the replayed source once. Its empty task-session pane is corroborated by canonical source/admission counts and the unchanged model turn, not accepted as standalone execution proof. Initial sidebar-preview matches were rejected during visual inspection; the corrected journey explicitly opens Messages and waits for the group composer.

Cloud context and replay remain visible without a task session, light

Cloud context and replay remain visible without a task session, dark

Permission/removal/crash evidence: scoped fault injection retained 1 Source Event and 1 Inbox admission while cursor advanced 8 → 9 after restart; local removal deleted native credentials and stopped delivery, then reimport reset work policy and caught up. No bounded work was executed in this gate. Full evidence limits.

Phone → native Host A → native Host B — 402 × 874

Actual UAT Simulator UI at mobile JS 247a727b8, installed native inputs 494a20f1e, Host runtime f02c2423b, unchanged cloud 3eeed5b. Before is the same feature before this request, not a base-revision screenshot. After shows messages16–18: Human request, A forward, B completion. A executed0; B1. No CLI work-request injection.

Before: phone selects Host UAT A for an authorized health request

After: same cloud channel shows phone request, A forwarding and B result once

Post-submit recording · Result reload and scroll recording · Assertions · Retained failures and limits.

Independent synthetic staging authentication: UI refresh rotated credentials; cold restart retained identity/session; phone logout revoked exactly its session, rejected latest refresh, and left both CLI sessions valid. This is not a new Hosted AuthKit/PKCE qualification. Host policies restored, driver/own Metro stopped, QA lane released; no WorkOS setting, Prod or merge change.

Phone logout clears local credentials and revokes only its remote session

Completed-request permission fences: actual Host Tool/CLI refused removed original-Human authority, removed forward target, a second hop, self-forward and execute-after-forward. Authorized B replay added0 executions; cloud stayed at18. Policies restored. This does not cover revocation racing a new effect or remote credential revocation.

Issue: #2101

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2101
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2120
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Preserve cloud and model settings translations.
Issue: #2120
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2120
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2120
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Refs #2120

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Refs #2120

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Refs #2120

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Refs #2120

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2130

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2130

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2130

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2130

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2130

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2137

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2137

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2155
Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 124 files, which is 24 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5da36413-6658-4b21-896d-d6601a701904
📥 Commits

Reviewing files that changed from the base of the PR and between 810ae53 and c183a2d.

⛔ Files ignored due to path filters: 184
  • .github/pr-screenshots/2157-cloud-host/after-restart-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/after-restart-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/before-binding.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/context-replay-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/context-replay-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/phone-before.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/phone-logout.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/phone-request.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2157-cloud-host/phone-restart.png is excluded by !**/*.png
  • .github/pr-screenshots/2157-cloud-host/phone-result.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/2157-cloud-host/phone-result.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/01-member-agent.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/01-request.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-agent-health/02-request-sent.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/02-result.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-agent-health/03-denied.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-agent-health/03-result.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/04-restart-results.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-agent-health/04-result-visible.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/05-denied-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/06-zero-execution-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/07-restart-denied.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/08-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-agent-health/action-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/01-agent-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/02-created-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/03-credential-handoff-safe.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/04-phone-agent-reply.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/05-restart-retained-handoff.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/06-revoke-maximum.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/07-revoked-maximum.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/08-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/create-agent.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-agents/form-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/form-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/form-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/form-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/form-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/form-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-agents/phone-agent-reply.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-agents/restart-and-revoke.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-agents/revoke-agent.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-guests/02-guest-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/03-invitation-created.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/04-recipient-inbox.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/05-guest-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/06-no-prejoin-history.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/10-restart-guest-history.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/11-revoked-phone-session.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/12-owner-revoke-max.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/13-owner-revoked-max.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/before-clipped-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/form-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/keyboard-and-send.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-guests/message-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/message-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/message-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/message-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/message-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/message-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-guests/owner-invite.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-guests/owner-revoke.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-guests/recipient-accept.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-guests/restart-and-revoke.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-http/01-workspace-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/03-three-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/06-cli-reply.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/11-maximum-keyboard-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/19-fixed-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/24-create-max-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/26-four-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/27-contrast-create-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/28-contrast-create-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/29-final-restart-session.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/30-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/before-workspace-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-session-preview.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/final-session.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-http/first-run-preview.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/first-run.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-http/keyboard-and-fonts-preview.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/keyboard-and-fonts.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-channel-http/stale-metro-recheck-preview.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-channel-http/stale-metro-recheck.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-multi-user/01-saved-session.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/02-ordinary-user.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/03-workspace-list.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/04-mobile-created.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/05-default-selected.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/06-mobile-selected-again.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/07-restart-saved.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/08-refreshed-user.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/09-restart-selected-workspace.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/10-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/recovery-contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/session-recovery.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-multi-user/workspaces-contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-multi-user/workspaces.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-org-invitations/form-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/form-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/form-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/form-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/form-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/form-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-default-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-default-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-intermediate-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-intermediate-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-maximum-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/inbox-maximum-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/maximum-revoke-reachable.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/maximum-revoked.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-accept.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-org-invitations/member-four-channels.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-inbox.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-message-confirmed.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-no-prejoin-history.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-restart-role.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/member-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/owner-created.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/owner-form-light.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-org-invitations/owner-invite.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-org-invitations/owner-size-revoke.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-organizations/00-before-cloud-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/01-cloud-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/02-created-owner.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/03-owner-saved.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/04-member-write-denied.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/05-member-readonly.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/06-restart-owner.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/07-member-fixed.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/08-owner-restored.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/09-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/create-contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-organizations/organization-create.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-organizations/organization-permissions-fixed.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-organizations/permissions-contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/01-entry.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/02-cloud-empty.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/02-trusted-import.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-uat/03-invalid-config.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/04-trust-review.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/05-imported-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/01-local-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/02-emulator-browser.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/03-returned-signed-in.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/04-wrong-state.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/05-wrong-verifier.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/06-real-uat-restored.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/browser/browser-success.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-uat/browser/contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/01-hosted-returned.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/02-refreshed.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/03-restart-unverified.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/04-restart-verified.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/05-logged-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/06-restart-signed-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/contact-sheet.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/hosted-email/hosted-session.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-uat/unattended/01-native-session.mp4 is excluded by !**/*.mp4
  • .github/pr-screenshots/tob-t1-uat/unattended/01-saved-unverified.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/02-verified-admin.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/03-refreshed-admin.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/04-restart-saved.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/05-restart-verified.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/06-logged-out.png is excluded by !**/*.png
  • .github/pr-screenshots/tob-t1-uat/unattended/07-restart-signed-out.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 124
  • .agents/skills/verify-deepseekbot/features/README.md
  • .agents/skills/verify-deepseekbot/features/cloud-host-connections.md
  • .github/pr-screenshots/2157-cloud-host/README.md
  • .github/pr-screenshots/2157-cloud-host/permission-recovery-uat.json
  • .github/pr-screenshots/2157-cloud-host/phone-work-uat.json
  • .github/pr-screenshots/2157-cloud-host/transport-uat.json
  • .github/pr-screenshots/2157-cloud-host/work-denials-uat.json
  • .github/pr-screenshots/2157-cloud-host/work-model-uat.json
  • .github/pr-screenshots/tob-agent-health/01-request.gesture-telemetry.json
  • .github/pr-screenshots/tob-agent-health/02-result.gesture-telemetry.json
  • .github/pr-screenshots/tob-agent-health/03-denied.gesture-telemetry.json
  • .github/pr-screenshots/tob-agent-health/04-restart-results.gesture-telemetry.json
  • .github/pr-screenshots/tob-agent-health/README.md
  • .github/pr-screenshots/tob-agent-health/action-appearance.json
  • .github/pr-screenshots/tob-agent-health/cli-uat.json
  • .github/pr-screenshots/tob-agent-health/mobile-process.json
  • .github/pr-screenshots/tob-agent-health/mobile-readback.json
  • .github/pr-screenshots/tob-channel-agents/README.md
  • .github/pr-screenshots/tob-channel-agents/form-appearance-checks.json
  • .github/pr-screenshots/tob-channel-agents/mobile-readback.json
  • .github/pr-screenshots/tob-channel-agents/mobile-revocation.json
  • .github/pr-screenshots/tob-channel-guests/README.md
  • .github/pr-screenshots/tob-channel-guests/form-appearance-checks.json
  • .github/pr-screenshots/tob-channel-guests/message-appearance-checks.json
  • .github/pr-screenshots/tob-channel-http/README.md
  • .github/pr-screenshots/tob-channel-http/appearance-checks.json
  • .github/pr-screenshots/tob-channel-http/recordings.json
  • .github/pr-screenshots/tob-channel-http/results.json
  • .github/pr-screenshots/tob-multi-user/README.md
  • .github/pr-screenshots/tob-multi-user/results.json
  • .github/pr-screenshots/tob-org-invitations/README.md
  • .github/pr-screenshots/tob-org-invitations/form-appearance-checks.json
  • .github/pr-screenshots/tob-org-invitations/inbox-appearance-checks.json
  • .github/pr-screenshots/tob-org-invitations/mobile-invitation-result.json
  • .github/pr-screenshots/tob-org-invitations/mobile-revoke-result.json
  • .github/pr-screenshots/tob-t1-organizations/README.md
  • .github/pr-screenshots/tob-t1-organizations/results.json
  • .github/pr-screenshots/tob-t1-uat/README.md
  • .github/pr-screenshots/tob-t1-uat/browser/README.md
  • .github/pr-screenshots/tob-t1-uat/browser/success.json
  • .github/pr-screenshots/tob-t1-uat/browser/wrong-state.json
  • .github/pr-screenshots/tob-t1-uat/browser/wrong-verifier.json
  • .github/pr-screenshots/tob-t1-uat/hosted-email/README.md
  • .github/pr-screenshots/tob-t1-uat/hosted-email/results.json
  • .github/pr-screenshots/tob-t1-uat/unattended/README.md
  • apps/mobile/README.md
  • apps/mobile/app.json
  • apps/mobile/app/+native-intent.tsx
  • apps/mobile/app/_layout.tsx
  • apps/mobile/app/cloud-agents.tsx
  • apps/mobile/app/cloud-channels.tsx
  • apps/mobile/app/cloud-invitations.tsx
  • apps/mobile/app/cloud-organizations.tsx
  • apps/mobile/app/cloud-services.tsx
  • apps/mobile/app/pair.tsx
  • apps/mobile/package.json
  • apps/mobile/scripts/tob-authkit-browser.d.mts
  • apps/mobile/scripts/tob-authkit-browser.mjs
  • apps/mobile/scripts/tob-mobile-driver.d.mts
  • apps/mobile/scripts/tob-mobile-driver.mjs
  • apps/mobile/scripts/tob-uat-session.mjs
  • apps/mobile/src/cloud/README.md
  • apps/mobile/src/cloud/agent-contract.ts
  • apps/mobile/src/cloud/channel-contract.ts
  • apps/mobile/src/cloud/client.ts
  • apps/mobile/src/cloud/instance-contract.ts
  • apps/mobile/src/cloud/invitation-contract.ts
  • apps/mobile/src/cloud/native-intent.ts
  • apps/mobile/src/cloud/native.ts
  • apps/mobile/src/cloud/work-contract.ts
  • apps/mobile/src/ui/cloud/agents-screen.tsx
  • apps/mobile/src/ui/cloud/channels-screen.tsx
  • apps/mobile/src/ui/cloud/invitations-screen.tsx
  • apps/mobile/src/ui/cloud/organizations-screen.tsx
  • apps/mobile/src/ui/cloud/services-screen.tsx
  • apps/mobile/src/ui/shell/host-drawer.tsx
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/cloud-client.test.ts
  • apps/mobile/test/tob-authkit-browser.test.ts
  • apps/mobile/test/tob-mobile-driver.test.ts
  • changes/2101-mobile-cloud-session.md
  • changes/2120-cloud-organizations.md
  • changes/2130-cloud-user-onboarding.md
  • changes/2137-cloud-channels.md
  • changes/2145-cloud-invitations.md
  • changes/2148-mobile-channel-guests.md
  • changes/2151-channel-agents.md
  • changes/2153-agent-health-check.md
  • changes/2155-cloud-agent-host-connection.md
  • docs/adr/0229-mobile-cloud-sessions-are-independent-of-host-pairing.md
  • docs/adr/0230-cloud-agent-connections-use-native-credentials-and-messaging.md
  • docs/agents/tob-mobile-uat.md
  • docs/architecture/botharness-architecture.md
  • docs/bot-cli.md
  • docs/bot-cli.zh.md
  • packages/core/src/bots/cli-cloud.ts
  • packages/core/src/bots/cli-live.ts
  • packages/core/src/bridge/methods.ts
  • packages/core/src/bridge/rpc.ts
  • packages/core/src/cloud/admission.ts
  • packages/core/src/cloud/connections.ts
  • packages/core/src/cloud/instance-contract.ts
  • packages/core/src/cloud/management.ts
  • packages/core/src/cloud/provider.ts
  • packages/core/src/cloud/transport.ts
  • packages/core/src/cloud/work-contract.ts
  • packages/core/src/cloud/work-tool.ts
  • packages/core/src/cloud/work.ts
  • packages/core/src/database/schema-plan.ts
  • packages/core/src/messaging/inbound.ts
  • packages/core/src/messaging/outbound.ts
  • packages/core/src/messaging/provider.ts
  • packages/core/src/messaging/sender-access.ts
  • packages/core/src/plugin.ts
  • packages/core/src/workspaces/grant-execution.ts
  • packages/core/test/bridge-rpc.test.ts
  • packages/core/test/cli-messaging.test.ts
  • packages/core/test/cloud-connections.test.ts
  • packages/core/test/cloud-work.test.ts
  • packages/core/test/direct-bot-tools.test.ts
  • packages/core/test/plugin.test.ts
  • scripts/check-cli-parity.mjs
  • scripts/test/check-cli-parity.test.mjs
  • scripts/verification-inventory.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Issue: #2155

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2155

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
Issue: #2155

Agent-Task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9
@DoodleBears

Copy link
Copy Markdown
Contributor Author

Connection gate verified by codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9 on runtime 416ac3bec6f5ce095220feb84f09538ea7e748db; evidence head 94b1749c60365a006ce8c8fbf31667c44314d802.

  • Real UAT + two independent DSH Profiles: explicit immediate/all-message wake and a bridged group cannot activate unauthorized cloud work. Context remains readable; no new model turn.
  • Local connection removal stops delivery and confirms native credential deletion. Reimport resets local policy and catches up.
  • Scoped external fault injection kills Host A after source/admission commit, before cursor update. Clean restart preserves exactly one Source Event and one Inbox admission; cursor 8 → 9, no model turn. Temporary policies restored; both Hosts healthy.
  • 14 cloud and 175 wider Messaging source tests passed. Runtime CI passed. Evidence-only head CI is separate; model CI was skipped.
  • Five PR image embeds loaded in the actual GitHub browser at 1440×900. The new light/dark images show the actual Messages pane; a prior sidebar-preview false match was retained and rejected. No video or native/Human-QA claim.

Detailed proof and limits. Local HTML explanation was refreshed for this head but is not a reviewer-accessible hosted artifact.

Next: bounded health work owner, shared model-tool/direct-CLI path, original-Human authorization and real A-to-B forwarding. This is not T4 completion. Host-only lane remains assigned for an explicit next-head refreeze. UAT only; Draft/unmerged; no Prod.

@DoodleBears

Copy link
Copy Markdown
Contributor Author

Native two-Host UAT work checkpoint: runtime f02c242, evidence/checker head247a727b8ee832f1fd21318b2c0063a1b2f3c53b, unchanged TOB UAT3eeed5b.

  • Native model A inspected and forwarded; B inspected and executed the fixed health check. Channel sequences13–15 contain the Human parent, Agent A child and Agent B result, retaining the original Human and deadline.
  • A executed0; B executed1. After restarting both dedicated Profiles, formal direct Tool retry returned the same child and zero additional executions/messages. Local work policies restored to default-deny.
  • Retained first attempt: A executed locally, so it did not count as forwarding. A new request after an explicit owner dispatcher instruction passed. A separate denied/mention-only fixture produced no source and was corrected before the successful run.
  • Source73tests/typecheck/lint/build passed. f02c CI had2,672 passing tests and one direct-tool inventory failure; head247a fixes dedicated CLI accounting, with19 focused tests and lint passing. Final-head CI pending; no production runtime change in that correction.

Sanitized proof · evidence limits

No fresh phone run or work-result screenshot/video is claimed. WebSocket, organization-wide Agent membership and the fresh phone→two-Host path remain open. UAT only, no Prod, no merge.

Agent task: codex/local/01a148ae-ec7f-74b2-8157-961411ce54c9; claim #2155 issuecomment-6244695525. Evidence only; no merge or production change.
@DoodleBears

Copy link
Copy Markdown
Contributor Author

Assigned UAT phone follow-up passed. Mobile JS 247a727b8, Host runtime f02c2423b, cloud 3eeed5b; evidence-only head d90f28bca5a7ebc7dcb579c1755d049b7a9ee5b5. Actual phone request → native model A forward → native model B execute → phone same-channel result: sequences16/17/18, A0/B1. Refresh rotation, cold restart, remote logout/latest-refresh rejection and independent CLI A/B isolation passed.

English screenshots and two recordings are now in the PR Change outline. CI39095884899 passed at the tested source head; this commit changes evidence only. Synthetic staging authentication does not re-prove Hosted AuthKit/PKCE. Original failures and cleanup checks are retained. Shared Simulator lane released; default-deny policies restored, own driver/Metro stopped, secrets removed after verified revocation.

Still Draft/unmerged, UAT only. Goal remains open for organization-wide Agent membership, WebSocket and wider live permission/revocation coverage; Android/physical-device/Human QA are separate.

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