I collected 52 hooks for my AI. Only 7 had a real number.

I collected 52 hooks for my AI. Only 7 had a real number.

Martin Shein · · 5 min read

I built a swipe file of 52 hooks for my AI. Only 7 of them have a real number behind them, and I labelled the other 45 as unproven. Labelling them made the skill better. Here's exactly why.

The failure mode nobody names

Ask any model for "10 hooks for my LinkedIn post" and you get 10 hooks. They scan fine. They're also invented.

The model isn't pulling from posts that worked. It's producing the statistical middle of every hook it has ever read, which is why the output has that faint smell you can't place. Everyone gets the same shapes. "Unpopular opinion:" and "Here's the thing nobody tells you about" arrive on schedule.

I shipped a version of this skill that worked exactly that way. The verdict I got back was one word: useless. It was right. A hook generator that invents hooks is just the model with extra steps.

Install, don't invent

So I inverted it. The skill now carries 52 hook templates in a registry/ folder, each one lifted from a real published post, each one carrying the URL it came from.

When you ask for LinkedIn hooks about churn, the agent doesn't reach into training data. It matches on platform and angle, installs three or four templates, and writes your topic into those proven shapes.

The difference is structural. A template like "I analysed 1,000 LinkedIn profiles. 87% made the same mistake" isn't a sentence to copy. It's a shape: research authority, then a curiosity gap. Your version might be "I audited 200 SaaS stacks. 73% couldn't show CFO-grade ROI." Same skeleton, your evidence.

Six angles are covered: contrarian, number-led, admission, story, future-shock, and identity. The skill generates across at least four of them every time, so you get a spread instead of six variations on one idea.

The part most swipe files lie about

Here's where I had to make a call I didn't like.

I went looking for engagement numbers on all 52. I found them for 7. Live posts with visible counters, a curated most-liked list, and two category-level studies on open rates and length bands. That was it.

The other 45 came from creator round-ups where nobody published what the post actually did. I could have written plausible numbers next to each one. Every swipe file you've ever bought does this, and you have no way to check.

Instead each of those items says pattern-level (no per-post engagement stated by source). Every one of the 52 carries a source URL, so you can go read where it came from.

There's a second trap I had to write a rule against. A hook like "I analysed 1,000 profiles, 87% made the same mistake" contains numbers, but those are numbers inside the copy, not proof the post performed. A naive import records them as metrics. Mine flags them separately.

Chalk grid of 52 squares: 7 filled gold and bracketed "7 measured", 45 left as outlines and bracketed "45 pattern-level", with the caption "every one carries a source URL".

Seven out of 52 is an honest ratio for this kind of research. Claiming 52 out of 52 would have been a better sales page and a worse tool.

Three scripts that don't care what I think

Evidence-grounding fixes where hooks come from. It doesn't stop the model from drifting once it starts writing. So the skill gates itself with three scripts:

  • Length. Per-platform character and word ceilings. LinkedIn truncates at roughly 140 characters on mobile, so the tension has to land before the fold. The script also adjusts for expansion when you write in German.

  • Anti-slop and compliance. A blacklist of the phrases that mark AI copy, plus a hard gate for regulated products. If you sell a biocide, "non-toxic" and "environmentally friendly" are not stylistic choices, they're a BPR problem. That check cannot be overridden.

  • Structure. At least four distinct angles per set, no more than one question opener. Six questions in a row is monoculture, and the grader fails it.

I ran the gate on the title of this post. It failed. Two of my six candidates ran 14 and 15 words against a 12-word ceiling, and two more didn't classify into any confirmed structure at all. I rewrote them and ran it again: 6 for 6 under ceiling, zero banned phrases, six distinct structures, all three scripts green.

Six chalk cards labelled "6 hooks" moving through three gates: LENGTH, SLOP + COMPLIANCE, STRUCTURE. A white arrow loops back labelled "FAIL: rewrite"; a gold arrow exits labelled "PASS: ship".

That's the whole point. I can't tell myself the copy is fine. The exit code decides.

What it deliberately doesn't do

It writes the opener. Nothing else.

That sounds like a limitation until you use it. The hook decides whether anything else you wrote gets read, and it's the sentence most likely to get rushed. That earns it a dedicated tool with its own evidence base and its own gate. The body is a different job with different rules.

So hook-generator hands off. It feeds post-writer for the full post, outbound-engine for cold-email subject lines and openers, and section-designer when the hook becomes a hero headline on a page. Those skills publish. This one produces text and stops.

A gold box labelled "hook-generator" inside a dashed boundary emits "the opener", which fans out to post-writer, outbound-engine and section-designer, which in turn reach a globe labelled "publishes".

One more thing it won't do: invent a language it hasn't validated. German, French, Spanish, Russian, and Romanian templates are written but held back until the native lead for each signs off. Ask for Hebrew hooks today and it tells you no rather than guessing. My team leads are real people with names, and I'd rather ship English-only than ship a German hook none of us checked.

The number to watch

The measure I care about isn't hooks generated. It's hooks generated that something downstream actually uses. Ten per session is the bar.

You can always optimise a number. You can't optimise zero, and you definitely can't optimise a number you made up.

@di-atomic/hook-generator is live on the OPVS marketplace at v1.2.1. It's guidance-only, so there's no API to call and nothing to authenticate. Your agent reads the skill, installs the templates, runs the scripts, and reports the numbers back to you.

Ask it for hooks. Then make it show you the exit codes.