Architecture Diagramming Standard
Priority: P1 (HIGH)
Pipeline
Never hand-write mxGraph XML. Write a spec; the scripts own every visual decision, so diagrams stay identical across authors, repositories, and sessions.
- Write
spec.json— schema in diagram-spec.md. For an ERD, generate it:python3 scripts/schema_to_spec.py db/schema.sql --title "<System> — ERD" -o spec.json python3 scripts/validate_spec.py spec.jsonpython3 scripts/render_drawio.py spec.json -o docs/architecture/<slug>.drawio --strict(exit 2 = a layout finding; change the spec, per layout-rules.md)- Export the image: a draw.io MCP tool if the session has one, else
python3 scripts/export_drawio.py docs/architecture/<slug>.drawio -f png -o docs/architecture/<slug>.png, else ship the.drawioand say the image was not exported. See export paths.
Commit the .drawio as the source of truth; the image is a copy for a deck.
Guidelines
- Name the audience and the decision before drawing anything.
- One C4 level per diagram: context, container, or component, never mixed.
- Pick the type from the message, not from habit. See diagram-selection.md.
- Evidence per node as
path:line. A node with no evidence renders dashed and marked UNVERIFIED — leave the flag showing rather than asserting a guess. - Put the number on the box.
metriccarries the load or SLO that sized the node,constraintsays why it exists; never invent either. - Label every edge with its protocol or event; use
style: asyncfor events. - Cloud icons only where verified.
gcp:*andaws:*are official icons; every other vendor is acloud:*kind with the service named insublabel. No Azure logos exist in the bundle, so Azure is alwayscloud:*. - Exec audience caps at 12 nodes. Past that, split by level or by flow.
- Legend and title block are generated. Do not remove or duplicate them.
- Refine in draw.io, not in XML. Re-running the renderer overwrites layout tweaks.
Anti-Patterns
- No hand-written XML: Write the spec, run the renderer.
- No invented boxes: Omit what the evidence does not support.
- No mixed levels: Table columns never appear in a context diagram.
- No unlabeled arrows: State the protocol or the event.
- No mystery acronyms: Expand every abbreviation on first use.
- No orphan nodes: Connect it or cut it.
Red Flags
| Thought | Reality |
|---|---|
| "It is one box, I will write the XML" | The renderer owns style, legend, and title block. Use it. |
| "Close enough, I will guess this service" | Guesses ship as facts. Omit the evidence and let it render UNVERIFIED. |
| "Managers want the whole system on one page" | Past 12 nodes they stop reading. Split it. |
References
- Diagram spec · Style catalog · House style
- Source extraction · Exec readability
- C4 model · Cloud · Best practices
- Layout rules · Checklist · Export paths and Mermaid fallback
- Runnable examples:
assets/fixtures/<type>.spec.json, one per diagram type, plus schema samples underassets/fixtures/schemas/. - Batch or delegated drawing:
specialist-solution-diagrammer.

