How to do it
- List banned topics In brand memory, add topics agents must never post about. Drafts that match are rejected.
- Rely on per-network length Each target network is checked with its own rule. Nothing to configure.
- Set daily limits Set a maximum number of posts per account per day for agent-driven posts.
- Review warnings Link shorteners and missing alt text are flagged on the draft so you can fix them before approving.
- Keep rules in your repo Put banned topics in .socialhandoff/policy.json and apply them with pnpm socialhandoff policy apply, so changes go through review.
What each guardrail does
| Guardrail | Result | Notes |
|---|---|---|
| Banned topics | Rejected (422) | Matched against the draft text |
| Per-network length | Rejected (422) | X weighted 280, Bluesky 300 graphemes, Mastodon 500, LinkedIn 3,000 |
| Daily limit per account | Rejected for agents | Owners approving by hand may go over it |
| Missing alt text | Flagged | Shown on the draft |
| Link shorteners | Warning | The draft still lands in the inbox |
Daily limits and humans
Daily limits are enforced whenever no person is in the loop: a direct agent schedule, or an agent approval under auto-publish, that would pass the limit fails. You can still approve an extra post by hand.
Guardrails and the trust ladder
A guardrail failure demotes the agent that wrote the draft to draft-only immediately. That keeps an auto-publishing agent from repeating a mistake.
Why length is a guardrail
A scheduler that counts length the wrong way accepts a post and then fails at publish time, often overnight. Checking with each network's own rule at draft time moves the failure to where you can see it. Try the cross-post length checker to see the same rules.
See the guardrails glossary entry and prompt injection for why agent output needs checks.