The most expensive design flaws are the ones found in production; the cheapest are the ones found before the design review.
Tier: Core · Workflow area: Architecture & Design
AI will not design your system — but a reasoning-capable model is a tireless, unembarrassable adversary: it will attack your draft from four directions and argue both sides of your trade-offs with a straight face. The rules that make this work: you draft first (the design stays yours), the attack is structured (personas, not "any thoughts?"), and every claim the model makes gets verified before it changes your design.
Skip when you have no draft — asking AI to attack a vague idea produces vague attacks. And never substitute this for human review; it is the filter before it, so humans spend their attention on judgment, not on catching missing timeout handling.
Run the four-lens attack. One lens per prompt (batched lenses blur):
You are reviewing the attached design for an org-wide rate-limiter service.
Lens 1 — FAILURE MODES. Attack only reliability: enumerate the failure modes
this design does not handle. For each: trigger scenario, blast radius, and
the specific section of the doc that is silent about it. Rank by
likelihood x impact. Do not suggest fixes yet — attack only.
Repeat for Lens 2 — scale cliffs (which numbers break first at 10x/100x, hot keys, thundering herds), Lens 3 — security (abuse, authz gaps, multi-tenant leakage; STRIDE-lite, or hand off to pb-37 for a full pass), Lens 4 — operability (how is it deployed, observed, debugged at 3 a.m., rolled back?).
Triage the attack transcript. Sort every finding: (a) real gap → fix the design, (b) already handled → the doc failed to say so, add a sentence, (c) out of scope → add to an explicit non-goals section, (d) model misunderstanding → often means the doc is ambiguous; clarify anyway. Category (b) and (d) findings improve the document; (a) improves the system. Both matter in review.
Steelman the trade-offs you already made. For each contested decision:
Our draft chooses a centralized Redis-based limiter over a client-side
library. Argue the CLIENT-SIDE position at full strength — the case its
best advocate would make, using our stated constraints (40 services,
3-person platform team, p99 budget 5ms). Then argue the counter. Then list
the 3 assumptions the decision actually hinges on, phrased as verifiable
claims (e.g. "Redis round-trip inside the VPC stays under 1ms at p99").
Verify the hinge assumptions — outside the chat. The model's "Redis adds ~0.5ms" is a plausibility, not a measurement. Benchmark it, check the vendor limits page, read the actual SLA. Every number that survives into v2 must have a non-LLM source or a "we measured" note. This step is what separates this playbook from vibes with extra steps.
Publish v2 with the attack visible. Ship: the revised design, a change log ("v2: added Redis-failure open-mode after Lens 1 finding #3"), and the non-goals section. Optionally attach the attack transcript — teams that see the design survived a structured assault review faster and trust deeper. The hinge assumptions become the review's discussion agenda.
The model's job is to generate attacks and steelmen cheaply; your job is to adjudicate them and verify every load-bearing number. A design changed by an unverified AI claim is worse than an unreviewed one — it has the confidence without the evidence.
Design docs encode roadmap, scale numbers, and client architecture — often more sensitive than code. Redact before external prompting: neutralize client/product names, round scale numbers to order-of-magnitude, strip commercial context; the attacks survive redaction because they target structure, not names. On client work, use the sanctioned tenant. Local fallback is honest-but-weaker: an Ollama-hosted model runs the four lenses usably but with shallower reasoning — compensate by running each lens twice with different phrasings and by leaning harder on your own pre-mortem checklist. The steelman step degrades most; consider doing that one as a structured written exercise with a colleague instead.