Skip to content

🧪 Harden Swift beta tester readiness - #2627

Open
andrew-bierman wants to merge 80 commits into
developmentfrom
codex/swift-beta-tester-readiness
Open

🧪 Harden Swift beta tester readiness#2627
andrew-bierman wants to merge 80 commits into
developmentfrom
codex/swift-beta-tester-readiness

Conversation

@andrew-bierman

@andrew-bierman andrew-bierman commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Fix Swift local-first loading states so empty local caches do not leave Packs/Trips stuck in loading or misleading connection states.
  • Harden iOS, iPad, and macOS screenshot capture for full-screen, modal, menu, offline, guest, auth, and data review states.
  • Add stable Swift E2E package aliases for iOS and macOS smoke/full plans.
  • Align Swift beta versioning with Expo by moving the Swift/TestFlight line to 2.1.0 with build 2026072101, and force MARKETING_VERSION during replacement archive flows.
  • Fix searched-location Weather results in Swift by falling back from id-based forecast lookup to by-name forecast lookup when needed.
  • Restore native back navigation when Assistant is opened from Home while keeping the primary Assistant tab as a root destination.
  • Replace the unbalanced Gear Inventory sort control with an explicit accessible menu.
  • Apply the saved Celsius/Fahrenheit preference consistently to current, feels-like, forecast-high, and forecast-low temperatures, including alternate-field conversion fallbacks.

Fixes #2636
Fixes #2640
Fixes #2641
Fixes #2642

Validation

  • Previous head 6b167e190: all 26 completed GitHub checks passed, with no pending or failing checks
  • Current head cc2bc691e: all 26 completed GitHub checks passed, with no pending or failing checks, after fixing scheduled Swift E2E to select the explicit dev API target instead of requiring the unconfigured SWIFT_E2E_API_BASE_URL secret
  • Scheduled Swift Visual Screenshots failure on main (run 30001819415) was traced to duplicate PackRatApp.init() declarations; commit 55796b21f on this PR consolidates them, and the prior head's Swift checks passed
  • The scheduled macOS E2E job remains queued because no matching self-hosted macOS / packrat-e2e runner is online; this is an operational prerequisite and was not hidden by weakening or skipping the job
  • GitHub Swift CI: PackRat-iOS (smoke), PackRat-macOS (smoke), and Swift scripts (vitest) passed
  • GitHub Swift E2E: iOS Swift UI E2E (Exploratory) passed
  • GitHub repo checks, API tests, builds, coverage, CodeQL, web E2E, and Android E2E passed
  • Web E2E attempt 1 timed out waiting for a deleted trip card to disappear; the failed-job rerun passed all tests without a code or assertion change
  • Android E2E attempt 1 hit a blank-app launch flake in the final invalid-login scenario; the failed-job rerun passed without a code change
  • Local TestFlight replacement preflight confirmed MARKETING_VERSION=2.1.0 and CURRENT_PROJECT_VERSION=2026072101
  • Local WeatherViewModel regression test passed for searched-location forecast fallback
  • Post-review XcodeBuildMCP simulator build passed for PackRat-iOS
  • All 5 focused WeatherTemperatureDisplayTests passed
  • The 3 new focused UI tests compile; local execution was explicitly skipped by the harness because PackRat E2E credentials are unavailable on this machine

Screenshot Catalog

  • artifacts/screenshots/ios-contact-sheet*.png
  • artifacts/screenshots/ipad-contact-sheet*.png
  • artifacts/screenshots/macos-contact-sheet*.png

Notes

  • Open issue [BUG] Inconsistent Card Height When Browsing Catalog From Pack Details #2593 remains a separate Expo/mobile catalog-card height bug from app version 2.0.28; it is not solved by this Swift beta-readiness PR.
  • CodeRabbit completed its current check, all 22 review threads are resolved or outdated, and the tester-fix commit received local correctness, standards, testing, adversarial, and Swift-specific review before push.

@github-actions github-actions Bot added the dependencies Pull requests that update a dependency file label Jul 15, 2026
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The changes update Swift app behavior, cross-platform UI tests, E2E runners and screenshot tooling, local API stubs, OAuth metadata routing, CI workflows, and platform release assets.

Changes

Swift application behavior

