x-hook-writer · v1.0.0 · 2026-10-02 · sha256 b9fef6dbae45041c

x-hook-writer v1.0.0A

Immutable. This exact content never changes and is served at /api/v1/blob/b9fef6dbae45041c.

---
name: x-hook-writer
description: >
  Write and score the hook of an X Article: the first lines of the body that X shows under the
  headline on the timeline card (about 130 characters visible), built from 40,478 X Articles. Use
  whenever you need an opening line or a preview for a locked headline, want the card to read better,
  or ask which opening is stronger. Runs after headline-writer has locked the headline.
  ChatGPT edition, generated from the model-neutral canonical skill: scripts and the dataset are optional accelerators.
version: 1.0.0
source: "research and original skill by @fuckgrowth (Sep 2026); see SOURCES.md"
toolkit: x-article-toolkit
generated_from: skills/hook-writer/SKILL.md
adapter: chatgpt
---

# HOOK WRITER

What this is: an opening-line procedure built from 40,478 X Articles: 6,835 over 100k views and 33,643 under, Jan 1 to Sep 26, 2026, research by @fuckgrowth (the X article "how to write better headlines"). The dataset, whose `preview` column holds the first 300 characters of every winner's opening, and the research doc are linked in `references/SOURCES.md`.

The preview is the article's first paragraph, so what this skill writes is the opening of the article itself. The honest limit comes first: the first lines move the odds far less than the headline. On the full comparison of 33,426 articles, two things held on both outcomes: a short first sentence helps a little (1.07x), and a question in the first line hurts (0.84x on views, 0.77x on 500 likes). The rest of this skill is craft that winners used, so never promise reach from the hook.

This is the canonical, model-neutral edition. This copy is the ChatGPT adapter edition; see the runtime notes at the end.

## WHAT YOU NEED

Required (in `references/`): `references/rules.md`, `references/templates.md`, and a LOCKED HEADLINE.
Optional accelerators:
- `scripts/hook_check.py` (only if this ChatGPT surface can run Python; see the runtime notes) renders the card and scores candidates (Python 3, standard library). Without code execution, apply THE HOOK CHECK from `references/rules.md` by hand and count the visible 130 characters yourself.
- The public dataset (not bundled; see `references/DATASET.md`) as a swipe file of winning openings (the `preview` column). Without it, use `references/templates.md` only.
- A state store (`references/STATE.md`) for approved hooks, feedback and results. Only when connected.

## STEP 0: LOAD (every run, in this order)
1. `references/rules.md`: how the card cuts the preview, what the full comparison measured, and the rules that follow from it.
2. `references/templates.md`: two-sentence openings that winners used, each with its measured status.
3. If the dataset is available: filter by the article's topic, then read the `preview` column of the top winners whose headline has the same shape as yours (the `shape` column).
4. If a state store is connected: the hooks the user approved, their verbatim feedback and real results. When recorded feedback and `references/rules.md` disagree, the feedback wins.

## STEP 1: INTAKE
This skill expects a locked headline. If you were handed one (labelled `Locked headline:` by headline-writer or stated by the user), use it verbatim. If there is none, say so and run headline-writer first (or ask the user to pick one), because the hook is written against the headline.

Take the rest from the article draft and ask once only for what is genuinely missing:
- The headline's shape: how to, guide or course, receipt, announcement, or a claim.
- One concrete thing the headline did not say: a number, a name, a date or a place. Pull these from the draft.
- The reader's moment: where they are, what they're doing wrong and what it costs them.
- The topic and the case of the headline.

## STEP 2: CHOOSE THE OPENING
Pair it with the headline's shape, using the pairing table in `references/rules.md`:
- how to: the old way and what it costs, with a number;
- guide or course: what's inside, in four to six nouns;
- receipt: the result and its number in the first sentence, then how it happened;
- announcement: what the thing does, in one plain sentence that names it;
- claim: the reader in a scene, or a dated event with the writer in it.

## STEP 3: GENERATE
Write 8 candidates, each two sentences with a line break after the first:
- Sentence one is short and complete, six words or fewer where the material allows and never more than twelve, because that is the one opening that helped on both outcomes.
- Sentence two is longer, starts to deliver, and crosses the cut at about 130 characters, so the reader clicks to finish it.
- No question in the first line, and avoid "The" as the first word (0.87x).
- At least 2 candidates carry a number or a name that isn't in the headline, and at most 1 restates the headline.
- Keep the case of the headline, so a lowercase headline gets a lowercase hook.
- Borrow shapes from the preview column when the dataset is available: find the closest winning opening for your headline's shape and swap every slot.
- Use the article's own facts. Never invent a number, a name or a result to make the hook land.

## STEP 4: SCORE
With code execution, if available in this ChatGPT surface:
```
python3 scripts/hook_check.py --headline "locked headline" "line one\nline two" "..."
python3 scripts/hook_check.py --headline "..." --file candidates.txt
python3 scripts/hook_check.py --headline "..." --json "line one\nline two"
```
In a file, put one candidate per line and use a literal `\n` for the line break. Per candidate it prints the rendered card (the headline plus the visible 130 characters and the "..."), the check A to J, the opening move with its measured status, penalties, and the three nearest winning openings when the dataset is present.

Without code execution: render the card yourself (headline, then the first 130 characters of the hook followed by "..."), then score the ten checks A to J from `references/rules.md`, one point each.

Drop anything under 6/10, then fix and re-score.

## STEP 5: PRESENT
Show the top 4 as rendered cards, each with its score, its opening move and (when available) the winning opening it echoes with views. Recommend one in a single sentence, then ask the user to approve it, pick another or give feedback. State plainly that the hook is for the reader who already opened the article; it does not predict reach.

## STEP 6: LOCK AND RECORD
- When the user approves a hook, it is LOCKED. Restate it verbatim, labelled `Locked hook:`. The approved hook becomes the first two lines of the article; do not change anything else in the article body unless the user asked for editing.
- If a state store is connected, record the date, headline, hook, opening move, score and why the user chose it, following `references/schemas/`. Record feedback verbatim. Record views at 24 hours and 7 days when supplied.
- If no state store is connected, skip silently.

## AFTER THE HOOK IS LOCKED
Run cover-writer with the locked headline and hook when the user asked for the full pipeline (see `references/workflow.md`). When they asked for the hook only, stop here.

## CHATGPT RUNTIME NOTES (adapter layer; not part of the methodology)

This package was generated from the canonical skill `skills/hook-writer/` in the x-article-toolkit repository
(https://github.com/kenashe/x-article-toolkit). The repository is the source of truth; if this file and the
repository disagree, the repository wins and this package should be rebuilt with `adapters/chatgpt/build.py`.

What is different in ChatGPT:
- **Files.** The rule files are in `references/` of this skill package. Read `references/rules.md` and `references/templates.md` before writing.
- **Scripts.** `scripts/hook_check.py` is included for environments where ChatGPT can execute Python. Do not assume it
  can: when you cannot run code, score by hand using the check lists in the references (they are written for that)
  and say "scored by hand" in your output. Never report a script score you did not compute.
- **Dataset.** The public dataset is NOT bundled (3.5 MB, external, see `references/DATASET.md`). Without it, skip the
  swipe-file steps and the "nearest winners" column. If the user uploads `articles_over_100k.csv` to the conversation
  and code execution is available, pass it with `--data`.
- **State.** Assume no persistent store. Do not claim to remember approved headlines, feedback or results from earlier
  conversations. Carry locks verbatim within the conversation (`Locked headline:`, `Locked hook:`, `Locked cover:`).
  If the user keeps their own records (a spreadsheet), they will paste what matters.
- **Other stages.** This package is one stage. The sibling skills are `x-headline-writer`, `x-hook-writer` and
  `x-cover-writer`; the full pipeline is described in `references/workflow.md`. Run only the stage the user asked
  for unless they asked for the whole pipeline.
- **Images.** Do not generate or measure cover images unless the user asks and the surface supports it; the brief,
  cover text, prompt and specs are the deliverable.