Designs system architecture with C4 diagrams and technology selection. Routes to the right architect based on design scope (system, domain, application, or full stack). Two interaction modes: guide (collaborative Q&A) or propose (architect presents options with trade-offs).
npx skills add https://github.com/nWave-ai/nWave --skill nw-design
Wave: DESIGN (wave 3 of 6) | Agents: Morgan (nw-solution-architect), nw-system-designer, nw-ddd-architect | Command: *design-architecture
Execute DESIGN wave through discovery-driven architecture design. The command starts with two interactive decisions:
All architects write to docs/product/architecture/brief.md (SSOT), each in its own section. Analyzes existing codebase, evaluates open-source alternatives, produces C4 diagrams (Mermaid) as mandatory output.
Provenance: feature lean-wave-documentation — D2 (schema-typed sections), D10 (one-line expansion descriptions). Tier-1 [REF] sections (always emitted) + Tier-2 EXPANSION CATALOG items (lazy, on-demand) are the two output bands. Full contract: nWave/skills/nw-density-resolution-contract/SKILL.md.
Under ## Wave: DESIGN / [REF] <Section> headings:
Rendered under ## Wave: DESIGN / [WHY|HOW] <Section> only when requested via --expand <id> (DDD-2), the wave-end menu (expansion_prompt = "ask"), mode = "full" auto-expansion, or an ad-hoc user request mid-session.
| Expansion ID | Tier label | One-line description |
|---|---|---|
| trade-off-analysis | [WHY] | Quality-attribute trade-off matrix with prioritization rationale |
| rejected-alternatives | [WHY] | Architectures weighed and rejected with one-paragraph reason per option |
| c4-narrative | [HOW] | Long-form C4 walkthrough: System Context → Container → Component prose |
| evolution-scenarios | [WHY] | Hypothetical future stress vectors and how the design absorbs them |
| paradigm-rationale | [WHY] | Why FP/OOP was selected; comparison vs the alternative for this domain |
| reuse-analysis-deep-dive | [WHY] | Per-row justification for every EXTEND vs CREATE NEW decision in the Reuse table |
| c4-component-diagrams | [HOW] | Component-level C4 diagrams for complex subsystems (Mermaid) |
| expansion-catalog-rationale | [WHY] | Why this set of expansions, why these defaults, why D10 enforces one-line descriptions |
Call resolve_density(global_config) from scripts/shared/density_config.py after reading ~/.nwave/global-config.json (missing/malformed = empty dict). Returns mode ("lean" | "full") + expansion_prompt ("ask" | "always-skip" | "always-expand" | "smart") per the D12 cascade (resolver-internal, DDD-5 — do NOT replicate locally). Branch on density.mode for what to emit; branch on density.expansion_prompt at wave end for menu behaviour. Full cascade detail, branch semantics, ad-hoc override workflow: nWave/skills/nw-density-resolution-contract/SKILL.md.
Every expansion choice emits a DocumentationDensityEvent (dataclass at src/des/domain/telemetry/documentation_density_event.py) via event.to_audit_event() → JsonlAuditLogWriter().log_event(...). Schema fields per D4: feature_id, wave, expansion_id, choice, timestamp. For this wave the schema declares "wave": "DESIGN". Use helper scripts/shared/telemetry.py:write_density_event(...) — do NOT write JSONL directly.
Wave-specific signal: DEVOPS/DISTILL consuming a lean DESIGN feature-delta — downstream --expand requests for trade-off or evolution scenarios indicate the [REF] baseline was insufficient. Full emission rules: nWave/skills/nw-density-resolution-contract/SKILL.md.
Before beginning DESIGN work, read SSOT and prior wave artifacts in this order:
docs/product/ exists) — read docs/product/architecture/brief.md (extend, not recreate), docs/product/architecture/adr-*.md (existing decisions), docs/product/journeys/{name}.yaml (journey schema for port identification). Gate: all existing files read or confirmed missing.docs/feature/{feature-id}/discuss/: wave-decisions.md (decision summary), user-stories.md (scope, requirements, acceptance criteria), story-map.md (walking skeleton and release slicing), outcome-kpis.md (quality attributes). Gate: all four files read or confirmed missing.docs/feature/{feature-id}/spike/: findings.md (validated assumptions, performance measurements, what didn't work). This informs your architecture constraints. Gate: file read if present, marked as not found if absent.✓ {file} for each read, ⊘ {file} (not found) for each missing. Gate: checklist produced before any architecture work begins.docs/product/ does not exist but docs/feature/ has existing features, STOP. Guide the user to docs/guides/migrating-to-ssot-model/README.md. If greenfield, proceed — DESIGN will bootstrap docs/product/architecture/. Gate: migration status confirmed.Note: DISCOVER evidence is already synthesized into DISCUSS — read DISCOVER only if wave-decisions.md flags something architecturally significant.
When DESIGN decisions change assumptions from prior waves:
## Changed Assumptions section at the end of the affected DESIGN artifact. Gate: section present in artifact.docs/feature/{feature-id}/design/upstream-changes.md for the product owner to review. Gate: upstream-changes.md created if any story/criteria changes needed.Architecture decisions are driven by quality attributes, not pattern shopping. Execute these steps in order:
This project follows the functional programming paradigm. Use @nw-functional-software-crafter for implementation. OOP: This project follows the object-oriented paradigm. Use @nw-software-crafter for implementation. Default if user declines/unsure: OOP. Gate: paradigm selected and optionally written to CLAUDE.md. | Existing Component | File | Overlap | Decision | Justification |
|-------------------|------|---------|----------|---------------|
| WorkflowExecutor | src/des/application/zero_trust/workflow_executor.py | Phase iteration, gate eval | EXTEND | Adding dispatch branch is ~15 LOC vs 200 LOC new class |
Rules:
--residuality flag only) — when activated: apply complexity-science-based stress analysis (stressors|attractors|residues|incidence matrix|resilience modifications) using the stress-analysis skill. When not activated: skip entirely, do not mention. Gate: activated only when flag present.Provenance: feature outcomes-registry — DISCUSS#D-2 (lean Tier-1 + Tier-2 default), D-5 (per-typed-contract grain), D-6 (gate-scoping: code-feature pipelines only).
Trigger: a new feature-delta has been emitted in DESIGN with a Reuse Analysis table. Run this check AFTER step 5 (Reuse Analysis) in the Discovery Flow and BEFORE producing the final architecture deliverables in step 7.
Skip when: the feature is methodology-only (skill propagation, prose changes, no new typed contract surface). Per D-6 gate-scoping, the outcomes registry tracks code-feature pipelines only.
Procedure:
nwave-ai outcomes check-delta docs/feature/{feature-id}/feature-delta.md
0 — no collisions detected. Proceed to step 7 (Produce Deliverables).1 — one or more candidate outcomes overlap with existing OUT-N rows in docs/product/outcomes/registry.yaml. Review the reported OUT-ids. For each:related: [OUT-N] in the registry, OR mark the existing OUT-N superseded_by: OUT-M if the new contract replaces it. Re-run check-delta to confirm.The registry at docs/product/outcomes/registry.yaml is the SSOT for "what we promise the system does." Reuse Analysis (step 5) deduplicates within the codebase; the Outcome Collision Check deduplicates across the contract registry — they are complementary gates.
Gate: check-delta exits 0, OR every reported collision has been resolved (linked, superseded, or disambiguated) and the re-run exits 0, OR the feature is documented as methodology-only and the check is correctly skipped.
Before dispatching the architect agent, read rigor config from .nwave/des-config.json (key: rigor). If absent, use standard defaults.
agent_model: Pass as model parameter to Task tool. If "inherit", omit model (inherits from session).reviewer_model: If design review is performed, use this model for the reviewer agent. If "skip", skip design review.review_enabled: If false, skip post-design review step.Structural-correctness reviewer never skips: rigor.reviewer_model: "skip" applies to scale-sensitive cost-driven reviewers (Eclipse / Architect / Forge here, plus their per-wave equivalents). The structural-correctness reviewer at the end of DISTILL (Sentinel / @nw-acceptance-designer-reviewer) ALWAYS dispatches — silent skip masks Gherkin antipatterns / boundary violations / contract drift, which is the bug class issue #52 fixed.
Question: What are you designing?
You MUST ask this question before invoking any architect. Do NOT default to application scope. The answer determines WHICH agent to invoke.
Options:
Question: How do you want to work?
Options:
| Decision 0 | Agent | Focus |
|-------------|-------|-------|
| System / infrastructure | @nw-system-designer | Distributed architecture, scalability, caching, load balancing, message queues |
| Domain / bounded contexts | @nw-ddd-architect | DDD, aggregates, Event Modeling, event sourcing, context mapping |
| Application / components | @nw-solution-architect | Component boundaries, hexagonal architecture, tech stack, ADRs |
| Full stack | @nw-system-designer then @nw-ddd-architect then @nw-solution-architect | All three in sequence |
Pass Decision 1 (guide/propose) to the invoked agent as the interaction mode.
All agents write to docs/product/architecture/ (SSOT). Each architect owns its section:
## System Architecture in brief.md## Domain Model in brief.md## Application Architecture in brief.mdFor Full stack mode, each agent reads the prior architect's output before starting its own work.
Based on Decision 0 answer, invoke the corresponding agent. Do NOT default to application scope without asking.
System scope → @nw-system-designer
Domain scope → @nw-ddd-architect
Application scope → @nw-solution-architect
Full stack → @nw-system-designer then @nw-ddd-architect then @nw-solution-architect
Execute \*design-architecture for {feature-id}.
Context files: see Prior Wave Consultation above.
Configuration:
SKILL_LOADING: Read your skill files at ~/.claude/skills/nw-{skill-name}/SKILL.md. At Phase 4, always load: nw-architecture-patterns, nw-architectural-styles-tradeoffs. Do NOT load nw-roadmap-design during DESIGN wave -- roadmap creation belongs to the DELIVER wave (/nw-roadmap or /nw-deliver). Then follow your Skill Loading Strategy table for phase-specific skills.
/nw-review nw-solution-architect-reviewer only on trigger: contested ADR, novel pattern, performance-budget unverified by spike, security boundary change. Default: skip. Mandatory consolidated review fires at end of DISTILL covering all 4 waves in parallel.)Handoff To: nw-platform-architect (DEVOPS wave)
Deliverables: See Morgan's handoff package specification in agent file
Before completing DESIGN, produce docs/feature/{feature-id}/design/wave-decisions.md:
# DESIGN Decisions — {feature-id}
## Key Decisions
- [D1] {decision}: {rationale} (see: {source-file})
## Architecture Summary
- Pattern: {e.g., modular monolith with ports-and-adapters}
- Paradigm: {OOP|FP}
- Key components: {list top-level components}
## Reuse Analysis
| Existing Component | File | Overlap | Decision | Justification |
|-------------------|------|---------|----------|---------------|
| {component} | {path} | {what overlaps} | EXTEND/CREATE NEW | {evidence} |
## Technology Stack
- {language/framework}: {rationale}
## Constraints Established
- {architectural constraint}
## Upstream Changes
- {any DISCUSS assumptions changed, with rationale}
This summary enables DEVOPS and DISTILL to quickly assess architecture decisions without reading all DESIGN files.
Single narrative file: docs/feature/{feature-id}/feature-delta.md — DDD list, component decomposition, driving/driven ports, technology choices, decisions table, reuse analysis, open questions all become ## Wave: DESIGN / [REF|WHY|HOW] <Section> headings.
Machine artifacts: none unique to feature dir (the feature-delta.md IS the artifact; SSOT writes carry the architectural payload).
SSOT updates (per Recommendation 3 / back-propagation contract — DESIGN is the primary SSOT integrator):
docs/product/architecture/brief.md — created or updated. Each architect owns its section: ## System Architecture (nw-system-designer), ## Domain Model (nw-ddd-architect), ## Application Architecture (nw-solution-architect)docs/product/architecture/adr-*.md — one ADR per significant architectural decisiondocs/product/architecture/c4-diagrams.md — current component topology if separate from briefOptional (project-root, not feature-dir): CLAUDE.md ## Development Paradigm section.
Legacy multi-file outputs (per-wave wave-decisions.md, architecture-design.md, etc. inside docs/feature/{id}/design/) are NOT produced — that content lives in feature-delta.md plus the SSOT integration above. Validator: scripts/validation/validate_feature_layout.py.
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Use when you have a written implementation plan to execute in a separate session with review checkpoints
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take nwave-ai/nw-design from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.