0x00 한

Research / Daily reports

  • Sources read: 1
  • Canon files updated: 1
  • Radar entries: 0
In one lineX made the Phoenix ranker separately learn from late conversions, such as purchases and sign-ups, that happen after a user only views an ad without clicking.

1Ad conversions that happen late without a click became training targets — X

Source xai-org/x-algorithm@6258a15 — xAI public repository, commit of 2026-10-24 03:22 UTC, code. In these notes' numbering, this is Gen4+49. Gen4+N is the number these notes assign, in order, to X commits after the Gen4 release (2026-08-13). The sync time of the cron mirror (a file that syncs and publishes production feature-switch defaults daily) is 2026-10-23T16:00:34Z. 56 files changed, and 41 of them are Phoenix training code (phoenix/xrex).

Background Ad conversions (actions the advertiser wants, such as purchases, adding to cart, and sign-ups) sometimes occur days after the ad was viewed; such late-arriving labels are called delayed feedback, and samples whose conversion has not yet arrived at training time are wrongly learned as negatives. Since the 2026-09-18 commit (Gen4+24), samples for X's Phoenix ranker (a Transformer that puts the user history and candidates into one sequence and predicts action probabilities) have been split into three sources: fresh stream, early relabel, and late window. The ranker also has twin heads (delayed-conversion-only prediction heads paired with the existing conversion heads) that train only on the late window. However, until now the twin heads covered only delayed conversions after a click on the ad, and this commit trains six view-through delayed conversions, which are attributed to merely viewing the ad without a click, in the same way.

What we learnedA. Six view-through delayed conversions are trained with late-window twin heads

  • A separate late-window twin head list was added alongside the click-based list, and it holds six view-through delayed conversions verified — ads_late_window.py:18-25

    • The list is named ADS_LATE_WINDOW_VT_TWIN_HEAD_INDICES.
    • The six are the view-through delayed conversions for attributed key view, attributed view, purchase, add to cart, checkout start, and sign-up (for example, ADS_PURCHASE_CONVERSION_VIEW_THROUGH_DELAYED).
    • These actions first appeared in the proto in the 2026-10-13 commit (Gen4+40) (18 entries, numbers 234-251), and this is the first time they are used in training.
  • The new twin heads train only on candidates that are late-window samples, have no click, and whose same conversion was not already observed in the early window verified — ads_head_masking.py:73-89

    • One condition is reversed compared with the click-based twin: the click twin requires click, and the new twin requires ~click.
    • Only candidates with the bit that keeps web conversion training (keep_web) turned on are used.
    | (twins & late & click & no_early_counterpart & kept)
    | (vt_twins & late & keep_web & ~click & no_early_counterpart)
    
  • Each twin points to its paired fresh-stream head, and if that pair already fired in the early window, it is not trained again in the late window verified — ads_late_window.py:27-44

    • For example, the pair of ADS_PURCHASE_CONVERSION_VIEW_THROUGH_DELAYED is ADS_PURCHASE_CONVERSION_VIEW_THROUGH.
    • We infer this is a mechanism to avoid counting the same conversion as positive twice inferred. The basis is that the variable name of the pair mapping is suppressor.
  • This path runs only when the ads head masking option in the training config is turned on, and the option is off by default verified — ads_head_masking.py:41-53

    • The option is ads_head_masking: bool, and the default False is the value confirmed at Gen4+24.
    • The new six were also registered in the pixel-fire mapping and the training metric group, and a metric slice late_split_non_clicked_no_early was added.

What we learnedB. The credibility threshold in account enforcement rules is a mock value for public release

  • In the account and post enforcement rules, the threshold for "skip high-credibility accounts" changed from 50.0 to 12.34, and a comment saying it is not a production value was added verified — enforcement_user.yaml:32-36
    • abuse-enforcement-service (AES) is a service that receives violation scores assigned by the scorer and carries out actions such as account suspension.
    • The rule id is pagerank_skipped, and the same value was also changed in safety_checks.rs and enforcement_post.yaml.
    • The follower-count thresholds (12.34, 12345.67) already had the same comment.
  • The line at the top of the post rule file, "mirrored from the GrowthBook dynamic config, last sync 2026-08-25", was deleted verified — same commit diff
    • There is no longer a basis for reading this file as a copy of the production config inferred. The basis is that deleting the mirror notice and adding the mock-value comment are in the same commit.
  • The reply spam head names in tests were also changed to generic names verified — same commit diff
    • GrokDistilledReplyAuthor and reply_bot_v1_2 became ReplyHead and reply_model_v1.

"# Prod uses a different credibility score threshold; this is a mock value to reduce gaming." — enforcement_user.yaml, 2026-10-24

What we learnedOther changes

  • The funnel trace that records where ads dropped out of the pipeline became on by default verified — params/param.rs:867-872.
    • The switch EnableAdsFunnelTrace was introduced as off by default in the 2026-10-23 commit (Gen4+48). It only writes logs, so feed results do not change.
  • A per-pod salt can now be put into the account bucket calculation of the AES staged rollout verified — action_control/levels.rs.
    • The environment variable is ACTION_CONTROL_ROLLOUT_SALT, and when it is empty the buckets are the same as before.
  • Phoenix training gained an FP8 matrix-multiply module (models/fp8.py), a custom backward for candidate slot extraction, and an option to share nDCG sorts (metrics_ndcg_shared_sorts, default False) verified — same commit diff.
    • Together with the FA4 attention kernel (ranker_fa4) change, these appear to be changes for training speed and memory inferred. No code changes the loss or label definitions.

Canon update services/x.md In the introduction of the conversion actions section under ## Ads, we added a sentence that six view-through delayed conversions are trained with late-window twin heads, together with the reference commit. We added item 12 to ## How to read the source — caveat list, stating that the AES rule thresholds are mock values. We moved the reference commit in ## Summary and ## Sources to 6258a15 and added one row to the change log summary table.

Why it matters Delayed-conversion training for ads has widened from the click path to the path with only an impression verified (code). However, the masking option is off by default and we could not find in this diff any public config that turns it on, so we cannot say, even at the inferred grade, whether the production ads ranker already uses these heads. The AES change is xAI itself stating that enforcement thresholds in the public repository must not be quoted as production values.

What to check next

Sources checked

  • X: One new item came in from the commit list, 6258a15 dated 2026-10-24.
  • Meta: The latest post on engineering.fb.com is dated 2026-10-19 and was already checked. There are no new posts on ai.meta.com/blog. We did not check transparency.meta.com.
  • Netflix: One infrastructure post dated 2026-10-23 newly arrived in the RSS. We did not check research.netflix.com/publications.
  • arXiv cs.IR: 30 items parsed; the latest submission is 2026-10-22, the same batch as yesterday. 0 passed.
  • WebSearch cross-check: Only reports about user algorithm adjustment features on Threads and Instagram appeared, and there was no new announcement.