Skip to content

Fix activity source attribution for grouped workouts - #1468

Merged
Asherlc merged 11 commits into
mainfrom
Asherlc/missing-strong-workout
Jul 4, 2026
Merged

Asherlc merged 11 commits into
mainfrom
Asherlc/missing-strong-workout

Conversation

@Asherlc

@Asherlc Asherlc commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Preserves member-level activity source attribution through the SQL read models, server model, and web/mobile activity detail screens.
Web and mobile now render distinct Strong via Apple Health, WHOOP via Apple Health, and WHOOP Cloud sources for grouped workouts.
Adds the incident baseline entry and the follow-up issue-TDD plan for #1467.
Verification: focused server/web/mobile/analytics tests, lint with local ClickHouse URL, migration policy, and root/server/web/mobile typechecks passed; full CI=1 pnpm test was attempted but failed after local ClickHouse was stopped, with only ECONNREFUSED 127.0.0.1:8123 failures.


Summary by cubic

Fixes source attribution for grouped workouts by preserving per-member subsources and member IDs across SQL and server models. Web and mobile now show distinct source links like Strong (via Apple Health), WHOOP (via Apple Health), and WHOOP (Cloud), including removed sources and correct provider names; also adds a short TDD plan doc and updates the incident baseline.

  • Bug Fixes

    • Preserve per-entry subsource and string memberActivityId for active and absent members in ClickHouse deduped_activities and Postgres v_activity; keep removed subsources when another subsource is active.
    • Server ActivitySourceAttribution: key by providerId + subsource, include subsource on absent entries, emit memberActivityId as string, and label providers by name when no URL exists; do not collapse links by provider.
    • Web/mobile: render all sourceLinks in order, including multiple Apple Health subsources and removed entries; add focused tests.
    • Infra/tests: remove unused ClickHouse migration exports and legacy migration unit tests; exclude migration dir from coverage; isolate Postgres test templates per module instance.
  • Migration

    • Run 0040_v_activity_source_subsources.sql to rebuild fitness.v_activity. Deploy analytics SQL and refresh the read model.

Written for commit 36d6b59. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Activity details now render richer, per-member source links for grouped activities, including distinct upstream labels and optional “via ” attribution.
    • Apple Health upstream items can display multiple related labels (e.g., “Strong (via Apple Health)”, “WHOOP (via Apple Health)”, and “WHOOP (Cloud)”).
  • Bug Fixes

    • Preserved per-entry source attribution for both active and removed/absent sources, including better labeling when URLs are unavailable.
  • Documentation

    • Added/updated guidance describing the activity source attribution domain model and expected client behavior.

Copilot AI review requested due to automatic review settings July 3, 2026 15:46
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@sourcery-ai sourcery-ai 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.

Sorry @Asherlc, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds per-member subsource and text memberActivityId handling across analytics SQL, the Postgres activity view, repository parsing, source-link modeling, and web/mobile activity detail rendering. Also updates incident/plan docs and isolates test database template naming per process.

Changes

Subsource-aware activity source attribution

Layer / File(s) Summary
Docs and attribution plan
docs/production-incident-baseline.md, docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md
Adds an incident baseline entry and an implementation plan for typed source attribution.
ClickHouse deduped activity projection
analytics/models/read_models/deduped_activities.sql, analytics/models/read_models/read_model_microbatch.sql.test.ts
Adds per-member subsource and memberActivityId to deduped activity source maps, with matching SQL assertions.
Postgres activity view projection
drizzle/0040_v_activity_source_subsources.sql, drizzle/_views/01_v_activity.sql
Updates the activity view and migration to propagate source metadata and emit subsource plus text memberActivityId in present and absent source JSON.
Repository and source-link modeling
packages/server/src/repositories/activity-repository.ts, packages/server/src/models/activity-source-attribution.ts, packages/server/src/models/activity-source-attribution.test.ts, packages/server/src/models/activity.test.ts
Extends parsing and source-link generation to carry subsource, split active vs absent links, and label links by subsource and provider.
Web and mobile source rendering
packages/web/src/pages/ActivityDetailPage.tsx, packages/web/src/pages/ActivityDetailPage.test.tsx, packages/mobile/app/activity/[id].tsx, packages/mobile/app/activity/[id].test.tsx
Renders typed source links directly in web and mobile activity detail screens and adds grouped Apple Health UI tests.

Test database template naming isolation

Layer / File(s) Summary
Template database instance id
src/db/test-helpers.ts, src/db/test-helpers.test.ts
Adds a per-process random template database instance id and verifies reimports create distinct template databases.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ClickHouse as ClickHouse deduped_activities
  participant Postgres as fitness.v_activity
  participant Repository as ActivityRepository
  participant Model as ActivitySourceAttribution
  participant WebMobile as Web and Mobile UI

  ClickHouse->>Postgres: source_external_ids with subsource and memberActivityId
  Postgres->>Repository: absent_source_external_ids and source_external_ids
  Repository->>Model: parsed SourceExternalIdEntry[]
  Model->>Model: toSourceLinks() groups active and absent links
  Model-->>WebMobile: sourceLinks[]
  WebMobile->>WebMobile: render removed, URL, or plain labels
