Skip to content

Phones: chats without a workspace, like the desktop (Remote rev 51) - #692

Open
sambitcreate wants to merge 22 commits into
mainfrom
claude/project-thread-ifvf3g
Open

sambitcreate wants to merge 22 commits into
mainfrom
claude/project-thread-ifvf3g

Conversation

@sambitcreate

@sambitcreate sambitcreate commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

What this does

Follow-up to #667. iPhone and Android now treat chats without a workspace the way the desktop does.

  • Sidebar: every No workspace chat sits in one Chats group, instead of a "No workspace" section per chat. In the Recents layout, such a chat is labelled "Chats" and found by that name in search.

  • New Chat: offers No Workspace first ("Use your global settings. Aiden keeps a private folder for this chat."), above Existing, New and Managed Scratch.

    • The iOS popover title and the Android sheet heading are now "New Chat".
    • The + button's accessibility label stays "New Workspace Chat".
  • Hidden folders stay hidden: they don't appear in any of these:

    • the Existing Workspace picker;
    • the workspace list (active or archived);
    • Scheduled Tasks;
    • the iPad/split-view detail column;
    • Shortcuts and new-chat links, which see one "Chats" entry instead.

    A Chats group has no workspace-settings link.

  • Exceptions:

    • An iPhone scheduled task that already runs in a hidden folder still shows it while edited, as on the desktop.
    • iPad split view selects the Chats home only while one of its chats is open. Otherwise it falls to a workspace that has a page.
  • Old archive flags: a "No workspace" section archived on an older build comes back under Chats, because the Chats group has no Unarchive. Phones drop those flags when the Mac's workspace list arrives.

How it works

  • Discovery, no new token: Workspace and HostFeedWorkspace carry an optional noWorkspace: true marker, and a phone that sees one knows the host supports the feature. Phones are at the 32 feature-token cap, so there is no /server feature.
    • A desktop whose default workspace had no folder turns it into the hidden home on first start.
    • A desktop whose default already had a folder lists its first hidden record once a No workspace chat is started on the desktop. Until then, phones offer no No Workspace choice.
  • Home: the default record, else the oldest hidden record by createdAt and then id.
  • Starting a chat: new phones send POST /chats {workspaceId: home, noWorkspace: true} and then send the message.
    • Only with the flag does workspaceForNoWorkspaceChat give the chat a fresh hidden record, when the target already holds a chat.
    • These creates run one at a time on the host, so two phones never share a folder. An idempotent retry returns the same chat.
    • The host broadcasts workspaces:changed when it makes or releases a hidden record, so the desktop sidebar lists a phone-started chat right away.
  • Opening the new chat: phones re-read GET /workspaces when the receipt names a workspace they haven't listed yet.
    • iOS opens the chat once the folder is listed. If the re-read fails, it says the chat was started on the Mac and will appear under Chats once it reconnects.
    • Android waits for the re-read, rechecks that the same pairing is still active, then opens the chat by id.
    • Links and Shortcuts map a remembered hidden-folder id to the Chats home before matching. An iPhone link to a chat whose folder isn't listed yet re-reads the list first.
  • Chats from other devices: when a phone's chat list names a workspace it hasn't listed (another phone or the Mac just started a No workspace chat), iPhone and Android re-read GET /workspaces once for that id while connected, so the chat shows under Chats without a reconnect.
    • On iPhone the read runs in its own task, so the view's task change can't cancel it.
    • A cancelled workspace read no longer counts as a connection error.
  • Moves keep the workspace they name. Moving a chat out of a hidden record releases that record's folder once no chat is left in it (inside the same serialized turn). The release is best effort: the move is already saved, so a failed release is logged and the move still answers (startup clears hidden folders left without a chat).
  • Compatibility:
    • Older phones ignore the unknown marker and never send the flag, so their creates keep the workspace they named, exactly as on main today.
    • Phones send the flag only to a host that lists a hidden record, so older hosts never see it.
    • The CLI host lists no hidden records, so phones offer nothing new there.

Protocol revision

Revision 51 (AIDEN_REMOTE_NO_WORKSPACE_CONTRACT_REVISION), claimed at merge after #693 took 50 (attachments:raw). The host constant, OpenAPI, fixture (contractRevision 51), iOS, Android, tests and docs all say 51. #648 also had a provisional claim and moves to the next free number after this lands.

