@caddis/cli 0.4.44 → 0.4.46
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/scripts/claude-oss.ps1 +15 -3
- package/bundles/antigravity-plugin/scripts/claude-oss.sh +12 -1
- package/bundles/antigravity-plugin/skills/_registry.md +1 -0
- package/bundles/antigravity-plugin/skills/flow-studio/README.md +92 -0
- package/bundles/antigravity-plugin/skills/flow-studio/SKILL.md +102 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/README.md +19 -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/hostile.json +1783 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/incident-timeline.json +109 -0
- package/bundles/antigravity-plugin/skills/flow-studio/examples/lineage.json +1778 -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 +142 -0
- package/bundles/antigravity-plugin/skills/flow-studio/package.json +11 -0
- 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 +169 -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 +415 -0
- 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 +95 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/build.mjs +54 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/check.mjs +680 -0
- 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 +54 -0
- 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 +135 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/cli.test.mjs +179 -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/embed.mjs +24 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/lib/embed.test.mjs +29 -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/react-proof.mjs +92 -0
- package/bundles/antigravity-plugin/skills/flow-studio/scripts/validate.mjs +42 -0
- 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 +175 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/controls.ts +239 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/ctx.ts +134 -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 +193 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/inspector.ts +126 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/interact.ts +253 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/layout.test.ts +144 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/layout.ts +95 -0
- 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 +167 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/model.ts +250 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/notes.ts +100 -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 +203 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/routing.test.ts +33 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/routing.ts +43 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/rules.test.ts +135 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/rules.ts +86 -0
- 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 +73 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/stateCss.ts +45 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/styles.css +190 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/trace.test.ts +40 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/trace.ts +40 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/viewport.test.ts +55 -0
- package/bundles/antigravity-plugin/skills/flow-studio/src/viewport.ts +45 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/engine.html +2656 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/engine.shell.html +23 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/flow-studio.css +190 -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 +2491 -0
- package/bundles/antigravity-plugin/skills/flow-studio/templates/shell-body.html +50 -0
- package/bundles/antigravity-plugin/skills/flow-studio/tsconfig.json +17 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/README.md +92 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/SKILL.md +102 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/README.md +19 -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/hostile.json +1783 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/incident-timeline.json +109 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/examples/lineage.json +1778 -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 +142 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/package.json +11 -0
- 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 +169 -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 +415 -0
- 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 +95 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/build.mjs +54 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/check.mjs +680 -0
- 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 +54 -0
- 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 +135 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/cli.test.mjs +179 -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/embed.mjs +24 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/lib/embed.test.mjs +29 -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/react-proof.mjs +92 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/scripts/validate.mjs +42 -0
- 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 +175 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/controls.ts +239 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/ctx.ts +134 -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 +193 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/inspector.ts +126 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/interact.ts +253 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/layout.test.ts +144 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/layout.ts +95 -0
- 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 +167 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/model.ts +250 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/notes.ts +100 -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 +203 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/routing.test.ts +33 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/routing.ts +43 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/rules.test.ts +135 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/rules.ts +86 -0
- 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 +73 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/stateCss.ts +45 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/styles.css +190 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/trace.test.ts +40 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/trace.ts +40 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/viewport.test.ts +55 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/src/viewport.ts +45 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/engine.html +2656 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/engine.shell.html +23 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/flow-studio.css +190 -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 +2491 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/templates/shell-body.html +50 -0
- package/bundles/codex/.codex/skills/frontend/flow-studio/tsconfig.json +17 -0
- package/bundles/manifest.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
# Scenario recipes
|
|
2
|
+
|
|
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/`.
|
|
5
|
+
|
|
6
|
+
## Common states
|
|
7
|
+
|
|
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
|
+
|---|---|---|---|---|---|---|
|
|
12
|
+
| `ok` | OK | ok | solid | flow | flow | good |
|
|
13
|
+
| `planned` | PLANNED | muted | dashed | dash | flow-slow | neutral |
|
|
14
|
+
| `late` | LATE | warn | solid | flow | flow | neutral |
|
|
15
|
+
| `breached` | BREACHED | crit | solid | flow | flow | gap |
|
|
16
|
+
| `unknown` | NOT RECORDED | warn | dotted | dot | breathe | gap |
|
|
17
|
+
|
|
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
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 4. CI/CD pipeline and release train
|
|
187
|
+
|
|
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:**
|
|
198
|
+
|
|
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
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 5. Approval or business process
|
|
242
|
+
|
|
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:**
|
|
253
|
+
|
|
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
|
+
```
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## 6. Incident timeline and root cause
|
|
298
|
+
|
|
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:**
|
|
309
|
+
|
|
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
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## 7. Service or architecture dependency map
|
|
357
|
+
|
|
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:**
|
|
368
|
+
|
|
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
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## Lane structure guidance
|
|
410
|
+
|
|
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.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Verification harness reference
|
|
2
|
+
|
|
3
|
+
`scripts/check.mjs` is the automated headless browser testing harness for flow-studio pages. It drives Chromium via Playwright, interrogates page geometry and accessibility trees, tests user interactions, and asserts visual and behavioral invariants.
|
|
4
|
+
|
|
5
|
+
## 1. CLI usage and options
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run against a local build
|
|
9
|
+
node scripts/check.mjs out/lineage.html
|
|
10
|
+
|
|
11
|
+
# Run with custom output directory and viewports
|
|
12
|
+
node scripts/check.mjs out/lineage.html --out check-out --viewports 1600x900,1280x720,820x900
|
|
13
|
+
|
|
14
|
+
# Specify browser channel and skip optional groups
|
|
15
|
+
node scripts/check.mjs out/lineage.html --channel msedge --skip notes,playback,update,hostile
|
|
16
|
+
|
|
17
|
+
# Test hostile payload safety
|
|
18
|
+
node scripts/check.mjs out/lineage.html --hostile out/hostile.html --json report.json
|
|
19
|
+
|
|
20
|
+
# Skip performance benchmarking
|
|
21
|
+
node scripts/check.mjs out/lineage.html --skip-perf
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### CLI options
|
|
25
|
+
- `<page.html | URL>`: File path or HTTP URL to the target page.
|
|
26
|
+
- `--out <dir>`: Directory where screenshots and failure captures are saved (default: `check-out`).
|
|
27
|
+
- `--viewports <WxH,...>`: Comma-separated list of test viewports (default: `1600x900,1280x720,820x900`).
|
|
28
|
+
- `--channel <name>`: Browser executable channel (e.g. `msedge`, `chrome`).
|
|
29
|
+
- `--skip <groups>`: Comma-separated list of test groups to skip (`notes`, `playback`, `update`, `hostile`). A skipped group is not a pass: skip one only when the page intentionally omits that feature, and record every skip in your verification notes.
|
|
30
|
+
- `--hostile <file.html>`: Path to hostile test page to assert XSS and injection resistance.
|
|
31
|
+
- `--json <file.json>`: Output machine-readable test results to a JSON report.
|
|
32
|
+
- `--skip-perf`: Omit render and zoom frame timing performance assertions.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 2. Check groups and assertions
|
|
37
|
+
|
|
38
|
+
`scripts/check.mjs` organizes assertions into distinct groups:
|
|
39
|
+
|
|
40
|
+
### 1. `structural`
|
|
41
|
+
Validates that layout geometry satisfies visual clarity:
|
|
42
|
+
- **Zero node-box intersections:** No two node bounding boxes overlap or intersect.
|
|
43
|
+
- **Node inside lane:** Every node sits completely within its designated swimlane boundaries.
|
|
44
|
+
- **No lane overlap:** Swimlanes do not collide vertically.
|
|
45
|
+
- **Links touch node boxes:** Link start points and end points connect cleanly to their endpoint boxes without gaps or overshoots.
|
|
46
|
+
- **Fit shows every node:** Canvas auto-fit places all nodes fully within the visible viewport bounds.
|
|
47
|
+
- **Hidden nodes not painted:** Collapsed or view-filtered nodes have `visibility: hidden` and `opacity: 0`.
|
|
48
|
+
|
|
49
|
+
### 2. `interaction`
|
|
50
|
+
Validates user input, navigation, and state machines:
|
|
51
|
+
- **Wheel zoom & pan:** Canvas zooms centered on the mouse position; zoom is clamped between 0.25x and 2.5x.
|
|
52
|
+
- **Key navigation:** `0` fits canvas, arrow keys pan the viewport, `Escape` clears selection and closes the inspector.
|
|
53
|
+
- **Group expansion / collapse:** Clicking expand/collapse buttons toggles child visibility and updates visible node counts.
|
|
54
|
+
- **Node selection:** Clicking a node selects it, highlights connected edges, and slides open `#inspector`.
|
|
55
|
+
- **N-hop search:** Searching terms highlights matches and dims non-matching nodes; increasing hops expands the lit radius.
|
|
56
|
+
- **What-if simulation:** Clicking what-if buttons cascades simulated failure states through downstream dependents.
|
|
57
|
+
- **View switcher:** Toggling views displays only elements specified in `visibleIn`.
|
|
58
|
+
|
|
59
|
+
### 3. `a11y` (Accessibility)
|
|
60
|
+
Validates compliance with WCAG 2.2 AA standards:
|
|
61
|
+
- **Accessible names:** Every button, input, tab, and control has a non-empty `aria-label` or accessible text name.
|
|
62
|
+
- **Keyboard navigation:** Visible nodes receive focus via Tab; hidden nodes are not reachable via Tab. No keyboard traps.
|
|
63
|
+
- **Focus visibility:** Focused nodes display an active outline.
|
|
64
|
+
- **Contrast ratios:** Normal text has at least 4.5:1 contrast against surface backgrounds in both light and dark themes.
|
|
65
|
+
- **Table view:** An accessible `<table class="sources" id="tbl">` lists all visible graph nodes for screen reader users.
|
|
66
|
+
- **Reduced motion:** `prefers-reduced-motion` disables all transitions and animations, setting edge dashes static.
|
|
67
|
+
|
|
68
|
+
### 4. `safety`
|
|
69
|
+
Validates security against hostile content and network isolation:
|
|
70
|
+
- **No unhandled page errors:** Zero unhandled JavaScript exceptions in the console.
|
|
71
|
+
- **No external network requests:** Zero external HTTP/HTTPS requests (local and standalone execution).
|
|
72
|
+
- **Hostile string escaping:** Malicious HTML (`</script>`, `<img onerror=...>`, Unicode separators) is rendered as plain text without script execution or DOM injection.
|
|
73
|
+
|
|
74
|
+
### 5. `performance`
|
|
75
|
+
Validates responsiveness and frame timing:
|
|
76
|
+
- **First render time:** Initial canvas render of all nodes must complete in under 500 ms.
|
|
77
|
+
- **Frame budget:** 95th percentile wheel event handling time must be under 16 ms (60 fps threshold).
|
|
78
|
+
- **Self-contained bundle size:** Generated single-file HTML pages must stay under 300 KB.
|
|
79
|
+
|
|
80
|
+
### 6. `notes`
|
|
81
|
+
Validates the implementation notes drawer:
|
|
82
|
+
- In notes mode, numbered markers appear for every valid anchor.
|
|
83
|
+
- Hovering and clicking markers coordinates with drawer cards.
|
|
84
|
+
|
|
85
|
+
### 7. `playback`
|
|
86
|
+
Validates scenario animation:
|
|
87
|
+
- Stepping moves the active token along specified links in sequence.
|
|
88
|
+
- Decision gateways show branch choice buttons in step mode.
|
|
89
|
+
- SLA breaches trigger red counter highlighting and failure flash styling.
|
|
90
|
+
|
|
91
|
+
### 8. `update`
|
|
92
|
+
Validates live graph data updates:
|
|
93
|
+
- Calling `FlowStudio.update(newModel)` updates topology while preserving pan, zoom, and active selection.
|
|
94
|
+
- Invalid model updates preserve the previous valid DOM state and render `#banner` error notice.
|
|
95
|
+
|
|
96
|
+
### 9. `hostile`
|
|
97
|
+
Validates adversarial resistance:
|
|
98
|
+
- Ingests `examples/hostile.json` to prove the parser and inspector remain inert against script injection.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 3. Thresholds and limits
|
|
103
|
+
|
|
104
|
+
| Metric / Check | Threshold | Rationale |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| First render duration | `< 500 ms` | Fast initial load experience |
|
|
107
|
+
| Wheel event latency (p95) | `< 16 ms` | Smooth 60fps pan and zoom interaction |
|
|
108
|
+
| Zoom range | `0.25` to `2.5` | Prevents disorientation from extreme zoom levels |
|
|
109
|
+
| Contrast ratio | `>= 4.5:1` | WCAG AA readability in light and dark modes |
|
|
110
|
+
| Node count guideline | `8` to `30` initial visible | Avoids visual clutter in default fit |
|
|
111
|
+
| HTML bundle size | `< 300 KB` | Portable, zero-dependency self-contained distribution |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 4. Reading failures and fixing issues
|
|
116
|
+
|
|
117
|
+
When a check fails, the harness logs:
|
|
118
|
+
```text
|
|
119
|
+
FAIL [structural] 1600x900 zero node-box intersections crm-db/cdc-pipe
|
|
120
|
+
```
|
|
121
|
+
1. **Identify the group and viewport:** Here, `structural` at `1600x900`.
|
|
122
|
+
2. **Read the detail payload:** The detail string lists the offending nodes (`crm-db` and `cdc-pipe`).
|
|
123
|
+
3. **Inspect the screenshot:** Open `check-out/01-fit-1600x900.png` to inspect the visual collision.
|
|
124
|
+
4. **Apply the fix:** Adjust the column width or node row/slot positions in `model.json`, then re-run `node scripts/check.mjs`.
|