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 · · 5 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.5.0. It drafts platform-tuned posts for LinkedIn, X, Instagram, Threads and Facebook, scored against 68 real posts and three scripts that fail loudly. And its two most valuable rules are the two 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

Three 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.

lint-ai-slop runs a 38-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.

Behind them sit 68 metric-bearing exemplars, each carrying its source and its number. 31 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 three 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: 7 platform recipes, 18 learnings, 68 exemplars and three verifiers that will tell your agent no.

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

@di-atomic/post-writer@1.5.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