{
 "_meta": {
  "note": "Rule definitions consumed by static/checker.js. Every rule carries an evidence tag: CODE (in the 2026 repo, file cited), LEGACY-2023 (real but old), HEURISTIC (our labeled inference). The checker never outputs a fake 'algorithm score' \u2014 it outputs which scoring terms a draft can earn, which gates it trips, and which risks it carries."
 },
 "slop_patterns": [
  "\u0064elve",
  "\u0067ame-changer",
  "\u0067ame changer",
  "\u006cet that sink in",
  "\u0072ead that again",
  "\u0075npopular opinion",
  "\u0068ot take",
  "\u0074hread 🧵",
  "🧵👇",
  "\u0061 thread",
  "1/",
  "\u0070x🧵",
  "\u0068ere's the kicker",
  "\u0074he best part?",
  "\u0061nd the results? insane",
  "\u006dind = blown",
  "\u0069 can't believe more people aren't talking about",
  "\u0074his changes everything",
  "\u006dost people don't know",
  "99% \u006ff people",
  "\u006eobody talks about",
  "\u0068arsh truth",
  "\u0062rutal truth",
  "\u0069n today's fast-paced world",
  "\u0075nlock",
  "\u0073upercharge",
  "\u0065levate your",
  "\u0072evolutionize",
  "\u0064ive into",
  "\u0062uckle up",
  "\u0073tay tuned",
  "\u0079ou won't believe",
  "\u0069t's giving",
  "\u0063hatgpt wrote",
  "\u0061s an ai"
 ],
 "bait_patterns": [
  "\u006cike if you agree",
  "\u0072t if",
  "\u0072epost if",
  "\u0066ollow me for",
  "\u0066ollow for more",
  "\u0063omment below",
  "\u0064rop a",
  "\u0074ag someone",
  "\u0077ho else",
  "\u0061m i the only one",
  "\u0077rong answers only",
  "\u0061gree?",
  "\u0074houghts?",
  "\u006cet me know in the comments",
  "\u0074urn on notifications",
  "\u0064on't scroll",
  "\u0062efore you scroll",
  "\u006cike and retweet",
  "\u0066irst 100 people",
  "\u0064m me",
  "\u006cink in bio",
  "\u0067iveaway"
 ],
 "commonly_muted_terms": [
  "\u0063rypto",
  "\u0061irdrop",
  "\u0070resale",
  "\u006eft",
  "\u006fnlyfans",
  "\u0074rump",
  "\u0062iden",
  "\u006daga",
  "\u0077oke",
  "\u0067iveaway",
  "\u0066orex",
  "\u0073ignal group",
  "\u0070ump",
  "\u006doon",
  "1000\u0078",
  "\u0070assive income",
  "\u0073ide hustle",
  "\u0064ropshipping",
  "\u0077ebinar",
  "\u006dasterclass",
  "\u0073poiler",
  "\u0073poilers"
 ],
 "messages": {
  "photo_expand_off": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs (PhotoExpandWeight)",
   "text": "No image attached \u2192 the photo_expand scoring term is dead for this draft. One of 15 positive terms forfeited."
  },
  "photo_expand_on": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs",
   "text": "Image attached \u2192 photo_expand head live. It pays on predicted taps-to-expand: images with zoom-worthy detail (charts, screenshots, small text) earn; decorative stock images don't."
  },
  "video_gate_fail": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs vqv_weight(): weight zeroed if duration \u2264 MinVideoDurationMs (threshold withheld)",
   "text": "Short video: the code zeroes the video-view WEIGHT for videos under a minimum duration. A very short clip is scored as if there were no video at all. Exact threshold is a withheld param \u2014 comparable platforms gate around 5\u201310s [HEURISTIC on the value, CODE on the gate]."
  },
  "video_ok": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs; phoenix/runners.py CONTINUOUS_ACTIONS (video_watch_time)",
   "text": "Video attached \u2192 vqv head live, plus continuous video_watch_time is separately modeled. Retention through the video is scored, not just the play."
  },
  "link_heads": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs (ClickWeight, ContClickDwellTimeWeight)",
   "text": "Link attached \u2192 click + click-dwell-time heads live. No link penalty exists in the open ranking code (see the myth page) \u2014 but click-then-bounce leaks value via cont_click_dwell_time, so the destination must hold attention."
  },
  "no_link": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs",
   "text": "No external link \u2192 click heads mostly idle; your earning surface concentrates in dwell, reply, repost, share and follow heads."
  },
  "dwell_short": {
   "tag": "HEURISTIC",
   "ref": "informed by ContDwellTimeWeight existing in ranking_scorer.rs",
   "text": "Very short post: continuous dwell-time is a weighted term, and a post read in 2 seconds has a low ceiling on it. Short can still win via replies/reposts \u2014 but you're conceding the dwell terms."
  },
  "hook_weak": {
   "tag": "HEURISTIC",
   "ref": "not_dwelled is an explicit negative head (ranking_scorer.rs NotDwelledWeight)",
   "text": "First line reads weak (generic opener). Scroll-past is not neutral \u2014 not_dwelled is an explicit NEGATIVE term in the scoring sum. The hook is defense, not decoration."
  },
  "streak_decay": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs diversity_multiplier() = (1\u2212floor)\u00d7decay^N+floor",
   "text": "This is your Nth post in the session window. Author-diversity decay multiplies your Nth-best candidate down toward a floor, per viewer. Constants withheld; the curve shape is in the code."
  },
  "oon": {
   "tag": "CODE",
   "ref": "home-mixer/scorers/ranking_scorer.rs effective_oon_weight()",
   "text": "For non-followers your final score is multiplied by a single out-of-network factor (value withheld). There is no separate viral pathway in the scorer \u2014 discovery reach is your base score \u00d7 one dial."
  },
  "age_window": {
   "tag": "CODE",
   "ref": "phoenix/recsys_model.py POST_AGE_MAX_MINUTES = 4800; home-mixer/filters/age_filter.rs",
   "text": "Earning window: post age is a learned feature in 60-min buckets up to 80 hours, plus a hard age filter. Plan reposts/follow-ups accordingly \u2014 nothing you do resurrects a post past the window."
  },
  "slop_hit": {
   "tag": "HEURISTIC",
   "ref": "Grox runs LLM quality ('banger') + spam screens: grox/classifiers/content/banger_initial_screen.py, spam.py \u2014 prompts withheld, so triggers are our inference",
   "text": "AI-slop / engagement-formula phrasing detected. X machine-reads content quality with a Grok VLM; formulaic phrasing is the easiest thing for an LLM screen to catch."
  },
  "bait_hit": {
   "tag": "HEURISTIC",
   "ref": "four negative heads exist in code (not_interested/block/mute/report, ranking_scorer.rs); bait correlation is our inference",
   "text": "Engagement-bait phrasing detected. Bait buys cheap likes (the lowest-weighted positive in the only public weights) while raising not_interested/mute risk \u2014 and negative predictions re-rank you below clean posts (offset_score())."
  },
  "muted_terms_hit": {
   "tag": "CODE+HEURISTIC",
   "ref": "home-mixer/filters/muted_keyword_filter.rs (real per-viewer text filter); which terms are commonly muted is our estimate",
   "text": "Contains terms that large numbers of users mute. The muted-keyword filter tokenizes your text and silently removes you from those viewers' pools before scoring. Consider whether the term is load-bearing."
  },
  "hashtag_stuffing": {
   "tag": "CODE+HEURISTIC",
   "ref": "phoenix/recsys_model.py (no hashtag feature in ranker inputs); grox embeddings read them as text",
   "text": "Multiple hashtags: no hashtag feature enters the 2026 ranker \u2014 tags can't boost you, but tag-stuffing reads as spam to the LLM content screens."
  },
  "caps_shout": {
   "tag": "HEURISTIC",
   "ref": "negative heads + Grox quality screens",
   "text": "High ALL-CAPS ratio reads as shouting/rage-bait \u2014 mute/not-interested risk for marginal gain."
  },
  "reply_context": {
   "tag": "CODE",
   "ref": "grox/classifiers/content/reply_ranking.py + spam.py (reply spam)",
   "text": "This is a reply: replies are themselves LLM-ranked under the post, and reply-spam is machine-screened. A substantive reply can outrank earlier/louder ones; a template reply is exactly what the spam screen exists to catch."
  },
  "question_reply_head": {
   "tag": "HEURISTIC",
   "ref": "ReplyWeight head exists (ranking_scorer.rs)",
   "text": "Draft poses a direct question or answerable claim \u2192 reply-head potential. In the only public weights a reply was worth 27 likes."
  },
  "self_engagement": {
   "tag": "CODE",
   "ref": "home-mixer/filters/self_tweet_filter.rs",
   "text": "Reminder: your own likes/views of your post are worth zero \u2014 self-posts are filtered from your own recommendations."
  },
  "new_account_oon": {
   "tag": "CODE",
   "ref": "ranking_scorer.rs effective_oon_weight(): NEW_USER_OON_WEIGHT_FACTOR for accounts under an age threshold that follow \u2265 a minimum count",
   "text": "New account: a special out-of-network factor applies to new users (values withheld) \u2014 the code explicitly special-cases new accounts rather than burying them."
  }
 }
}