Changes

  • Mac:
    • workspace-application-service.ts: workspaceForNoWorkspaceChat, plus a chatIdsIn dependency.
    • aiden-remote-chats.ts:
      • parseCreate accepts noWorkspace: true.
      • Create uses the noWorkspace target only with it.
      • The assigningNoWorkspace serializer.
      • Move releases the folder it left, best effort.
    • aiden-remote-service-main.ts: the adapter and the workspaces:changed broadcast.
    • aiden-remote-workspaces.ts: the projection marker.
    • aiden-remote-protocol.ts, openapi.json (both workspace schemas plus the POST /chats request body), and the fixture (a third workspace, the default home).
  • iOS:
    • AidenWorkspace.noWorkspace, and AidenNoWorkspace (home, choices with keeping:, unarchived, grouped, groupID, label, unlistedWorkspaceIDs).
    • createChat(noWorkspace:).
    • Sidebar projection and Recents label and search, the New Chat popover, the pickers, the workspaces directory, the split-view detail and selection (AidenWorkspaceNavigation.selectableIDs), Scheduled Tasks, the intent catalog, the link and navigation-request paths, archive pruning, and the unlisted-workspace re-read in AidenWorkspaceShellView.
    • AidenRemoteCoordinator.refreshWorkspaces() ignores cancellation.
    • scripts/check-ios-shipping-target.test.mjs: the existing createChat(workspaceId: workspace.id…) pattern now also matches the call that passes noWorkspace.
  • Android:
    • AidenWorkspace.noWorkspace, AidenNoWorkspace (including label and unlistedWorkspaceIds) and createChat(noWorkspace =).
    • Sidebar projection and Recents label and search, the new-chat sheet, the Existing picker, the workspaces screen, the intent catalog, the link path in MainActivity, archive pruning, strings, and the unlisted-workspace re-read in AidenWorkspaceHomeViewModel.
    • refreshWorkspaces() returns its job, so the create paths can wait for it.
  • Docs:
    • docs/aiden-remote-api-v1.md: workspace allowlist, plus a new "Chats without a workspace on phones, revision 51" section.
    • docs/no-workspace-chats.md (Platforms), docs/aiden-on-the-go-remote-access.md, README and ios/CHANGELOG.md.

Known follow-up (not in this PR)

A phone fork of a No workspace chat still copies into the source chat's hidden folder, as it does on main today. The desktop gives such a fork its own folder on first send from the desktop. A fork that is only sent from a phone keeps sharing the folder; nothing is lost, because the folder is released only after its last chat goes. Splitting forks needs a change in the fork service, so it's left for a follow-up.

Tests

  • Run locally, all pass:
    • npx tsx --test main/services/aiden-remote-{protocol,host-feed,chats,workspaces,router,platform-contract}.test.ts main/services/workspace-application-service.test.ts
    • npm run test:ios-release
    • eslint on the changed TS files, and tsc
  • New host tests:
    • A flagged create aimed at a used hidden folder lands in a fresh one, and its retry keeps it.
    • An unflagged (older phone) create stays put, and noWorkspace: false is refused.
    • A move out releases the folder, and still answers when the release fails.
    • Two phones starting chats at once never share a folder; this fails without the serializer.
    • The projection marker.
  • iOS:
    • AidenChatTests:
      • the popover offers No Workspace only when the Mac lists a Chats home;
      • hidden chats share one Chats section on the home;
      • archive flags on hidden records are ignored;
      • choices(keeping:) keeps a scheduled task's hidden folder;
      • Recents search finds hidden chats by "Chats", not "No workspace";
      • a chat in an unlisted hidden record is asked about once and shows under Chats after the re-read;
      • split view selects the Chats home only while one of its chats is open.
    • AidenRemoteClientTests: noWorkspace is sent when asked and omitted otherwise.
    • The Phase0 fixture revision is 51.
  • Android:
    • AidenChatRowStatusTest: the Chats grouping and the home fallback; choices; no home on an older host; archive flags ignored; Recents search by "Chats"; the unlisted-record re-read.
    • AidenRemoteClientTest: the request flag.
    • AidenBotContractTest reads the third fixture workspace.
  • There is no Xcode or Android SDK here, so hosted CI compiles and runs both phone suites. Hosted CI was fully green on 49653e5 before the revision move.
  • Flake notes:

Screenshots

Skipped for this PR at the owner's request: there is no iOS simulator or Android emulator here.

🤖 Generated with Claude Code

https://claude.ai/code/session_018VA6RFqDNj2JR5gEfeQrPB

iPhone and Android now list No workspace chats in one Chats group and
offer No Workspace first under New Chat. Workspace records carry an
optional noWorkspace marker; the host splits a phone's new chat (or a
move) into a fresh hidden folder when the target already holds a chat,
and releases an empty hidden folder when a chat moves out. Hidden
records stay out of phone pickers, the workspace list and Scheduled
Tasks. Older phones ignore the key; the CLI lists no hidden records, so
phones offer nothing new there.

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

@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.

Caution

No Workspace creation can silently fail to open the new chat on iOS. The workspace-reconciliation, concurrent-allocation, and archive-recovery issues below need correction before merging.

Reviewed changes across the host allocation lifecycle, Remote contract, both native clients, tests, and documentation.

  • Host allocation: Remote chat creation and moves split occupied hidden workspaces into fresh records and release unused records after moves.
  • Phone experience: iOS and Android add No Workspace creation, consolidate hidden chats into Chats, and remove hidden records from workspace management and selection surfaces.
  • Protocol: Revision 50 adds the optional workspace marker to projections, OpenAPI, and the shared fixture without another feature token.
  • Verification: All 173 focused server tests and both focused Android suites passed; changed Swift files passed syntax parsing. A real-service probe reproduced the concurrent-folder collision. Native iOS execution and phone screenshot checks were not available in this Linux review environment.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

- Both phones re-read workspaces when a create lands in a hidden
  workspace they haven't listed, so iOS opens the chat and both
  sidebars show it under Chats.
- The host assigns phone creates and moves into hidden folders one at a
  time, so two requests at an empty home can't share its folder.
- Phones ignore an archive flag an older build left on a hidden record;
  the Chats group has no Unarchive, so its chats would stay hidden.

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

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 3 finding(s) anchored to the diff. See the pinned summary comment for the overview.

Comment thread main/services/aiden-remote-chats.ts Resolved
Comment thread main/services/aiden-remote-chats.ts Resolved
@very-hermes-bot

very-hermes-bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Hermes Review Bot

Confidence: 4

Engine: opencode/opencode-go/deepseek-v4.1-flash
Review mode: full
Head: 49653e593a3afa0fc32cd58338346ea671bee62c
Generated: 2026-11-02T05:34:04+00:00
Reviews: 1

Summary

This change extends the desktop's "chats without a workspace" model to paired phones: the host projects hidden per-chat workspace records with an optional noWorkspace: true marker, and POST /chats accepts noWorkspace: true so a phone create aimed at the Chats home gets a fresh hidden folder when the target already holds a chat. iPhone and Android then collapse every hidden record into one Chats group, offer No Workspace in New Chat, hide those records from pickers/lists/schedules/split-view pages, map remembered hidden ids to the Chats home, and re-read GET /workspaces when a chat names a record they have not listed. The host serializes flagged creates and moves through assigningNoWorkspace and releases a moved-out hidden folder best-effort, and the protocol/fixture/OpenAPI plus docs are updated for revision 50. The highest-risk areas to double-check are the host's release condition (persistedChatWorkspaceId plus the adapter's hidden-only guard), the phone-side alreadyReRead marking (a failed one-shot re-read is not retried for that id while connected), and that hidden records never become selectable workspace pages.

Confidence Score: 4/5

I traced the host create/move/projection/archive-prune paths and both clients' create, link, split-view, scheduled-task and re-read paths, read the changed tests, and verified the cited files and line ranges; I could not run the native suites or hosted CI, so compile/runtime coverage on device is unverified.

📁 Important Files Changed
  • main/services/aiden-remote-chats.ts — accepts/validates noWorkspace, routes creates through the host target, serializes flagged creates/moves, and releases the folder a move leaves.
  • main/services/workspace-application-service.ts / workspace-application-service-main.ts — new workspaceForNoWorkspaceChat and chatIdsIn dependency that decide reuse vs. a fresh hidden folder.
  • main/services/aiden-remote-service-main.ts — adapter that creates/releases hidden records and broadcasts workspaces:changed.
  • main/services/aiden-remote-workspaces.ts, aiden-remote-protocol.ts, protocol/.../openapi.json, protocol/.../fixtures/contract.json — projection marker, revision 50, schemas and the fixture's third (default home) workspace.
  • ios/AidenOnTheGo/Networking/AidenRemoteClient.swift, Features/Remote/AidenWorkspaceShellView.swift, ContentView.swift, AidenRemoteCoordinator.swift, AidenScheduledTasksView.swift — AidenNoWorkspace helpers, new-chat/chooser/sidebar/split-view behavior, hidden-id mapping, re-read, and cancellation handling.
  • android/.../models/AidenWorkspaceEnvironment.kt, AidenWorkspaceHomeScreen.kt, AidenWorkspaceHomeViewModel.kt, AidenWorkspaceShellScreen.kt, MainActivity.kt, AidenRemoteCoordinator.kt, AidenRemoteClient.kt — the Android counterparts plus the joinable refreshWorkspaces().
  • Tests: aiden-remote-chats.test.ts, workspace-application-service.test.ts, aiden-remote-workspaces.test.ts, AidenChatTests.swift, AidenRemoteClientTests.swift, AidenRemotePhase0Tests.swift, AidenChatRowStatusTest.kt, AidenRemoteClientTest.kt, AidenBotContractTest.kt; docs/README/CHANGELOG; scripts/check-ios-shipping-target.test.mjs regex update.

Findings

No findings.

📊 Sequence Diagram
sequenceDiagram
    participant Phone as Phone (iOS/Android)
    participant Host as Aiden host
    participant WS as WorkspaceApplicationService
    participant Desktop as Desktop renderer
    Phone->>Host: POST /chats {workspaceId: home, noWorkspace: true}
    Host->>Host: assigningNoWorkspace (serialized)
    Host->>WS: workspaceForNoWorkspaceChat(home)
    WS->>WS: chatIdsIn(home); createNoWorkspace() if used
    WS-->>Host: workspaceId (home or fresh hidden record)
    Host-->>Desktop: workspaces:changed (when a record was made)
    Host->>Host: application.create(chat, workspaceId)
    Host-->>Phone: 201 chat {workspaceId}
    Phone->>Host: GET /workspaces (if the id is unlisted)
    Host-->>Phone: workspaces incl. noWorkspace marker
    Phone->>Phone: group into one Chats section and open the chat
Loading

Machine-Readable Findings

[]

Last reviewed commit: 49653e593a3a
Reviews (1) · Comment /hermes review to trigger a new review · /hermes review full for full re-review

@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.

✅ No new issues found.

Reviewed changes in 12cecf679 since the prior review at 01abaa5a4, focusing on the three corrective changes and their native-client and host integration.

  • Reconciled workspace discovery. Added workspace refreshes after creation returns an unknown workspace, with iOS awaiting discovery and rechecking request authority before opening the chat.
  • Serialized hidden-folder assignment. Coordinated occupancy selection and persistence across Remote creates and moves, and added a concurrent two-device creation test.
  • Recovered legacy archived chats. Ignored archive flags on hidden records in both phones' active workspace projections while keeping ordinary project archives intact, with focused policy assertions and updated documentation.
  • Verified focused behavior. Passed all 174 focused server/workspace tests, changed-TypeScript ESLint, and changed-Swift syntax checks. Android verification was inconclusive: an overlapping Gradle invocation failed with Failed to create MD5 hash ... merger.xml ... as it does not exist, and the subsequent synchronous attempt reported Tool 'shell' timed out after 120000ms; native iOS execution and phone screenshot checks were unavailable. Hosted CI on this head is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

…e in turn

- Announce workspaces:changed when a phone's chat gets a fresh hidden
  folder or one is released, so the desktop sidebar lists the chat.
- New-chat links and Shortcuts see hidden records as one Chats entry and
  accept a chat that landed in a fresh hidden folder, refreshing
  workspaces before opening it.
- A move releases the folder it left inside the same serialized turn.

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

@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

The new Chats Shortcut entry can be offered but rejected on devices with a legacy archive flag on its hidden home.

Reviewed changes in 1e561ebf3 since the previous Pullfrog review at 12cecf679, covering desktop invalidation, serialized release, and native Shortcut/new-chat-link integration.

  • Added desktop invalidation. Broadcast workspace changes when Remote allocation creates or releases hidden records.
  • Serialized folder release. Kept move cleanup inside the same assignment turn as allocation and persistence.
  • Grouped Shortcut choices. Published one Chats entry in both native catalogs and allowed new-chat links to accept a newly allocated hidden workspace, refreshing workspace discovery when necessary.
  • Verified focused behavior. Passed all 174 focused server tests, changed-host-service ESLint, and changed-Swift syntax parsing. The focused Android run returned Tool 'shell' timed out after 120000ms without assertion results; native iOS execution and phone screenshot checks were unavailable, and exact-head hosted CI was still pending.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

Both phones now prune archive flags for hidden No workspace records when
the Mac's workspace list arrives, so Shortcuts, new-chat links and
cached-chat opening agree that the Chats home is never archived. iOS
link targets list the Chats home the same way as the catalog.

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

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 2 finding(s) anchored to the diff. See the pinned summary comment for the overview.

Comment thread main/services/aiden-remote-chats.ts Resolved

@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.

✅ No new issues found.

Reviewed changes in 8f3f00f16 since the previous Pullfrog review at 1e561ebf3, covering the archive-state correction and its Shortcut/new-chat admission paths on both phones.

  • Cleared legacy hidden-record archives. Updated both coordinators to prune persisted archive flags against ordinary workspace IDs when accepting live workspace lists, making Chats available to the existing admission checks while preserving archived projects.
  • Aligned iOS target choices. Grouped active-instance new-chat targets into one Chats entry, matching the intent catalog and Android.
  • Checked focused behavior. Traced archive pruning, persistence, catalog publication, and connected creation gates on both clients; both changed Swift files passed syntax parsing. The focused Android grouping and new-chat-consent run returned Tool 'shell' timed out after 120000ms without assertion results. Native iOS execution and phone screenshot validation remain unavailable here, and exact-head hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

…Pad detail

- POST /chats takes an optional noWorkspace: true. Only new phones send
  it (when the target is a hidden record), so the host splits only their
  chats into a fresh folder; older phones keep the workspace they named
  and never get a chat back in a record they haven't listed. Moves keep
  the workspace they name and still release an emptied hidden folder.
- iOS split view never shows a hidden record's own page, and an opened
  Chats chat selects and expands the Chats group.

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

@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.

✅ No new issues found.

Reviewed changes in 068d1fe6c since the previous Pullfrog review at 8f3f00f16, covering request-level compatibility and the iOS Chats selection/detail behavior.

  • Made allocation opt-in. Added noWorkspace: true to the create contract and both native clients, preserving the named workspace for older clients and moves; updated the OpenAPI definition, API guide, and focused tests.
  • Aligned iOS navigation. Selected and expanded the shared Chats home when opening a hidden-record chat, while retaining the actual chat workspace for detail actions, and prevented hidden records from opening workspace-management detail pages.
  • Verified focused contracts. Passed all 174 Remote/workspace tests, all 14 peer operation/response tests, changed-TypeScript ESLint, and syntax parsing for all four changed Swift files. Android verification was stopped during :app:compileDebugKotlin, before test assertions, so no Android pass is claimed. Native iOS execution and phone screenshot validation remain unavailable here; exact-head hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

Comment thread ios/AidenOnTheGo/ContentView.swift Resolved
New-chat links and Shortcuts map a requested or remembered workspace id
through the Chats grouping before matching it, so a chat's own hidden
folder resolves to the Chats home instead of an arbitrary workspace.

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

@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.

✅ No new issues found.

Reviewed changes in 631e4a2dd since the previous Pullfrog review at 068d1fe6c, covering new-chat link target resolution on iOS and Android.

  • Normalized hidden selections. Mapped explicit and persisted hidden-folder workspace selections to the shared Chats home before matching grouped candidates, preserving ordinary workspace matching and fallback behavior.
  • Checked creation admission. Traced the resolved home through existing archive, pairing, and consent checks into opt-in No Workspace creation on both clients; all prior Pullfrog threads remain resolved.
  • Verified available checks. Passed syntax parsing for the changed Swift file. The focused Android grouping/consent run was stopped during Gradle initialization before test results, so no Android pass is claimed. Native iOS execution and screenshot validation remain unavailable here; exact-head hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

… shape check

The New Workspace Chat accessibility label stays as it was on both
phones (the reviewed iOS product-shell check names it). That check's
createChat pattern now also matches the call that passes noWorkspace.

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

@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.

✅ No new issues found.

Reviewed changes in e4e0cdd97 since the previous Pullfrog review at 631e4a2dd, covering the native label restoration and the adjusted iOS shipping check.

  • Restored existing labels. Kept New Workspace Chat as both phones' new-chat button accessibility label; Android also reuses that resource for its creation-sheet title.
  • Adjusted the shipping check. Allowed the existing createChat(workspaceId: workspace.id…) pattern to match the additional noWorkspace argument without changing creation behavior.
  • Verified available checks. Passed npm run test:ios-release with 20 Ruby tests and 30 Node tests, plus syntax parsing for the changed Swift file. Native UI, screen-reader, and XCTest validation were not performed; Android compilation was not rerun for its string-only delta, and green exact-head hosted CI is not established.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 2 finding(s) anchored to the diff. See the pinned summary comment for the overview.

Comment thread main/services/aiden-remote-protocol.ts Resolved
…reates split

- iPhone's scheduled task editor still lists the hidden No workspace
  folder a task already runs in, so it shows its name and saving keeps
  it, as on the desktop.
- Only a flagged POST /chats gets a fresh hidden folder. The revision 50
  and helper comments now say so, and the unused chat id argument is gone.

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

@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.

✅ No new issues found.

Reviewed changes in ca5503749 since the previous Pullfrog review at e4e0cdd97, covering scheduled-task workspace preservation and the create-only allocator cleanup.

  • Preserved scheduled-task workspaces. Kept an existing task's selected hidden workspace available in the iOS picker and final review while continuing to exclude unrelated hidden records; extended the filtering test and updated the guides.
  • Clarified create-only allocation. Removed the unused existing-chat argument from the allocator and its adapter, and aligned comments with the existing opt-in create behavior and unchanged move targets.
  • Verified focused checks. Passed all 152 focused protocol/chat/workspace tests, ESLint on the changed TypeScript files, syntax parsing for all three changed Swift files, and the iOS release checks (20 Ruby tests and 30 Node tests). Native XCTest, SwiftUI type-checking, and screenshot validation remain unavailable on this Linux runner; exact-head hosted CI is still in progress.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

If the workspace re-read after creating a chat in a fresh hidden folder
fails, iPhone now tells the person the chat was started on the Mac and
will appear under Chats once it reconnects, instead of dropping it
silently.

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

@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.

✅ No new issues found.

Reviewed changes in 84486d603 since the prior Pullfrog review at ca5503749, covering the iOS created-but-not-opened failure path.

  • Reported incomplete workspace discovery. Added explicit feedback in Home and Shortcut/link creation when the returned chat's workspace remains unknown after refresh, preserving request-authority checks and avoiding another create attempt.
  • Retained the Home receipt. Accepted the created chat into Home's summary model before returning from that failure path, while leaving navigation blocked until its workspace is available.
  • Verified available checks. Passed syntax parsing for all three changed Swift files and npm run test:ios-release with 20 Ruby tests and 30 Node tests. Native XCTest, SwiftUI type-checking, and simulator screenshots remain unavailable on this Linux runner; the failed-refresh branch was inspected but not runtime-tested, and exact-head hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

The sheet now opens with No Workspace, so its heading matches iPhone's
"New Chat"; the + button keeps its "New Workspace Chat" description.

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

@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.

✅ No new issues found.

Reviewed changes in 110407572 since the prior Pullfrog review at 84486d603, scoped to Android’s New Chat sheet heading.

  • Aligned the visible heading. Switched the sheet to the existing New Chat string while preserving the plus button’s New Workspace Chat accessibility description.
  • Checked the resource and surrounding UI. Confirmed the referenced string exists and the sheet renders a single heading; no local build, native UI, or screen-reader tests were run for this one-line change. Exact-head hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 2 finding(s) anchored to the diff. See the pinned summary comment for the overview.

…for the re-read

- iPad split view only selects the Chats group's home while one of its
  chats is open; otherwise the selection falls to a workspace that has a
  page, so the detail column no longer sits on "Choose a Workspace".
- Android waits for the workspace re-read before opening a chat that
  landed in a hidden folder it hadn't listed, so the sidebar has it.

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

@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

Android's new workspace-refresh wait can open the created chat under a different installation if the active pairing changes while waiting.

Reviewed changes in 82fb553d1 since the prior Pullfrog review at 110407572, covering iPad selection reconciliation and Android's post-create discovery ordering.

  • Restricted split-view selection. Excluded hidden workspace records from reconciled selection unless they represent an open Chats conversation, and added focused fallback/group-selection assertions.
  • Awaited Android discovery. Returned the workspace-refresh job and joined it in Home and external new-chat creation before navigating; identified the missing authority recheck after that suspension.
  • Verified available checks. Passed syntax parsing for both changed Swift files and the iOS release checks (20 Ruby tests and 30 Node tests). The focused Android coordinator/consent/grouping run was stopped during Gradle initialization before assertions; native XCTest, SwiftUI type-checking, and screenshots were unavailable, and exact-head mobile CI remains pending.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

…aces

After waiting for the workspace re-read, both create paths check that the
pairing that made the chat is still the active one before opening it, so a
switch to another Mac during the wait never opens the old chat there.

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

@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.

✅ No new issues found.

Reviewed changes in fb8739821 since the prior Pullfrog review at 82fb553d1, scoped to Android’s two navigation checks after workspace discovery.

  • Rechecked external creation authority. Reused valid() after the workspace-refresh wait, before changing the selected area or opening the created chat.
  • Checked Home’s original client. Added a client-identity check after the same wait to suppress navigation when the active client has changed, without retrying creation.
  • Traced the surrounding behavior. Checked consent consumption, coordinator client replacement, and workspace-response fencing. The focused Android coordinator/consent run was stopped during resource processing before test assertions; the exact held-refresh/navigation scenario remains untested, and hosted CI is still pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

…-ifvf3g

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

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 2 finding(s) anchored to the diff. See the pinned summary comment for the overview.

Comment thread main/services/aiden-remote-chats.ts Resolved
…Phone links re-read

- A move out of a hidden folder answers with the moved chat even if the
  folder can't be released (logged; startup clears it later).
- An iPhone chat link whose workspace it hasn't listed re-reads the Mac's
  workspaces once before deciding the chat is unavailable.

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

@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.

✅ No new issues found.

Reviewed changes in aace34425 since the previous Pullfrog review at fb8739821; the intervening merge of main left the net PR behavior unchanged.

  • Preserved successful move receipts. Made hidden-folder release best effort after persistence, with a generic adapter warning and a focused test confirming that cleanup failure still returns the moved chat.
  • Reconciled iPhone chat links. Added workspace discovery for an unknown chat workspace, retained the installation-authority and archive checks, and selected the shared Chats group before opening the conversation; updated the API guide accordingly.
  • Verified available checks. Passed all 104 focused Remote chat/workspace tests, changed-TypeScript ESLint, Swift syntax parsing, and iOS release checks covering 20 Ruby tests and 30 Node tests. Native XCTest, SwiftUI type-checking, and screenshots were unavailable on this Linux runner; the new link sequence was inspected rather than runtime-tested, and exact-head hosted CI remains pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

…ted one

A chat another phone or the Mac starts without a workspace gets a fresh
hidden record that this phone hasn't listed, so its sidebar left the chat
out until a reconnect. iPhone and Android now re-read the workspace list
once per such id, and the chat shows under Chats.

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

@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

The new iOS workspace-discovery task can cancel its own request and leave another device's chat hidden without another discovery attempt.

Reviewed changes since the prior Pullfrog review at aace34425, scoped to cross-device workspace discovery in 5254090cf and the intervening merge of main.

  • Added missing-workspace discovery. Triggered workspace re-reads from Android's summary updates and an iOS shell task, with per-installation attempted-ID tracking and connected-state gates.
  • Extended projection coverage. Added both platforms' missing-ID and grouping assertions, and documented discovery of chats started on other devices.
  • Verified available checks. Passed syntax parsing for all three changed Swift files and the iOS release checks: 20 Ruby tests and 30 Node tests. The focused Android test command returned Tool 'shell' timed out after 120000ms without assertion results; native iOS lifecycle execution was unavailable, and exact-head hosted CI remains pending.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using gpt-6.1-sol | 𝕏

…iew task

Marking the ids changed the .task(id:) identity, which cancelled the
task while it awaited the workspace read. The read now runs in its own
task.

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

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

…n error

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

@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.

✅ No new issues found.

Reviewed changes since the prior Pullfrog review at 5254090cf, covering the iOS discovery-lifecycle fix, the subsequent cancellation-handling correction, and the intervening merge of main.

  • Separated discovery ownership. Started the workspace re-read in an independent Task, so updating the attempted-ID set no longer lets SwiftUI task cancellation abort discovery.
  • Preserved connection state on cancellation. Returned silently for cancelled workspace reads while retaining existing handling for real failures and installation/generation checks for responses.
  • Verified available checks. Passed syntax parsing for both changed Swift files and npm run test:ios-release with 20 Ruby tests and 30 Node tests; native XCTest, SwiftUI type-checking, and the held-response lifecycle test were unavailable on this Linux runner, and green exact-head hosted CI is not established.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

…en phones first see the choice

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

@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.

✅ No new issues found.

Reviewed changes in f9ea872b2 since the prior Pullfrog review at e4ae753cf, scoped to Recents labels on both phones and the discovery documentation.

  • Aligned Recents labels. Used the existing Chats group-name constants for hidden-workspace conversations on iOS and Android, preserving ordinary workspace names and existing missing-workspace handling.
  • Corrected discovery guidance. Documented that startup converts only a folderless default workspace; installations whose default already has a folder expose the phone choice once a hidden record exists.
  • Verified available checks. Passed Swift syntax parsing and traced both label paths and the host migration condition. Native builds, XCTest, Android tests, and rendered-label checks were not run for this delta; exact-head hosted CI remains pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

@very-hermes-bot very-hermes-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.

…en chat shows

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

@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.

✅ No new issues found.

Reviewed changes in 49653e593 since the prior Pullfrog review at f9ea872b2, scoped to Recents search on both phones.

  • Aligned search with displayed labels. Routed Recents filtering and row labels through each platform's AidenNoWorkspace.label, so hidden-record chats match Chats while ordinary workspace and chat-title searches retain their behavior.
  • Extended behavioral coverage. Added expected-result assertions to both existing projection suites for matching chats and excluding the hidden record's underlying No workspace name.
  • Verified available checks. Passed syntax parsing for all three changed Swift files. The focused Android test command returned Tool 'shell' timed out after 120000ms without assertion results; native XCTest and rendered UI checks were unavailable, and exact-head hosted CI remains pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

#693 took revision 50 (attachments:raw). This PR claims 51 across the
host constant, fixture, OpenAPI, iOS, Android, tests and docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018VA6RFqDNj2JR5gEfeQrPB
@sambitcreate sambitcreate changed the title Phones: chats without a workspace, like the desktop (Remote rev 50) Phones: chats without a workspace, like the desktop (Remote rev 51) Nov 2, 2026

@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.

✅ No new issues found.

Reviewed changes since the previous Pullfrog review at 49653e593, scoped to the merge of main and the No Workspace contract-revision update.

  • Moved No Workspace to revision 51. Preserved raw uploads at revision 50 and aligned the global host revision, shared fixture, iOS assertion, OpenAPI descriptions, native comments, and documentation; discovery still uses the workspace marker rather than a revision gate.
  • Checked merge integration. Confirmed the merged root test chain retains every step from both parents; all six prior Pullfrog finding threads remain resolved.
  • Verified focused checks. Passed all 284 focused Remote/workspace tests, scoped ESLint, Swift syntax parsing, and iOS release checks covering 20 Ruby tests and 30 Node tests. Native XCTest and Android builds/tests were not rerun for this delta; exact-head hosted CI remains pending.

Pullfrog  | View workflow run | Using gpt-6.1-sol | 𝕏

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.

3 participants