1. Il punto in 60 secondi1. The point in 60 seconds
Tu sei creator. Ti chiedi perché il tuo post di ieri ha fatto 2k impression e quello dell'altro ieri 80k. Non è random. Non è nemmeno "l'algoritmo ti odia". È un sistema specifico, leggibile nel codice pubblicato da X.You're a creator. You wonder why yesterday's post got 2k impressions and the day before's got 80k. It's not random. It's also not "the algorithm hates you". It's a specific system, readable in the source X published.
Per ogni post candidato, una rete neurale produce predizioni viewer-specific: "questo viewer specifico metterà like? si fermerà a leggere? scrollerà via?". Quelle predizioni vengono combinate dal RankingScorer in 22 termini pesati → un singolo punteggio. I post con punteggio più alto vincono il feed di quel viewer.For every candidate post, a neural net produces viewer-specific predictions: "will this specific viewer hit like? linger to read? scroll away?". RankingScorer combines those predictions into 22 weighted terms → one final score. Highest-scoring posts win that viewer's feed.
Il sistema misura tre cose con strumenti diversi rispetto a quelle che pensi: il tempo di sosta sul tuo post più del volume di like, l'affinità topicale più della popolarità assoluta, la densità della tua community più del numero di follower.The system measures three things with different instruments than you'd expect: the time spent on your post more than like volume, topical affinity more than absolute popularity, the density of your community more than follower count.
2. Se ricordi una sola cosa2. If you remember just one thing
Tre principi. Se ricordi solo questi, hai capito il sistema.Three principles. Remember just these and you understand the system.
Premia la sosta, non la velocitàRewards lingering, not speed
Il sistema misura il tempo che un viewer passa sul tuo post, non quanti like ricevi al minuto. Il dwell è instrumentato in 4 modi diversi. Nessun altro signal ha questa profondità.The system measures the time a viewer spends on your post, not how many likes per minute. Dwell is instrumented 4 different ways. No other signal has this depth.
La nicchia batte la massaThe niche beats the masses
Il "Two-Tower" (una rete neurale che confronta una rappresentazione di te viewer con una del post) premia l'affinità precisa, non la popolarità assoluta. Cold-start passa da topic affinity, non da follower count.The "Two-Tower" (a neural net that compares a representation of you, the viewer, with one of the post) rewards precise affinity, not absolute popularity. Cold-start goes through topic affinity, not follower count.
La densità batte i numeriDensity beats numbers
MutualFollowJaccard misura quanto i tuoi follower si seguono tra loro. Un account con 5k follower in cluster denso può superare un mega-account con 500k follower sparsi.MutualFollowJaccard measures how much your followers follow each other. A 5k-follower account in a dense cluster can beat a mega-account with 500k scattered followers.
3. Il viaggio di un post3. The journey of a post
Quando pubblichi, succede questo. Cinque atti. Tutto in meno di due secondi, per ogni viewer che apre l'app.When you publish, this happens. Five acts. All in under two seconds, for every viewer who opens the app.
Sotto il cofano: i 10 stage tecnici della pipelineUnder the hood: the 10 technical pipeline stages
La pipeline reale ha 10 stage sequenziali (più gli hydrator paralleli):The real pipeline has 10 sequential stages (plus parallel hydrators):
- Query hydrators (15 paralleli) — arricchiscono il request del viewer (history, demographics, scoring_sequence)Query hydrators (15 parallel) — enrich the viewer's request (history, demographics, scoring_sequence)
- Candidate sources (6) —
ThunderSource(in-network follows),TweetMixerSource(legacy SimClusters/TwHIN), 3 varianti Phoenix Retrieval (PhoenixSource/TopicsSource/MOESource),CachedPostsSourceCandidate sources (6) —ThunderSource(in-network follows),TweetMixerSource(legacy SimClusters/TwHIN), 3 Phoenix Retrieval variants (PhoenixSource/TopicsSource/MOESource),CachedPostsSource - Candidate hydrators (10) — tweet info, author features, embeddingsCandidate hydrators (10) — tweet info, author features, embeddings
- Pre-scoring filters (14) — dedup, blocked, freshness cap (POST_AGE_MAX_MINUTES=4800), safetyPre-scoring filters (14) — dedup, blocked, freshness cap (POST_AGE_MAX_MINUTES=4800), safety
- PhoenixScorer — gRPC call al Phoenix Ranker, popola lo struct
PhoenixScores(21 fields viewer-specific per candidato)PhoenixScorer — gRPC call to the Phoenix Ranker, fills thePhoenixScoresstruct (21 viewer-specific fields per candidate) - RankingScorer — somma 22 ScoringWeights terms (15 positivi + 2 continui + 5 negativi) sui Phoenix scores → offset → diversity → OONRankingScorer — sums 22 ScoringWeights terms (15 positive + 2 continuous + 5 negative) over the Phoenix scores → offset → diversity → OON
- VMRanker — opzionale, può sovrascrivere wholesale lo score; il payload sub-set a 21 fieldsVMRanker — optional, can wholesale overwrite the score; the payload sub-sets to 21 fields
- TopKScoreSelector — sort + truncate a RESULT_SIZETopKScoreSelector — sort + truncate to RESULT_SIZE
- Post-selection hydrators (6) — VisibilityFiltering, MutualFollowJaccard, AdsBrandSafetyPost-selection hydrators (6) — VisibilityFiltering, MutualFollowJaccard, AdsBrandSafety
- Side effects — 6 Kafka fire-and-forget (training, observability, retrain)Side effects — 6 Kafka fire-and-forget (training, observability, retrain)
Riferimento codice: home-mixer/phoenix_candidate_pipeline.rs:185-321Source: home-mixer/phoenix_candidate_pipeline.rs:185-321
4. Cosa prova a predire4. What it tries to predict
Immagina questo. Pubblichi un post su "come scelgo le mie ricette quando torno tardi". Il sistema lo presenta a due viewer diversi.Picture this. You post about "how I pick recipes when I get home late". The system shows it to two different viewers.
MarcoMarco
Chef professionista, segue 600 account di food. Apre la app dopo cena. Il modello predice: P(fav)=0.45, P(dwell)=0.78. Score alto. Vede il post.Professional chef, follows 600 food accounts. Opens the app after dinner. The model predicts: P(fav)=0.45, P(dwell)=0.78. High score. Sees the post.
LucaLuca
Trader crypto, segue 80 account di mercati. Il modello predice: P(fav)=0.04, P(dwell)=0.12. Score basso. Non lo vede.Crypto trader, follows 80 market accounts. The model predicts: P(fav)=0.04, P(dwell)=0.12. Low score. Doesn't see it.
Stesso post. Predizioni completamente diverse. Perché il modello non legge "questo post è di qualità alta in assoluto". Legge "questo viewer specifico reagirà come?".Same post. Completely different predictions. Because the model doesn't read "this post is high quality in absolute terms". It reads "how will this specific viewer react?".
Le azioni pesate (15 positive + 2 continue + 5 negative = 22 termini) coprono lo spettro: like, reply, repost, video-view, dwell-time, click-then-dwell, e i negativi: not-dwelled, not-interested, block, mute, report. Tutto viewer-specific, tutto neural-net predicted, mai un rapporto statistico.The weighted actions (15 positive + 2 continuous + 5 negative = 22 terms) span the spectrum: like, reply, repost, video-view, dwell-time, click-then-dwell, plus the negatives: not-dwelled, not-interested, block, mute, report. All viewer-specific, all neural-net predicted, never a statistical ratio.
Sotto il cofano: l'architettura Two-Tower e i 22 pesiUnder the hood: the Two-Tower architecture and the 22 weights
Il modello [INFERRED from architectural patterns] è una Two-Tower transformer neural network: una torre encoda il viewer (history, embeddings demografici, action sequence), una torre encoda il candidato (tweet content, author features, embeddings di topic). Le due rappresentazioni vengono confrontate per produrre le predizioni viewer-specific che popolano lo struct PhoenixScores.The model [INFERRED from architectural patterns] is a Two-Tower transformer neural network: one tower encodes the viewer (history, demographic embeddings, action sequence), one tower encodes the candidate (tweet content, author features, topic embeddings). The two representations are compared to produce the viewer-specific predictions that fill the PhoenixScores struct.
Le predizioni vengono combinate da RankingScorer in 22 termini pesati (15 positivi + 2 continui + 5 negativi):RankingScorer combines those predictions into 22 weighted terms (15 positive + 2 continuous + 5 negative):
combined = Σ P(action_i) × W_i // 22 termini
score = combined + OFFSET // se net-positive (Branch A)
= ((combined + neg_sum) / total_sum) × OFFSET // se net-negative (Branch B)
= max(combined, 0) // edge case (Branch C)
adjusted = score × diversity_multiplier × oon_factor
Quando attivo, VMRanker (Stage 3) può sovrascrivere wholesale questo score con il proprio output. Il payload che VMRanker riceve è un subset di PhoenixScores: 21 fields (omette quoted_vqv_score). I valori numerici dei 22 pesi production sono [UNKNOWN]: l'OSS espone i nomi (Feature Switch keys) ma non i valori.When active, VMRanker (Stage 3) can wholesale overwrite this score with its own output. The payload VMRanker receives is a subset of PhoenixScores: 21 fields (omits quoted_vqv_score). The 22 production weight values are [UNKNOWN]: the OSS exposes the names (Feature Switch keys) but not the values.
Riferimenti: home-mixer/scorers/ranking_scorer.rs:12-39, 175-217 · home-mixer/scorers/phoenix_scorer.rs:64-113 · home-mixer/scorers/vm_ranker.rs:69-91Refs: home-mixer/scorers/ranking_scorer.rs:12-39, 175-217 · home-mixer/scorers/phoenix_scorer.rs:64-113 · home-mixer/scorers/vm_ranker.rs:69-91
5. Perché il tuo post potrebbe non raggiungere chi pensavi5. Why your post might not reach who you expected
Hai mai pensato che l'algoritmo "ti odia"? Probabilmente stai osservando uno di questi pattern.Ever thought the algorithm "hates you"? You're probably seeing one of these patterns.
Ho 50k follower ma solo 200 hanno visto il post.I have 50k followers but only 200 saw the post.
MutualFollowJaccard è duro con i mega-account. Misura quanto i tuoi follower si conoscono tra loro. Se hai 50k follower sparsi tra utenti che non si seguono, il signal di "community density" è basso. Un account con 5k follower in cluster denso può batterti.MutualFollowJaccard is harsh on mega-accounts. It measures how much your followers know each other. If you have 50k followers scattered across users who don't follow each other, the "community density" signal is low. A 5k-follower account in a dense cluster can beat you.
Riferimento: home-mixer/hydrators/mutual_follow_jaccard_hydrator.rs:10 (MIN_HASHES=256)Source: home-mixer/hydrators/mutual_follow_jaccard_hydrator.rs:10 (MIN_HASHES=256)
Il mio video di 3 secondi non ha decollato.My 3-second video didn't take off.
C'è un threshold sulla durata video. Sotto un certo minimo (MinVideoDurationMs FS-driven), il signal VideoQualityView viene azzerato: non guadagni il peso positivo associato. I video brevissimi perdono un'intera classe di signal.There's a video-duration threshold. Below a certain minimum (MinVideoDurationMs FS-driven), the VideoQualityView signal goes to zero: you don't earn the associated positive weight. Very short videos lose an entire class of signal.
Riferimento: ranking_scorer.rs:132-137Source: ranking_scorer.rs:132-137
Un mio follower non mi vede più. Mi ha mutato?A follower of mine doesn't see me anymore. Did they mute me?
Forse no. Esistono FS (Feature Switch) keys che funzionano per cohort. Il "tuo" algoritmo può essere diverso da quello del tuo follower: scoring_sequence diverse, VMRanker on/off, pesi A/B tested. Il sistema fa esperimenti silenziosi tra utenti.Maybe not. There are FS (Feature Switch) keys that operate per cohort. "Your" algorithm can differ from your follower's: different scoring_sequence, VMRanker on/off, A/B-tested weights. The system runs silent experiments across users.
Le reply mi penalizzano?Do replies penalize me?
No. Le reply contribuiscono positivo (peso W_reply). Quello che il sistema premia molto di più è il dwell. Se i tuoi follower commentano "interessante" e scrollano via, il dwell è basso e perdi più di quanto guadagni con il reply. Il messaggio strutturale del codice: la sosta vale più del commento.No. Replies contribute positively (W_reply weight). What the system rewards much more is dwell. If your followers comment "interesting" and scroll away, dwell is low and you lose more than you gain from the reply. The structural message of the code: lingering is worth more than commenting.
6. Le 3 leve che controlli6. The 3 levers you control
Queste tre leve sono concrete, misurabili, e supportate dal codice. Domani il tuo prossimo post può girarci sopra.These three levers are concrete, measurable, and code-backed. Tomorrow's post can pivot on them.
Leva 1 — Dwell: scrivere per la sostaLever 1 — Dwell: write for the pause
Il dwell è il signal più potente che hai. Il codice lo misura in 4 canali distinti: dwell binario (sì/no), dwell continuo (quanti secondi), click-then-dwell (apre il post e si ferma), e not_dwelled (negativo, scrolla via).Dwell is the most powerful signal you have. The code measures it in 4 distinct channels: binary dwell (yes/no), continuous dwell (how many seconds), click-then-dwell (opens the post and lingers), and not_dwelled (negative, scrolls away).
Cosa funziona:What works:
- Long-form leggibile in-feed: thread sviluppati, post con paragrafi corti che invitano a scrollare verticalmente sul post.In-feed readable long-form: developed threads, posts with short paragraphs that invite vertical scrolling on the post itself.
- Screenshot densi di testo: costringono il viewer a zoomare, generano dwell-time.Text-dense screenshots: force the viewer to zoom in, generate dwell-time.
- Micro-stories con cliffhanger: la curiosity gap genera click-then-dwell.Micro-stories with cliffhangers: the curiosity gap drives click-then-dwell.
- Video con hook nei primi 3 secondi: supera il VQV threshold, accumula dwell-time.Videos with a hook in the first 3 seconds: clear the VQV threshold, accumulate dwell-time.
Leva 2 — Identità topicale: essere discoverableLever 2 — Topic identity: be discoverable
Cold-start passa attraverso PhoenixTopicsSource: una candidate source che pesca post da viewer affinità topic-based, non da social graph.Cold-start goes through PhoenixTopicsSource: a candidate source that pulls posts from topic-based viewer affinity, not from the social graph.
Se i tuoi post sono chiaramente identificabili in un topic (crypto, food, fitness, ML, ecc.), il sistema può piazzarti davanti a viewer che hanno affinità con quel topic, anche se non ti seguono. Ambiguo → invisibile.If your posts are clearly identifiable with a topic (crypto, food, fitness, ML, etc.), the system can place you in front of viewers with affinity for that topic, even if they don't follow you. Ambiguous → invisible.
Cosa funziona: posta sempre sullo stesso ambito per qualche mese. Costruisci una topic identity leggibile dal modello.What works: post consistently on the same topic for a few months. Build a topic identity the model can read.
Leva 3 — Densità community: battere i mega-accountLever 3 — Community density: beating mega-accounts
MutualFollowJaccard premia gruppi di follower che si seguono tra loro. Strategia: incoraggia connessioni laterali. RT account simili, retag persone del tuo ambito, collabora con micro-creator. Stai costruendo un cluster, non un broadcast.MutualFollowJaccard rewards groups of followers who follow each other. Strategy: encourage lateral connections. RT similar accounts, retag people in your space, collab with micro-creators. You're building a cluster, not a broadcast.
Sotto il cofano: i 4 canali dwell e la struttura ScoringWeightsUnder the hood: the 4 dwell channels and the ScoringWeights struct
I 4 canali dwell, mappati ai weight fields di ScoringWeights:The 4 dwell channels, mapped to ScoringWeights weight fields:
dwell_score(binary)(binary) →dwelldwell_time(continuo, secondi)(continuous, seconds) →cont_dwell_timeclick_dwell_time(continuo, post aperto)(continuous, post opened) →cont_click_dwell_timenot_dwelled_score(negativo)(negative) →not_dwelled
La struct ScoringWeights dichiara 22 pesi tunable in totale (15 positive + 2 continuous + 5 negative). Tutti i valori production sono [UNKNOWN]: l'OSS contiene le FS keys ma non il bundle.The ScoringWeights struct declares 22 tunable weights total (15 positive + 2 continuous + 5 negative). All production values are [UNKNOWN]: the OSS contains the FS keys but not the bundle.
Riferimento: home-mixer/scorers/ranking_scorer.rs:12-39Source: home-mixer/scorers/ranking_scorer.rs:12-39
7. Le 3 cose che non controlli (lascia andare)7. The 3 things you don't control (let them go)
Tre cose su cui hai zero leverage. Smetti di provare a hackarle. Concentra l'energia sulle leve della sezione precedente.Three things you have zero leverage over. Stop trying to hack them. Focus your energy on the levers from the previous section.
I 22 pesi productionThe 22 production weights
I valori esatti sono privati, FS-driven, A/B tested per cohort. Cambiano nel tempo. Non c'è "il vero W_fav" che puoi scoprire. Ottimizzare il P(fav) potrebbe aiutarti oggi e penalizzarti tra 6 mesi.Exact values are private, FS-driven, A/B-tested per cohort. They change over time. There's no "true W_fav" you can discover. Optimizing P(fav) might help you today and penalize you 6 months from now.
VMRanker (modello opaco)VMRanker (opaque model)
Quando attivo, Stage 3 può sovrascrivere completamente lo score calcolato da Stage 2. È un modello remoto, opaco, con DPP (diversity). Riceve un payload di 21 prediction heads (subset delle 22 di Phoenix). Ottimizzare per Phoenix non garantisce nulla se VMRanker decide diversamente.When active, Stage 3 can completely overwrite the score computed by Stage 2. It's a remote, opaque model with DPP (diversity). It receives a 21-prediction-head payload (subset of Phoenix's 22). Optimizing for Phoenix guarantees nothing if VMRanker decides otherwise.
Cohort targetingCohort targeting
FS keys segmentano gli utenti in cohort. Il "tuo" algoritmo può essere strutturalmente diverso da quello del tuo follower. Diverse scoring_sequence, diversi cluster Phoenix, diversi pesi A/B. Non puoi ottimizzare per un sistema che non vedi.FS keys segment users into cohorts. "Your" algorithm can be structurally different from your follower's. Different scoring_sequence, different Phoenix clusters, different A/B weights. You can't optimize for a system you can't see.
8. I miti da sfatare8. The myths to bust
Otto claim popolari su "come funziona l'algoritmo", confrontati uno per uno con il codice.Eight popular claims about "how the algorithm works", checked one by one against the code.
"Postare frequentemente dimezza la reach""Posting frequently halves reach"
Realtà: apply_author_diversity opera per-batch-per-viewer, non globalmente. Su viewer diversi con candidate batch freschi, appari 0-1 volte → nessuna attenuazione. Previene monopoly di un feed singolo, NON tassa il volume cross-viewer. ranking_scorer.rs:186-217Reality: apply_author_diversity operates per-batch-per-viewer, not globally. With different viewers and fresh candidate batches, you appear 0–1 times → no attenuation. It prevents monopoly of a single feed, it does NOT tax cross-viewer volume. ranking_scorer.rs:186-217
"P(fav) = num_fav / num_views, gli engagement count determinano il ranking""P(fav) = num_fav / num_views, engagement counts determine ranking"
Realtà: Phoenix è una rete neurale Two-Tower [INFERRED from architectural patterns]: (viewer_features, candidate_features) → predizioni viewer-specific, poi combinate via 22 ScoringWeights. Gli engagement count sono UN input dentro tweet_info features, uno di decine. Lo stesso post predice P(fav) diversa per ogni viewer.Reality: Phoenix is a Two-Tower neural net [INFERRED from architectural patterns]: (viewer_features, candidate_features) → viewer-specific predictions, then combined via 22 ScoringWeights. Engagement counts are ONE input inside tweet_info features, one of dozens. The same post predicts a different P(fav) for each viewer.
"Reply vale 150× un like / Bookmark vale 10× / Repost vale 20×""Reply = 150× a like / Bookmark = 10× / Repost = 20×"
Realtà: il demo Python pubblico (phoenix/run_pipeline.py:355-360) usa 1·fav + 0.5·reply + 0.3·repost + 0.2·dwell. Production usa 22 pesi FS-driven completamente diversi e tutti [UNKNOWN]. Inoltre non esiste un termine bookmark nelle 22 ScoringWeights: letteralmente zero peso bookmark nello scorer.Reality: the public Python demo (phoenix/run_pipeline.py:355-360) uses 1·fav + 0.5·reply + 0.3·repost + 0.2·dwell. Production uses 22 FS-driven weights, completely different and all [UNKNOWN]. Plus there is no bookmark term in the 22 ScoringWeights: literally zero bookmark weight in the scorer.
"Il dwell è underutilized / il dwell non conta tanto""Dwell is underutilized / dwell doesn't count much"
Realtà: il dwell è il signal più instrumentato dello scorer: 4 canali distinti (binary, continuous, click-then-dwell, not_dwelled negativo). Le reply ne hanno 1. Nessun altro signal ha più di 2 canali.Reality: dwell is the most-instrumented signal in the scorer: 4 distinct channels (binary, continuous, click-then-dwell, negative not_dwelled). Replies have 1. No other signal has more than 2.
"Phoenix è UN modello / Optimize for Phoenix = optimize for retrieval""Phoenix is ONE model / Optimize for Phoenix = optimize for retrieval"
Realtà: Phoenix è una famiglia di modelli. PhoenixScorer chiama il Phoenix Ranker. I 3 source PhoenixSource/PhoenixTopicsSource/PhoenixMOESource chiamano Phoenix Retrieval: modelli diversi con cluster ID separati. New-user routing usa un cluster Ranker SEPARATO. Stessa parola, modelli distinti.Reality: Phoenix is a family of models. PhoenixScorer calls the Phoenix Ranker. The 3 sources PhoenixSource/PhoenixTopicsSource/PhoenixMOESource call Phoenix Retrieval: different models with separate cluster IDs. New-user routing uses a SEPARATE Ranker cluster. Same word, distinct models.
"SimClusters / 145k clusters è come funziona oggi il retrieval""SimClusters / 145k clusters is how retrieval works today"
Realtà: la production stack 2026 è migrata a Two-Tower dense embeddings (PhoenixSource/TopicsSource/MOESource). SimClusters/TwHIN sopravvive come legacy fallback dentro TweetMixerSource, ma non è più il primary retrieval signal. Citare 145k clusters significa descrivere la versione 2021-2023, non quella corrente.Reality: the 2026 production stack moved to Two-Tower dense embeddings (PhoenixSource/TopicsSource/MOESource). SimClusters/TwHIN survives as a legacy fallback inside TweetMixerSource, but is no longer the primary retrieval signal. Citing 145k clusters describes the 2021-2023 era, not the current system.
"I primi 30 minuti 'lockano' la distribuzione""The first 30 minutes 'lock' distribution"
Realtà: nessun timer 30-min esiste nell'OSS. C'è un cap di freshness, POST_AGE_MAX_MINUTES = 4800 (80 ore), dopo il quale il post non è più eligible per Phoenix retrieval. Ma "locks at 30 min" è inventato.Reality: no 30-min timer exists in the OSS. There's a freshness cap, POST_AGE_MAX_MINUTES = 4800 (80 hours), after which the post is no longer eligible for Phoenix retrieval. But "locks at 30 min" is invented.
"1 report uccide il post""1 report kills the post"
Realtà: il negative feedback è bounded. Branch B di offset_score mappa a [0, OFFSET × neg/total): il damage non scende sotto 0. Però il cliff è asimmetrico: il primo signal che ti flippa a net-negative è disproportionately costoso.Reality: negative feedback is bounded. Branch B of offset_score maps to [0, OFFSET × neg/total): damage doesn't drop below 0. However, the cliff is asymmetric: the first signal that flips you to net-negative is disproportionately costly.
9. Esperimento interattivo (opzionale)9. Interactive experiment (optional)
Se vuoi sentire al tatto come si muove lo score, gioca con queste manopole. Cinque probabilità (delle 22 di Phoenix, selezionate per chiarezza) e cinque pesi [UNKNOWN] a valori plausibili. I risultati si ricalcolano live.If you want a feel for how the score moves, play with these knobs. Five probabilities (of Phoenix's 22, selected for clarity) and five [UNKNOWN] weights at plausible values. Results recompute live.
Calcola il tuo scoreCompute your score
P(fav) × W_fav+2.00P(reply) × W_reply+0.25P(dwell) × W_dwell+4.80P(not_dwelled) × W_not_dwelled-1.20P(not_interest) × W_not_interested-0.40combined+5.45Disclaimer: i pesi production sono [UNKNOWN]. Questo sandbox usa valori plausibili per dimostrare la forma della funzione di scoring, non i numeri reali. Inoltre, quando attivo, VMRanker può sovrascrivere wholesale questo output.Disclaimer: production weights are [UNKNOWN]. This sandbox uses plausible values to demonstrate the shape of the scoring function, not the real numbers. Also: when active, VMRanker can wholesale overwrite this output.
10. Glossario essenziale10. Essential glossary
FS — Feature SwitchFS — Feature Switch
Sistema di config interno a X. Permette di abilitare/disabilitare feature e cambiare valori (pesi, threshold) per cohort di utenti senza redeployare il codice. Strumento principale degli A/B test.X's internal config system. Lets them enable/disable features and change values (weights, thresholds) per cohort of users without redeploying code. The main A/B test tool.
VQV — Video Quality ViewVQV — Video Quality View
Signal che misura una "view qualificata" di un video (durata sopra threshold). Sotto MinVideoDurationMs il VQV weight viene azzerato: i video brevissimi perdono questo signal.Signal that measures a "qualified view" of a video (duration above threshold). Below MinVideoDurationMs the VQV weight goes to zero: very short videos lose this signal.
OON — Out-of-NetworkOON — Out-of-Network
Candidato il cui autore non è seguito dal viewer. Riceve un multiplier dedicato (OON factor), tipicamente <1, quindi penalty rispetto agli in-network. Strategia X di esplorazione: limitata ma presente.A candidate whose author the viewer does not follow. Gets a dedicated multiplier (OON factor), typically <1, so a penalty vs. in-network. X's exploration strategy: limited but present.
DPP — Determinantal Point ProcessDPP — Determinantal Point Process
Tecnica usata da VMRanker per bilanciare quality × diversity nel feed finale. Evita feed che sembrano "monotematici". Modello opaco, può sovrascrivere wholesale lo score di RankingScorer.Technique used by VMRanker to balance quality × diversity in the final feed. Avoids feeds that look "single-topic". Opaque model, can wholesale overwrite RankingScorer's output.
Phoenix Ranker vs Phoenix RetrievalPhoenix Ranker vs Phoenix Retrieval
Due famiglie di modelli che condividono il nome ma fanno cose diverse. Retrieval pesca candidati da grandi pool (chiamato da PhoenixSource/TopicsSource/MOESource). Ranker li scorea uno per uno (chiamato da PhoenixScorer). Cluster ID separati. Modelli separati.Two model families that share the name but do different things. Retrieval pulls candidates from large pools (called by PhoenixSource/TopicsSource/MOESource). Ranker scores them one by one (called by PhoenixScorer). Separate cluster IDs. Separate models.
MutualFollowJaccardMutualFollowJaccard
Hydrator che calcola la "densità community" tra autore e viewer via MinHash (256 hash). Premia overlap denso di mutual-follows. Penalizza account con follower sparsi.Hydrator that computes the "community density" between author and viewer via MinHash (256 hashes). Rewards dense mutual-follow overlap. Penalizes accounts with scattered followers.
PTOS — Post Trust & SafetyPTOS — Post Trust & Safety
Sistema di classificazione safety (powered by Grok). Ogni nuovo post nasce MediumRisk finché non viene PTOS_REVIEWED. Asincrono: il post entra in pipeline prima della revisione completa.Safety classification system (powered by Grok). Every new post starts as MediumRisk until it gets PTOS_REVIEWED. Asynchronous: the post enters the pipeline before full review.
11. Fonti & metodo11. Sources & method
Repository: xai-org/x-algorithm @ commit e414c17.
Source-of-truth locale: ~/code/x-algorithm/.
Date studio: 15-18 maggio 2026.Repository: xai-org/x-algorithm @ commit e414c17.
Local source-of-truth: ~/code/x-algorithm/.
Study dates: May 15-18, 2026.
File chiave lettiKey files read
home-mixer/scorers/ranking_scorer.rs(struct ScoringWeights 22 fields, offset_score 3 branches, author_diversity, OON multiplier)(ScoringWeights struct 22 fields, offset_score 3 branches, author_diversity, OON multiplier)home-mixer/scorers/phoenix_scorer.rs(enable gating, gRPC call, write phoenix_scores)(enable gating, gRPC call, write phoenix_scores)home-mixer/scorers/vm_ranker.rs(FS gating, 21-field payload subset, wholesale override)(FS gating, 21-field payload subset, wholesale override)home-mixer/phoenix_candidate_pipeline.rs(10-stage pipeline order)(10-stage pipeline order)home-mixer/hydrators/mutual_follow_jaccard_hydrator.rs(MIN_HASHES=256)(MIN_HASHES=256)brand_safety.rs(PTOS cutoff, classification states)(PTOS cutoff, classification states)phoenix/recsys_model.py(POST_AGE_MAX_MINUTES=4800)(POST_AGE_MAX_MINUTES=4800)phoenix/run_pipeline.py(demo scorer 4-term Python)(4-term Python demo scorer)
DisclaimerDisclaimer
I valori numerici dei 22 pesi production sono [UNKNOWN]: l'OSS contiene le FS keys ma non il bundle valori. Le claim marcate [INFERRED] sono ragionamenti strutturali su mechanism osservabili (es. l'architettura Two-Tower è desunta dalla struttura dei candidate sources, non da una citazione diretta). Le claim [external] riguardano modelli/servizi remoti non visibili nel codebase home-mixer (es. il modello VMRanker, il Phoenix Ranker effettivo).The numeric values of the 22 production weights are [UNKNOWN]: the OSS contains the FS keys but not the value bundle. Claims marked [INFERRED] are structural reasonings about observable mechanisms (e.g. the Two-Tower architecture is inferred from the candidate-source structure, not from a direct citation). [external] claims concern remote models/services not visible in the home-mixer codebase (e.g. the VMRanker model, the actual Phoenix Ranker).