Skip to content

Fork status · 2026-09-26

What this tree actually is.

The live lab is the contract and the simulation. The Rust prior lives on a public fork of xai-org/x-algorithm. Neither one changes For You on X. Both flags default off, and the event source in the fork is empty.

The contract

score' = score · q_t
Phoenix writes the weighted sum. PULSE may only multiply the final score.
q_t = 1 if the rank flag is off q_t = 1 if candidate.pulse is missing q_t = 1 if σ is missing, NaN, or > 0.18 q_t = q(·) only if the posterior is narrow
  • weighted_score is never rewritten.
  • Favorite, reply, and view counts are not inputs.
  • Reactions at or after scoring time are dropped.
  • The viewer’s own click stream is the wrong shape for the event source. The source is reactions on the post and past decisions by the author being ranked.

What may narrow σ

ClassMeaningNarrows σ in this slice?
humanIndependently acting personNo
mixedHuman plus toolsNo
agentDeclared model or automationYes, σ = 0.08
serviceDeclared service accountYes, σ = 0.08
coordinatedCoupled actors, not a verdictNo

Unlabeled posteriors are floored at σ = 0.22, above the action gate. A high coordination residual is a measurement. It is not a rank change. Newsrooms, sports, and fan accounts look synchronized. Treating that as guilt would punish real humans. The lab uses the same gate.

Honest status

ItemState
main vs upstreamSynced. PR #2 merged 4c5cfe8 into this fork’s main.
PULSE on by defaultNo. Both flags default false.
Event sourceEmptyPulseEventSource returns empty windows.
Changes live For YouNo.
Can q_t move a score in the Rust tree?Only if flags are on and narrow evidence is attached. Declared agent or service is the only class that does that today.
Old RankingScorerDeleted upstream. The hook moved.
This labDocumentation and a causal simulation. Not the Rust tree.

Branches

NameWhat it is
xai-org/x-algorithm mainPublic snapshot at 4c5cfe8, 2026-09-26.
fork mainThat snapshot, plus a short landing README. No PULSE mixer files.
pulse/causal-qOriginal five commits on the Sept 1 tree. Hooks the deleted RankingScorer. Superseded. PR #1 is the record. Do not patch it.
pulse/causal-q-4c5cfe8Current work. PR #3. Hooks PhoenixScoresRankingScorer and VMRanker.

Between Sept 1 and Sept 26 upstream deleted home-mixer/scorers/ranking_scorer.rs and moved the published sum into the value model. Replaying the old commits would conflict on a file that no longer exists. The estimator moved forward. The hook moved with the score.

Where it sits

reactions already arrived + author decisions already observed │ ▼ PulseEventSource (empty) │ ▼ viewer_influence_mask drop actors in Bᵤ ∪ Mᵤ │ ▼ evidence → PulseEvidence │ ▼ candidate.pulse ┌────┴────┐ ▼ ▼ value-model scorer VMRanker score = weighted·qₜ score = score·qₜ

weighted_score stays untouched on both paths. A source error fails open: pulse stays unset, so q_t is 1.

Two systems, not one

PULSE asks whether the lagged field looks like independent humans or a coupled controller. That becomes evidence, a width, and maybe q_t.

Reject Closure is preference isolation. If viewer u blocks actor a at time t, then later:

Candidate(a, u) = 0 already true for For You authors Suggestion(a, u) = 0 product contract, other surfaces Influence(a → u) = 0 viewer mask on the lagged field Pᵤ(E, t) = P(E, t) \ Bᵤ

A blocked account is not labeled a bot. They are removed from this viewer’s field. The global source still returns every arrived reaction. The hydrator subtracts.

SurfaceIn the public repoAfter a block
For You authorYesHard drop (AuthorSocialgraphFilter)
For You lagged fieldYes, on the PULSE branchviewer_influence_mask
Posts from people you simply don’t followYesKept. Out-of-network is a discount, not a ban.
@ typeaheadNoSame exclusion set should apply. Compose is another service.
Who to FollowNoSame
SearchNoSame

Flags

FlagDefaultEffect
rust_home_mixer_enable_pulse_priorfalseAllow q_t ≠ 1 when evidence is narrow.
rust_home_mixer_enable_pulse_hydratorfalseRun PulseHydrator.

File map

PathRole
home-mixer/models/pulse.rsEvidence, causal_q, sigma policy, lagged field, viewer mask
home-mixer/candidate_hydrators/pulse_hydrator.rsEvent-source trait, empty source, mask
home-mixer/scorers/phoenix_scores_ranking_scorer.rsscore = weighted · q_t
home-mixer/scorers/vm_ranker.rsapply_pulse after remote or local score
docs/pulse.mdMixer contract
docs/reject-closure.mdBlock, mute, suggestion contract

The name counterfactual_independence overclaims. On this branch it is residual predictive lift of a lagged cluster term, not a randomized experiment. The fuller time-split estimator still lives on the superseded Sept 1 branch.

Still missing

  1. Wire the candidate field, the two flags, and the empty hydrator.
  2. A real event source: per-post reactions with timestamps before t, plus optional author decision rows. Not the viewer’s click stream. Not lifetime counts.
  3. An offline falsification harness before unlabeled evidence is allowed to narrow σ. Measure the false-positive rate on newsrooms, sports, and fan communities. The falsify page is that contract.
  4. Reject Closure on @ typeahead, Who to Follow, and search. Those services are not in the repository.
  5. The click-then-block sequence, labeled as a hypothesis.

What this lab is for

The miniature feed uses the same gate as the Rust prior: wide σ stays at q_t = 1, a viral swarm updates the EKG and does not move the slate, a declared agent can. It does not compile the mixer, and it does not model @ suggestions. Read the algorithm page for the published weights, then open the lab.