| name | roast |
| description | Roast an ad in AdChad's voice. If the operator handed you an ad (an attached image or a URL), roast THAT — deterministically, one tool call, no hunting. The voice runs on Grok (MODEL_ROAST); the `roast` tool sees the ad via vision so it never lies about it. |
| version | 4.0.0 |
| metadata | {"hermes":{"tags":["marketing"],"category":"business","requires_toolsets":["terminal"]}} |
roast — one ad in, one roast out
You don't write the roast. The roast tool does — Grok, in AdChad's voice, grounded in what the ad actually shows (vision reads the image, so no false claims). Your only job is to give it the ad and hand back the result.
The roast contract (battle plan §2 — every public roast). The output must hit all 5 beats: 1) Shock (one data-backed almost-unbelievable fact) · 2) Teardown (brutal, funny, specific to THEIR ad — punch the ad, never the person) · 3) Expertise (the real fix + why, proving Chad is a media buyer, not a meme) · 4) Feel-good (the conversion-gated $1 donation, tied to a detail in the ad) · 5) CTA ("Unfuck it → $5. The good one's already written.") + the autonomy flex (— Chad · roast #N/100 · an AI wrote this).
Viral gate before any public post — passes ALL or regenerate: ☐ Shocking ☐ Useful ☐ Funny ☐ Autonomous-flex ☐ Feel-good ☐ Safe (punches the ad, not the human). Run ../../brand/taste/ADCHAD-TASTE-PACK.md. Voice + look non-negotiables: ../../brand/CHARACTER.md.
Route FIRST (don't skip this)
- Handed an X TWEET to roast publicly (a tweet link/URL, and they want it roasted on X)? → ONE deterministic call:
cd "$PROJECT_DIR" && pnpm -s tool xroast --tweet "<tweet url>". It reads the tweet's ad image, roasts it, replies in-thread with the roast, and creates the prospect + records the roast reply's tweet id. If the launch campaign is armed, this is FREE — no $5 link; the fix worker replies the mockup into the same thread unprompted (max engagement during launch). Otherwise it carries the $5 /p/<id> link, and the fix worker replies the fixed ad into the same thread once they pay (no email; the whole transaction is public). Kill-switch must be OFF (db status). Returns {prospectId, roastTweetId, salesUrl} (salesUrl is null when free). STOP — done.
- The operator attached an image, OR named/pasted an ad URL? → that IS the ad. Go to Direct roast below. DO NOT
web_search, DO NOT foreplay scan, DO NOT /prospect, DO NOT loop. You already have the ad — roast it.
- No image and no target given? → only then
/prospect to find one, then come back here.
This is the case that wastes everyone's time: someone hands you ads and says "roast these," and you go hunting the web for them. The ad is in front of you. Use it.
Direct roast (deterministic — one tool call)
- Find the ad.
- Attached image → it's the newest file in the image cache:
ls -t ~/.hermes/image_cache/ | head -1 (prepend ~/.hermes/image_cache/). Don't base64, don't file, don't inspect it — roast reads it for you, local path or URL.
- A URL in the message → use the URL verbatim.
- Roast it:
cd "$PROJECT_DIR" && pnpm -s tool roast --image "<path-or-url>" --brand "<brand from the message>" → {xPost, emailSubject, emailBody, score, verdict}. Roasting a /prospect target (you have its ids)? Add --ad-id "<foreplay_id>" --prospect-id "<id>" — the tool then records the creative score so the public Live feed + funnel show a real number.
- Reply in-thread with the
xPost. That's the deliverable for an operator ask. STOP here — you are done. (One image, multiple ads in it? Still one call — roast the set: "a $T company running 6 ads this lazy.")
That's the whole loop. If step 2 errors, say what broke in one line — do not start web-searching as a fallback.
Publish (only when explicitly told to post/email, kill-switch off)
Reply-with-the-roast is the default. Publish to X / cold-email the owner ONLY when the operator says so (or a --live cron drives it):
- Gate:
pnpm -s tool db status — paused: true → STOP, draft only, publish nothing.
- Post:
pnpm -s tool xpost --text "<xPost>" --image "<creative_url>" --handle "<handle>" --link "<APP_URL>/p/<id>" (fits 280 + appends the link).
- Email the owner (if there's an email):
pnpm -s tool email send --to "<email>" --subject "<emailSubject>" --body "<emailBody>".
- Log + advance:
pnpm -s tool db record --json '{"prospect_id":"<id>","ad_id":"<foreplay_id>","channel":"x","direction":"out","ref":"<tweetId>","text":"<xPost>"}' then pnpm -s tool db stage --id <id> --stage roasted.
Guardrails
paused: true → publish nothing.
- Segment B (no active X) → omit
--handle; email only.
- Brand-safety: only genuinely bad ads, roast the ad never the person, no false claims (vision keeps you honest).