- Sources read: 4
- Canon files updated: 2 (services/x.md, radar.md)
- Radar entries: 3
- No new sources for Meta and Netflix
Other changes reviewed today:
- In the same commit, X added a HighRisk tier to the ads brand safety verdict and widened the Grok judge for policy-violation verdicts to three categories.
- In the arXiv cs.IR triage, three items passed to the radar: VK HEGM, Ant Densing Law, and a Spotify reasoning-trace experiment.
- In the Spotify experiment, reasoning traces cut offline recommendation performance by up to 19%.
1A mechanism to validate the visibility verdict rewrite on production traffic is complete — X
Source xai-org/x-algorithm@d011592 — xai-org public repository, committed 2026-08-24T18:51:34Z, code. These notes number the X commits after the Gen4 release in order, and this commit is Gen4+7. The change size is 19 files, +1,418/−117. The commit message is a single line, "Open-source X Recommendation Algorithm", as is the convention in this series, so the content was read only from the file diffs. The 01:00 KST batch on Tuesday, August 25 missed the 08-24 18:51 UTC commit, and the August 24 daily also judged it "nothing new", so the August 26 batch catches up late.
Background Since the first release on 2026-08-13 (47c1bcd, +363,246/−11,640), the Gen4 open-source release of the X For You timeline has received follow-up commits every day or every other day. This commit (Gen4+7, d011592) touched three broad areas.
- VF (visibility-filtering) is the safety filter stack that decides, for each post, whether it may be shown to this viewer. It was released in full in the initial Gen4 release.
- The brand safety verdict in home-mixer (the service that assembles the For You feed) handles ad adjacency gating.
- The PTOS (policy-based violation category verdict) pipeline re-classifies violation categories with a Grok LLM. This pipeline lives in grox (the Grok-based nearline classifier).
The three areas are maturing in different directions, and all of them evolved side by side in this commit. This commit also includes a checkpoint loader change for Phoenix (the X For You ranking model) and three small changes in grox.
1-1. Staging VF compares verdicts against the reference VF on every request and logs only when they differ
The stack that validates the VF rewrite with production traffic now has three stages with this commit verified. The VF deployed to staging also calls the reference VF on each request, compares verdicts strictly, and keeps only the cases where the results differ.
VF is the sub-repo whose full source was first released in the initial Gen4 release. The rewrite is in progress while it runs alongside the previous-generation Gen1·Gen2 Scala VF. However, VF has the fail-closed design noted in item 1 of the canon caveat list, so changing policy carries a large risk, because it treats every result without a verdict as drop. Infrastructure to counter this risk is now in place in three stages. When production traffic sent by dark_traffic arrives at the staging VF, the staging VF computes its own verdict and at the same time compares it against the previous-generation Strato-based reference.
What we learnedA. A three-stage validation stack of traffic mirroring, staging validation, and verdict comparison is complete
- The VF validation stack is complete in three stages verified. In the first, dark_traffic only forwards traffic; in the second, the dark_traffic target is switched to staging so that staging is validated with production traffic; in the third, reference_compare compares verdicts inside staging.
- Stage 1, Gen4+4 (aad7179, 2026-08-19):
dark_traffic_setup.rs(109 lines, new) mirrors production traffic requests in parallel toxai-vf-shadow.prod.visibility. This stage consumes only traffic resources. - Stage 2, Gen4+6 (28e414f, 2026-08-21): The dark_traffic target name changed to
xai-vf-service.staging.visibility:grpc. This means the staging deployment, not shadow prod, is validated with production traffic. - Stage 3, Gen4+7 (d011592, 2026-08-24): For each request,
reference_compare.rs(812 lines, new) calls the Strato-based reference VF in parallel inside the staging deployment (Strato is the internal system X code goes through to look up or store data). It compares verdicts strictly and logs only the cases where results differ, as JSON lines. - The full path of the new file is
visibility-filtering/reference_compare.rs(812 lines), and the client on the reference side isStratoVfClient. - Regression audits of the fail-closed safety sub-repo, where policy changes are risky, can now be run at production traffic scale, and the risk of applying VF changes dropped substantially.
- Stage 1, Gen4+4 (aad7179, 2026-08-19):
What we learnedB. The comparison runs off the response path and strictly checks that verdicts exactly match the reference VF
- The main path only hands its own verdict to the harness task, so the comparison work does not affect the response (read-only).
begin_compare(viewer_id, country_code, safety_level, tweet_ids)spawns a separate tokio task, and the main path passes the verdict through aoneshot::channel.- The timeout is 1.5 seconds.
- The comparison does no normalization and strictly requires the action label and FilteredReason to match exactly.
- The comparison function is
is_exact_match(&VfAction, &Option<FilteredReason>).
- The comparison function is
StratoVfClientis the identity of the reference VF inferred. The code does not state whether the actual VF stack thatStratoVfClientwraps is a remnant of the Gen1·Gen2 Scala VF or a separate reference implementation.- Since it identifies itself in the form
client_id = "visibility-filtering-service.{APP_ENV}", a separate instance appears to be running inferred.
- Since it identifies itself in the form
What we learnedC. Verdict differences are logged grouped by combination, so the log does not explode even when many tweets diverge in the same way
- Diff logging was optimized by grouping by combination verified. Tweet IDs of the same (service, reference) combination are grouped into one log line, and when the 12KiB budget is exceeded they are split evenly.
- That is, the number of log lines is proportional to the number of diff combinations, not to the number of tweet_ids, so the log does not explode even if many tweets diverge in the same way.
- Diff logging groups tweet_ids of the same (service_verdict, reference_verdict) combination, chunks them to fit the 12KiB line budget, and writes them to stdout.
The output is
println!("{line}"), and each line has the following format:{"h":"vf_reference_compare","v":1,"batch":"...","chunk":[1,1],"build":"<12자 SHA>","dc":"atla","level":"TimelineHome","viewer":<u64>,"diffs":[["drop:AuthorIsSuspended","allow",[123, 456]], ...]}
What we learnedD. Enabling the harness in a prod environment makes boot fail
Staging-only use is enforced at boot time. If the flag is on but the environment is prod, it returns Err.
pub(crate) fn should_build_harness( flag_enabled: bool, app_env: Option<&str>, ) -> Result<bool, &'static str> { match (flag_enabled, app_env) { (false, _) => Ok(false), (true, Some("prod")) => Err( "VF_DUAL_CALL_HARNESS_ENABLED is set but APP_ENV=prod; the reference comparator is staging-only", ), (true, _) => Ok(true), } }This Err leads to boot failure. Enforcing the staging-only constraint at the code level prevents accidents where dual-call is turned on in production by mistake.
build_reference_compare_harness()inserver_deps.rsescalates the Err topanic!().
What we learnedOther changes
- Six metrics are exposed. Because every metric carries a build SHA label, a spike in the diff rate on a specific build can be traced immediately to the deployment responsible.
vf_reference_compared_exact_match_differed_error(kind=timeout|reference_item|missing_result)_skipped(reason=level_unmapped|logged_out_viewer)_enabled- The exposure path is
xai_stats_receiver::global_stats_receiver(), and the label name isbuild_sha.
"the reference comparator is staging-only" —
reference_compare.rs:31-33
Canon update Folded into three sections of services/x.md.
- Added a +7 row to the Gen4 table. It summarizes the file list, the +1,418/−117 scale, and eight key items.
- Expanded the one-line summary paragraph. Added a statement about the Gen4+7 commit.
- Added a new subsection "Gen4+7 (2026-08-24) — VF reference comparison harness (
reference_compare.rs) wiring" to the safety section. It describes the behavior, gating, and meaning in detail.
1-2. The ads brand safety verdict gained a top HighRisk tier
The brand safety verdict expanded from three tiers (Safe/LowRisk/MediumRisk) to four with HighRisk added. Five labels that were previously tied to medium risk moved up to HighRisk, and one new label was added.
What we learnedE. Six labels were grouped under HighRisk, and HighRisk is checked first
Six labels were promoted to HighRisk or newly created verified.
The file is
home-mixer/models/brand_safety.rs, and the new tier isBrandSafetyVerdict::HighRisk = 4.pub(crate) const HIGH_RISK_LABELS: &[SafetyLabelType] = &[ SafetyLabelType::NSFW_HIGH_PRECISION, // promoted from medium SafetyLabelType::NSFW_HIGH_RECALL, // promoted from medium SafetyLabelType::GORE_AND_VIOLENCE_HIGH_PRECISION, // promoted from medium SafetyLabelType::PDNA, // promoted from medium (Photo DNA — hash of child sexual exploitation images) SafetyLabelType::EGREGIOUS_NSFW, // promoted from medium SafetyLabelType::SOFT_NSFW, // new ];
Both verdict functions moved the HighRisk check to the top of the cascade. The comparison that picks the worst verdict extends as is, so HighRisk is now the top tier.
- The two functions are
compute_verdict()andcompute_verdict_v2(). The>= comparisoninworst_verdict()extends automatically.
- The two functions are
What we learnedF. HighRisk is also an ads-avoidance target, but there is not yet an explicitly different action from MediumRisk
The avoidance verdict in the ads utility also expanded, so HighRisk is now an avoid target too.
Previously only
MediumRiskwas a target.The function is
has_avoid().pub(crate) fn has_avoid(post: &ScoredPost) -> bool { matches!( post.brand_safety_verdict(), BrandSafetyVerdict::MediumRisk | BrandSafetyVerdict::HighRisk ) }
Quote adjacency escalation was promoted as well. When a post quotes an ancestor post written by an NSFW author, the verdict escalates from
MediumRisktoHighRisk.- The file is
ads_brand_safety_vf_hydrator.rs.
- The file is
That is, in the adjacency verdict HighRisk is avoided just like MediumRisk, and no explicitly different additional action exists yet. Separating the severity appears intended for running experiments and tracking downstream.
What we learnedG. Five V2 labels started going out in the feed response
- Five V2 labels started to be exposed in proto verified. Previously V2 labels were used only in home-mixer's internal verdict and hidden from downstream consumers (other services and clients that receive the feed response). They now actually go out in the response.
- Five entries were newly added to the
safety_label_to_protomapping inscored_posts_server.rs.GROK_SFA_V2→HM::GrokSfaV2GROK_NSFA_LIMITED_V2→HM::GrokNsfaLimitedV2GROK_NSFA_V2→HM::GrokNsfaV2GROK_NSFA_EXPANDED_V2→HM::GrokNsfaExpandedV2PTOS_REVIEWED→HM::PtosReviewed
- Five entries were newly added to the
What we learnedH. Buckets of the V2 verdict experiment started to be recorded in ads logs
DDG experiment tracking also came in verified. Ads injection logging exposes the V2 verdict experiment's bucket in its logs.
The experiment is
EnableAdsBrandSafetyVerdictV2, and the file isads_injection_logging_side_effect.rs.ddg_experiment_bucket: query .params .experiment_buckets(EnableAdsBrandSafetyVerdictV2) .first() .map(|b| format!("{}:{}", b.experiment, b.bucket)) .unwrap_or_default(),
DDG is presumably X's ads reporting pipeline inferred. It appears to be Data Dashboard or a system of a similar family.
This logging makes it possible to observe revenue and safety metrics of the V2 group. It is also evidence that the V2 verdict logic is still at the experiment stage.
The V2 verdict was introduced in Gen4+2 (2026-08-17) and redesigned in +3. With the experiment measurement infrastructure in place in this +7, a process spanning eight days wrapped up.
"Removed the 5 above from MEDIUM_RISK_LABELS_V2" —
home-mixer/models/brand_safety.rs
Canon update Updated the brand safety wording in the ads section of services/x.md, then added a subsection "Gen4+7 HighRisk tier introduced" after it.
1-3. The PTOS judge widens to three categories, and Grok 4.5 returns for judge use only
The PTOS judge layer expanded from adult content alone to three categories (ChildSafety, ViolentMedia, IllegalAndRegulatedBehaviors). Grok 4.5, which was fully removed in the commit three days earlier (Gen4+6), came back as a judge only, through a different endpoint.
What we learnedI. Grok 4.5 was removed and, within eight days, came back through a different endpoint in the judge role only
- Grok 4.5 was introduced as the adult content judge in Gen4+2 and fully removed in Gen4+6. In this commit it came back, through a different endpoint, in the judge role only.
- Gen4+2 (2026-08-17):
EAPI_GROK_4_5_INTERNALwas introduced as the adult content judge (SafetyPtosAdultContentCrossValidationJudge). - Gen4+4 (2026-08-19): Introduced Grok 4.6 internal at a 10% dial (4.6 actually judges 10% of calls).
- Gen4+5 (2026-08-20): Raised the 4.6 dial from 10% to 30%.
- Gen4+6 (2026-08-21): Raised the 4.6 dial from 30% to 100% and removed 4.5 internal from the code entirely. The breaker, sampler, and dial constants were all deleted.
- Gen4+7 (2026-08-24): Reintroduced
EAPI_GROK_4_5_X_ALGOas judge-only. It is used only as a judge, not as primary.
- Gen4+2 (2026-08-17):
- The X_ALGO suffix suggests a variant tuned for the x-algorithm domain inferred. Whether it is x-algorithm fine-tuning on top of the 4.5 base or a completely separate model is not public.
- The circuit breaker parameters are the same as for 4.6 internal.
- The circuit breaker is
_eapi_4_5_x_algo_breaker, with a 600-second window, 600-second recovery, and 5 half-open calls.
- The circuit breaker is
What we learnedJ. The new cross-validator only lowers verdicts in all three categories
- A new cross-validator class was added, and it routes each of the three categories to its own dedicated method.
- The class is
SafetyPtosPolicyCrossValidator, and the file isgrox/flows/ptos/classifier.py. - The entry point,
validate(category, post, policy), routes by category.
- The class is
- All three categories allow demotion only. The cross-validator (
SafetyPtosPolicyCrossValidator) cannot issue a stricter verdict than primary; it works only in the direction of the judge releasing what primary caught wrongly. This is the same design philosophy as the adult content judge introduced in Gen4+2. - ChildSafety is re-checked with 4.5: the verdict is kept if the policy type matches and demoted to
NoViolationif it does not. It also falls back toNoViolationon a parse failure or an error.- The method is
_validate_child_safety. - It puts the post creation date into
_build_policy_convoand useschild_safety_policy_prompt(post_creation_time). This means child safety verdicts have elements that vary with time.
- The method is
- ViolentMedia has three finer-grained demotion options. It is re-checked with 4.5: the verdict is kept if it matches, demoted if the result is
NoViolation, and downgraded to the weaker typeViolentMediaGraphicMediaon type_mismatch.- The method is
_validate_violent_media.
- The method is
- IllegalAndRegulatedBehaviors is re-checked with 4.5: if it matches, the policy type is kept but the reason is overwritten with the one 4.5 produced (the reason explanation becomes more accurate). If it does not match, the verdict is demoted to
NoViolation.- The method is
_validate_illegal_and_regulated_behaviors.
- The method is
- For each of the three categories, results are counted split by outcome tag.
- The metric is the
safety_ptos.<category>_cross_model_validate_with_grok_4_5counter. - The tags are
agreed/disagreed/unparseable/no_violation/type_mismatch/error.
- The metric is the
What we learnedK. Reasoning is turned on only for violent speech and suicide/self-harm, and the parent thread is read together when present
- Reasoning is turned on only for the two categories ViolentSpeech and SuicideOrSelfHarm. Other categories still suppress thinking and respond quickly and cheaply.
- The setting is
USE_REASONING_CATEGORIES = {ViolentSpeech, SuicideOrSelfHarm}. - Only for these two categories,
SafetyPtosPolicyClassifier.build_convo()applies_strip_thinking_restrictionsto the prompt and leaves the assistant message empty so the model can think freely. - Other categories suppress thinking with
THINKING_CONTROL_END.
- The setting is
- Only for the same two categories, if the post has ancestor posts, the entire parent thread is rendered as the user message.
- The setting is
USE_THREAD_RENDERER_CATEGORIES = {ViolentSpeech, SuicideOrSelfHarm}. If the post hasancestors,ThreadRendererrenders it.
- The setting is
- The reason is fundamental. A sentence like "I want to die" cannot be judged without thread context. It is harmless if the earlier utterance was about losing a game, but serious if the thread endorses self-harm.
- For violent speech too, the context of quotes and replies decides the verdict.
- In contrast, other categories such as adult content, NSFW media, and illegal behavior carry the signal in the target post itself, so there is no need to extend to the thread.
"USE_REASONING_CATEGORIES = { ViolentSpeech, SuicideOrSelfHarm }" "USE_THREAD_RENDERER_CATEGORIES = { ViolentSpeech, SuicideOrSelfHarm }" —
grox/flows/ptos/classifier.py:582-594
Canon update Added a subsection "Gen4+7 (2026-08-24) — SafetyPtosPolicyCrossValidator introduced" at the end of the PTOS section of services/x.md. It organizes the flow over the eight days from Gen4+2 to +7 and also includes the interpretation that X has settled on a dual stack that keeps primary and judge on different models and tunings.
1-4. The Phoenix checkpoint loader changed to withstand concurrent restores by multiple workers
Since Phoenix training with the Muon optimizer and the GB300 GPU generation has grown beyond its previous scale, practical issues in checkpoint restore have been addressed. The load function now accepts partial loading and a cap on concurrently decoded bytes, and a lock that serializes restores on the same node was introduced.
What we learnedL. The checkpoint load function accepts partial load, tag, and a concurrent decoding cap
- Three new arguments were added to the load function.
- The function is
load_checkpoint, and the file isxai_checkpointing/load.py(+178/−36).
- The function is
- A slice to read can be specified per tensor. It is used to load only specific tensors partially, or to specify a slice when the local shape differs from the checkpoint shape.
- The argument is
domains: dict[str, Any] | None, and it specifies ats.IndexDomainslice per tensor. - Two formats are supported: a JSON spec and an indexing expression.
- The argument is
- The practice of keeping checkpoints of multiple tags under one base path entered the code.
- The argument is
tag: str | None = None. The default is"orbax-ckpt", and it names the checkpoint subdirectory.
- The argument is
- A cap can be placed on the bytes of tensors decoded concurrently.
- The argument is
concurrent_gb: float | None, and the cap isint(concurrent_gb * 10**9). - Reads are cut into batches. When the sum of cur_bytes and nbytes exceeds the budget, the batch is flushed and drained before moving on to the next.
- If None, reads are issued in parallel without throttling.
- The argument is
What we learnedM. Workers on the same node restore only one batch at a time using a file lock
Restore is serialized at the node level. It prevents multiple JAX workers on the same node from restoring simultaneously, forcing each node to process one batch at a time.
_NODE_SERIALIZE_ENV = "XAI_RESTORE_NODE_SERIALIZE" _NODE_LOCK_FILE_ENV = "XAI_RESTORE_NODE_LOCK_FILE" class _NodeBatchLock: def __init__(self, path: str): self._fd = os.open(path, os.O_CREAT | os.O_RDWR, 0o666) def __enter__(self): t0 = time.time() fcntl.flock(self._fd, fcntl.LOCK_EX) ...- The default lock file path is
/dev/shm/xai_restore_node_lock, and if that path does not exist it uses/tmp/.... - It logs a message when it waits for 1 second or more.
- The default lock file path is
Between batches, free memory held by the glibc allocator is returned.
- It calls
gc.collect()andctypes.CDLL("libc.so.6").malloc_trim(0).
- It calls
Canon update Added a subsection "Phoenix checkpoint loader multi-node hardening — Gen4+7 (2026-08-24)" after the Grox section of services/x.md.
Why it matters This loader change is a signal that Gen4's training stack is maturing. Gen4+6 (2026-08-21) rewrote TRAINING.md and the README so that flagship Muon and the GB300 override are formally included in the export. Batch verification in that generation may have found a problem of exceeding node memory when multiple workers restore simultaneously inferred. Before Muon, model sizes were small and such infrastructure was unnecessary, but at GB300 scale node-lock and concurrent_gb became essential.
1-5. Three small changes: reply spam threshold, score write-back, X Spaces title
There were three small changes to grox's reply spam pipeline and LLM input.
What we learnedOther changes
- The follower threshold for grox reply_spam went up from 80k to 100k.
- It applies to both
TaskSpamFilterandTaskReplyRankingFilter. - Since 08-13 it was raised five times in 11 days (15k → 30k → 40k → 60k → 80k → 100k).
- Each raise widened the set covered by the grox spam verdict and narrowed the set scored by reply ranking verified —
task_filter.py:77-92, 214-225.
- It applies to both
- When grox reply_spam writes reply ranking scores back to Strato, it now also writes to two regional caches verified —
strato_loader.py(+17/−0).ReplyRankingScoreStratoLoaderingrox/flows/reply_spam/strato_loader.pyis a file that has existed since the Gen4 release (47c1bcd, 32 lines).- Since then it has
putreply ranking scores to Strato and emitted them to Kafka v2. - This commit added a step after the
putthat writes in parallel to the regional caches Atla and Pdxa when the score is 1.0 or below. - When the score exceeds 1.0, the cache fanout is skipped; this appears to keep low-confidence verdicts only in the canon store and prevent contamination of the serving cache inferred.
- Context from X Spaces (audio) has started flowing into grox. It does not listen to the audio itself, but the Space title becomes input for brand safety and adult content verdicts.
- A new
SpaceMetadataclass was added (it currently has only one field,title), aPost.space_metadatafield was added, andpost_mapper.pymaps it. - The renderer in
grox/core/lm/post.pyincludes it in the LLM prompt in the form\n\nThis post has the following audio space card attached:\nAudio Space title: {title}.
- A new
Why it matters Today's commits fall into three axes: verification of the VF rewrite, tier expansion of brand safety verdicts together with experiment measurement infrastructure, and expansion of the PTOS judge layer.
- The specifics of the three axes are reference_compare, HighRisk and DDG, and three categories plus the reintroduction of 4.5 X_ALGO, respectively.
- Gen4's overall story traces a maturity curve: release the code, connect verification infrastructure, track experiments, and expose them downstream. The fact that the VF, brand safety and PTOS subsystems are maturing side by side in this order is itself evidence that X is still putting organizational resources into making the Gen4 open-source release verifiable.
- Gen4+7 (08-24) arrived after three days without commits following Gen4+6 (08-21).
2HEGM watch-time prediction raised metrics in a 1.5-month production A/B — Radar (VK)
Source Hierarchical Exponential-Gaussian Mixtures for Watch-Time Distribution Prediction — arXiv 2608.23356, 2026-08-24 v1, paper. The four authors are Sofia Gulevskaia, Mikhail Trapeznikov, Aleksandr Poslavsky, and Alexander D'yakonov. All four are affiliated with both AI VK and Lomonosov Moscow State University, and we confirmed the affiliations in the HTML version. Code and models are released at github.com/rw404/HEGM.
Background The core regression target in short-video ranking is watch time, that is, how long a user will watch a given video. Three overlapping properties make this prediction hard.
- near-zero-inflated: a very high share of users skip within 3 seconds, so the distribution mass concentrates heavily near zero.
- long-tailed: a small number of users watch for a very long time.
- multimodal: there are several modes, such as casual skimming and immersed watching.
The SOTA for this problem is EGMN (Exponential-Gaussian Mixture Network). EGMN models the whole conditional density with a Gaussian mixture, so it can predict CDF-based events such as "probability of watching 3 seconds or more" rather than a single point estimate. This paper (HEGM) starts from three EGMN failure modes, adds five fixes, and releases 1.5-month production A/B results verified.
What we learnedA. EGMN breaks in three ways in large-scale reproduction
- EGMN has three failure modes verified.
- variance collapse: MLE training pushes σ_k(x) of a particular component toward 0, creating a likelihood spike on that sample, and as a result the distribution itself becomes meaningless.
- component redundancy: several Gaussians converge to μ_i≈μ_j and σ_i≈σ_j, effectively duplicating the same component.
- inactive components: most mixture weights collapse to 0, and this happens even with an entropy regularizer.
- The finding that these three failures recur in large-scale reproduction studies is HEGM's starting point.
What we learnedB. HEGM made five fixes, including modeling skipping and engaged watching separately
- HEGM introduced five fixes verified.
- Hierarchical skip-watch decomposition: a sigmoid gate predicts the skip probability (
p_skip(x) = σ(W_skip · h + b_skip) ∈ (0, 1)). The final density is exponential × p_skip + Gaussian mixture × (1−p_skip). Because it separates "quick skip = indifference" from "engaged viewing" at the decision layer, the model is easier to interpret, and different sub-models handle different failure modes. - It adds KL-based variance regularization to address variance collapse.
- It applies structured initialization.
- It removes the forced Gaussian shift.
- It removes the entropy regularizer.
- Hierarchical skip-watch decomposition: a sigmoid gate predicts the skip probability (
What we learnedC. In the 1.5-month production A/B, session depth and shares rose, and skips and dislikes fell
- Detailed production A/B figures are published very specifically in the results section of the HTML version verified.
- Surface: short video. We infer it is VK inferred. The authors do not state it explicitly, but the phrase "serving millions of active users" and the AI VK affiliation strongly suggest it.
- Duration: 1.5 months (1 month forward and 2 weeks reverse swap).
- Traffic: the treatment and control groups are 5% each, with about 11M requests per group per day.
- All results are statistically significant.
- session depth +9.26%
- deep watch (≥10s) +5.75%
- non-short watch (≥3s) +4.59%
- skips (<3s) −6.23%
- shares +14.59%
- dislikes −8.34%
"A 1.5-month production A/B test confirms statistically significant engagement lifts." — HEGM abstract, 2026-08-24
Canon update Added a ### HEGM (VK Russia) — Short-video watch-time distribution prediction, detailed production A/B figures released section to "new this month" in radar.md, placed ahead of Densing Law.
Why it matters VK has added one more production claim. Short-video production ranking papers have kept appearing over recent months from Kuaishou (DrEM, HD-Rec, PushDualGen) and Yandex Music Gryphon-v2/Sona, and this time VK adds a statement as another Russian research source. Given AI VK's production scale (we infer tens of millions of DAU inferred) and its practice of publishing detailed figures, it is worth continuing to track Russian platform research.
- Watch-time prediction is evolving along two branches.
- Netflix Foundation Model's watch-time head and X Phoenix's quantile head with five quantiles combine point estimates and quantiles. Phoenix's five quantiles are P10/P25/P50/P75/P90 in the 2026-08-19 commit (Gen4+4).
- The EGMN family predicts the entire conditional density, and HEGM is the latest in that lineage.
- What to watch is how the two approaches diverge in compute cost, interpretability, and CDF-event accuracy.
- If a second company besides VK makes a production claim for the EGMN family, it becomes a candidate for a new section in topics/multi-task-ranking.md.
3A law for tokenization capacity as user behavior data grows — Radar (Ant/Alipay)
Source Towards a Densing Law for User Representation Learning at Billion-Scale Capacity — arXiv 2608.23392, 2026-08-24 v1, paper. There are nine authors (Bin Dou, Junru Zhang, Zhaoyi Yuan, Wuliang Huang, Letian Gong, Baokun Wang, Huan Li, Yu Cheng, Weiqiang Wang). Ant Group's DeepFind Team and Zhejiang University collaborated, and we confirmed the affiliations in the HTML version. DeepFind Team appears to be the line at Ant Group related to user representation learning.
Background Industrial-scale user representation learning scales along three axes: number of users, behavior sequence length, and model size. The paper points to two fundamental problems.
- Raw text scaling has a bottleneck. At billion scale, adding raw behavioral text input hits diminishing returns in performance. Tokenization, which converts behavior into discrete tokens, does mitigate this.
- There was no quantitative analysis of how much tokenization settings must grow along with data scale.
This paper formalizes the relationship as the densing law and presents ALGN, which uses the law as a guideline verified.
What we learnedA. The log of tokenization capacity and the log of data scale are roughly linear
- According to the densing law formula, the log of data scale and the log of tokenization capacity are roughly linearly related verified.
This is a single-dimension formula that scales only one of user count or sequence length.
ln C*(s) = β + α ln(s / s_0)This is a multi-dimensional formula that scales user count and sequence length together.
ln C*(s) = β + Σ_i α_i ln(s_i / s_{i,0})Here
C*is the minimum sufficient tokenization capacity, s is the data scale, and α is an exponent that varies with data characteristics and tokenization approach.This relationship carries the one that Densing Law (arXiv 2412.04315) named for LLMs over to the tokenization axis of the recommendation domain.
What we learnedB. ALGN adjusts tokenization capacity guided by this law, but the abstract gives no improvement figures
- ALGN (Adaptive Length Group Nested) is a variable-length approach that adaptively adjusts tokenization capacity to data scale, with Densing Law as its guideline verified.
- The abstract gives no specific improvement figures and says only: "ALGN outperforms existing baselines".
What we learnedC. Evaluation is only an offline benchmark on billion-scale Alipay data, with no production deployment claim
- The evaluation scale is the billion-scale Alipay PayBill dataset verified. There are three downstream tasks: classification, text-based retrieval, and user-to-user retrieval, and each held-out test is about 0.5M users.
- There is no production deployment claim verified. Only offline benchmarks are presented.
- Neither the abstract nor the HTML version states that ALGN was folded into the Alipay serving stack.
- There is only a data-scale statement, "billion-scale Alipay dataset"; production claims such as A/B results, uplift figures, and serving latency are missing.
"we conduct a pilot study on raw & tokenized scaling comparison on billion-scale Alipay dataset" — Densing Law abstract, 2026-08-24
Canon update Added a ### User Behavioral Densing Law (Ant/Alipay) — scaling law confirmed by a third company section to "new this month" in radar.md.
Why it matters Ant joined the scaling-law thread on a different axis, following Meta, Netflix, and ByteDance. This paper addresses tokenization capacity scaling. It is a law on how large a tokenization vocabulary and structure must be as data scale grows.
- The companies stated earlier addressed other axes. Meta's HSTU·Wukong·GEM and Netflix Foundation Model stated scaling laws for parameters and data, and ByteDance ads' TM20K solved sequence scaling with KD (knowledge distillation).
- HSTU is the sequence-model lineage on Meta's organic feed side.
- This paper joins, from a third angle, the unresolved debate between "semantic features are needed," raised by Meta's ads-side model LLaTTE, and "scaling alone is enough," claimed by HSTU.
- Ant Group's user-sequence line has come to light. DeepFind Team appears to be the name of the line responsible for user representation learning at Ant Group inferred.
- If Ant Group makes other production claims later, it becomes a promotion candidate to topics/sequence-transformer-ranking.md. Examples are a follow-up showing this densing law was folded into the Alipay serving stack, or A/B results for other downstream tasks.
- However, there is a limitation: only offline results exist. Without a production A/B claim, "how much it helps real serving" is not confirmed. Until online results appear in a next paper or tech report, we keep it in the watching tier.
4Reasoning traces hurt offline recommendation in a controlled test — Radar (Spotify)
Source The Disconnect Between Better Descriptive Reasoning Trace Quality and Recommendation Effectiveness — arXiv 2608.23154, 2026-08-24 v1, paper. All six authors are at Spotify Research. They are Gustavo Penha, Juan Elenter, Claudia Hauff, Hugues Bouchard, Paul Bennett, and Mounia Lalmas, and we confirmed in the HTML version that the email domain is @spotify.com.
Background Over recent months, in the generative recommender line, attaching chain-of-thought reasoning traces to Semantic ID (SID, an ID that represents an item as a learned token sequence) prediction has appeared in several papers and production claims.
- The representative case is Kuaishou PushDualGen (arXiv 2608.07989). It was deployed to production with a two-stage generation structure that first produces the SID and then attaches skippable explanatory text (copy), and recorded an effective play rate of +8.50% and a dissatisfaction rate of −37.70%.
- Other SIDReasoner-family work also claims that traces improve SID inference.
The problem is that these lines mostly support their claims with their own offline metrics or a single production A/B, and controlled comparisons are lacking. This paper fills that gap. It is a 2×2 factorial controlled experiment that independently varies two factors: whether the item representation is an SID or a natural-language title, and whether a reasoning trace is present. The backbone is unified to Qwen3-1.7B, and three Amazon product domains were used.
What we learnedA. Adding descriptive reasoning traces lowers offline recommendation performance
The key negative result is that adding descriptive reasoning traces lowers traditional offline recommendation performance under standard SFT and RL training verified.
"introducing explicit descriptive reasoning traces reduces traditional offline recommendation effectiveness under standard SFT and RL training" — abstract
- In the Office Products domain, combining the Titles representation with SFT training, adding a trace lowers R@10 (the share of cases where the correct item is within the top 10 recommendations) from .1587 to .1416, about −11%.
- Across all domains, Titles range from −19% to 0% and SIDs from −9% to 0%.
What we learnedB. Natural-language titles produce better traces, but recommendation metrics get worse
- Titles produce better traces, but the metrics get worse verified.
- SID is an opaque learned identifier, so it is hard for an LLM to reason over it like natural language. Only with extensive alignment, additional training that aligns SIDs with natural language, do traces barely become grounded.
- Natural-language titles yield grounded, interpretable traces even without alignment.
- However, even when the trace improves, recommendation R@10 drops. In other words, trace quality and recommendation effectiveness are independent of each other.
What we learnedC. A richer reward narrows the gap somewhat, but does not fully catch up with the no-reasoning baseline
- A richer reward signal partially mitigates the problem verified. In RL training, if the reward is changed from recommendation R@10 itself to a richer signal, the gap narrows somewhat. However, it still does not fully catch up with the no-reasoning baseline.
What we learnedD. No industry cases are cited; this is a conditional observation from the paper's own controlled experiment
- There is no reference to industry cases verified. The SIDReasoner family appears in the related work section, but the paper does not explicitly cite Kuaishou PushDualGen or similar production deployments.
- The paper's tone is also less about judging whether "this trend is right" and more about summarizing conditional observations from its own controlled experiment.
"R@10 drops from .1587 to .1416" — Office Products domain, Titles condition Section: Results, arXiv 2608.23154 HTML
Canon update Added a ### Descriptive reasoning traces reduce recommendation effectiveness (Spotify Research) — first rebuttal claim for the SID+CoT line section to "new this month" in radar.md.
Why it matters The two results do not directly contradict each other; they are different observations obtained under different conditions. However, what matters is that the line that attaches CoT to SID now has one reproducible counterpoint.
- What matters is under which conditions the negative result holds. The conditions of the two sources differ.
- Kuaishou PushDualGen: it used the push surface, a production A/B, and a real catalog, and the reward was designed around production objectives such as effective play and dissatisfaction rate.
- Spotify: it used Amazon reviews and a Qwen3-1.7B backbone in an offline setting, and the reward was designed as standard R@10.
- When future production claims combine SID and CoT, conditions such as backbone size, whether the setting is offline or online, and reward design will be key.
- One can speculate why Spotify does not deploy a line that combines SID and CoT to production. Spotify is a company that has already moved seriously into the SID (semantic tokenization) line (see the PRS 2025 semantic tokenization talk).
- If its own experiments gave a negative result, that result may also have been reflected in the company's production roadmap inferred.
- We can predict that Spotify's production will adopt SID but not attach CoT.
- The point to watch is a similar-experiment statement from a second company. If one appears, it becomes a candidate for a new, separate section in topics/llm-in-recsys.md titled "SID + reasoning trace: production vs benchmark debate".
Corrections
None. The three new sources in this batch (HEGM, Densing Law, Spotify's reasoning trace experiment) do not overturn the existing canon. Each attaches as a new data point to a watching thread: watch-time prediction, scaling laws, and LLM-in-recsys. X Gen4+7 is also a natural extension of the Gen4 series.
Radar
- 3 new:
- HEGM (VK, arXiv 2608.23356)
- User Behavioral Densing Law (Ant/Alipay, arXiv 2608.23392)
- Spotify's reasoning trace negative result (arXiv 2608.23154)
What to check next
- Check X Gen4+8, the next commit — of the 12 days from 08-13, when the Gen4 original went up, to 08-24, commits landed on 8 days (none on 08-15, 16, 22, 23). Five things to watch:
- when VF reference_compare is promoted from logging to dashboards and alarms
- whether BrandSafetyVerdict::HighRisk triggers follow-up actions beyond ads avoid, such as ranker decay or blocking organic impressions
- whether the PTOS judge expands to spam and hate speech categories
- the decision on whether to promote or roll back the V2 experiment
- how far grox reply_spam's follower threshold is adjusted next (whether it goes from 100k to 120k or 150k)
- Follow up on VK HEGM — because the open-source code is released, reproduction experiments from other companies may appear. In particular, watch statements from TikTok/ByteDance, Reels, and Meta, the next companies on the short-video production line.
- Check follow-ups on whether the Ant/Alipay densing law is reflected in serving — if a production A/B claim appears, promote it to the canon.
- Decide whether to fold the Spotify experiment into the canon — a similar experiment from a second company is needed. If one of Netflix, Meta, or Google releases a controlled rebuttal experiment, add a section to topics/llm-in-recsys.md.
- On Monday 2026-08-31, scan industry blogs. The targets are Pinterest engineering (medium.com/pinterest-engineering), research.atspotify.com, and the Google Research blog.