Repository navigation
Keep same-machine folders with matching Git remotes in separate projects - #32272
Conversation
…ay-only clone split
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Walkthrough
Priority: Merge Risk:
|
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
02a713a9-17b4-4a6e-904c-0080e94feebb
📒 Files selected for processing: 66
mobile/src/components/NewWorktreeModal.tsxmobile/src/components/new-workspace-project-targets.test.tsmobile/src/components/new-workspace-project-targets.tsmobile/src/components/new-worktree-modal-types.tssrc/main/ai-vault-search/session-search-scope-catalog.tssrc/main/ai-vault-search/session-search-scope-resolution.tssrc/main/ipc/ai-vault-search-all-hosts-real-index.test.tssrc/main/ipc/ai-vault-search-all-hosts.test.tssrc/main/ipc/ai-vault-search-merged-cursor.test.tssrc/main/ipc/ai-vault-search.tssrc/main/orca-profiles/profile-project-state-file.test.tssrc/main/orca-profiles/profile-project-state-file.tssrc/main/persistence/tracking-repos/project-host-compatibility.tssrc/renderer/src/components/automations/automation-project-groups.tssrc/renderer/src/components/cmd-j/palette-results.test.tssrc/renderer/src/components/new-workspace/use-recent-project-ids.test.tssrc/renderer/src/components/new-workspace/use-recent-project-ids.tssrc/renderer/src/components/right-sidebar/ai-vault-project-key.tssrc/renderer/src/components/right-sidebar/ai-vault-project-ownership.test.tssrc/renderer/src/components/right-sidebar/ai-vault-session-projects.test.tssrc/renderer/src/components/right-sidebar/ai-vault-session-projects.tssrc/renderer/src/components/right-sidebar/use-ai-vault-search.tssrc/renderer/src/components/settings/RepositoryHostSetupsSection.claim.test.tsxsrc/renderer/src/components/settings/RepositoryHostSetupsSection.settings-entry.test.tsxsrc/renderer/src/components/settings/RepositoryHostSetupsSection.tsxsrc/renderer/src/components/settings/RepositoryPane.tsxsrc/renderer/src/components/settings/RepositoryRemoveProjectButton.tsxsrc/renderer/src/components/settings/repository-host-setup-options.tssrc/renderer/src/components/settings/settings-project-list.test.tssrc/renderer/src/components/settings/settings-project-list.tssrc/renderer/src/components/settings/settings-project-regrouping.test.tssrc/renderer/src/components/settings/settings-project-section-renderer.tsxsrc/renderer/src/components/settings/use-settings-page-effects.tssrc/renderer/src/components/settings/use-settings-store-model.tssrc/renderer/src/components/sidebar/worktree-list-groups-project-host-setups.test.tssrc/renderer/src/components/sidebar/worktree-list/navigation/reveal-ancestors.tssrc/renderer/src/components/task-page-default-repo-selection.tssrc/renderer/src/hooks/settings-navigation-remote-sections.tssrc/renderer/src/hooks/useSettingsNavigationMetadata.tssrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/lib/http-link-routing.tssrc/renderer/src/lib/local-preflight-context.tssrc/renderer/src/lib/local-project-runtime-workspace.tssrc/renderer/src/lib/workspace-port-localhost-label-selector.tssrc/renderer/src/store/project-host-setup-selector.test.tssrc/renderer/src/store/projects/project-update.tssrc/renderer/src/store/slices/repos-project-runtime.spec.tssrc/shared/ai-vault-project-search.test.tssrc/shared/ai-vault-project-search.tssrc/shared/ai-vault-search-merged-cursor.tssrc/shared/ai-vault-search-page-walk.tssrc/shared/project-checkout-claim.tssrc/shared/project-host-setup-hydration.test.tssrc/shared/project-host-setup-hydration.tssrc/shared/project-host-setup-lookup.test.tssrc/shared/project-host-setup-lookup.tssrc/shared/project-host-setup-projection.test.tssrc/shared/project-host-setup-projection.tssrc/shared/project-identity-succession.tssrc/shared/project-section-grouping.tssrc/shared/repo-host-identity.ts
💤 Files with no reviewable changes: 9
- src/renderer/src/components/cmd-j/palette-results.test.ts
- src/renderer/src/components/settings/RepositoryHostSetupsSection.settings-entry.test.tsx
- src/renderer/src/i18n/locales/fr.json
- src/renderer/src/components/settings/RepositoryPane.tsx
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/zh.json
- src/renderer/src/i18n/locales/ja.json
- src/renderer/src/i18n/locales/ko.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟡 Minor · Apply the ambiguity rule to WSL alias roots. · ai-vault-project-search.ts:46-52
src/shared/ai-vault-project-search.ts:46-52
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winApply the ambiguity rule to WSL alias roots.
The native root key marks a shared root as ambiguous. When two sources register the same path,
roots.set(key, ... ? null : source)storesnull. The WSL alias key does not follow this rule. It always stores the lastsource.Consider two setups on one host that share a WSL UNC path. A shared
worktreeBasePathis one example. In this case, the native key becomesnulland rejects the hit. The WSL key is assigned to the last setup. Theacceptcallback can match the WSL key and attribute the hit to that setup. The hit is then accepted or rejected for the wrong project, depending on iteration order.Use the same ambiguity rule for both keys.
🐛 Proposed fix
const addRoot = (host: string, path: string, source: string, priority = 'setup') => { + const claim = (key: string) => + roots.set(key, roots.has(key) && roots.get(key) !== source ? null : source) const normalized = normalizeRuntimePathForComparison(path) - const key = JSON.stringify([host, `${priority}:native`, normalized]) - roots.set(key, roots.has(key) && roots.get(key) !== source ? null : source) + claim(JSON.stringify([host, `${priority}:native`, normalized])) const wsl = parseWslUncPath(path) if (wsl) { - roots.set( - JSON.stringify([host, `${priority}:wsl:${wsl.distro.toLowerCase()}`, wsl.linuxPath]), - source - ) + claim(JSON.stringify([host, `${priority}:wsl:${wsl.distro.toLowerCase()}`, wsl.linuxPath])) } }
ℹ️ Review info
⚙️ Run configuration
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
4fff146c-c7e5-4054-9efb-6d97214a48da
📒 Files selected for processing: 123
.oxlintrc.jsonconfig/oxlint-plugins/app-store-performance.mjsconfig/scripts/project-catalog-read-boundary.test.mjsmobile/src/worktree/project-section-catalog.tsmobile/src/worktree/workspace-list-sections-desktop-parity.test.tssrc/main/ai-vault-search/session-search-current-owner.test.tssrc/main/ipc/ai-vault-search-all-hosts.test.tssrc/main/orca-profiles/profile-project-state-file.test.tssrc/main/orca-profiles/profile-project-state-file.tssrc/preload/api/ai-vault-api.tssrc/preload/api/ai-vault-bridge.tssrc/renderer/src/app-shell/use-runtime-graph-sync.tssrc/renderer/src/components/NewWorkspaceComposerCard.quick-file-drop.test.tsxsrc/renderer/src/components/NewWorkspaceComposerCard.tsxsrc/renderer/src/components/automations/AutomationsPage.create-destination.test.tsxsrc/renderer/src/components/automations/automations-page-fixtures.tssrc/renderer/src/components/automations/automations-page-runtime-fixtures.tssrc/renderer/src/components/automations/use-automations-page-store-state.tssrc/renderer/src/components/emulator-pane/mobile-emulator-agent-skill-target.test.tsxsrc/renderer/src/components/native-chat/native-chat-skill-discovery-context.tssrc/renderer/src/components/pull-request-page/checks/tab.tsxsrc/renderer/src/components/right-sidebar/AiVaultPanel.tsxsrc/renderer/src/components/right-sidebar/ai-vault-project-ownership.test.tssrc/renderer/src/components/right-sidebar/ai-vault-session-resume.tssrc/renderer/src/components/right-sidebar/project-search-lifetime.test.tsxsrc/renderer/src/components/right-sidebar/use-ai-vault-search.test.tsxsrc/renderer/src/components/right-sidebar/use-ai-vault-search.tssrc/renderer/src/components/settings/RepositoryHostSetupsSection.claim.test.tsxsrc/renderer/src/components/settings/RepositoryHostSetupsSection.test.tsxsrc/renderer/src/components/settings/RepositoryHostSetupsSection.workspace-window.test.tsxsrc/renderer/src/components/settings/use-settings-navigation-model.tssrc/renderer/src/components/settings/use-settings-store-model.tssrc/renderer/src/components/sidebar/AddRepoSteps.default-checkout.test.tssrc/renderer/src/components/sidebar/DeleteWorktreeLineageNotice.tsxsrc/renderer/src/components/sidebar/NonGitFolderDialog.test.tsxsrc/renderer/src/components/sidebar/add-repo-store-upsert.tssrc/renderer/src/components/sidebar/sidebar-list-parity-project-catalog.test-fixture.tssrc/renderer/src/components/sidebar/useAddRepoCloneFlow.test.tssrc/renderer/src/components/sidebar/useCreateRepo.default-checkout.test.tssrc/renderer/src/components/sidebar/worktree-list-groups-mobile-parity.test.tssrc/renderer/src/components/tab-bar/TabBar.windows-shell-launch.test.tssrc/renderer/src/components/tab-bar/TabBar.worktree-write-gate.test.tsxsrc/renderer/src/components/tab-bar/TabBar.worktree-write-gate.windows.test.tsxsrc/renderer/src/components/tab-bar/tab-bar-windows-shell-launch-test-harness.tssrc/renderer/src/components/tab-bar/use-tab-bar-runtime-model-worktree-write-probe.tssrc/renderer/src/components/tab-bar/use-tab-bar-runtime-model.tssrc/renderer/src/components/terminal-pane/pty-connection-test-store-state.tssrc/renderer/src/components/terminal-pane/terminal-drop-handler.test.tssrc/renderer/src/components/use-task-page-composer-actions.tssrc/renderer/src/components/use-worktree-jump-palette-store-state.tssrc/renderer/src/components/use-worktree-jump-palette-task-url.tssrc/renderer/src/hooks/composer-state/composer-target-state.jira-mapping.test.tsxsrc/renderer/src/hooks/composer-state/composer-target-store.tssrc/renderer/src/hooks/composer-state/jira-mapped-owner-flow.integration.test.tsxsrc/renderer/src/hooks/composer-state/target-change-actions.tssrc/renderer/src/hooks/useActiveProjectSkillRuntime.test.tsxsrc/renderer/src/hooks/useActiveProjectSkillRuntime.tssrc/renderer/src/hooks/useComposerState.integration.test.tssrc/renderer/src/i18n/locales/pt.jsonsrc/renderer/src/lib/agent-background-session-test-state.tssrc/renderer/src/lib/ai-vault-antigravity-reference-host.test.tssrc/renderer/src/lib/ai-vault-resume-command.drop-repin.test.tssrc/renderer/src/lib/ai-vault-resume-command.resumable-agent.test.tssrc/renderer/src/lib/ai-vault-resume-command.test.tssrc/renderer/src/lib/ai-vault-resume-command.tssrc/renderer/src/lib/ai-vault-resume-platform.tssrc/renderer/src/lib/ai-vault-resume-shell.test.tssrc/renderer/src/lib/ai-vault-resume-shell.tssrc/renderer/src/lib/ai-vault-session-fork-startup.test.tssrc/renderer/src/lib/codex-pane-selection-lane.test.tssrc/renderer/src/lib/codex-pane-selection-lane.tssrc/renderer/src/lib/execution-host-facts.test.tssrc/renderer/src/lib/execution-host-facts.tssrc/renderer/src/lib/http-link-routing.test.tssrc/renderer/src/lib/http-link-routing.tssrc/renderer/src/lib/launch-agent-background-session.test.tssrc/renderer/src/lib/local-preflight-context.test.tssrc/renderer/src/lib/local-preflight-context.tssrc/renderer/src/lib/local-project-runtime-workspace.tssrc/renderer/src/lib/workspace-port-localhost-label-selector.tssrc/renderer/src/runtime/sync-runtime-graph/project-section-catalog.tssrc/renderer/src/store/project-groups/project-group-mutations.tssrc/renderer/src/store/project-host-setup-selector.test.tssrc/renderer/src/store/project-host-setup-selector.tssrc/renderer/src/store/project-search-catalog.tssrc/renderer/src/store/projects/project-host-setup-actions.tssrc/renderer/src/store/projects/project-update.tssrc/renderer/src/store/repos/all-host-repo-catalog-actions.tssrc/renderer/src/store/repos/repo-add-actions.tssrc/renderer/src/store/repos/repo-catalog-actions.tssrc/renderer/src/store/repos/repo-catalog-identity.tssrc/renderer/src/store/repos/repo-removal.tssrc/renderer/src/store/repos/repo-state.tssrc/renderer/src/store/repos/repo-update.tssrc/renderer/src/store/repos/runtime-repo-catalog-actions.tssrc/renderer/src/store/slices/local-detected-agent-state.test.tssrc/renderer/src/store/slices/purge-stale-runtime-host-state.test.tssrc/renderer/src/store/slices/repos-all-hosts.test.tssrc/renderer/src/store/slices/repos-cross-host-refresh-identity.spec.tssrc/renderer/src/store/slices/repos-host-identity-routing.test.tssrc/renderer/src/store/slices/repos-nested-ssh-projection.test.tssrc/renderer/src/store/slices/repos-project-host-capability.spec.tssrc/renderer/src/store/slices/repos-project-host-lifecycle.spec.tssrc/renderer/src/store/slices/repos-project-runtime.spec.tssrc/renderer/src/store/slices/repos-refresh-identity.spec.tssrc/renderer/src/store/slices/repos-shared-project-badge-color.spec.tssrc/renderer/src/store/slices/repos-ssh-host-reconciliation.test.tssrc/renderer/src/store/slices/repos.test.tssrc/renderer/src/store/slices/repos.tssrc/renderer/src/store/slices/worktrees-removal-state-cleanup.test.tssrc/renderer/src/store/slices/worktrees/listing/worktree-host-ownership.tssrc/renderer/src/store/slices/worktrees/teardown/orphaned-runtime-ssh-project-purge.tssrc/renderer/src/store/slices/worktrees/teardown/purge-stale-runtime-host-state.tssrc/renderer/src/web/preload-api/web-ai-vault-api.tssrc/shared/ai-vault-project-search.test.tssrc/shared/ai-vault-project-search.tssrc/shared/ai-vault-search-client.tssrc/shared/ai-vault-search-host-page.tssrc/shared/ai-vault-search-page-walk.tssrc/shared/project-checkout-claim.tssrc/shared/project-identity-succession.tssrc/shared/project-section-catalog-claims.tssrc/shared/project-section-parity.test-fixture.ts
💤 Files with no reviewable changes: 1
- src/renderer/src/components/right-sidebar/ai-vault-project-ownership.test.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.
There was a problem hiding this comment.
Actionable comments posted: 2
ℹ️ Review info
⚙️ Run configuration
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
d3352624-75f1-4608-b073-f7fd61b1db2a
📒 Files selected for processing: 74
src/main/ai-vault-search/session-search-current-owner.test.tssrc/main/ai-vault-search/session-search-engine-types.tssrc/main/ai-vault-search/session-search-engine.tssrc/main/ai-vault-search/session-search-ownership-races.test.tssrc/main/ai-vault-search/session-search-page-cursor.tssrc/main/ai-vault-search/session-search-project-ownership.tssrc/main/ai-vault-search/session-search-row-filter.tssrc/main/ai-vault-search/session-search-scope-catalog.tssrc/main/ai-vault-search/session-search-scope-entry-points.test.tssrc/main/ai-vault-search/session-search-scope-paths.tssrc/main/ai-vault-search/session-search-scope-resolution.test.tssrc/main/ai-vault-search/session-search-scope-service.test.tssrc/main/ai-vault-search/session-search-service-registry.tssrc/main/ai-vault-search/session-search-service.tssrc/main/ai-vault-search/session-search-store-scope-catalog.test.tssrc/main/ai-vault-search/session-search-store-scope-catalog.tssrc/main/ai-vault/runtime-session-search-call.test.tssrc/main/ai-vault/runtime-session-search-call.tssrc/main/ai-vault/runtime-session-search-lifetime.test.tssrc/main/ai-vault/session-scanner-service-search-process.test.tssrc/main/ai-vault/session-scanner-service-search.test.tssrc/main/ai-vault/session-scope-real-paths.tssrc/main/ipc/ai-vault-search-all-hosts.test.tssrc/main/ipc/ai-vault-search-all-hosts.tssrc/main/ipc/ai-vault-search.test.tssrc/main/ipc/ai-vault-search.tssrc/main/ipc/register-core-handlers/register-core-handlers.tssrc/main/runtime/mobile-cloud-relay/mobile-relay-e2ee.integration.test.tssrc/main/runtime/runtime-rpc-device-key-dispatch.test.tssrc/main/sqlite/sync-database.tssrc/renderer/src/components/automations/AutomationsPage.create-destination.test.tsxsrc/renderer/src/components/automations/automations-page-fixtures.tssrc/renderer/src/components/automations/automations-page-runtime-fixtures.tssrc/renderer/src/components/automations/automations-page-test-harness.tsxsrc/renderer/src/components/right-sidebar/AiVaultPanel.legacy-filter.test.tsxsrc/renderer/src/components/right-sidebar/AiVaultPanel.tsxsrc/renderer/src/components/right-sidebar/ai-vault-project-key.tssrc/renderer/src/components/right-sidebar/ai-vault-project-ownership.test.tssrc/renderer/src/components/right-sidebar/ai-vault-session-project-candidates.tssrc/renderer/src/components/right-sidebar/ai-vault-session-projects.tssrc/renderer/src/components/right-sidebar/project-search-lifetime.test.tsxsrc/renderer/src/components/right-sidebar/use-ai-vault-panel-workspace.tssrc/renderer/src/components/right-sidebar/use-ai-vault-search.test.tsxsrc/renderer/src/components/right-sidebar/use-ai-vault-search.tssrc/renderer/src/components/terminal-pane/terminal-drop-handler.test.tssrc/renderer/src/lib/agent-background-session-test-state.tssrc/renderer/src/lib/ai-vault-resume-command.drop-repin.test.tssrc/renderer/src/lib/ai-vault-resume-command.resumable-agent.test.tssrc/renderer/src/lib/ai-vault-resume-command.test.tssrc/renderer/src/lib/ai-vault-resume-shell.test.tssrc/renderer/src/lib/http-link-routing.test.tssrc/renderer/src/lib/local-preflight-context.test.tssrc/renderer/src/lib/local-preflight-context.tssrc/renderer/src/lib/local-project-runtime-workspace.tssrc/renderer/src/store/project-host-setup-selector.tssrc/renderer/src/store/slices/worktrees-removal-state-cleanup.test.tssrc/renderer/src/store/slices/worktrees/listing/worktree-host-ownership.tssrc/renderer/src/web/preload-api/web-ai-vault-api.tssrc/renderer/src/web/preload-api/web-ai-vault-search-compat.test.tssrc/renderer/src/web/preload-api/web-runtime-calls.tssrc/renderer/src/web/web-preload-api-runtime-calls.test.tssrc/shared/ai-vault-runtime-capabilities.tssrc/shared/ai-vault-search-scope.tssrc/shared/git-remote-identity.tssrc/shared/project-catalog-canonical-projection.tssrc/shared/project-host-setup-hydration.test.tssrc/shared/project-host-setup-hydration.tssrc/shared/project-host-setup-lookup.tssrc/shared/project-host-setup-projection.test.tssrc/shared/project-host-setup-projection.tssrc/shared/sidebar-list/sidebar-project-catalog.tssrc/shared/worktree/ownership.tstests/e2e/ai-vault-project-native.unit.test.tstests/e2e/ai-vault-project-source-lifecycle.unit.test.ts
🚧 Files skipped from review as they are similar to previous changes: 1
- src/renderer/src/lib/agent-background-session-test-state.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
This comment has been minimized.
This comment has been minimized.
|
Separate folders with the same Git remote could share Session History and Project settings. Later checkouts on the same machine and execution filesystem now use their existing independent identity; the earliest checkout keeps the shared Project. Cross-machine and existing Windows/WSL association remain, and actions preserve the selected concrete folder and host. One derived catalog feeds controls and action inputs. History receives answering-host ownership for returned rows, native Project search applies ownership before limits, and ownership-only changes update the mounted list without a new transcript timestamp. No ownership field is saved and ordinary discovery is unchanged. Intended differences: scoped lists can underfill the loaded depth; Load more fetches further, and Project search still reaches older sessions. Rows with no surviving ownership evidence remain in All/unscoped folder History rather than guessing a clone. Missing/malformed optional metadata retains fallback, explicit unknown never guesses, and older peers retain their existing search behavior. Exact surviving Projects keep their saved runtime preference before overlap inheritance, including an existing Ubuntu choice. Five cumulative functional review rounds and terminal R6 ADOPT are complete; source/reference/performance judgments carry, with no open proven P0/P1. The pre-existing Jira target-substitution bug STA-11874 remains deferred. The common pattern separates concrete folder ownership from logical association; the cross-machine/mixed-peer adaptations above are intended. N/10N work-count and native SQL/query-plan contracts cover the added repeated work. The carried review/evidence head is The The latest normal merge Current head CI30 on parent Normal merge Previous normal merge CI28 settled with 29 successful checks, 16 skips and three failures; all complete failed logs were read. Static lint failed on main’s unchanged WSL test line limit, corrected by merged #34132. D7 found a PR integration omission: the performance test still supplied The empty commit CI24’s first attempt settled with 48 successes, 13 selected skips and 5 failures. All five complete failed logs and retained artifacts were reviewed. The coordinator authorized one failed-job retry after independently matching the first-provider-installation mock assertion on an unrelated PR. On retry that unit shard and SSH shard 2 passed without source changes; layout, SSH shard 1 and the consequential aggregate failed. All three retry failures were read completely. The repeated layout failure is the same absent QA: Exact application artifact W2’s configured run delivered the actual Note draft into real Codex 0.163.0 in B’s intended Both earlier W2 delivery failures remain disclosed and tracked in STA-12255: first an empty composer with the unsent-note toast, then the update menu followed by an empty composer after normal Escape. Their immediate cause remains unknown; source comparison found no PR-specific bypass, but no live-main causal reproduction or fix is claimed. The configured pass does not prove the cause. One driver missed Advanced before the configured Create and stopped at zero Creates; only that setup step was corrected in the existing composer. W1/W3 were not rerun and total History Resume stays one. The copy stopped gracefully by recorded identity; zero owned survivors/CDP listeners, idle distro never started, all real config and artifact hashes unchanged. All drivers/operators/nested workers ended. Root verified all 57 archive entries and released ticket 2519. Conservative shipped accounting: +2,221/−844 gross, 77 moved, 2,144 adjusted additions, net +1,377; runtime 0/40. Tests/support +5,980/−1,223 conservatively (raw current-main diff +5,962/−1,205; 18 additions/deletions remain charged across natural diff cancellation); locales +1/−15. For Brennan’s review
Nine accepted branch appearance captures carried from 54b072dThese are seven desktop states and two shipping native tablet drawers, accepted/uploaded and carried under the coordinator’s grant. They do not prove Windows agent execution or a phone-native pass. Tasks capture covers the picker, not signed-out provider retrieval; browser capture used existing in-Orca link routing, not the first external-browser flow. Run Target retains ordinary long-path ellipsis. Accepted targeted WSL evidence: W2 — configured real Codex delivery; provider reply blocked Earlier W2 failure retained: |














ELI5
Session History mixes conversations from separate folders when their Git remotes match. Each folder on the same machine should have its own project, history and settings.
What Changed
The earliest-added checkout on each machine and execution filesystem keeps the shared project identity. Other checkouts on that same surface use their existing folder identity. Only the earliest checkout can share that project with another host; later clones stay independent. The shared remote still joins checkouts across machines; Windows and WSL checkouts remain associated as before. Folder workspaces and provisioned copies do not compete for the shared identity. If the first checkout is removed, the earliest remaining checkout on that surface takes over the shared identity automatically; checkouts on other machines remain associated.
For compatibility, older paired servers keep their existing full-text search results, which can include both folders. Updated servers can apply exact folder ownership to full-text Project search; older servers keep their existing behavior. Concrete workspace creation and session resume keep using the selected folder and host.
Intended difference: a session with no surviving evidence of which clone owned it appears only in All search and unscoped History, where it is grouped by folder. Including it in a clone’s Project search would guess an owner and could mix the clones again. Retained workspace records and previous-path aliases still provide ownership to Project search. Ordinary History uses ownership derived by the answering host for returned rows, including retained ownership records. Older endpoints keep the existing fallback.
Intended difference: a scoped Project list may return fewer than the requested depth when another clone’s rows were filtered out; Load more fetches further. Old sessions beyond the loaded depth still appear through Project search, as on main. This change corrects returned rows and keeps ordinary discovery unchanged.
Project identity is re-derived from the existing repository catalog on load. There is no new saved field or migration. This also removes the separate display-only splits in Settings and the sidebar so routing and history use the same answer. A saved Available Hosts choice for a split checkout may reset once. A saved runtime choice follows the existing Project setting rule: if removing the first checkout makes another checkout join a shared Project that still exists, that surviving Project keeps its runtime choice. For example, if the shared Project uses Ubuntu and the joining Windows clone used Windows, both subsequently use the surviving Project’s Ubuntu choice. Ordinary handoff with only one surviving local owner preserves that owner’s explicit choice or inheritance. This uses the existing one-setting model without adding saved data.
Why
Remote equality was being used as folder identity. Settings and the sidebar each compensated separately, while history and project routing still saw one merged project. Deriving the distinction once fixes the shared cause and removes those duplicate repairs.
Credit to the contributor of #16388 for earlier work on same-host clone identity.
Linked Issue
STA-10541. Tracked in #28589; related reports #16387 and #18493.
Known separate issue: STA-11874 tracks an existing Jira action that can choose the first Windows/WSL location instead of the mapped location. This PR preserves that existing behavior.
Visual Proof
Branch images on
54b072d2a589419937a9edec88a3e1e29061cabcuse two independent folders with the same remote and the actual Store, History scanner and mounted controls. All nine originals were inspected and hash-verified. M1/M2 are the shipping native tablet drawers; no phone-native picker pass is claimed. The targeted Windows/WSL run verified Claude and Codex linked-task Note delivery and exactly one real History Resume. Codex’s configured run delivered the exact Note and issue link into its actual WSL conversation; its reply was blocked because the QA provider lacked the selected model. The two earlier Codex delivery failures remain disclosed below and tracked separately.Seven desktop screens and two native tablet drawers
Session History: B-only Project group and separate sidebar projects
Project Settings: separate entries and B’s complete path
New workspace: separate Project choices
Run Target: existing filter selects B; normal long-path ellipsis remains
Automation: separate Project choices
Tasks: separate Project filters; signed-out provider retrieval is not verified
Browser: B-attributed preview with existing Browser Link Routing enabled, then restored
Native tablet: separate Project drawer choices
Native tablet: B Run Target with complete path
Accepted targeted WSL Note delivery and single History Resume
W1: real Claude received the exact literal Note and linked issue, then replied
W3: real History row after closing the original conversation
W3: single Resume reopened the same session and a real reply recalled its prior context
These captures use the exact
eb00d0eapplication artifact under the stated carry to the current head. They establish W1 and W3. The configured W2 delivery proof is shown below; no real Codex reply is claimed.W2 attempt 1 failure, retained: empty composer and the unsent-note toast
Configured W2: actual Codex user turn contains the literal Note and linked issue in B’s WSL worktree; QA provider reply blocked
Testing
Full review path: derived Project identity crosses independently updated clients and servers. Named contracts cover Store/profile identity and runtime handoff, producer → RPC → mounted renderer publication, returned-row attribution, native SQLite ownership, mobile parity, concrete targets and immutable runtime addresses. N/10N operation checks and SQLite query-plan checks cover repeated ownership work. The common-pattern reference comparison and functional review are complete; no new functional review round was opened for main integration.
Prior head
cad26c0e4cad45f9cccd3d7c609a9293c59314dcpassed fresh full CI19: 53 successful checks, 13 workflow-selected skips, no failures or pending checks. All five unit shards, static analysis/typecheck, both SSH jobs, real WSL, cross-version wire, changed end-to-end/layout cases, persistence and packaging passed. Every earlier failed-job log was read. CI18’s stale Settings removal expectation was corrected to retain its exact-once/setup-ID assertion and include main’s required host ID; two named files passed 16 tests and the normal precommit hook passed. Its separate pinned-release extraction timeout has no proven underlying cause; the fresh cross-version job passed without a timeout or source change.Previous pushed head is
7b7d10aba62c93250a9aa57e5bf6aa2642a53db3, the normal merge of pinned main1b64adbaad848d8e14ddcfd4fd19ed79ca50968einto empty commit97cb0f49. Earlier normal merge0354eed3pinsf06f737; the current merge keeps its test diagnostics and fixture extraction. Exact current tree isdc66362ad9dd4c817bfa996820ad08625cdfb103.Current head
08577327e92e601bb582b0ac45707140a103884c; full CI31 green: Test-only commit08577327explicitly types the host-split diagnostic listing array. Under the E2E configuration’s strict null checking and disabled implicit-any errors, the empty array inferred asnever[]; the object push was incompatible. Every diagnostic field, predicate, assertion and timeout is preserved, with no cast, suppression or baseline change. The normal enabled precommit hook passed with exact reviewed/staged/hooked/committed treea6f8dbb5a37684782f1da3e6afd0921e0971a1ba; manifest and lock bytes were preserved. Runtime JavaScript is unchanged, so existing named tests and accepted QA carry; no local compiler or repeated QA pass is claimed. Fresh full CI31 is green on this head: 53 successful checks, 14 workflow-selected skips, no failures or pending checks. Static analysis/typecheck and the E2E ratchet, all five unit shards, cross-version wire, both managed-SSH shards, changed E2E/layout cases, real WSL, Windows D7, persistence and packaging passed. The earlier absent-branch layout case is no longer outstanding: the current selected layout run passed with main’s explicit branch-name input and retained diagnostics; this does not retrospectively establish the earlier failure’s exact cause.CI30 on parent
eeb13f95completed Windows D7, real WSL, mobile verification and the independent persistence checks. Static analysis failed only the E2E ratchet’s one error in this PR’s added diagnostic helper; the aggregate was consequential. Both complete failed logs were read. Normal compiler projects passed. The ratchet suppressed the exact TS message; the correction follows the declared compiler options and source types, now confirmed by the passing fresh-CI31 E2E typecheck gate. Seven selected downstream groups were blocked, including units, layout, wire and packages; these were not passes.Normal merge
eeb13f957973d6081a9abebf3c52b5f7c8a991cepins main77130982faf44abe3e4fb02354e79b61cdad5358. The sole conflict composed main’s existing escaped-identifier lint prefilter and this PR’s existing catalog-rule exemption, retaining each rule’s behavior. Twelve named files passed 140 tests (ten root files/122 and two mobile files/18), and the required direct merge hook preserved exact treeefadeba1936392876000107e56c7e55fad2b3644. Incoming History/helper/mobile ownership consumers were checked narrowly; diagnostics, explicit branch-name input, catalog factory and SSH selectors remain intact. CI29 on its previous parent ran cleanup only because of an actual main conflict, without a full-CI verdict.Previous normal merge
2f6ddedepins main43097c517b4d8f7ff34f8d899b8f169cae82b15c; its exact treef67d3a2b0254ae3551a433edb63d05144e6eed88passed nine named files/95 tests and the required direct merge hook. Its only manual edit adapts the performance fixture’sprojectsfield toendpointProjects; that exact performance file passed three tests, with all scales/assertions/timeouts retained. No manual production change was needed. That merge and its test-only correction carry QA evidence.CI28 settled with 29 successful checks, 16 skips and three failures; all complete failed logs were read. Static lint failed on main’s unchanged WSL test line limit, corrected by merged #34132. D7 found a PR integration omission: the performance test still supplied
projectsafter the canonical slice becameendpointProjects. The one-field test correction preserves every scale, assertion and timeout; its exact owning file passed three tests. The aggregate was consequential; blocked layout/unit/wire/package jobs were not passes. Current integration includes main’s existing repair without duplicating it.The empty commit
97cb0f49changed no file and passed its normal hook. The readiness tool’s earlier rejection of a valid empty commit’sfiles: []response has been corrected by its owner; the fixture already has the recognized.test-fixture.tssuffix. The accepted evidence marker remains on the QA’d head under the main-merge and non-shipped-commit carry rule. The approved QA marker remains unchanged. The manual diagnostic workflow was cancelled and produced no test verdict. CI25 could not start because a new main conflict blocked PR Checks; its cleanup-only result was not a pass. The earlier normal merge0354eed3pins mainf06f7378021809286a1d9e9c39b79cd3d6216332, preserves both parents and resolves the sole test modify/delete conflict by carrying main’s intentional deletion; that test’s only PR delta was three empty fixture fields. Thirteen overlapping paths preserve both parents. Main’s explicitbranchNameOverridefor the host-split fixture is retained alongside our diagnostics, with no claim that it proves the earlier failure’s cause. The direct hook found a deterministic test-file line-limit collision; extracting the same fresh catalog fixture into a test-only factory preserves all values and assertions. Eight named owning files passed 117 tests; after extraction its owning file passed 15 tests again, and the required direct hook passed. Exact reviewed/tested/hooked/committed tree isc4f8d42e5a1140ee8b1abf7eed897075c9ec40d6; lock bytes are unchanged. No manual production edit was needed. QA evidence carries across this merge. The earlier test-only commit0c8bd2efadds failure diagnostics for host-created workspace listing and scopes the existing SSH “Move anyway…” locator to its terminal reconnect banner. That earlier test-only tree is83d70fde97815bd33a363df4014d80788f43869a; its normal enabled hook and three owning contract files/19 tests passed. No production behavior, test predicate, timeout or later assertion changed. QA evidence carries across this test-only commit.CI24’s first attempt settled with 48 successes, 13 selected skips and 5 failures. All five complete failed logs and retained artifacts were reviewed. The coordinator authorized one failed-job retry after independently matching the first-provider-installation mock assertion on an unrelated PR. On retry that unit shard and SSH shard 2 passed without source changes; layout, SSH shard 1 and the consequential aggregate failed. All three retry failures were read completely. The repeated layout failure is the same absent
refs/heads/parity-setupworkspace lookup, treated as a likely PR regression for triage; precise production/listing cause remains unknown. A focused Store contract passed but supplied an authoritative visible row, so it does not reproduce the failure and is retained privately. Current test diagnostics preserve the existing lookup/assertions and capture actual creation/catalog/listing facts. Both SSH shard 1 failures prove the same inherited ambiguous page-wide button locator, matching banner and toast; the current test-only scope corrects that selector. The earlier SSH shard 2 pairing-revision failure’s cause remains unknown despite its retry pass. No production fix or assertion/timeout weakening is claimed. Earlier main compiler failures are corrected by integrated main. The current CI31 result above is controlling; historical checks overlap this coverage.Prior CI23 head is
6dfc8900ff8087f53f63340970ea3fdca20d0d5c, the normal merge of pinned mainffc2b3fba1401db1ab7f6bd7b5f616b33cb140e4intocfb71e3. The only textual conflict was a test import union. Sixteen named files passed 261 tests across the affected incoming consumers. The required hook then identified a 302/300-line integration collision in registration; replacing a duplicate awaited expression with its identical existing callback resolved it without adding state, control flow or behavior. Three directly owning files passed 20 tests, and the prescribed direct merge hook passed without changing the exact reviewed tree. Fresh full CI23 settled on this head: 29 successful checks, 16 skips, 3 failures, no pending checks. All three complete failed logs were read. GitHub’s actual synthetic checkout includes newer mainb7fb07c; its unusedStructuredChatPaneMenuItemsimport causes static lint and D7 installer TS6133 before runtime execution. The failing file is identical to that newer main, while this PR and its pinned main have no difference on the path. The aggregate is consequential, including seven selected downstream jobs blocked by preflight; those remain owed, not passes. The separate #34086 repair was open at that read; current integrated main independently removes the offending import. Real WSL and all independent persistence jobs passed. Earlier checks below are historical and overlap this coverage rather than forming a cumulative test total.Prior CI22 head is
cfb71e3fe14d8b7bfa2826aba6f7fbdd558fc543, the normal clean merge of pinned main1a77543ee0bd4c03412ad8b284033d0184f8300fintod34e32c. No conflict or manual resolution was needed. Main correction #33934 removes the obsolete layout-test warmup that caused CI21’s inherited compiler failure; all test assertions remain. Five named files passed 95 tests, including both previously blocked layout contracts and the incoming PowerShell/terminal contracts. The prescribed direct merge hook passed without changing the exact reviewed tree. Fresh full CI22 is green on this head: 53 successful checks, 13 workflow-selected skips, no failures or pending checks. Static analysis/typecheck, all five unit shards, both SSH jobs, real WSL, cross-version wire, changed end-to-end/layout cases, persistence and packaging passed.CI21 settled on
d34e32cwith 29 successful, 16 skipped and 3 failed checks. Complete logs prove one inherited-main compiler error: undefinedswitchedBuildin an unchanged layout test. Static and D7 installer typecheck stop on that same error; D7’s runtime test did not execute and the aggregate is consequential. Fresh CI22 has now passed those previously blocked downstream selections. That merge’s two mechanical Settings resolutions passed seven named files/53 tests and its required hook. The precedingdb916afmerge passed full CI20 (53 successful checks, 13 selected skips), ten named integration files/103 tests and its required hook. Integration checks overlap earlier coverage rather than forming a cumulative test total.The exact
eb00d0e294bca5c4b35bae7201896b8fc347123aapplication artifact and isolated profile carry across the later main and test/config commits under the established QA rule and explicit coordinator ruling. Previous packaged build 1.4.214 saved B’s Project WSL preference and the global Windows default through mounted Settings, stopped gracefully, and the branch reopened the same profile retaining B’s path and preference without reseeding. The nine accepted appearance captures cover seven desktop screens and two shipping native tablet drawers; no phone-native picker pass is claimed.W1 passed with real Claude: the shipping New workspace flow selected B, launched in WSL, delivered the exact literal Note and real issue link, and received the expected reply. W3 passed after repairing only the isolated guest Claude config path: ordinary History found a real conversation, exactly one Resume reopened its same UUID/cwd/WSL runtime, and a real continuation recalled prior output and the issue URL without either answer being supplied again. Receiver bytes, action count and whole-window screenshots were independently verified. No transcript was moved or force-indexed.
W2’s configured run passed this PR’s delivery boundary: after disabling startup update checks only in both isolated QA Codex configs, one Create delivered the actual Note draft and one ordinary submission wrote its complete first user field into real Codex 0.163.0’s JSONL in B’s intended
orca-qaWSL worktree. The shipping first-user-prompt parser returned exactly 95 UTF-8 bytes with SHA-256625035de773c67003b14c8004fce59156b90bfb537d26876b3ecc49d8f8a6d8e, preserving the apostrophe, quotes, literal$HOMEand linked issue. Root independently decoded and verified that receipt. No replacement prompt, new capture channel or manual prompt paste was used. The provider returned 503 because its route lacked an account supportinggpt-5.4; no Codex reply is claimed. The coordinator explicitly accepted delivery as this PR flow’s endpoint and authorized only normal same-conversation model recovery, with no new turn/Create or provider/key change. Normal/modelselection changed only the same conversation to the QA-supportedgpt-6.1-sol, and both isolated QA configs now use that model for future runs. No normal same-turn retry was established, so no new user field, retry or reply was invented. The copy stopped gracefully, with zero owned survivors, CDP clear, idle distro never started and real config hashes unchanged; all drivers, operators and nested workers ended. Root independently verified all 57 archive entries and released ticket 2519.Two earlier W2 delivery failures remain retained: attempt 1 showed an empty composer and unsent-note toast; attempt 2 showed the startup update menu, then an empty composer after normal Escape, without a second toast. Both submitted zero prompts. Source comparison found an inherited delivery mechanism and no PR-specific bypass, but the immediate cause is unknown and no live-main causal reproduction is claimed. STA-12255, parented to STA-10541, tracks them separately. The configured pass does not prove their cause or claim to fix them. A driver also missed Advanced before the configured Create; it stopped with zero Creates, then corrected only that setup step in the existing composer. W1 and W3 were not rerun; total History Resume remains one.
08577327: CI31 green, 53 successful checks and 14 selected skipsReview
The current-main conservative shipped accounting is +2,221/−844 gross, 77 existing moved lines, 2,144 adjusted additions and net +1,377; runtime remains 0/40. Tests and support are conservatively +5,980/−1,223; the raw current-main diff is +5,962/−1,205, with 18 additions/deletions retained as conservative charges across natural diff cancellation; locales are +1/−15. Mechanical integration remains inside the approved 2,230 gross ceiling. No new move credit or reclassification was used; deletions do not offset gross additions. The established support bridge (+84/−51) and conservative support charges (+7/−6) remain unchanged.
The repair adds optional transient list intent and per-row ownership plus a Store-backed source getter, with no discovery protocol changes or new saved ownership. Missing metadata retains the existing fallback; explicit unknown ownership never guesses; malformed optional metadata never removes a transcript row. Updated canonical search selects ownership before candidate limits and conversation folding. Older peers retain their existing search behavior.
The common pattern distinguishes local projects by their folder. Automatic grouping across machines is retained here. No new controls or layout are introduced.
Agent skill upstream boundary
Checklist
08577327: CI31 green with no pending or failed checksAuthor: @BrennanKB5