Skip to content

fix(swift-ios): show cached source-control status immediately - #5975

Closed
saphid wants to merge 9 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:saphid/swiftui-cached-status-v2
Closed

fix(swift-ios): show cached source-control status immediately#5975
saphid wants to merge 9 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:saphid/swiftui-cached-status-v2

Conversation

@saphid

@saphid saphid commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Uses the VCS subscription snapshot for fast cached status, falls back to an explicit refresh on timeout/subscription failure, and preserves toolbar/pull-to-refresh semantics.

Verification

  • apps/swift-ios/Scripts/ci-test.sh — 219 tests passed
  • Fresh independent Claude Opus 5 high review completed; all actionable findings were addressed and the final repair review found no blockers.
  • Simulator visual evidence will be attached before marking this PR ready for review.

Scope

Targets the active native SwiftUI owner branch (#5178).

Note

Show cached source-control status immediately in iOS before falling back to a full refresh

  • NativeFeatureClient.sourceControlStatus now races a VCS status stream against a 2-second timeout, returning cached/streamed status immediately when available and falling back to a full refresh only on timeout or error.
  • VcsStatusBroadcaster gains a generation counter per working directory, semaphore-serialized cache transitions, and coherent snapshot reads (readCoherentStatus) to prevent pairing stale remote status with a new local ref.
  • applyGitStatusStreamState (new) replaces applyGitStatusStreamEvent as the client-side accumulator, enforcing generation ordering and clearing remote state on ref changes.
  • GitManager.localStatus now includes coherenceToken and remoteAssociationToken (SHA-256 hashes over HEAD OID and remote association), enabling the broadcaster to detect ref changes without a full status read.
  • FeatureSourceControlView distinguishes between initial load (sourceControlStatus) and explicit refresh (refreshSourceControlStatus), so pull-to-refresh and the toolbar button always force a fresh fetch.
  • Risk: generation-mismatched remote updates are silently discarded; pollers that stall behind a generation change will trigger an immediate re-fetch, increasing short-term remote status request volume.

Macroscope summarized 7a1008e.


Note

Medium Risk
Touches VCS cache coherency and concurrent refresh paths used by multiple clients; incorrect generation/token handling could show wrong ahead/behind or PR data, though coverage is heavy.

Overview
Adds generation-aware VCS status streaming so local and remote snapshots are not merged across branch/HEAD/remote changes, and wires fast cached source control on iOS on top of that stream.

Server: localStatus now exposes SHA-256 coherenceToken / remoteAssociationToken (HEAD, branch, upstream, normalized origin URL). VcsStatusBroadcaster tracks a per-repo generation, serializes cache updates, rejects stale remote writes, retries readCoherentStatus when identity shifts, and tags stream events with generation. HEAD-only moves can carry forward the last remote snapshot while forcing a remote refresh.

Clients: Contracts, shared reducers (applyGitStatusStreamState), and Swift decode the optional generation field. iOS sourceControlStatus waits up to 2s on the event stream via NativeSourceControlStatusAccumulator, then falls back to refreshSourceControlStatus; toolbar/pull-to-refresh use the explicit refresh path. Provider labels no longer fall back to a global provider list when the environment catalog is missing.

Reviewed by Cursor Bugbot for commit 7a1008e. Bugbot is set up for automated code reviews on this repo. Configure here.

Delivery: direct
Validated against Theo commit: f98cab5
Depends on: none
Merge order: this PR only
Validation status: Mergeable with runnable checks green; requested review changes remain. The unrelated Vercel authorization failure is a maintainer-side gate.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 10, 2026
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1155e51f-feda-4356-8129-e9b8430f52de

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

Comment thread apps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

saphid commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Integrated simulator verification completed after the focused cache tests and passing native CI. The home screen remained responsive while connected to the disposable backend and continued rendering the workspace/thread source-control summary.

Integrated home screen after cached-status verification

The cache refresh/fallback behavior itself is covered by the exact-head native tests so this proof does not rely on timing a transient network failure in a screenshot.

@saphid
saphid marked this pull request as ready for review August 10, 2026 09:27
@macroscopeapp

macroscopeapp Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new cache coherence system for VCS status with generation tracking across local/remote status. An unresolved review comment identifies a potential race condition where stale remote data from a previous branch could be paired with current local data after checkout. The scope and complexity of the caching logic changes, combined with the open correctness concern, warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Comment thread apps/swift-ios/App/NativeFeatureClient.swift
@saphid

saphid commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Additional integrated simulator proof on iOS 26.5: the home row resolved the real upstream PR from the cached source-control status and visibly rendered the green #5975 ↗ badge. The semantic UI value independently reported Pull request 5975, open.

Cached upstream PR badge on the home row

This follows the focused 221-test pass and the green native CI run.

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

reviewed cached source-control event accumulation, timeout/fallback behavior, cancellation propagation, and explicit refresh preservation. no blocking issues found.

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

independent review found a blocking coherence issue in the cached status path.

local: VCSLocalStatus,
remote: VCSRemoteStatus?
) -> FeatureSourceControlStatus? {
guard !local.hasPrimaryRemote || remote != nil else { return nil }

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.

a non-nil remote value is not necessarily coherent with this local ref. the server cache updates local status independently and retains the prior remote half, so after checkout the accumulator can combine branch B local data with branch A ahead/behind and PR data. this one-shot caller then returns and unsubscribes before remoteUpdated(B) arrives. tie remote data to a local ref/generation, await a coherent remote refresh after ref changes, or otherwise reject the stale pair; add a localUpdated(A→B) regression test.

@saphid

saphid commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the review findings and completed the deferred native verification on exact head 3a20582c4bc43bbbf3fac478b0932b22d28167ed.

Corrections include generation-safe publication, compare-and-swap protection, identity probing, explicit origin errors, remote association tokens, working-tree token handling, and valid observation macro mutation.

Verification:

  • 178 focused TypeScript tests passed
  • targeted lint, type, formatting, and Swift parse checks passed
  • focused native FeatureToolStateTests and WorkspaceContractTests: 26 passed, 0 failed
  • native result bundle: test_sim_2026-08-13T15-42-47-411Z_pid9862_21e5f4e8.xcresult
  • isolated DerivedData and one idle XCTest clone were removed; hygiene lease released

A prior direct Claude Opus 5 high review found seven actionable issues, all addressed in this head. A fresh review of the final head could not run because the Claude session quota remains exhausted until 04:50 AEST. No final-head independent review is claimed.

@saphid
saphid force-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582 Compare August 13, 2026 15:43
@github-actions github-actions Bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment thread apps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

saphid commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up for the hosted CI failures on exact head 5590d8c8d:

  • restored the legacy provider-catalog fallback used by snapshots without providersByEnvironment
  • added the required headOid: null to the unborn-repository server test fixture

Focused verification:

  • server typecheck passed
  • SourceControlRepositoryService.test.ts: 7 passed
  • HomeThreadMetadataTests: 5 passed
  • Swift parse and diff checks passed
  • native result bundle: test_sim_2026-08-13T15-50-30-445Z_pid9862_1ed6d520.xcresult
  • isolated Xcode cleanup completed

The Vercel marketing result is an authorization failure outside this PR's affected surface.

Comment thread apps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5590d8c. Configure here.

Comment thread apps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

saphid commented Aug 15, 2026

Copy link
Copy Markdown
Contributor Author

Closing this version while I rebuild the upstream contribution set from the latest base. Clean versions are coming soon.

@saphid saphid closed this Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant