for coding agents · free, open, no auth

Ask for a second opinion, get four more copies of the answer you already distrusted, one merged answer. Ship what survives the crash.

One install gives your agent a fixed four-role panel: Pragmatist, Skeptic, Specialist and Contrarian each draft the same task in separate contexts, review the other three anonymously as Draft A/B/C, and then the chair merges what survived instead of counting votes — keeping a log of the disagreements it could not resolve, and checking the winner's claims against your source before adopting them.

4 fixed roles ~9 calls, no server 7 report sections 0 API keys

install

Copy one line. Nothing else to set up.

Detects Claude Code, Cursor, Codex, Qoder and more, then writes the skill into the right folder. It is one SKILL.md: no server, no API keys, no other agent CLIs, nothing to install with pip.

npx skills add arm-pz/crash-test --skill crash-test

see it work

A real run, wrong claim and all.

One panel's full report on a decision in an unreleased project. Project identifiers are redacted; everything else is verbatim, including the grounding pass, whose marks came from opening the files after the panel finished. One panel claim came back wrong, and it is still in the report. Nothing here was written to look good.

task · should this freight-forwarding site ship lead capture now, or keep its coming-soon posture?

Two options: raise the CTA's ambition, or wait.

answer

The framing is already false in the code. There is no coming-soon posture: the homepage hero is a live Get a quote link to /quote, every one of the 15 guides ends in a quote CTA band, and /api/leads runs a real validate → dedupe → persist → match → SES pipeline. So the question was never ship-or-wait. It is whether the promise the site already makes can be kept. It cannot yet, in three places, and each fails silently:

  • firstOwner alerts read OWNER_ALERT_EMAIL; the only key the .env template documents is OWNER_EMAIL. With the template as written the recipient is an empty string.
  • secondsendLeadEmails swallows every error and returns sent:false, while the visitor has already been told "forwarders typically reply within a few hours." A dead address still shows success.
  • thirdvercel.json schedules two crons that have no route, so nothing ever retries. The partner seed is placeholders only, including a wildcard row matching every lane, so every lead "matches" a mailbox nobody reads.
  • gateThe project's own launch checklist requires three to ten onboarded partners, or owner-fallback live from day one. Neither holds.
  • soFix 1-3, get one real inbox in the seed, then raise the CTA's ambition. Do not add a field, a button, or a channel first.
decision: merged — Skeptic's failure list + Specialist's precondition; Specialist's rewrite dropped for lack of evidenceindependence: separate contexts (sub-agents)

what the panel changed · how the answer differs from the first drafts

All four refused the two-option framing, from four different directions, and each contributed something the others missed.

  • pragmatistEstablished that the work was already shipped, and that a WhatsApp button would be net-negative.
  • skepticFound the silent failure and named it the real risk: capture works, fulfilment does not.
  • specialistProduced the one concrete next action and the precondition that makes it safe.
  • contrarianWent and read the design spec, which turned "is the pipe wired?" into "this project's own gate says it is not allowed to launch yet" — the finding that decided the answer.

and this is where it differs from asking four times

The Grounding section is what separates this from "ask the same model four times". Before adopting an answer about code you have, the chair opens the source and marks each claim the winner depends on as confirmed, wrong or unverifiable, with file and line.

custom role cards go in a crash-test-roles/ folderper-member models where the host allows it

rejected and why · ideas dropped, each with the evidenced flaw that killed it

  • droppedReplace the guides' link-out CTA with an inline form (Specialist). No evidence yet that the link-out loses leads; it is a rewrite of the site's main conversion path on a guess.
  • droppedAdd a WhatsApp button. Evidenced: no number, business account or opt-in capture exists anywhere in the repo, and mailto already covers direct contact.
  • wrong"Dynamic OG images are dead code." Wrong, and the chair caught it — see Grounding.

the rule behind these three lines

The chair merges, it does not count votes. A flaw only counts if the reviewer gave concrete evidence for it; a flaw raised without evidence goes to the dissent log rather than silently shaping the answer.

adopt, merge, or say none is good enoughnever a fifth member, never a tally

grounding · checked against the source after the panel finished

  • confirmedOWNER_ALERT_EMAIL vs OWNER_EMAIL — src/lib/email.ts:69 vs .env.example:7
  • confirmedsendLeadEmails swallows errors — src/lib/email.ts:93
  • confirmedCrons declared, routes absent — vercel.json; no cron dir under src/app
  • confirmedPlaceholder + wildcard partner row — data/partners.seed.json
  • confirmedGuides carry no /quote link in body — zero matches in src/content/guides/*.mdx
  • confirmed"Reply within a few hours" promise — src/components/QuoteForm.tsx:16
  • confirmedLaunch gate unmet — the project's own design spec, section 7: "First 3-10 partners onboarded, or owner-fallback live from day one"
  • confirmedHero CTA, guide CTA band, 15 guides — src/app/page.tsx:154; guides/[slug]/page.tsx:197
  • confirmedNo privacy policy route — no match for privacy in src
  • wrong"Dynamic OG is dead code" — lane, port and cost metadata all pass og (src/lib/seo.ts:148, :399, :522); only the guides page omits it (guides/[slug]/page.tsx:48)
  • unverifiedEU-facing / GDPR wording — stated as an assumption; no jurisdiction claim in the code sets it

what a wrong mark does

A wrong claim must be fixed before the answer ships; an unverifiable one is stated as an assumption inside the answer. In its first live run, this pass found a wrong claim made by one of the four members.

skipped when the task is purely conceptualdrafts written from memory carry assertions nobody re-derives

dissent log · disagreements the chair could not resolve

  • firstPragmatist: change nothing but delivery. Specialist: swap the guide CTA for an inline form now. The chair found no evidence separating them, so the rewrite stayed out of the answer and into this log.
  • secondSkeptic treated the empty-owner-alert path as a compliance problem; nobody produced evidence of the site's jurisdiction, so it is an assumption, not a finding.

confidence

Medium. One test lead submitted with the documented .env, checked against the mail log, settles the whole thing in five minutes.

every run returns the same seven sectionsso the diff between runs is the interesting part

the panel

Four drafts, twelve reviews, one chair.

Ask in plain language: "crash test this", "get a second opinion on this migration plan", "debate this plan before I commit to it", "I don't trust this bug hypothesis". Cross-review scales as n×(n−1), so four members is 4 drafts + 12 reviews + 1 chair ≈ 9 calls; seven would be around 50. It reviews a decision, not a diff — for a factual lookup, a small edit or a review that scans code for defects, it says a run wasn't needed.

The four members 4 calls

Each gets the same task, word for word, plus exactly one role card. Fixed roles keep results predictable and make the dissent log readable.

  • Pragmatist
  • Skeptic
  • Specialist
  • Contrarian
  • under ~400 words
  • work alone

Cross-review 4 calls

Each member reads the other three relabelled Draft A, B, C — no role names, because role labels cause deference.

  • strongest idea
  • most serious flaw
  • evidence or none found
  • would you change your draft?

Chair synthesis 1 call

Adopt one surviving draft with small fixes, merge the strongest surviving ideas, or say none is good enough and explain why.

  • merges, never counts
  • no invented facts
  • unevidenced → dissent log
  • escalates when stuck

Grounding pass +file reads

When the task refers to files, code, config or data you already have, the chair opens the source before adopting the winner.

  • confirmed
  • wrong
  • unverifiable
  • file:line where known
  • wrong must be fixed

Plan debate ~5 calls

The lighter mode for a plan you are about to act on: Skeptic against Contrarian, openings, rebuttals to Position A / B, then a chair verdict.

  • Proceed
  • Proceed with changes
  • Switch to the alternative
  • Need information

Two knobs optional

Drop role cards in a crash-test-roles/ folder to replace a member or fill the fifth seat. Where your host allows it, give each member a different model — four copies of one model share its blind spots.

  • custom role files
  • per-member models
  • never past five drafting seats

The Operator seat opt-in, ~10 calls

For decisions with an operational afterlife. It does not draft and is not cross-reviewed — the one voice nobody attacks. It reads the chair's candidate answer plus the four drafts, before the answer is finalised. Suggested in one line when the task is a plan rather than a question, never added silently, because it costs calls. A plan that survives four critics can still die in the ninth month.

  • Cost
  • Rollout
  • Reversibility
  • Maintenance
  • chair candidate → operator → final answer

house rules

What it will not do.

It does not vote

The chair is not a fifth member and resolves nothing by counting who agreed. Conflicts are weighed against the task and its constraints. If none of the four drafts is good enough it says so, suggests a sharper reframing or a bigger run, and does not dress one up as a clean answer.

It will not invent a fact

Members mark anything they are unsure of as an assumption; nobody fabricates metrics, quotes or sources to fill a gap. Claims the winner treats as given get checked against your actual files and marked confirmed, wrong or unverifiable, with file and line.

It is honest about what it is

Four members are one model in four contexts — independent in context, not in training. It is a cheap pressure-test, not a substitute for a panel built from different vendors. Without sub-agents it still runs, sequentially, and marks the report "Independence: shared context" and lowers confidence by one level.

Four drafts, one merged answer, the disagreements on the record.

Free, open, nothing to set up, and it runs entirely inside the agent you already use. For the heavy version, there is do-better.

Install crash-test Read the source