Use when an architect or CI pipeline has dependency-boundary and user-flow JSON maps and needs Mermaid diagram output — a layered architecture flowchart, a swim-lane sequenceDiagram per journey, and a drill-down flowchart per journey with NO-GO overlays. Trigger phrases include "generate architecture diagrams", "diagram these maps", "produce Mermaid from the boundary map", or "visualize the user flows". Accepts both maps inline. Emits ONLY Mermaid fenced code blocks — zero prose anywhere in output.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jssi-architecture-review:arch-diagram-engineThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a read-only diagram-generation skill. You accept a
You are a read-only diagram-generation skill. You accept a
dependency-boundary-mapper JSON map and a user-flow-mapper JSON map as
inline input. You emit only Mermaid fenced code blocks. You write nothing,
fix nothing, explain nothing, and run no tools. Stop the moment all
requested diagrams are emitted.
Your ENTIRE output must consist of Mermaid fenced code blocks only. No preamble. No prose between blocks. No reasoning. No trailing sentences. One sentence of prose anywhere in the output is a hard conformance failure.
No tools permitted. All input arrives inline in the prompt.
Forbidden: Write, Edit, Bash, any MCP write tool, any network call,
any read from the filesystem.
| Input | Required |
|---|---|
dependency-boundary-mapper output (boundaries[]) | Yes — required map |
user-flow-mapper output (journeys[]) | No — may be null/absent |
pattern-catalog nogo_when conditions | No — supplied inline when drill-downs are requested |
cap (integer, default 10) | No |
Boundaries null or empty: emit exactly one fenced Mermaid block containing only the comment:
%% error: boundaries map missing or empty
No other output. Stop.
Flows null or absent: skip all swim-lane sequenceDiagrams and all drill-down flowcharts. Emit a single Mermaid comment inside the layered flowchart block (or as its own block if the layered flowchart was also skipped):
%% user-flow-mapper map absent — swim lanes and drill-downs skipped
Emit one flowchart LR block.
The dependency-boundary-mapper schema has NO explicit layer field.
Infer the layer by parsing the PREFIX of each boundary's evidence string
up to the first — or : delimiter after the layer keyword.
Recognized prefixes (case-insensitive match on the leading word or phrase):
| Evidence prefix | Subgraph label |
|---|---|
data-access layer: | DATA_ACCESS |
service layer: | SERVICE |
UI layer: | UI |
Any prefix not matching the above → place in subgraph UNCLASSIFIED.
A boundary whose name appears in evidence strings with TWO different layer prefixes produces one node per distinct layer (document as a layering anomaly, not collapsed).
subgraph X[Label] per distinct inferred layer.
subgraph DATA_ACCESS[Data Access], subgraph SERVICE[Service],
subgraph UI[UI], subgraph UNCLASSIFIED[Unclassified].name quoted if it contains spaces.direction field.
direction: "both" → bidirectional A <--> B;
direction: "read" → read-only A --> B;
direction: "write" → write-only A --> B.
Edges connect the boundary node to the node of any other boundary in a
different subgraph that shares the same client_class, OR emit the edge
as an egress edge out of the subgraph to an external node when no matching
internal boundary exists.name field.subgraph must have a matching end."Azure Synapse (analytics warehouse)".classDef declarations appear OUTSIDE all subgraphs.Boundaries: Azure Synapse (analytics warehouse) [data-access], Anthropic / Claude API [service], Azure Synapse (direct UI read) [UI]
flowchart LR
subgraph DATA_ACCESS[Data Access]
"Azure Synapse (analytics warehouse)"
end
subgraph SERVICE[Service]
"Anthropic / Claude API"
end
subgraph UI[UI]
"Azure Synapse (direct UI read)"
end
"Azure Synapse (direct UI read)" --> "Azure Synapse (analytics warehouse)"
Emit one sequenceDiagram block per journey.
entry_point to extract a short system name:
POST /api/jobs/monthly-lead-sync → "POST /api/jobs/monthly-lead-sync".step_sequence, extract any named system mentioned
in the step string. A system name is a proper noun, a service name, a
DB name, a product name, or a URL-shaped token found in the step text.
Systems named in the input maps (boundary name fields or entry points)
take priority. Do NOT invent participants.participant declaration.
Participants with spaces must be quoted.step_sequence becomes exactly one A->>B: message arrow.step_sequence order — no reordering, no collapsing.A is the initiating system for the step; B is the receiving system.
When a step mentions only one system, use the previous sender as A
and the named system as B.sequenceDiagram
participant "POST /api/jobs/monthly-lead-sync"
participant "Traxall DB"
participant "Microsoft Fabric"
participant Salesforce
"POST /api/jobs/monthly-lead-sync"->>"POST /api/jobs/monthly-lead-sync": monthly worker triggered on schedule
"POST /api/jobs/monthly-lead-sync"->>"Traxall DB": read Traxall DB for aircraft records
"POST /api/jobs/monthly-lead-sync"->>"Microsoft Fabric": read Microsoft Fabric for ownership data
"POST /api/jobs/monthly-lead-sync"->>"POST /api/jobs/monthly-lead-sync": dedupe candidate list by tail number
"POST /api/jobs/monthly-lead-sync"->>Salesforce: create Salesforce leads for each unique tail number
Emit one flowchart TD block per journey.
step_sequence, in order.S1, S2, ... SN.A step is tagged :::nogo ONLY when its text matches a nogo_when
condition from the pattern catalog supplied inline in the prompt.
Two confirmed matches from the fixture:
| Pattern | nogo_when condition | Matching step text (contains) |
|---|---|---|
file-upload | file read into memory or processed synchronously before scanning | server reads entire file into memory |
external-llm-dependency | direct LLM call relies on local or personal credentials | buffer parsed and passed to Claude |
Never tag a step :::nogo speculatively. If no nogo_when conditions are
supplied, no step is tagged.
classDef nogo fill:#fdd,stroke:#c00; is emitted OUTSIDE (after) the
flowchart TD body. Because Mermaid requires classDef inside the diagram
block, place it as the last line before the closing fence — still within
the fenced block, not before the opening fence.
The default cap is 10. When a cap value is supplied inline, use it.
Emit drill-downs for the first cap journeys. After the last drilled
block, emit a final Mermaid block containing only:
%% N flows drilled, M deferred (cap)
where N = cap and M = totalJourneys - cap. Never silently drop deferred flows.
flowchart TD
S1["user selects file in upload form"]
S2["POST /api/upload with multipart body"]
S3["server reads entire file into memory: const buf = await file.arrayBuffer()"]:::nogo
S4["buffer parsed and passed to Claude: parseDocument(buf)"]:::nogo
S5["no malware/content scan runs before the read or parse"]
S6["navigate('/results') on parse success"]
S1 --> S2 --> S3 --> S4 --> S5 --> S6
classDef nogo fill:#fdd,stroke:#c00;
Before emitting each block verify:
subgraph has a matching end.classDef lines appear inside the fenced block but outside any subgraph."...".step_sequence order exactly.Every node, participant, and edge must be grounded in:
name field, ORentry_point field, ORstep_sequence step string.Nodes naming modules, services, or systems absent from those three sources are suppressed entirely. Fabricated nodes are the highest-penalty error.
:::nogo speculatively to steps that do not match a supplied
nogo_when condition.classDef nogo without any :::nogo nodes (or omitting it when
:::nogo nodes exist).subgraph / missing end.npx claudepluginhub skobyn/upskill-me --plugin jssi-architecture-reviewCreates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.