{"slug":"design-code-architecture-3","title":"design-code-architecture","summary":"Guided journey from an app idea to a deliberate architecture: boundaries, domain model, data decisions, and resilience, making only the expensive-to-reverse decisions and deferring the rest. Orchestrates eight skills phase by phase - clean-architecture, domain-driven-design, syst","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-13T18:24:57.930019Z","repo":{"url":"https://github.com/wondelai/skills","stars":2263,"forks":230,"license":"MIT","updatedAt":"2026-09-10T21:48:01Z"},"bodyHtml":"<hr>\n<h2>name: design-code-architecture\ndescription: 'Guided journey from an app idea to a deliberate architecture: boundaries, domain model, data decisions, and resilience, making only the expensive-to-reverse decisions and deferring the rest. Orchestrates eight skills phase by phase - clean-architecture, domain-driven-design, system-design, ddia-systems, software-design-philosophy, release-it, pragmatic-programmer, 37signals-way - asking the user questions at every decision point and recording results in the project docs/ folder (ARCHITECTURE.md, DESIGN-CODE-ARCHITECTURE-PLAN.md) so the journey resumes across sessions. Use when the user wants to design a new app''s architecture, choose boundaries and a domain model, decide monolith versus microservices, or says ''how should I structure this app''. If a codebase already exists, use remove-technical-debt (aged), improve-code-quality (fresh prototype), or architecture-optimization (slow but working); if unvalidated, run create-business or create-app first. For one framework in isolation, invoke that skill directly.'\nlicense: MIT\nmetadata:\nauthor: wondelai\nversion: \"1.0.2\"</h2>\n<h1>Design Code Architecture</h1>\n<p>Design the architecture for a new app: get the small number of expensive-to-reverse decisions right and stay aggressively simple everywhere else. This is an interactive, resumable journey of eight phases — the agent asks before every decision and records the outcome in your project's <code>docs/</code> folder, so you can stop after any phase and resume later. It runs from the most foundational and hardest-to-reverse (boundaries, domain) through the tunable (data, resilience) to the cross-cutting disciplines (complexity, reversibility, scope) you apply throughout. A weekend project uses three phases lightly; a funded team building toward launch wants the whole stack.</p>\n<h2>Core Principle</h2>\n<p><strong>Architecture is the set of decisions that are expensive to reverse: make exactly those deliberately, and defer everything cheap.</strong> This skill sequences the phases, asks the decision questions, and records every choice in <code>docs/</code>. The constituent skills carry the method — invoke them rather than improvising their frameworks. The whole strategy is to convert expensive decisions into cheap ones by putting a boundary in front of them, so the irreducibly expensive set stays small enough to get right with care.</p>\n<h2>Journey Map</h2>\n<table>\n<thead>\n<tr>\n<th>Phase</th>\n<th>Skill</th>\n<th>Question it answers</th>\n<th>Artifact</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>clean-architecture</td>\n<td>Do source-code dependencies point inward — is the core testable with no DB, web, or framework?</td>\n<td>Creates docs/ARCHITECTURE.md</td>\n</tr>\n<tr>\n<td>2</td>\n<td>domain-driven-design</td>\n<td>Where does the business actually split, and what does each term mean?</td>\n<td>Extends docs/ARCHITECTURE.md</td>\n</tr>\n<tr>\n<td>3</td>\n<td>system-design</td>\n<td>How little system does our real load actually need?</td>\n<td>Extends docs/ARCHITECTURE.md</td>\n</tr>\n<tr>\n<td>4</td>\n<td>ddia-systems</td>\n<td>Which data model, storage engine, and consistency does each workload need?</td>\n<td>Extends docs/ARCHITECTURE.md</td>\n</tr>\n<tr>\n<td>5</td>\n<td>software-design-philosophy</td>\n<td>Is complexity hidden behind deep modules, or is this classitis?</td>\n<td>Extends docs/TECH-DEBT.md</td>\n</tr>\n<tr>\n<td>6</td>\n<td>release-it</td>\n<td>Will it degrade gracefully when a dependency is slow or down?</td>\n<td>Creates docs/RELIABILITY.md</td>\n</tr>\n<tr>\n<td>7</td>\n<td>pragmatic-programmer</td>\n<td>What thin slice proves the boundaries, and what habits keep them reversible?</td>\n<td>Extends docs/TESTING.md + docs/TECH-DEBT.md</td>\n</tr>\n<tr>\n<td>8</td>\n<td>37signals-way</td>\n<td>What is essential for v1, and what speculative abstraction do we cut?</td>\n<td>Extends docs/ARCHITECTURE.md + docs/TECH-DEBT.md</td>\n</tr>\n</tbody>\n</table>\n<h2>Operating Rules</h2>\n<ol>\n<li><strong>Resume first.</strong> Before anything else, read <code>docs/DESIGN-CODE-ARCHITECTURE-PLAN.md</code> and every artifact in the Journey Map. If the tracker exists, summarize the journey state in 3-5 lines and ask which phase to enter. Done when the user has confirmed an entry point. A journey with a tracker is resumed, never restarted.</li>\n<li><strong>Intake on first run only.</strong> No tracker: run the Intake below, then create <code>docs/DESIGN-CODE-ARCHITECTURE-PLAN.md</code> with every phase statused <code>pending | in-progress | awaiting-evidence | done | deferred: reason | skipped: reason</code>. Done when the tracker exists and the user has confirmed the phase plan.</li>\n<li><strong>Phase entry.</strong> Announce: what the phase does, the decision it forces, the artifact it produces, rough effort. Offer proceed / skip / defer — phases marked GATE may be deferred, never skipped. Mark the phase <code>in-progress</code> on proceed. Done when the user chose.</li>\n<li><strong>Skill invocation and fallback.</strong> Load the phase's skill and use it: each phase's Invoke line names the skill by slug — use that skill to run the phase. If it is not available, offer: <code>npx skills add wondelai/skills/&lt;slug&gt; --global</code>. If the user declines, run the phase from its Brief — the minimum viable method. State which mode you are in.</li>\n<li><strong>In-phase decisions.</strong> Ask every question under \"Decide with the user\" — with concrete options and your recommendation. Record the choice in the tracker's Key Decisions. A decision made silently is a defect.</li>\n<li><strong>Phase exit.</strong> Present the draft artifact content for sign-off before writing. On approval: write or extend the docs/ files, update the tracker (status, Key Decisions, Next Actions). Done when the files are written and the phase row shows <code>done</code>.</li>\n<li><strong>Artifact discipline.</strong> Read before writing; create a file only if missing, otherwise extend — add or update your sections, preserve everyone else's. Files are UPPERCASE in <code>docs/</code>. Every recommendation lands as a checkbox or a table row with owner and priority. See <a href=\"references/artifact-templates.md\">references/artifact-templates.md</a> when creating a docs/ file for the first time — create it from the full skeleton (all section headings), then fill the sections your phase names.</li>\n<li><strong>Every expensive-to-reverse decision gets a Decision Log row (decision, why, alternatives rejected) before any code assumes it.</strong> Default to a modular monolith: services split only along proven bounded contexts.</li>\n</ol>\n<h2>Intake</h2>\n<p>Ask these before creating the tracker:</p>\n<ol>\n<li>What will the app do, and what is the one feature that is genuinely your competitive advantage? (frames the core subdomain in Phase 2 — where to invest deep modeling versus buy off-the-shelf)</li>\n<li>What stack are you leaning toward — language, web framework, ORM, database? (gates the Phase 1 boundary and Phase 4 data decisions; treated as a detail, never the skeleton)</li>\n<li>What load is realistic in year one — rough daily active users and the main actions each takes? (gates Phase 3 sizing: requirements before solutions)</li>\n<li>What outbound dependencies will it call — payments, email, LLM APIs, shipping, queues? (gates the Phase 6 integration-point audit)</li>\n<li>Which data is the system of record, and are there second read patterns like search, analytics, or feeds? (gates Phase 4 consistency and derived-data decisions)</li>\n<li>Has anyone validated that people actually want this app? (if not, route to create-business / create-app first — do not architect an unvalidated idea)</li>\n<li>How many teams will own this system, and how much of the journey do you want now? (gates the team-topologies optional phase and the Phase 8 appetite)</li>\n</ol>\n<p>Phase-skip heuristics: skip Phase 3's scaling machinery and most of Phase 4's replication when year-one load is far below any threshold (a single indexed DB is the answer — record it and move on); skip the team-topologies optional phase for a single-team app. Never skip Phase 1 or Phase 2 — boundaries and the domain model are the additive work that makes every later decision cheap; Phase 6 resilience is not optional once real users and outbound calls exist. Then create the tracker from the template and confirm the plan.</p>\n<p>Done when <code>docs/DESIGN-CODE-ARCHITECTURE-PLAN.md</code> exists with every phase statused and the user has confirmed the plan.</p>\n<h2>Phases</h2>\n<p>Phases run in the listed order, from hardest-to-reverse to tunable to cross-cutting — each assumes the previous phase's artifact exists. Any phase can be entered, skipped, or deferred per the Operating Rules; Phases 1-2 are the additive work that makes everything after them cheap to change.</p>\n<p>The phases form a dependency chain that mirrors the system: Domain-Driven Design says <em>where</em> the boundaries belong (contexts and aggregate seams); Clean Architecture says <em>which way</em> dependencies cross them; Data-Intensive Apps decides what lives inside them at the persistence layer; System Design says how much infrastructure that actually requires — usually far less than feared. Software Design keeps the modules deep instead of multiplying into shallow ceremony, Release It! hardens the integration points, Pragmatic Programmer supplies the cross-cutting habits that hold the structure over time, and the 37signals Way governs the whole thing by fixing time and cutting scope.</p>\n<h3>Phase 1 — Draw the boundaries (clean-architecture)</h3>\n<p><strong>Purpose:</strong> Keep business rules independent of the framework, database, and vendors so every later decision stays swappable — the move that buys back all the others.</p>\n<p><strong>Brief (fallback):</strong> The Dependency Rule — source-code dependencies point inward: Frameworks → Interface Adapters → Use Cases → Entities; nothing inner names anything outer. Database, web, and vendors are details, plugins to your rules. Enforce with Dependency Inversion: a use case owns a repository interface; the Postgres/Stripe implementation lives in an outer adapter. Draw full boundaries only at real volatility (DB, external services, delivery); collapse layers elsewhere — direction matters, not folder count.</p>\n<p><strong>Invoke:</strong> Use the <code>clean-architecture</code> skill with a concrete first feature and the stack from intake. Ask it to layer that feature (entities, a use case with request/response models, repository + gateway interfaces, the HTTP controller and DB adapter in the outer ring), and to flag which boundaries are ceremony versus earning their cost at real volatility.</p>\n<p><strong>Decide with the user:</strong> (1) Modular monolith versus services — default to a modular monolith with clean internal boundaries; a microservice with a shared data model is a distributed monolith, strictly worse. (2) Which volatility points get full boundaries with interfaces now versus collapsed layers.</p>\n<p><strong>Artifact:</strong> Create docs/ARCHITECTURE.md with <code>## System Context</code> (what it does, integrations), <code>## Layer Map &amp; Dependency Rule</code> (layers, what depends on what; violation | location | fix | status), and the monolith-versus-services choice in <code>## Decision Log</code> (date | decision | why | alternatives rejected). Update the tracker.</p>\n<p><strong>Done when:</strong> the layer map exists, the first feature is layered with framework/ORM types confined to the outer ring, the core is designed to test with no DB/web/framework, the monolith-versus-services decision is a Decision Log row, and Phase 1 shows <code>done</code>.</p>\n<h3>Phase 2 — Model the domain (domain-driven-design)</h3>\n<p><strong>Purpose:</strong> Put boundaries where the business actually splits and make the code speak the domain — cheapest now, inventing the vocabulary from a blank page.</p>\n<p><strong>Brief (fallback):</strong> The model is the code — build a Ubiquitous Language so team words are code words. Name after domain concepts (<code>Order.place()</code>, not <code>OrderManager.process()</code>); a name that resists is a design signal, not an annoyance. Bounded contexts: a region where a word means exactly one thing (\"Customer\" differs in billing versus support) — these are your future service seams. Aggregates: a small root cluster enforcing invariants, immediately consistent inside and eventually consistent outside; reference other aggregates by ID. Push behavior into entities — no anemic data bags.</p>\n<p><strong>Invoke:</strong> Use the <code>domain-driven-design</code> skill with the domain vocabulary and the Phase 1 layer map. Ask for the bounded-context map built from the words the team actually uses, the core aggregates with their invariants, and a subdomain classification (core / supporting / generic).</p>\n<p><strong>Decide with the user:</strong> (1) Where the same word legitimately means different things across contexts — do NOT unify into one omniscient model. (2) Which subdomain is core (invest deep modeling) versus generic (buy or use OSS — auth, email, payments).</p>\n<p><strong>Artifact:</strong> Extend docs/ARCHITECTURE.md: <code>## Bounded Contexts &amp; Context Map</code> (contexts, relationships, anti-corruption layers) and <code>## Domain Glossary (Ubiquitous Language)</code> (term | meaning | code name); record aggregate and core-domain choices in <code>## Decision Log</code>. Update the tracker.</p>\n<p><strong>Done when:</strong> contexts are mapped with their relationships, the glossary names the core terms, each aggregate states its invariants and by-ID references, the core subdomain is chosen, and the context boundaries line up with the Phase 1 layer map.</p>\n<h3>Phase 3 — Size the system honestly (system-design)</h3>\n<p><strong>Purpose:</strong> Prove with numbers how small the system can be, so you skip the machinery you cannot justify.</p>\n<p><strong>Brief (fallback):</strong> Start with requirements, not solutions. Back-of-envelope: QPS = daily-active-users × actions/day ÷ 86,400, peak 2-5× average; storage = records/day × size × retention. For hundreds-to-thousands of users, a single indexed DB plus a read-path cache carries you a long time. Scale in order: vertical first, then cache-aside (TTL + explicit invalidation), then read replicas, and shard last, only with evidence. Reach for a message queue to decouple slow/spiky work, a CDN for global static assets. Premature sharding and premature service-splitting are named mistakes.</p>\n<p><strong>Invoke:</strong> Use the <code>system-design</code> skill with the load reality from intake. Ask for average and peak QPS, yearly storage, which component bottlenecks first, and a plain list of the techniques (sharding, replicas, CDN, queues, multi-region) you do NOT need yet.</p>\n<p><strong>Decide with the user:</strong> Which scaling moves to make now versus defer — tied to the numbers (don't build for 50k users while at 50) — and the first slow workload, if any, to move behind a message queue.</p>\n<p><strong>Artifact:</strong> Extend docs/ARCHITECTURE.md <code>## System Context</code> with the load reality and back-of-envelope numbers; record each scaling move (adopt now / defer with trigger) in <code>## Decision Log</code>. Update the tracker.</p>\n<p><strong>Done when:</strong> average/peak QPS and yearly storage are written down, the first bottleneck is named, and every scaling technique is either adopted with a reason or deferred with the number that would trigger it.</p>\n<h3>Phase 4 — Make deliberate data decisions (ddia-systems)</h3>\n<p><strong>Purpose:</strong> Get the layer that outlives the code right — data model, storage engine, and consistency chosen by access pattern, not habit.</p>\n<p><strong>Brief (fallback):</strong> Data outlives code. Match model to access pattern — relational for many-to-many and ad-hoc queries, document for self-contained aggregates with locality, graph for recursive traversals; storage engines trade reads against writes (LSM write-throughput versus B-tree read-latency). Most databases default to read-committed or snapshot, NOT serializable — naive read-then-write triggers write skew (two buyers taking the last unit). Lock explicitly (<code>SELECT ... FOR UPDATE</code>) or use a serializable transaction where invariants demand it. Single-leader + read replicas is the read-heavy default; replication lag forces deliberate read-your-writes. Separate system-of-record from rebuildable derived data.</p>\n<p><strong>Invoke:</strong> Use the <code>ddia-systems</code> skill with the workloads implied by the Phase 2 aggregates and the Phase 3 replica plan. Ask for a per-workload model + storage-engine fit, the actual default isolation level and its anomalies, and which read-then-write paths need locking.</p>\n<p><strong>Decide with the user:</strong> (1) One datastore versus polyglot persistence, per workload fit. (2) Which paths get a lock or serializable transaction versus tolerate eventual consistency; whether a second read pattern (search, analytics) justifies derived data kept in sync by CDC.</p>\n<p><strong>Artifact:</strong> Extend docs/ARCHITECTURE.md <code>## Data &amp; Storage Decisions</code> (models, engines, isolation level, locked paths, system-of-record versus derived) and log the reasoning in <code>## Decision Log</code>. Update the tracker.</p>\n<p><strong>Done when:</strong> each workload has a model + engine chosen by fit, the default isolation level is documented, every write-skew-prone path is locked or serializable, and any derived data has a defined sync mechanism.</p>\n<h3>Phase 5 — Keep modules deep (software-design-philosophy)</h3>\n<p><strong>Purpose:</strong> Stop the structure from becoming its own disease — hide machinery behind simple interfaces instead of shattering into shallow classes.</p>\n<p><strong>Brief (fallback):</strong> Complexity is the enemy; the test for every decision is whether it makes the whole system simpler. Module depth = functionality ÷ interface complexity — deep modules hide power behind small interfaces; shallow ones (classitis) add interface cost without hiding complexity. Clean layering and deep modules are allies; clean layering and classitis are not. Information leakage — one design decision reflected in many modules — is a top red flag; encapsulate each piece of knowledge once. Strategic over tactical: invest 10-20% to keep the design clean; startup shortcuts compound into debt as the team grows.</p>\n<p><strong>Invoke:</strong> Use the <code>software-design-philosophy</code> skill with the module set proposed in Phases 1-2. Ask which modules are shallow pass-throughs to consolidate, where knowledge leaks across boundaries, and whether any planned boundary is ceremony rather than depth.</p>\n<p><strong>Decide with the user:</strong> Which shallow modules to consolidate into deeper ones now, guarding against over-merging genuinely unrelated concerns; the design conventions the team adopts (naming, where behavior lives, one file per piece of knowledge).</p>\n<p><strong>Artifact:</strong> Extend docs/TECH-DEBT.md <code>## Smell Inventory</code> (shallow-module / information-leakage entries with the consolidation applied) and record the agreed rules under <code>## Adopted Conventions</code>. Update the tracker.</p>\n<p><strong>Done when:</strong> each shallow-module cluster is consolidated or logged with a fix, no single design decision is duplicated across modules, and the design conventions are written down.</p>\n<h3>Phase 6 — Design for failure (release-it)</h3>\n<p><strong>Purpose:</strong> Make the system degrade gracefully instead of collapsing when a dependency is slow or down — cheapest to design in now, not at 2 a.m.</p>\n<p><strong>Brief (fallback):</strong> The software that passes QA is not what survives production. Integration points are the number-one killer and a slow response is worse than none — a hanging dependency exhausts threads and pools with nothing in the logs. Non-negotiable: connect + read timeouts on every outbound call; a circuit breaker on critical ones (trips open, fails fast, half-open recovery); bulkheads to isolate pools per dependency; retry with backoff + jitter. Paginate every list endpoint (unbounded result sets crash under real data); schedule steady-state cleanup. Decouple deploy from release with feature flags and backward-compatible expand-contract migrations.</p>\n<p><strong>Invoke:</strong> Use the <code>release-it</code> skill with the outbound dependencies from intake. Ask for timeout values and breaker thresholds per dependency, bulkhead placement, a graceful-degradation path per integration, and the deep-health-check + RED-metrics + expand-contract-migration essentials.</p>\n<p><strong>Decide with the user:</strong> Breaker thresholds, which dependencies get dedicated pools, how core flows degrade when a non-critical dependency is down, and the rollback path you trust. Resist chaos engineering / multi-region failover for the first thousand users.</p>\n<p><strong>Artifact:</strong> Create docs/RELIABILITY.md with <code>## Integration-Point Audit</code> (dependency | timeout | circuit breaker | bulkhead | retry policy | status), <code>## Query &amp; Resource Findings</code>, <code>## Health Checks &amp; Metrics</code>, and <code>## Deploy vs Release</code>. Update the tracker.</p>\n<p><strong>Done when:</strong> every planned outbound call has a timeout, critical dependencies have breakers and bulkheads, every list endpoint is paginated, a deep health check + RED metrics + expand-contract migration + trusted rollback are specified, and the audit has no open rows for critical paths.</p>\n<h3>Phase 7 — Prove the wiring and lock in habits (pragmatic-programmer)</h3>\n<p><strong>Purpose:</strong> Build one thin real slice through every layer to prove the boundaries connect, and set the habits that keep the architecture reversible.</p>\n<p><strong>Brief (fallback):</strong> Tracer bullet — build one thin but fully real vertical slice (HTTP → use case → repository → DB → back), kept as production code, for end-to-end feedback on day two and proof the boundaries link before you flesh them out. Reversibility: abstract every vendor behind your own interface (forking-road test — could you swap DB or LLM provider in a week?). Orthogonality: a dramatic change to one requirement should touch one module. DRY for knowledge, not coincidence — merge duplicated rules, leave look-alikes alone. Broken Window: fix the first hack or board it up with a tracked ticket.</p>\n<p><strong>Invoke:</strong> Use the <code>pragmatic-programmer</code> skill with the Phase 1 boundaries. Ask for the thinnest end-to-end tracer bullet that exercises every layer, an adapter interface for each vendor, and an audit of where one change would touch many modules or a vendor API would leak into business logic.</p>\n<p><strong>Decide with the user:</strong> Which slice is the tracer bullet (one authenticated core action, minimal functionality); the broken-windows policy and debt budget per iteration; which vendors get an owned interface first.</p>\n<p><strong>Artifact:</strong> Extend docs/TESTING.md <code>## Test Strategy</code>, <code>## Safety Net Map</code> (the tracer-bullet path as the first end-to-end test), and <code>## CI Gates</code>; extend docs/TECH-DEBT.md <code>## Debt Budget &amp; Broken-Windows Policy</code> and <code>## Adopted Conventions</code> (reversibility, orthogonality). Update the tracker.</p>\n<p><strong>Done when:</strong> the tracer-bullet slice runs end-to-end through every layer and is pinned as the first CI gate, each vendor sits behind an owned interface, and the broken-windows policy and debt budget are written down.</p>\n<h3>Phase 8 — Cut scope to the essential (37signals-way)</h3>\n<p><strong>Purpose:</strong> Decide whether any of this ships — fix time, flex scope, and delete speculative abstraction before it becomes complexity you carry.</p>\n<p><strong>Brief (fallback):</strong> Build less — the best products do fewer things well; half a product beats a half-assed one. Fix an appetite (the time this work is genuinely worth) and cut scope to fit, rather than estimating an open-ended architecture that balloons. YAGNI: every speculative abstraction (generic plugin system, event sourcing, configurable multi-tenancy for zero users) is a decision deferred to an imaginary future at the cost of present complexity. Make tiny reversible decisions; say no by default so the great decisions breathe. Never cut the small set of expensive-to-reverse decisions.</p>\n<p><strong>Invoke:</strong> Use the <code>37signals-way</code> skill with the full architecture plan from Phases 1-7. Ask it to shape the work into a fixed appetite, separate essential-for-launch from gold-plating, name the rabbit holes, and list the speculative abstractions to delete or replace with the simplest thing that could work.</p>\n<p><strong>Decide with the user:</strong> The appetite for v1 architecture work; which abstractions to cut now, defer with a revisit trigger, or replace with the simplest thing; confirm no expensive-to-reverse decision is being cut just to save time.</p>\n<p><strong>Artifact:</strong> Extend docs/ARCHITECTURE.md <code>## Decision Log</code> with what is deliberately NOT built for v1; extend docs/TECH-DEBT.md <code>## Debt Ledger</code> (deferred abstractions as deliberately-taken debt, each with the trigger that would revisit it). Update the tracker.</p>\n<p><strong>Done when:</strong> v1 scope is fixed to an appetite, every cut or deferred abstraction is a Decision Log or Debt Ledger row with a revisit trigger, and no expensive-to-reverse decision was cut for time.</p>\n<h2>Optional Phases</h2>\n<table>\n<thead>\n<tr>\n<th>Skill</th>\n<th>Add when</th>\n<th>Artifact</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>team-topologies</td>\n<td>More than one team will own the system, so module boundaries must align with team boundaries (Conway)</td>\n<td>Extends docs/OPERATIONS.md (<code>## Team Structure</code>)</td>\n</tr>\n</tbody>\n</table>\n<p>Optional phases follow the same operating rules — load and use each listed skill exactly as a core phase would; insert where the Add-when condition first becomes true — here, right after Phase 2, once the bounded contexts that team boundaries must mirror exist.</p>\n<h2>Common Mistakes</h2>\n<table>\n<thead>\n<tr>\n<th>Mistake</th>\n<th>Fix</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Letting the framework be the architecture</td>\n<td>Apply Clean Architecture's Dependency Rule (Phase 1) — framework calls inward; ORM and request types stay confined to the outer ring.</td>\n</tr>\n<tr>\n<td>Over-engineering for scale you cannot prove you need</td>\n<td>Run back-of-envelope QPS/storage math first (system-design, Phase 3); one indexed DB plus a cache is usually years of runway.</td>\n</tr>\n<tr>\n<td>Over-correcting into classitis</td>\n<td>Apply the deep-module rule (software-design-philosophy, Phase 5) — a few deep modules beat a swarm of shallow ones; boundaries at real volatility only.</td>\n</tr>\n<tr>\n<td>Ignoring the database's actual consistency guarantees</td>\n<td>Check the default isolation level and lock write-skew-prone paths (ddia-systems, Phase 4) — write skew passes every single-user test.</td>\n</tr>\n<tr>\n<td>Treating resilience as a post-launch concern</td>\n<td>Design timeouts, breakers, and pagination in from the start (release-it, Phase 6) — a slow dependency with no timeout freezes everything.</td>\n</tr>\n<tr>\n<td>Confusing build-less with build-carelessly</td>\n<td>Cut features and speculative abstractions (37signals-way, Phase 8), never the small set of expensive-to-reverse decisions.</td>\n</tr>\n</tbody>\n</table>\n<h2>Completing the Journey</h2>\n<p>Match the dose to the project: a weekend build leans on the Phase 1 Dependency Rule, a quick Ubiquitous Language, timeouts on outbound calls, and the Phase 8 instinct to cut scope — a few hours that save weeks. A funded team building toward launch works the whole stack, pulling the data and resilience phases in as real bottlenecks and integration points appear.</p>\n<p>Exit checklist — every box tied to an artifact:</p>\n<ul>\n<li><input disabled=\"disabled\" type=\"checkbox\"> Each expensive-to-reverse decision (boundaries, contexts, data/consistency) is a Decision Log row with alternatives rejected (ARCHITECTURE.md).</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> Core business rules are designed to run with no DB, web, or framework (ARCHITECTURE.md Layer Map, no inward-pointing violations).</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> Every outbound call has a timeout, critical ones have breakers, and every list is paginated (RELIABILITY.md Integration-Point Audit clear).</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> A tracer-bullet slice proves the boundaries connect end-to-end and is the first CI gate (TESTING.md).</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> v1 scope is fixed to an appetite with speculative abstractions cut or deferred with a trigger (TECH-DEBT.md Debt Ledger).</li>\n</ul>\n<p>Close the tracker: every phase <code>done</code> or <code>skipped: reason</code>, with remaining Next Actions carried into the ARCHITECTURE.md Decision Log and TECH-DEBT.md so nothing is lost. Then route forward: when the architecture serves a product that still needs validating and building, continue with the <code>create-app</code> skill; when an existing prototype must be brought up to this structure, continue with the <code>improve-code-quality</code> skill.</p>\n","files":[{"path":"references/artifact-templates.md","sizeBytes":3227,"isText":true},{"path":"SKILL.md","sizeBytes":26961,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"human-reviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"human-reviewed","screen":{"ran":true,"outcome":"flagged-cleared-by-moderator","suspicious":1,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-13T18:26:15.582607Z","sha256":"5B0737F149D5585CD3F57779F864D174A291938CAA99D85377E6014D1C0F9ADA","sizeBytes":11968},"review":null,"source":{"repositoryUrl":"https://github.com/wondelai/skills","path":"plugins/wondelai-skills/skills/design-code-architecture","license":"MIT","commit":"c172996495bed0fcd26896a9416b2093fd7073f0","subtreeSha":"D750A40F97877548325A91341476EC752428F3794E2F4FA7A9260190113A6FF1","lastSyncedAt":"2026-09-25T23:12:05.357068Z"},"reviewedAt":"2026-09-14T18:25:35.189624Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/wondelai/skills/tree/main/plugins/wondelai-skills/skills/design-code-architecture"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install wondelai-skills@llmmart"},{"target":"git","command":"git clone https://github.com/wondelai/skills.git"}]}