{"id":"ca5a16c8-710c-4d6d-803b-c5dbf2883abd","entityType":"agent","slug":"clawhub-zfoong-x-algorithm-optimizer","name":"x-algorithm-optimizer","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zfoong-x-algorithm-optimizer","canonicalPath":"/agent/clawhub-zfoong-x-algorithm-optimizer","generatedAt":"2026-10-10T10:42:18.524Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":null},"description":"Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review my tweet before I post\". Grounds advice in the actual scoring weights, filters, and distribution mechanics rather than generic social-media tips. Skill: x-algorithm-optimizer Owner: zfoong Summary: Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s173q1p8gb9e4hvsdybbax4gk58cg13e:x-algorithm-optimizer","sourceUrl":"https://clawhub.ai/zfoong/x-algorithm-optimizer","homepage":"https://clawhub.ai/zfoong/skills/x-algorithm-optimizer","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zfoong/x-algorithm-optimizer","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/zfoong/skills/x-algorithm-optimizer","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":null},"stars":null,"forks":null,"downloads":1552,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T08:37:39.808Z","lastCrawledAt":"2026-10-10T08:37:39.808Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T08:37:39.808Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-08-15T04:53:19.304Z","changelog":"Initial release of x-algorithm-optimizer. - Optimizes posts for X's (Twitter's) \"For You\" feed using the official open-sourced ranking algorithm, not folk advice. - Provides step-by-step workflow: situation analysis, drafting for algorithmic priorities, suppression audit, and distribution tactics. - All recommendations are based on concrete weights, filters, and mechanics from X's actual codebase, with cited references for transparency. - Includes optional scoring tool for drafts, analyzing action-weighted score and risk factors. - Designed strictly for authentic, policy-compliant content; explicitly excludes any advice for spam or manipulation.","fileCount":16,"zipByteSize":38631}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s173q1p8gb9e4hvsdybbax4gk58cg13e:x-algorithm-optimizer","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:42:18.521Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zfoong-x-algorithm-optimizer/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":null},"readme":"Skill: x-algorithm-optimizer\n\nOwner: zfoong\n\nSummary: Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review my tweet before I post\". Grounds advice in the actual scoring weights, filters, and distribution mechanics rather than generic social-media tips.\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-08-15T04:53:19.304Z | auto\n\nInitial release of x-algorithm-optimizer.\n\n- Optimizes posts for X's (Twitter's) \"For You\" feed using the official open-sourced ranking algorithm, not folk advice.\n- Provides step-by-step workflow: situation analysis, drafting for algorithmic priorities, suppression audit, and distribution tactics.\n- All recommendations are based on concrete weights, filters, and mechanics from X's actual codebase, with cited references for transparency.\n- Includes optional scoring tool for drafts, analyzing action-weighted score and risk factors.\n- Designed strictly for authentic, policy-compliant content; explicitly excludes any advice for spam or manipulation.\n\nArchive index:\n\nArchive v0.1.0: 16 files, 38631 bytes\n\nFiles: .gitignore (39b), CONTRIBUTING.md (2444b), LICENSE (1091b), README.md (8877b), references (0b), references/account-playbooks.md (4726b), references/distribution-mechanics.md (10903b), references/examples.md (4958b), references/myths.md (5182b), references/negative-signals.md (7706b), references/scoring-weights.md (7208b), scripts (0b), scripts/post_critic.py (12790b), skill-card.md (2486b), SKILL.md (9059b), _meta.json (140b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: x-algorithm-optimizer\ndescription: >-\n  Optimize posts for X's (Twitter's) For You feed algorithm, based on X's\n  open-sourced ranking code. Use when the user wants to write, draft, review, or\n  improve a post/tweet/thread for reach, engagement, or virality on X, for\n  example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post\n  getting reach\", \"optimize my thread for the algorithm\", \"review my tweet before\n  I post\". Grounds advice in the actual scoring weights, filters, and\n  distribution mechanics rather than generic social-media tips.\nlicense: MIT\n---\n\n# X Algorithm Optimizer\n\nHelp the user create posts for X's **For You** feed that the ranking algorithm\nwill distribute widely, grounded in X's open-sourced algorithm code rather than\nfolk wisdom. Every recommendation here traces to a specific mechanism in that\ncode (see `references/`).\n\n## The one-paragraph model of the algorithm\n\nX predicts, for each post, the probability a viewer will take each of about 30\nactions, then scores the post as a **weighted sum** of those probabilities. The\nweights are wildly asymmetric: a copy-link share is worth about **40 times a\nlike**, a reply about 10 times, and a single report cancels roughly 468 likes.\nA net-negative post does not just rank low, it collapses to near zero and sinks.\nHigh score alone is not enough. The post must also survive hard filters (a\n48-hour age limit, originals-only for stranger reach) and visibility labels that\ncan silently drop a post to strangers while your followers still see it.\nReaching **followers** is easy. Reaching **strangers** (out-of-network) is the\nreal game, gated by ML retrieval that finds posts whose embedding matches a\nviewer's engagement history. Note the model never reads your raw text: it sees a\nsemantic embedding of the post, its engagement counts, and graph and context\nfeatures.\n\n## Two laws to optimize toward\n\n1. **Optimize for \"send to a friend,\" not \"like.\"** Copy-link share (20),\n   reply (5), quote (5), and DM share (5) dominate the like (0.5). Write content\n   people forward and respond to.\n2. **Avoiding negatives beats chasing positives.** One report (−234) or mute\n   (−58.8) outweighs dozens of positives, and the offset transform then\n   collapses the whole post. Rage-bait and engagement-bait are mathematically\n   negative-EV.\n\n## Workflow\n\nWork through these steps. Pull exact numbers, thresholds, and label names from\n`references/` as needed. Do not rely on memory for specifics; cite them so the\nuser can trust and audit the advice.\n\n### Step 1: understand the situation\nAsk for (or infer from context) what you need:\n- **Follower count** (determines cold-start eligibility, the at-most-1,000 boost).\n- **Niche or topic**, and **account age**.\n- **Goal:** reach strangers, deepen with followers, drive replies, drive clicks,\n  or grow followers.\n- **The draft**, if they have one, or the idea if they do not.\n\nIf the user just wants a post written and gives a topic, proceed with sensible\ndefaults and note the assumptions. Do not over-interrogate.\n\nThen pick the matching playbook in\n[references/account-playbooks.md](references/account-playbooks.md).\n\n### Step 2: draft or revise for the weight table\nStructure the post to earn **high-value actions** (see\n[references/scoring-weights.md](references/scoring-weights.md)):\n- A **hook** that beats the first-two-seconds scroll test (scrolling past costs\n  −0.02 and, at scale, feeds negative signals).\n- A **reason to reply**, such as a genuine question, a take worth answering, or a\n  useful prompt. Reply is worth 5.0. This is not cheap \"comment below\" bait,\n  which risks negatives.\n- A **reason to forward**: reference-worthy utility, the clearest explanation of\n  something, content a viewer sends a friend. Copy-link is 20, DM is 5.\n- **Dwell** for longer content, since threads accumulate weighted dwell time.\n- Deprioritize chasing likes as a goal. They are the weakest positive at 0.5.\n\nName explicitly which high-value action this post is engineered to earn. For\nconcrete weak-to-strong rewrites to pattern-match against, see\n[references/examples.md](references/examples.md). Before relying on any popular\nX-growth tactic, check it against [references/myths.md](references/myths.md).\nMuch common advice (hashtags, engagement-bait, post-volume, chasing likes) is\ncontradicted by the actual ranking code.\n\n### Step 3: negative-signal and suppression audit\nRun the checklist in\n[references/negative-signals.md](references/negative-signals.md). Confirm the\npost will not:\n- Provoke mute, report, or \"not interested\" from any audience segment.\n- Trip a visibility label (NSFW, gore, spam, `DO_NOT_AMPLIFY`, `MALICIOUS_URL`).\n  Vet links, media, avatar, and banner, since some labels are account-level.\n- Read as an engagement-bait or spam pattern (`SPAM_HIGH_RECALL`,\n  coordinated-spam detection).\n- Damage the account's blocks-and-reports-relative-to-likes ratio, the agatha\n  chain that silently caps stranger-reach.\n\nFlag that going viral *increases* scrutiny: Grox re-scans posts with an LLM at\n128 and again at 1,024 favorites, so clearly-viral content must be clearly clean.\n\n### Step 4: distribution tactics\nFrom [references/distribution-mechanics.md](references/distribution-mechanics.md):\n- **Original, fresh, and niche-consistent.** A post lives about 48 hours,\n  front-loaded. Originals reach strangers; replies and retweets carry a 0.75\n  out-of-network handicap and are cold-start-ineligible.\n- **Cold-start:** if the account has at most 1,000 followers, every fresh\n  original gets a roughly slot-15 injection, so lean into consistent originals.\n- **One strong post per session** (author-diversity decay: 2nd post ×0.625, 3rd\n  ×0.44).\n- **Differentiate on trends,** because the DPP rerank drops near-duplicate\n  embeddings from adjacent slots.\n- **Build mutual follows** for the +15 reply weight, which also flips\n  out-of-network into in-network reach.\n- **Timing:** post when the coherent audience is active, so early velocity, which\n  compounds through the engagement-count features, lands inside the window.\n\n### Step 5: (optional) score the draft\nRun the heuristic critic for a concrete before/after and a flagged report:\n\n```bash\npython scripts/post_critic.py \"your draft text here\"\n# or pipe a file:            python scripts/post_critic.py < draft.txt\n# or compare variants:       python scripts/post_critic.py --compare \"draft A\" \"draft B\"\n```\n\nIt estimates the post's action profile, computes the weighted score with the\nreal weight table, and flags hook strength, reply and forward potential, and\nnegative-signal risk. It is a heuristic writing aid, **not** a simulator of X's\nML model. Present it as directional, and explain *why* each flag fired using the\nreferences.\n\n## Output style\n\n- Give the **revised post** (or new draft) first, then a short, specific\n  rationale tied to mechanisms. For example: \"opens with a question, targeting\n  reply weight 5.0; no external link, avoiding MALICIOUS_URL risk and the low\n  0.2 link value.\"\n- Offer one or two variants when useful, such as a reply-optimized version and a\n  forward-optimized version.\n- Be honest about tradeoffs and uncertainty. The weights are a dated snapshot,\n  and the model is more complex than any checklist.\n\n## Scope and ethics\n\nThis skill optimizes **genuine, policy-compliant content** for legitimate reach.\nIt does **not** help with spam or engagement farming, coordinated inauthentic\nbehavior, buying or faking engagement, ban evasion, or evading safety labels on\ncontent that genuinely violates policy. The suppression mechanics in\n`references/negative-signals.md` are documented so honest creators avoid\n*accidentally* tripping classifiers, not to help anyone evade enforcement. If a\nrequest is for one of the excluded uses, decline and offer the legitimate\nalternative: make the content actually better.\n\n## Reference index\n\n- [references/scoring-weights.md](references/scoring-weights.md): the weight\n  table, the score formula, the offset transform, worked examples, and the\n  bidirectional-follow boost.\n- [references/distribution-mechanics.md](references/distribution-mechanics.md):\n  exactly what the model sees, retrieval paths, the out-of-network discount,\n  cold-start, diversity decay, DPP, and timing.\n- [references/negative-signals.md](references/negative-signals.md): filters,\n  visibility labels, the OON-only \"shadowban\" set, the agatha reputation chain,\n  and Grox.\n- [references/account-playbooks.md](references/account-playbooks.md): strategy by\n  account size and content format.\n- [references/examples.md](references/examples.md): worked weak-to-strong post\n  rewrites with the mechanism behind each.\n- [references/myths.md](references/myths.md): popular X-growth advice the ranking\n  code confirms or refutes, with citations.\n\n> Grounded in X's open-source For You algorithm (2026-08 snapshot). Weights are\n> production-synced defaults that X periodically updates, so re-derive from a\n> fresh clone of the algorithm repo if you need current exact values.\n\nFile v0.1.0:README.md\n\n<div align=\"center\">\n\n# X Algorithm Optimizer\n\n**An Agent Skill that writes tweets with knowledge reverse-engineered from X's\nopen-source ranking code.**\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Agent Skill](https://img.shields.io/badge/type-Agent%20Skill-8A2BE2.svg)](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)\n[![GitHub stars](https://img.shields.io/github/stars/zfoong/X-algorithm-optimizer?style=social)](https://github.com/zfoong/X-algorithm-optimizer/stargazers)\n[![Based on](https://img.shields.io/badge/grounded%20in-X%20open--source%20algorithm-000000.svg)](https://github.com/twitter/the-algorithm)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\n<sub>Every claim traces to a specific line of X's published algorithm.</sub>\n\n</div>\n\n---\n\nMost advice about \"growing on X\" is folklore. In August 2026, X open-sourced the\ncode that actually ranks the For You feed. This skill reads that code so your\nagent can write posts optimized for how the algorithm *really* scores and\ndistributes them, and can tell you exactly which mechanism each recommendation\ncomes from.\n\n## 🔑 The whole secret in one table\n\nX scores a post as a weighted sum of the actions it predicts a viewer will take.\nThe weights are wildly asymmetric, and that asymmetry is the entire game:\n\n| A viewer... | is worth | takeaway |\n|---|---:|---|\n| copies your link to share it | **+20.0** | forwarding beats everything |\n| replies / quotes / DMs it to a friend | **+5.0** | conversation and sharing |\n| follows you from the post | **+4.0** | |\n| **likes it** | **+0.5** | likes are nearly worthless |\n| taps \"not interested\" | **−43.2** | |\n| mutes you | **−58.8** | |\n| **reports it** | **−234.0** | one report cancels ~468 likes |\n\nA post whose negatives outweigh its positives does not just rank low. It\ncollapses to near zero and sinks. So the two laws are: **optimize for \"send to a\nfriend,\" not \"like,\"** and **avoiding negative signals beats chasing positive\nones.** The rest of the skill is the detail behind those two sentences.\n\n## 🧠 What it does\n\nPoint your agent at this skill and ask it to write or review a post. It reads\nX's published ranking code and drafts or critiques your post against the real\nscoring weights, retrieval paths, and suppression rules, runs a negative-signal\naudit, and explains the exact mechanism behind every suggestion. The result is\nposts optimized for how the For You feed actually distributes content.\n\n## 📦 Install\n\nThe skill is plain Markdown plus one optional, dependency-free Python script, so\nit works with any AI agent that can read files in your project. Clone it once:\n\n```bash\ngit clone https://github.com/zfoong/X-algorithm-optimizer\n```\n\nThen wire it into your agent:\n\n- **Claude Code:** clone (or symlink) it straight into your skills directory and\n  it loads automatically:\n  ```bash\n  git clone https://github.com/zfoong/X-algorithm-optimizer \\\n    ~/.claude/skills/x-algorithm-optimizer\n  ```\n- **OpenAI Codex:** keep the folder in your repo and reference `SKILL.md` from\n  your `AGENTS.md`, or open a session with \"read `x-algorithm-optimizer/SKILL.md`\n  and follow it.\"\n- **Cursor:** add the folder to your workspace and point the agent at it with\n  `@SKILL.md`, or register it as a project rule.\n\nFor any other assistant (Gemini CLI, GitHub Copilot, and the like), just have it\nread `SKILL.md`. That file is the entry point, and the agent pulls in the\n`references/` files only as a task needs them.\n\n## 🚀 Usage\n\nOnce your agent can see `SKILL.md`, just ask for post help. In Claude Code it\nactivates automatically; with other agents, name the skill or your posting task\nand it pulls in the right references. Try:\n\n```text\nWrite a tweet about my open-source side project. I have ~800 followers.\n```\n```text\nReview this draft before I post it: \"<your draft>\"\n```\n```text\nWhy isn't my post getting any reach beyond my followers?\n```\n```text\nGive me a reply-optimized and a forward-optimized version of this post.\n```\n\nThe agent will pull the exact weights and thresholds from the reference files,\ndraft or critique against them, run a negative-signal audit, and explain the\nmechanism behind each suggestion.\n\n## 🔍 The post critic\n\nA dependency-free heuristic scorer you can also run standalone. It estimates\nwhich actions your wording invites, scores the draft with the real weight table,\nand flags risks.\n\n```bash\npython scripts/post_critic.py \"your draft post here\"\n\n# compare two variants and pick the stronger one\npython scripts/post_critic.py --compare \"draft A\" \"draft B\"\n```\n\n```text\n============================================================\nX POST CRITIC - heuristic reach score (directional, not a model)\n============================================================\n\nEstimated weighted score: +0.081  [############------------]\nVerdict: ok\n\nFlags:\n  - [+] Forward-worthy framing detected. Targets the 20x copy-link share. Good.\n  - [+] Question present. Targets reply weight (5.0). Good.\n```\n\nIt is a writing aid, not a simulator of X's ML model (which never sees your raw\ntext). Treat the score as directional.\n\n## 📂 What's inside\n\n```\nx-algorithm-optimizer/\n├── SKILL.md                        the agent's playbook (the 5-step workflow)\n├── references/\n│   ├── scoring-weights.md          weight table, score math, offset transform\n│   ├── distribution-mechanics.md   what the model sees, retrieval, cold-start, DPP\n│   ├── negative-signals.md         filters, labels, the OON-only \"shadowban\" set\n│   ├── account-playbooks.md        strategy by account size and content format\n│   ├── examples.md                 worked weak-to-strong post rewrites\n│   └── myths.md                    popular advice the ranking code refutes\n├── scripts/\n│   └── post_critic.py              offline heuristic scorer (stdlib only, --compare)\n├── CONTRIBUTING.md\n├── LICENSE                         MIT\n└── README.md\n```\n\n`SKILL.md` is the entry point the agent loads. The `references/` files are\nprogressive detail it pulls in only when a task needs them, which keeps the\ncore playbook small.\n\n## ⚙️ How it works\n\nThe skill encodes four principles from the code:\n\n1. **The weight table is the value system.** Optimize for the high-weight\n   actions (forwarding, replies, follows), not the low-weight one (likes).\n2. **Negative signals dominate.** A single report or a spike in\n   blocks-relative-to-likes can collapse a post or apply an account-level label\n   that silently caps stranger-reach. Avoiding harm outranks chasing reach.\n3. **Reach is retrieval.** Strangers only see you if your content's embedding\n   sits near what they engage with, so niche consistency and early engagement\n   from a coherent audience are the real out-of-network levers.\n4. **Cite the mechanism.** Every recommendation names the file and value it\n   comes from, so advice is auditable and survives the algorithm changing.\n\n## 🎯 Accuracy and versioning\n\nGrounded in the **August 2026 snapshot** of X's open-source algorithm. The\nscoring weights are production-synced defaults that X periodically rewrites via\ncron, so exact decimals drift over time. The *structure* (what is rewarded, what\nis suppressed, how distribution works) is far more stable than the numbers. To\nrefresh values, re-derive them from a fresh clone of the algorithm repo,\nstarting with `home-mixer/params/param.rs`.\n\nThis is an independent analysis of public code. It is not affiliated with,\nendorsed by, or an official product of X.\n\n## 🤝 Contributing\n\nContributions are welcome: refreshed weights after an upstream change, new myths\nwith citations, additional worked examples, or critic improvements. See\n[CONTRIBUTING.md](CONTRIBUTING.md). The one hard rule: every factual claim must\ncite the specific file or value in X's algorithm it comes from.\n\n## ⚖️ Scope and ethics\n\nThis skill optimizes **genuine, policy-compliant content** for legitimate reach.\nIt does **not** assist with spam or engagement farming, coordinated inauthentic\nbehavior, fake or bought engagement, ban evasion, or evading safety labels on\ncontent that genuinely violates policy. The suppression mechanics are documented\nso honest creators avoid accidental throttling. The most durable way to win this\nalgorithm is to make content people genuinely want to forward.\n\n## 📜 License and attribution\n\nReleased under the [MIT License](LICENSE).\n\nThe skill is an independent work: original documentation, analysis, and code.\nThe factual claims are derived from reading X's\n[open-source algorithm](https://github.com/twitter/the-algorithm), which is\npublished under Apache-2.0. Facts and mechanisms are not themselves\ncopyrightable; this repository contains none of X's source code.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn748dp8yh73kxrjv4kabz7p6d8ch4pe\",\n  \"slug\": \"x-algorithm-optimizer\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786769599304\n}\n\nFile v0.1.0:references/account-playbooks.md\n\n# Account Playbooks: strategy by situation\n\n> Derived from [scoring-weights.md](scoring-weights.md),\n> [distribution-mechanics.md](distribution-mechanics.md), and\n> [negative-signals.md](negative-signals.md). Match the user's situation to a\n> playbook, then draft against it.\n\n## A. Cold-start account (≤ 1,000 followers)\n\nYou have one structural superpower: the **cold-start boost** injects one fresh\noriginal post near slot 15 per eligible feed load, as long as you're under\n1,000 followers, the post is an original under 24h with < 1,000 impressions.\n\nPlaybook:\n- **Post originals only for growth.** Replies and retweets are cold-start-\n  ineligible AND OON-discounted. Save replies for relationship-building with\n  specific accounts, not reach.\n- **Pick one niche and stay in it.** Consistency builds a clean embedding\n  neighborhood so two-tower retrieval delivers you to the right strangers. Every\n  off-topic post muddies your cluster and wastes retrieval.\n- **Optimize each post for one reply-worthy idea.** Reply weight (5.0) is your\n  most reachable high-value action at low follower counts.\n- **One quality post > many posts.** Diversity decay means your 3rd post today\n  scores ×0.44. Cadence: 1–2 excellent originals/day beats 10.\n- **Convert engagers to mutual follows.** Mutual follow = +15 reply weight and\n  flips your OON 0.75 handicap into easy in-network reach.\n- **Watch your blocks/reports-vs-likes ratio from day one.** The agatha\n  denominator is OON favs, and small accounts have thin denominators, so a\n  couple of reports hurt disproportionately.\n\n## B. Growth account (1k–50k)\n\nYou've lost the cold-start boost; now it's pure content-quality + velocity.\n- **Front-load engagement velocity.** Engagement counts are model inputs;\n  the first hour shapes scoring for everyone after. Post at your audience's\n  peak, and seed genuine early replies (ask a real question in the post).\n- **Engineer forwarding, not liking.** The gap between copy-link share (20) and\n  like (0.5) is your whole opportunity. Make posts people *send* someone:\n  genuinely useful, reference-worthy, \"this explains the thing you asked about.\"\n- **Threads for dwell.** Continuous dwell time is weighted (0.004/unit) and\n  compounds on longer content that holds attention. A strong thread earns dwell\n  that single posts can't.\n- **Differentiate on trends (DPP).** When jumping a trend, take the orthogonal\n  angle, since near-duplicate embeddings get dropped from adjacent slots.\n\n## C. Established account (50k+)\n\nYour risk shifts from \"getting seen\" to \"not getting throttled.\"\n- **Protect account reputation.** At scale, one pattern that spikes\n  blocks/reports-per-fav can apply an account-level `DO_NOT_AMPLIFY` /\n  `SPAM_HIGH_RECALL` / abusive label that silently caps *all* your OON reach.\n- **Clean at virality.** Grox re-scans at 128 and 1,024 favs. Anything that\n  could read as borderline is riskiest exactly when it's taking off.\n- **Still one strong post per slate.** Diversity decay applies at every size.\n- **Mutual-follow core.** A large mutual-follow base is a durable ranking\n  asset (+15 reply weight, in-network reach that skips the OON discount).\n\n## D. By content format\n\n| Format | Algorithm reality | Move |\n|---|---|---|\n| Single text post | Cheap, but no dwell accumulation | Make it forwardable or reply-provoking |\n| Thread | Earns dwell time (0.004/unit), holds attention | Strong hook first post; each post must pull the next |\n| Video | VQV only counts if **≥ 10s**; video open +0.05 | Make videos ≥10s; hook in first 2s to beat scroll-past (−0.02) |\n| Image post | has_media is a feature; clean media only | Ensure media can't read as NSFW/gore to the classifiers |\n| Reply | OON-discounted, cold-start-ineligible | Use for relationships, not reach |\n| Quote | +5.0, and original | Great for reach if you add real value over the quoted post |\n| Link post | Link opens are low value (0.2) and `MALICIOUS_URL` risk | Vet the domain; put the value in the post, not behind the link |\n\n## E. The universal draft checklist\n\nFor any post, run these in order:\n1. **Hook** survives the first-2-seconds scroll test (avoid the −0.02\n   not-dwelled penalty).\n2. **One high-value action** the post is designed to earn: a reply (a real\n   question / a take worth answering), a forward (useful/reference-worthy), or a\n   quote (add-able). Name it explicitly.\n3. **Negative-signal audit.** See the checklist in\n   [negative-signals.md](negative-signals.md). Would any segment mute/report it?\n4. **Original + fresh + on-niche.**\n5. **Differentiated** from the current wave if trend-jacking.\n6. **Cadence.** Is this the one post for this session, or are you diluting\n   yourself via diversity decay?\n\nFile v0.1.0:references/distribution-mechanics.md\n\n# Distribution Mechanics: how a post reaches people\n\n> Source: `home-mixer/sources/`, `home-mixer/models/candidate.rs`,\n> `home-mixer/util/phoenix_request.rs`, `home-mixer/scorers/ranking_scorer.rs`,\n> `home-mixer/scorers/author_cold_start.rs`, `home-mixer/params/config.rs`,\n> `vm-ranker/dpp.rs`, `thunder/`, `simclusters/`, `phoenix/`. 2026-08 snapshot.\n\nThere are two audiences for any post: **in-network** (your followers) and\n**out-of-network / OON** (everyone else, reached through ML retrieval).\nReaching followers is easy. Reaching strangers is where the algorithm gates\nhard, and nearly every mechanic below is about OON reach.\n\nFeed sizing constants for context (`config.rs`): the pipeline scores up to\n**2,800** candidates (`PHOENIX_CLIENT_MAX_CANDIDATES`), selects the top **50**\n(`TOP_K_CANDIDATES_TO_SELECT`), and the final For You response is about **35**\nposts (`RESULT_SIZE`) plus feed modules. So on the order of a thousand\ncandidates compete for a few dozen slots per refresh.\n\n## 1. Exactly what the model sees (and does not)\n\nThe per-candidate message sent to the ranking model is `TweetInfo`, built in\n`home-mixer/models/candidate.rs::as_tweet_info`. There is **no raw post text,\nno raw media, and no hashtag field**. The complete per-post feature set is:\n\n- **Identity and graph:** `tweet_id`, `author_id`, the quoted / reply / retweet\n  tweet and author IDs, `is_author_followed_by_user`, and `is_following_user`\n  (does the author follow the viewer back). Note `is_following_user` is only\n  populated when the post is **not** a retweet, so the mutual-follow signal is\n  carried on originals and replies, not reposts.\n- **Semantic IDs:** `semantic_ids`, discrete tokens from a multimodal embedding\n  of the post, hydrated by `semantic_id_hydrator.rs`. This is the model's *only*\n  view of your content. Text and media are compressed into this embedding\n  upstream.\n- **Engagement counts (bucketed):** `fav_count`, `retweet_count`, `quote_count`,\n  `reply_count`, `view_count`, `bookmark_count`. These are direct inputs, so\n  early engagement literally becomes a feature the model reads for every later\n  viewer. Bookmark count is an input even though bookmark has no ranking weight,\n  which means bookmarks quietly signal quality to the model.\n- **Bool flags:** `has_media`, `is_retweet`, `is_quote`, `is_reply`.\n- **Media and language:** `min_video_duration_ms`, `language_code`.\n\nThe viewer side (`build_user_context` in `phoenix_request.rs`) is where heavy\npersonalization lives. The model also receives, per request: user age bracket\nand exact age, declared and inferred gender (plus an inferred-gender\nconfidence), user state, followed Grok topics, followed starter packs,\nlatitude/longitude, DMA (media market) code, installed apps, timezone, device\nnetwork type, and country. This is why the *same* post ranks very differently\nfor two viewers: geography, topic-follows, and demographics all condition the\nprediction.\n\n**Consequences for a creator:**\n1. **Consistency wins.** Posting in a coherent niche gives you a clean,\n   recognizable embedding neighborhood, so the two-tower model can retrieve you\n   to the exact users who engage with that neighborhood.\n2. **Early velocity compounds.** Because engagement counts are inputs, the first\n   30 to 60 minutes of engagement shape how the model scores you for everyone\n   after (a rich-get-richer effect).\n3. **Wording tricks do not fool the ranker,** but they do change your embedding\n   and they drive the human actions the model predicts. Write for humans; the\n   embedding follows.\n\n## 2. Retrieval: how you become a candidate at all\n\n### Thunder (in-network / followers), `thunder/`\n- Serves recent posts from accounts the viewer follows, sorted purely by\n  **recency**, with no ML ranking. Posts are held in memory only inside a\n  retention window; once a post ages past it, it is evicted and no longer\n  served.\n- Per-author caps: 50 original posts, 30 replies, 100 videos. The following\n  list is capped at 10,000 accounts. `ThunderMaxResults` is 1,200.\n- **Takeaway:** for followers, posting recently gets you in, but you compete\n  against your own recent posts (the per-author caps) and everything ages out\n  of the window.\n\n### Phoenix retrieval (two-tower), the main OON discovery path\n- A candidate tower embeds every post from its post and author multimodal\n  embeddings and L2-normalizes it. The viewer's engagement-history sequence\n  builds a user vector. The nearest posts by dot product are retrieved, up to\n  1,000 (`PhoenixMaxResults`).\n- **Takeaway:** you become retrievable to a stranger when your content's\n  embedding sits near what that person has historically engaged with, even with\n  zero follow relationship. This is the single biggest OON growth lever, and it\n  is driven by niche consistency.\n\n### SimClusters, engagement-neighborhood retrieval\n- For each post the viewer recently engaged with, it does a nearest-neighbor\n  lookup. Your post enters a cluster based on **who favorited it** (log-fav\n  weighted). Constraints: cosine similarity at least 0.5, **post age under 48\n  hours**, up to 800 results.\n- **Takeaway:** getting favorited early by a *coherent* audience places you in a\n  clean cluster and makes you retrievable here. Scattered likes from an\n  incoherent audience muddy your cluster.\n\n### Indexing (phoenix-rankall)\n- Nearly everything is indexed. There is no rich safety filter at admission,\n  only hard blacklists and zero-ID drops. **Suppression happens at scoring and\n  serving, not at admission.** See [negative-signals.md](negative-signals.md).\n\n## 3. The multipliers applied after scoring\n\n### Out-of-network discount, ×0.75\nEvery OON post's final score is multiplied by **0.75** (`OonWeightFactor`,\nconfirmed by the test `applies_oon_discount_to_out_of_network`). Two important\nextensions:\n- In-network **replies and retweets** are *also* discounted 0.75 by default\n  (`EnableOonRescoreForInNetworkRepliesRetweets`). Only original in-network\n  posts escape the discount.\n- Topic-request OON uses ×0.5 (`TopicOonWeightFactor`).\n- **New-viewer crush:** for a brand-new viewer account (younger than the\n  configured age threshold, with at least `NEW_USER_MIN_FOLLOWING = 5` follows),\n  the OON factor collapses to `NEW_USER_OON_WEIGHT_FACTOR = 0.00001`. New users\n  see almost exclusively in-network content. This is about the *viewer* being\n  new, not the author.\n- **Takeaway:** original posts are your reach vehicle. A reply or retweet starts\n  at a 25% handicap for stranger reach.\n\n### Author-diversity decay\nThe k-th post from the same author already ranked above in a viewer's slate is\nmultiplied by `(1 − 0.25)·0.5^k + 0.25` (`AuthorDiversityDecay = 0.5`,\n`AuthorDiversityFloor = 0.25`):\n- 1st post ×1.0, 2nd ×0.625, 3rd ×0.4375, asymptote ×0.25.\n- **Takeaway:** one strong post per session beats five mediocre ones. Flooding\n  the timeline actively demotes your own later posts.\n\n### Cold-start boost (the small-creator on-ramp)\n`author_cold_start.rs`. One post per eligible feed load is lifted to the score\nof roughly **slot 15 to 16** if ALL of these hold:\n- author has **at most 1,000 followers** (`ColdStartFollowerCap`),\n- the post is an **original** (not a reply, not a retweet),\n- the post has **under 1,000 impressions** (`ColdStartImpressionThreshold`, read\n  from `view_count`),\n- the post is currently ranked within the top 85% of the nonzero-scored slate\n  (`LowImpressionsMaxPositionRatio = 0.85`),\n- in the treatment arm, the post is **under 24 hours old**\n  (`ColdStartMaxPostAgeSecs = 86400`).\n\nThe target score is drawn randomly from the score sitting at rank 15 to 16\n(`ColdStartSlotMin`/`Max`), and only the single best-eligible under-exposed post\nis lifted per request.\n- **Takeaway:** if you are under 1,000 followers, every fresh original gets one\n  guaranteed injection near slot 15 into feeds where it is retrieved. This is the\n  biggest structural gift for new accounts, and it applies only to original\n  posts under 24 hours old. Post originals, consistently, while you are small.\n\n## 4. DPP diversity rerank (vm-ranker), theta = 0.65\n\nThe final rerank (`vm-ranker/dpp.rs`) greedily builds the slate from the top\n**150** candidates (`VMRankerDppMaxSelectedRank`), trading each candidate's\n**score** against its **redundancy** to already-selected posts. The kernel is\n`K[i][j] = qf_i · qf_j · cos(embedding_i, embedding_j)`, where\n`qf_i = exp(alpha · q_i)`, `q_i` is the score normalized by the pool's max\nscore, and `alpha = theta / (2(1 − theta))` (about 0.93 at theta 0.65). The\nsimilarity is cosine over the same multimodal embeddings used in retrieval,\nstored as f16 vectors. Greedy selection stops at `top_k` or when the marginal\ngain falls below 1e-6 (near-duplicate exhaustion).\n\nBehavior (from the tests in `dpp.rs`): among near-identical embeddings only the\nsingle highest scorer survives, and an orthogonal (differentiated) candidate is\npromoted even at a lower raw score.\n- **Takeaway:** during a trend, do not post the same take as everyone else. Your\n  embedding collides with higher-scored posts and you are dropped from adjacent\n  slots. Post the orthogonal angle. Distinctiveness is rewarded at rerank,\n  independent of your own score.\n\n## 5. Timing and freshness: the 48-hour game\n\n- Hard `AgeFilter`: posts older than **48 hours are removed** from the feed\n  entirely (`MAX_POST_AGE = 48h`). The filter also drops a post if its creation\n  time cannot be read.\n- SimClusters excludes posts older than 48 hours from retrieval.\n- Post age is a direct model feature, and cold-start requires under 24 hours.\n- Served-post dedup excludes your last 100 served posts for 10 minutes.\n- **Takeaway:** a post has roughly a 48-hour life, front-loaded into the first\n  hours. Post when your coherent audience is active, so early engagement\n  velocity (which compounds via the engagement-count features) lands inside the\n  window.\n\n## Note: scoring is skipped on cached posts\n\n`PhoenixScorer` does not re-score posts served from the request cache\n(`has_cached_posts`), and there is a kill-switch decider for the ranker. A\nseparate new-user history threshold can route accounts with short engagement\nhistories to a different model cluster. These are serving details, but they\nexplain why the same post can score slightly differently across refreshes.\n\n## Priority order of levers (highest ROI first)\n\n1. **Provoke high-value actions** (reply, quote, copy-link and DM share). See\n   [scoring-weights.md](scoring-weights.md).\n2. **Never trip negative signals or suppression labels.** See\n   [negative-signals.md](negative-signals.md).\n3. **Post original, fresh, niche-consistent content** (retrieval and cold-start).\n4. **One strong post per session** (diversity decay).\n5. **Differentiate from the current trend wave** (DPP).\n6. **Build mutual-follow relationships** (+15 reply boost, easy OON-to-in-network\n   flips).\n\nFile v0.1.0:references/examples.md\n\n# Before / After: worked rewrites\n\n> Concrete transformations showing the principles applied. Each pairs a weak\n> draft with a stronger rewrite and names the mechanism that makes the\n> difference. Use these as patterns, not templates. The point is the reasoning.\n\n---\n\n### 1. Like-bait → forwardable\n\n**Before:** *\"AI is changing everything. Like if you agree! 🚀\"*\n- Targets only the like (0.5). \"Like if you agree\" is engagement-bait →\n  `not_interested`/`mute` risk and `SPAM_HIGH_RECALL`. No reason to reply or\n  forward. Vague, so it doesn't land in a clean embedding neighborhood.\n\n**After:** *\"The one AI workflow that actually saved me time this year: draft\nin bullet points, let the model expand, then cut 30%. The expand-then-cut order\nis the whole trick. What's your current writing loop?\"*\n- Concrete + reference-worthy → targets copy-link share (20) and DM share (5).\n- Ends on a genuine question → reply (5).\n- Specific topic → clean embedding cluster → better out-of-network retrieval.\n- No bait, no negative-signal risk.\n\n---\n\n### 2. Hot-take rage-bait → substantive stance\n\n**Before:** *\"Unpopular opinion: everyone using [framework] is just too lazy to\nlearn real engineering. Cope.\"*\n- \"Unpopular opinion\" + \"cope\" = rage markers. Provokes block/mute/report\n  (−31.2 / −58.8 / −234) and inflates the agatha blocks-per-fav ratio → account\n  label → silent out-of-network throttle. Net-negative EV.\n\n**After:** *\"[Framework] optimizes for shipping speed at the cost of runtime\ncontrol. That's the right trade for 90% of apps and the wrong one for the other\n10%. Here's how I decide which project I'm on 👇\"*\n- Same strong opinion, but defensible and useful → invites quote (5) and reply\n  (5) instead of blocks.\n- Thread lead-in → dwell time + follow.\n- Doesn't spike the reputation ratios that cap reach.\n\n---\n\n### 3. Link dump → value-in-post\n\n**Before:** *\"Great read on scaling Postgres 👇 https://example.com/blog/post\"*\n- Almost all value is behind the link. Link-open is only +0.2; click +0.4.\n  Nothing to reply to or forward. If the domain is ever flagged, `MALICIOUS_URL`\n  drops it out-of-network.\n\n**After:** *\"Scaling Postgres, the 3 changes that mattered most for us: (1)\nconnection pooling before read replicas, (2) partition the biggest table early,\n(3) `pg_stat_statements` is non-negotiable. Full write-up in replies. Which one bit\nyou hardest?\"*\n- The post itself is the value → forwardable (copy-link 20, DM 5).\n- Link moved to a reply, so the main post keeps attention and dwell.\n- Question → reply (5).\n\n---\n\n### 4. Hashtag spray → clean\n\n**Before:** *\"New blog post! #tech #ai #ml #coding #dev #startup #productivity\"*\n- 6 hashtags: no ranking benefit (no hashtag feature exists in the model),\n  reads as spammy, weakens the hook, nudges `not_interested`.\n\n**After:** *\"Spent the weekend making our build 4× faster. The surprise: 80% of\nthe win was one cache config nobody had touched in two years. Write-up soon —\nwhat's the most embarrassing quick-win you've shipped?\"*\n- Zero hashtags. The topic words do the discovery work via the embedding.\n- Story + vulnerability + question → reply and forward.\n\n---\n\n### 5. Reach-farming reply → original post\n\n**Before (as a reply under a 500k account):** *\"So true! 💯 Follow me for more\ntakes like this!\"*\n- Replies are out-of-network-discounted (×0.75) and cold-start-ineligible.\n  \"Follow me for more\" is bait. Adds nothing → no forward, no genuine reply.\n\n**After (as your own original):** *\"Watched a 500k account explain [topic] today\nand realized the thing they skipped: [specific insight]. Here's the part that\nactually matters in practice…\"*\n- Original → eligible for cold-start boost (if <1k followers) and full\n  (undiscounted) ranking.\n- Builds on the idea with a specific insight → quote/forward-worthy.\n\n---\n\n### 6. \"Comment below\" bait → real question\n\n**Before:** *\"What do you think? Comment below!! 👇👇\"*\n- Generic bait, no substance to react to. The empty prompt reads as\n  engagement-bait, not conversation.\n\n**After:** *\"If you could delete one meeting from every week permanently, which\none — and what would you do with the hour?\"*\n- A specific, low-effort-to-answer, genuinely interesting question → high reply\n  probability (5) without any bait pattern.\n- Universally relatable → wide embedding reach, broad reply base.\n\n---\n\n## The transformation checklist these share\n\nEvery \"after\" does some subset of:\n1. **Moves value into the post** so it's forwardable (chase the 20, not the 0.5).\n2. **Ends on a specific, answerable question** (chase the 5).\n3. **Holds a defensible stance** instead of a provocative one (avoid −234/−58.8).\n4. **Is a self-contained original** (reach vehicle + cold-start eligibility).\n5. **Is specific to one niche** (clean embedding → better retrieval).\n6. **Drops the bait and the hashtag spray** (no spam-classifier or negative-feedback risk).\n\nFile v0.1.0:references/myths.md\n\n# Myth-Busting: common X advice the code contradicts\n\n> Each entry cites the mechanism in X's open-source algorithm that confirms or\n> refutes it. This is the skill's biggest edge over generic \"grow on X\" advice:\n> most of that advice is folklore the actual ranking code disproves.\n\n### Myth: \"Hashtags boost your reach.\"\n**False.** The per-candidate features the ranking model receives (`TweetInfo`,\nbuilt in `home-mixer/models/candidate.rs`) contain **no hashtag signal** at all.\nThe model conditions on a semantic embedding, engagement-count buckets, graph\nrelationship, post age, and media flags. Hashtags only matter insofar as they\nshift your text embedding. Meanwhile 3+ hashtags correlate with spam patterns\nand weaken the human hook. Use 0–1, for genuine discoverability only.\n\n### Myth: \"Ask for likes/retweets, engagement bait works.\"\n**False and actively harmful.** \"Like if you agree / RT to win / follow for\nfollow / comment GO\" patterns are exactly what the spam classifiers target\n(`SPAM_HIGH_RECALL` → out-of-network drop) and they provoke `not_interested`\n(−43.2) and `mute` (−58.8). You trade a few cheap likes (0.5 each) for\nnegative signals worth ~100× more each.\n\n### Myth: \"Post as often as possible to maximize reach.\"\n**False.** Author-diversity decay multiplies your k-th post in a viewer's slate\nby `(1−0.25)·0.5^k + 0.25`: 2nd post ×0.625, 3rd ×0.44, floor ×0.25\n(`ranking_scorer.rs`). Flooding demotes *your own* later posts. One strong\noriginal per session beats ten.\n\n### Myth: \"Likes are the metric that drives distribution.\"\n**False.** Favorite weight is **0.5**, the lowest positive. Copy-link share is\n**20**, reply/quote/DM-share **5**, follow **4** (`param.rs`). The algorithm\nrewards forwarding and conversation, not approval.\n\n### Myth: \"Controversy and ratio-bait drive reach.\"\n**False over any horizon beyond one post.** agatha computes\nblocks-per-favorite, reports-per-favorite, and spam-reports-per-favorite where\nthe denominator is *out-of-network favorites*. High ratios apply account-level\nlabels (`ABUSIVE_HIGH_RECALL`, `DO_NOT_AMPLIFY`, spam) that silently cap your\nstranger-reach. One report is −234. Controversy inflates the numerator faster\nthan the likes inflate the denominator.\n\n### Myth: \"The algorithm hates external links, never post them.\"\n**Nuanced, not a blanket ban.** There is no flat link penalty; link-open is a\npositive action (+0.2) and click is +0.4. The real issues are: (1) a\n`MALICIOUS_URL` label drops you out-of-network, so a sketchy domain/shortener\nhurts; (2) links are low-value actions and pull attention off-platform, costing\ndwell. Verdict: links are fine. Vet the domain, and put the value in the post\nitself rather than behind the link.\n\n### Myth: \"Video always gets boosted.\"\n**Nuanced.** Video-open and video-quality-view are only **+0.05** each, and VQV\nrequires the video to be **≥ 10 seconds** (`MinVideoDurationMs`). Video isn't\ninherently boosted; it just adds low-weight actions plus dwell-time potential.\nA great text thread can out-dwell a weak video.\n\n### Myth: \"New accounts can't get any reach.\"\n**False. New accounts have a structural on-ramp.** The cold-start boost injects\none fresh (<24h) **original** post from a ≤1,000-follower account near slot 15\nper eligible feed load (`author_cold_start.rs`). The catch: it must be an\noriginal (not a reply/retweet) and you must not sabotage it with negative\nsignals. (Note the separate fact that new *viewers* see mostly in-network\ncontent, which is about who's watching, not who's posting.)\n\n### Myth: \"Reply under big accounts to ride their reach.\"\n**Nuanced.** Replies are out-of-network-discounted (×0.75) and are\n**cold-start-ineligible**. Replying gets you visibility to that thread's\nin-network audience, which is a real relationship and visibility play, but it is\nnot an algorithmic out-of-network reach vehicle. For reach, post originals.\n\n### Myth: \"The algorithm reads my post and judges its quality.\"\n**False.** The model never sees your raw text. It sees an embedding plus\nengagement counts and graph/context features (`candidate.rs`,\n`phoenix_request.rs`). It infers quality *indirectly* from the human actions it\npredicts, not from comprehension. This is why early engagement from a coherent\naudience matters so much: it's the signal the system actually reads.\n\n### Myth: \"Delete and repost underperformers to get a second shot.\"\n**Weak/false.** Previously-seen and previously-served posts are filtered\n(`PreviouslySeenPostsFilter`, served-dedup of your last 100 for 10 min), and\nreposting identical content lands in the same embedding neighborhood with the\nsame weak predicted-action profile. Rework the content, don't recycle it.\n\n### Myth: \"Editing a post kills its reach.\"\n**Mostly false.** `DropStaleTweetsRule` drops the *superseded* (old) edit\nversion, not your current one. Editing doesn't penalize the live post; it just\nretires the stale copy.\n\n---\n\n**The through-line:** almost every piece of popular X-growth advice optimizes\nfor *likes and volume*. The code optimizes for *forwarding, conversation, and\nnot annoying people*. When folklore and the weight table disagree, trust the\nweight table.\n\nFile v0.1.0:references/negative-signals.md\n\n# Negative Signals and Suppression: what quietly kills reach\n\n> Source: `home-mixer/filters/`, `visibility-filtering/rules/registry.rs`,\n> `agatha/scalding/labels/`, `grox/flows/`, `media-model-proxy/`,\n> `pnsfwmedia/`. 2026-08 snapshot.\n>\n> **Purpose of this file:** so honest creators do not *accidentally* trip\n> classifiers and lose reach they earned. It is a map of the tripwires, not a\n> guide to evading enforcement. Content that genuinely violates policy is\n> supposed to be suppressed, and nothing here helps with that.\n\nThree layers remove or throttle a post, in order:\n\n1. **Pre-scoring filters:** hard drops before ranking.\n2. **Ranking penalties:** the negative-signal weights plus the offset collapse\n   (see [scoring-weights.md](scoring-weights.md)).\n3. **Visibility filtering (VF):** post and account labels that drop a post,\n   often **only for out-of-network viewers**. This is the \"your followers still\n   see it but strangers never do\" mechanism.\n\n## Layer 1: pre-scoring filters (hard drops)\n\nYour post is removed outright, before it is even scored, if any of these hold.\nThey run in this order in `phoenix_candidate_pipeline.rs`:\n\n| Trigger | Filter |\n|---|---|\n| Older than **48 hours**, or creation time unreadable | `AgeFilter` |\n| It is your own post (in your own feed) | `SelfTweetFilter` |\n| It is an OON **retweet or reply**, or a reply whose parent is missing | `OONRetweetReplyFilter` |\n| SimClusters-sourced, OON, author flagged NSFW | `OONNsfwSimclustersFilter` |\n| Viewer muted or blocked you, or you blocked them (either direction, including quoted/retweeted authors) | `AuthorSocialgraphFilter` |\n| Post matches the viewer's muted keywords | `MutedKeywordFilter` |\n| Subscriber-only content the viewer cannot access | `IneligibleSubscriptionFilter` |\n| Duplicate, already-seen, or already-served | dedup and seen filters |\n| For brand-new/resurrected viewers only: OON post below an engagement threshold | `NewUserMinEngagementFilter` (off by default) |\n\n**Creator takeaways:** post **originals** (OON replies and retweets are dropped\nfor stranger reach), publish while fresh, and do not repeat yourself into the\nseen filters.\n\n## Layer 3: visibility-filtering labels\n\nVF returns ALLOW, INTERSTITIAL (blur behind a tap), or DROP per post and viewer.\nThe first rule that says DROP wins and evaluation stops. Nearly all rules exempt\nthe author viewing their own post, which is exactly why suppression is invisible\nto the person being suppressed: you always see your own post looking normal.\n\n### Drops that apply to everyone (in-network and OON)\nSuspended, deactivated, erased, or protected author; viewer blocks or mutes\nauthor; and the safety labels `PDNA`, `BOUNCE`, `SPAM`,\n`FOSNR_HATEFUL_CONDUCT`, `FOSNR_VIOLENT_SPEECH`, `FOSNR_ABUSE`,\n`FOSNR_CIVIC_INTEGRITY`, legal takedowns matching the viewer's country, and\nnullcast (ads-only) posts.\n\n### Interstitial (blurred, not dropped)\n`NSFW_HIGH_PRECISION`, `GORE_AND_VIOLENCE_HIGH_PRECISION`, `NSFW_CARD_IMAGE`,\nand NSFW-flagged author with media. Shown behind a tap-through unless the viewer\nopted into sensitive media. Also age-gated: dropped for logged-out or under-18\nviewers, and for viewers with no stated age in a list of 16 countries.\n\n### The \"shadowban\" set: DROP for OON only, ALLOW for followers\nThese fire **only** for recommended (stranger) distribution. Your followers see\nthe post normally; it simply never reaches anyone who does not follow you. This\nis the precise mechanism people call shadowbanning:\n\n- **Tweet and media labels:** `NSFW_HIGH_RECALL`, `NSFW_HIGH_PRECISION`,\n  `GORE_AND_VIOLENCE_HIGH_PRECISION`, `NSFW_CARD_IMAGE`, `NSFW_TEXT`,\n  `DO_NOT_AMPLIFY`, `MALICIOUS_URL`, `SPAM_HIGH_RECALL`, `FOSNR_ABUSE_INSULTS`,\n  DMCA media, and geo-restricted media.\n- **Account labels:** `NSFW_HIGH_RECALL`, `NSFW_HIGH_PRECISION`,\n  `NSFW_NEAR_PERFECT`, `NSFW_AVATAR_IMAGE`, `NSFW_BANNER_IMAGE`,\n  `SPAM_HIGH_RECALL`, `COMPROMISED`, `READ_ONLY`,\n  `IMPERSONATION_HIGH_PRECISION`, `ABUSIVE_HIGH_RECALL`, `DO_NOT_AMPLIFY`.\n\nA few of these (`ABUSIVE_HIGH_RECALL`, account-level `DO_NOT_AMPLIFY`,\n`FOSNR_ABUSE_INSULTS`) additionally allow existing followers, so their\nsuppression is specifically a reach-to-strangers penalty. Note that a couple of\nharsh-sounding labels, `EGREGIOUS_NSFW` and `RECOMMENDATIONS_BLACKLIST`, are\n**not** wired to drop in this code.\n\n**Creator takeaways:**\n- A `MALICIOUS_URL` label drops you OON, so vet every link and shortener you post.\n- A NSFW avatar or banner can suppress *all* your posts to strangers even when\n  the posts themselves are clean, because those are account-level labels.\n- `DO_NOT_AMPLIFY` and `SPAM_HIGH_RECALL` are account-level, so one bad pattern\n  can throttle your whole account's stranger-reach while your follower feed looks\n  untouched. You may never notice.\n\n## The account-reputation chain (agatha): the slow killer\n\n`agatha/scalding/labels/` computes smoothed ratios per account, where the\ndenominator is **out-of-network favorites only**. The formula (from\n`RateBasedLabels.scala`, smoothing constant 0.1) is roughly\n`score = (interactions + 0.1) / (interactions + oon_favs + small_term)`, so a\nhigher ratio is worse:\n\n- **BlocksPerFav:** distinct users who blocked you, divided by OON favs.\n- **ReportsPerFav:** distinct abuse reports, over a 180-day window.\n- **SpamReportsPerFav:** distinct legitimate spam tattles.\n\nHigh ratios feed the NSFW, spam, and abusive user models, which produce the\naccount-level labels in the OON-only drop set above. The causal chain:\n\n```\naudience reacts badly (blocks / reports / spam-flags relative to likes)\n    -> agatha ratio rises\n    -> NSFW / spam / abusive-high-recall account label\n    -> silent OON-only drop (followers still see you; strangers do not)\n```\n\n**Creator takeaway:** the ratio is *relative to your likes*. A post that earns\nlots of likes and a few blocks is fine. A post that earns few likes and some\nblocks is dangerous. This is the mathematical reason rage-bait backfires: it\ninflates the numerator faster than the denominator.\n\n## Grox: the LLM re-scan that scales WITH virality\n\n`grox/flows/ptos/` runs LLM classifiers (Grok/Gemma) over posts for\nAdultContent, ViolentMedia, Spam, IllegalAndRegulatedBehaviors, HateOrAbuse,\nViolentSpeech, SuicideOrSelfHarm, and ChildSafety. Verdicts are written back to\nthe safety stores that become the `SPAM`, `NSFW_*`, `FOSNR_*`, and\n`DO_NOT_AMPLIFY` labels the VF rules read.\n\nEscalation is **fav-gated** (`ptos/constants.py`): at **128 favorites** a post\ngets a deluxe re-check, and at **1,024 favorites** it is re-checked by a stronger\ninternal model. High-fav posts with media get an injected adult-content recheck.\n\n**Creator takeaway:** going viral triggers *more* scrutiny, not less. A post\nthat skated by at 50 favorites can be relabeled and suppressed at 128. Borderline\ncontent is riskiest precisely when it is working, so keep clearly-viral content\nclearly clean.\n\n## The single defensive checklist\n\nBefore posting, confirm none of these apply:\n1. Any audience segment likely to **mute, report, or tap \"not interested\"**?\n   (Those weights are −58.8, −234, and −43.2, and a net-negative post collapses.)\n2. Links vetted, with no shortener or domain that could read as `MALICIOUS_URL`?\n3. Media clean, and avatar and banner clean (they carry account-level NSFW\n   labels)?\n4. Not an engagement-bait or spam pattern (follow-for-follow, \"reply GO\", mass\n   identical replies), which risk `SPAM_HIGH_RECALL` and coordinated-spam\n   detection?\n5. If it is likely to exceed 128 favorites, is it clean enough to survive an LLM\n   re-scan?\n6. Are your blocks-and-reports-relative-to-likes ratios staying healthy across\n   recent posts?\n\nFile v0.1.0:references/scoring-weights.md\n\n# Scoring Weights: how a post's rank is computed\n\n> Source: X's open-source For You algorithm, `home-mixer/params/param.rs`,\n> `home-mixer/params/config.rs`, and `home-mixer/scorers/ranking_scorer.rs`.\n> Values are the production-synced defaults as of the 2026-08 repository\n> snapshot. X periodically rewrites these defaults via cron to track live\n> production, so treat exact numbers as a snapshot and re-derive from a fresh\n> clone if precision matters.\n\n## The formula\n\nThe Phoenix ranking model predicts a probability `P(action)` for roughly 30\npossible viewer actions on your post. `RankingScorer` collapses those\nprobabilities into one number:\n\n```\nweighted_score = Σ ( weight_i × P(action_i) )      # over all action heads\nfinal_score    = offset( weighted_score )          # see \"the offset\" below\n                 × author_diversity_multiplier      # repeat-author decay\n                 × oon_multiplier                    # 0.75 if out-of-network\n                 ( with a cold-start lift applied first, if eligible )\n```\n\nThe code computes the positive terms and negative terms into two running sums\n(`compute_weighted_parts` in `ranking_scorer.rs`), subtracts, applies the\noffset, then multiplies by the diversity and out-of-network factors. See\n[distribution-mechanics.md](distribution-mechanics.md) for those multipliers.\n\n## The weight table (this is the core secret)\n\nThe weights are extremely asymmetric. This table *is* the algorithm's value\nsystem. Memorize the ordering, not the decimals.\n\n| Action | Weight | Plain meaning |\n|---|---:|---|\n| **Share via copy link** | **+20.0** | Someone copies your link to share off-platform. The single most valuable signal. |\n| **Reply** | **+5.0** | Someone writes a reply. Gets a further +15.0 if you and the viewer follow each other (see below). |\n| **Quote** | **+5.0** | Someone quote-posts you. |\n| **Share via DM** | **+5.0** | Someone sends your post to a friend in DMs. |\n| **Follow author** | **+4.0** | The post converts a viewer into a follower. |\n| **Share (generic)** | +2.0 | Generic share action. |\n| **Retweet** | +1.0 | A plain repost. |\n| **Favorite (like)** | **+0.5** | A like. Worth 1/40th of a copy-link share. |\n| Click | +0.4 | Any click into the post. |\n| Open link | +0.2 | Opens an external link. |\n| Photo expand | +0.05 | |\n| Video open | +0.05 | |\n| Video quality view (VQV) | +0.05 | Only counts if the video is at least 10 seconds long. |\n| Quoted click | +0.05 | |\n| Continuous dwell time | +0.004 / unit | Time actually spent on the post. Compounds on longer content. |\n| Post unexplored (novelty) | +0.02 | Small novelty term, in-network only by default. |\n| Profile click, quoted VQV, binary dwell | 0.0 | Present in the model but zero-weighted by default. |\n\n### Negative signals (these dominate everything)\n\n| Action | Weight | Break-even |\n|---|---:|---|\n| **Report** | **−234.0** | One report cancels about 468 likes, 47 replies, or 12 copy-link shares. |\n| **Mute author** | **−58.8** | One mute cancels about 118 likes. |\n| **Not interested** | **−43.2** | Tapping \"not interested\" on your post. |\n| **Block author** | **−31.2** | |\n| Not dwelled | −0.02 | Scrolling straight past your post without stopping. |\n\nThe comment at `param.rs:279` notes these weights blend two things: how much an\naction is valued, and how rare it is across the network. Negative feedback is\nrare, which is part of why each instance carries such a large magnitude.\n\n## The offset transform (why a bad post collapses, not just drops)\n\nAfter summing, `offset_score` reshapes the result (`ranking_scorer.rs`,\n`NEGATIVE_SCORES_OFFSET = 0.001` from `config.rs`):\n\n- If the post's combined score is **positive**, it simply gets `+0.001`.\n- If the combined score is **negative**, it is remapped into a tiny band near\n  zero: `(combined + negative_sum) / total_sum × 0.001`.\n\nThe practical effect: any post whose negative terms outweigh its positive terms\ndoes not merely rank a little lower, it collapses to a near-zero score and sinks\nto the bottom of the candidate pool. Net-negative content is effectively removed\nfrom contention, not gently demoted. This is the math behind \"one report can\ntank a post.\"\n\n## The two laws that fall out of the numbers\n\n**Law 1: optimize for \"send to a friend,\" not \"like.\"**\nCopy-link share (20), DM share (5), reply (5), and quote (5) dwarf the like\n(0.5). The algorithm rewards content people forward and respond to, not content\nthey passively approve of. A post that earns 10 likes and 0 shares scores about\n5.0. A post that earns 1 like and 1 copy-link share scores about 20.5.\n\n**Law 2: avoiding negatives beats chasing positives.**\nA single report (−234) erases the weighted value of 468 likes, and the offset\ntransform then collapses the whole post. Rage-bait and engagement-bait are\nmathematically negative-EV: the mutes, reports, and \"not interested\" taps from\nannoyed viewers outweigh the engagement from fans. The safest high-scoring\ncontent is broadly inoffensive but specifically compelling to its audience.\n\n## Worked examples\n\nAssume the model predicts these probabilities for two drafts (illustrative):\n\n**Draft A, a hot take designed for likes**\n- P(favorite)=0.20, P(reply)=0.02, P(copy_link_share)=0.001,\n  P(not_interested)=0.03, P(mute)=0.005\n- combined ≈ 0.5·0.20 + 5·0.02 + 20·0.001 − 43.2·0.03 − 58.8·0.005\n  ≈ 0.10 + 0.10 + 0.02 − 1.30 − 0.29 = **−1.37**\n- Net negative, so the offset collapses it to near zero. Suppressed.\n\n**Draft B, a genuinely useful thread opener**\n- P(favorite)=0.08, P(reply)=0.06, P(copy_link_share)=0.02, P(dm_share)=0.03,\n  P(not_interested)=0.002\n- combined ≈ 0.5·0.08 + 5·0.06 + 20·0.02 + 5·0.03 − 43.2·0.002\n  ≈ 0.04 + 0.30 + 0.40 + 0.15 − 0.086 = **+0.80**. Strong.\n\nDraft A \"feels\" more engaging but loses, because it provokes negative feedback\nand earns no forwarding. The skill optimizes toward Draft B.\n\n## The bidirectional-follow boost\n\nIf the viewer and the author **mutually follow** each other, an *original* post\n(not a reply, not a retweet) gets **+15.0** added to its reply weight\n(`BidirectionalFollowReplyWeightBoost`, applied in `reply_weight_for`). There is\nalso a dwell-weight boost slot for mutuals, set to 0.0 by default. Mutual-follow\nrelationships massively amplify ranking, so building genuine two-way connections\nwith your audience is directly rewarded. The boost applies only to original\nposts; replies and retweets do not receive it (confirmed by the test\n`bidirectional_weight_boosts_only_mutual_original_posts`).\n\n## Caveat: an alternate scoring mode exists\n\nThe code has a second scoring regime, **dwell-regret** (`ValueModelMode`,\n`DwellRegretWeights` in `ranking_scorer.rs`), which gates positive engagements\nthrough a learned model with even larger negative constants (report −60000,\nmute −15000, not-interested −10000). It is **not** the default. `ValueModelMode`\ndefaults to `\"weighted\"`, the mode described above, but X can switch users onto\ndwell-regret through an experiment. The optimization direction is the same in\nboth modes (forward-worthy content, avoid negatives). Only the exact arithmetic\ndiffers. Optimize for the signals, not the decimals.\n\nFile v0.1.0:CONTRIBUTING.md\n\n# Contributing\n\nThanks for helping keep this skill accurate and useful. Contributions of all\nsizes are welcome.\n\n## The one hard rule\n\n**Every factual claim about the algorithm must cite the specific file or value\nit comes from** in X's [open-source algorithm](https://github.com/twitter/the-algorithm).\nThat citation is the whole point of this skill. A claim without a source does\nnot get merged, no matter how plausible it sounds. If you cannot point to the\ncode, it is folklore, and folklore belongs in [references/myths.md](references/myths.md)\n(as a myth), not in the guidance.\n\n## Good contributions\n\n- **Refreshed values after an upstream change.** X rewrites the production\n  defaults in `home-mixer/params/param.rs` periodically. If a weight or\n  threshold has moved, update it and note the new snapshot date.\n- **New myths, with citations.** Popular advice the code confirms or refutes,\n  each with the mechanism that settles it.\n- **Worked examples.** Weak-to-strong post rewrites in\n  [references/examples.md](references/examples.md), with the reasoning tied to\n  weights.\n- **Critic improvements.** Better heuristics, new signal detectors, or\n  calibration fixes in `scripts/post_critic.py`. Keep it standard-library only.\n- **Clarity edits.** Tightening prose, fixing errors, improving structure.\n\n## Style\n\n- Prefer plain sentences. Avoid overusing em dashes.\n- Keep `SKILL.md` lean; push detail into `references/`.\n- Use precise numbers from the code, and label them as a dated snapshot.\n- ASCII-friendly output in scripts (the critic runs on Windows consoles too).\n\n## Working on the critic\n\nThe critic is pure Python standard library, no dependencies.\n\n```bash\npython scripts/post_critic.py \"a test draft\"\npython scripts/post_critic.py --compare \"draft A\" \"draft B\"\npython -c \"import py_compile; py_compile.compile('scripts/post_critic.py', doraise=True)\"\n```\n\nIf you change the weight table or calibration, sanity-check that rage-bait\nscores negative, a plain like-bait post scores weak, and a genuinely\nforward-worthy post scores ok or better.\n\n## Submitting\n\n1. Fork and branch.\n2. Make your change, with citations.\n3. Open a pull request describing what changed and the source in the algorithm\n   repo that backs it.\n\n## Scope\n\nKeep contributions aligned with the skill's ethics: this optimizes genuine,\npolicy-compliant content. Contributions aimed at spam, inauthentic behavior, or\nevading enforcement will be declined.\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nOptimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[zfoong](https://clawhub.ai/user/zfoong)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users and creators use this skill to draft, revise, and review X posts or threads for legitimate reach, engagement, and distribution. It grounds recommendations in X ranking weights, retrieval mechanics, suppression signals, and account-size playbooks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill provides detailed ranking and suppression guidance for X posts, which is dual-use and could be applied to spam, harassment, synthetic engagement, or attempts to bypass safety systems.\n\nMitigation: Use it only for genuine, policy-compliant content; decline requests for manipulation, inauthentic behavior, ban evasion, or evading valid enforcement.\n\nRisk: The optional critic is a heuristic writing aid and can overstate confidence if treated as a simulator of X's production ML ranking model.\n\nMitigation: Present scores as directional, cite the underlying mechanisms, and review recommendations before publishing.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/zfoong/skills/x-algorithm-optimizer)\n- [Server-resolved source repository](https://github.com/zfoong/X-algorithm-optimizer)\n- [X open-source algorithm](https://github.com/twitter/the-algorithm)\n- [Scoring weights](references/scoring-weights.md)\n- [Distribution mechanics](references/distribution-mechanics.md)\n- [Negative signals and suppression](references/negative-signals.md)\n- [Account playbooks](references/account-playbooks.md)\n- [Worked rewrites](references/examples.md)\n- [Myth-busting](references/myths.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, guidance]\n\n**Output Format:** [Markdown prose with optional post variants and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May use an optional dependency-free local Python critic for directional draft scoring.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 x-algorithm-optimizer contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","readmeExcerpt":"Skill: x-algorithm-optimizer Owner: zfoong Summary: Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python scripts/post_critic.py \"your draft text here\"\n# or pipe a file:            python scripts/post_critic.py < draft.txt\n# or compare variants:       python scripts/post_critic.py --compare \"draft A\" \"draft B\""},{"language":"bash","snippet":"git clone https://github.com/zfoong/X-algorithm-optimizer"},{"language":"bash","snippet":"git clone https://github.com/zfoong/X-algorithm-optimizer \\\n    ~/.claude/skills/x-algorithm-optimizer"},{"language":"text","snippet":"Write a tweet about my open-source side project. I have ~800 followers."},{"language":"text","snippet":"Review this draft before I post it: \"<your draft>\""},{"language":"text","snippet":"Why isn't my post getting any reach beyond my followers?"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: x-algorithm-optimizer\ndescription: >-\n  Optimize posts for X's (Twitter's) For You feed algorithm, based on X's\n  open-sourced ranking code. Use when the user wants to write, draft, review, or\n  improve a post/tweet/thread for reach, engagement, or virality on X, for\n  example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post\n  getting reach\", \"optimize my thread for the algorithm\", \"review my tweet before\n  I post\". Grounds advice in the actual scoring weights, filters, and\n  distribution mechanics rather than generic social-media tips.\nlicense: MIT\n---\n\n# X Algorithm Optimizer\n\nHelp the user create posts for X's **For You** feed that the ranking algorithm\nwill distribute widely, grounded in X's open-sourced algorithm code rather than\nfolk wisdom. Every recommendation here traces to a specific mechanism in that\ncode (see `references/`).\n\n## The one-paragraph model of the algorithm\n\nX predicts, for each post, the probability a viewer will take each of about 30\nactions, then scores the post as a **weighted sum** of those probabilities. The\nweights are wildly asymmetric: a copy-link share is worth about **40 times a\nlike**, a reply about 10 times, and a single report cancels roughly 468 likes.\nA net-negative post does not just rank low, it collapses to near zero and sinks.\nHigh score alone is not enough. The post must also survive hard filters (a\n48-hour age limit, originals-only for stranger reach) and visibility labels that\ncan silently drop a post to strangers while your followers still see it.\nReaching **followers** is easy. Reaching **strangers** (out-of-network) is the\nreal game, gated by ML retrieval that finds posts whose embedding matches a\nviewer's engagement history. Note the model never reads your raw text: it sees a\nsemantic embedding of the post, its engagement counts, and graph and context\nfeatures.\n\n## Two laws to optimize toward\n\n1. **Optimize for \"send to a friend,\" not \"like.\"** Copy-link share (20),\n   reply (5), quote (5), and DM share (5) dominate the like (0.5). Write content\n   people forward and respond to.\n2. **Avoiding negatives beats chasing positives.** One report (−234) or mute\n   (−58.8) outweighs dozens of positives, and the offset transform then\n   collapses the whole post. Rage-bait and engagement-bait are mathematically\n   negative-EV.\n\n## Workflow\n\nWork through these steps. Pull exact numbers, thresholds, and label names from\n`references/` as needed. Do not rely on memory for specifics; cite them so the\nuser can trust and audit the advice.\n\n### Step 1: understand the situation\nAsk for (or infer from context) what you need:\n- **Follower count** (determines cold-start eligibility, the at-most-1,000 boost).\n- **Niche or topic**, and **account age**.\n- **Goal:** reach strangers, deepen with followers, drive replies, drive clicks,\n  or grow followers.\n- **The draft**, if they have one, or the idea if they do not.\n\nIf the user just wants a post written and gives a topic, proceed with sen"},{"path":"README.md","content":"<div align=\"center\">\n\n# X Algorithm Optimizer\n\n**An Agent Skill that writes tweets with knowledge reverse-engineered from X's\nopen-source ranking code.**\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Agent Skill](https://img.shields.io/badge/type-Agent%20Skill-8A2BE2.svg)](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview)\n[![GitHub stars](https://img.shields.io/github/stars/zfoong/X-algorithm-optimizer?style=social)](https://github.com/zfoong/X-algorithm-optimizer/stargazers)\n[![Based on](https://img.shields.io/badge/grounded%20in-X%20open--source%20algorithm-000000.svg)](https://github.com/twitter/the-algorithm)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\n<sub>Every claim traces to a specific line of X's published algorithm.</sub>\n\n</div>\n\n---\n\nMost advice about \"growing on X\" is folklore. In August 2026, X open-sourced the\ncode that actually ranks the For You feed. This skill reads that code so your\nagent can write posts optimized for how the algorithm *really* scores and\ndistributes them, and can tell you exactly which mechanism each recommendation\ncomes from.\n\n## 🔑 The whole secret in one table\n\nX scores a post as a weighted sum of the actions it predicts a viewer will take.\nThe weights are wildly asymmetric, and that asymmetry is the entire game:\n\n| A viewer... | is worth | takeaway |\n|---|---:|---|\n| copies your link to share it | **+20.0** | forwarding beats everything |\n| replies / quotes / DMs it to a friend | **+5.0** | conversation and sharing |\n| follows you from the post | **+4.0** | |\n| **likes it** | **+0.5** | likes are nearly worthless |\n| taps \"not interested\" | **−43.2** | |\n| mutes you | **−58.8** | |\n| **reports it** | **−234.0** | one report cancels ~468 likes |\n\nA post whose negatives outweigh its positives does not just rank low. It\ncollapses to near zero and sinks. So the two laws are: **optimize for \"send to a\nfriend,\" not \"like,\"** and **avoiding negative signals beats chasing positive\nones.** The rest of the skill is the detail behind those two sentences.\n\n## 🧠 What it does\n\nPoint your agent at this skill and ask it to write or review a post. It reads\nX's published ranking code and drafts or critiques your post against the real\nscoring weights, retrieval paths, and suppression rules, runs a negative-signal\naudit, and explains the exact mechanism behind every suggestion. The result is\nposts optimized for how the For You feed actually distributes content.\n\n## 📦 Install\n\nThe skill is plain Markdown plus one optional, dependency-free Python script, so\nit works with any AI agent that can read files in your project. Clone it once:\n\n```bash\ngit clone https://github.com/zfoong/X-algorithm-optimizer\n```\n\nThen wire it into your agent:\n\n- **Claude Code:** clone (or symlink) it straight into your skills directory and\n  it loads automatically:\n  ```bash\n  git clone https://github.com/zfoong/X-algorithm-optimizer \\\n    ~/."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn748dp8yh73kxrjv4kabz7p6d8ch4pe\",\n  \"slug\": \"x-algorithm-optimizer\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786769599304\n}"},{"path":"references/account-playbooks.md","content":"# Account Playbooks: strategy by situation\n\n> Derived from [scoring-weights.md](scoring-weights.md),\n> [distribution-mechanics.md](distribution-mechanics.md), and\n> [negative-signals.md](negative-signals.md). Match the user's situation to a\n> playbook, then draft against it.\n\n## A. Cold-start account (≤ 1,000 followers)\n\nYou have one structural superpower: the **cold-start boost** injects one fresh\noriginal post near slot 15 per eligible feed load, as long as you're under\n1,000 followers, the post is an original under 24h with < 1,000 impressions.\n\nPlaybook:\n- **Post originals only for growth.** Replies and retweets are cold-start-\n  ineligible AND OON-discounted. Save replies for relationship-building with\n  specific accounts, not reach.\n- **Pick one niche and stay in it.** Consistency builds a clean embedding\n  neighborhood so two-tower retrieval delivers you to the right strangers. Every\n  off-topic post muddies your cluster and wastes retrieval.\n- **Optimize each post for one reply-worthy idea.** Reply weight (5.0) is your\n  most reachable high-value action at low follower counts.\n- **One quality post > many posts.** Diversity decay means your 3rd post today\n  scores ×0.44. Cadence: 1–2 excellent originals/day beats 10.\n- **Convert engagers to mutual follows.** Mutual follow = +15 reply weight and\n  flips your OON 0.75 handicap into easy in-network reach.\n- **Watch your blocks/reports-vs-likes ratio from day one.** The agatha\n  denominator is OON favs, and small accounts have thin denominators, so a\n  couple of reports hurt disproportionately.\n\n## B. Growth account (1k–50k)\n\nYou've lost the cold-start boost; now it's pure content-quality + velocity.\n- **Front-load engagement velocity.** Engagement counts are model inputs;\n  the first hour shapes scoring for everyone after. Post at your audience's\n  peak, and seed genuine early replies (ask a real question in the post).\n- **Engineer forwarding, not liking.** The gap between copy-link share (20) and\n  like (0.5) is your whole opportunity. Make posts people *send* someone:\n  genuinely useful, reference-worthy, \"this explains the thing you asked about.\"\n- **Threads for dwell.** Continuous dwell time is weighted (0.004/unit) and\n  compounds on longer content that holds attention. A strong thread earns dwell\n  that single posts can't.\n- **Differentiate on trends (DPP).** When jumping a trend, take the orthogonal\n  angle, since near-duplicate embeddings get dropped from adjacent slots.\n\n## C. Established account (50k+)\n\nYour risk shifts from \"getting seen\" to \"not getting throttled.\"\n- **Protect account reputation.** At scale, one pattern that spikes\n  blocks/reports-per-fav can apply an account-level `DO_NOT_AMPLIFY` /\n  `SPAM_HIGH_RECALL` / abusive label that silently caps *all* your OON reach.\n- **Clean at virality.** Grox re-scans at 128 and 1,024 favs. Anything that\n  could read as borderline is riskiest exactly when it's taking off.\n- **Still one strong post per slate.** Diversity decay applie"},{"path":"references/distribution-mechanics.md","content":"# Distribution Mechanics: how a post reaches people\n\n> Source: `home-mixer/sources/`, `home-mixer/models/candidate.rs`,\n> `home-mixer/util/phoenix_request.rs`, `home-mixer/scorers/ranking_scorer.rs`,\n> `home-mixer/scorers/author_cold_start.rs`, `home-mixer/params/config.rs`,\n> `vm-ranker/dpp.rs`, `thunder/`, `simclusters/`, `phoenix/`. 2026-08 snapshot.\n\nThere are two audiences for any post: **in-network** (your followers) and\n**out-of-network / OON** (everyone else, reached through ML retrieval).\nReaching followers is easy. Reaching strangers is where the algorithm gates\nhard, and nearly every mechanic below is about OON reach.\n\nFeed sizing constants for context (`config.rs`): the pipeline scores up to\n**2,800** candidates (`PHOENIX_CLIENT_MAX_CANDIDATES`), selects the top **50**\n(`TOP_K_CANDIDATES_TO_SELECT`), and the final For You response is about **35**\nposts (`RESULT_SIZE`) plus feed modules. So on the order of a thousand\ncandidates compete for a few dozen slots per refresh.\n\n## 1. Exactly what the model sees (and does not)\n\nThe per-candidate message sent to the ranking model is `TweetInfo`, built in\n`home-mixer/models/candidate.rs::as_tweet_info`. There is **no raw post text,\nno raw media, and no hashtag field**. The complete per-post feature set is:\n\n- **Identity and graph:** `tweet_id`, `author_id`, the quoted / reply / retweet\n  tweet and author IDs, `is_author_followed_by_user`, and `is_following_user`\n  (does the author follow the viewer back). Note `is_following_user` is only\n  populated when the post is **not** a retweet, so the mutual-follow signal is\n  carried on originals and replies, not reposts.\n- **Semantic IDs:** `semantic_ids`, discrete tokens from a multimodal embedding\n  of the post, hydrated by `semantic_id_hydrator.rs`. This is the model's *only*\n  view of your content. Text and media are compressed into this embedding\n  upstream.\n- **Engagement counts (bucketed):** `fav_count`, `retweet_count`, `quote_count`,\n  `reply_count`, `view_count`, `bookmark_count`. These are direct inputs, so\n  early engagement literally becomes a feature the model reads for every later\n  viewer. Bookmark count is an input even though bookmark has no ranking weight,\n  which means bookmarks quietly signal quality to the model.\n- **Bool flags:** `has_media`, `is_retweet`, `is_quote`, `is_reply`.\n- **Media and language:** `min_video_duration_ms`, `language_code`.\n\nThe viewer side (`build_user_context` in `phoenix_request.rs`) is where heavy\npersonalization lives. The model also receives, per request: user age bracket\nand exact age, declared and inferred gender (plus an inferred-gender\nconfidence), user state, followed Grok topics, followed starter packs,\nlatitude/longitude, DMA (media market) code, installed apps, timezone, device\nnetwork type, and country. This is why the *same* post ranks very differently\nfor two viewers: geography, topic-follows, and demographics all condition the\nprediction.\n\n**Consequences for a creator:**\n1. **Consistency wi"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review my tweet before I post\". Grounds advice in the actual scoring weights, filters, and distribution mechanics rather than generic social-media tips. Skill: x-algorithm-optimizer Owner: zfoong Summary: Optimize posts for X's (Twitter's) For You feed algorithm, based on X's open-sourced ranking code. Use when the user wants to write, draft, review, or improve a post/tweet/thread for reach, engagement, or virality on X, for example \"write a tweet about...\", \"make this post go viral\", \"why isn't my post getting reach\", \"optimize my thread for the algorithm\", \"review","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":2197,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:37:39.808Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:42:18.524Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}