0x00 한

Research / Daily reports

  • Sources read: 2
  • Canon files updated: 2 (services/x.md, services/netflix.md)
  • Radar entries: 0
In one lineX's ranking model Phoenix switched its training from Adam to the Muon optimizer. This is the first case where the code confirms Muon adoption in a production recsys training pipeline that this repository has tracked.

Other changes reviewed today:

  • In the same X commit, Phoenix expanded to search ranking, and the Phoenix proto gained a reward head and a link-open probability 5-quantile head.
  • The same commit also includes a Following-only filter, a dial that sends 10% of live traffic to Grok 4.6, shadow mirroring for impression verdicts, and the promotion of four flags to train-default ON.
  • Netflix published a paper with production results on personalizing artwork with a CLIP two-tower and video previews with its own tri-modal model, MediaFM.

1Phoenix's training optimizer changed from Adam to Muon — X

Source xai-org/x-algorithm @ aad7179 — "Open-source X Recommendation Algorithm" — 2026-08-19 21:25 UTC, public source code. These notes number the X commits after the Gen4 release in sequence, and this commit is Gen4+4. It touches 79 files with +3,303/−651, 5.6× the 14 files of Gen4+3 (8/18), and its character changed from the "small-scale refinement" that ran from Gen4+1 through +3 to a large expansion of infrastructure and the training pipeline. Notably, the README's #latest-updates section still lists the August 14th entry from 8/14 as the latest; this commit's changes were reflected only in code, without a documentation update.

Background This repository has tracked follow-up commits daily since the very large Gen4 release (2026-08-13, 47c1bcd). The canon (this repository's canon documents) has observed this flow with a "daily commit" cadence.

  • On 8/14 (c65aa17, Gen4+1), we confirmed the weight interpretation rules, the Brazil filter, Thompson sampling, and three Phoenix bools.
  • On 8/17 (b089ce6, Gen4+2), we confirmed ads safety V2, cross-validation, and the indexing gate.
  • On 8/18 (11a71f8, Gen4+3), we confirmed the redesign of the V2 helper within a day, the Following VF hydrator, and Phoenix Kafka v3.
    • VF (visibility-filtering) is a service that decides, for each post, whether it may be shown to this viewer.

This commit, which came out the day after Gen4+3 (8/19), is a large expansion that goes beyond follow-up small cleanups in both scale (79 files, +3.3k lines) and character. The commit's scale is 79 files with +3,303/−651. Compared with Gen4+3 (14 files, +208/−70), the file count is 5.6× and the number of changed lines is about 14×. In character, it includes a major overhaul of the training pipeline, an expansion of the retrieval surface, and a safety-infrastructure shadow setup.

The Muon optimizer is a dense-parameter optimizer proposed by Keller Jordan et al. in 2024. Unlike the existing momentum-Adam family, it approximately orthogonalizes the gradient momentum with Newton-Schulz iteration. It has been adopted in large-scale LLM training such as Kimi K2 and Moonshot, and a hybrid setup that still uses Adam for embeddings, norms, and logits is standard. That this is the first case where the code confirms Muon adoption among the production recsys training pipelines this repository has tracked is the most important signal in today's sources.

What we learned

(1) Phoenix's dense-parameter optimizer changed from Adam to Muon

Phoenix training moved the dense parameters to Muon, which uses Newton-Schulz orthogonalization, and became a hybrid that leaves embedding, logits, and norm on Adam. Two files were newly added.

  • A new optimizer implementation was added as a 240-line file verified — phoenix/xrex/optimizers/recsys/muon.py.
    • It is a thin adapter around orthogonalize_via_newton_schulz and MuonDimensionNumbers from optax.contrib._muon.
    • It performs labeling and masking to fit the xrex parameter tree.
  • A 47-line file that exposes this optimizer through config was also added verified — phoenix/xrex/optimizers/recsys/dense_optim.py.

The core pattern of the hybrid is that only matrix-shaped parameters are handled by Muon, while parameters matching the name patterns below stay on Adam.

muon_adam_patterns: str = "embed,_emb,logits,vocab,norm,table"

— phoenix/xrex/optimizers/recsys/dense_optim.py:14

That is, the embedding table, the output logits head, vocab, and layernorm/rmsnorm stay on Adam, and only the attention and FFN weight matrices in the Transformer body are trained with Muon. This matches the standard pattern used by Keller Jordan's 2024 original and the Kimi K2 family.

The optim-related values in the default config _home_direct_packed_base() were replaced across the board verified — phoenix/xrex/configs/xrecsys.py:302-330.

"optim_config": RecsysDenseOptimConfig(
    optim="muon",
    muon_consistent_rms=0.2,
    muon_matrix_weight_decay=0.014,
    muon_split_fused="qkv:128",
    adam_embedding_weight_decay=0.014,
    b1=0.95,
    b2=0.98,
),

— phoenix/xrex/configs/xrecsys.py:309-317

Side by side with the previous values, the changed values are as follows:

Parameter Gen3~Gen4+3 Gen4+4 (aad7179)
optim Adam (default) "muon"
learning_rate (dense) 1e-3 7.1e-4
emb_learning_rate 0.2 (stated explicitly in config) (moved to the embedding config)
muon_consistent_rms — 0.2
muon_matrix_weight_decay — 0.014
muon_split_fused — "qkv:128" (splits the fused QKV projection into 128-dim blocks and orthogonalizes each)
adam_embedding_weight_decay — 0.014
b1, b2 — 0.95, 0.98
embedding optim rowwise_adagrad (LR 0.2) RecsysRowwiseAdagradConfig(learning_rate=0.28, half_life_steps=2500, lazy_decay=True, weight_decay=2.8e-4)

The GB300 override also adopted Muon in the same direction. The settings are LR 5e-4, half_life_steps=5000, and weight_decay=0.01.

  • muon_split_fused="qkv:128" means that the output axis of the fused QKV projection is cut into 128-dim blocks, and each block is treated as an independent unit of orthogonalization.

    • scale_by_muon_shaped recomputes dim_nums per block and runs Newton-Schulz in parallel.
    if block is not None and x.shape[-1] > block:
        n_blocks = x.shape[-1] // block
        xs = x.reshape(x.shape[:-1] + (n_blocks, block))
        dn = optax_contrib.MuonDimensionNumbers(reduction_axis=-3, output_axis=-1)
        o = orthogonalize_via_newton_schulz(xs, ns_coeffs, ns_steps, preconditioning, 1e-8, dn)
    

    — phoenix/xrex/optimizers/recsys/muon.py:135-141

  • The muon_consistent_rms=0.2 option applies a sqrt(max(fan_in, fan_out)) × consistent_rms scale to the Muon update, which is a control value that keeps the update magnitude consistent across layers.

    • It is also a stabilization parameter that can be used in place of the original Muon's fan-in/fan-out scaling.

Why it matters A new observation item appeared: Muon, an optimizer established in LLM training, has moved over to ranker and retrieval training. It is the first case where the code confirms Muon adoption among the production recsys training pipelines this repository has tracked (Netflix FM, Meta HSTU/GEM, Kuaishou OneRec, etc.), so it is the first item to cover among today's sources. Whether other companies follow needs to be checked over the next 3–6 months.

(2) Phoenix expanded to search ranking, and a search-specific training config was added

Phoenix expanded to search ranking. xrecsys_search was added alongside xrecsys, the For You feed training config verified — phoenix/xrex/configs/xrecsys.py:435-473. The new config xrecsys_search has its own vocab along with use_product_surface and condition_search_relevance_on_prompt. The main differences are as follows:

  • The vocab was expanded substantially. It is much larger than the For You config's vocab, because the search query and click corpus has greater diversity of users and items and so needs a wider vocab.
    • The values are user_vocab_size=100_000_000, item_vocab_size=100_000_000, author_vocab_size=30_000_000, and ip_vocab_size=10_000_000.
  • The architecture is a GQA setup with fewer KV heads than query heads.
    • The values are num_layers=8, emb_size=2560, emb_table_width=1024, query_heads=20, kv_heads=4 (GQA), history_seq_len=1022, and candidate_seq_len=64.
  • In the distributed setup, expert-parallel is 512, so the EP axis is much larger than in the For You base config, and therefore MoE routing in the search config is also much larger.
    • The values are ep=512, dp=2, fsdp=1, and tp=1.
  • Search-specific flags were added.
    • use_product_surface=True turns on product-surface conditioning.
    • output_vocab_size=128 expands actions to 128 kinds.
    • The rest are condition_search_relevance_on_prompt=True, use_dense_action_table=True, and metric_group="search".
  • For the training signal, a separate group is set with group_id="user_action_sequence_xrecsys", and log_q_correction=True is turned on.
"xrecsys_search": _make_cfg(
    {
        "history_seq_len": 1022,
        "candidate_seq_len": 64,
        ...
        "num_layers": 8,
        "emb_size": 2560,
        "emb_table_width": 1024,
        "query_heads": 20,
        "kv_heads": 4,
        ...
        "ep": 512,
        "fsdp": 1,
        "dp": 2,
        ...
        "use_product_surface": True,
        "output_vocab_size": 128,
        "metric_group": "search",
        "use_dense_action_table": True,
        "condition_search_relevance_on_prompt": True,
    },
    user_vocab_size=100_000_000,
    item_vocab_size=100_000_000,
    author_vocab_size=30_000_000,
    ip_vocab_size=10_000_000,
),

— phoenix/xrex/configs/xrecsys.py:436-472

This config pairs with two new action enums in the proto. Two CLIENT_TWEET_(NOT_)RELEVANT_TO_SEARCH actions were defined in the proto with new numbers.

  • The new numbers are CLIENT_TWEET_RELEVANT_TO_SEARCH = 105 and CLIENT_TWEET_NOT_RELEVANT_TO_SEARCH = 106.

  • The existing slots 161 and 162 remain as *_DEPRECATED.

    CLIENT_TWEET_RELEVANT_TO_SEARCH_DEPRECATED = 161;
    CLIENT_TWEET_NOT_RELEVANT_TO_SEARCH_DEPRECATED = 162;
    

    — phoenix/crates/serving/xai-recsys-proto/proto/recsys.proto:379-380

Why it matters We newly confirmed that consolidation is under way toward the same Phoenix Transformer architecture serving both search and feed by swapping only the per-surface config. Until now, the canon understood each surface (For You, Following, search) as a separate codebase. This consolidation goes in the same direction as the "single contextual ranker for search, pre-query, and More Like This" put forward by Netflix UniCoRn (2024) and the "single scorer based on verbalization" of GenRec (2026). Which surfaces X attaches here (tweet search, user search, media search) and when it reaches production deployment are the next points to check.

The Phoenix proto defined a reward head and a link-open probability 5-quantile head. Phoenix's prediction output schema expanded in two directions verified — phoenix/crates/serving/xai-recsys-proto/proto/recsys.proto.

(a) The RewardOutputs message was introduced. A RewardOutputs rewardOutputs = 8 field was added to NextActionDistribution.

message RewardOutputs {
  repeated float values = 1;
  repeated float policyLogits = 2;
}

— recsys.proto:229-234

ScoreInfo also gained a new rewardRerankSlotProb field, declared as optional double rewardRerankSlotProb = 5. In other words, scaffolding is in place for Phoenix to emit a reward value head and a policy logits head alongside its 24 probability prediction heads. An actor-critic keeps a value and a policy together. It appears intended for an actor-critic approach or for reward-model-guided re-ranking slate decisions, but the field is not yet connected to any scorer inferred (it is only defined in the proto, and this commit contains no code in home-mixer/scorers/ that consumes it).

(b) A link-open probability quintile head was added. Names were assigned to each of the five slots PLACE_HOLDER_167/168/169/170/253.

P_OPEN_LINK_P10 = 167;
P_OPEN_LINK_P25 = 168;
P_OPEN_LINK_P50 = 169;
P_OPEN_LINK_P75 = 170;
...
P_OPEN_LINK_P90 = 253;

— recsys.proto:385-388, 442

This means the link-open probability is predicted not as a single scalar but as a distribution made of five quantiles. Until now, X's prediction heads were single probabilities or scalars, so this head is the first case of an approach that predicts a distribution shape being introduced in the ranker. Whether it is actually quantile regression or a categorical mixture head must be confirmed by a deep dive into recsys_model.py. That file was heavily reworked at +265/−25.

(c) Seven SID (semantic ID) fields were added to SlateContext. sidKnown, sidK1/2/3, and sidGap1/2/3 are new. At the proto level, these fields match the SID fields connected to VMRanker in Gen4+3 (8/18). An SID is an ID that represents a post as a sequence of codewords from coarse to fine layers. VMRanker is a slate reordering service.

What we learnedOther changes

  • A Following-pipeline-only muted-keyword filter and a quoted text hydrator were added. This change continues the Following pipeline hardening.
    • FollowingViewerMutedKeywordFilter (65 new lines) matches against quoted text and ancestors as well.
    • QuotedPostTextHydrator (106 new lines) fetches quoted text from TES.
    • TES (Tweet Entity Service) is X's internal tweet metadata lookup service.
  • Added a Grok 4.6 internal 10% dial to grox PTOS, which began sending 10% of calls to 4.6 instead of 4.5 in child-safety cross-validation and deluxe 4.3 category reclassification verified — grox/flows/ptos/classifier.py:276-300.
    • The 4.6 response is parsed with self._parse_policy(raw) exactly like 4.5's and used in the verdict. It is a gradual rollout that splits live traffic, not a shadow that discards the results (L281-290, L477-482).
    • grox is a Grok-based nearline annotation pipeline. PTOS is the layer in the grox safety pipeline that judges violation categories on a policy basis.
    • The dial is _GROK_4_6_INTERNAL_DIAL = 0.1 in grox PTOS classifier.py.
    • prior_nsfw.py (34 new lines) separates the Manhattan lookup cache.
  • An env-gated shadow deployment mirroring infrastructure was set up in VF.
    • The setup code is visibility-filtering/dark_traffic_setup.rs (109 new lines).
    • The shadow deployment name is xai-vf-shadow.prod.visibility.
  • In the Phoenix default config, three bools and the engagement counts flag were promoted to train-default ON.
    • The default config is _home_direct_packed_base().
    • The three bools are enable_stale_post, enable_is_author_followed_by_viewer, and enable_is_author_following_viewer, whose values began to be filled in Gen4+1 (8/14).
    • The engagement counts flag is enable_engagement_counts.

Canon update services/x.md was revised as follows:

  • Added a Gen4+4 (aad7179, 2026-08-19) row to the generation table.
  • The one-line summary covers 8 items: Muon, xrecsys_search, RewardOutputs, link-open 5-quantile, Following filter, Grok 4.6 dial, dark_traffic, and the train-default promotion.
  • Greatly expanded the "Phoenix training and index" section and created 3 new subsections. The subsections are "Gen4+4 Phoenix dense-parameter optimizer switch from Adam → Muon", "Phoenix expanded to search ranking", and "New reward head + link-open 5-quantile head in Phoenix proto".
  • Added a train-default ON promotion item below the bool feature table.
  • Added a subsection "Gen4+4 new — Following-pipeline-only muted-keyword filter + quoted-text hydrator" to the filter section.
  • Added a subsection "Gen4+4 Grok 4.6 internal 10% traffic dial + NSFW reclassification skip cache" to the Grox → PtOS section.
  • Introduced "Gen4+4 visibility-filtering shadow deployment (xai-vf-shadow) wiring" in the safety section.
  • Introduced a "Resolved by the Gen4+4 release" subsection in the open questions section, summarizing eight resolved items and six that need a deep dive.
  • Added 10 links to files related to aad7179 in the sources section.

Why it matters The character of the follow-up commits that have continued for three days in a row from 8/17 changed substantially today. From 8/14 through 8/18 (Gen4+1 through +3), the commits were "small daily refinements," such as brand safety wording adjustments, new filters, hydrator branching, and flow unification. Gen4+4 expanded substantively along the following three axes:

  • Overhauled the training pipeline (Muon).
  • Expanded the retrieval surface (search).
  • Introduced safety infrastructure (dark traffic).

The next four points about Phoenix are new axes that were not in what the canon understood from Gen3 through Gen4+3:

  • Phoenix is trained with Muon, an LLM optimizer.
  • Phoenix also covers the search surface.
  • Phoenix has a reward head.
  • Phoenix predicts link-click probability as a distribution.

In particular, the Muon adoption is the first case confirmed in code among the large-scale production recsys training pipelines this repository has tracked. It is also the first data point for the observation that an optimizer that started in LLM training is spreading to ranker and retrieval training, so topics/sequence-transformer-ranking.md gains one new axis to check. The search-surface expansion is a candidate for the second company statement following the "single search and recommendation ranker" trend pioneered by Netflix UniCoRn and GenRec, so the next commits should show whether production deployment is confirmed. Muon adoption and the Phoenix search expansion are the first two facts confirmed in the large-scale production recsys training pipelines this repository has tracked, so we marked them as deep-dive targets.

2Artwork and preview personalization moved to CLIP two-tower and MediaFM — Netflix

Source Multimedia Asset Personalization via Multimodal Embeddings at Netflix (arXiv 2608.18322) — arXiv, submitted 2026-08-18, paper. All eight authors are affiliated with Netflix. The authors are Emma Yanyang Kong, Aditya Deshpande, Bowei Yan, Asad Abbasi, Santiago Castro, Avneesh Saluja, David Fagnan, and Ashish Rastogi, and the affiliations were confirmed from the title and affiliation listing.

Background Since the full-deployment statement in a blog post in 2017, the canon has kept Netflix's artwork personalization at the level of a one-line mention under "re-ranking and diversity", without major updates. The 2017 bandit approach used a separate model per canvas, so it trained and served differently for each of five canvases (billboard / vertical box / horizontal panel / short panel / landscape panel). Also, the content of the image itself was handled outside the model, so cold start for new titles and assets was fundamentally difficult. This paper is the first source to formalize, with quantitative A/B figures, that the 2017 architecture changed generations to a CLIP-based unified two-tower and MediaFM, Netflix's own tri-modal foundation model.

The new concepts are as follows:

  • CLIP is a vision-language model OpenAI released in 2021. It maps images and text into the same embedding space, which enabled zero-shot image classification and search. Here the 768-dimensional embeddings produced by pretraining the image encoder are reused as they are.
  • A two-tower model is a retrieval/ranking architecture in which a user tower and an item tower each produce a representation and a dot product gives the matching score. In this paper, the CLIP image embedding is concatenated to the item tower.
  • SeqCLIP is a CLIP-style frame sequence encoder. It processes the shots of a video preview in order and produces a visual representation per shot.
  • wav2vec 2.0 is a self-supervised speech representation learning model (Facebook, 2020). Here it handles the representation of the audio track of a preview shot.
  • text-embedding-3-large is a text embedding model OpenAI released in 2024. Here it processes the timed-text of a shot. Timed-text is text in which subtitles and dialogue carry timestamps.
  • Masked Shot Modeling is a self-supervised objective that moves BERT's Masked Language Modeling to the shot level. It masks 20% of the shots and reconstructs them with a cosine distance loss.
  • IPS (Inverse Propensity Scoring) lift is an offline metric often used in off-policy evaluation. It estimates the counterfactual performance of a new model from logged random impression data.

What we learned

The CLIP-based unified two-tower merged five canvases into a single model

Five per-canvas models were unified into a single two-tower that concatenates the CLIP image embedding (768-d) into the item tower verified §3.

  • Training is reward-weighted. Per-canvas training examples are balanced by reward weights so that training does not skew toward a particular canvas.
  • On cold start, new titles and assets can be served on "day zero" from the CLIP embedding alone, without interaction history. This removes a fundamental limitation of ID-only models.

"Augmenting a two-tower model with CLIP image embeddings lets a single model serve all five Netflix artwork canvas types, replacing five separately trained per-canvas models and substantially improving cold-start performance." — arXiv 2608.18322 abstract

There are four online A/B results:

  • The core discovery metric rose by +0.127% in relative terms (p<0.005) verified §5.1.
  • Compared with the Eclipse UI holdback, discovery rose +0.233% and streaming hours rose +0.184% verified §5.1.
    • A holdback is a comparison group left without the change applied.
  • The authors estimate that ≈350M streaming hours are added per year verified §5.1.
  • By reusing CLIP's joint text-image space, query-aware artwork was applied to the search canvas, and playthrough rate rose +0.36% (p<0.05) verified §5.1.

MediaFM is a tri-modal foundation model that Netflix trained in-house

  • MediaFM is an in-house tri-modal FM for video preview personalization verified §4.
    • It uses three modalities, visual, audio and timed-text, handled by SeqCLIP, wav2vec 2.0 and text-embedding-3-large respectively.
    • For each shot, it concatenates them into a 2,304-d unit-normed vector.
    • The encoder is a BERT-style 3-layer / 8-head transformer.
    • It performs self-supervised pretraining with Masked Shot Modeling (20% of shots are masked) and a cosine distance loss.
    • The preview representation is obtained by mean-pooling the contextualized shot embeddings.
    • The training corpus is a large-scale shot corpus drawn from the Netflix show catalog. The exact scale is not public.
    • It is applied to video preview personalization on all device platforms. Previews are 30–90 seconds long.
    • The gain is largest on TV UI surfaces.

"MediaFM, our in-house tri-modal foundation model trained on a large-scale corpus of shots from the Netflix show catalog, fusing visual (SeqCLIP), audio (wav2vec 2.0), and timed-text signals; adopted for video preview personalization, it outperforms strong visual-only baselines both offline and in online A/B tests." — arXiv 2608.18322 abstract

  • In the online A/B test, the streaming metric rose by a relative +0.193% (p<0.02) verified §5.2.
  • The offline IPS lift is 0.380% verified §5.2.
  • Both offline and online results confirmed that the tri-modal model beats the visual-only baseline verified §5.2.
    • In other words, the gain only holds when all three modalities are attached.

New MediaFM checkpoints are gated by an offline proxy task

Netflix deployed a new offline proxy called Popularity-Based Winner to gate the release of MediaFM checkpoints verified §5.4.

  • The proxy predicts "which asset would have won if it had been shown under an unpersonalized, uniform serving policy", taking only the asset content embedding as input.
    • The approach is linear probe binary classification. A linear probe measures representation quality by training only a linear classifier on top of fixed embeddings.
  • The proxy is useful because it can rank embedding quality without end-to-end integration or an A/B test.
    • A correlation with online results was also observed. The ranking by probe accuracy matched the ranking by offline IPS and by online A/B results across all three signals.
  • MediaFM's probe accuracy is +25.90 percentage points higher than picking at random.
    • SeqCLIP alone is +18.75 pp.
    • The tri-modal uplift reproduces on the shot-level proxy as well.
  • Every new MediaFM checkpoint is gated by this proxy. Only after the candidate space is pruned does it move on to an A/B test.
    • This is a case where Netflix partly worked around its long-standing problem, that offline metrics do not predict A/B results, with a single task that addresses only embedding quality.

The Netflix Embedding Store caches in three tiers at the platform layer

The Netflix Embedding Store caches in three tiers at the platform layer verified §4.3.

  1. Content embeddings are precomputed at the moment an asset enters the catalog (ingestion time).
  2. Item-tower projections are cached per asset.
  3. Daily materialization precomputes the top roughly 500 titles per profile.

This three-tier caching enables low-latency serving and cheap screening at the same time. As the netflix.md candidate generation section notes, producing member embeddings in batch was already in production in the FM era. FM is Netflix's foundation model, trained by turning a member's interaction history into a token sequence. MediaFM established the item-side embedding pipeline in the same way. It is the counterpart of the member side.

Canon update We revised services/netflix.md as follows.

  • We updated the artwork line in the re-ranking, diversity and filter section to state explicitly that the generation changed from the 2017 bandit to the 2026 MediaFM.
  • We introduced the section "Artwork and video preview personalization — MediaFM tri-modal FM (2026-08 production)". Its five subsections cover the CLIP-based unified two-tower, the MediaFM tri-modal FM, the Popularity-Based Winner offline proxy, the Netflix Embedding Store infrastructure, and the implications.
  • We changed the last updated date to 2026-08-21.
  • We added the arXiv 2608.18322 entry to the sources section.

Why it matters This paper established the artwork personalization axis as a separate production system. Until now, the canon covered artwork personalization only with a one-line mention under "re-ranking and diversity", because there had been no major update since the 2017 bandit. Four things changed.

  1. The architecture was unified from per-canvas models into a single model (from 5 to 1).
  2. The modality expanded from visual only to tri-modal, and the uplift from audio and timed-text was quantitatively verified.
  3. The place that handles cold start moved from inside the ranker to pretrained embeddings (day-zero CLIP embeddings).
  4. Offline gating was built into the production process as a precondition for A/B tests (popularity-based winner).

This can be seen as the item-side counterpart of Netflix's ongoing effort to "centralize member representations with FM". FM (2025) handles members and MediaFM (2026) handles items. The two embeddings are being combined into a common substructure for the ranker, retrieval, artwork and previews. In effect, Netflix has released its four-part FM stack, Foundation Model, GenRec, MediaFM and GenPage, in both code and papers. Item centralization, the axis that corresponds to member centralization, is now folded into this repository's canon as well.

What to check next