Loading

Possibly related issues

Possibly related PRs

  • Asherlc/dofek#1211: Directly related at the analytics/models/read_models/deduped_activities.sql projection layer.
  • Asherlc/dofek#1329: Overlaps on the same deduplication merged/absent_source_external_ids shaping work.
  • Asherlc/dofek#1344: Shares the fitness.v_activity absent-source attribution path.

Suggested labels: area/server, area/web, area/mobile, area/db, type/bug

Suggested reviewers: cubic-dev-ai

🚥 Pre-merge checks | ✅ 1 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title is relevant and imperative, but it lacks the required area prefix for a multi-area change. Prefix the title with the primary area, for example: "[server] Fix activity source attribution for grouped workouts".
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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.

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Storybook previews for 9794f5d9 are ready:

This comment updates automatically on each PR push.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Mobile Preview

Scan to open on device:

QR code for dofek://preview/pr-1468

Channel pr-1468
Deep Link dofek://preview/pr-1468
Commit 9794f5d

To test on device:

  1. Build and install the preview client: PREVIEW_CHANNEL=pr-1468 pnpm expo prebuild --clean -p ios
  2. Or tap deep link on an existing preview build: dofek://preview/pr-1468

Each PR gets its own channel. Build a preview client with PREVIEW_CHANNEL=pr-{N} to test.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 14 files

Confidence score: 3/5

  • drizzle/0040_v_activity_source_subsources.sql writes source_external_ids.memberActivityId as a JSON number, while deduped_activities.sql appears to compare/serialize it as a string; that type mismatch can break joins/deduping and lead to duplicate or missing activity records after deploy. Align the type on both sides (store as string or cast consistently in ClickHouse) and run a quick backfill/query check before merging.

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread drizzle/0040_v_activity_source_subsources.sql Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 1 file (changes from recent commits).

Requires human review: Auto-approval blocked by 1 unresolved issue from previous reviews.

Re-trigger cubic

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 2 files (changes from recent commits).

Requires human review: Auto-approval blocked by 1 unresolved issue from previous reviews.

Re-trigger cubic

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
analytics/models/read_models/deduped_activities.sql (1)

43-59: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add subsource to absent source links too
Removed grouped members lose upstream-app attribution because ActivitySourceAttribution reads subsource for absent entries, but absent_source_links never populates it. Plumb the source-app field into absent_group_members and set subsource in analytics/models/read_models/deduped_activities.sql, drizzle/0040_v_activity_source_subsources.sql, and drizzle/_views/01_v_activity.sql.

🤖 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 `@analytics/models/read_models/deduped_activities.sql` around lines 43 - 59,
The absent source link mapping is missing the source-app attribution field, so
update the absent-member pipeline to carry and emit `subsource` end to end. Add
`subsource` to the `absent_group_members` data flow, then include it in the
`absent_source_links` CTE in `deduped_activities.sql` using the existing
`ActivitySourceAttribution`/source-app naming so absent entries can be read
consistently. Make the matching schema/view changes in
`drizzle/0040_v_activity_source_subsources.sql` and
`drizzle/_views/01_v_activity.sql` so the field is populated everywhere the
absent-source path is built.
♻️ Duplicate comments (1)
drizzle/_views/01_v_activity.sql (1)

181-196: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Duplicate of the migration-file gap: absent_source_links misses subsource here too.

Since this is the generated view SQL that drizzle/0040_v_activity_source_subsources.sql produces, fixing the migration (see comment there) should update this file identically. Flagging here for completeness since this is the file actually applied via CREATE OR REPLACE VIEW.

🤖 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 `@drizzle/_views/01_v_activity.sql` around lines 181 - 196, The
absent_source_links CTE is still missing subsource in the JSON payload, matching
the same gap from the migration-generated view. Update the absent_source_links
aggregation in v_activity.sql to include the subsource field alongside
providerId, externalId, memberActivityId, and providerAbsentAt, using the same
shape and naming as the rest of the activity source/view helpers so the CREATE
OR REPLACE VIEW output stays consistent.
🤖 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
`@docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md`:
- Around line 1-3: The opening note in the Activity Source Attribution Domain
Model TDD Plan still contains an agent-only “superpowers:*” directive, which is
not allowed in docs. Update the document header so it reads as plain,
self-contained plan text with no references to agent skills or workflow
instructions, or move that instruction into AGENTS.md; keep the rest of the plan
unchanged.

In `@drizzle/0040_v_activity_source_subsources.sql`:
- Around line 207-222: The absent source link aggregation in absent_source_links
is missing subsource, so tombstoned entries lose the original source attribution
and fall back to the generic provider label in
ActivitySourceAttribution.#toSourceLink. Update the JSONB_BUILD_OBJECT in the
absent_source_links CTE to mirror source_external_ids by carrying subsource from
t.raw->>'sourceName' or t.source_name, keeping the existing ordering and
grouping intact so the raw source metadata survives deduplication.

In `@packages/server/src/models/activity-source-attribution.ts`:
- Around line 91-101: The `toSourceLinks` logic in `ActivitySourceAttribution`
is filtering absent entries using only `providerId`, which causes removed
subsources under the same provider to disappear when one active subsource
exists. Update the deduping key in `toSourceLinks` (and any related lookup/set
logic) to consider both `providerId` and `subsource`, so `#activeEntries` and
`#absentEntries` can coexist for different grouped apps. Add a regression test
in `activity-source-attribution.test.ts` or `activity.test.ts` that creates an
active and an absent entry with the same `providerId` but different `subsource`
values and asserts both source links render separately, including the removed
marker for the absent one.

---

Outside diff comments:
In `@analytics/models/read_models/deduped_activities.sql`:
- Around line 43-59: The absent source link mapping is missing the source-app
attribution field, so update the absent-member pipeline to carry and emit
`subsource` end to end. Add `subsource` to the `absent_group_members` data flow,
then include it in the `absent_source_links` CTE in `deduped_activities.sql`
using the existing `ActivitySourceAttribution`/source-app naming so absent
entries can be read consistently. Make the matching schema/view changes in
`drizzle/0040_v_activity_source_subsources.sql` and
`drizzle/_views/01_v_activity.sql` so the field is populated everywhere the
absent-source path is built.

---

Duplicate comments:
In `@drizzle/_views/01_v_activity.sql`:
- Around line 181-196: The absent_source_links CTE is still missing subsource in
the JSON payload, matching the same gap from the migration-generated view.
Update the absent_source_links aggregation in v_activity.sql to include the
subsource field alongside providerId, externalId, memberActivityId, and
providerAbsentAt, using the same shape and naming as the rest of the activity
source/view helpers so the CREATE OR REPLACE VIEW output stays consistent.
🪄 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 Plus

Run ID: 6eb80476-aeec-4bbe-9cb7-0b514ed9257b

📥 Commits

Reviewing files that changed from the base of the PR and between b16cbb0 and f6acd3a.

📒 Files selected for processing (16)
  • analytics/models/read_models/deduped_activities.sql
  • analytics/models/read_models/read_model_microbatch.sql.test.ts
  • docs/production-incident-baseline.md
  • docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md
  • drizzle/0040_v_activity_source_subsources.sql
  • drizzle/_views/01_v_activity.sql
  • packages/mobile/app/activity/[id].test.tsx
  • packages/mobile/app/activity/[id].tsx
  • packages/server/src/models/activity-source-attribution.test.ts
  • packages/server/src/models/activity-source-attribution.ts
  • packages/server/src/models/activity.test.ts
  • packages/server/src/repositories/activity-repository.ts
  • packages/web/src/pages/ActivityDetailPage.test.tsx
  • packages/web/src/pages/ActivityDetailPage.tsx
  • src/db/test-helpers.test.ts
  • src/db/test-helpers.ts

Comment thread docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md Outdated
Comment thread drizzle/0040_v_activity_source_subsources.sql
Comment thread packages/server/src/models/activity-source-attribution.ts

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 3 files (changes from recent commits).

Requires human review: Includes database migration, business logic changes, and UI updates for activity source attribution. These are high-impact changes that require human review to ensure correctness and safety.

Re-trigger cubic

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

2 issues found across 7 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread drizzle/_views/01_v_activity.sql Outdated
Comment thread drizzle/_views/01_v_activity.sql Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 6 files (changes from recent commits).

Requires human review: Auto-approval blocked by 2 unresolved issues from previous reviews.

Re-trigger cubic

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (2)
docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md (1)

97-109: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use a real sequential migration name and run the migration.

drizzle/YYYY_v_activity_source_attribution_model.sql is a placeholder, and Task 5 only runs lint:migrations. As per path instructions, manual Drizzle migrations must be sequentially numbered, and pnpm migrate must run after creating them.

🤖 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
`@docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md`
around lines 97 - 109, Task 5 still uses a placeholder migration name and only
mentions linting, so update the migration to a real sequential Drizzle filename
in the source-attribution model change and make sure the new migration is
actually run. Use the migration and SQL view artifacts referenced by the task,
especially drizzle/_views/01_v_activity.sql and the new drizzle migration file,
and add the required pnpm migrate step after creating it. Keep the typed
source-attribution projection changes in sync with the migration so the read
model and tests reflect the applied schema.

Source: Path instructions

packages/server/src/models/activity-source-attribution.ts (1)

133-177: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Preserve subsource in partialAbsentSources()packages/web/src/pages/ActivitiesPage.tsx formats ProviderAbsentSource directly, so dropping entry.subsource here regresses grouped labels back to generic provider names. partialAbsenceSummary()/#formatRemovedSources() are not on the current UI path; if they stay, they should use the same providerSourceLabel(providerId, subsource) helper.

🤖 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/server/src/models/activity-source-attribution.ts` around lines 133 -
177, `partialAbsentSources()` is dropping the `subsource` field from
`ProviderAbsentSource`, which breaks grouped labels in `ActivitiesPage`. Update
`ActivitySourceAttribution.partialAbsentSources()` to preserve `entry.subsource`
alongside `providerId` and `providerAbsentAt`, and make sure any remaining
formatting paths like `partialAbsenceSummary()` and `#formatRemovedSources()`
use `providerSourceLabel(providerId, subsource)` instead of plain provider
names.
🤖 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 `@vitest.config.ts`:
- Around line 85-86: The coverage config is excluding the production migration
runner instead of fixing the missing test coverage. Remove the blanket exclusion
for src/db/clickhouse-migrations.ts from vitest.config.ts and restore focused
unit tests around runClickHouseMigrations to cover the branching for
requiresPreviouslyAppliedMigrationId, migration.run, and statement execution by
mocking the ClickHouse client. Keep exclusions limited to legitimate test-only
or fixture paths.

---

Outside diff comments:
In
`@docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md`:
- Around line 97-109: Task 5 still uses a placeholder migration name and only
mentions linting, so update the migration to a real sequential Drizzle filename
in the source-attribution model change and make sure the new migration is
actually run. Use the migration and SQL view artifacts referenced by the task,
especially drizzle/_views/01_v_activity.sql and the new drizzle migration file,
and add the required pnpm migrate step after creating it. Keep the typed
source-attribution projection changes in sync with the migration so the read
model and tests reflect the applied schema.

In `@packages/server/src/models/activity-source-attribution.ts`:
- Around line 133-177: `partialAbsentSources()` is dropping the `subsource`
field from `ProviderAbsentSource`, which breaks grouped labels in
`ActivitiesPage`. Update `ActivitySourceAttribution.partialAbsentSources()` to
preserve `entry.subsource` alongside `providerId` and `providerAbsentAt`, and
make sure any remaining formatting paths like `partialAbsenceSummary()` and
`#formatRemovedSources()` use `providerSourceLabel(providerId, subsource)`
instead of plain provider names.
🪄 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 Plus

Run ID: bb491ddd-94ec-452c-ab9b-ccbe4c5a3e07

📥 Commits

Reviewing files that changed from the base of the PR and between f6acd3a and 6680197.

📒 Files selected for processing (13)
  • analytics/models/read_models/deduped_activities.sql
  • docs/superpowers/plans/2026-07-03-activity-source-attribution-domain-model.md
  • drizzle/0040_v_activity_source_subsources.sql
  • drizzle/_views/01_v_activity.sql
  • packages/server/src/models/activity-source-attribution.test.ts
  • packages/server/src/models/activity-source-attribution.ts
  • packages/server/src/repositories/activity-repository.ts
  • src/db/clickhouse-migrations.test.ts
  • src/db/clickhouse-migrations/0034_move_metric_stream_to_ingest.test.ts
  • src/db/clickhouse-migrations/custom-runs.test.ts
  • src/db/clickhouse-migrations/registry.test.ts
  • src/db/clickhouse-migrations/sql.test.ts
  • vitest.config.ts
💤 Files with no reviewable changes (5)
  • src/db/clickhouse-migrations/sql.test.ts
  • src/db/clickhouse-migrations/0034_move_metric_stream_to_ingest.test.ts
  • src/db/clickhouse-migrations/registry.test.ts
  • src/db/clickhouse-migrations.test.ts
  • src/db/clickhouse-migrations/custom-runs.test.ts

Comment thread vitest.config.ts Outdated
@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

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.

@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

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.

@Asherlc

Asherlc commented Jul 4, 2026

Copy link
Copy Markdown
Owner Author

Addressed the remaining actionable outside-diff review feedback.

  • Preserved real subsource values in ActivitySourceAttribution.partialAbsentSources() and source-app labels in partial absence summaries.
  • Updated the source-attribution plan to use the real sequential migration file, drizzle/0040_v_activity_source_subsources.sql, and include rtk pnpm migrate.
  • Commits: 34edb1442 and 11a61b279

@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

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.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 9 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread vitest.config.ts
@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

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.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants