Some decisions are cheap to change later. A few are not — and those few quietly decide whether the whole thing works.
Phase 2 is where you find the hard-to-undo decisions, make them on purpose, and write down why.
Every idea below is paired with the real thing — examples come from a fictional but fully worked engagement, Harbor Mutual, a regional insurer.
Why this phase exists at all
A handful of decisions are expensive to take back — so take them deliberately
By now the problem is fixed and the requirements are signed. The danger has shifted. It's no longer "are we building the right thing?" — it's "are we building it on a shape we can live with?" Most choices in a project can be reversed in an afternoon. A few cannot, because everything else gets built on top of them.
Phase 2 does one thing: it finds the small number of decisions that are hard to undo, makes each one in the open with real alternatives on the table, and records the reasoning so nobody has to guess later.
A shape chosen carelessly in week three becomes a rebuild in month four — because real code now sits on top of it. Spend a week choosing well now, and you save a quarter of rework.
Harbor's claims rebuild had to read policy data to decide coverage. The obvious source — the core system, PolicyOne — only updates once a night. Choose the wrong way to read it and you either re-add the very delay the project exists to remove, or you commit to mainframe work nobody could staff this year.
"Where does a coverage check get its answer — and how fast, given the once-a-night sync?"
Get that one wrong and the 11.4-days-to-5 goal is gone before a line ships.
The hard-to-undo decisions still get made — just by accident, by whoever typed first, with no alternatives weighed and no record of why. You discover them when they break.
Go deeper — the full method
By now Phase 0 fixed the problem and constraints and Phase 1 produced a signed requirements baseline. Phase 2 decides the architecture — the small number of decisions that are expensive to undo, which is why every one of them gets a record and two signatures.
Phase 2 answers four questions, and nothing else:
- What is the shape of the system? Components, boundaries, data flow, deployment view.
- What are the contracts? API contracts, the data model, integration interfaces — with error semantics (how each operation behaves when things fail), not just the happy paths.
- Which decisions are hard to undo, and what did we choose? Architecture decision records, each with real options and consequences, each signed.
- How will the design be proven? The verification approach per NFR, and what the Phase 3 walking skeleton must demonstrate.
Production code, the full backlog of build specs, environment provisioning, and pixel-level UI design are out of scope — they belong to Phase 3 and the Build. Design spikes (small, throwaway code to test a risky assumption) are explicitly in scope; they are how design claims get verified against reality instead of against documents.
The rule that governs everything
Claude presents options; humans choose
This is the second-strictest version of the standard's spine, after Discovery's. The AI does the research, lays out the real choices with honest trade-offs, and drafts the records once a person has decided. But it never picks the architecture. A machine compares; a named human chooses.
For every decision that matters, the AI puts two or three genuine options on the table — with their costs, their risks, and what each one closes off later.
- Claude researches the options, frames the trade-offs against this project's real constraints, and drafts the records after the choice is made.
- People weigh the options, pick one, and put their name on it — on both sides of the engagement.
One option presented alone isn't a decision. It's a default wearing a decision's costume.
For the coverage-source decision, Claude laid out three real paths and what each cost:
"Queue batch requests through PolicyOne — no new access, but answers arrive next business day. Re-adds the day the metric exists to remove."
"Read the nightly snapshot replica directly. Milliseconds, fresh-as-of-yesterday, behind a service that owns the staleness rule."
The AI framed the choice; two named humans owned it.
Go deeper — the full method
This phase has the second-strictest human rule in the standard, after Phase 0's: Claude presents options; humans choose. Concretely:
- Option research and framing. For each architecture-level decision, Claude researches and presents 2–3 genuine options with concrete trade-offs — costs, risks, what each forecloses — grounded in the actual requirements and constraints, not generic textbook comparisons. One option presented alone is not a decision; it is a default wearing a decision's costume.
- ADR drafting, after the human picks. The record captures the context, the options actually considered, the choice, and the consequences — including the unpleasant ones.
- Contract and model drafting. API contracts and the data model drafted from the requirements, carrying the Phase 1 error-behavior specs into concrete response codes, failure modes, and degradation behavior.
- Consistency checking, both directions. Every top-tier requirement lands somewhere in the design; every major design element traces back to a requirement or constraint. Orphans in either direction get flagged ("this service exists but nothing requires it" is how accidental scope is born).
- Threat-model preparation. Claude drafts the data-flow diagrams and candidate threat list the security session works from.
What Claude never does: choose an architecture, sign an ADR, accept a risk, or soften a trade-off to make an option look better.
How a decision becomes a record
Write down what you rejected, not just what you chose
A decision you can't reconstruct is a decision you'll relitigate. So each hard-to-undo choice gets a short record: what the situation was, which options were really considered, what was picked, and what that costs you — including the parts you won't enjoy.
The record's most valuable line is often the rejected option, with the reason beside it. That's what stops the same argument from coming back in month three — and it's proof the alternative was actually weighed, not waved past.
Two people sign each one: the team's design owner and the client's own engineer. A record with one signature is an engagement artifact. A record with both is a decision the client made with you, not one handed to them after.
The claim-store record could have just said "relational model, append-only log." Instead it recorded what it turned down:
"Full event sourcing — considered and rejected as unfunded gold-plating, and as an operability cost the team would carry at 2 a.m."
Nobody relitigates it later, and nobody wonders whether it was even considered. Every record that week carried both Rob's name and Wes's.
The single-option record: one approach presented, everyone nods, and the document gets written around a reflex. The alternatives are exactly where the thinking lives — skip them and the record proves nothing.
Go deeper — the full method
An ADR is an architecture decision record: one hard-to-undo choice written down — the options considered, the decision, and its consequences — signed by a named human on each side (a signature is the person's name and date recorded in the ADR file itself). Claude drafts each ADR after the human picks, against the ADR template, capturing the context, the 2–3 options genuinely considered, the choice, and the consequences including the unpleasant ones.
The Setup Owner edits and signs; the client counterpart co-signs. An unsigned ADR is a conversation, not a decision. Decisions not worth a room are settled asynchronously between the Setup Owner and the counterpart, and still get an ADR if they're hard to undo.
The failure mode is the single-option decision: Claude (or the architect) presents one approach, everyone nods, and an ADR gets written around a default. The 2–3-options rule exists because the alternatives are where the thinking happens; an ADR with one option is documentation of a reflex. The absent counterpart is the other risk — ADRs signed by one side are an engagement artifact, not a client decision; surface it at steering while it costs days, not at close when it costs the handoff.
Don't bet the design on a guess
Test the risky assumption against the real thing — with throwaway code
A design quietly bets on things being true: that an old system answers fast enough, that an integration behaves like its documentation claims. Bet wrong and you find out in build week three, when it's expensive. So you check first — cheaply.
For each risky assumption, someone writes a small, throwaway piece of code that pokes the real system for a few hours. The point isn't the code — it gets deleted. The point is the finding, which the design then gets built around.
The most valuable spikes falsify something. A spike that proves a favored option won't work just did its job for the price of an afternoon.
Jonah spiked the snapshot replica. It answered in 180 milliseconds — easily fast enough. But the throwaway code found something no document mentioned:
"The replica is unavailable during its 02:00–04:30 nightly refresh window."
"During refresh, the service shows 'pending verification' and never blocks intake — written into the contract, not discovered as a 2 a.m. incident."
One hour of code nobody kept saved a midnight outage in month four.
Go deeper — the full method
A spike is small throwaway code written to test a risky assumption against reality before the design depends on it; the findings are kept, the code is deleted. Orchestrators run the design spikes — small, throwaway, time-boxed to hours: does the integration respond the way its documentation claims, does the candidate approach survive the surge profile, does the access path actually open.
Anything the design would bet on that has only been verified on paper gets a spike. The spike findings become design inputs: a refresh-window outage flows straight into a contract's degradation behavior instead of surfacing as a 2 a.m. incident in month four.
The design bets on an interface nobody called. The spike-before-you-depend rule is cheap insurance; the alternative is discovering the truth in Build week 3, which is how the last vendor died. If a spike falsifies a favored option — good, that's the spike doing its job. Re-run the option session with the surviving candidates rather than bending the finding.
Define the edges — including how they break
A contract that only describes success is half a contract
Every part of the system has a boundary where it meets the others. The boundary has to say not just what happens when things go right, but exactly what happens when they go wrong — because that's the part the next person will need and won't be able to guess.
For each operation, the design pins down the success behavior and the failure behavior: what callers see when a dependency is down, when data is stale, when the system is overwhelmed. The error behavior agreed earlier in requirements flows straight into these concrete responses.
Leave the failure paths to "the implementer's imagination" and you've thrown away the careful thinking that already happened — and guaranteed each developer invents a different answer.
The coverage-check contract spells out every failure, not just the happy answer:
"Policy not found → return 'needs-review' with a reason code — never a silent 'verified'; raise the queue flag the same business day."
"Under a surge, the portal never rejects a claim: accept it, queue deeper, show the degraded-confirmation message the product owner approved."
Go deeper — the full method
A contract is exactly how a piece of the system behaves at its boundary, failures included — what callers may rely on. API contracts get completed for every operation: the request/response shapes, the error semantics carried down from the Phase 1 error-behavior specs, and the degradation behavior under each dependency failure. A contract that only describes success is half a contract.
Happy-path contracts — success specified, failure left to the implementer's imagination — are a named failure mode. The Phase 1 error-behavior specs exist precisely to flow into contract error semantics; if they don't, that work evaporates here. The error spec agreed in requirements becomes the verification endpoint's response codes, staleness header, and refresh-window degradation behavior.
The constraints don't bend
Design with the hard limit, not around it
Some constraints are fixed: a system that only syncs at night, a rule that the business must keep a door open for a future product, a regulatory clock. The tempting move is to wish them away — "we'll add a real-time feed later." That's how projects quietly break their own promises.
What Discovery fixed as non-negotiable, the design honors — or it re-opens the conversation out loud, never silently. The constraint is an input to the shape, not an obstacle to route around.
The forward-compatibility rule cuts both ways: don't close off the future the client paid to keep open — and don't furnish a room for a future nobody funded. "Must not preclude" means the door stays open, not that you build behind it now.
The constitution said the design must not preclude Harbor's future auto-insurance business — but v1 ships property claims only. Checking the draft model against that rule forced exactly one change:
Adding the auto book later becomes a data change, not a schema rebuild — door open, room unfurnished.
They honored the once-a-night sync the same way: the replica read is the design, not a workaround pasted over it.
Go deeper — the full method
The constitution is the short Phase 0 document fixing what must always be true (and what must never happen) for this engagement; later phases may not silently contradict it. On day 3 the forward-compatibility check the constitution demanded runs against the draft model: does this design preclude the futures the client paid to keep open? Verified now, gated again at every design review — the Setup Owner walks each constitution-protected future against the draft model and records the verdict, and what made it true, alongside the model.
Two named failure modes bracket this. Designing around the constraint instead of with it: the hard boundary (a batch window, a regulated data path) gets wished away with "and then we'll add a real-time feed later." Phase 0 resolved what's fixed; the design honors it or the engagement re-opens the conversation explicitly — never silently. Foreclosing the protected future — or gold-plating for an unfunded one: the forward-compatibility check cuts both ways. Don't preclude what the constitution protects, and don't build abstractions for futures nobody paid for. "Must not preclude" means the door stays open, not that the room gets furnished.
Build the smallest thing — the right way
Ship only what's funded, but leave the right seams
Restraint and foresight sound opposed, but they're the same discipline pointed in two directions: don't build the future, but don't make the future a rebuild either. The skill is knowing which is which.
The data model serves every top-priority requirement and nothing more — no service exists that no requirement asked for. But where the design knows a future is coming, it leaves a clean seam rather than a wall.
A good seam is invisible until you need it, costs nothing today, and turns tomorrow's "rewrite" into tomorrow's "configure." A bad one is a half-built feature nobody paid for.
The model carried its audit trail as structure, not as an afterthought, and its merge rules as first-class history:
"Append-only event log — every state change with actor and timestamp; the duplicate-merge is an event pair, so history survives the merge."
And the coverage service got built as the seam for real-time: if Harbor funds it later, the contract doesn't change — only the source behind it does. That's a door left open, costing nothing now.
The design is traced both ways: every top requirement lands somewhere, and every component traces back to a requirement. A part that nothing asks for is how accidental scope is born — so it gets cut.
Go deeper — the full method
The data model and component design get drafted starting where the handoff said to start — the element where the most constraints converge. The model serves every top-tier requirement; the convergence constraints (audit, merge rules) are structural, not bolted on. A walking skeleton — the thinnest end-to-end slice of the system, built first to prove the architecture works in practice, not on paper — gets named for Phase 3 to make real.
Claude runs the consistency check in both directions: every top-tier requirement lands somewhere in the design, and every major design element traces back to a requirement or constraint. Orphans in either direction get flagged — "this service exists but nothing requires it" is how accidental scope is born.
A component creeps in that no requirement asked for. Trace the design both directions and cut what nothing needs — accidental scope dies in design, not build.
Now watch the whole thing happen
The week, end to end
You've got the ideas; here's the actual rhythm at Harbor. The week's spine is simple — options early, decisions in the middle, contracts and proving at the end — with the riskiest bets tested against reality on day two before anything depends on them. Step through it.
Find the few requirements that actually shape the architecture
Most requirements don't drive the design. The day's craft is finding the five-to-eight that do — the nightly batch window, the storm surge, the auto-proof rule, the regulatory clock. The two open questions carried from Phase 1 come due, because their answers are design inputs. Claude lays out two-to-three options per major decision; the design owner kills the strawmen and books the option session.
Test the risky bets, then let humans choose
Orchestrators run the throwaway spikes — does the replica answer fast, does the email parser reach useful accuracy. Then the option session: the design owner and Harbor's lead engineer work through Claude's framings with the spike results in hand, and choose. By end of day the architecture direction is set and the list of records to write is known.
Sign the decisions; draft the model
Claude drafts the records from yesterday's choices; the design owner edits and signs, the client's engineer co-signs. An unsigned record is just a conversation. The claim data model gets drafted — starting where the most constraints converge — and the forward-compatibility check forces its one structural change.
Pin the edges, walk the attack surface, plan the proof
The API contracts get completed — every operation, every failure path, every degradation behavior. The security session walks the data flows and assigns each threat: mitigate it in the design now, or guard it with a build-time gate later. The quality engineer writes how every quality target will be proven, and defines the thin end-to-end slice Phase 3 must make real.
Fresh eyes attack it, then it ships forward
A reviewer that didn't draft the design challenges it from four angles — architecture, product, quality, security. Findings get fixed or accepted by name; the consistency check runs both directions and an orphaned service gets cut. The gate runs, the sponsor gets the narrative (not the diagrams), the signatures land — and the engagement advances. That sign-off is billing milestone three.
Go deeper — the full method
The default calendar is 5 business days, stretching to 8–10 when the integration estate is large (many external systems to connect to) or the client's review boards add latency. The week's spine: options early, decisions in the middle, contracts and verification at the end. The Setup Owner's enablement work from Phases 0–1 continues in parallel and is why Phase 3 can start immediately after.
- Day 1 — design drivers and the option set. The pod extracts the design drivers from the Phase 1 handoff — the 5–8 requirements and constraints that actually shape the architecture. The open questions the handoff carried come due; their answers are usually design inputs. Claude presents the option sets; the Setup Owner kills the strawmen and schedules the option session. The riskiest assumptions get named and spikes get assigned.
- Day 2 — spikes and the option session. Orchestrators run the design spikes (throwaway, hours-boxed). The option session (90–120 min): Setup Owner and the client's lead engineer work through Claude's framings with spike results in hand, and the humans choose. Product-facing trade-offs split off to the PO with the usual clock. By end of day the architecture direction is chosen and the ADR list is known.
- Day 3 — decisions become records; the model takes shape. Claude drafts the ADRs from the day-2 choices; the Setup Owner edits and signs; the client counterpart co-signs. The data model and component design get drafted, and the forward-compatibility check runs against the draft model.
- Day 4 — contracts, threat review, and the proving plan. API contracts completed with error semantics and degradation behavior. The threat review session with client security assigns mitigations — some design changes, some build-time security gates feeding the risk-tier map. The Quality Engineer completes the proving plan and the walking-skeleton definition.
- Day 5 — review, gate, and the handoff. The design review: fresh eyes challenge it from four angles. The consistency check runs both directions; orphans resolved. The automated gate check runs; the Phase 3 handoff is drafted. Steering: the sponsor gets the design narrative, not the diagrams. Sign-offs recorded; the engagement advances to Foundation.
When the week stretches: a formal architecture review board gets scheduled for day 4–5 from day 1, and if its cadence can't fit, the phase stretches and gate-based billing makes the latency visible rather than absorbed. A spike that falsifies a favored option is the spike doing its job — re-run the option session with the survivors. A counterpart who keeps missing sessions gets escalated at steering; co-signature is the handoff being built early.
How it goes wrong
The failure modes, and the defense against each
Every one of these has killed a real project. Knowing them by name is half the defense — and Harbor's structure caught two of them in the act.
| The trap | What it looks like | The defense | At Harbor |
|---|---|---|---|
| The single-option decision | One approach presented, everyone nods, a record written around a reflex | Two or three real options, or it's not a decision. The alternatives are where the thinking is. | Three options costed per decision |
| Resume-driven architecture | The interesting technology beats the boring one that fits | The client runs it at 2 a.m., not you. Their operating model is the tiebreaker. | Serverless rejected — foreign to Harbor's ops |
| Designing around the constraint | "We'll add the real-time feed later" wishes the batch window away | Honor the fixed limit, or re-open it out loud — never silently. | The nightly replica is the design |
| Faith-based integration | The design bets on an interface nobody actually called | Spike it against the live system before you depend on it. | Caught — the spike found the refresh window |
| Happy-path contracts | Success is specified; failure is left to imagination | Carry the error specs down; failure behavior is half the contract. | Every contract row is a failure case |
| The orphan service | A component creeps in that no requirement asked for | Trace the design both directions; cut what nothing needs. | Caught — a service cut on day 5 |
Go deeper — the full method
- The single-option decision. Claude (or the architect) presents one approach, everyone nods, and an ADR gets written around a default. The 2–3-options rule exists because the alternatives are where the thinking happens; an ADR with one option is documentation of a reflex.
- Resume-driven architecture. The interesting technology wins over the boring one that fits. The constitution's principles and the client's operational reality are the tiebreaker — they will run this system at 2 a.m., not us.
- Designing around the constraint instead of with it. The hard boundary gets wished away with "and then we'll add a real-time feed later." Phase 0 resolved what's fixed; the design honors it or the engagement re-opens the conversation explicitly — never silently.
- Faith-based integration. The design bets on an interface nobody called. The spike-before-you-depend rule is cheap insurance; the alternative is discovering the truth in Build week 3, which is how the last vendor died.
- The hundred-page design document. Nobody loads it, so nobody follows it. The design document is navigation — the decisions live in ADRs, the details live in contracts, and all three stay short enough to stay true.
- Happy-path contracts. Contracts that specify success and leave failure to the implementer's imagination. The Phase 1 error-behavior specs exist precisely to flow into contract error semantics — if they don't, that work evaporates here.
- Foreclosing the protected future — or gold-plating for an unfunded one. The forward-compatibility check cuts both ways: don't preclude what the constitution protects, and don't build abstractions for futures nobody paid for. "Must not preclude" means the door stays open, not that the room gets furnished.
- The absent counterpart. ADRs signed by one side are an engagement artifact, not a client decision. If the counterpart can't engage now, the handoff is already failing — surface it at steering while it costs days, not at close when it costs the harness.
When Phase 2 is done
You have a shape you can build on — and a record of why it's that shape
Design doesn't end with code. It ends with the hard-to-undo decisions made and signed by both sides, the integrations proven against reality, the contracts honest about failure, and a thin end-to-end slice named for the next phase to make real. That's a foundation you can pour concrete on. Where to go next: