@caddis/cli 0.4.45 → 0.4.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/skills/flow-studio/README.md +46 -7
- package/bundles/antigravity-plugin/skills/flow-studio/SKILL.md +81 -81
- package/bundles/antigravity-plugin/skills/flow-studio/examples/README.md +8 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/agent-journey.json +103 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/approval-flow.json +134 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/ci-cd-pipeline.json +132 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/incident-timeline.json +109 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/order-desk.json +99 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/service-map.json +133 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/state-machine.json +106 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/ticket-lifecycle.json +107 -0
- package/bundles/antigravity-plugin/skills/flow-studio/model.schema.json +27 -8
- package/bundles/antigravity-plugin/skills/flow-studio/react/FlowStudioView.test.tsx +82 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/FlowStudioView.tsx +67 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/README.md +37 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/index.ts +3 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/FlowCanvas.tsx +58 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/Inspector.tsx +27 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/index.ts +6 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/native.css +18 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/native.test.tsx +161 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/useFlowGeometry.ts +22 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/useTrace.ts +29 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/native/useViewport.ts +75 -0
- package/bundles/antigravity-plugin/skills/flow-studio/react/states.tsx +13 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/design-language.md +177 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/implement-in-app.md +213 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/model-schema.md +254 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/notes-and-spec.md +74 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/patterns.md +385 -49
- package/bundles/antigravity-plugin/skills/flow-studio/references/ux-rules.md +91 -0
- package/bundles/antigravity-plugin/skills/flow-studio/references/verify.md +124 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/build-engine.mjs +54 -14
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/build.mjs +21 -4
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/check.mjs +320 -28
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/default-notes.json +67 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/auto-entry-guard.mjs +5 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/auto-entry-guard.test.mjs +14 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/auto-entry.test.mjs +31 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/build-engine.test.mjs +30 -2
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/check-args.mjs +18 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/check-args.test.mjs +15 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/check-selftest.test.mjs +64 -4
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/cli.test.mjs +115 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/demo-pack.mjs +23 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/demo-pack.test.mjs +34 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/docs.test.mjs +128 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/library.test.mjs +26 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/react-proof-cleanup.mjs +12 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/react-proof-cleanup.test.mjs +45 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/react-proof-page.mjs +3 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/react-proof-page.test.mjs +9 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/styles.test.mjs +37 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/react-proof.mjs +92 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/validate.mjs +5 -1
- package/bundles/antigravity-plugin/skills/flow-studio/src/autolayout.test.ts +78 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/autolayout.ts +132 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/chrome.ts +11 -7
- package/bundles/antigravity-plugin/skills/flow-studio/src/controls.ts +8 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/ctx.ts +16 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/diff.test.ts +31 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/diff.ts +34 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/engine.ts +83 -32
- package/bundles/antigravity-plugin/skills/flow-studio/src/inspector.ts +23 -5
- package/bundles/antigravity-plugin/skills/flow-studio/src/interact.ts +21 -8
- package/bundles/antigravity-plugin/skills/flow-studio/src/layout.test.ts +75 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/layout.ts +49 -11
- package/bundles/antigravity-plugin/skills/flow-studio/src/lib.ts +20 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/metrics.test.ts +57 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/metrics.ts +29 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/model.test.ts +62 -2
- package/bundles/antigravity-plugin/skills/flow-studio/src/model.ts +101 -16
- package/bundles/antigravity-plugin/skills/flow-studio/src/notes.ts +8 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/page.ts +21 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/playback.test.ts +104 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/playback.ts +106 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/playbackui.ts +193 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/render.ts +66 -18
- package/bundles/antigravity-plugin/skills/flow-studio/src/routing.test.ts +21 -1
- package/bundles/antigravity-plugin/skills/flow-studio/src/routing.ts +32 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/rules.test.ts +48 -1
- package/bundles/antigravity-plugin/skills/flow-studio/src/rules.ts +52 -1
- package/bundles/antigravity-plugin/skills/flow-studio/src/selection.test.ts +12 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/selection.ts +4 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/stateCss.test.ts +7 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/stateCss.ts +1 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/styles.css +44 -10
- package/bundles/antigravity-plugin/skills/flow-studio/src/trace.test.ts +21 -1
- package/bundles/antigravity-plugin/skills/flow-studio/src/trace.ts +18 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/engine.html +995 -82
- package/bundles/antigravity-plugin/skills/flow-studio/templates/engine.shell.html +1 -39
- package/bundles/antigravity-plugin/skills/flow-studio/templates/flow-studio.css +191 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/flow-studio.lib.d.mts +1 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/flow-studio.lib.mjs +2492 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/shell-body.html +50 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/README.md +46 -7
- package/bundles/codex/.codex/skills/frontend/flow-studio/SKILL.md +81 -81
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/README.md +8 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/agent-journey.json +103 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/approval-flow.json +134 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/ci-cd-pipeline.json +132 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/incident-timeline.json +109 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/order-desk.json +99 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/service-map.json +133 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/state-machine.json +106 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/ticket-lifecycle.json +107 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/model.schema.json +27 -8
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/FlowStudioView.test.tsx +82 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/FlowStudioView.tsx +67 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/README.md +37 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/index.ts +3 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/FlowCanvas.tsx +58 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/Inspector.tsx +27 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/index.ts +6 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/native.css +18 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/native.test.tsx +161 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/useFlowGeometry.ts +22 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/useTrace.ts +29 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/native/useViewport.ts +75 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/react/states.tsx +13 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/design-language.md +177 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/implement-in-app.md +213 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/model-schema.md +254 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/notes-and-spec.md +74 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/patterns.md +385 -49
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/ux-rules.md +91 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/references/verify.md +124 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/build-engine.mjs +54 -14
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/build.mjs +21 -4
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/check.mjs +320 -28
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/default-notes.json +67 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/auto-entry-guard.mjs +5 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/auto-entry-guard.test.mjs +14 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/auto-entry.test.mjs +31 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/build-engine.test.mjs +30 -2
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/check-args.mjs +18 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/check-args.test.mjs +15 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/check-selftest.test.mjs +64 -4
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/cli.test.mjs +115 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/demo-pack.mjs +23 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/demo-pack.test.mjs +34 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/docs.test.mjs +128 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/library.test.mjs +26 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/react-proof-cleanup.mjs +12 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/react-proof-cleanup.test.mjs +45 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/react-proof-page.mjs +3 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/react-proof-page.test.mjs +9 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/styles.test.mjs +37 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/react-proof.mjs +92 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/validate.mjs +5 -1
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/autolayout.test.ts +78 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/autolayout.ts +132 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/chrome.ts +11 -7
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/controls.ts +8 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/ctx.ts +16 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/diff.test.ts +31 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/diff.ts +34 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/engine.ts +83 -32
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/inspector.ts +23 -5
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/interact.ts +21 -8
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/layout.test.ts +75 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/layout.ts +49 -11
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/lib.ts +20 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/metrics.test.ts +57 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/metrics.ts +29 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/model.test.ts +62 -2
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/model.ts +101 -16
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/notes.ts +8 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/page.ts +21 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/playback.test.ts +104 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/playback.ts +106 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/playbackui.ts +193 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/render.ts +66 -18
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/routing.test.ts +21 -1
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/routing.ts +32 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/rules.test.ts +48 -1
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/rules.ts +52 -1
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/selection.test.ts +12 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/selection.ts +4 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/stateCss.test.ts +7 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/stateCss.ts +1 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/styles.css +44 -10
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/trace.test.ts +21 -1
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/trace.ts +18 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/engine.html +995 -82
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/engine.shell.html +1 -39
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/flow-studio.css +191 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/flow-studio.lib.d.mts +1 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/flow-studio.lib.mjs +2492 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/shell-body.html +50 -0
- package/bundles/manifest.json +2 -2
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Scenario recipes
|
|
2
2
|
|
|
3
|
-
Each recipe
|
|
4
|
-
|
|
5
|
-
Version 0.1 draws left-to-right flows only (see `SKILL.md`); where a scenario needs a loop or a branch, the
|
|
6
|
-
recipe says what to do today.
|
|
3
|
+
Each recipe shows how to express a domain scenario in a flow-studio model.
|
|
4
|
+
All recipes listed below are **proven** and match an example file in `examples/`.
|
|
7
5
|
|
|
8
|
-
Common states
|
|
6
|
+
## Common states
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
You can start from these base states and adjust words to match your domain:
|
|
9
|
+
|
|
10
|
+
| State id | Word | Tone | Border | Edge | Motion | Bucket |
|
|
11
11
|
|---|---|---|---|---|---|---|
|
|
12
12
|
| `ok` | OK | ok | solid | flow | flow | good |
|
|
13
13
|
| `planned` | PLANNED | muted | dashed | dash | flow-slow | neutral |
|
|
@@ -15,65 +15,401 @@ Common states to start from (change the words to fit the scenario):
|
|
|
15
15
|
| `breached` | BREACHED | crit | solid | flow | flow | gap |
|
|
16
16
|
| `unknown` | NOT RECORDED | warn | dotted | dot | breathe | gap |
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Data lineage and dependency impact
|
|
21
|
+
|
|
22
|
+
- **Example file:** `examples/lineage.json`
|
|
23
|
+
- **Scenario:** Trace data assets from ingestion sources through storage, pipelines, transformations, to consuming dashboards and applications.
|
|
24
|
+
- **Typical columns:** Source, Host, Database, Pipeline, Tables, Refresher, Views, App, Dashboard.
|
|
25
|
+
- **Typical lanes:** Customer Portal, Order Service, Data Warehouse, Reporting Platform. A lane without documentation uses `gap: true`.
|
|
26
|
+
- **Node count guideline:** 15 to 30 nodes.
|
|
27
|
+
- **Recommended inspector relations:**
|
|
28
|
+
- Upstream (`dir: "up"`, label: "Upstream sources")
|
|
29
|
+
- Downstream (`dir: "down"`, label: "Downstream consumers")
|
|
30
|
+
- Pages (`dir: "down"`, label: "Affected pages", filter: `{ "kind": "card" }`)
|
|
31
|
+
- **Copy-paste skeleton:**
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"version": 1,
|
|
36
|
+
"meta": {
|
|
37
|
+
"title": "Customer Data Lineage",
|
|
38
|
+
"help": "Tracks customer record movement from OLTP to analytical reports.",
|
|
39
|
+
"asOf": "2026-10-06",
|
|
40
|
+
"source": "Data Governance Catalog"
|
|
41
|
+
},
|
|
42
|
+
"layout": "columns-lanes",
|
|
43
|
+
"columns": [
|
|
44
|
+
{ "id": "src", "title": "Sources", "width": 180 },
|
|
45
|
+
{ "id": "ingest", "title": "Ingestion", "width": 180 },
|
|
46
|
+
{ "id": "wh", "title": "Warehouse", "width": 200 },
|
|
47
|
+
{ "id": "bi", "title": "Reporting", "width": 180 }
|
|
48
|
+
],
|
|
49
|
+
"lanes": [
|
|
50
|
+
{ "id": "crm", "title": "CRM Core", "badge": "PROD", "badgeTone": "ok" },
|
|
51
|
+
{ "id": "analytics", "title": "Analytics Engine", "badge": "PROD", "badgeTone": "ok" }
|
|
52
|
+
],
|
|
53
|
+
"states": {
|
|
54
|
+
"ok": { "word": "LIVE", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
55
|
+
"planned": { "word": "PLANNED", "tone": "muted", "border": "dashed", "edge": "dash", "motion": "flow-slow", "bucket": "neutral" }
|
|
56
|
+
},
|
|
57
|
+
"nodes": [
|
|
58
|
+
{ "id": "crm-db", "kind": "card", "lane": "crm", "col": 0, "row": 0, "state": "ok", "title": "CRM Postgres" },
|
|
59
|
+
{ "id": "cdc-pipe", "kind": "card", "lane": "crm", "col": 1, "row": 0, "state": "ok", "title": "CDC Stream" },
|
|
60
|
+
{ "id": "dim-cust", "kind": "card", "lane": "analytics", "col": 2, "row": 0, "state": "ok", "title": "dim_customer" },
|
|
61
|
+
{ "id": "dash-sales", "kind": "card", "lane": "analytics", "col": 3, "row": 0, "state": "ok", "title": "Sales Dashboard" }
|
|
62
|
+
],
|
|
63
|
+
"links": [
|
|
64
|
+
{ "id": "l1", "from": "crm-db", "to": "cdc-pipe", "state": "ok" },
|
|
65
|
+
{ "id": "l2", "from": "cdc-pipe", "to": "dim-cust", "state": "ok" },
|
|
66
|
+
{ "id": "l3", "from": "dim-cust", "to": "dash-sales", "state": "ok" }
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. Ticket, case, or order lifecycle
|
|
74
|
+
|
|
75
|
+
- **Example file:** `examples/ticket-lifecycle.json`
|
|
76
|
+
- **Scenario:** Track service requests, customer tickets, or incident cases from creation to triage, engineering resolution, verification, and closure.
|
|
77
|
+
- **Typical columns:** New, Triage, In Progress, Review, Waiting, Resolved, Closed.
|
|
78
|
+
- **Typical lanes:** Tier 1 Support, Platform Engineering, Quality Assurance, Customer.
|
|
79
|
+
- **Node count guideline:** 8 to 20 nodes.
|
|
80
|
+
- **Recommended inspector relations:**
|
|
81
|
+
- Previous step (`dir: "up"`, label: "Came from")
|
|
82
|
+
- Next step (`dir: "down"`, label: "Goes to")
|
|
83
|
+
- Escalations (`dir: "down"`, label: "Escalated to")
|
|
84
|
+
- **Copy-paste skeleton:**
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"version": 1,
|
|
89
|
+
"meta": {
|
|
90
|
+
"title": "Support Ticket Journey",
|
|
91
|
+
"help": "End-to-end support ticket triage and escalation workflow.",
|
|
92
|
+
"asOf": "2026-10-06",
|
|
93
|
+
"source": "HelpDesk Service API"
|
|
94
|
+
},
|
|
95
|
+
"layout": "columns-lanes",
|
|
96
|
+
"columns": [
|
|
97
|
+
{ "id": "triage", "title": "Triage", "width": 160 },
|
|
98
|
+
{ "id": "dev", "title": "Engineering", "width": 180 },
|
|
99
|
+
{ "id": "qa", "title": "Verification", "width": 160 },
|
|
100
|
+
{ "id": "done", "title": "Resolved", "width": 160 }
|
|
101
|
+
],
|
|
102
|
+
"lanes": [
|
|
103
|
+
{ "id": "support", "title": "Support Desk", "badge": "T1", "badgeTone": "ok" },
|
|
104
|
+
{ "id": "eng", "title": "Platform Team", "badge": "T2", "badgeTone": "ok" }
|
|
105
|
+
],
|
|
106
|
+
"states": {
|
|
107
|
+
"ontime": { "word": "ON TIME", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
108
|
+
"risk": { "word": "AT RISK", "tone": "warn", "border": "dashed", "edge": "dash", "motion": "breathe", "bucket": "neutral" },
|
|
109
|
+
"breach": { "word": "BREACHED", "tone": "crit", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "gap" }
|
|
110
|
+
},
|
|
111
|
+
"nodes": [
|
|
112
|
+
{ "id": "inbound", "kind": "card", "lane": "support", "col": 0, "row": 0, "state": "ontime", "title": "Inbound Case" },
|
|
113
|
+
{ "id": "diag", "kind": "card", "lane": "support", "col": 0, "row": 1, "state": "ontime", "title": "Initial Assessment" },
|
|
114
|
+
{ "id": "bugfix", "kind": "card", "lane": "eng", "col": 1, "row": 0, "state": "risk", "title": "Patch Defect", "sla": 3600 },
|
|
115
|
+
{ "id": "verify", "kind": "card", "lane": "support", "col": 2, "row": 0, "state": "ontime", "title": "Customer Verify" },
|
|
116
|
+
{ "id": "closed", "kind": "card", "lane": "support", "col": 3, "row": 0, "state": "ontime", "title": "Case Closed" }
|
|
117
|
+
],
|
|
118
|
+
"links": [
|
|
119
|
+
{ "id": "l-triage", "from": "inbound", "to": "diag", "state": "ontime" },
|
|
120
|
+
{ "id": "l-escalate", "from": "diag", "to": "bugfix", "state": "risk" },
|
|
121
|
+
{ "id": "l-test", "from": "bugfix", "to": "verify", "state": "ontime" },
|
|
122
|
+
{ "id": "l-reopen", "from": "verify", "to": "bugfix", "state": "risk", "kind": "loop-back", "label": "Failed test" },
|
|
123
|
+
{ "id": "l-resolve", "from": "verify", "to": "closed", "state": "ontime" }
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 3. Agent and customer journey
|
|
131
|
+
|
|
132
|
+
- **Example file:** `examples/agent-journey.json`
|
|
133
|
+
- **Scenario:** Trace user prompts into an autonomous agent loop (receive, analyze, plan, tool execution, critique, response).
|
|
134
|
+
- **Typical columns:** Receive, Classify, Plan, Act, Validate, Respond.
|
|
135
|
+
- **Typical lanes:** User, Agent Core, Tool Worker, Human Reviewer.
|
|
136
|
+
- **Node count guideline:** 8 to 20 nodes.
|
|
137
|
+
- **Recommended inspector relations:**
|
|
138
|
+
- Inputs (`dir: "up"`, label: "Context inputs")
|
|
139
|
+
- Outputs (`dir: "down"`, label: "Generated steps")
|
|
140
|
+
- Tool calls (`dir: "down"`, label: "External tools")
|
|
141
|
+
- **Copy-paste skeleton:**
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"version": 1,
|
|
146
|
+
"meta": {
|
|
147
|
+
"title": "Autonomous Agent Loop",
|
|
148
|
+
"help": "Execution loop of an LLM agent with tool calls and human verification.",
|
|
149
|
+
"asOf": "2026-10-06",
|
|
150
|
+
"source": "Agent Orchestrator"
|
|
151
|
+
},
|
|
152
|
+
"layout": "columns-lanes",
|
|
153
|
+
"columns": [
|
|
154
|
+
{ "id": "input", "title": "Input", "width": 160 },
|
|
155
|
+
{ "id": "think", "title": "Reasoning", "width": 180 },
|
|
156
|
+
{ "id": "exec", "title": "Tool Execution", "width": 180 },
|
|
157
|
+
{ "id": "out", "title": "Response", "width": 160 }
|
|
158
|
+
],
|
|
159
|
+
"lanes": [
|
|
160
|
+
{ "id": "client", "title": "User Session", "badge": "USER", "badgeTone": "muted" },
|
|
161
|
+
{ "id": "orchestrator", "title": "Agent Planner", "badge": "AI", "badgeTone": "ok" },
|
|
162
|
+
{ "id": "mcp", "title": "Tool Worker", "badge": "MCP", "badgeTone": "accent" }
|
|
163
|
+
],
|
|
164
|
+
"states": {
|
|
165
|
+
"ready": { "word": "READY", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
166
|
+
"thinking": { "word": "ACTIVE", "tone": "accent", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "neutral" },
|
|
167
|
+
"retry": { "word": "RETRY", "tone": "warn", "border": "dashed", "edge": "dash", "motion": "breathe", "bucket": "neutral" }
|
|
168
|
+
},
|
|
169
|
+
"nodes": [
|
|
170
|
+
{ "id": "prompt", "kind": "card", "lane": "client", "col": 0, "row": 0, "state": "ready", "title": "User Prompt" },
|
|
171
|
+
{ "id": "plan", "kind": "card", "lane": "orchestrator", "col": 1, "row": 0, "state": "thinking", "title": "Create Plan" },
|
|
172
|
+
{ "id": "call-api", "kind": "card", "lane": "mcp", "col": 2, "row": 0, "state": "ready", "title": "Execute Tool Call" },
|
|
173
|
+
{ "id": "answer", "kind": "card", "lane": "client", "col": 3, "row": 0, "state": "ready", "title": "Final Reply" }
|
|
174
|
+
],
|
|
175
|
+
"links": [
|
|
176
|
+
{ "id": "l-in", "from": "prompt", "to": "plan", "state": "ready" },
|
|
177
|
+
{ "id": "l-call", "from": "plan", "to": "call-api", "state": "ready" },
|
|
178
|
+
{ "id": "l-back", "from": "call-api", "to": "plan", "state": "retry", "kind": "loop-back", "label": "Tool result" },
|
|
179
|
+
{ "id": "l-reply", "from": "plan", "to": "answer", "state": "ready" }
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
```
|
|
19
183
|
|
|
20
|
-
|
|
21
|
-
- **Lanes:** one per app or system; a lane with no document gets `gap: true` and a note saying what is missing.
|
|
22
|
-
- **States:** measured, declared, inferred, not recorded. Views: Today (what is measured) and Complete (adds the
|
|
23
|
-
declared layer).
|
|
24
|
-
- **Inspector:** Feeds this, Downstream, Pages (`filter: {col: <pages column>}`). **Action:** "Simulate: this stops
|
|
25
|
-
updating".
|
|
26
|
-
- **Questions:** which layers matter, which sources are measured and which are declared, who owns each document.
|
|
27
|
-
- **Traps:** guessing a link (use a placeholder), counting a declared snapshot as current (carry its date).
|
|
184
|
+
---
|
|
28
185
|
|
|
29
|
-
##
|
|
186
|
+
## 4. CI/CD pipeline and release train
|
|
30
187
|
|
|
31
|
-
- **
|
|
32
|
-
|
|
33
|
-
- **
|
|
34
|
-
- **
|
|
35
|
-
- **
|
|
188
|
+
- **Example file:** `examples/ci-cd-pipeline.json`
|
|
189
|
+
- **Scenario:** Trace code commit through automated build, testing, container scanning, staging validation, and canary production deployment.
|
|
190
|
+
- **Typical columns:** Commit, Build, Test, Security, Staging, Production.
|
|
191
|
+
- **Typical lanes:** Web Frontend, Core Service, Infrastructure as Code.
|
|
192
|
+
- **Node count guideline:** 10 to 25 nodes.
|
|
193
|
+
- **Recommended inspector relations:**
|
|
194
|
+
- Upstream stages (`dir: "up"`, label: "Required steps")
|
|
195
|
+
- Downstream gates (`dir: "down"`, label: "Dependent gates")
|
|
196
|
+
- Artifacts (`dir: "down"`, label: "Published packages")
|
|
197
|
+
- **Copy-paste skeleton:**
|
|
36
198
|
|
|
37
|
-
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"version": 1,
|
|
202
|
+
"meta": {
|
|
203
|
+
"title": "Release Train Pipeline",
|
|
204
|
+
"help": "Continuous delivery pipeline with automated test gates and approval checks.",
|
|
205
|
+
"asOf": "2026-10-06",
|
|
206
|
+
"source": "GitHub Actions"
|
|
207
|
+
},
|
|
208
|
+
"layout": "columns-lanes",
|
|
209
|
+
"columns": [
|
|
210
|
+
{ "id": "src", "title": "Source", "width": 150 },
|
|
211
|
+
{ "id": "ci", "title": "Build & Test", "width": 180 },
|
|
212
|
+
{ "id": "gate", "title": "Approval", "width": 160 },
|
|
213
|
+
{ "id": "deploy", "title": "Deployment", "width": 180 }
|
|
214
|
+
],
|
|
215
|
+
"lanes": [
|
|
216
|
+
{ "id": "app", "title": "App Service", "badge": "CI/CD", "badgeTone": "ok" },
|
|
217
|
+
{ "id": "ops", "title": "Infrastructure", "badge": "PROD", "badgeTone": "warn" }
|
|
218
|
+
],
|
|
219
|
+
"states": {
|
|
220
|
+
"pass": { "word": "PASSED", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
221
|
+
"running": { "word": "RUNNING", "tone": "accent", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "neutral" },
|
|
222
|
+
"failed": { "word": "FAILED", "tone": "crit", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "gap" }
|
|
223
|
+
},
|
|
224
|
+
"nodes": [
|
|
225
|
+
{ "id": "push", "kind": "card", "lane": "app", "col": 0, "row": 0, "state": "pass", "title": "Git Commit" },
|
|
226
|
+
{ "id": "lint-test", "kind": "card", "lane": "app", "col": 1, "row": 0, "state": "pass", "title": "Unit & Integration" },
|
|
227
|
+
{ "id": "gate-check", "kind": "gateway", "lane": "ops", "col": 2, "row": 0, "state": "running", "title": "Sign-off OK?" },
|
|
228
|
+
{ "id": "prod-deploy", "kind": "card", "lane": "ops", "col": 3, "row": 0, "state": "pass", "title": "Canary Rollout" }
|
|
229
|
+
],
|
|
230
|
+
"links": [
|
|
231
|
+
{ "id": "l-ci", "from": "push", "to": "lint-test", "state": "pass" },
|
|
232
|
+
{ "id": "l-gate", "from": "lint-test", "to": "gate-check", "state": "pass" },
|
|
233
|
+
{ "id": "l-ok", "from": "gate-check", "to": "prod-deploy", "state": "pass", "label": "Approved" },
|
|
234
|
+
{ "id": "l-fail", "from": "gate-check", "to": "push", "state": "failed", "kind": "loop-back", "label": "Rejected" }
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
```
|
|
38
238
|
|
|
39
|
-
|
|
40
|
-
**Nodes:** touchpoints. **States:** smooth, friction, failure. **Metrics:** put the figure in `subtitle`.
|
|
41
|
-
- **Traps:** mixing actors in one lane; no states (a journey with no pain points hides the point).
|
|
239
|
+
---
|
|
42
240
|
|
|
43
|
-
##
|
|
241
|
+
## 5. Approval or business process
|
|
44
242
|
|
|
45
|
-
- **
|
|
46
|
-
|
|
243
|
+
- **Example file:** `examples/approval-flow.json`
|
|
244
|
+
- **Scenario:** Multi-tiered approval workflow for expense requests, contract reviews, or capital expenditure.
|
|
245
|
+
- **Typical columns:** Submission, Initial Review, Dept Approval, Executive Signoff, Fulfillment.
|
|
246
|
+
- **Typical lanes:** Employee, Line Manager, Finance Officer, VP / Executive.
|
|
247
|
+
- **Node count guideline:** 8 to 22 nodes.
|
|
248
|
+
- **Recommended inspector relations:**
|
|
249
|
+
- Prior reviews (`dir: "up"`, label: "Previous decisions")
|
|
250
|
+
- Next approvals (`dir: "down"`, label: "Next reviews")
|
|
251
|
+
- Audit trail (`dir: "down"`, label: "Audit records")
|
|
252
|
+
- **Copy-paste skeleton:**
|
|
47
253
|
|
|
48
|
-
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"version": 1,
|
|
257
|
+
"meta": {
|
|
258
|
+
"title": "Expense Approval Flow",
|
|
259
|
+
"help": "Multi-tier corporate expense authorization workflow.",
|
|
260
|
+
"asOf": "2026-10-06",
|
|
261
|
+
"source": "ERP Workflow Engine"
|
|
262
|
+
},
|
|
263
|
+
"layout": "auto",
|
|
264
|
+
"columns": [
|
|
265
|
+
{ "id": "start", "title": "Request", "width": 160 },
|
|
266
|
+
{ "id": "review", "title": "Review", "width": 180 },
|
|
267
|
+
{ "id": "finance", "title": "Finance", "width": 180 },
|
|
268
|
+
{ "id": "done", "title": "Pmt", "width": 160 }
|
|
269
|
+
],
|
|
270
|
+
"lanes": [
|
|
271
|
+
{ "id": "staff", "title": "Requester", "badge": "STAFF", "badgeTone": "muted" },
|
|
272
|
+
{ "id": "mgr", "title": "Line Manager", "badge": "MGR", "badgeTone": "ok" },
|
|
273
|
+
{ "id": "acct", "title": "Finance Dept", "badge": "ACCT", "badgeTone": "warn" }
|
|
274
|
+
],
|
|
275
|
+
"states": {
|
|
276
|
+
"approved": { "word": "APPROVED", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
277
|
+
"pending": { "word": "PENDING", "tone": "warn", "border": "dashed", "edge": "dash", "motion": "breathe", "bucket": "neutral" },
|
|
278
|
+
"rejected": { "word": "REJECTED", "tone": "crit", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "gap" }
|
|
279
|
+
},
|
|
280
|
+
"nodes": [
|
|
281
|
+
{ "id": "submit", "kind": "card", "lane": "staff", "state": "approved", "title": "Submit Invoice" },
|
|
282
|
+
{ "id": "mgr-gate", "kind": "gateway", "lane": "mgr", "state": "pending", "title": "Within Budget?" },
|
|
283
|
+
{ "id": "finance-audit", "kind": "card", "lane": "acct", "state": "pending", "title": "Tax Compliance" },
|
|
284
|
+
{ "id": "payout", "kind": "card", "lane": "acct", "state": "approved", "title": "Disburse Funds" }
|
|
285
|
+
],
|
|
286
|
+
"links": [
|
|
287
|
+
{ "id": "l-sub", "from": "submit", "to": "mgr-gate", "state": "approved" },
|
|
288
|
+
{ "id": "l-app", "from": "mgr-gate", "to": "finance-audit", "state": "approved", "label": "Yes" },
|
|
289
|
+
{ "id": "l-rej", "from": "mgr-gate", "to": "submit", "state": "rejected", "kind": "loop-back", "label": "Revise" },
|
|
290
|
+
{ "id": "l-pay", "from": "finance-audit", "to": "payout", "state": "approved" }
|
|
291
|
+
]
|
|
292
|
+
}
|
|
293
|
+
```
|
|
49
294
|
|
|
50
|
-
|
|
51
|
-
**States:** passed, running, failed, skipped. **Inspector:** Upstream, Downstream, Environments.
|
|
295
|
+
---
|
|
52
296
|
|
|
53
|
-
## 6.
|
|
297
|
+
## 6. Incident timeline and root cause
|
|
54
298
|
|
|
55
|
-
- **
|
|
56
|
-
|
|
299
|
+
- **Example file:** `examples/incident-timeline.json`
|
|
300
|
+
- **Scenario:** Trace outage timeline from initial alert to blast radius detection, containment action, patch rollout, and post-incident review.
|
|
301
|
+
- **Typical columns:** Detection, Triage, Containment, Patch, Verification, Recovered.
|
|
302
|
+
- **Typical lanes:** API Gateway, Orders Service, Database, On-Call Operations.
|
|
303
|
+
- **Node count guideline:** 10 to 24 nodes.
|
|
304
|
+
- **Recommended inspector relations:**
|
|
305
|
+
- Root causes (`dir: "up"`, label: "Root causes")
|
|
306
|
+
- Impacted components (`dir: "down"`, label: "Blast radius")
|
|
307
|
+
- Incident actions (`dir: "down"`, label: "Remediation tasks")
|
|
308
|
+
- **Copy-paste skeleton:**
|
|
57
309
|
|
|
58
|
-
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"version": 1,
|
|
313
|
+
"meta": {
|
|
314
|
+
"title": "Production Outage Timeline",
|
|
315
|
+
"help": "Post-incident analysis of connection pool exhaustion.",
|
|
316
|
+
"asOf": "2026-10-06",
|
|
317
|
+
"source": "Incident Response Log"
|
|
318
|
+
},
|
|
319
|
+
"layout": "columns-lanes",
|
|
320
|
+
"columns": [
|
|
321
|
+
{ "id": "t0", "title": "10:00 Alert", "width": 160 },
|
|
322
|
+
{ "id": "t1", "title": "10:15 Triage", "width": 180 },
|
|
323
|
+
{ "id": "t2", "title": "10:30 Mitigation", "width": 180 },
|
|
324
|
+
{ "id": "t3", "title": "11:00 Recovered", "width": 160 }
|
|
325
|
+
],
|
|
326
|
+
"lanes": [
|
|
327
|
+
{ "id": "gw", "title": "API Gateway", "badge": "EDGE", "badgeTone": "warn" },
|
|
328
|
+
{ "id": "db", "title": "Database Cluster", "badge": "STORAGE", "badgeTone": "crit" }
|
|
329
|
+
],
|
|
330
|
+
"states": {
|
|
331
|
+
"healthy": { "word": "HEALTHY", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
332
|
+
"failing": { "word": "FAILED", "tone": "crit", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "gap" },
|
|
333
|
+
"fixed": { "word": "RESTORED", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" }
|
|
334
|
+
},
|
|
335
|
+
"nodes": [
|
|
336
|
+
{ "id": "alert", "kind": "card", "lane": "gw", "col": 0, "row": 0, "state": "failing", "title": "504 Gateway Timeout" },
|
|
337
|
+
{ "id": "pool-exhaust", "kind": "card", "lane": "db", "col": 1, "row": 0, "state": "failing", "title": "Pool Depleted" },
|
|
338
|
+
{ "id": "restart-nodes", "kind": "card", "lane": "db", "col": 2, "row": 0, "state": "healthy", "title": "Scale Connections" },
|
|
339
|
+
{ "id": "traffic-restored", "kind": "card", "lane": "gw", "col": 3, "row": 0, "state": "fixed", "title": "Normal Latency" }
|
|
340
|
+
],
|
|
341
|
+
"links": [
|
|
342
|
+
{ "id": "l-root", "from": "alert", "to": "pool-exhaust", "state": "failing" },
|
|
343
|
+
{ "id": "l-fix", "from": "pool-exhaust", "to": "restart-nodes", "state": "healthy" },
|
|
344
|
+
{ "id": "l-back-online", "from": "restart-nodes", "to": "traffic-restored", "state": "fixed" }
|
|
345
|
+
],
|
|
346
|
+
"inspector": {
|
|
347
|
+
"actions": [
|
|
348
|
+
{ "id": "sim-fail", "label": "Simulate: DB Failure", "dir": "down", "staleText": "Cascade to edge clients" }
|
|
349
|
+
]
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
59
353
|
|
|
60
|
-
|
|
61
|
-
**Action:** "Simulate: this is down" ripples to the dependents.
|
|
354
|
+
---
|
|
62
355
|
|
|
63
|
-
##
|
|
356
|
+
## 7. Service or architecture dependency map
|
|
64
357
|
|
|
65
|
-
-
|
|
66
|
-
|
|
358
|
+
- **Example file:** `examples/service-map.json`
|
|
359
|
+
- **Scenario:** Map microservices, API gateways, cache layers, message brokers, and persistent datastores across functional domains.
|
|
360
|
+
- **Typical columns:** Edge Gateway, Auth, Commerce API, Background Workers, Persistence.
|
|
361
|
+
- **Typical lanes:** Public Domain, Core Domain, Data Infrastructure.
|
|
362
|
+
- **Node count guideline:** 12 to 28 nodes.
|
|
363
|
+
- **Recommended inspector relations:**
|
|
364
|
+
- Upstream callers (`dir: "up"`, label: "Direct clients")
|
|
365
|
+
- Downstream services (`dir: "down"`, label: "Downstream dependencies")
|
|
366
|
+
- Shared storage (`dir: "down"`, label: "Datastores used")
|
|
367
|
+
- **Copy-paste skeleton:**
|
|
67
368
|
|
|
68
|
-
|
|
369
|
+
```json
|
|
370
|
+
{
|
|
371
|
+
"version": 1,
|
|
372
|
+
"meta": {
|
|
373
|
+
"title": "Microservice Architecture Map",
|
|
374
|
+
"help": "Service dependency topology with traffic volume and latency metrics.",
|
|
375
|
+
"asOf": "2026-10-06",
|
|
376
|
+
"source": "Service Mesh Telemetry"
|
|
377
|
+
},
|
|
378
|
+
"layout": "auto",
|
|
379
|
+
"columns": [
|
|
380
|
+
{ "id": "edge", "title": "Edge", "width": 160 },
|
|
381
|
+
{ "id": "svc", "title": "Services", "width": 200 },
|
|
382
|
+
{ "id": "data", "title": "Datastores", "width": 180 }
|
|
383
|
+
],
|
|
384
|
+
"lanes": [
|
|
385
|
+
{ "id": "ingress", "title": "Ingress Tier", "badge": "NET", "badgeTone": "ok" },
|
|
386
|
+
{ "id": "app", "title": "Application Tier", "badge": "SVC", "badgeTone": "ok" },
|
|
387
|
+
{ "id": "storage", "title": "Persistence Tier", "badge": "DB", "badgeTone": "ok" }
|
|
388
|
+
],
|
|
389
|
+
"states": {
|
|
390
|
+
"nominal": { "word": "HEALTHY", "tone": "ok", "border": "solid", "edge": "flow", "motion": "flow", "bucket": "good" },
|
|
391
|
+
"warn": { "word": "DEGRADED", "tone": "warn", "border": "dashed", "edge": "dash", "motion": "breathe", "bucket": "neutral" }
|
|
392
|
+
},
|
|
393
|
+
"nodes": [
|
|
394
|
+
{ "id": "api-gw", "kind": "card", "lane": "ingress", "state": "nominal", "title": "Kong Gateway" },
|
|
395
|
+
{ "id": "order-svc", "kind": "card", "lane": "app", "state": "nominal", "title": "Order Service", "metrics": { "value": 420, "unit": "rps", "label": "Throughput" } },
|
|
396
|
+
{ "id": "db-cluster", "kind": "group", "lane": "storage", "state": "nominal", "title": "Postgres Cluster", "contains": ["pg-primary", "pg-replica"], "collapsed": true },
|
|
397
|
+
{ "id": "pg-primary", "kind": "card", "lane": "storage", "state": "nominal", "title": "PG Primary" },
|
|
398
|
+
{ "id": "pg-replica", "kind": "card", "lane": "storage", "state": "nominal", "title": "PG Read Replica" }
|
|
399
|
+
],
|
|
400
|
+
"links": [
|
|
401
|
+
{ "id": "l-edge-order", "from": "api-gw", "to": "order-svc", "state": "nominal" },
|
|
402
|
+
{ "id": "l-order-pg", "from": "order-svc", "to": "pg-primary", "state": "nominal" }
|
|
403
|
+
]
|
|
404
|
+
}
|
|
405
|
+
```
|
|
69
406
|
|
|
70
|
-
|
|
71
|
-
entity explorer, access and permission graph, supply chain, learning path or roadmap, network topology. Start from
|
|
72
|
-
recipe 1 or 5 and say they are unproven. When one passes the checks, add its model under `examples/` and change
|
|
73
|
-
"candidate" to "proven" here.
|
|
407
|
+
---
|
|
74
408
|
|
|
75
|
-
##
|
|
409
|
+
## Lane structure guidance
|
|
76
410
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
411
|
+
A lane answers: "who or what owns this row?".
|
|
412
|
+
- Group lanes by owning team, service domain, or architecture tier.
|
|
413
|
+
- Avoid placing all nodes into a single lane; that destroys visual structure.
|
|
414
|
+
- Avoid using more than 10 lanes; group related sub-services instead.
|
|
415
|
+
- If a system has no verifiable document or owner, mark the lane `gap: true` with an explanatory note.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# UX and design rules
|
|
2
|
+
|
|
3
|
+
The 10 rules ensure flow-studio pages remain readable, informative, accessible, and fast.
|
|
4
|
+
|
|
5
|
+
## The 10 rules
|
|
6
|
+
|
|
7
|
+
### 1. One screen
|
|
8
|
+
- **Rule statement:** The full flow fits on one screen without requiring panning in the initial default view.
|
|
9
|
+
- **Rationale:** A user must comprehend the entire topology before diving into specific components.
|
|
10
|
+
- **Pre-flight checklist question:** Did you check that the initial canvas fit scale is between 0.35 and 1.0 at standard desktop viewports (1600x900 and 1280x720)?
|
|
11
|
+
- **Common mistake & fix:** Authoring 80 expanded nodes in 15 lanes so text is unreadable at fit. *Fix:* Group sub-systems into collapsible groups with `contains` and `collapsed: true` to keep initial visible nodes under 30.
|
|
12
|
+
|
|
13
|
+
### 2. Left to right
|
|
14
|
+
- **Rule statement:** Primary flow and time progress left to right, never right to left.
|
|
15
|
+
- **Rationale:** Readers process sequential workflows and dependencies left to right; backward links create cognitive dissonance unless explicitly marked.
|
|
16
|
+
- **Pre-flight checklist question:** Did you check that all forward links connect earlier columns to later columns?
|
|
17
|
+
- **Common mistake & fix:** Drawing a return cycle with a standard forward arrow. *Fix:* Mark backward transitions as `kind: "loop-back"` so the router draws them under or over the main lane bands.
|
|
18
|
+
|
|
19
|
+
### 3. Named states
|
|
20
|
+
- **Rule statement:** States use plain domain words instead of raw enum strings or database codes.
|
|
21
|
+
- **Rationale:** Stakeholders and domain experts should understand node statuses without a translation glossary.
|
|
22
|
+
- **Pre-flight checklist question:** Did you check that state `word` fields display human-readable phrases like `READY`, `ON TIME`, or `DEGRADED` instead of `STATUS_200` or `ERR_412`?
|
|
23
|
+
- **Common mistake & fix:** Exporting raw database enums directly into the model. *Fix:* Map internal enums to friendly words in `states.<id>.word`.
|
|
24
|
+
|
|
25
|
+
### 4. Color carries meaning
|
|
26
|
+
- **Rule statement:** Semantic colors communicate health: green is healthy, amber is warning, red is critical, blue is accent.
|
|
27
|
+
- **Rationale:** Consistent visual coding allows immediate recognition of anomalies across diverse systems.
|
|
28
|
+
- **Pre-flight checklist question:** Did you check that green tones indicate operational health and red tones indicate SLA breaches or defects?
|
|
29
|
+
- **Common mistake & fix:** Styling informational cards with red or critical cards with blue. *Fix:* Use `tone: "ok"` for good, `tone: "warn"` for warning, `tone: "crit"` for critical, and `tone: "accent"` for active selection.
|
|
30
|
+
|
|
31
|
+
### 5. No orphans
|
|
32
|
+
- **Rule statement:** Every node connects to at least one other node unless explicitly marked.
|
|
33
|
+
- **Rationale:** Isolated nodes look like layout bugs or forgotten elements.
|
|
34
|
+
- **Pre-flight checklist question:** Did you check that every card has at least one incoming or outgoing link?
|
|
35
|
+
- **Common mistake & fix:** Forgetting to link an auxiliary service. *Fix:* Connect the service to its callers, or set `allowIsolated: true` if isolation is an intentional design choice.
|
|
36
|
+
|
|
37
|
+
### 6. Honest gaps
|
|
38
|
+
- **Rule statement:** If an architecture layer or data source is unverified, draw a visible gap band rather than guessing.
|
|
39
|
+
- **Rationale:** A diagram that fabricates missing systems causes dangerous production assumptions.
|
|
40
|
+
- **Pre-flight checklist question:** Did you check that undocumented lanes have `gap: true` and an explanatory note?
|
|
41
|
+
- **Common mistake & fix:** Omitting a legacy undocumented system or assuming its structure. *Fix:* Add the lane with `gap: true` and an amber dashed border to prompt clarification.
|
|
42
|
+
|
|
43
|
+
### 7. Inspector on demand
|
|
44
|
+
- **Rule statement:** The inspector side panel slides in on click and is never permanently open.
|
|
45
|
+
- **Rationale:** A permanent side panel robs the canvas of 340px of width and compromises the one-screen overview.
|
|
46
|
+
- **Pre-flight checklist question:** Did you check that the page loads with the inspector closed (`#inspector` hidden)?
|
|
47
|
+
- **Common mistake & fix:** Hardcoding the inspector to be permanently expanded on desktop. *Fix:* Leave `#inspector` closed until a user selects a node or card.
|
|
48
|
+
|
|
49
|
+
### 8. Two clicks to detail
|
|
50
|
+
- **Rule statement:** Any node reveals its upstream dependencies, downstream impact, and telemetry in at most two clicks.
|
|
51
|
+
- **Rationale:** Deep navigation trees frustrate operators during incident investigations.
|
|
52
|
+
- **Pre-flight checklist question:** Did you check that clicking a node opens the inspector, and clicking a relation tab highlights the full related subgraph?
|
|
53
|
+
- **Common mistake & fix:** Burying downstream connections behind nested menus or modal dialogs. *Fix:* Configure `inspector.relations` with `up` and `down` counts right at the top of the inspector.
|
|
54
|
+
|
|
55
|
+
### 9. Motion explains
|
|
56
|
+
- **Rule statement:** Animation represents data transit or status change, never mere cosmetic decoration.
|
|
57
|
+
- **Rationale:** Unnecessary movement distracts users and triggers motion sickness.
|
|
58
|
+
- **Pre-flight checklist question:** Did you check that running animations (`flow`, `breathe`, `failflash`) reflect active scenarios, degradation, or SLA breaches?
|
|
59
|
+
- **Common mistake & fix:** Adding infinite spinning rings to inactive cards. *Fix:* Reserve `animation: flow` for active links, `breathe` for warning cards, and respect `prefers-reduced-motion`.
|
|
60
|
+
|
|
61
|
+
### 10. Dark mode first-class
|
|
62
|
+
- **Rule statement:** Every color token has a manually tuned dark value, not an automatic browser filter inversion.
|
|
63
|
+
- **Rationale:** Inverted canvases distort data colors, destroy contrast, and wash out delicate edge lines.
|
|
64
|
+
- **Pre-flight checklist question:** Did you check that all text and badge contrasts meet WCAG AA (>= 4.5:1) in both light and dark themes?
|
|
65
|
+
- **Common mistake & fix:** Relying on `filter: invert(1)` which turns warning amber into unusable purple. *Fix:* Define distinct semantic variables in `:root[data-theme="dark"]`.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Pre-flight checklist for agents
|
|
70
|
+
|
|
71
|
+
Before presenting a generated flow page, verify:
|
|
72
|
+
1. **Fit:** Open the page in a browser at 1600x900. Does the full diagram fit within the viewport without horizontal scrollbars?
|
|
73
|
+
2. **Zero overlaps:** Ensure zero node-to-node box intersections and zero node-over-lane-title collisions.
|
|
74
|
+
3. **No text truncation:** Do titles fit within card bounds? Are long labels handled with word-break or ellipsis?
|
|
75
|
+
4. **Lane ownership:** Does every row correspond to an identifiable owner, service, or system?
|
|
76
|
+
5. **No dead links:** Does every link id point to existing, valid node ids?
|
|
77
|
+
6. **Accessible names:** Does every button, input, tab, and control have an `aria-label` or visible text?
|
|
78
|
+
7. **Keyboard navigation:** Can a user Tab through controls and press Escape to close the inspector?
|
|
79
|
+
8. **Responsive breakdown:** Does the layout degrade cleanly down to 820x900?
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Common mistakes and fixes
|
|
84
|
+
|
|
85
|
+
- **Orphan nodes:** A node sits with no connecting edges. *Fix:* Add the missing connection or set `allowIsolated: true`.
|
|
86
|
+
- **Unreadable first view:** Diagram has 70 nodes rendered simultaneously. *Fix:* Collapse secondary clusters into groups with `contains: [...]` and `collapsed: true`.
|
|
87
|
+
- **Overlapping lanes:** Free-form node coordinates push nodes into neighboring lane regions. *Fix:* Ensure node Y coordinates plus heights stay within lane boundaries.
|
|
88
|
+
- **Text spill:** Node labels exceed card width. *Fix:* Use short titles (under 24 characters) and set `subtitle` for auxiliary metadata.
|
|
89
|
+
- **Permanent side panel:** The inspector remains open on load. *Fix:* The inspector must start closed and open only on selection.
|
|
90
|
+
- **Flat visual hierarchy:** Every card looks identical. *Fix:* Vary card kinds (`card`, `group`, `gateway`, `chip`) and state tones (`ok`, `warn`, `crit`, `accent`).
|
|
91
|
+
- **Unlabelled controls:** Icon buttons without text lack screen reader descriptions. *Fix:* Provide descriptive `aria-label` attributes on all buttons.
|