DEV Community

J Now
J Now

Posted on

The antislop gate: enforcing post quality in code, not prompts

Every LLM-generated draft in marketing-pipeline runs through pipeline/antislop.py before it can be published. The gate hard-rejects specific strings — excited, game-changer, unlock, empower, AI-powered — plus structural patterns: emoji, hashtags, exclamation points, rhetorical questions. If the draft contains any of them, it fails and gets rewritten. Claude never sees an instruction to 'write naturally' or 'avoid marketing language'; the constraint is enforced downstream in code.

The reason for doing it this way: prompt instructions for tone are soft. You can tell a model to avoid hype, and it will avoid the exact words you named while finding synonyms that carry the same weight. A regex blacklist doesn't negotiate. If the token is in the string, the post doesn't ship.

Per-channel character limits work the same way — Bluesky at 300 chars, X at 280, Dev.to and Hashnode at 150–400 words — all checked in code after generation, not enforced by asking Claude to count.

The rest of the pipeline handles the distribution work most OSS projects skip: onboarding a project takes one command that fetches the README and extracts problem framing and post angles into projects.yml. A daily cron at 14:00 UTC rotates through projects × angles × channels, picking the least-recently-used angle per project. Automated posting covers Bluesky, Dev.to, Hashnode, and Mastodon; directory submissions go to MCP Registry, Smithery, GitHub Topics, and others depending on the kind field.

The pipeline won't write your code. It will keep showing up for it after you've moved on to the next thing.

https://github.com/robertnowell/marketing-pipeline

Top comments (0)