feat: seed tag-chip feeds from clustered topics - #4046
Conversation
Adds a second tag-chip seeding strategy behind a client-controlled feedList(tagChipSeedStrategy:) arg so the two can be A/B tested. V1 is today's behavior (one feed per tag from /api/user_tags) and stays the default; V2 clusters the user's onboarding tags through the feed service's new /api/topics endpoint and seeds one multi-tag feed per topic. - FeedClient.getTopics + mock so MOCK_EXTERNAL_SERVICES still works locally - cluster_threshold read from remoteConfig, omitted when unset so the service default applies - getUserOnboardingTags moved out of channelDigest into common/feed and shared by both strategies - strategy recorded on User.flags.tagChipFeedsSeedStrategy so the arms are segmentable after the fact - V2 degrades to V1 when the user has no onboarding tags or clustering fails; seeding still never throws into the resolver Seeding stays one-shot per user, so the experiment buckets users at their first opted-in read and already-seeded users are untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
@claude review |
|
Claude finished @capJavert's task in 4m 6s —— View job ReviewSolid, well-scoped change — the one-shot reservation, the V2→V1 degradation, and the "seeding never throws into the resolver" contract are all preserved, and test coverage of the new paths is good. A few things worth addressing, roughly in severity order. 1. The recorded strategy is requested, not effective — the V2 arm will be contaminated
Worse, the fallback is mostly silent. Net effect: if Suggestion: record the effective outcome — either write the strategy after seeding, or add a second flag write / a 2. Service-returned tags are inserted unvalidated → one bad tag permanently kills the whole seed
You already know the valid set: it's the 3. V2 sends an unbounded tag list to
|
|
🍹 The Update (preview) for dailydotdev/api/prod (at d00f62b) was successful. Resource Changes Name Type Operation
~ vpc-native-validate-active-users-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-lifecycle-state-clickhouse-cron kubernetes:batch/v1:CronJob update
- vpc-native-api-db-migration-80d8ded0 kubernetes:batch/v1:Job delete
~ vpc-native-personalized-digest-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-profile-updated-sync-cron kubernetes:batch/v1:CronJob update
~ vpc-native-daily-digest-cron kubernetes:batch/v1:CronJob update
~ vpc-native-private-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-expire-super-agent-trial-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-source-public-threshold-cron kubernetes:batch/v1:CronJob update
~ vpc-native-rotate-daily-quests-cron kubernetes:batch/v1:CronJob update
~ vpc-native-worker-job-deployment kubernetes:apps/v1:Deployment update
+ vpc-native-api-clickhouse-migration-f1f1cb6e kubernetes:batch/v1:Job create
~ vpc-native-personalized-digest-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-check-analytics-report-cron kubernetes:batch/v1:CronJob update
~ vpc-native-sync-subscription-with-cio-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-achievement-rarity-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-profile-analytics-history-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-calculate-top-readers-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-users-cron kubernetes:batch/v1:CronJob update
~ vpc-native-interest-scheduled-run-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-world-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-channel-highlights-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-old-notifications-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-profile-analytics-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-ws-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-squad-posts-analytics-refresh-cron kubernetes:batch/v1:CronJob update
~ vpc-native-temporal-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-bg-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-clean-zombie-images-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-tag-materialized-views-cron kubernetes:batch/v1:CronJob update
~ vpc-native-rotate-weekly-quests-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-opportunities-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-analytics-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-materialize-yearly-best-post-archives-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-user-companies-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-highlighted-views-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-posts-analytics-refresh-cron kubernetes:batch/v1:CronJob update
~ vpc-native-generic-referral-reminder-cron kubernetes:batch/v1:CronJob update
- vpc-native-api-clickhouse-migration-80d8ded0 kubernetes:batch/v1:Job delete
~ vpc-native-update-trending-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-analytics-achievements-cron kubernetes:batch/v1:CronJob update
... and 17 other changes |
Adds a second tag-chip seeding strategy behind a client-controlled feedList(tagChipSeedStrategy:) arg so the two can be A/B tested. V1 is today's behavior (one feed per tag from /api/user_tags) and stays the default; V2 clusters the user's onboarding tags through the feed service's new /api/topics endpoint and seeds one multi-tag feed per topic.
Seeding stays one-shot per user, so the experiment buckets users at their first opted-in read and already-seeded users are untouched.