Runcastle

Launch Thread Writer + Critic

MIT0 downloads

by runcastle

v1.0.1
Homepage ↗

A Claude Code writer drafts an X/Twitter launch thread from your product brief, then a Codex critic tears it apart post-by-post — hook, clarity, specificity, CTA — rewriting the weak posts on the same warm branch until the thread is ready to ship.

Topology

Disclosures

Disclosures — declared side-effect surface

Everything below runs on your machine or inside the sandbox when you use this workflow. Mismatches between these declarations and the actual code block publishing.

Host hooks

Commands executed on YOUR host machine by Sandcastle lifecycle hooks.

None declared.

Sandbox hooks

Commands executed inside the sandbox container.

None declared.

Network access

None. Both agents operate only on the local repository inside the sandbox; there is nothing to install and no page is fetched.

Shell expansion

No shell-expansion blocks in prompt files.

Files

Critique and rewrite the launch thread

You are a ruthless launch-thread editor. Growth teams pay you to kill the posts that would get scrolled past. You are working on the same branch the writer just finished. Read BRIEF.md for the product facts and content/launch-thread.md for the draft, then interrogate the thread post by post.

Grade every post against a hard bar

For each post, ask:

  • Hook (post 1): Does the first line stop the scroll on its own? If it could be the opening of any generic launch, it fails. Would you tap "show more"?
  • Momentum: Does each post create a reason to read the next? Kill posts that restate the previous one or stall the arc.
  • Specificity: Is every claim concrete and grounded in BRIEF.md? Flag and cut vague adjectives ("powerful", "seamless", "game-changing"), unsupported numbers, and anything invented. Replace assertions with the specific detail.
  • Clarity: One idea per post. Short lines. No jargon a first-time reader can't parse in one pass.
  • CTA: Is there exactly one, in the final post, with the real launch link, and is the next step frictionless?
  • Truth: Nothing in the thread may contradict or exceed the brief.

Fix it, don't just complain

When a post is weak, rewrite it directly in content/launch-thread.md and commit the change. Tighten the hook, cut filler posts, merge redundant ones, sharpen the CTA. Prefer fewer, stronger posts over more, weaker ones. Keep the numbering clean after edits.

Keep iterating — critique, rewrite, re-read — until the thread is one you would confidently post from your own account: a hook that stops the scroll, every post earning its place, every claim true to the brief, one crisp CTA.

When (and only when) the thread clears that bar, output the exact line <promise>SHIP_IT</promise> and stop.

README

Launch Thread Writer + Critic

Your launch thread is the single highest-leverage piece of copy you'll write all quarter — and the first post decides whether anyone reads the other twelve. This workflow pairs a strong writer with a ruthless editor so the thread that ships is the one that stops the scroll, not the first draft nobody had time to sharpen.

What it does

You drop a BRIEF.md in your repo with the product facts — what it is, who it's for, the core problem, the standout features, your proof points, pricing, and the launch link. A Claude Code (Opus) writer turns that into a numbered X/Twitter launch thread at content/launch-thread.md: a hook that earns the next line, one idea per post, concrete specifics instead of adjectives, and exactly one call to action.

Then a Codex (gpt-5.4) critic does the job you never have time to do to your own copy. It grades every post against a hard bar — does the hook stop the scroll, does each post earn the next, is every claim grounded in the brief, is there one crisp CTA — and rewrites the weak posts directly on the same branch. It keeps looping until it would post the thread from its own account.

How it works

Both agents share one warm sandbox created with createSandbox() on the content/launch-thread branch, so the critic sees exactly the state the writer left behind with no second container start-up. The writer runs once (maxIterations: 1); the critic loops (up to four passes) until it emits <promise>SHIP_IT</promise>. The topology is draft → critique (loop) → ship.

Because it's pure text, there's nothing to install and no network to touch — no hooks, no npm install, no page fetching. Just two models arguing about your copy until it's good.

Requirements

Set both credentials in .sandcastle/.env: CLAUDE_CODE_OAUTH_TOKEN (run claude setup-token) for the writer and OPENAI_API_KEY for the critic. Add your BRIEF.md to the repo root. Build the image once with npx @ai-hero/sandcastle docker build-image, then run npx tsx .sandcastle/main.ts. The finished thread lands at content/launch-thread.md. Nothing leaves the sandbox but the model calls.