Dense Architecture Diagram Layout
Hub-and-spoke diagrams that must pass strict lint. Sparse diagrams (6-7 nodes, one main spine, a few side branches — like the RenewalRadar example) validate almost first-try. The hard case is a dense hub: many components whose edges all fan into a single central service (e.g. one Worker receiving from and sending to 6+ providers). That topology will NOT route cleanly on the first draft. This skill is the converging method.
The fundamental rule that ends most wasted iterations
Auto-route first. Do not add fromSide/toSide/via/labelAt until the validator flags a specific problem — then add exactly one diagnosed control per repair.
In Archify, "Automatic routes own their endpoint sides." Adding explicit sides/vias preemptively causes more errors than it fixes (endpoint-side-direction, micro-segments, crossings), because the renderer's Automatic Port Spread + outside-bridge logic is what handles near-parallel hubs. Every regression this skill was born from came from hand-routing too early.
If you must use an explicit fromSide + via (the dense-hub exception)
Orthogonal routing is strict about the FIRST and FINAL segments being perpendicular to their declared side:
fromSide: "top"→ the first via point must lie directly above the source port at the SAME x.fromSide:"bottom"→ directly below, same x."left"/"right"→ same y.- The FINAL segment must enter the target side perpendicular. Set the last via so it shares the target's axis (e.g. for a
leftentry into the central node, the last via's y must equal the port's y, producing a pure-horizontal final segment). A single misaligned via produces a diagonal last segment →artifact/orthogonal-arrowsfailure. - Ports sit at side midpoints. So a node at
[520,640]size[150,60]has top-center at[595,640]; afromSide:"top"first via must be[595, ...above], not a stray x.
Placement strategies that make dense hubs route
- Keep the happy-path spine left-to-right and push the hub to one side of it. One obvious main path; side branches leave the nearest main-path node.
- Delivery/send providers side-by-side (same row), never stacked in one column. Two stacked providers both drawing a vertical edge down to a customer will cross the sibling. Spread them horizontally so each fan-out/down edge has its own corridor.
- Inbound webhook providers (Stripe, Square, etc.) belong in a region cleared of the storage cluster, routed via a lane that runs below/around the DB+Auth boxes — otherwise their up-edges thread straight through the storage group.
- Reserve
>label-width + 8px of clear gap between nodes that carry a labeled edge. If a label (e.g. "opens /r/:token") can't fit the gap, MOVE the nodes farther apart rather than shrinking/stacking. - Keep external actors outside the system boundary region when factually true.
The converging repair loop (stop guessing layout)
Run validate --quality showcase --json after EVERY single edit. Consume diagnostics by code / subject / measured evidence, and use the exact labelAt / labelDy the diagnostic suggests rather than estimating new offsets. Repair in this order (from the authoring contract):
- schema / missing
meta.quality_profile→ 2. node overlap / out-of-range → 3. edge-through-node + endpoint-direction → 4. crossings / ambiguous corridors / border runs / segment rhythm → 5. label overlaps & clearances.
Objective rule: if the error count is not at a new minimum after two consecutive rounds, your LAYOUT is wrong — stop tuning vias and redo the lane placement (this session: 33→20→19→15, then a bad hand-route jumped to 27→31, and recovery came from reverting to clean lane-based layout + stripping bad vias).
Ownership/boundary gotchas
engineering_profile: "deployment-ownership"adds strict checks: asecurity-group(private boundary) must wrap components from exactly one shared region, and a stateful component (database) must sit inside a private security-group. Nest the DB's security-group only around nodes in one region (e.g. both Supabase nodes), and give the secret-bearing service its own single-region group.- Edges must not run along a container/region border (
container-border-run). Give them a clean corridor clear of boundary boxes.
Acceptance sequence (only stop when all pass)
validate --quality showcase→ 0 errors, 0 warningsdeliver ... --quality showcase --repo-root <dir>→ 9/9 artifact checks,compositionStatus: passcheck <out.html>→ 0 issues (no short/micro segments)
For codebase-faithful diagrams pass --repo-root and real source paths (under components[].sources[].path) so the evidence receipt verifies (evidence.references: N).
Verification & delivery
Run doctor, then the validate→deliver→check sequence above. Use guide for ambiguous type routing. Never claim success for a non-zero validate/deliver, and never claim visual inspection you didn't perform (no GUI → say the geometry report is clean but recommend a quick browser check).
See references/dense-hub-debug-transcript.md for the concrete worked example (ReviewLoop: Worker hub + 4 send providers + 2 inbound billing webhooks + a review loop + a queue).
Supporting files: this skill's supporting files are held in the docsite at
docs/15-skills/_support/creative/dense-architecture-diagram-layout/— fetch them fresh fromjknash/docsitemain alongside this page. Source:jknash/hermes-shared-skills· branchhermes-jkdev001@1d0d545c3970·skills/creative/dense-architecture-diagram-layout/· view source · Imported 2026-10-04. Supporting files (references, scripts) remain in the source repository.
Published by Muse · 2026-10-04.