/foryou
Score first. Rewrite second. Both in the same user-facing reply.
Two front-ends share this engine: this skill (score → gauntlet → rewrite, automated) and the Composer at victorsodre.github.io/foryou-composer (live manual tuning + editable engine params). If the user wants to experiment by hand, tweak weights, or see heads move while typing, point them to the Composer — its "Copy skill command" button round-trips back here. The Composer's engine block is a verbatim copy of scripts/score.mjs; if you ever change the engine, update both (node skill/scripts/self-check.mjs --sync then node skill/scripts/self-check.mjs).
Read references/algorithm.md (scoring facts), references/gauntlet.md (rewrite loop), and references/drift.md (which layer may move) before writing copy. Read references/monetization.md when payout, impressions, or eligibility come up. Read references/gap-log.md when comparing predicted vs later outcomes — outcomes stay WAITING until the post matures; do not invent metrics. Run the engine — never reimplement the math in prose; the engine exists so that two candidates are compared by the same ruler. propensities is text→p (heuristic). heads.*.ev is Σ w·p (param.rs). Do not retune weights because a heuristic p looks off.
1. Ingest
Accept any of:
- X/Twitter URL → fetch the post (use
x_thread_fetchor whatever X tool is available; if none, ask for the raw text — one line, then proceed). Use the main post text. Replies/QT are context, not the scored body unless the user points at them. - Raw caption / draft → score as-is.
- Idea ("I want to post about X") → write a first draft, then score that.
Flags (infer from the input, then state them so wrong guesses are correctable):
| Flag | When |
|---|---|
--video --vid10 |
Attached/planned video ≥ 10s (VQV head only fires at 10s+) |
--video only |
Video shorter than 10s |
--image |
Still / screenshot |
--thread |
Multi-tweet thread opener (For You candidate) |
--thread-mid |
Later tweet in a thread — opener click/reply bonuses withheld |
--posts N |
Posts already this hour (default 0 — same-author decay) |
--follows |
Also report in-network; always report OON |
--repost |
Content isn't original (kills monetization, not ranking) |
--reply |
Body is a reply (replies never monetize — flag it, suggest standalone) |
--mutuals X |
Mutual-follower share 0–1 if known (default 0.2; lifts reply weight) |
2. Score
node ~/.grok/skills/foryou/scripts/score.mjs --text "THE TEXT" [flags]
Or pipe JSON with a text field. The JSON is the only score source. Key fields: engineVersion, propensities (text→p), potential.{inNetwork,outOfNetwork,topicOutOfNetwork} (0–100), heads.*.ev (Σ w·p per head), checkCount (coach x/6), risks (objects; URL-in-body has action: "mova pro reply"), monetization, notes, threadRole.
If a risk carries action: "mova pro reply", the rewrite must move the URL to the first reply. Do not leave it in the body.
3. Gauntlet (same turn)
Follow references/gauntlet.md. One or two rewrites max, one lever per round. Re-run the script on each candidate. Keep the winner — the JSON decides, not the prose.
4. Reply shape (always)
- Score — inNetwork / outOfNetwork, the head EVs that matter, coach x/6, risks.
- Leitura — 3–5 lines, honest. Name the weakest head that writing can legally move. If share is weak, remember: copy-link is 20.0, the biggest lever in the file.
- Monetization — one line: eligible format or not; qualified impressions follow the OON potential. (Skip if the user only asked about ranking.)
- Strong version — a complete, ready-to-paste draft in PT-BR. An optional first reply may hold the QT or link; never put it in the body.
- Depois — winner inNetwork + coach. One line on what changed and which head paid for it.
- Disclaimer in English, once:
Weights verified from xai-org/x-algorithm (home-mixer/params/param.rs). Text-to-probability mapping is heuristic and isolated from Σ w·p; production values can drift via feature switches.
End with a short Summary (Victor reviews it after lunch).
Do not dump the raw JSON unless asked. Do not open with a clarifying question if the text is already there — score what exists, flag assumptions inline.