LIVE · SLACK BOT
Caption Studio. Two scroll-stopping captions, zero invented facts.
- Status
- Live in the company Slack
- Client
- M4U Events marketing team
- Stack
- Next.js · Vercel · Claude (multimodal) · Slack API
- Scale
- 36 tests · 15 eval fixtures · 2 must-pass gates
- Year
- 2026
0 invented facts allowedthe eval gate that ships every change

The problem
The marketing team writes captions the way most people do: a rough draft, then twenty minutes second-guessing the hook. And AI “help” usually makes it worse, because models happily invent venue names, dates, and details. A wrong fact in a client’s wedding post is not a typo, it’s an incident.
What I shipped
- ◆Drop a draft in Slack (photo optional; the model reads the image too), get two complete variants back, each built on a different scroll-stopping hook.
- ◆One-tap refinement. Shorter · For TikTok · More emotional · Bolder hook, or just reply in the thread in plain words.
- ◆The factual firewall. The model must list which facts from the draft it used; using a fact that wasn’t there fails the gate. Free to reinvent wording, never reality.
- ◆Cultural-term preservation. Baraat, sangeet, haldi and the rest are never “translated away.” A second must-pass gate enforces it.
- ◆Stateless by design. Conversation state is reconstructed from the Slack thread itself; no database to drift.
How it works
- 1@mention the bot with a rough caption (and the photo, if you like)
- 2Claude reads both and writes two hook-first variants
- 3Every variant passes the factual firewall before posting
- 4Tap a refine button or reply in words; the thread is the memory
The hard part
The eval fixtures are the product. Fifteen scenarios (Hinglish drafts, romanized Punjabi, fact-heavy posts, clickbait traps, sparse one-liners) and two gates that must pass 100% before any prompt change ships. The firewall works because it’s structural: the model has to show its receipts (a
factsUsed list), and the gate checks them against the source.Proof
- ✓36 unit tests, no network required.
- ✓Both eval gates held on the live launch post.
- ✓Runs @mention-only, with a kill switch. Boring, safe operations.
rough draft + venue photo
Variant A · hook-first Variant B · story-first
✓ factual firewall passed · refine buttons below
Where it stands
Live in the company workspace. The team keeps the voice; the bot supplies the hook, and it never posts anywhere itself. Humans copy what they like.
I set the gates a caption must pass before it can reach a feed. Claude Code built the bot, and Claude writes the captions. How I work →
Run an events business? I built Ajna for you.
AI automation for wedding & event vendors. Quotes in minutes instead of days, with a human always in the loop.