Write an X thread where the hook earns the read, every tweet carries exactly one idea, and the last tweet knows what it's asking for.
Context
Read social-context.md at the project root (also check .agents/social-context.md) for
Voice rules, Audience, Pillars, and the Never list. If missing, offer to run the
social-context skill first, but don't block — ask two inline questions (who should this
reach, and how spicy can it be: measured/direct/provocative) and proceed.
Workflow
- Get the source material now: a blog post, notes, a story, or just a topic. If it's just a topic, extract specifics before drafting — the number, the failure, the before/after. Threads run on receipts, not opinions.
- Pin the thesis in one sentence: what should a reader believe or do after tweet N that they didn't before tweet 1? If the material supports two theses, ask the user which one this thread argues. No thesis, no thread — write a single tweet instead and say so.
- Outline the beats before writing any tweet: 5–12 beats, one per tweet, in an escalation
shape:
- hook
- stakes/context (1 tweet max)
- the meat, in rising order — save the second-best point for late, the best for the payoff
- payoff
- CTA Kill any beat that restates another. Show the outline as a numbered list of one-line beats and let the user reorder or cut.
- Draft the hook three ways, one per pattern:
- Curiosity gap: promise the payoff, withhold the mechanism. "We doubled activation with one email. It's not the one you think."
- Bold claim: the thesis at full strength, no hedge. "Most onboarding flows fail because they teach the product instead of the outcome."
- Specific number: the receipt up front. "47 user interviews. 3 patterns. Here's what actually makes people churn."
- Score each hook 1–5 on three axes: stops the scroll, makes the specific promise the thread actually keeps, and passes the Voice rules. Show the scores, recommend one, and ask the user to pick. A hook that overpromises is worse than a boring one — the thread gets ratioed for the gap.
- Write the tweets from the outline. Per tweet: lead with the point in the first line, one idea only, cut every "and another thing" into its own tweet or the bin. Prefer line breaks over commas — 2–4 short lines per tweet reads better than one paragraph. No tweet should need its neighbor to make sense.
- Budget characters as you go: hard cap 280 per tweet, and show the count after each like
(214/280). Hook stays ≤240 to leave quote-tweet room. If a tweet lands over, cut words — never split one idea across two tweets to make it fit. - Write the closer as a real CTA tweet: restate the payoff in one line, then one ask —
- follow, with the reason ("I write about X every week"), or
- the link (this is the only tweet a link may appear in), or
- a reply prompt with a real question. One ask, not three.
- Ask the numbering question: "1/ prefix on each tweet, or clean tweets with no numbering?" Numbering signals length upfront and helps screenshots; clean reads more native. Apply the choice consistently — if numbering, the hook shows the total ("1/9") so readers can size the commitment.
- Whitespace and rhythm pass:
- vary tweet lengths (a 40-char tweet after two dense ones hits harder),
- check each tweet still stands alone when screenshot,
- verify zero hashtags anywhere except an optional one in the final tweet,
- run every tweet against the Voice rules.
- Present the full thread with per-tweet counts, plus the two unused hooks labeled as alternates in case the user wants to swap.
Quality bar
| Constraint | Rule |
|---|---|
| Hook | ≤ 240 chars; promise matches what the thread delivers |
| Every tweet | ≤ 280 chars, count shown; exactly one idea; stands alone as a screenshot |
| Thread length | 5–12 tweets; context/setup gets at most 1 tweet |
| Links | Final tweet only — a mid-thread link is where readers exit |
| Hashtags | None mid-thread; at most 1 in the final tweet, only if asked |
| Structure | Escalates — strongest material in the back half, payoff before CTA |
| CTA | Exactly one ask in the closing tweet |
| Voice | Every tweet passes the Voice rules in social-context.md |
| Numbering | User's chosen convention applied to every tweet, or to none |
Deliverable
The full thread, ready to paste: each tweet in its own block with its character count, numbering per the user's choice, the chosen hook first and the two alternate hooks appended for reference. End there.