Layer / File(s) Summary
Cache, persistence, and platform UI
apps/swift/Sources/PackRat/..., apps/swift/Sources/PackRatWatch/...
Cache completion, storage initialization, authentication gates, layouts, catalog placeholders, and watch presentation are updated.
Accessibility and Swift test coverage
apps/swift/Tests/PackRatUITests/..., apps/swift/Tests/PackRatTests/...
Accessibility identifiers, platform-aware navigation, deterministic assertions, category selection, and offline AI coverage are expanded.
Visual screenshot pipeline
apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift, apps/swift/scripts/capture-visual-screenshots.ts
Screenshot interaction, guest-limit coverage, simulator provisioning, watch routes, rendering fallback, notification cleanup, and run-summary reuse are revised.

E2E, API, and platform tooling

Layer / File(s) Summary
E2E runner and workflow targets
apps/swift/scripts/..., package.json, .github/workflows/..., docs/testing.md
Plan parsing, local API lifecycle, feature-flag profiles, simulator targeting, workflow inputs, and visual-platform documentation are updated.
Deterministic API E2E routes
packages/api/src/routes/..., packages/api/src/services/..., packages/api/scripts/e2e-local-start.ts
Local deterministic implementations and tests are added for catalog, guides, season suggestions, weather, chat, and embeddings.
OAuth metadata routing
packages/api/src/e2e-worker.ts, packages/api/src/index.ts, packages/api/src/__tests__/...
Well-known OAuth/OpenID requests now receive normalized-environment metadata responses with CORS coverage.

Platform assets and validation

Layer / File(s) Summary
Release metadata and asset wiring
apps/swift/Resources/..., apps/swift/project.yml
Bundle names, versions, orientations, app icons, watch assets, and target resource configuration are updated.
Asset validation
apps/swift/scripts/lib/app-store-assets.ts, apps/swift/scripts/validate-app-store-assets.ts, apps/swift/scripts/__tests__/app-store-assets.test.ts
Fractional icon dimensions are parsed and both iOS and watchOS icon sets are validated.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels: mobile, api, documentation

Suggested reviewers: isthisanmol

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.92% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and clearly matches the PR’s main goal of hardening Swift beta readiness.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/swift-beta-tester-readiness

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.

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/units (./packages/units)

Status Category Percentage Covered / Total
🟢 Lines 100% (🎯 100%) 35 / 35
🟢 Statements 100% (🎯 100%) 35 / 35
🟢 Functions 100% (🎯 100%) 6 / 6
🟢 Branches 100% (🎯 100%) 11 / 11
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/overpass (./packages/overpass)

Status Category Percentage Covered / Total
🟢 Lines 100% (🎯 80%) 155 / 155
🟢 Statements 100% (🎯 80%) 155 / 155
🟢 Functions 100% (🎯 80%) 13 / 13
🟢 Branches 95.65% (🎯 70%) 44 / 46
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/utils (./packages/utils)

Status Category Percentage Covered / Total
🟢 Lines 100% (🎯 100%) 92 / 92
🟢 Statements 100% (🎯 100%) 92 / 92
🟢 Functions 100% (🎯 100%) 1 / 1
🟢 Branches 100% (🎯 100%) 1 / 1
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/analytics (./packages/analytics)

Status Category Percentage Covered / Total
🟢 Lines 100% (🎯 80%) 745 / 745
🟢 Statements 100% (🎯 80%) 745 / 745
🟢 Functions 100% (🎯 85%) 48 / 48
🟢 Branches 87.35% (🎯 80%) 152 / 174
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for apps/expo (./apps/expo)

Status Category Percentage Covered / Total
🟢 Lines 97.64% (🎯 95%) 623 / 638
🟢 Statements 97.64% (🎯 95%) 623 / 638
🟢 Functions 100% (🎯 97%) 52 / 52
🟢 Branches 95.19% (🎯 92%) 218 / 229
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/mcp (./packages/mcp)

Status Category Percentage Covered / Total
🟢 Lines 99.41% (🎯 80%) 4234 / 4259
🟢 Statements 99.41% (🎯 80%) 4234 / 4259
🟢 Functions 100% (🎯 80%) 101 / 101
🟢 Branches 98.67% (🎯 80%) 597 / 605
File CoverageNo changed files found.
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Coverage Report for packages/api (./packages/api)

Status Category Percentage Covered / Total
🟢 Lines 99.01% (🎯 95%) 1906 / 1925
🟢 Statements 99.01% (🎯 95%) 1906 / 1925
🟢 Functions 100% (🎯 97%) 100 / 100
🟢 Branches 97.08% (🎯 92%) 665 / 685
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/api/src/auth/consent-route.ts 90.54% 94.11% 100% 90.54% 50-56
packages/api/src/auth/mcp-token.ts 100% 88.88% 100% 100%
packages/api/src/services/dbMetricsService.ts 100% 100% 100% 100%
packages/api/src/services/embeddingService.ts 100% 100% 100% 100%
packages/api/src/services/entitlementsService.ts 100% 100% 100% 100%
packages/api/src/services/featureAccessService.ts 98.47% 95.45% 100% 98.47% 106-107
packages/api/src/services/featureFlagsService.ts 100% 96.66% 100% 100%
packages/api/src/services/passwordResetService.ts 100% 100% 100% 100%
packages/api/src/services/userService.ts 100% 84.61% 100% 100%
packages/api/src/services/retention/invalidLogRetention.ts 100% 100% 100% 100%
packages/api/src/utils/compute-pack.ts 100% 100% 100% 100%
packages/api/src/utils/csv-utils.ts 97.73% 92.72% 100% 97.73% 136-137, 153-154, 175-176
packages/api/src/utils/embeddingHelper.ts 100% 98.68% 100% 100%
packages/api/src/utils/json-utils.ts 100% 100% 100% 100%
Generated in workflow #548 for commit 6e35ad4 by the Vitest Coverage Report Action

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

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

⚠️ Outside diff range comments (1)
apps/swift/scripts/capture-visual-screenshots.ts (1)

787-815: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Only auto-create after a successful device inventory.

A timeout, nonzero status, or JSON parse failure currently falls through to simulator creation. Transient inventory failures can therefore create duplicate persistent PackRat E2E iPad devices.

Proposed fix
   const result = spawnSync('xcrun', ['simctl', 'list', 'devices', 'available', '-j'], {
     encoding: 'utf8',
     timeout: 10_000,
     maxBuffer: 10 * 1024 * 1024,
   });
+  let inventorySucceeded = false;
   if (result.status === 0) {
     try {
       const parsed = safeJsonParse<{
         devices?: Record<string, Array<{ name?: string; udid?: string; isAvailable?: boolean }>>;
       }>(result.stdout, { strict: true });
+      inventorySucceeded = true;
       const availableDevices = Object.values(parsed.devices ?? {}).flat();
       // Existing selection logic...
     } catch {}
   }
-  if (createIfMissing) {
+  if (createIfMissing && inventorySucceeded) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/swift/scripts/capture-visual-screenshots.ts` around lines 787 - 815,
Update the simulator-selection flow around the xcrun inventory result and
safeJsonParse so createIOSSimulator is called only after a successful command
and valid JSON inventory. Track inventory success separately from whether a
preferred device was found, and gate the createIfMissing fallback on that
success; keep returning matching device UDIDs unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/swift/scripts/capture-visual-screenshots.ts`:
- Around line 1683-1687: Update the non-empty-file branch in the contact-sheet
render loop to await exitPromise and require an exit code of 0 before returning,
rather than relying only on the bounded wait. If Chrome does not exit cleanly,
use stopProcessGroup with SIGKILL before returning so cleanup cannot race with
the live process.

In `@apps/swift/scripts/lib/args.ts`:
- Around line 18-20: Update positional-mode handling where positionalMode.plan
is applied so unit and ios-unit do not overwrite an explicitly provided --plan
when they have no plan value; preserve the existing plan unless the mode defines
one, or reject the conflicting combination. Add regression coverage for both
argument orders using the positional-mode parsing logic and POSITIONAL_MODES
entries.

In `@apps/swift/Tests/PackRatUITests/HomeTileTests.swift`:
- Around line 101-106: Update the macOS branch of the destination assertion
helper to poll for both app.staticTexts[title] and app.navigationBars[title]
during the timeout, returning immediately when either exists. Preserve the
existing timeout as the overall deadline and return false when neither element
appears, while leaving the non-macOS behavior unchanged.

In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift`:
- Around line 588-598: In captureHomeAction, extract the repeated destination
verification, capture, and optional dismissal sequence into a nested
verifyAndCapture closure near the start of the function. Replace each duplicated
block with calls to this closure, preserving the existing destinationIdentifier
check, assertion message, capture(name), and dismissAfterCapture behavior.
- Around line 1368-1375: Cache container.buttons.allElementsBoundByIndex once
before the label loop, then reuse that collection when filtering for matching
buttons. Preserve the existing label/identifier matching and
hittable/existing-button selection behavior in the loop.

---

Outside diff comments:
In `@apps/swift/scripts/capture-visual-screenshots.ts`:
- Around line 787-815: Update the simulator-selection flow around the xcrun
inventory result and safeJsonParse so createIOSSimulator is called only after a
successful command and valid JSON inventory. Track inventory success separately
from whether a preferred device was found, and gate the createIfMissing fallback
on that success; keep returning matching device UDIDs unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ed8588dd-a468-4cdb-83c5-3d9fe6cc97f2

📥 Commits

Reviewing files that changed from the base of the PR and between eb124a0 and e1d6d07.

📒 Files selected for processing (13)
  • apps/swift/Sources/PackRat/Features/Packs/PacksListView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PacksViewModel.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripsListView.swift
  • apps/swift/Sources/PackRat/Features/Trips/TripsViewModel.swift
  • apps/swift/Sources/PackRat/PackRatApp.swift
  • apps/swift/Sources/PackRat/Persistence/PersistenceController.swift
  • apps/swift/Tests/PackRatUITests/HomeTileTests.swift
  • apps/swift/Tests/PackRatUITests/ScreenshotSmokeTests.swift
  • apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
  • apps/swift/scripts/__tests__/args.test.ts
  • apps/swift/scripts/capture-visual-screenshots.ts
  • apps/swift/scripts/lib/args.ts
  • package.json

Comment thread apps/swift/scripts/capture-visual-screenshots.ts
Comment thread apps/swift/scripts/lib/args.ts
Comment thread apps/swift/Tests/PackRatUITests/HomeTileTests.swift
Comment thread apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
Comment thread apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
@github-actions github-actions Bot added the ci/cd label Jul 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift (1)

1342-1350: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Push predicate matching to the query engine to avoid excessive IPC overhead.

Although caching allElementsBoundByIndex avoids re-fetching the array of proxy objects, evaluating .label and .identifier on each proxy still triggers cross-process IPC calls back to the target app on every loop iteration. For UI tests with many buttons, this causes significant lag.

Evaluate the properties directly in the target app process using an NSPredicate to retrieve only the matching elements.

⚡ Proposed refactor
         `#if` os(macOS)
-        let allButtons = container.buttons.allElementsBoundByIndex
         for label in ["Remind Me Later", "Not Now", "Continue", "OK", "Allow", "Dismiss", "Close"] {
-            let matchingButtons = allButtons
-                .filter { $0.label == label || $0.identifier == label }
+            let query = container.buttons.matching(NSPredicate(format: "label == %@ OR identifier == %@", label, label))
+            let matchingButtons = query.allElementsBoundByIndex
             if let button = matchingButtons.first(where: { $0.exists && $0.isHittable }) ?? matchingButtons.first(where: { $0.exists }) {
                 button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).click()
                 return true
             }
         }
         `#endif`
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift` around lines
1342 - 1350, Update the button lookup in the screenshot test to use an
NSPredicate against the UI query engine, matching each candidate label or
identifier directly in the target app process. Preserve the existing label
priority, existence/hittability preference, coordinate click, and early return
behavior while eliminating per-proxy .label and .identifier access in the loop.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift`:
- Around line 1342-1350: Update the button lookup in the screenshot test to use
an NSPredicate against the UI query engine, matching each candidate label or
identifier directly in the target app process. Preserve the existing label
priority, existence/hittability preference, coordinate click, and early return
behavior while eliminating per-proxy .label and .identifier access in the loop.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4b6665c7-ead8-4268-9b51-d8b869cf7d12

📥 Commits

Reviewing files that changed from the base of the PR and between e1d6d07 and 1431139.

📒 Files selected for processing (6)
  • .github/workflows/swift-ci.yml
  • apps/swift/Tests/PackRatUITests/HomeTileTests.swift
  • apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
  • apps/swift/scripts/__tests__/args.test.ts
  • apps/swift/scripts/capture-visual-screenshots.ts
  • apps/swift/scripts/lib/args.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@apps/swift/project.yml`:
- Around line 173-174: Remove AppIcon-watch-marketing-1024.png from the
postbuildScripts loop in apps/swift/project.yml:173-174, including the preceding
line’s trailing backslash; remove the same entry from the CFBundleIconFiles list
in apps/swift/project.yml:197-198 and from the CFBundleIconFiles array in
apps/swift/Resources/Info-watchOS.plist:26-28. Keep the remaining watchOS icon
entries unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ffb6552d-bb0c-4bce-8c16-3f7fd159c2d8

📥 Commits

Reviewing files that changed from the base of the PR and between c3a42f0 and 9d1e58a.

⛔ Files ignored due to path filters (32)
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-83.5@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-20@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-20@3x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@3x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@3x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@3x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-launcher-40@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-launcher-44@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-launcher-50@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-longlook-44x44@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-longlook-50x50@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-marketing-1024.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-notification-24@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-notification-27.5@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-quicklook-108@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-quicklook-44@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-quicklook-50@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-quicklook-86@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-quicklook-98@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-settings-29@2x.png is excluded by !**/*.png
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-watch-settings-29@3x.png is excluded by !**/*.png
📒 Files selected for processing (7)
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
  • apps/swift/Resources/Info-iOS.plist
  • apps/swift/Resources/Info-macOS.plist
  • apps/swift/Resources/Info-watchOS.plist
  • apps/swift/project.yml
  • apps/swift/scripts/__tests__/app-store-assets.test.ts
  • apps/swift/scripts/lib/app-store-assets.ts

Comment thread apps/swift/project.yml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 16

Caution

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

⚠️ Outside diff range comments (2)
packages/api/src/routes/seasonSuggestions.ts (1)

136-137: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Handle Workers AI SDK errors gracefully.

As per path instructions, Workers AI / Vercel AI SDK calls should handle rate-limit and upstream errors gracefully. The generateObject call immediately following this setup (line 145) lacks a try/catch block and a captureApiException call to safely handle and log these upstream errors.

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

In `@packages/api/src/routes/seasonSuggestions.ts` around lines 136 - 137, Wrap
the generateObject call following createAIProvider in a try/catch, and invoke
captureApiException in the catch handler to safely log and handle Workers
AI/Vercel AI SDK rate-limit and upstream errors. Preserve the existing
successful generation flow and return behavior.

Source: Path instructions

apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift (1)

1280-1299: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Use the runner’s PackRat credential environment consistently.

Unlike AppUITestCase, this launch ignores PACKRAT_E2E_EMAIL and PACKRAT_E2E_USER_ID. When the runner supplies those values without a precomputed token, the token is derived from fallback credentials and may not authenticate against the configured local API.

Proposed fix
-        let email = (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String)
+        let email = ProcessInfo.processInfo.environment["PACKRAT_E2E_EMAIL"]
+            ?? (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_EMAIL") as? String)
             ?? "e2e@packrat.test"
-        let userId = ProcessInfo.processInfo.environment["E2E_TEST_USER_ID"]
+        let userId = ProcessInfo.processInfo.environment["PACKRAT_E2E_USER_ID"]
+            ?? ProcessInfo.processInfo.environment["E2E_TEST_USER_ID"]
             ?? (bundle.object(forInfoDictionaryKey: "PACKRAT_E2E_USER_ID") as? String)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift` around lines
1280 - 1299, Update the credential resolution in the visual screenshot launch
setup to use the runner’s PackRat credential environment consistently, matching
AppUITestCase rather than relying on bundle keys or fallback values. Ensure
PACKRAT_E2E_EMAIL and PACKRAT_E2E_USER_ID from the process environment are used
when deriving visualE2ESessionToken, while preserving the existing
launchEnvironment assignments.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/swift-e2e.yml:
- Around line 127-128: Update both credential validation blocks in
.github/workflows/swift-e2e.yml at lines 127-128 and 255-256 to skip E2E_EMAIL
and E2E_PASSWORD checks for local macOS and iOS runs, while retaining validation
for non-local runs so the local API lifecycle can provide credentials.

In @.github/workflows/swift-visual.yml:
- Around line 119-125: Update the “Boot iOS simulator” step’s if condition so it
runs only when github.event.inputs.platform is ios, all, or both. Exclude ipad,
watch, and macos while preserving the existing default-to-all behavior.

In `@apps/swift/scripts/capture-visual-screenshots.ts`:
- Around line 927-931: Update the screenshot capture flows around
injectVisualSchemeEnvironment and the referenced credential-injection blocks to
avoid modifying tracked Xcode schemes with E2E credentials. Use a temporary
scheme/project copy for each run, or capture and exactly restore the original
scheme content in guaranteed cleanup, including failure paths; preserve the
existing screenshot behavior while ensuring no credentials remain persisted.

In `@apps/swift/scripts/lib/e2e-api.ts`:
- Around line 93-103: Handle child-process spawn failures at all three sites: in
apps/swift/scripts/lib/e2e-api.ts lines 93-103, attach an error handler to the
child used by waitForHealthy and reject that flow; in
apps/swift/scripts/run-e2e.ts lines 290-303 and
apps/swift/scripts/run-e2e-macos.ts lines 296-309, update the xcodebuild promise
to reject on the child process error event, while preserving existing exit
handling.

In `@apps/swift/scripts/run-e2e.ts`:
- Around line 119-126: Update the session-token derivation in
apps/swift/scripts/run-e2e.ts lines 119-126 to use BETTER_AUTH_SECRET for the
secret, preserving the existing fallback only if required by the API contract.
In apps/swift/scripts/run-e2e-macos.ts lines 137-144, remove PACKRAT_AUTH_SECRET
precedence so both scripts derive tokens identically to the API contract.
- Around line 97-98: Wrap the complete lifecycle after acquiring localAPI in
run-e2e.ts around ensureLocalE2EAPI with a try/finally, ensuring cleanup
executes for every subsequent path. Apply the same boundary and cleanup behavior
in run-e2e-macos.ts immediately after its localAPI acquisition.

In `@apps/swift/Sources/PackRat/Services/CatalogService.swift`:
- Around line 23-26: Update the catalog search flow around CatalogSearchResponse
so the endpoint request is performed only once. Fetch the response payload once,
then decode it in memory as either the wrapped CatalogSearchResponse or an
unwrapped [CatalogItem] array, while propagating network errors without retrying
the request.

In `@apps/swift/Tests/PackRatTests/OfflineAITests.swift`:
- Around line 270-271: Update the test setup around Defaults[.useRealLocalLLM]
to capture its original value before forcing it to true, then restore that
captured value in the defer block instead of always assigning false. Keep the
test’s existing behavior while preventing shared preference state from affecting
later tests.

In `@apps/swift/Tests/PackRatUITests/AppUITestCase.swift`:
- Around line 332-343: Update tapTabBarButton to perform only one coordinate tap
for valid element frames, then wait deterministically for the destination
landmark instead of sleeping and tapping again. Preserve the existing fallback
element.tap() behavior for zero-sized frames, and replace the fixed Thread.sleep
delay with the test’s established landmark-wait mechanism.

In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift`:
- Around line 791-794: Ensure guest-limit content is validated before
screenshots are captured: in captureGuestLimitedTab, perform
assertExpectedAccountRequiredState before captureTab, and at
apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift lines 932-946 move
each account-required assertion before its corresponding capture. Preserve the
existing navigation and assertion targets.

In `@packages/api/scripts/e2e-local-start.ts`:
- Around line 34-42: Update the command execution flow around child.exited so
captured stdout and stderr are emitted before handling a nonzero exit code.
Preserve the existing output behavior for successful commands, then throw the
exit error while retaining the captured diagnostics for failures.

In `@packages/api/src/e2e-worker.ts`:
- Around line 43-53: The E2E worker’s well-known metadata branch lacks the
production CORS behavior for metadata and preflight requests. Update the GET
handling around wellKnownMetadataKind and the related OPTIONS/appBase.fetch path
in the worker entrypoint to mirror index.ts, applying the established well-known
CORS headers and preflight response behavior; add an Origin-based test covering
metadata and OPTIONS requests.

In `@packages/api/src/index.ts`:
- Around line 162-185: Fix mounted OpenID discovery classification in
wellKnownMetadataPath and wellKnownMetadataKind so
/api/auth/.well-known/openid-configuration is recognized while preserving
unmounted and authorization-server routes. Apply the corresponding routing
update in packages/api/src/e2e-worker.ts at lines 21-35, and add mounted OpenID
URL coverage in packages/api/src/__tests__/auth-cors.test.ts lines 153-178 and
packages/api/src/__tests__/e2e-worker-env.test.ts lines 88-105.

In `@packages/api/src/routes/catalog/index.ts`:
- Around line 41-47: Extract the duplicated local E2E environment detection from
isLocalE2ECatalogEnv into the shared env-validation utility, exposing a reusable
predicate for the OPENAI_API_KEY and local NEON_DATABASE_URL checks. Update this
route and the corresponding checks in guides/index.ts and seasonSuggestions.ts
to use the shared utility, preserving the existing detection behavior.
- Around line 176-201: Use captureApiException from `@packrat/api/utils/sentry` in
the catch blocks for the /catalog/vector-search route in
packages/api/src/routes/catalog/index.ts (lines 176-201), and the GET /guides
(109-126), GET /guides/categories (225-231), GET /guides/search (292-315), and
GET /guides/:id (411-416) handlers in packages/api/src/routes/guides/index.ts;
replace or augment existing console.error-only handling while preserving each
route’s existing response behavior.

In `@packages/api/src/routes/weather.ts`:
- Around line 20-155: Move the weather E2E fixture symbols from the route module
into a dedicated service under src/services/, including stub location matching
and forecast construction helpers such as getStubLocation, searchStubLocations,
buildStubForecast, buildStubCurrent, and buildStubForecastDay. Keep the route
responsible only for detecting stub mode and delegating to the service,
preserving the existing stub responses and behavior.

---

Outside diff comments:
In `@apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift`:
- Around line 1280-1299: Update the credential resolution in the visual
screenshot launch setup to use the runner’s PackRat credential environment
consistently, matching AppUITestCase rather than relying on bundle keys or
fallback values. Ensure PACKRAT_E2E_EMAIL and PACKRAT_E2E_USER_ID from the
process environment are used when deriving visualE2ESessionToken, while
preserving the existing launchEnvironment assignments.

In `@packages/api/src/routes/seasonSuggestions.ts`:
- Around line 136-137: Wrap the generateObject call following createAIProvider
in a try/catch, and invoke captureApiException in the catch handler to safely
log and handle Workers AI/Vercel AI SDK rate-limit and upstream errors. Preserve
the existing successful generation flow and return behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a89a0c2d-ab43-4d64-9859-1992a441c53d

📥 Commits

Reviewing files that changed from the base of the PR and between 9d1e58a and e6b178f.

⛔ Files ignored due to path filters (11)
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-launcher-40@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-launcher-44@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-launcher-50@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-marketing-1024.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-notification-24@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-notification-27.5@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-quicklook-108@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-quicklook-86@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-quicklook-98@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-settings-29@2x.png is excluded by !**/*.png
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/AppIcon-watch-settings-29@3x.png is excluded by !**/*.png
📒 Files selected for processing (68)
  • .github/workflows/swift-e2e.yml
  • .github/workflows/swift-visual.yml
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
  • apps/swift/Resources/Info-watchOS.plist
  • apps/swift/Resources/WatchAssets.xcassets/Contents.json
  • apps/swift/Resources/WatchAssets.xcassets/WatchAppIcon.appiconset/Contents.json
  • apps/swift/Sources/PackRat/Features/Catalog/CatalogItemDetailView.swift
  • apps/swift/Sources/PackRat/Features/Catalog/CatalogView.swift
  • apps/swift/Sources/PackRat/Features/Chat/ChatView.swift
  • apps/swift/Sources/PackRat/Features/Chat/ChatViewModel.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/FeatureFlag.swift
  • apps/swift/Sources/PackRat/Features/OfflineAI/OfflineAIView.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplateFormView.swift
  • apps/swift/Sources/PackRat/Features/PackTemplates/PackTemplatesView.swift
  • apps/swift/Sources/PackRat/Features/Packs/PackItemDetailView.swift
  • apps/swift/Sources/PackRat/Features/SeasonSuggestions/SeasonSuggestionsView.swift
  • apps/swift/Sources/PackRat/Features/TrailConditions/TrailConditionsView.swift
  • apps/swift/Sources/PackRat/Features/Weather/WeatherView.swift
  • apps/swift/Sources/PackRat/Navigation/AppNavigation.swift
  • apps/swift/Sources/PackRat/Network/AuthManager.swift
  • apps/swift/Sources/PackRat/Services/CatalogService.swift
  • apps/swift/Sources/PackRat/Shared/FormSheetSizing.swift
  • apps/swift/Sources/PackRat/Shared/VisualSampleData.swift
  • apps/swift/Sources/PackRatWatch/PackRatWatchApp.swift
  • apps/swift/Tests/PackRatMacUITests/MacHomeFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacNavigationTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacPackTripTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSecondaryFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSmokeTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacUITestCase.swift
  • apps/swift/Tests/PackRatMacUITests/MacWeatherTests.swift
  • apps/swift/Tests/PackRatTests/OfflineAITests.swift
  • apps/swift/Tests/PackRatUITests/AppUITestCase.swift
  • apps/swift/Tests/PackRatUITests/AuthTests.swift
  • apps/swift/Tests/PackRatUITests/ChatMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/ChatTests.swift
  • apps/swift/Tests/PackRatUITests/HomeTileTests.swift
  • apps/swift/Tests/PackRatUITests/PackMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/PackSubFlowMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/PackTemplateTests.swift
  • apps/swift/Tests/PackRatUITests/PackTests.swift
  • apps/swift/Tests/PackRatUITests/ScreenshotSmokeTests.swift
  • apps/swift/Tests/PackRatUITests/SeasonSuggestionsMacOSTests.swift
  • apps/swift/Tests/PackRatUITests/SeasonSuggestionsTests.swift
  • apps/swift/Tests/PackRatUITests/VisualScreenshotTests.swift
  • apps/swift/project.yml
  • apps/swift/scripts/capture-visual-screenshots.ts
  • apps/swift/scripts/generate-swift-config.ts
  • apps/swift/scripts/lib/e2e-api.ts
  • apps/swift/scripts/run-e2e-macos.ts
  • apps/swift/scripts/run-e2e.ts
  • apps/swift/scripts/validate-app-store-assets.ts
  • docs/testing.md
  • package.json
  • packages/api/scripts/e2e-local-start.ts
  • packages/api/src/__tests__/auth-cors.test.ts
  • packages/api/src/__tests__/e2e-worker-env.test.ts
  • packages/api/src/e2e-worker.ts
  • packages/api/src/index.ts
  • packages/api/src/routes/__tests__/chat-e2e-stub.test.ts
  • packages/api/src/routes/__tests__/weather-e2e-stub.test.ts
  • packages/api/src/routes/catalog/index.ts
  • packages/api/src/routes/chat.ts
  • packages/api/src/routes/guides/index.ts
  • packages/api/src/routes/seasonSuggestions.ts
  • packages/api/src/routes/weather.ts
  • packages/api/src/services/__tests__/embeddingService.test.ts
  • packages/api/src/services/embeddingService.ts
💤 Files with no reviewable changes (8)
  • apps/swift/Tests/PackRatMacUITests/MacNavigationTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSmokeTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacWeatherTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacSecondaryFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacHomeFeatureTests.swift
  • apps/swift/Tests/PackRatMacUITests/MacPackTripTests.swift
  • apps/swift/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
  • apps/swift/Tests/PackRatMacUITests/MacUITestCase.swift

Comment thread .github/workflows/swift-e2e.yml Outdated
Comment thread .github/workflows/swift-visual.yml
Comment thread apps/swift/scripts/capture-visual-screenshots.ts Outdated
Comment thread apps/swift/scripts/lib/e2e-api.ts Outdated
Comment thread apps/swift/scripts/run-e2e.ts
Comment thread packages/api/src/e2e-worker.ts
Comment thread packages/api/src/index.ts
Comment thread packages/api/src/routes/catalog/index.ts
Comment thread packages/api/src/routes/catalog/index.ts
Comment thread packages/api/src/routes/weather.ts Outdated
@github-actions github-actions Bot added documentation Improvements or additions to documentation api labels Jul 18, 2026
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Deploying packrat-guides with  Cloudflare Pages  Cloudflare Pages

Latest commit: c0f223e
Status: ✅  Deploy successful!
Preview URL: https://4a098086.packrat-guides-6gq.pages.dev
Branch Preview URL: https://codex-swift-beta-tester-read.packrat-guides-6gq.pages.dev

View logs

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
packrat-admin c0f223e Commit Preview URL

Branch Preview URL
Jul 21 2026, 01:18 PM

@cloudflare-workers-and-pages

Copy link
Copy Markdown
Contributor

Deploying packrat-landing with  Cloudflare Pages  Cloudflare Pages

Latest commit: c0f223e
Status: ✅  Deploy successful!
Preview URL: https://c56818f3.packrat-landing.pages.dev
Branch Preview URL: https://codex-swift-beta-tester-read.packrat-landing.pages.dev

View logs

@andrew-bierman

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@andrew-bierman

andrew-bierman commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

Swift launch-readiness QA update from Codex:

  • Swift CI is green: Swift scripts, PackRat-iOS smoke, PackRat-macOS smoke.
  • Swift E2E is green: iOS Swift UI E2E exploratory passed.
  • API/check gates are green after fixes: root check-types, checks, api-tests, coverage/API, CodeQL, builds.
  • Local verification passed before push: root check-types, custom lint, API unit suite with 627 tests, Swift unit/smoke suites, Swift visual screenshot generation for iOS/macOS, and TestFlight preflight.
  • Screenshot artifacts on the QA machine:
    • artifacts/screenshots-ios-launch-readiness-20260807-020230/ios-contact-sheet.png
    • artifacts/screenshots-macos-launch-readiness-20260807-022316/macos-contact-sheet.png
  • Residual CI: Web E2E (Playwright) cancelled twice at its 30-minute workflow cap with no failure log; Android E2E (Maestro) cancelled at its 120-minute workflow cap. These are Expo/web/Android CI infrastructure/timeouts, not Swift app failures, and the user previously said not to block the Swift PR on Expo E2E in GitHub.

Net: Swift app path is green locally and in GitHub; remaining red status is non-Swift E2E timeout debt.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api ci/cd database dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation mobile

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant