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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

@saphidsaphid 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-actionsgithub-actionsBot 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

coderabbitaiBot 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 threadapps/swift-ios/App/NativeWorkspaceMapper.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

macroscopeappBot 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 threadapps/swift-ios/App/NativeFeatureClient.swift
@saphid

Copy link
Copy Markdown
ContributorAuthor

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[bot]
t3-codeBot approved these changes Aug 12, 2026

@t3-codet3-codeBot 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-codet3-codeBot 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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the saphid/swiftui-cached-status-v2 branch from c7e7dbd to 3a20582CompareAugust 13, 2026 15:43
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 13, 2026
Comment threadapps/server/src/vcs/VcsStatusBroadcaster.ts
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/WorkspaceView.swift Outdated

@cursorcursorBot 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 threadapps/swift-ios/Features/Workspace/DailyUXModels.swift Outdated
@saphid

Copy link
Copy Markdown
ContributorAuthor

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

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

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@saphid