Recipe builder
The controls are generated from the registry, so a game store's builder would expose completely different providers without the builder knowing anything about games.
Sources
Lane shares are relative and normalized, so these need not sum to 100. Mixing is separate from scoring on purpose: a feed that wants 45/30/25 should get it, not hope a global score lands there.
Scoring
Weights are relative too. bitfeed.* providers are portable;
app.* ones belong to this application.
Constraints & placement
Viewer preferences
These live in the context, never in the recipe — a recipe is publishable and forkable, and publishing a feed must not publish what you like. Check the exported JSON: they are not in it.
Composed feed
Expand “Why this?” on any item: contributions sum exactly to the score shown, so the explanation is true rather than decorative.
Scores are not in descending order here, and that is correct. With lane mixing on, each lane is ranked internally and then interleaved to hit the shares you set — so a 0.66 from Interests can sit above a 0.79 from Following. Turn off every lane but one to see pure score ranking.
Watch the politics post: it is tagged bitcoin too, and bitcoin's +0.9
outweighs politics' −0.5, so it still appears. That is soft disinterest doing its job —
a ranking input, not a mute. Drop a preference to −1 and it becomes a hard exclusion
nothing can rescue.
Recipe
Serializable, hashable, signable, forkable. The hash covers the recipe exactly as authored, so it matches what a publisher signed.
Receipt
Enough to audit, debug, and reproduce a run.
Registered capabilities
What this application can offer a recipe. The builder above is generated from exactly this.