Everyone's launch post sounds like a build log. Your agent writes the other kind.
Your agent is good at writing about what it just did. That is the problem. Ask it to announce something you shipped and it reaches for the most interesting thing it touched, which is almost always the machinery.
v1.4.0 fixes the category error underneath that. Until now every recipe in this skill answered one question: which surface? LinkedIn, X, an email subject line. A launch is not a surface. It is an occasion, and an occasion changes what the sentence is allowed to be about.
So the skill now loads two recipes when you ship something. The platform still sets the length ceiling. The occasion sets the subject, and the subject is what the reader gets.
The three levels of a launch headline
Three headlines, same release. Only one of them is a launch.
Level 1 is the build diary. "I verified 158 citations. 42 failed." True, specific, and about the tooling. The audience arrived with a webinar problem and got a lecture on citations.
Level 2 is the symptom. "Why your webinar gets great feedback and nobody buys." This one reads well, which is why it survives review. It is also a headline that could have been written if the product did not exist. A stranger finishes it knowing nothing shipped.
Level 3 is the launch. "Create webinars like Russell Brunson." "Your agent builds a webinar in minutes." Both name the vehicle and the promise.
Three questions produce level 3, in order. What can the buyer now do that they could not before? Who do they do it like, or what does it replace? How fast, or with what effort saved? Answer the first plus either of the other two and you have a launch headline. Answer none of them and you have written something else.
The skill also stops guessing whether you are launching or upgrading. It reads the registry. No earlier published version means a first launch. An existing one means an upgrade, and an upgrade names the delta instead of re-announcing the product to people who already installed it.
The failure mode nobody names
That is the new part. The older problem it sits on top of is worth repeating, because it is the reason this skill exists at all.
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 53 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 the 52 templates I had at the time. 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 rest 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 template in the registry 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.

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.
Five scripts that do not care what I think
The skill gates itself. Five scripts, each returning an exit code.
Length. Per-platform ceilings. LinkedIn truncates near 140 characters on mobile, so the tension has to land before the fold.
Anti-slop and compliance. The phrase blacklist that marks AI copy, plus a hard BPR and CLP gate for regulated products. If you sell a biocide, "non-toxic" is not a style choice. That check cannot be overridden.
Structure. At least four distinct angles per set, at most one question opener.
The launch lint. New in 1.4.0. Builder voice is a hard fail. Build vocabulary fails only when the line carries no buyer signal, so "cold email scripts that book meetings" survives on its outcome.
Coordination. Confirms the skill declares the peers it hands work to.

The launch lint runs on every surface that inherits the angle, not the blog alone. Last time this defect fired, all four social drafts opened with the same wrong line while the landing-page headline was already fine.
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.

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 test I did not enjoy
The first thing I pointed the new lint at was the previous title of this post. It failed: no buyer signal, nothing a reader could act on. Against the six fixture headlines it returned six correct verdicts, three fails and three passes. A memory had already recorded this rule once and did not prevent the repeat. An exit code does.
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.4.0. 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 a launch headline. Then make it show you the exit codes.