I thought every post needed a hook. My best one had none.

I thought every post needed a hook. My best one had none.

Martin Shein · · 9 min read

There is a habit that quietly caps most social accounts, and it looks like productivity.

You write one good post. You paste it into four other boxes. You hit publish five times. Then you check the likes.

I built a skill to fix the first half of that habit. Building it taught me the second half is the part that actually costs you money.

@di-atomic/post-writer is live on the OPVS marketplace at v1.6.0. It drafts platform-tuned posts and long-form Articles for LinkedIn, X, Instagram, Threads, Facebook, YouTube and Reddit, scored against 74 real posts and five scripts that fail loudly. And its most valuable rules are all ones I did not expect to write.

One formula cannot serve four scoreboards

Start with the thing almost nobody prices in. Each platform rewards a different action, so "engagement" is not one number.

X weights replies and bookmarks far above likes. Threads rewards your reply-to-like ratio, and creator self-replies lift reach by 42%. Instagram rewards saves, which is why carousels beat single images there and nowhere else. LinkedIn rewards dwell time and comments, so the post that keeps someone reading for nine seconds beats the one that gets a fast thumbs-up.

Four platforms. Four scoreboards. Four different call-to-actions.

So when you cross-post one formula and grade all five copies by likes, you are not measuring performance. You are measuring the one metric that ranks lowest on most of those platforms. The post did not fail. The scoreboard was never the one you were reading.

post-writer encodes this as a rule it will not break: the CTA and the structure change per platform, because the KPI changes per platform. Asking for a save on LinkedIn is noise. Asking for a comment on Instagram is a wasted line.

The rule that tells the skill to stop

Here is the one that reversed my thinking.

I looked at the all-time most-liked posts to reverse-engineer their structure. Chadwick Boseman's memorial post at 6.6 million likes. Elon Musk at 4.3 million. Greta Thunberg at 3.5 million.

None of them have a hook framework. None of them have a call to action. None of them have a growth mechanic. They are emotional, timely and reactive, and every single technique I was busy encoding is absent.

That could have been a footnote. Instead it became a mode.

post-writer ships with no-mechanics-mode. When a post is emotional, reactive or a plain announcement, the skill drops the hook formula, drops the CTA and gets out of the way. Because forcing hook plus framework plus CTA onto a post like that does not improve it. It damages it. It makes a human moment read like a funnel.

I find this is the honest test of any AI writing tool. Not how much structure it can apply, but whether it knows when structure is the wrong answer. A skill that optimizes everything has no judgment. It just has a hammer.

A cluttered post card struck through, next to a nearly empty post card carrying a gold 6.6M tag

The audience that reads everything and comments on nothing

Here is the third one, and it cost me a rule I had already written down.

Every playbook tells you to close a LinkedIn post by baiting a comment. Name the codeword, promise the framework, harvest the thread. I had encoded exactly that. Then I counted.

Across 328 posts, 12 queries and 299 authors, the compliance corpus, which is my actual buyer, runs a median of 0 comments. 68% of those posts draw none at all. The comment-to-like ratio is 0.000.

The obvious read is that nobody cares. The data says the opposite. That same audience reads: buyer-language posts out-read the compliance ones and come close to the reach of hard practitioner content. They are there. They just will not perform in public.

Say the reason out loud and it stops being surprising. Commenting on a regulatory post reads as giving regulatory advice, and a compliance officer will not do that where their employer can see it.

You cannot bait your way past it either. Across those corpora the comment ask appears in 2 of 151 posts and 5 of 177. It is not an underused tactic. It is a tactic that audience has already declined.

So on an ICP-pillar piece, post-writer now closes on a direct message rather than a comment. Success is counted as connection requests, DM replies and profile views. One exception survives because it is measured, not assumed: export-teaching content does earn real comments from an ICP-adjacent audience, and that shape is allowed both asks.

The honest footnote is that LinkedIn exposes no clean API read for DMs or profile views on a personal profile, so that counting is manual for now. The skill says so rather than implying a dashboard that does not exist.

Long-form was never just a longer post

post-writer shipped ten recipes and every one of them was a post. When I finally sat down to write a real LinkedIn Article, there was no recipe for it here or in any sibling skill. So I invented the process live and burned six drafts getting from 2,894 words down to 850.

That is what a missing recipe costs, and it repeats every time until someone writes it down.

v1.6.0 makes the Article its own artifact. Its own structure, its own cover spec, and its own publishing route, because the LinkedIn Article editor is desktop and tablet web only, which means images upload direct and never round-trip through media hosting. The part that matters most is what it turns off: the post verifier is explicitly barred from grading an article. That script enforces a 3,000-character post ceiling, so it would fail an 850-word article on length, and editing the article until it passed would destroy the article.

The X Article recipe ships beside it with a warning stamped on every number in it. Every corpus I own is LinkedIn. I did not carry one LinkedIn figure across and relabel it an X benchmark. The file marks its numbers as untested hypotheses with their provenance stated inline, and it defaults you back to a thread.

One thing I will not claim: the 800-to-1,200-word band those six drafts settled on is a convergence, not a measurement. That piece was never published. It is where the writing landed, not where the engagement was.

And the same correction hit a length rule I had already shipped. post-writer used to assert a 600-to-1,000-character sweet spot for LinkedIn. That came from one creator. A 164-post corpus measured on my own topic found that exact bucket the worst performer. I did not swap in the second number either, because replacing one single-source band with another repeats the mistake that made the first one wrong. The band is now marked a starting hypothesis you are told to test. Measure your topic, not the platform.

Five scripts that cannot be talked out of it

Guidance an agent can ignore is not guidance. So the rules ship as code that returns exit 1 with printed numbers.

verify-post-structure checks the per-platform length band, whether your hook survives the mobile truncation point, wall-of-text density, and that you used at most one CTA per class.

lint-ai-slop runs a 55-entry zero-tolerance blacklist plus an em-dash density check. Zero tolerance means one hit fails the post.

lint-tone-drift measures Flesch 60 to 75, sentence-length variance, first-person usage against your voice.md, and corporate jargon creep. This is the one that catches a post that is technically clean and still does not sound like you.

verify-article-cta is the newest, and it exists because of a gap I found while testing. verify-post-structure counts CTA classes, so a comment bait and a direct-message ask both scored as one engagement CTA. It passed the very draft the new rule was written to reject. The lock was a rule no script could see, so it became a script: it separates codeword bait from a plain solicitation from a real conversion ask, and it is proved on eight committed fixtures that fail in both directions.

verify-coordination checks the skill's declared cross-references still resolve.

Behind them sit 74 metric-bearing exemplars, each carrying its source and its number. 38 are high-confidence. 9 are flagged needs_native_validation, which matters more than it sounds.

A draft travelling through three gates labelled structure, slop and tone, ending at a gold exit 1 tag that loops back to the start

Where I refused to fake confidence

Two places, and both are in the shipped skill as limits rather than features.

The AI-slop blacklist is English-specific, and it decays. The single most-cited giveaway verb only became a tell after FSU researchers quantified how hard ChatGPT leaned on it. The em-dash panic is a 2025 artifact. That list will be stale within a year, which is why it is a file you can update and not a claim baked into a model.

So when post-writer scores a German or Russian or Hebrew post, lint-ai-slop returns WARN, not FAIL. An English blacklist has no authority over German. Each of DE, FR, ES, RU and HE needs a list contributed by a native speaker, and until a team lead signs one off, the skill says so instead of pretending.

The second is the private-metrics trap. Reach, impressions and saves are private on Instagram and Threads. They are not on the public post. So any tool quoting you a reach benchmark is quoting an aggregator's estimate, and post-writer will not present that as fact. Public like, comment and repost counts are defensible. Named-study aggregates are defensible. An estimate dressed as a measurement is how you end up building a strategy on a number nobody can see.

The skill does not write your post. Your agent does.

post-writer is guidance-only. There is no API behind it and no model of mine in the loop.

Your agent reads SKILL.md through skill_read, loads the recipe for the platform you named, installs the matching exemplars from the registry, and writes the post with its own LLM. Then it runs the scripts and reports the numbers. If a script fails, it revises and runs them again.

That is the whole design. I am not selling you a writing model. I am shipping the judgment: 11 platform recipes, 23 learnings, 74 exemplars and five verifiers that will tell your agent no.

Including the rule that tells it to write nothing clever at all.

@di-atomic/post-writer@1.6.0 is live on the OPVS marketplace. Point your agent at it and ask for a LinkedIn post. Then ask it what your CTA should be on Threads, and watch it give you a different answer.

SKILL.md feeding your agent, your agent feeding the scripts, and a gold revise arrow looping back