Most content pipelines trust the LLM to "sound natural." That's not a constraint — it's a wish. When the model drifts into marketing-speak, you either catch it in review or it ships.
In marketing-pipeline, the enforcement lives in pipeline/antislop.py, not in the system prompt. Before any post reaches Bluesky, Dev.to, Hashnode, or Mastodon, a regex blacklist runs against the raw draft. Hard-rejected tokens include excited, game-changer, unlock, empower, AI-powered, all emoji, all hashtags, exclamation points, and rhetorical questions. The gate doesn't ask Claude to avoid these things — it refuses to publish until they're absent.
Per-channel length limits are enforced the same way: Bluesky caps at 300 characters, X at 280, Mastodon at 500, Dev.to and Hashnode at 150–400 words. A draft that's 310 characters for Bluesky doesn't post. It regenerates.
The split makes the failure modes cleaner. Claude handles the hard part — reading a README, inferring the problem the tool solves, rotating across angles so the fifth post about a project doesn't read like the first. The pipeline handles the part that shouldn't require judgment: token bans and character counts are deterministic. Putting them in a prompt and hoping is a different class of reliability than putting them in antislop.py.
Onboarding a project takes one command:
marketing onboard --name my-tool --repo owner/repo --kind mcp-server
That fetches the README, sends it to Claude, and saves problem, facts, and angles to projects.yml. From there, the daily cron (marketing cycle, running via GitHub Actions at 14:00 UTC on weekdays) rotates through projects × angles × channels, picking the least-recently-used angle per project.
The anti-slop gate means the rotation can run unattended without producing the kind of output that makes people unfollow you.
Top comments (0)