Skip to content

Fix mobile sync project identity aliases#584

Merged
arul28 merged 4 commits into
mainfrom
ade/project-not-found-mobile-bug-d7dfdcea
Jun 16, 2026
Merged

Fix mobile sync project identity aliases#584
arul28 merged 4 commits into
mainfrom
ade/project-not-found-mobile-bug-d7dfdcea

Conversation

@arul28

@arul28 arul28 commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes mobile Work hydration failures when a paired phone sends the project DB id while the multi-project runtime is routing by the machine project registry id. The sync host now treats the runtime/catalog id and DB-local project id as aliases for the same open project.

What Changed

  • Adds project-id alias matching for sync host scope resolution, project-scoped commands, and lane presence.
  • Adds project_forget_request/result so mobile can remove a project from the project list like desktop recents.
  • Adds iOS local hiding for removed project rows by id and normalized root path, plus a long-press "Remove from list" action.
  • Updates sync/multi-device docs for alias handling and mobile project removal.

Validation

  • npm --prefix apps/desktop run typecheck
  • cd apps/desktop && npx vitest run src/main/services/sync/syncHostService.test.ts
  • npm --prefix apps/ade-cli run typecheck
  • npm --prefix apps/ade-cli run test
  • node scripts/validate-docs.mjs
  • XcodeBuildMCP targeted iOS test: ADETests/ADETests/testSyncServiceForgetProjectHidesCachedAndRemoteRowsByRoot
  • XcodeBuildMCP iOS simulator build for scheme ADE

Risks

Low. The alias behavior is scoped to the current host project id and explicit aliases; mobile project removal is local-first and still sends a runtime forget request when connected.

Summary by CodeRabbit

  • New Features

    • Users can now remove mobile sync projects from their project list.
    • Removed projects automatically remain hidden and won't reappear.
    • Added context menu option to remove projects from the list.
  • Tests

    • Added test coverage for project removal and hidden project management across desktop and iOS apps.

Greptile Summary

  • Adds project-id alias handling so mobile sync can resolve runtime/catalog ids and DB-local project ids for the same open project.
  • Adds project_forget_request/result support for removing projects from mobile project lists.
  • Updates iOS project hiding and long-press removal behavior for cached and remote rows.
  • Updates sync and multi-device documentation for alias handling and mobile project removal.

Confidence Score: 4/5

Mostly safe to merge after addressing the iOS host-switch catalog filtering issue.

The changes are focused and covered by targeted desktop, CLI, docs, and iOS validation, but one host-scoped state ordering issue can leave valid mobile projects hidden until another refresh.

apps/ios/ADE/Services/SyncService.swift

T-Rex T-Rex Logs

What T-Rex did

  • The CI environment is blocked from running Swift-based tests because there is no Swift toolchain available (swift, swiftc, or xcodebuild not found).
  • I compared test outcomes for the alias envelope before and after the change: before head there were 1 failing and 2 passing tests, after head all 3 tests pass. The before state showed the envelope returning {ok:false, code:"project_mismatch"}.
  • I grepped the codebase for project_forget references and found zero occurrences in the base worktree, while the head contains references at specific locations (brain handler, syncHostService, and type definitions), and the vitest run reports 34/34 tests passing, including the new project-id-alias test.
  • I ran the docs validation workflow and confirmed that validate-docs.mjs passes for 159 files both before and after the change, and I noted envelope names and alias resolution details across the repository documentation and codebase.

View all artifacts

T-Rex Ran code and verified through T-Rex

Comments Outside Diff (2)

  1. apps/desktop/src/main/main.ts, line 3590-3595 (link)

    P1 Alias not wired

    The alias fix is only wired through the CLI runtime path. Desktop still creates the shared phone sync service with just the DB-local projectId, so createSyncService never receives the registry/runtime id as runtimeProjectId and hostProjectIdAliases stays empty. In the desktop paired-phone path, a phone that sends the catalog/registry id can still get project_mismatch or project_not_open, which leaves the mobile hydration failure in place for this host path.

    Artifacts

    Repro: script exercising scope resolution with empty vs populated aliases

    • Contains supporting evidence from the run (text/typescript; charset=utf-8).

    Repro: execution output showing project_mismatch for desktop path

    • Keeps the command output available without making the summary code-heavy.

    View artifacts

    T-Rex Ran code and verified through T-Rex

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: apps/desktop/src/main/main.ts
    Line: 3590-3595
    
    Comment:
    **Alias not wired**
    
    The alias fix is only wired through the CLI runtime path. Desktop still creates the shared phone sync service with just the DB-local `projectId`, so `createSyncService` never receives the registry/runtime id as `runtimeProjectId` and `hostProjectIdAliases` stays empty. In the desktop paired-phone path, a phone that sends the catalog/registry id can still get `project_mismatch` or `project_not_open`, which leaves the mobile hydration failure in place for this host path.
    
    How can I resolve this? If you propose a fix, please make it concise.

    Fix in Claude Code

  2. apps/ios/ADE/Services/SyncService.swift, line 7312-7316 (link)

    P1 Reload hidden keys earlier

    This applies the hello project catalog before saveProfile(profile) switches activeHostProfile and reloads hiddenProjectKeys for the connected host. If the phone previously hid /tmp/foo on host A and then connects to host B whose hello payload includes /tmp/foo, this path filters host B's catalog using host A's hidden keys. saveProfile(profile) reloads the right host-scoped keys later, but the already-filtered catalog is not rebuilt, so host B's project can stay missing from Project Home until another catalog refresh. Reload the host-scoped hidden keys before applying the incoming catalog, or re-apply the catalog after switching profiles.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: apps/ios/ADE/Services/SyncService.swift
    Line: 7312-7316
    
    Comment:
    **Reload hidden keys earlier**
    
    This applies the hello project catalog before `saveProfile(profile)` switches `activeHostProfile` and reloads `hiddenProjectKeys` for the connected host. If the phone previously hid `/tmp/foo` on host A and then connects to host B whose hello payload includes `/tmp/foo`, this path filters host B's catalog using host A's hidden keys. `saveProfile(profile)` reloads the right host-scoped keys later, but the already-filtered catalog is not rebuilt, so host B's project can stay missing from Project Home until another catalog refresh. Reload the host-scoped hidden keys before applying the incoming catalog, or re-apply the catalog after switching profiles.
    
    How can I resolve this? If you propose a fix, please make it concise.

    Fix in Claude Code

Fix All in Claude Code

Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
apps/ios/ADE/Services/SyncService.swift:7312-7316
**Reload hidden keys earlier**

This applies the hello project catalog before `saveProfile(profile)` switches `activeHostProfile` and reloads `hiddenProjectKeys` for the connected host. If the phone previously hid `/tmp/foo` on host A and then connects to host B whose hello payload includes `/tmp/foo`, this path filters host B's catalog using host A's hidden keys. `saveProfile(profile)` reloads the right host-scoped keys later, but the already-filtered catalog is not rebuilt, so host B's project can stay missing from Project Home until another catalog refresh. Reload the host-scoped hidden keys before applying the incoming catalog, or re-apply the catalog after switching profiles.

Reviews (4): Last reviewed commit: "ship: address hidden project review feed..." | Re-trigger Greptile

@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
ade Ignored Ignored Preview Jun 16, 2026 8:31am

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a "forget project" capability across the full sync stack. New project_forget_request/result protocol types are introduced, the sync host gains project ID alias matching, dedicated forget handlers are implemented for the headless CLI and desktop main process, and the iOS client adds persistent hidden-project storage with a context menu UI action.

Changes

Project Forget Flow and Project ID Aliases

Layer / File(s) Summary
Sync protocol: forget payload and envelope types
apps/desktop/src/shared/types/sync.ts, apps/ios/ADE/Models/RemoteModels.swift
Adds SyncProjectForgetRequestPayload, SyncProjectForgetResultPayload, their envelope types, extends SyncEnvelope union, and adds MobileProjectForgetResultPayload on the Swift side.
Project ID alias matching in sync host service and wiring
apps/ade-cli/src/services/sync/syncHostService.ts, apps/ade-cli/src/services/sync/syncService.ts, apps/ade-cli/src/bootstrap.ts, apps/ade-cli/src/services/sync/syncHostService.test.ts, apps/desktop/src/main/services/sync/syncHostService.test.ts
Introduces projectIdMatchesHost helper, extends resolveSyncHostInboundProjectScope and SyncHostServiceArgs with alias support, updates command routing and presence guards to use alias-aware matching, and wires runtimeProjectId as a project ID alias through syncService and bootstrap. Tests verify alias-based scope resolution and command routing.
Forget handler in sync host service and brain handler
apps/ade-cli/src/services/sync/syncHostService.ts, apps/ade-cli/src/services/sync/brainProjectActionsSyncHandler.ts
Adds handleProjectForgetRequest in the host service that invokes projectCatalogProvider.forgetProject, returns project_forget_result, and broadcasts an updated project catalog on success. Wires the dispatcher and adds a parallel project_forget_request case in brainProjectActionsSyncHandler.
Headless CLI and desktop forget implementations
apps/ade-cli/src/cli.ts, apps/desktop/src/main/main.ts
CLI adds resolveHeadlessMobileProjectRequest helper, forgetHeadlessMobileProject (disposes scope, removes from registry), and wires it into the catalog provider. Desktop adds forgetMobileSyncProject (resolves root from state/contexts, updates recentProjects, defers closeProjectByPath, notifies renderer) and wires it into projectCatalogProvider.
iOS hidden projects persistence and forgetProject
apps/ios/ADE/Services/SyncService.swift
Adds hiddenProjectsKey UserDefaults storage, hiddenProjectKeys set, isProjectHidden, rememberHiddenProject/unhideProject helpers, and forgetProject(_:) method. Filters hidden projects from catalog merge paths, calls unhideProject on selection and project_forget_result, and extends the websocket handler to recognize the new message type.
iOS ContentView forget UI
apps/ios/ADE/App/ContentView.swift
ProjectHomeRow gains an onForget property; ProjectHomeView passes syncService.forgetProject(project) as the closure; a destructive "Remove from list" context menu item and accessibility action are added to each row.
Tests for forget and hidden projects
apps/ios/ADETests/ADETests.swift
Adds testSyncServiceForgetProjectHidesCachedAndRemoteRowsByRoot verifying hidden-project state after forgetProject; updates existing test to clear ade.sync.hiddenProjects before assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • arul28/ADE#579: Extends the same brainProjectActionsSyncHandler.ts and cli.ts plumbing by adding project-scoped WebSocket message handling infrastructure that this PR builds on to add project_forget_request/result.

Suggested labels

desktop, ios

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: enabling sync host to treat runtime/catalog ID and DB-local project ID as equivalent identities via project-ID alias matching.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ade/project-not-found-mobile-bug-d7dfdcea

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@arul28

arul28 commented Jun 16, 2026

Copy link
Copy Markdown
Owner Author

@copilot review but do not make fixes

@mintlify

mintlify Bot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
ade-ac1c6011 🟢 Ready View Preview Jun 16, 2026, 7:14 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

Comment thread apps/ios/ADE/Services/SyncService.swift
@arul28

arul28 commented Jun 16, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7161f7dcbc

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread apps/desktop/src/main/main.ts Outdated
Comment on lines +5132 to +5133
const closeTimer = setTimeout(() => {
void closeProjectContext(rootToClose).catch((error) => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Use the window-aware close path for forgotten projects

In the desktop main-process forget path, a paired phone can remove a project that is currently open in a desktop window; scheduling closeProjectContext directly disposes the DB/services and may clear activeProjectRoot, but it bypasses the closeProjectByPath bookkeeping that unbinds windowProjectRoots/tabs, emits project changes, and replaces the dormant context. In that scenario the window can remain bound to a disposed context (and active work can be torn down) after a "Remove from list" action; route this through the window-aware close path or avoid tearing down open contexts.

Useful? React with 👍 / 👎.

Comment thread apps/ade-cli/src/cli.ts
rootPath: requestedRootPath || null,
};
}
projectRegistry.remove(record.projectId);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Dispose headless project scopes when forgetting projects

In the headless ade serve provider, this only removes the registry row; any cached ProjectScope for the same project remains alive, and ProjectScopeRegistry.get() returns cached scopes before consulting the registry. If a phone removes the currently hosted project, it disappears from the catalog but its sync host and command handling can keep running until process restart; the existing projects.remove RPC path disposes the scope before removing the registry entry, and this path should do the same.

Useful? React with 👍 / 👎.

@arul28

arul28 commented Jun 16, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/ade-cli/src/bootstrap.ts (1)

1251-1256: ⚠️ Potential issue | 🔴 Critical

Desktop sync-service wiring is missing runtimeProjectId parameter.

The CLI now forwards runtimeProjectId: projectId (bootstrap.ts:1251-1256), but the desktop paired-phone construction at main.ts:3590 does not pass this parameter. Without it, catalog-ID clients will lack the alias context and fall into project_mismatch errors.

Add runtimeProjectId: projectId to the desktop createSyncService call at main.ts:3590 to mirror the CLI path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/ade-cli/src/bootstrap.ts` around lines 1251 - 1256, The desktop
paired-phone construction is missing the runtimeProjectId parameter when calling
createSyncService, while the CLI path correctly includes runtimeProjectId:
projectId. Add the runtimeProjectId: projectId parameter to the
createSyncService call in the desktop implementation to match the CLI wiring and
provide the necessary alias context for catalog-ID clients to avoid
project_mismatch errors.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/ade-cli/src/cli.ts`:
- Around line 13176-13177: The scopeRegistry.dispose(record.projectId) call is
being awaited immediately, which can close the host/peer before the
project_forget_result response is sent by the sync handler. Keep the
projectRegistry.remove(record.projectId) call synchronous and immediately after
it, defer the scopeRegistry.dispose(record.projectId) operation using
setImmediate or a similar mechanism to schedule it for execution after the
current event loop iteration completes, ensuring the response has time to be
queued before the scope is disposed.
- Around line 13148-13155: The current OR-based find logic in
projectRegistry.list().find() can select the wrong project when a request
carries conflicting projectId and rootPath parameters that point to different
records. Instead of using the OR condition, resolve projectId and rootPath
matches independently by performing separate find operations, then validate that
if both requestedId and requestedRootPath are provided (both have length > 0),
they must identify the same project record. If they identify different projects,
reject the operation. If they identify the same project or only one is provided,
use that matched record. This prevents stale or mobile-mixed payloads from
inadvertently operating on the wrong registered project.

In `@apps/ade-cli/src/services/sync/syncService.ts`:
- Around line 689-691: The `projectIdAliases` construction correctly populates
the alias array based on the `runtimeProjectId` parameter in the
`createSyncService` function, but the desktop socket-backed path does not pass
`runtimeProjectId` when invoking `createSyncService`, leaving `projectIdAliases`
empty. This causes phones to encounter project_mismatch errors when sending
runtime/catalog IDs. Ensure that the desktop socket-backed initialization passes
`runtimeProjectId: projectId` to the `createSyncService` call, matching the
pattern used in the CLI/headless initialization path.

In `@apps/desktop/src/main/main.ts`:
- Around line 5098-5110: The rootToForget determination logic does not validate
that requestedRoot and requestedProjectId refer to the same project when both
are provided. Before assigning to rootToForget, add a check: if both
requestedRoot and requestedProjectId are present, verify that the found recent
entry (or contextMatch) satisfies BOTH conditions simultaneously (not just one
or the other). If both identifiers are provided but they resolve to different
projects, return null to indicate an ambiguous request rather than silently
prioritizing one identifier over the other and potentially forgetting the wrong
project.

In `@apps/ios/ADE/Services/SyncService.swift`:
- Line 1579: The performInitialHydration method reads
database.listMobileProjects() directly without filtering hidden projects, while
refreshProjectCatalog() now applies hidden-project filtering using filter {
!isProjectHidden($0) }. This inconsistency allows forgotten cached projects to
be treated as selectable during initial hydration. Apply the same filter {
!isProjectHidden($0) } pattern to the database.listMobileProjects() call in
performInitialHydration to ensure hidden projects are consistently filtered
across both methods and prevent hidden cached projects from being restored as
active during reconnect or initial hydration scenarios.
- Around line 2257-2261: The unhideProject method only removes keys returned by
hiddenKeys(for:), but since rememberHiddenProject stores both id: and root:
prefixed keys for the same project, other aliases can remain hidden. Modify
unhideProject to subtract all key variants for the project: in addition to the
keys from hiddenKeys(for:), also remove any root: prefixed keys that match the
project's root identifier, ensuring all aliases are unhidden when opening the
same project through different identifiers.
- Around line 1540-1549: When forgetting the active project in the wasActive
block, add cleanup for project-scoped live state (chat/terminal subscriptions
and Work/terminal streams) after calling setActiveProjectId(nil), before calling
refreshActiveSessionsAndSnapshot(). This cleanup should mirror the same
operations performed during a project switch to ensure stale subscriptions from
the removed project are properly cleared rather than remaining active until a
subsequent reconnect.

---

Outside diff comments:
In `@apps/ade-cli/src/bootstrap.ts`:
- Around line 1251-1256: The desktop paired-phone construction is missing the
runtimeProjectId parameter when calling createSyncService, while the CLI path
correctly includes runtimeProjectId: projectId. Add the runtimeProjectId:
projectId parameter to the createSyncService call in the desktop implementation
to match the CLI wiring and provide the necessary alias context for catalog-ID
clients to avoid project_mismatch errors.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0d70ffc4-3708-4dec-99d9-5a5803429b02

📥 Commits

Reviewing files that changed from the base of the PR and between fab9df5 and fd325cb.

⛔ Files ignored due to path filters (2)
  • docs/features/sync-and-multi-device/README.md is excluded by !docs/**
  • docs/features/sync-and-multi-device/ios-companion.md is excluded by !docs/**
📒 Files selected for processing (13)
  • apps/ade-cli/src/bootstrap.ts
  • apps/ade-cli/src/cli.ts
  • apps/ade-cli/src/services/sync/brainProjectActionsSyncHandler.ts
  • apps/ade-cli/src/services/sync/syncHostService.test.ts
  • apps/ade-cli/src/services/sync/syncHostService.ts
  • apps/ade-cli/src/services/sync/syncService.ts
  • apps/desktop/src/main/main.ts
  • apps/desktop/src/main/services/sync/syncHostService.test.ts
  • apps/desktop/src/shared/types/sync.ts
  • apps/ios/ADE/App/ContentView.swift
  • apps/ios/ADE/Models/RemoteModels.swift
  • apps/ios/ADE/Services/SyncService.swift
  • apps/ios/ADETests/ADETests.swift

Comment thread apps/ade-cli/src/cli.ts Outdated
Comment thread apps/ade-cli/src/cli.ts Outdated
Comment thread apps/ade-cli/src/services/sync/syncService.ts
Comment thread apps/desktop/src/main/main.ts Outdated
Comment thread apps/ios/ADE/Services/SyncService.swift
Comment thread apps/ios/ADE/Services/SyncService.swift
Comment thread apps/ios/ADE/Services/SyncService.swift

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fd325cbe7a

ℹ️ About Codex in GitHub

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

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

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

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

Comment on lines +689 to +691
projectIdAliases: args.runtimeProjectId && args.runtimeProjectId !== args.projectId
? [args.runtimeProjectId]
: [],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Pass runtime aliases from every host caller

When the legacy desktop sync host is enabled (ADE_ENABLE_DESKTOP_SYNC_HOST=1), apps/desktop/src/main/main.ts still constructs createSyncService with only the DB-local projectId, so this new alias list remains empty. A phone whose active project id came from the machine catalog/runtime will continue sending that registry id on project-scoped command or changeset envelopes, and this host still rejects it as a project_mismatch instead of treating it as the same open project.

Useful? React with 👍 / 👎.

Comment on lines +2227 to +2232
if let id = normalizedProjectId(project.id) {
keys.insert("id:\(id)")
}
if let root = normalizedProjectRoot(project.rootPath) {
keys.insert("root:\(root)")
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Scope hidden project keys by host

When the phone is paired with multiple machines, these hidden keys are global to the app rather than tied to the active host profile. Removing /Users/.../ADE from one machine stores root:<path> and then applyRemoteProjectCatalog filters out any later catalog row from another paired machine with the same normalized path, so a valid project on that other host disappears until the user re-opens it through the add flow.

Useful? React with 👍 / 👎.

Comment thread apps/ios/ADE/Services/SyncService.swift
@arul28

arul28 commented Jun 16, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

Reviewed commit: f071b89815

ℹ️ About Codex in GitHub

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

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

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

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

@arul28 arul28 merged commit 895c908 into main Jun 16, 2026
27 checks passed
@arul28 arul28 deleted the ade/project-not-found-mobile-bug-d7dfdcea branch June 16, 2026 08:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant