fix(sync): tailor recovery guidance - #2507
Conversation
* chore: configure Paseo workspace workflows * fix: allow alertable in spell check * fix: scope mutation checks to pull request changes * test: align mobile tRPC mocks * test: align web tRPC mocks * fix: sync mobile Expo dependencies * docs: record CI incident findings
* docs: specify body fat percentage chart * docs: plan body fat percentage chart * feat: expose mobile body fat history * feat: add web body fat chart * feat: show body fat chart on web body page * feat: show body fat trend on mobile recovery * test: cover mobile recovery body fat response * test: type recovery body fat fixture * fix: close body fat chart review findings * fix: preserve body fat chart layout * fix: restore CI checks * test: strengthen processing mutations
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
LGTM! 🚀 Review Summary:
🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does. |
There was a problem hiding this comment.
Sorry @Asherlc, your pull request is larger than the review limit of 150000 diff characters
|
ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing |
Reviewer's GuideThis PR refines provider sync failure classification and recovery guidance, and adds end‑to‑end Hangboarding import, storage, and training UI across server, web, and mobile, along with a new body‑fat trend surface and several performance and robustness improvements for analytics and processing alerts. Sequence diagram for provider sync failure classification and recovery actionssequenceDiagram
participant Worker as processSyncJob
participant DB as processing_stage_event
participant Repo as ProcessingRepository
participant Meta as processingFailureGroups
participant Web as Web_ProcessingStatusWidget
participant Mobile as Mobile_ProcessingStatusWidget
Worker->>DB: appendProcessingStageEvent(authFailureReason)
Note over Worker,DB: errorCode = provider_auth_failed or provider_sync_failed
Repo->>DB: listScopedProcessingOperations
Repo->>Repo: buildProcessingAlert(failedEvent)
Note over Repo: action = reconnect when errorCode = provider_auth_failed
Note over Repo: action = retry_sync when errorCode = provider_sync_failed
Web->>Repo: alerts()
Repo-->>Web: ProcessingAlert{action,actionLabel,providerId}
Web->>Web: processingFailureGroups(input)
Web->>Web: render Reconnect or Retry button
Mobile->>Repo: alerts()
Repo-->>Mobile: ProcessingAlert{action,actionLabel,providerId}
Mobile->>Mobile: processingFailureGroups(input)
Mobile->>Mobile: render Reconnect or Retry button
Mobile->>Mobile: useRouter.push(/providers/providerId)
Web->>Web: Link to /providers/$id
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
📝 WalkthroughWalkthroughChangesProcessing failure handling
Hangboarding contracts
Mobile climbing presentation
Analytics test corrections
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant ProviderSyncJob
participant ProcessingRepository
participant ProcessingStatusWidget
ProviderSyncJob->>ProcessingRepository: store provider-specific failure event
ProcessingRepository-->>ProcessingStatusWidget: return latest errorCode and failure details
ProcessingStatusWidget->>ProcessingStatusWidget: render retry or reconnect action
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 1 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (1 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 28
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/web/src/routes/training/climbing.test.tsx (1)
165-174: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winTest both Hangboarding error states.
The route adds an initial-error state and a stale-data error panel for
hangboardingSummary. This suite only verifies query input and section presence. Add tests for an error with no data and an error with cached data.As per coding guidelines, “add tests for changed behavior.”
🤖 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/web/src/routes/training/climbing.test.tsx` around lines 165 - 174, Extend the climbing route tests around the Hangboarding section to cover both hangboardingSummary error states: an initial error with no data and a stale-data error with cached data. Mock the query responses appropriately, assert the initial error UI when no summary exists, and assert the stale-data error panel while preserving the cached Hangboarding content.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.superpowers/sdd/2026-08-10-hangboarding-import-and-ui/task-3-report.md:
- Around line 112-120: Add a ## Retrospective section to task-3-report.md
covering the one-sentence root cause, direct fix, justification for remaining
validation risk, and one concrete documentation or skill improvement. Link the
relevant existing entry in docs/production-incident-baseline.md, or add an
infrastructure-failure entry there if none applies.
In `@analytics/models/read_models/cycling_activity.sql.test.ts`:
- Around line 10-13: Add executable ClickHouse coverage in
analytics/models/read_models/cycling_activity.sql.test.ts for both empty and
non-empty modality values; the existing modelSql assertion is only static. Also
update analytics/models/read_models/sleep_heart_rate_sample.sql.test.ts to
execute ClickHouse behavior covering dirty-key filtering, user/date scoping, and
retention of samples across multiple days.
In `@docs/production-incident-baseline.md`:
- Line 23328: Insert one blank line immediately before the incident heading
beginning “2026-08-08 — Dependabot PRs…” in the markdown document, ensuring the
heading is surrounded by blank lines and conforms to MD022.
In `@docs/superpowers/plans/2026-08-08-activity-overview-partial-measurements.md`:
- Line 3: Remove the mandatory REQUIRED SUB-SKILL directive from the plan
header. Update the “For agentic workers” guidance to be optional, or incorporate
the necessary execution steps directly into the plan so the document stands
alone without relying on unavailable agent skills.
In `@docs/superpowers/plans/2026-08-08-processing-status-alerts.md`:
- Line 3: Update the plan’s “For agentic workers” instruction to remove
references to the external superpowers skills and replace them with
repository-local workflow guidance or a checked-in document, ensuring the
standalone documentation remains actionable without agent-skill dependencies.
- Line 18: Update the plan’s scope to acknowledge the implemented changes in
process-sync-job, including persistence of provider_auth_failed and
provider_sync_failed raw events. Revise the recovery-copy example around the
reconnect guidance to branch on errorCode, using reconnect instructions for
provider_auth_failed and retry-later guidance for provider_sync_failed.
In `@docs/superpowers/plans/2026-08-10-body-fat-chart.md`:
- Around line 114-119: Require explicit user or workflow approval immediately
before each git commit command in Step 8 at
docs/superpowers/plans/2026-08-10-body-fat-chart.md lines 114-119, the web-chart
commit at lines 184-189, the web-page commit at lines 229-234, and the mobile-ui
commit at lines 305-310; preserve the existing commit commands and messages.
In `@docs/superpowers/plans/2026-08-10-hangboarding-import-and-ui.md`:
- Around line 546-617: Update Task 5 to create and commit
HangboardingSummary.tsx with its test and story files, since strain.tsx is
required to render this component in that task. Remove those three files from
Task 7 and limit Task 7 to activity detail presentation.
In `@docs/superpowers/specs/2026-08-08-processing-status-alerts-design.md`:
- Around line 163-166: Update the testing-guidance link in the
migration/repository coverage section to use ../../testing.md so it resolves to
docs/testing.md; leave the surrounding testing guidance unchanged.
- Around line 184-189: Update the “Scope of implementation” section to include
the processing sync worker change in src/jobs/process-sync-job.ts, specifically
recording classified provider failure events, and remove or revise the statement
that no sync workers change. Keep the remaining scope unchanged.
In `@packages/mobile/app-tests/`(tabs)/strain.test.tsx:
- Around line 945-955: The StrainScreen test should preserve cached Hangboarding
content while also displaying background training refresh errors. Update the
test to expect a compact QueryStatePanel using trainingQuery.error and assert
that “Training refresh failed” is visible, while retaining the cached-data
assertion.
In `@packages/mobile/app/`(tabs)/strain.tsx:
- Around line 580-588: Add a visible “Hangboarding” heading in the
shouldShowClimbingSection fragment immediately before HangboardingSummary,
matching the web climbing page’s heading treatment and preserving the existing
component data and loading behavior.
In `@packages/mobile/app/activity/`[id].tsx:
- Around line 1051-1054: Split ActivityDetailScreen into focused modules so the
source file is under 1,000 lines. Extract a cohesive activity-detail section or
action flow, including its related styles such as hangboardingStyles, into a
separate module and update ActivityDetailScreen imports/usages without changing
behavior.
In `@packages/mobile/components/HangboardingDetail.stories.tsx`:
- Around line 43-50: Add an Empty story alongside Default, Loading, and
ErrorState in the HangboardingDetail stories, configuring its args to represent
absent details or an empty interval list while preserving the existing story
patterns.
In `@packages/mobile/components/HangboardingSummary.test.tsx`:
- Around line 97-101: Replace the nullable summary.latestSession spread in the
test fixture with a standalone non-nullable latestSession fixture containing all
required fields of HangboardingSummary.latestSession, then override planName and
boardName to null for this case. Keep the resulting object type-compatible with
HangboardingSummary.
In `@packages/mobile/lib/query-client.ts`:
- Around line 5-18: Update isTransientNetworkError and its QueryCache.onError
usage to classify failures by typed transport or cause identity, using the
current message regex only as a narrow native-network fallback so backend/tRPC
errors containing similar text still reach captureException(). Add tests
covering both a genuine transient transport error and a backend error with
“network request failed” in its message.
In `@packages/providers-meta/src/processing-status.test.ts`:
- Around line 205-220: Add a non-authentication operation fixture using the
existing processing-status test setup, with errorCode "provider_sync_failed",
and include its expected grouped result with requiresReconnect set to false.
Preserve the existing provider_auth_failed assertion and ensure the new
expectation verifies retry-only sync failures do not request reconnection.
In `@packages/server/src/contracts/mobile-dashboard-contracts.ts`:
- Around line 240-245: Update the bodyFat schema’s bodyFatPct field to use
nonnegativeNumberSchema instead of z.number(), while leaving the surrounding
date and array structure unchanged.
In `@packages/server/src/repositories/cycling-analytics-repository.test.ts`:
- Around line 933-975: Update both tests around
CyclingAnalyticsRepository.getActivities so the database execute mock returns
the mocked activity’s ID, allowing filterToVisibleCanonicalActivities to retain
the row. Apply this to the execute mocks in the “treats an empty modality” and
“preserves a non-empty modality” tests without changing their modality
assertions.
In `@packages/server/src/repositories/hangboarding-repository.ts`:
- Around line 309-332: Update the session_metrics GROUP BY to use
sessions.activity_id instead of sessions.hang_ten_activity_id, while retaining
the started_at and ended_at grouping fields. Ensure distinct sessions sharing
timestamps remain separate, including canonical activities with NULL
hang_ten_activity_id, so session_count and duration totals remain accurate.
- Around line 206-334: Update getSummary so the independent summaryRows and
dailyRows queries start concurrently instead of awaiting summaryRows before
creating the daily query. Initiate both `#query` calls first, then await their
results together while preserving the existing schemas, SQL, and downstream row
handling.
In `@packages/server/src/routers/activity.ts`:
- Around line 157-174: Add Zod output schemas for HangboardingDetail and
HangboardingSummary, then attach the appropriate schema with .output(...) to the
hangboardDetails procedure in packages/server/src/routers/activity.ts (lines
157-174) and the hangboarding summary procedure in
packages/server/src/routers/climbing.ts (lines 222-232); ensure each schema
matches the repository return shape.
In `@packages/web/src/components/HangboardingDetail.stories.tsx`:
- Around line 51-59: Add Empty and Error stories alongside Default,
SegmentWarning, and Loading in the HangboardingDetail story definitions,
configuring each with the props required to render the component’s empty and
error states while preserving the existing variants.
In `@packages/web/src/components/HangboardingSummary.tsx`:
- Line 3: Move the HangboardingSummary and HangboardingDetail type exports to
the designated shared contract module, then update imports from the server
repository in packages/web/src/components/HangboardingSummary.tsx:3-3,
packages/web/src/components/HangboardingDetail.tsx:2-2,
packages/mobile/components/HangboardingSummary.test.tsx:3-3,
packages/web/src/components/HangboardingDetail.stories.tsx:2-2,
packages/web/src/components/HangboardingDetail.test.tsx:5-5,
packages/web/src/components/HangboardingSummary.stories.tsx:2-2, and
packages/web/src/components/HangboardingSummary.test.tsx:6-6 to use that shared
module while preserving the existing type usage.
In `@packages/web/src/pages/ActivityDetailPage.tsx`:
- Around line 300-312: Split the oversized ActivityDetailPage component into
focused activity-detail modules before adding the hangboarding section, keeping
each extracted module cohesive and preserving existing behavior. Move enough
sections out of ActivityDetailPage.tsx to reduce it below 1000 lines, and keep
the new hangboarding rendering integrated through the appropriate extracted or
remaining component.
In `@pnpm-workspace.yaml`:
- Around line 35-39: Replace the ineffective audit.ignore configuration with
pnpm’s recognized auditConfig.ignoreGhsas setting, and document both GHSA
identifiers with their dependency scope, runtime reachability, compensating
control, owner, and review date; retain the exceptions only alongside that
documentation.
In `@src/db/hangboard-activity-type-migration.integration.test.ts`:
- Around line 17-27: Update the raw SQL queries in
src/db/hangboard-activity-type-migration.integration.test.ts lines 17-27 and
packages/server/src/routers/activity.integration.test.ts lines 357-368 to use
executeWithSchema() with Zod schemas validating enumlabel and id respectively.
Preserve undefined results through parsing until the explicit missing-row
checks, and do not convert absent values to an empty-string sentinel.
In `@src/providers/apple-health/parsing-extra.test.ts`:
- Around line 4-67: Remove the duplicate Hang Ten test cases from the describe
block in parsing-extra.test.ts, including malformed JSON, exact brand matching,
and structurally invalid metadata scenarios. Retain the existing coverage in
parsing.test.ts as the single source of these assertions.
---
Outside diff comments:
In `@packages/web/src/routes/training/climbing.test.tsx`:
- Around line 165-174: Extend the climbing route tests around the Hangboarding
section to cover both hangboardingSummary error states: an initial error with no
data and a stale-data error with cached data. Mock the query responses
appropriately, assert the initial error UI when no summary exists, and assert
the stale-data error panel while preserving the cached Hangboarding content.
🪄 Autofix
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 Plus
Run ID: 0bb51533-0fb5-4134-b662-f3cf308f8f37
📒 Files selected for processing (93)
.superpowers/sdd/2026-08-10-hangboarding-import-and-ui/task-3-report.mdanalytics/models/read_models/cycling_activity.sqlanalytics/models/read_models/cycling_activity.sql.test.tsanalytics/models/read_models/sleep_heart_rate_sample.sqlanalytics/models/read_models/sleep_heart_rate_sample.sql.test.tscspell.jsondocs/production-incident-baseline.mddocs/superpowers/plans/2026-08-08-activity-overview-partial-measurements.mddocs/superpowers/plans/2026-08-08-processing-status-alerts.mddocs/superpowers/plans/2026-08-10-body-fat-chart.mddocs/superpowers/plans/2026-08-10-hangboarding-import-and-ui.mddocs/superpowers/specs/2026-08-08-activity-overview-partial-measurements-design.mddocs/superpowers/specs/2026-08-08-processing-status-alerts-design.mddocs/superpowers/specs/2026-08-10-body-fat-chart-design.mddocs/superpowers/specs/2026-08-10-hangboarding-ui-design.mddrizzle/0073_processing_stage_event_latest_lookup.sqldrizzle/meta/_journal.jsonpackages/mobile/app-tests/(tabs)/index.test.tsxpackages/mobile/app-tests/(tabs)/recovery.test.tsxpackages/mobile/app-tests/(tabs)/strain.test.tsxpackages/mobile/app-tests/activity/[id].test.tsxpackages/mobile/app/(tabs)/recovery.tsxpackages/mobile/app/(tabs)/strain.tsxpackages/mobile/app/activity/[id].tsxpackages/mobile/components/HangboardingDetail.stories.tsxpackages/mobile/components/HangboardingDetail.test.tsxpackages/mobile/components/HangboardingDetail.tsxpackages/mobile/components/HangboardingSummary.stories.tsxpackages/mobile/components/HangboardingSummary.test.tsxpackages/mobile/components/HangboardingSummary.tsxpackages/mobile/components/ProcessingStatusWidget.test.tsxpackages/mobile/components/ProcessingStatusWidget.tsxpackages/mobile/lib/query-client.test.tspackages/mobile/lib/query-client.tspackages/providers-meta/src/processing-status.test.tspackages/providers-meta/src/processing-status.tspackages/server/src/contracts/mobile-dashboard-contracts.test.tspackages/server/src/contracts/mobile-dashboard-contracts.tspackages/server/src/repositories/activities-calendar-repository.test.tspackages/server/src/repositories/activities-calendar-repository.tspackages/server/src/repositories/activity-repository.test.tspackages/server/src/repositories/activity-repository.tspackages/server/src/repositories/cycling-analytics-repository.test.tspackages/server/src/repositories/cycling-analytics-repository.tspackages/server/src/repositories/hangboarding-repository.integration.test.tspackages/server/src/repositories/hangboarding-repository.test.tspackages/server/src/repositories/hangboarding-repository.tspackages/server/src/repositories/processing-repository.test.tspackages/server/src/repositories/processing-repository.tspackages/server/src/routers/activity.integration.test.tspackages/server/src/routers/activity.test.tspackages/server/src/routers/activity.tspackages/server/src/routers/climbing.integration.test.tspackages/server/src/routers/climbing.test.tspackages/server/src/routers/climbing.tspackages/server/src/routers/mobile-dashboard.test.tspackages/server/src/services/mobile-recovery-tab.test.tspackages/server/src/services/mobile-recovery-tab.tspackages/server/src/services/mobile-training-tab.test.tspackages/server/src/services/mobile-training-tab.tspackages/training/src/activity-types.test.tspackages/training/src/training.test.tspackages/training/src/training.tspackages/web/src/components/BodyFatPercentageChart.stories.tsxpackages/web/src/components/BodyFatPercentageChart.test.tsxpackages/web/src/components/BodyFatPercentageChart.tsxpackages/web/src/components/DataSourcesPanel.test.tsxpackages/web/src/components/HangboardingDetail.stories.tsxpackages/web/src/components/HangboardingDetail.test.tsxpackages/web/src/components/HangboardingDetail.tsxpackages/web/src/components/HangboardingSummary.stories.tsxpackages/web/src/components/HangboardingSummary.test.tsxpackages/web/src/components/HangboardingSummary.tsxpackages/web/src/components/ProcessingStatusWidget.test.tsxpackages/web/src/components/ProcessingStatusWidget.tsxpackages/web/src/pages/ActivityDetailPage.test.tsxpackages/web/src/pages/ActivityDetailPage.tsxpackages/web/src/pages/BodyPage.test.tsxpackages/web/src/pages/BodyPage.tsxpackages/web/src/routes/training/climbing.test.tsxpackages/web/src/routes/training/climbing.tsxpaseo.jsonpnpm-workspace.yamlsrc/db/hangboard-activity-type-migration.integration.test.tssrc/db/schema/processing.tssrc/jobs/process-sync-job.test.tssrc/jobs/process-sync-job.tssrc/providers/apple-health/db-insertion.integration.test.tssrc/providers/apple-health/db-insertion.test.tssrc/providers/apple-health/db-insertion.tssrc/providers/apple-health/hang-ten-intervals.test.tssrc/providers/apple-health/parsing-extra.test.tssrc/providers/apple-health/parsing.test.ts
💤 Files with no reviewable changes (1)
- paseo.json
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
|
Storybook previews for This comment updates automatically on each PR push. |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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 `@packages/mobile/components/ClimbingEntryBreakdown.tsx`:
- Around line 54-60: Update the attempt result rendering in
ClimbingEntryBreakdown so failed attempts with a missing failureReason display a
clear fallback label such as “Not sent” instead of an empty result. Preserve the
existing capitalization and failure-reason display when a reason is available.
- Around line 26-74: Add colocated Vitest coverage for ClimbingEntryBreakdown,
including sent attempts, failed attempts without a failure reason, and no-data
output. Add ClimbingEntryBreakdown.stories.tsx with default, loading, empty, and
meaningful-variant stories, using the component’s existing props and rendering
conventions.
🪄 Autofix
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 Plus
Run ID: e23c2069-082f-4c03-8ab0-62585840aa03
📒 Files selected for processing (6)
packages/mobile/components/ClimbingEntryBreakdown.tsxpackages/providers-meta/package.jsonpackages/providers-meta/src/hangboarding.tspackages/providers-meta/src/processing-status.test.tspackages/server/src/repositories/cycling-analytics-repository.test.tspackages/server/src/services/mobile-training-tab.test.ts
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
Mobile PreviewScan to open on device:
To test on device:
|
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
|
🤖 Review skipped: Repository Owner rate limit exceeded. Free accounts are limited to 3 reviews per 4 hours across all repositories. Upgrade to a paid plan for unlimited reviews. |
Summary
Validation
pnpm lint(repository checks passed; unrelated SQLFluff LT08 internal exceptions remain in existing analytics models)pnpm tsc --noEmitpnpm --dir packages/server tsc --noEmitpnpm --dir packages/web tsc --noEmitpnpm testSummary by Sourcery
Classify provider sync failures as authentication vs transient service errors, tailor recovery messaging/actions across web and mobile, and ship Hangboarding and body-fat analytics surfaces while tightening Apple Health import, calendar visibility, and analytics performance.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Tests:
Summary by cubic
Tailors provider sync recovery so users reconnect only for authentication failures and otherwise retry. Previously all failures prompted reconnect; now auth failures show “needs to reconnect” with a deep link, while service/sync failures show retry-only guidance and a “Retry sync” action.
errorCode/errorMessage; mapprovider_auth_failedto “needs to reconnect” with a reconnect action; mapprovider_sync_failedor ingest failures to “couldn’t sync” with aretry_syncaction and “Try the sync again later” messaging.@dofek/providers/processing-status: addproviderId, propagateerrorCode, and derive arequiresReconnectflag to drive UI actions.requiresReconnectis true, deep-linking to/providers/<id>via@tanstack/react-router(web) andexpo-router(mobile); keep Dismiss.@dofek/providers/hangboarding; update the production-incident baseline with the CI orphaned-component incident outcome.Written for commit 4a06f45. Summary will update on new commits.
Summary by CodeRabbit
New Features
Bug Fixes