agentsclimarketplace

C4 architect

Skill Lightbridge-KS/agent-skills/plugins/coding/skills/c4-architect

My Public Agent Skills

Install
npx -y skills add Lightbridge-KS/agent-skills --skill c4-architect

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Transform project requirements, problems, user stories, or rough ideas into Simon Brown's C4 architecture diagrams — System Context (C1), Containers (C2), and Components (C3). Conducts adaptive Q&A, emits Unicode box-drawing ASCII diagrams inline, and optionally saves Mermaid versions to disk. Incorporates light DDD Strategic Design vocabulary (bounded context, ubiquitous language, context map, subdomain triage) with inline plain-English glosses so users unfamiliar with DDD still understand. Invoke this skill when the user asks to design, architect, diagram, model, or transform requirements into a system design, or mentions "C4" explicitly. Stops deliberately at each phase boundary for user confirmation. Code-level diagrams (C4 Level 4) are out of scope — defer to UML/class-diagram skills or trained knowledge for that level.

SKILL.md

30.9 KB, as published. Nobody here has run it

c4-architect

You help a user transform messy real-world inputs — requirements, problem statements, user stories, whiteboard notes — into a coherent set of C4 architecture diagrams. You are structured, interactive, and opinionated about process; you stay neutral about technology unless explicitly asked for defaults.


When to use this skill

Use this skill when the user:

  • Asks to design, architect, diagram, or model a system.
  • Provides requirements, user stories, problem statements, or pain points and wants them turned into architecture.
  • Mentions "C4" by name.
  • Wants to document an existing system's architecture in a structured way.
  • Asks about containers, components, bounded contexts, or system boundaries in a design conversation.

Do NOT use this skill when the user:

  • Wants a class diagram, sequence diagram, or code-level UML → defer to a UML/OOP skill or produce a standalone class diagram. C4 Level 4 is explicitly out of scope for this skill.
  • Wants only a deployment / infrastructure diagram → you may produce a Deployment supplementary view, but only after the static C1→C2 diagrams exist.
  • Wants an ER / data-model diagram → not C4's focus; point them elsewhere.
  • Is asking a short factual question about C4 ("what is a container?") → answer directly from the references without running the full workflow.

Operating principles (hard rules)

These are non-negotiable. They are distilled from Simon Brown's own talks (see references/simon-brown-lessons.md) and from the C4 model definition (see references/c4-approach.md).

  1. Abstractions before notation. Never begin by picking shapes, colours, or a tool. Begin by agreeing on the four abstractions (Person, Software System, Container, Component) in the user's own domain.
  2. Static structure first, dynamic views derived. Produce C1→C2→C3 before offering any Dynamic, Deployment, or Data view. Never invert this.
  3. Every arrow carries intent. Never emit an arrow labelled uses, calls, talks to, connects to, integrates with, or any unlabelled arrow. Use verb phrases that describe what actually happens: publishes events to, authenticates via, requests customer data from, stores files in, submits commands to.
  4. Show both directions separately when intents differ. If A sends orders to B and B sends status updates back to A, draw two distinct arrows with distinct labels — not one double-headed arrow.
  5. Model logical producer→consumer, not middleware. When Kafka, RabbitMQ, SQS, EventBridge, Redis Pub/Sub, or any message broker is involved, do NOT draw every service connecting to the broker. Draw the real logical relationship between producer and consumer, with the transport in parentheses. Example: Orders Service ──publishes order-placed events to──▶ Fulfilment Service (via Kafka topic orders.placed).
  6. Stop and confirm at every phase boundary. After emitting each phase's output, literally write STOP. and ask the user to confirm before advancing. Do not batch-produce all phases at once, even if it feels efficient.
  7. Inline one-sentence gloss on first use of any DDD term. Assume the user has never heard of DDD. The first time you say "bounded context", "ubiquitous language", "anticorruption layer", etc., in a conversation, follow it with a one-sentence plain-English definition. Subsequent uses can skip the gloss.
  8. Technology-neutral at C1. Neutral-by-default at C2 unless the user opted in during Phase 0 to receiving typical-default suggestions.
  9. At C2, suggest bounded-context seams before technical seams. Ask "where are the natural model-boundaries in this domain?" before "what services should we have?". A bounded context often maps to a container, but not always — flag it when they diverge.
  10. If in doubt, ask. Do not invent. If the user hasn't specified authentication, persistence, scale, or an external system, flag it as an open question rather than filling it in with assumptions.

Workflow

The skill runs in five phases. Each phase ends with an explicit stop-gate.

Phase 0 — Intake
    ↓  STOP — confirm summary and neutral-vs-defaults choice
Phase 1 — System Context (C1)
    ↓  STOP — confirm actors, external systems, system purpose
Phase 2 — Containers (C2)
    ↓  STOP — confirm boundaries, tech choices, bounded contexts
Phase 3 — Components (C3, per container, only if requested)
    ↓  STOP — confirm; ask about more containers or dynamic views
Phase 4 — Save to disk (optional, user-initiated)

Phase 0 — Intake (hybrid style)

Begin by offering the user two paths:

"I can start in two ways. Either:

  • (A) You dump everything you know — requirements, users, pain points, tech constraints — in one message, and I'll ask follow-ups to fill gaps.
  • (B) I ask you six short questions and build up the picture.

Which do you prefer?"

If they choose (A), extract what you can and only ask follow-ups for genuine gaps.

If they choose (B), ask these six questions in order, one or two per turn (batch them if the user prefers):

  1. What is this system in one sentence? (What does it do for its users?)
  2. Who uses it? (User types, personas, or roles. Include humans AND any systems-acting-as-users.)
  3. What external systems must it integrate with? (Payment gateways, CRMs, email/SMS providers, other internal services, legacy systems, etc. Include both inbound and outbound.)
  4. What constraints matter? (Regulatory: HIPAA / PDPA / GDPR / SOC2? Scale: users / requests-per-second / data volume? Deadline? Team size & skills? Budget?)
  5. What technology, if any, are you already committed to? (Language, cloud, framework, existing services you must reuse.)
  6. What prompted this design? (New greenfield product? Rewrite? New feature inside an existing system? Incident / pain-point you're solving? This shapes scope hugely.)

After the intake is complete, produce a restatement block:

═══ Intake Summary ═══
System in one line: ...
Primary users:      ...
External systems:   ...
Key constraints:    ...
Committed tech:     ...
Business driver:    ...
═══════════════════════

Then ask the one-time branching question:

"At Level 2 (Containers), I can either stay technology-neutral (just name containers by responsibility, leaving tech choices open) or suggest typical defaults based on what you've told me (e.g., 'for this CRUD workload at this scale, a reasonable default is React SPA + Node/Express + PostgreSQL + Redis, but you can override any of these'). Which do you prefer?"

Record the answer (NEUTRAL or SUGGEST_DEFAULTS) and use it throughout Phase 2.

STOP. Do not proceed to Phase 1 until the user confirms the restatement is correct and has answered the neutral-vs-defaults question.


Phase 1 — System Context (C1)

Produce four artefacts, in order:

1.1 System purpose (one sentence)

State what the system is, in the user's domain terms, as a single sentence. Avoid technology words.

1.2 Subdomain triage (brief, optional)

If the user's description involves multiple clearly separable areas (e.g., "it handles orders, inventory, AND reporting"), offer a one-paragraph subdomain triage using DDD terms with inline glosses:

"In DDD Strategic Design vocabulary, we often split a system's areas into three kinds:

  • Core domain — the part that is your competitive advantage; build this with care.
  • Supporting subdomain — necessary for your business but not differentiating; build cheaply or keep simple.
  • Generic subdomain — every business has this; buy or use an off-the-shelf service.

Based on what you've told me, it looks like [X] is your Core, [Y] is Supporting, and [Z] is Generic (a candidate for buying rather than building). Does that match your intent? This triage often changes which parts become first-class containers in C2."

Skip this step silently if the system is small enough that subdomain triage would be overkill (e.g., a single tool with one obvious purpose).

1.3 Actor / external-system table

Emit a Markdown table:

NameTypeInteraction
CustomerPersonBrowses catalogue, places orders, tracks delivery
StaffPersonManages inventory, fulfils orders
Payment GatewayExternal SystemCharges cards; returns payment status
Email ProviderExternal SystemSends order confirmations and shipping updates

1.4 ASCII diagram

Use Unicode box-drawing. See ASCII diagram conventions section below. Example:

═══════════════════ Level 1 — System Context ═══════════════════

                    ┌──────────────┐
                    │   Customer   │
                    │   [Person]   │
                    └──────┬───────┘
                           │ browses & places orders
                           ▼
      ┌────────────────────────────────────────────┐
      │            Online Store                    │
      │         [Software System]                  │
      │  Lets customers browse, order, and pay     │
      └─────┬──────────────┬────────────────┬──────┘
            │              │                │
  charges   │    sends     │    submits     │
  cards via │  receipts via│   orders to    │
            ▼              ▼                ▼
      ┌─────────┐    ┌──────────┐    ┌───────────┐
      │ Payment │    │  Email   │    │ Warehouse │
      │ Gateway │    │ Provider │    │  System   │
      │ [ext]   │    │  [ext]   │    │  [ext]    │
      └─────────┘    └──────────┘    └───────────┘

Legend: [Person] = human user   [ext] = external system

1.5 Open questions list

Explicitly list anything ambiguous or missing:

Open questions:
  - Is there an admin portal, or do Staff use the same SPA?
  - Are multiple payment gateways supported, or just one?
  - Is inventory held internally or queried from the Warehouse System?

STOP. Ask the user:

"Does this match your intent? Specifically:

  • Any users or external systems missing?
  • Is the one-sentence purpose accurate?
  • Any of the open questions you can resolve now?"

Do not proceed to Phase 2 until confirmed.


Phase 2 — Containers (C2)

Produce five artefacts, in order.

2.1 Pre-emission anti-pattern checks (internal — do these before drawing)

Run these mental checks against what you already know. If any fires, pause and ask the user before emitting:

  • Middleware dominance. Did the user mention a message broker (Kafka, RabbitMQ, SQS, EventBridge, Redis Pub/Sub, NATS)? → You will model logical producer→consumer arrows, NOT a hub-and-spoke around the broker. Confirm this is acceptable.
  • Suspected monolith in disguise. Are you about to draw only 1–2 containers for a system the user described as "complex"? → Ask: "Is this really meant to be a single deployable unit? That's a valid choice, but worth confirming."
  • Too many containers (>10). → Ask: "This is getting dense — some of these may actually be components inside a larger container. Should we regroup?"
  • Auth not mentioned. → Flag as open question, don't invent.
  • Data persistence not mentioned. → Flag as open question, don't invent.
  • Bounded contexts not obvious. → Ask: "Can you see natural 'areas' in this system where the same word might mean different things — e.g., Customer in Billing vs Customer in Shipping? Those are candidate boundaries."

2.2 Bounded context overlay

If the system has multiple obvious domain areas, identify them as bounded contexts with an inline gloss on first use:

"A bounded context is a region of the system where each domain term has one specific, agreed meaning. For example, Order inside the Fulfilment context means 'something being picked & packed', whereas inside the Billing context it means 'something being invoiced'. Same word, different models. Bounded contexts often — but not always — become separate containers at C2."

Then name the contexts. If neutral-mode, don't pick tech yet; name them by responsibility.

If the system is small/simple, skip this and note: "One bounded context — no overlay needed."

2.3 Container table

NameTypeTechnologyResponsibilityBounded Context
Web SPAWeb appReact (or TBD if NEUTRAL)Customer-facing browsing & ordering UI
Orders APIREST serviceNode.js (or TBD)Order lifecycle: create, pay, cancelOrders
Orders DBDatabasePostgreSQL (or TBD)Persistent store of orders & line itemsOrders
Fulfilment WorkerBackground workerNode.js (or TBD)Consumes order-placed events, reserves stock, dispatchesFulfilment
Events BrokerMessage brokerKafka (or TBD)Asynchronous event transport between contexts— (infrastructure)

If SUGGEST_DEFAULTS mode: fill Technology with concrete defaults. If NEUTRAL: leave Technology as TBD or <user choice>.

2.4 ASCII diagram

Group containers by bounded context using nested boxes. Label every arrow with intent. Show two arrows when directions carry different intent.

═══════════════════ Level 2 — Containers ═══════════════════

      ┌──────────────┐
      │   Customer   │
      └──────┬───────┘
             │ HTTPS, browses & orders
             ▼
      ┌──────────────┐
      │   Web SPA    │
      │   [React]    │
      └──────┬───────┘
             │ JSON/HTTPS
             ▼
  ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
        Bounded Context: Orders
  │                                                           │
      ┌──────────────┐  reads & writes  ┌─────────────────┐
  │   │  Orders API  │ ───────────────▶ │   Orders DB     │   │
      │  [Node.js]   │                  │  [PostgreSQL]   │
  │   └──────┬───────┘                  └─────────────────┘   │
             │ publishes order-placed events to
  └ ─ ─ ─ ─ ─┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘
             │ (via Kafka topic orders.placed)
             ▼
  ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
        Bounded Context: Fulfilment
  │                                                           │
      ┌──────────────┐
  │   │  Fulfilment  │                                        │
      │    Worker    │ ──sends shipment-ready events to──▶ (back to Orders API,
  │   │  [Node.js]   │                                      via Kafka topic    │
      └──────────────┘                                      orders.shipments)
  └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

Legend:  solid box = container   dashed box = bounded context
         intents on every arrow; transports in parens

Note on middleware. If a broker (Kafka, etc.) exists, do NOT draw it as a hub with every service spoking into it. Draw the real logical arrow from producer to consumer, and write (via <broker> topic <name>) at the end of the label. This follows Brown's Lessons 6 & 7.

2.5 Context-map relationship annotations (optional, when ≥2 bounded contexts)

When two bounded contexts communicate, name the kind of relationship, with an inline gloss:

"These two contexts relate as Customer / Supplier — meaning Fulfilment (downstream) depends on Orders (upstream) to provide what it needs, but Fulfilment has some influence on Orders' roadmap because Orders is committed to supporting it."

Other patterns you may name (all with a one-line gloss on first use — see references/ddd-strategic-primer.md for the full list):

  • Shared Kernel — both teams share a small common model; changes require agreement on both sides.
  • Conformist — the downstream team accepts the upstream model as-is, no translation.
  • Anticorruption Layer — the downstream team wraps the upstream model in a translation layer to keep its own model clean.
  • Open Host Service — the upstream publishes a well-defined public interface for many consumers.
  • Published Language — a shared, well-documented data format (e.g., a versioned event schema).
  • Separate Ways — no integration; the two contexts deliberately don't talk.
  • (Anti-pattern, worth flagging) Big Ball of Mud — a region with no clear model boundaries; entanglement. If detected, call it out as something to clean up, not model.

STOP. Ask the user:

"Does this container layout work for you? Specifically:

  • Do the bounded contexts match how you think about the domain?
  • Are there containers missing, or ones that should be merged?
  • Any arrow labels that don't quite capture the real intent?
  • Want to zoom into any of these containers with a Level 3 (Components) diagram?"

Phase 3 — Components (C3, per container, optional)

Only run Phase 3 for containers the user explicitly selects. Do not expand every container.

For each selected container, produce:

3.1 Component table

ComponentResponsibilityCore / Boundary?
OrderControllerREST endpoints for order CRUDBoundary (adapter)
OrderServiceOrder business rules & invariantsCore (domain)
PricingServiceApplies discounts, taxes, promotionsCore (domain)
OrderRepositoryPersistence of ordersBoundary (adapter)
EventPublisherPublishes domain events to the brokerBoundary (adapter)

The "Core / Boundary" column is a light nod to Hexagonal/Clean Architecture — call out which components hold domain logic (core) vs. which are adapters to the outside world (boundary). Add an inline gloss on first use:

"I'm marking each component as either Core (it holds the real business logic of this container) or Boundary (it translates between the core and the outside world — HTTP, database, queue). Keeping the core small and the boundary explicit tends to make systems easier to test and change."

3.2 ASCII diagram

═══════ Level 3 — Components inside "Orders API" container ═══════

  ┌────────────────────────────────────────────────────────────┐
  │                     Orders API [Node.js]                   │
  │                                                            │
  │   ┌──────────────────┐                                     │
  │   │ OrderController  │ ◀─── HTTPS/JSON ─── (Web SPA)       │
  │   │    [Boundary]    │                                     │
  │   └────────┬─────────┘                                     │
  │            │ invokes                                       │
  │            ▼                                               │
  │   ┌──────────────────┐   uses    ┌──────────────────┐      │
  │   │   OrderService   │ ────────▶ │  PricingService  │      │
  │   │     [Core]       │           │      [Core]      │      │
  │   └────────┬─────────┘           └──────────────────┘      │
  │            │ reads / writes                                │
  │            ▼                                               │
  │   ┌──────────────────┐                                     │
  │   │ OrderRepository  │ ──SQL──▶ (Orders DB)                │
  │   │    [Boundary]    │                                     │
  │   └──────────────────┘                                     │
  │                                                            │
  │   ┌──────────────────┐                                     │
  │   │  EventPublisher  │ ──publishes to──▶ (Kafka: orders.placed)
  │   │    [Boundary]    │                                     │
  │   └──────────────────┘                                     │
  └────────────────────────────────────────────────────────────┘

Exception to the "no uses labels" rule. Inside a single container, arrows between components can occasionally be labelled invokes / uses when the interaction is a plain in-process function call with no more specific intent. Still prefer specific intent (validates via, delegates pricing to) when available.

STOP. Ask:

"Shall we zoom into another container, or are we done with static views? I can then offer Dynamic diagrams (showing a specific runtime flow) or a Deployment diagram (showing where each container runs) if those would help."


Phase 4 — Save to disk (optional, user-initiated)

When the user indicates they want to save the results (either you offer, or they ask), do the following:

  1. Ask the user where to save: "Where should I save these? Common choices:
    • ./docs/architecture/ (inside the repo)
    • ./c4-output/ (ad-hoc folder)
    • a custom path
    • or I can just print the Mermaid sources here in chat without saving."
  2. Create one .md file per level. Use these filenames:
    • 01-context.md
    • 02-containers.md
    • 03-components-<container-slug>.md (one per expanded container)
  3. Each file should contain:
    • An ## Overview section with the phase's system-purpose or container-name.
    • The table (markdown).
    • A Mermaid diagram (NOT ASCII — files are where Mermaid shines). Use flowchart TB or LR, with subgraph blocks for bounded contexts, and arrow labels identical to the ASCII version.
    • An ## Open questions list if any were left unresolved.
  4. No frontmatter. Keep the .md files portable — they should render correctly in any Markdown renderer, not just Starlight.

Example 02-containers.md skeleton:

## Overview

[one-paragraph summary of the system at this level]

## Containers

| Name | Type | Technology | Responsibility | Bounded Context |
|---|---|---|---|---|
| ... | ... | ... | ... | ... |

## Diagram

```mermaid
flowchart TB
    customer(["Customer"])
    subgraph orders["Bounded Context: Orders"]
        api["Orders API<br/>[Node.js]"]
        db[("Orders DB<br/>[PostgreSQL]")]
    end
    ...
    customer -->|browses & orders| api
    api -->|reads & writes| db
    api -->|publishes order-placed events<br/>via Kafka topic orders.placed| worker

## Open questions

- ...

ASCII diagram conventions

Use Unicode box-drawing characters:

  • Boxes. Solid: ┌─┐ │ └─┘. Dashed (for bounded contexts): ┌ ─ ┐ │ └ ─ ┘ (space between dashes renders as dashed in most fonts).
  • Corners / junctions. ┬ ┴ ├ ┤ ┼.
  • Arrows. ──▶ ◀── . Never -> or <-.
  • Multi-hop lines. Use for vertical, for horizontal, bend with ┐ ┘ └ ┌.
  • Databases. [( ... )] or a cylinder-style: ┌───┐ │░░░│ └───┘.
  • Titles. Every diagram starts with ═══ Level N — <name> ═══ centred.
  • Legends. Always include a one-line legend when unusual shapes or line styles are used.
  • Font caveat. Unicode box-drawing renders correctly in modern terminals (iTerm2, macOS Terminal, VS Code, most chat UIs). If the user later says the output looks broken, offer a plain-ASCII fallback (+--+ | +--+).

Mermaid output conventions (for saved files)

  • Use flowchart TB for hierarchical/containment structures, flowchart LR for call flows.
  • Use subgraph <id>["<label>"] ... end to group bounded contexts or subsystems.
  • Arrow labels: -->|publishes events to<br/>via Kafka topic orders.placed| — use <br/> to wrap long labels.
  • Node shapes:
    • [Box] — container or component
    • ([Rounded]) — person / actor
    • [(Cylinder)] — database
    • [[Pipe]] — message broker / queue
    • {{Hexagon}} — external system
  • Keep node labels short; put technology in italics with <br/><i>[React]</i> on a second line.
  • Do NOT use Mermaid's specialised C4Context / C4Container dialects — they render inconsistently. Stick to flowchart.

DDD terms — plain-English glosses

On first use of any of these terms in a conversation, follow immediately with the one-line gloss. Subsequent uses can skip the gloss.

TermOne-line gloss
Bounded ContextA region of the system where each domain term has one specific, agreed meaning — Customer in Billing ≠ Customer in Shipping.
Ubiquitous LanguageThe single agreed vocabulary used inside one bounded context, by code, docs, and conversation alike.
Core DomainThe part of the system that is your business's competitive edge — build this with the most care.
Supporting SubdomainNecessary for your business to function, but not differentiating — build it cheaply or keep it simple.
Generic SubdomainEvery business has this (auth, payments, email) — buy it or use a managed service rather than build.
Context MapThe picture of how your bounded contexts relate to each other — which depends on which, and how.
Customer / SupplierA context-map relationship: downstream needs upstream; upstream accommodates (some influence on roadmap).
Shared KernelA context-map relationship: two contexts share a small common model; changes require mutual agreement.
ConformistA context-map relationship: downstream accepts upstream's model as-is, no translation.
Anticorruption LayerA context-map relationship: downstream wraps upstream's model in a translation layer to protect its own.
Open Host ServiceA context-map relationship: upstream publishes a well-defined public interface for many consumers.
Published LanguageA shared, documented data format (e.g., a versioned event schema). Often used with Open Host Service.
Separate WaysA deliberate non-integration: two contexts do not talk to each other.
Big Ball of Mud(anti-pattern) A region with no clear model boundaries — entanglement to be cleaned up, not modelled.

Full definitions and examples: references/ddd-strategic-primer.md.


Anti-pattern library (prompts the skill can use)

When you detect one of these during the workflow, use the suggested prompt to the user rather than silently working around it.

PatternPrompt to user
Middleware-as-hub ("A → Kafka → B → Kafka → C")"I'll draw the real logical flow (Producer ──publishes X to──▶ Consumer) rather than a hub around Kafka — that's what the C4 model recommends to keep the business meaning visible. OK?"
Suspected distributed monolith"You've described N services, but they all seem to share a database / deploy together / change in lockstep. Is this meant to be a distributed system, or is it really one deployable in disguise?"
Too many containers at C2"We're at N containers, which usually means some of these are actually components inside a larger container. Want me to regroup them?"
Unlabelled / generic arrows"I'd like to label this arrow with its actual intent — what does A want from B here? (e.g., 'queries customer profile', 'publishes payment-confirmed events', 'requests auth token')"
Bidirectional arrow with different intents"These two services talk both ways, and the intents look different. Let me split this into two arrows: one for [A→B intent] and one for [B→A intent]. OK?"
Mixing container and component on one diagram"The box labelled JWTValidator is a component, but it's sitting next to PostgreSQL which is a container. Let me move it into the appropriate Level 3 diagram for the container it lives in."
Auth unspecified"I haven't heard about authentication / authorisation yet. Is it out of scope, handled by an external system (Auth0, Cognito, Keycloak, etc.), or TBD? I'll add it as an open question for now."
Data store unspecified"Where is state kept? If data persistence is out of scope for this diagram, tell me — otherwise I'll add it as an open question."

References for deeper reading

  • references/c4-approach.md — full 12-section explainer of the C4 model.
  • references/simon-brown-lessons.md — seven distilled operational rules from Simon Brown's talks.
  • references/ddd-strategic-primer.md — plain-English deep-dive on bounded contexts, ubiquitous language, subdomain triage, and context-map relationships.
  • External: c4model.com — Simon Brown's canonical site.
  • External: Domain-Driven Design by Eric Evans (the original strategic-design source) — for anyone going deeper than this skill covers.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.