Skip to content

Stop MoE corpus from keying the retweeter - #70

Closed
Pitchfork-and-Torch wants to merge 19 commits into
mainfrom
cursor/magellan-leftover3-moe-origin-0951
Closed

Stop MoE corpus from keying the retweeter#70
Pitchfork-and-Torch wants to merge 19 commits into
mainfrom
cursor/magellan-leftover3-moe-origin-0951

Conversation

@Pitchfork-and-Torch

Copy link
Copy Markdown
Owner

Bug

AuthorColdStart::author_corpus gated Phoenix MoE scores on wrapper author_id. Phoenix already keys the original author (as_tweet_info / get_original_author_id). A treatment-origin retweet by an unbucketed retweeter was zeroed. A control-origin retweet by a treatment retweeter leaked into treatment For You.

This is not xai-org#172 (RankingScorer author-diversity pool). This is not #31 / author-size IPS. This is not xai-org#125 (gizmoduck origin size/NSFW). Diversity stays the post-Phoenix repeat lever. Corpus membership is the MoE keep/zero gate.

Five-line proof

  1. Entry: Phoenix MoE retrieval stamps ForYouPhoenixRetrievalMoe; CoreData writes retweeted_user_id from TES source_user_id.
  2. Sink: author_corpus -> apply_moe_ranking_policy -> RankingScorer / VMRanker -> TopKScoreSelector.
  3. Break: corpus looked up c.author_id (retweeter). get_original_author_id() was unused.
  4. Viewer: treatment For You lost MoE RTs of treatment authors via unbucketed retweeters, and kept MoE RTs of control authors via treatment retweeters.
  5. Twin: PostCandidate::as_tweet_info already sends the original author to Phoenix. Cold-start boost already excludes RTs (retweeted_tweet_id.is_none()).

Fix

Key AuthorIsTreatment / AuthorIsControl on get_original_author_id(). Originals and quotes unchanged.

Tests

  • treatment_keeps_moe_retweet_of_treatment_origin (fails on unmodified main)
  • treatment_zeros_moe_retweet_of_control_origin (fails on unmodified main)
  • Existing non-RT MoE / holdout / control tests unchanged

Standalone rustc model of old vs new corpus: 3/3 passed (2 fail on unmodified main).

cargo: cannot run. Public dump has no home-mixer Cargo.toml.

Rejection table (this wave)

Candidate Why not
RankingScorer author diversity keying retweeter xai-org#172 claimed
Author-size IPS Forbidden
Gizmoduck origin size/NSFW xai-org#125 claimed
Thunder undelete xai-org#186 claimed
Thunder RT of tombstone / QuotedTweetDelete xai-org#150 / xai-org#138 claimed
TimelineHome DMCA / geo media xai-org#187 claimed
OON NSFW Phoenix skip xai-org#185 claimed
Ads served bury organic xai-org#184 claimed
Author / quote / RT handle mute-keyword xai-org#182 / xai-org#140 / xai-org#164 claimed
mute_surfaces / mute_options on Gizmoduck No live Entry: UserFeatures is Vec only
WTF hide_recommendations Sibling leftover; not this class
OON followee RT via stale in_network Same class as xai-org#128 / xai-org#154 / xai-org#183
TES/gizmoduck/VF fail-closed spray Forbidden
SidTail / PopularTopics / BroadcastLiveness enable Forbidden intern-enable
Open in Web Open in Cursor 

CI agent and others added 19 commits August 14, 2026 20:55
in_network_ids is passed to the VF client without deduplication, while
oon_ids is deduped four lines below. retweeted_tweet_id is pushed for
every candidate that has one, so the same ID repeats once per retweet of
a given post — most often when that post is going viral.

Neither VfClient implementation dedupes its input: StratoVfClient builds
one call per element, and XaiVfClient chunks by XAI_VF_MAX_BATCH_SIZE, so
duplicates consume batch slots and can force an extra round trip.

Not a correctness issue — results collapse into a HashMap keyed by tweet
ID — but redundant work on the For You serving path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deduplicate in_network_ids before VF lookup
AuthorColdStart gated Phoenix MoE scores on wrapper author_id.
Retweets of a treatment origin by an unbucketed retweeter were
zeroed; retweets of a control origin by a treatment retweeter leaked.
Key the original author, matching Phoenix tweet_info.

Co-authored-by: Jon Bailey <Pitchfork-and-Torch@users.noreply.github.com>
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.

4 participants