scrum-skills 0.3.2 → 0.3.3
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/.agents/skills/diagram-design/LICENSE +4 -0
- package/.agents/skills/diagram-design/SKILL.md +413 -0
- package/.agents/skills/diagram-design/UPSTREAM.json +76 -0
- package/.agents/skills/diagram-design/UPSTREAM.md +23 -0
- package/.agents/skills/diagram-design/assets/example-architecture-containment.html +205 -0
- package/.agents/skills/diagram-design/assets/example-architecture-delta.html +193 -0
- package/.agents/skills/diagram-design/assets/example-architecture.html +183 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-campus.html +108 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-coffee-shop.html +121 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan-warehouse.html +127 -0
- package/.agents/skills/diagram-design/assets/example-axonometric-plan.html +114 -0
- package/.agents/skills/diagram-design/assets/example-bar.html +129 -0
- package/.agents/skills/diagram-design/assets/example-beeswarm.html +384 -0
- package/.agents/skills/diagram-design/assets/example-box-plot.html +127 -0
- package/.agents/skills/diagram-design/assets/example-bubble.html +147 -0
- package/.agents/skills/diagram-design/assets/example-bump.html +142 -0
- package/.agents/skills/diagram-design/assets/example-data-flow.html +143 -0
- package/.agents/skills/diagram-design/assets/example-datalake.html +269 -0
- package/.agents/skills/diagram-design/assets/example-db-schema.html +302 -0
- package/.agents/skills/diagram-design/assets/example-dependency.html +224 -0
- package/.agents/skills/diagram-design/assets/example-deployment.html +190 -0
- package/.agents/skills/diagram-design/assets/example-dp-integration.html +81 -0
- package/.agents/skills/diagram-design/assets/example-dp-security-matrix.html +88 -0
- package/.agents/skills/diagram-design/assets/example-er.html +202 -0
- package/.agents/skills/diagram-design/assets/example-exploded-ai-stack.html +85 -0
- package/.agents/skills/diagram-design/assets/example-exploded-keyboard.html +84 -0
- package/.agents/skills/diagram-design/assets/example-exploded-phone.html +83 -0
- package/.agents/skills/diagram-design/assets/example-exploded-unboxing.html +84 -0
- package/.agents/skills/diagram-design/assets/example-exploded.html +83 -0
- package/.agents/skills/diagram-design/assets/example-fishbone.html +152 -0
- package/.agents/skills/diagram-design/assets/example-flowchart.html +163 -0
- package/.agents/skills/diagram-design/assets/example-gantt.html +137 -0
- package/.agents/skills/diagram-design/assets/example-heatmap.html +224 -0
- package/.agents/skills/diagram-design/assets/example-high-level-vertical.html +325 -0
- package/.agents/skills/diagram-design/assets/example-high-level.html +301 -0
- package/.agents/skills/diagram-design/assets/example-import-drawio.html +185 -0
- package/.agents/skills/diagram-design/assets/example-import-excalidraw.html +70 -0
- package/.agents/skills/diagram-design/assets/example-import-mermaid.html +70 -0
- package/.agents/skills/diagram-design/assets/example-it-state.html +128 -0
- package/.agents/skills/diagram-design/assets/example-journey.html +148 -0
- package/.agents/skills/diagram-design/assets/example-kanban.html +174 -0
- package/.agents/skills/diagram-design/assets/example-layers.html +123 -0
- package/.agents/skills/diagram-design/assets/example-line.html +111 -0
- package/.agents/skills/diagram-design/assets/example-loop.html +100 -0
- package/.agents/skills/diagram-design/assets/example-marimekko.html +148 -0
- package/.agents/skills/diagram-design/assets/example-medallion.html +159 -0
- package/.agents/skills/diagram-design/assets/example-nested.html +136 -0
- package/.agents/skills/diagram-design/assets/example-org-chart.html +45 -0
- package/.agents/skills/diagram-design/assets/example-polar.html +116 -0
- package/.agents/skills/diagram-design/assets/example-process.html +64 -0
- package/.agents/skills/diagram-design/assets/example-pyramid.html +119 -0
- package/.agents/skills/diagram-design/assets/example-quadrant-consultant.html +166 -0
- package/.agents/skills/diagram-design/assets/example-quadrant.html +135 -0
- package/.agents/skills/diagram-design/assets/example-radar.html +139 -0
- package/.agents/skills/diagram-design/assets/example-ridgeline.html +104 -0
- package/.agents/skills/diagram-design/assets/example-sankey.html +150 -0
- package/.agents/skills/diagram-design/assets/example-scatter.html +141 -0
- package/.agents/skills/diagram-design/assets/example-sequence-oauth.html +227 -0
- package/.agents/skills/diagram-design/assets/example-sequence.html +222 -0
- package/.agents/skills/diagram-design/assets/example-service-blueprint.html +185 -0
- package/.agents/skills/diagram-design/assets/example-slopegraph.html +119 -0
- package/.agents/skills/diagram-design/assets/example-state-lifecycle.html +92 -0
- package/.agents/skills/diagram-design/assets/example-state.html +147 -0
- package/.agents/skills/diagram-design/assets/example-story-map.html +184 -0
- package/.agents/skills/diagram-design/assets/example-streamgraph.html +99 -0
- package/.agents/skills/diagram-design/assets/example-swimlane.html +172 -0
- package/.agents/skills/diagram-design/assets/example-timeline.html +135 -0
- package/.agents/skills/diagram-design/assets/example-tree-block-decomposition.html +151 -0
- package/.agents/skills/diagram-design/assets/example-tree.html +173 -0
- package/.agents/skills/diagram-design/assets/example-treemap.html +107 -0
- package/.agents/skills/diagram-design/assets/example-uml-class.html +188 -0
- package/.agents/skills/diagram-design/assets/example-venn.html +110 -0
- package/.agents/skills/diagram-design/assets/example-wardley.html +153 -0
- package/.agents/skills/diagram-design/assets/example-waterfall.html +129 -0
- package/.agents/skills/diagram-design/assets/template-dark.html +99 -0
- package/.agents/skills/diagram-design/assets/template-full.html +421 -0
- package/.agents/skills/diagram-design/assets/template-motion.html +448 -0
- package/.agents/skills/diagram-design/assets/template-terminal.html +188 -0
- package/.agents/skills/diagram-design/assets/template.html +100 -0
- package/.agents/skills/diagram-design/references/animation.md +143 -0
- package/.agents/skills/diagram-design/references/export-registry.md +78 -0
- package/.agents/skills/diagram-design/references/export.md +376 -0
- package/.agents/skills/diagram-design/references/import-drawio.md +181 -0
- package/.agents/skills/diagram-design/references/import-excalidraw.md +130 -0
- package/.agents/skills/diagram-design/references/import-mermaid.md +137 -0
- package/.agents/skills/diagram-design/references/layout-budget.md +97 -0
- package/.agents/skills/diagram-design/references/onboarding.md +368 -0
- package/.agents/skills/diagram-design/references/output-spec.md +277 -0
- package/.agents/skills/diagram-design/references/primitive-annotation.md +36 -0
- package/.agents/skills/diagram-design/references/primitive-icons.md +827 -0
- package/.agents/skills/diagram-design/references/primitive-sketchy.md +43 -0
- package/.agents/skills/diagram-design/references/primitive-terminal.md +76 -0
- package/.agents/skills/diagram-design/references/primitives-core.md +146 -0
- package/.agents/skills/diagram-design/references/profiles.md +183 -0
- package/.agents/skills/diagram-design/references/semantic-patterns.md +154 -0
- package/.agents/skills/diagram-design/references/style-guide.md +236 -0
- package/.agents/skills/diagram-design/references/style-vivid.md +148 -0
- package/.agents/skills/diagram-design/references/type-architecture-delta.md +143 -0
- package/.agents/skills/diagram-design/references/type-architecture.md +117 -0
- package/.agents/skills/diagram-design/references/type-axonometric-plan.md +83 -0
- package/.agents/skills/diagram-design/references/type-bar.md +108 -0
- package/.agents/skills/diagram-design/references/type-data-flow.md +371 -0
- package/.agents/skills/diagram-design/references/type-db-schema.md +48 -0
- package/.agents/skills/diagram-design/references/type-dependency.md +44 -0
- package/.agents/skills/diagram-design/references/type-deployment.md +45 -0
- package/.agents/skills/diagram-design/references/type-dp-integration.md +407 -0
- package/.agents/skills/diagram-design/references/type-dp-security-matrix.md +379 -0
- package/.agents/skills/diagram-design/references/type-er.md +25 -0
- package/.agents/skills/diagram-design/references/type-exploded.md +115 -0
- package/.agents/skills/diagram-design/references/type-fishbone.md +75 -0
- package/.agents/skills/diagram-design/references/type-flowchart.md +23 -0
- package/.agents/skills/diagram-design/references/type-gantt.md +45 -0
- package/.agents/skills/diagram-design/references/type-heatmap.md +80 -0
- package/.agents/skills/diagram-design/references/type-high-level.md +470 -0
- package/.agents/skills/diagram-design/references/type-it-state.md +468 -0
- package/.agents/skills/diagram-design/references/type-journey.md +55 -0
- package/.agents/skills/diagram-design/references/type-kanban.md +49 -0
- package/.agents/skills/diagram-design/references/type-layers.md +26 -0
- package/.agents/skills/diagram-design/references/type-line.md +337 -0
- package/.agents/skills/diagram-design/references/type-loop.md +223 -0
- package/.agents/skills/diagram-design/references/type-medallion.md +356 -0
- package/.agents/skills/diagram-design/references/type-nested.md +22 -0
- package/.agents/skills/diagram-design/references/type-org-chart.md +44 -0
- package/.agents/skills/diagram-design/references/type-polar.md +136 -0
- package/.agents/skills/diagram-design/references/type-process.md +490 -0
- package/.agents/skills/diagram-design/references/type-pyramid.md +33 -0
- package/.agents/skills/diagram-design/references/type-quadrant.md +81 -0
- package/.agents/skills/diagram-design/references/type-radar.md +82 -0
- package/.agents/skills/diagram-design/references/type-sankey.md +75 -0
- package/.agents/skills/diagram-design/references/type-scatter.md +276 -0
- package/.agents/skills/diagram-design/references/type-sequence.md +130 -0
- package/.agents/skills/diagram-design/references/type-service-blueprint.md +103 -0
- package/.agents/skills/diagram-design/references/type-state.md +30 -0
- package/.agents/skills/diagram-design/references/type-story-map.md +46 -0
- package/.agents/skills/diagram-design/references/type-swimlane.md +22 -0
- package/.agents/skills/diagram-design/references/type-timeline.md +20 -0
- package/.agents/skills/diagram-design/references/type-tree.md +24 -0
- package/.agents/skills/diagram-design/references/type-treemap.md +137 -0
- package/.agents/skills/diagram-design/references/type-uml-class.md +65 -0
- package/.agents/skills/diagram-design/references/type-venn.md +26 -0
- package/.agents/skills/diagram-design/references/type-wardley.md +39 -0
- package/.agents/skills/diagram-design/references/type-waterfall.md +75 -0
- package/.agents/skills/scrum-meta/SKILL.md +36 -36
- package/.agents/skills/scrum-planning/SKILL.md +61 -61
- package/.agents/skills/scrum-planning/references/schema.md +384 -336
- package/.agents/skills/scrum-report/SKILL.md +42 -42
- package/.agents/skills/scrum-sprint/SKILL.md +49 -49
- package/.agents/skills/scrum-tdd/SKILL.md +140 -127
- package/README.md +224 -201
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/1XlYaCp9.js +1 -0
- package/assets/board/_nuxt/4gQF_HS3.js +1 -0
- package/assets/board/_nuxt/5okfNy5D.js +1 -0
- package/assets/board/_nuxt/{Bb3Limos.js → B0C2jsdk.js} +1 -1
- package/assets/board/_nuxt/B1j6UC4U.js +1 -0
- package/assets/board/_nuxt/B3LKy6o2.js +1 -0
- package/assets/board/_nuxt/BAQQngAq.js +13 -0
- package/assets/board/_nuxt/BE6t7Q2m.js +1 -0
- package/assets/board/_nuxt/BLvbupFS.js +1 -0
- package/assets/board/_nuxt/BQgzP7ur.js +1 -0
- package/assets/board/_nuxt/BRZIF_wo.js +1 -0
- package/assets/board/_nuxt/BW3xJdEx.js +1 -0
- package/assets/board/_nuxt/{Cm9lkUvP.js → BY36DFyj.js} +1 -1
- package/assets/board/_nuxt/BZlZD94i.js +1 -0
- package/assets/board/_nuxt/BZvXNwev.js +3 -0
- package/assets/board/_nuxt/BbxmvdIF.js +1 -0
- package/assets/board/_nuxt/BiWrMOsL.js +1 -0
- package/assets/board/_nuxt/BizDeOK5.js +1 -0
- package/assets/board/_nuxt/BkcaOYQ_.js +95 -0
- package/assets/board/_nuxt/BkoKCNUY.js +1 -0
- package/assets/board/_nuxt/BlKmZhhF.js +1 -0
- package/assets/board/_nuxt/BmBpmU73.js +1 -0
- package/assets/board/_nuxt/BrWE0up6.js +1 -0
- package/assets/board/_nuxt/Bs52qkgk.js +1 -0
- package/assets/board/_nuxt/BtzUbHO_.js +1 -0
- package/assets/board/_nuxt/BuBzMkFZ.js +1 -0
- package/assets/board/_nuxt/Bubk0xn-.js +1 -0
- package/assets/board/_nuxt/BxuBMtk_.js +3 -0
- package/assets/board/_nuxt/By1KXXLR.js +1 -0
- package/assets/board/_nuxt/BygIGL69.js +2 -0
- package/assets/board/_nuxt/C1iO5KH3.js +1 -0
- package/assets/board/_nuxt/C2YPmTzt.js +1 -0
- package/assets/board/_nuxt/C3SpAhCW.js +1 -0
- package/assets/board/_nuxt/C3ZRWz5L.js +1 -0
- package/assets/board/_nuxt/C4WdPP6K.js +1 -0
- package/assets/board/_nuxt/C6o03JHe.js +1 -0
- package/assets/board/_nuxt/C8qB5llI.js +1 -0
- package/assets/board/_nuxt/C9MgRdhu.js +1 -0
- package/assets/board/_nuxt/CCA81-4P.js +1 -0
- package/assets/board/_nuxt/{D2O8Q8x9.js → CFCM18fF.js} +1 -1
- package/assets/board/_nuxt/CGXljzd_.js +1 -0
- package/assets/board/_nuxt/CI0scS-N.js +1 -0
- package/assets/board/_nuxt/CJs9B42o.js +1 -0
- package/assets/board/_nuxt/COecDWbb.js +1 -0
- package/assets/board/_nuxt/COmtTtfB.js +1 -0
- package/assets/board/_nuxt/CPYm4J_K.js +1 -0
- package/assets/board/_nuxt/CReA4TEB.js +3 -0
- package/assets/board/_nuxt/CXG7GZes.js +1 -0
- package/assets/board/_nuxt/CYGiZn-X.js +1 -0
- package/assets/board/_nuxt/CaE8VlUp.js +1 -0
- package/assets/board/_nuxt/CcGiNUgA.js +1 -0
- package/assets/board/_nuxt/Ccgv3lDj.js +1 -0
- package/assets/board/_nuxt/CdPGFZyy.js +1 -0
- package/assets/board/_nuxt/{DfR3IZN_.js → Cdf_T8Xa.js} +1 -1
- package/assets/board/_nuxt/CgQ30j_6.js +1 -0
- package/assets/board/_nuxt/ChUHb39z.js +1 -0
- package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
- package/assets/board/_nuxt/CkWKLtjO.js +1 -0
- package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
- package/assets/board/_nuxt/CtFknnHZ.js +1 -0
- package/assets/board/_nuxt/D166WVUG.js +1 -0
- package/assets/board/_nuxt/D4Dpzo9e.js +1 -0
- package/assets/board/_nuxt/D5i92OZO.js +1 -0
- package/assets/board/_nuxt/D6dUp4Nm.js +9 -0
- package/assets/board/_nuxt/DFQDFspC.js +1 -0
- package/assets/board/_nuxt/DHX2tw9J.js +1 -0
- package/assets/board/_nuxt/DJM7u8P3.js +1 -0
- package/assets/board/_nuxt/{BPTrRhcw.js → DLr85ebo.js} +1 -1
- package/assets/board/_nuxt/DOMM1wfl.js +1 -0
- package/assets/board/_nuxt/DU6ArlUN.js +1 -0
- package/assets/board/_nuxt/{B_SlFcWp.js → DUgGsde6.js} +1 -1
- package/assets/board/_nuxt/DV4ti-Pq.js +1 -0
- package/assets/board/_nuxt/DZ--fXuU.js +1 -0
- package/assets/board/_nuxt/D_ct-Stz.js +2 -0
- package/assets/board/_nuxt/DbWAComO.js +1 -0
- package/assets/board/_nuxt/DbwlcHAt.js +1 -0
- package/assets/board/_nuxt/DjzLR9Bl.js +1 -0
- package/assets/board/_nuxt/Dki9VkAL.js +3 -0
- package/assets/board/_nuxt/DlNJhOoc.js +1 -0
- package/assets/board/_nuxt/DqG7CtD4.js +1 -0
- package/assets/board/_nuxt/DqUSsCJ2.js +1 -0
- package/assets/board/_nuxt/Du2F4WXh.js +1 -0
- package/assets/board/_nuxt/DuRiEXn4.js +1 -0
- package/assets/board/_nuxt/DxBwVNyP.js +2 -0
- package/assets/board/_nuxt/DzmVW5-D.js +1 -0
- package/assets/board/_nuxt/I-sGtDIB.js +6 -0
- package/assets/board/_nuxt/JU9-x68N.js +1 -0
- package/assets/board/_nuxt/Lozm7hhE.js +1 -0
- package/assets/board/_nuxt/MMsTMkcB.js +1 -0
- package/assets/board/_nuxt/MS7CGmCB.js +1 -0
- package/assets/board/_nuxt/OKKaKILz.js +1 -0
- package/assets/board/_nuxt/{Csqgy925.js → P6qlvBHA.js} +1 -1
- package/assets/board/_nuxt/SrNUvNwO.js +1 -0
- package/assets/board/_nuxt/{DSaWoFHS.js → SywdkA98.js} +1 -1
- package/assets/board/_nuxt/TBIRpVLG.js +1 -0
- package/assets/board/_nuxt/TlTrMIMm.js +1 -0
- package/assets/board/_nuxt/Zv9-SOQF.js +1 -0
- package/assets/board/_nuxt/_id_.ItzoSaBL.css +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/2218461a-f45b-41d6-ae44-b0d2332a9511.json +1 -0
- package/assets/board/_nuxt/burndown.CT8fx1Ge.css +1 -0
- package/assets/board/_nuxt/diagrams.D1ybqBem.css +1 -0
- package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BCuHiFgF.css} +1 -1
- package/assets/board/_nuxt/epics.CUeDIEa0.css +1 -0
- package/assets/board/_nuxt/error-404.Y9imKiDC.css +1 -0
- package/assets/board/_nuxt/error-500.DufSBGVC.css +1 -0
- package/assets/board/_nuxt/gantt.CiC2Ts1t.css +1 -0
- package/assets/board/_nuxt/jbri6q1p.js +1 -0
- package/assets/board/_nuxt/last-change.C05Vc3BF.css +1 -0
- package/assets/board/_nuxt/milestones.Civ3sMiQ.css +1 -0
- package/assets/board/_nuxt/oSJF4yHw.js +1 -0
- package/assets/board/_nuxt/pages.BshWbOyo.css +1 -0
- package/assets/board/_nuxt/q_8bxRMt.js +1 -0
- package/assets/board/_nuxt/tests.Ci9fBCka.css +1 -0
- package/assets/board/burndown/index.html +1 -1
- package/assets/board/diagrams/index.html +1 -0
- package/assets/board/epics/index.html +1 -1
- package/assets/board/favicon.svg +16 -16
- package/assets/board/gantt/index.html +1 -1
- package/assets/board/index.html +1 -1
- package/assets/board/last-change/index.html +1 -1
- package/assets/board/milestones/index.html +1 -1
- package/assets/board/tests/index.html +1 -1
- package/bin/scrum-skills.mjs +204 -191
- package/docs/ai-assistant-guide.md +1008 -1008
- package/package.json +42 -41
- package/templates/AGENTS.md +84 -74
- package/tools/agile-tools.mjs +510 -510
- package/tools/ai.mjs +464 -464
- package/tools/diagram-import.mjs +238 -0
- package/tools/diagram-lint.mjs +518 -0
- package/tools/diagram.mjs +299 -0
- package/tools/git-commit.mjs +216 -216
- package/tools/last-change.mjs +326 -326
- package/tools/projects.mjs +240 -215
- package/tools/serve.mjs +180 -154
- package/tools/validate.mjs +781 -664
- package/assets/board/_nuxt/1eqboJxR.js +0 -1
- package/assets/board/_nuxt/2K7ag6ES.js +0 -1
- package/assets/board/_nuxt/51OWHj8c.js +0 -2
- package/assets/board/_nuxt/6gFtTBwm.js +0 -1
- package/assets/board/_nuxt/B3jkABw9.js +0 -1
- package/assets/board/_nuxt/B5n2_jZN.js +0 -1
- package/assets/board/_nuxt/BDK2Hj7B.js +0 -1
- package/assets/board/_nuxt/BDcnzXHq.js +0 -1
- package/assets/board/_nuxt/BaG8y0Wt.js +0 -1
- package/assets/board/_nuxt/BbwJq5pb.js +0 -1
- package/assets/board/_nuxt/BgLeKwx0.js +0 -1
- package/assets/board/_nuxt/Bi9Axj3V.js +0 -1
- package/assets/board/_nuxt/BmxvtaMq.js +0 -1
- package/assets/board/_nuxt/BodFvto3.js +0 -1
- package/assets/board/_nuxt/BpWeHLuN.js +0 -1
- package/assets/board/_nuxt/BuOKDFiJ.js +0 -1
- package/assets/board/_nuxt/C40iTe-x.js +0 -1
- package/assets/board/_nuxt/C7K0R7F-.js +0 -2
- package/assets/board/_nuxt/C8vL692X.js +0 -1
- package/assets/board/_nuxt/C9StZL3D.js +0 -3
- package/assets/board/_nuxt/CGI_ZV79.js +0 -1
- package/assets/board/_nuxt/CJ2mz0WY.js +0 -1
- package/assets/board/_nuxt/CJMBJQuf.js +0 -1
- package/assets/board/_nuxt/CK-lOYG9.js +0 -1
- package/assets/board/_nuxt/CK9_veoz.js +0 -1
- package/assets/board/_nuxt/CLBcBrYf.js +0 -1
- package/assets/board/_nuxt/CMUi2-Lj.js +0 -1
- package/assets/board/_nuxt/COf6E6h4.js +0 -1
- package/assets/board/_nuxt/CPCUMJnF.js +0 -1
- package/assets/board/_nuxt/CPcKlmSm.js +0 -1
- package/assets/board/_nuxt/CQTvWh4i.js +0 -1
- package/assets/board/_nuxt/CSEEUF8S.js +0 -1
- package/assets/board/_nuxt/CSSb154I.js +0 -13
- package/assets/board/_nuxt/CgDTd7jS.js +0 -1
- package/assets/board/_nuxt/ChG76uh9.js +0 -1
- package/assets/board/_nuxt/Ci0qbkgh.js +0 -1
- package/assets/board/_nuxt/CqoQ__I_.js +0 -1
- package/assets/board/_nuxt/CuJUHLl8.js +0 -1
- package/assets/board/_nuxt/CvLiA4_O.js +0 -1
- package/assets/board/_nuxt/Cvs12oA0.js +0 -3
- package/assets/board/_nuxt/CyEXFe3V.js +0 -1
- package/assets/board/_nuxt/Cz6rZcLK.js +0 -1
- package/assets/board/_nuxt/D2FhHl1o.js +0 -1
- package/assets/board/_nuxt/D3YCAmfu.js +0 -1
- package/assets/board/_nuxt/D5CE81jK.js +0 -1
- package/assets/board/_nuxt/D75vbfSb.js +0 -1
- package/assets/board/_nuxt/D99LbGfb.js +0 -9
- package/assets/board/_nuxt/DEfLc7p3.js +0 -6
- package/assets/board/_nuxt/DF-nsa1Z.js +0 -1
- package/assets/board/_nuxt/DIc8yx98.js +0 -1
- package/assets/board/_nuxt/DLkAKotw.js +0 -1
- package/assets/board/_nuxt/DRPlYvb3.js +0 -1
- package/assets/board/_nuxt/DRlQgul3.js +0 -1
- package/assets/board/_nuxt/DSLbmoWa.js +0 -1
- package/assets/board/_nuxt/DWO9c9yp.js +0 -1
- package/assets/board/_nuxt/DZo3dYLJ.js +0 -3
- package/assets/board/_nuxt/D_S6N7_b.js +0 -1
- package/assets/board/_nuxt/DajA-Tkt.js +0 -1
- package/assets/board/_nuxt/DbHiyab-.js +0 -1
- package/assets/board/_nuxt/Dc7Ql6eE.js +0 -1
- package/assets/board/_nuxt/Dd9ZukPU.js +0 -1
- package/assets/board/_nuxt/Dg2LiqmN.js +0 -1
- package/assets/board/_nuxt/DhuleNnm.js +0 -1
- package/assets/board/_nuxt/DkI1Qxpp.js +0 -95
- package/assets/board/_nuxt/DnDHGSYI.js +0 -1
- package/assets/board/_nuxt/DpXJ_tCU.js +0 -1
- package/assets/board/_nuxt/DqZgF3hU.js +0 -1
- package/assets/board/_nuxt/DqcxvfbD.js +0 -1
- package/assets/board/_nuxt/DsA2lVci.js +0 -1
- package/assets/board/_nuxt/Dtsa-1NS.js +0 -1
- package/assets/board/_nuxt/Du91iq0p.js +0 -1
- package/assets/board/_nuxt/Dx1wcYFo.js +0 -1
- package/assets/board/_nuxt/EYTShbt4.js +0 -1
- package/assets/board/_nuxt/MaXJprwN.js +0 -1
- package/assets/board/_nuxt/P9x67aq2.js +0 -1
- package/assets/board/_nuxt/S08nFESZ.js +0 -3
- package/assets/board/_nuxt/V0uynWE2.js +0 -1
- package/assets/board/_nuxt/Vo4wMbnS.js +0 -1
- package/assets/board/_nuxt/ZVTqot-_.js +0 -1
- package/assets/board/_nuxt/ZngEd3HB.js +0 -1
- package/assets/board/_nuxt/_id_.B2NDKSlX.css +0 -1
- package/assets/board/_nuxt/assMu_Wn.js +0 -1
- package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +0 -1
- package/assets/board/_nuxt/burndown.Do6IbM6o.css +0 -1
- package/assets/board/_nuxt/epics.Dmessplu.css +0 -1
- package/assets/board/_nuxt/error-404.BFmXOnCT.css +0 -1
- package/assets/board/_nuxt/error-500.BZ-DdjQ6.css +0 -1
- package/assets/board/_nuxt/gantt.Dmp00GUo.css +0 -1
- package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
- package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
- package/assets/board/_nuxt/pages.Dbj2IVk8.css +0 -1
- package/assets/board/_nuxt/rlePnzpc.js +0 -1
- package/assets/board/_nuxt/tests.dXlUX16A.css +0 -1
- package/assets/board/_nuxt/uKzCKCTq.js +0 -1
- package/assets/board/_nuxt/vwxaNGfc.js +0 -1
- package/assets/board/_nuxt/yh6sf_D5.js +0 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# IT current-state
|
|
2
|
+
|
|
3
|
+
**Best for:** documenting the *before* picture of a modernization proposal — the legacy IT landscape grouped by phase or department (Collection → Processing → Dissemination, or Frontend / Backend / Storage, or Survey → Analysts → Reports), with pain-points flagged, file-based hand-offs labelled (CSV / Excel / Email / Copy), and pre-platform tooling visible. The companion to `type-dp-integration.md`: this type shows the gap that a data-platform proposal is going to close.
|
|
4
|
+
|
|
5
|
+
Use when stakeholders need to see the friction in the current setup — siloed scripts, manual file shuffles, missing version control, single-points-of-failure — and the path from those to a target platform topology.
|
|
6
|
+
|
|
7
|
+
This type is **parametric** — the inputs schema in §1 drives every coordinate via the formulas in §2. The rule shape mirrors `type-dp-integration.md` (zones + cross-cutting footer bars), `type-process.md` (rounded right-angle connectors), and `type-medallion.md` (per-element `color` override) so the focal rule, color override, dark mode, and reproducibility checklist read identically across types.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Inputs — the parameter contract
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
title: "Current IT Landscape"
|
|
15
|
+
subtitle: "Data pipeline before the platform"
|
|
16
|
+
eyebrow: "NatStat · Before the platform"
|
|
17
|
+
|
|
18
|
+
orientation: horizontal # horizontal (default, zones L→R) | vertical (zones T→B)
|
|
19
|
+
|
|
20
|
+
zones: # 2..4 zones, ordered along the orientation axis
|
|
21
|
+
- name: "COLLECTION"
|
|
22
|
+
components: # 1..5 components per zone
|
|
23
|
+
- id: survey-solutions
|
|
24
|
+
name: "Survey Solutions"
|
|
25
|
+
sub: "CAPI · PostgreSQL"
|
|
26
|
+
icon: postgres # any id from references/primitive-icons.md
|
|
27
|
+
kind: standard # standard | focal | external (external → dashed stroke)
|
|
28
|
+
- { id: aspnet, name: "ASP.NET Apps", sub: "migration · admin portals", icon: server }
|
|
29
|
+
- { id: civil-reg, name: "Civil Registry", sub: "external · CRVS data", icon: database, kind: external }
|
|
30
|
+
- name: "PROCESSING"
|
|
31
|
+
components:
|
|
32
|
+
- { id: shared-drive, name: "Shared Drive", sub: "No version control · Windows file share", icon: file, kind: focal }
|
|
33
|
+
- { id: analyst-mach, name: "Analyst Machines", sub: "SPSS · SAS · Stata · Excel", icon: desktop }
|
|
34
|
+
- { id: sql-server, name: "SQL Server", sub: "on-premises · core RDBMS", icon: sqlserver, color: "#7a8c47" } # custom olive
|
|
35
|
+
- name: "DISSEMINATION"
|
|
36
|
+
components:
|
|
37
|
+
- { id: legacy-portal, name: "LegacyPortal", sub: "manual bottleneck", icon: cloud, kind: focal }
|
|
38
|
+
- { id: natstat-website, name: "NatStat Website", sub: "public · static pages", icon: internet }
|
|
39
|
+
- { id: ministry, name: "Ministry Partners", sub: "~6 ministries", icon: users, kind: external }
|
|
40
|
+
|
|
41
|
+
connectors: # ordered list; each links two component ids
|
|
42
|
+
- { from: survey-solutions, to: shared-drive, label: "CSV", icon: csv, style: link }
|
|
43
|
+
- { from: aspnet, to: shared-drive, label: "EMAIL", icon: file, style: link } # `mail` MISSING in catalog → falls back to `file`
|
|
44
|
+
- { from: civil-reg, to: shared-drive, label: "EXCEL", icon: excel, style: link, dashed: true }
|
|
45
|
+
- { from: shared-drive, to: analyst-mach, label: "COPY", style: accent, dashed: true }
|
|
46
|
+
- { from: analyst-mach, to: sql-server, label: "LOAD", style: neutral }
|
|
47
|
+
- { from: analyst-mach, to: legacy-portal, label: "EXCEL", icon: excel, style: accent }
|
|
48
|
+
- { from: legacy-portal, to: natstat-website, label: "WEB", style: neutral }
|
|
49
|
+
- { from: natstat-website, to: ministry, label: "CSV DL", icon: csv, style: link, dashed: true }
|
|
50
|
+
|
|
51
|
+
footer: # 0..3 optional full-canvas-width bars (cross-cutting concerns)
|
|
52
|
+
- { name: "Identity Manager", sub: "Active Directory · LDAP · SSO", icon: active-directory }
|
|
53
|
+
- { name: "Observability", sub: "logs · metrics · alerts", icon: monitoring }
|
|
54
|
+
|
|
55
|
+
legend: # auto-generated from styles used; user can override labels
|
|
56
|
+
- { swatch: link, label: "data flow" }
|
|
57
|
+
- { swatch: accent, label: "pain-point" }
|
|
58
|
+
- { swatch: dashed, label: "external" }
|
|
59
|
+
- { swatch: focal, label: "bottleneck" }
|
|
60
|
+
|
|
61
|
+
dark: false
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Reserved field semantics:**
|
|
65
|
+
|
|
66
|
+
- `orientation` — `horizontal` (zones run L→R, components stack vertically inside each zone) or `vertical` (zones stack T→B, components run L→R inside each zone).
|
|
67
|
+
- `zones[i].name` — uppercase short label (≤ 14 chars). Rendered at the top-left of the zone box in the `eyebrow` role with letter-spacing 0.14em, on a paper-masked break in the zone border.
|
|
68
|
+
- `components[i][k].id` — globally unique slug; referenced by `connectors[].from/to`.
|
|
69
|
+
- `components[i][k].name` — `node-name` role (the human-readable label).
|
|
70
|
+
- `components[i][k].sub` — `sublabel` role at 10px in muted (the technical sub-label; up to 2 lines via auto-wrap when component height grows to 72).
|
|
71
|
+
- `components[i][k].icon` — any id from `references/primitive-icons.md`. If missing → no icon, the name shifts left. (Catalog has 41 icons; `mail` is currently missing — use `icon: file` as fallback for email hand-offs.)
|
|
72
|
+
- `components[i][k].kind` — `standard | focal | external`. `focal` triggers the accent palette (§5); `external` switches to a 4-2 dashed stroke and muted ink to signal "this is outside our scope."
|
|
73
|
+
- `components[i][k].color` — optional per-component color override (§4). Ignored on `kind: focal` (accent wins).
|
|
74
|
+
- `connectors[k].from` / `connectors[k].to` — refer to a component `id`. Cross-zone, cross-row, same-zone vertical, and same-zone horizontal all legal; routing chosen by §3.
|
|
75
|
+
- `connectors[k].label` — uppercase short text (≤ 8 chars). `arrow-label` role at 9px, weight 600.
|
|
76
|
+
- `connectors[k].icon` — optional inline icon to the left of the text. Same catalog as component icons.
|
|
77
|
+
- `connectors[k].style` — `neutral | link | accent`. Drives stroke color + marker.
|
|
78
|
+
- `connectors[k].dashed` — `true | false`.
|
|
79
|
+
- `footer[k]` — optional cross-cutting bar. Spans full canvas width minus margins. No connectors drawn from a footer.
|
|
80
|
+
- `legend[k].swatch` — `link | accent | dashed | focal | neutral`. Auto-curated based on what the diagram actually uses; user can re-order or rename.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 2. Layout formulas — deterministic geometry
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
# Horizontal orientation (default)
|
|
88
|
+
left_pad = 16
|
|
89
|
+
right_pad = 16
|
|
90
|
+
zone_gap = 20
|
|
91
|
+
zone_y = 52
|
|
92
|
+
zone_h = 360
|
|
93
|
+
n_zones = len(zones)
|
|
94
|
+
|
|
95
|
+
# Zone widths: base 200 + 24 per component to give vertical room for icons + 2-line subs.
|
|
96
|
+
# In the canonical example (3 / 3 / 3 components) the replication used 256 / 360 / 272 —
|
|
97
|
+
# the formula approximates that with hand-picked widths in the worked YAML (§10).
|
|
98
|
+
zone_w(i) = base + n_components_i * comp_slack # base ≈ 200, slack ≈ 24
|
|
99
|
+
viewBox_w = left_pad + Σ zone_w(i) + (n_zones-1) * zone_gap + right_pad
|
|
100
|
+
|
|
101
|
+
# Component placement within zone i
|
|
102
|
+
comp_pad_x = 20 # x-inset from zone border
|
|
103
|
+
comp_h = 56 # 68 for focal (2-line sub), 72 if both sub lines present
|
|
104
|
+
comp_gap = 32
|
|
105
|
+
comp_y(i, k) = zone_y + 28 + k * (comp_h + comp_gap)
|
|
106
|
+
|
|
107
|
+
# Component centerlines (used for connector routing)
|
|
108
|
+
comp_x(i) = zone_x(i) + comp_pad_x
|
|
109
|
+
comp_w(i) = zone_w(i) - 2 * comp_pad_x
|
|
110
|
+
comp_cx(i) = comp_x(i) + comp_w(i)/2
|
|
111
|
+
comp_cy(i, k) = comp_y(i, k) + comp_h/2
|
|
112
|
+
|
|
113
|
+
# Footer bars (if present)
|
|
114
|
+
footer_bar_h = 56
|
|
115
|
+
footer_gap = 8
|
|
116
|
+
footer_top = zone_y + zone_h + 24
|
|
117
|
+
footer_y(k) = footer_top + k * (footer_bar_h + footer_gap)
|
|
118
|
+
footer_bottom = footer_top + N_footer * (footer_bar_h + footer_gap) - footer_gap
|
|
119
|
+
|
|
120
|
+
# Total canvas height
|
|
121
|
+
legend_block_h = 40
|
|
122
|
+
content_bottom = N_footer > 0 ? footer_bottom : zone_y + zone_h
|
|
123
|
+
viewBox_h = content_bottom + legend_block_h + 24
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 2.1 Background and zone frame
|
|
127
|
+
|
|
128
|
+
Solid paper fill across `viewBox`. No dot pattern. Each zone box:
|
|
129
|
+
|
|
130
|
+
```svg
|
|
131
|
+
<rect x="zone_x(i)" y="zone_y" width="zone_w(i)" height="zone_h"
|
|
132
|
+
fill="{ink @ 0.02}" stroke="{ink @ 0.10}" stroke-width="0.8" rx="8"/>
|
|
133
|
+
<!-- paper-masked break for the zone label -->
|
|
134
|
+
<rect x="zone_x(i)+20" y="zone_y-8" width="{label_w}" height="16" fill="{paper}"/>
|
|
135
|
+
<text x="zone_x(i)+24" y="zone_y+4" fill="{soft}"
|
|
136
|
+
font-family="{eyebrow}" letter-spacing="0.14em">{name}</text>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2.2 Component box
|
|
140
|
+
|
|
141
|
+
Three visual kinds:
|
|
142
|
+
|
|
143
|
+
| `kind` | Fill | Stroke | Stroke width | Stroke dash | Name ink | Sub ink |
|
|
144
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
145
|
+
| `standard` | `#FFFFFF` | `ink` | 1 | — | `ink` | `muted` |
|
|
146
|
+
| `focal` | `accent @ 0.07` | `accent` | 1.4 | — | `ink` | `accent` (line 1) + `muted` (line 2) |
|
|
147
|
+
| `external` | `#FFFFFF` | `muted` | 1 | `4,3` | `ink` | `muted` |
|
|
148
|
+
|
|
149
|
+
**Icon placement** (24×24, monochrome via `currentColor` — see `references/primitive-icons.md`):
|
|
150
|
+
|
|
151
|
+
```svg
|
|
152
|
+
<g transform="translate(comp_x + 12, comp_y + (comp_h - 24)/2)" color="{ink_for_kind}">
|
|
153
|
+
<use href="#icon-{name}"/> <!-- or inline the SVG path from the catalog -->
|
|
154
|
+
</g>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Icon takes 24 × 24 → 36-px total horizontal footprint with the 12-px left pad. Name and sub-label baseline shifts right by 40 px.
|
|
158
|
+
|
|
159
|
+
**Name + sub baselines** (left-aligned, with icon to the left):
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
name_x = comp_x + 44
|
|
163
|
+
name_y = comp_y + (comp_h/2) - 2
|
|
164
|
+
sub_y = comp_y + (comp_h/2) + 14
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 2.3 Connector geometry (§3 holds the routing rules)
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
src_right = comp_x(i_src) + comp_w(i_src)
|
|
171
|
+
src_left = comp_x(i_src)
|
|
172
|
+
src_top = comp_y(i_src, k_src)
|
|
173
|
+
src_bot = src_top + comp_h_src
|
|
174
|
+
src_cy = src_top + comp_h_src/2
|
|
175
|
+
|
|
176
|
+
dst_left = comp_x(i_dst)
|
|
177
|
+
dst_right = comp_x(i_dst) + comp_w(i_dst)
|
|
178
|
+
dst_top = comp_y(i_dst, k_dst)
|
|
179
|
+
dst_bot = dst_top + comp_h_dst
|
|
180
|
+
dst_cx = comp_cx(i_dst)
|
|
181
|
+
dst_cy = dst_top + comp_h_dst/2
|
|
182
|
+
|
|
183
|
+
# Corridor x for cross-zone H+Q+V routing
|
|
184
|
+
corridor_x = dst_cx # land arrow on dst horizontal center, enter via top/bot
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 2.4 Footer bar
|
|
188
|
+
|
|
189
|
+
```svg
|
|
190
|
+
<rect x="left_pad" y="footer_y(k)" width="viewBox_w - 2*left_pad" height="footer_bar_h"
|
|
191
|
+
fill="{ink @ 0.03}" stroke="{ink @ 0.18}" stroke-width="0.8" rx="8"/>
|
|
192
|
+
<g transform="translate(left_pad + 20, footer_y(k) + (footer_bar_h - 24)/2)" color="{ink}">
|
|
193
|
+
<use href="#icon-{name}"/>
|
|
194
|
+
</g>
|
|
195
|
+
<text x="left_pad + 56" y="footer_y(k) + 24" font-family="{node-name}" font-size="14" fill="{ink}">{name}</text>
|
|
196
|
+
<text x="left_pad + 56" y="footer_y(k) + 40" font-family="{sublabel}" font-size="12" fill="{muted}">{sub}</text>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Footer bars are layer-wide services. **No connectors emerge from them.** They sit visually below the zones and let the reader see the cross-cutting concerns at a glance.
|
|
200
|
+
|
|
201
|
+
### 2.5 Legend strip
|
|
202
|
+
|
|
203
|
+
Hairline divider at `y = content_bottom + 16`, then a row of swatches + labels at `y = content_bottom + 36`. Only the styles actually used by `connectors[]` (plus `focal` and `external` if those component kinds are present) appear in the legend.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 3. Connector rules (mandatory)
|
|
208
|
+
|
|
209
|
+
### 3.1 Path shape — rounded right-angle Q-bezier, r = 8
|
|
210
|
+
|
|
211
|
+
Reused verbatim from `type-process.md` §3.1. No diagonals — ever.
|
|
212
|
+
|
|
213
|
+
```svg
|
|
214
|
+
<!-- Same zone, adjacent component (same vertical column): single vertical line -->
|
|
215
|
+
<line x1="{src_cx}" y1="{src_bot}" x2="{dst_cx}" y2="{dst_top}"
|
|
216
|
+
stroke="…" stroke-width="…" marker-end="…"/>
|
|
217
|
+
|
|
218
|
+
<!-- Cross-zone or cross-row: exit right → H → Q-bend → V → enter top (or bottom) -->
|
|
219
|
+
<path d="M {src_right},{src_cy} H {dst_cx - 8} Q {dst_cx},{src_cy} {dst_cx},{src_cy ± 8} V {dst_top_or_bottom}"
|
|
220
|
+
fill="none" stroke="…" stroke-width="…" marker-end="…"/>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
- Use `{src_cy + 8}` and `V {dst_top}` when destination lies BELOW source.
|
|
224
|
+
- Use `{src_cy − 8}` and `V {dst_bottom}` when destination lies ABOVE source.
|
|
225
|
+
|
|
226
|
+
### 3.2 Exit / entry sides (configurable; defaults below)
|
|
227
|
+
|
|
228
|
+
| Topology | Default exit side of source | Default entry side of destination |
|
|
229
|
+
| --- | --- | --- |
|
|
230
|
+
| Same zone, dst below | bottom | top |
|
|
231
|
+
| Same zone, dst above | top | bottom |
|
|
232
|
+
| Cross-zone, horizontal flow | right | top (or bottom, whichever is closer to src_cy) |
|
|
233
|
+
| Vertical-orientation diagram | bottom | top |
|
|
234
|
+
|
|
235
|
+
A connector can override via `connectors[k].from_side` / `connectors[k].to_side` (`top | right | bottom | left`). **Backward references** (right→left in horizontal orientation, up in vertical orientation) are permitted only when at least one endpoint has `kind: external`, and must be `dashed: true`.
|
|
236
|
+
|
|
237
|
+
### 3.3 Markers MUST touch the destination rectangle
|
|
238
|
+
|
|
239
|
+
The path's last command ends at the destination's rectangle edge (`V {dst_top}` or `H {dst_left}`), **not** at the centroid. After applying `refX=7` on the marker, the triangle sits flush against the border. Stopping the line short of the edge — or sending it to the centroid and burying the arrowhead inside the rect — is a hard fail.
|
|
240
|
+
|
|
241
|
+
### 3.4 Style → stroke + marker
|
|
242
|
+
|
|
243
|
+
| `style` | Stroke color | Stroke width | Marker |
|
|
244
|
+
| --- | --- | --- | --- |
|
|
245
|
+
| `neutral` | `muted` | 1.0 | `url(#arrow)` |
|
|
246
|
+
| `link` | `link` | 1.2 | `url(#arrow-link)` |
|
|
247
|
+
| `accent` | `accent` | 1.4 | `url(#arrow-accent)` |
|
|
248
|
+
|
|
249
|
+
Add `stroke-dasharray="4 3"` when `dashed: true`.
|
|
250
|
+
|
|
251
|
+
**Defs block** (always emit all three):
|
|
252
|
+
|
|
253
|
+
```svg
|
|
254
|
+
<defs>
|
|
255
|
+
<marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="{muted}"/></marker>
|
|
256
|
+
<marker id="arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="{link}"/></marker>
|
|
257
|
+
<marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="{accent}"/></marker>
|
|
258
|
+
</defs>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 3.5 Connector label = inline icon + text, placed at the START of the connector with a perpendicular margin
|
|
262
|
+
|
|
263
|
+
The label sits **near the source end** of the connector (not at the mid-segment) and is **offset perpendicular to the line** so it never overlaps the stroke. Icon (when `icon:` is set) sits inside the label's paper-fill mask, to the left of the text.
|
|
264
|
+
|
|
265
|
+
```svg
|
|
266
|
+
<g transform="translate({label_cx}, {label_cy})">
|
|
267
|
+
<rect x="-{w/2}" y="-9" width="{w}" height="18" rx="3" fill="{paper}" stroke="none"/>
|
|
268
|
+
<use href="#icon-{icon}" x="-{w/2 + 4}" y="-6" width="12" height="12" color="{stroke_color}"/> <!-- if icon set -->
|
|
269
|
+
<text x="{icon ? (-(w/2) + 22) : 0}" y="3" text-anchor="{icon ? 'start' : 'middle'}"
|
|
270
|
+
font-family="{arrow-label}" font-size="9" font-weight="600"
|
|
271
|
+
letter-spacing="0.08em" fill="{stroke_color}">{label}</text>
|
|
272
|
+
</g>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Placement formulas** (label box is 18px tall × `w` wide; centered on `{label_cx, label_cy}`):
|
|
276
|
+
|
|
277
|
+
| Segment exiting source | `label_cx` | `label_cy` | Effect |
|
|
278
|
+
| --- | --- | --- | --- |
|
|
279
|
+
| Horizontal (right exit) | `src_right + 6 + w/2` | `src_cy − 14` | Label sits 6 px past the source, 5 px above the line |
|
|
280
|
+
| Horizontal (left exit, backward) | `src_left − 6 − w/2` | `src_cy − 14` | Label sits 6 px before the source, 5 px above the line |
|
|
281
|
+
| Vertical (bottom exit) | `src_cx + 6 + w/2` | `src_bot + 14` | Label sits 6 px right of the line, 5 px below the source edge |
|
|
282
|
+
| Vertical (top exit, backward) | `src_cx + 6 + w/2` | `src_top − 14` | Label sits 6 px right of the line, 5 px above the source edge |
|
|
283
|
+
|
|
284
|
+
For cross-zone H+Q+V routes the label binds to the **horizontal** segment, since that segment is anchored at the source. Place the label early on that horizontal run — never on the Q-bend or the vertical tail.
|
|
285
|
+
|
|
286
|
+
- `w = text_w + (icon ? 30 : 12)` — auto-fit.
|
|
287
|
+
- Mask `fill` resolves to `paper` in light mode and `ink` in dark mode. The mask is kept as a safety pad — even though the label no longer sits on the line, it can graze zone backgrounds and component fills, and the mask preserves contrast.
|
|
288
|
+
- `stroke_color` follows §3.4 (text + icon inherit the connector's accent / link / neutral color).
|
|
289
|
+
|
|
290
|
+
### 3.6 Z-order
|
|
291
|
+
|
|
292
|
+
All connectors (paths + lines + labels) emit BEFORE any component rect, so node fills mask the line ends. The connector label is the exception — it draws AFTER its line so the mask sits on top.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 4. Component color override (per-component `color: "#hex"`)
|
|
297
|
+
|
|
298
|
+
Per-component, same shape as every other parametric type in this skill.
|
|
299
|
+
|
|
300
|
+
| Element | Light | Dark |
|
|
301
|
+
| --- | --- | --- |
|
|
302
|
+
| Container fill | `rgba(C, 0.06)` | `rgba(C_light, 0.10)` |
|
|
303
|
+
| Container stroke | `rgba(C, 0.45)` (width 1) | `rgba(C_light, 0.55)` |
|
|
304
|
+
| Component name text | `C` | `C_light` |
|
|
305
|
+
| Icon glyph | inherits ink via `currentColor` (unchanged) | inherits ink (unchanged) |
|
|
306
|
+
| Sub-label | muted (unchanged) | muted (unchanged) |
|
|
307
|
+
| Connectors touching this component | **unchanged** — topology-driven | **unchanged** |
|
|
308
|
+
|
|
309
|
+
`C_light` = the same hex lightened ~15 % for dark-mode contrast (e.g., `#7a8c47` → `#9aac67`, `#b85450` → `#d97a78`).
|
|
310
|
+
|
|
311
|
+
**Rules:**
|
|
312
|
+
- **Never on focal components.** `kind: focal` always renders accent; `color` is silently ignored.
|
|
313
|
+
- **Never on connectors.** Connector style is topology-driven; if you want a colored edge, pick `style: accent` / `link` / `neutral`, not a component color.
|
|
314
|
+
- **Cap: ≤ 3 custom-colored components per diagram** (in addition to focal components). Above 3 the visual signal fragments.
|
|
315
|
+
|
|
316
|
+
**Recommended cross-type palette** (same as `type-medallion.md` / `type-process.md` / `type-dp-integration.md` / `type-dp-security-matrix.md`):
|
|
317
|
+
|
|
318
|
+
- `#b85450` rust-red — security / governance / pain-point that isn't focal
|
|
319
|
+
- `#5a7d9a` slate-blue — observability / quality / monitoring gate
|
|
320
|
+
- `#7a8c47` olive-green — survivor system (the one tool the new platform keeps)
|
|
321
|
+
- `#c9a23a` warm yellow — sandbox / dev / scratch
|
|
322
|
+
- `#8c6d3f` warm-brown — archive / cold / DR
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## 5. Focal rule
|
|
327
|
+
|
|
328
|
+
- `kind: focal` components: **≤ 2 per diagram** (zero is also valid for diagrams without a single dominant pain-point).
|
|
329
|
+
- Auto-styling: accent stroke 1.4, accent-tinted fill 7 %, ink-bold `node-name`, accent line-1 `sublabel`.
|
|
330
|
+
- Any connector with a focal endpoint automatically renders in `style: accent`; the YAML `style:` is ignored.
|
|
331
|
+
- Custom `color: "#hex"` on a focal component is silently ignored — accent always wins.
|
|
332
|
+
|
|
333
|
+
If your diagram needs more than 2 focal components, you've collapsed two narratives. Split: one "collection pain-points" diagram + one "dissemination pain-points" diagram.
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## 6. Dark mode
|
|
338
|
+
|
|
339
|
+
| Role | Light | Dark |
|
|
340
|
+
| --- | --- | --- |
|
|
341
|
+
| paper | `paper` | `ink` |
|
|
342
|
+
| ink | `ink` | `paper` |
|
|
343
|
+
| muted | `muted` | `muted` |
|
|
344
|
+
| accent | `accent` | `accent` |
|
|
345
|
+
| link | `link` | `link` |
|
|
346
|
+
| zone background | `ink @ 0.02` | `paper @ 0.04` |
|
|
347
|
+
| zone border | `ink @ 0.10` | `paper @ 0.14` |
|
|
348
|
+
| standard component fill | `#FFFFFF` | `paper @ 0.04` |
|
|
349
|
+
| standard component stroke | `ink` | `paper @ 0.32` |
|
|
350
|
+
| focal fill | `accent @ 0.07` | `accent @ 0.12` |
|
|
351
|
+
| focal stroke | `accent` | `accent` |
|
|
352
|
+
| external stroke | `muted` (dashed) | `muted` (dashed) |
|
|
353
|
+
| footer fill | `ink @ 0.03` | `paper @ 0.05` |
|
|
354
|
+
| footer stroke | `ink @ 0.18` | `paper @ 0.20` |
|
|
355
|
+
| label mask fill | `paper` | `ink` |
|
|
356
|
+
| custom-color components | `C` | `C_light` (≈ +15 %) |
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 7. Reproducibility checklist (taste gate)
|
|
361
|
+
|
|
362
|
+
Before emitting SVG, verify **every** item:
|
|
363
|
+
|
|
364
|
+
1. Eyebrow + title + subtitle present at canonical y-positions (24 / 36 / 52); body padding 32 px.
|
|
365
|
+
2. 2..4 zones; each has its uppercase label at the top-left of its zone box, on a paper-masked break in the border.
|
|
366
|
+
3. Every component has `id`, `name`. `sub`, `icon`, `kind`, `color` are optional.
|
|
367
|
+
4. ≤ 2 components with `kind: focal`; focal styling auto-applied (accent fill 7 %, accent stroke 1.4, italic line-1 sub).
|
|
368
|
+
5. Every connector exits the right (or bottom) of source and enters the top (or left) of destination; rounded right-angle Q-bezier `r=8` at every bend; marker triangle visibly touches the destination rectangle edge.
|
|
369
|
+
6. Connector labels sit at the **start** of the connector (not mid-segment) and are offset **perpendicular** to the line (5 px gap above for horizontal segments, 6 px gap to the right for vertical segments) — never overlapping the stroke. Paper-fill mask kept behind text; icon (when `icon:` is set) sits left of text inside the same mask.
|
|
370
|
+
7. ≤ 3 custom-colored components; none on focal.
|
|
371
|
+
8. ≤ 3 footer bars; each spans `viewBox_w − 2*left_pad`; no connectors emerge from any footer.
|
|
372
|
+
9. Legend at bottom: hairline separator + one swatch per style actually used.
|
|
373
|
+
10. `arrow-label` for connector labels, `eyebrow` for the page eyebrow and zone labels, `title` for the page title, `node-name` for the subtitle and component names, and `sublabel` for technical sub-labels.
|
|
374
|
+
11. Markers `#arrow` / `#arrow-link` / `#arrow-accent` defined once in `<defs>`; no inline marker definitions.
|
|
375
|
+
12. Dark variant: resolve every semantic token through its dark-mode value; custom colors are lightened ~15 %.
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 8. Anti-patterns
|
|
380
|
+
|
|
381
|
+
- **Diagonal arrows.** The NatStat replication has one (analyst → LegacyPortal). The new type forbids it — always rounded right-angle Q-bezier.
|
|
382
|
+
- **Marker not touching the target.** Path ends at the centroid or stops short of the border.
|
|
383
|
+
- **Inline `text` connector labels without a mask rect.** The connector line can bleed through the text and it becomes unreadable.
|
|
384
|
+
- **Labels sitting on top of the connector line, mid-segment.** Labels belong at the *start* of the connector with a perpendicular margin (see §3.5) — burying them in the middle of the line hides the source-to-destination direction and forces the reader's eye to fight the mask.
|
|
385
|
+
- **Tiny text badges as icons.** The source uses 7-px `DB` / `APP` / `EXT` badges; this type uses real 24-px catalog icons. Text badges are only acceptable as the label text, not as the component "icon."
|
|
386
|
+
- **Custom color on a focal component.** Focal always wins; user-set `color` silently ignored on `kind: focal`.
|
|
387
|
+
- **Footer bar wired to one component.** Footer = cross-cutting layer-wide concern; a connector from a footer to a specific component is a category error (use `type-dp-integration.md`'s AUTH-line pattern only when the footer service truly authenticates *all* components, and even then the line lands at the zone bottom edge, not at a specific tool).
|
|
388
|
+
- **> 16 total components or > 5 per zone.** Density cap; split into two diagrams.
|
|
389
|
+
- **Mixing orientations within one diagram.** Pick one — `horizontal` or `vertical` — and apply it to every zone.
|
|
390
|
+
- **Using `kind: focal` to flag every painful thing.** Focal exists for ≤ 2 narrative pain-points; for "this is bad but not headline-bad", use `color: "#b85450"` rust-red instead.
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## 9. Examples
|
|
395
|
+
|
|
396
|
+
- `assets/example-it-state.html` — minimal light (NatStat canonical: 3 zones, 9 components, 8 connectors, 0 footer bars, SQL Server tinted olive). Gallery default.
|
|
397
|
+
- `assets/example-it-state-dark.html` — same, dark skin.
|
|
398
|
+
- `assets/example-it-state-full.html` — same, editorial-card frame with summary cards.
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## 10. Worked YAML — full inputs for `example-it-state.html`
|
|
403
|
+
|
|
404
|
+
The complete inputs that map to the shipped canonical example. Every coordinate in that SVG is derivable from §2 applied to these inputs.
|
|
405
|
+
|
|
406
|
+
```yaml
|
|
407
|
+
title: "Current IT Landscape"
|
|
408
|
+
subtitle: "Data pipeline before the platform"
|
|
409
|
+
eyebrow: "NatStat · Before the platform"
|
|
410
|
+
|
|
411
|
+
orientation: horizontal
|
|
412
|
+
|
|
413
|
+
zones:
|
|
414
|
+
- name: "COLLECTION"
|
|
415
|
+
components:
|
|
416
|
+
- { id: survey-solutions, name: "Survey Solutions", sub: "CAPI · PostgreSQL", icon: postgres }
|
|
417
|
+
- { id: aspnet, name: "ASP.NET Apps", sub: "migration · admin portals", icon: server }
|
|
418
|
+
- { id: civil-reg, name: "Civil Registry", sub: "external · CRVS data", icon: database, kind: external }
|
|
419
|
+
- name: "PROCESSING"
|
|
420
|
+
components:
|
|
421
|
+
- { id: shared-drive, name: "Shared Drive", sub: "No version control · Windows file share", icon: file, kind: focal }
|
|
422
|
+
- { id: analyst-mach, name: "Analyst Machines", sub: "SPSS · SAS · Stata · Excel", icon: desktop }
|
|
423
|
+
- { id: sql-server, name: "SQL Server", sub: "on-premises · core RDBMS", icon: sqlserver, color: "#7a8c47" }
|
|
424
|
+
- name: "DISSEMINATION"
|
|
425
|
+
components:
|
|
426
|
+
- { id: legacy-portal, name: "LegacyPortal", sub: "manual bottleneck", icon: cloud, kind: focal }
|
|
427
|
+
- { id: natstat-website, name: "NatStat Website", sub: "public · static pages", icon: internet }
|
|
428
|
+
- { id: ministry, name: "Ministry Partners", sub: "~6 ministries", icon: users, kind: external }
|
|
429
|
+
|
|
430
|
+
connectors:
|
|
431
|
+
- { from: survey-solutions, to: shared-drive, label: "CSV", icon: csv, style: link }
|
|
432
|
+
- { from: aspnet, to: shared-drive, label: "EMAIL", icon: file, style: link }
|
|
433
|
+
- { from: civil-reg, to: shared-drive, label: "EXCEL", icon: excel, style: link, dashed: true }
|
|
434
|
+
- { from: shared-drive, to: analyst-mach, label: "COPY", style: accent, dashed: true }
|
|
435
|
+
- { from: analyst-mach, to: sql-server, label: "LOAD", style: neutral }
|
|
436
|
+
- { from: analyst-mach, to: legacy-portal, label: "EXCEL", icon: excel, style: accent }
|
|
437
|
+
- { from: legacy-portal, to: natstat-website, label: "WEB", style: neutral }
|
|
438
|
+
- { from: natstat-website, to: ministry, label: "CSV DL", icon: csv, style: link, dashed: true }
|
|
439
|
+
|
|
440
|
+
dark: false
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 10.1 What this YAML proves
|
|
444
|
+
|
|
445
|
+
- `n_zones = 3`, components per zone `= [3, 3, 3]`, custom color count = 1 (SQL Server), focal count = 2 (Shared Drive, LegacyPortal), external count = 2 (Civil Registry, Ministry Partners).
|
|
446
|
+
- Zone widths in canonical: 256 / 360 / 272 ⇒ `viewBox_w = 16 + 256 + 20 + 360 + 20 + 272 + 16 = 960` ✓
|
|
447
|
+
- `viewBox_h = 52 + 360 + 40 + 24 = 500` (no footer bars) ✓
|
|
448
|
+
- Shared Drive (focal) at zone 2, row 0: `x = 340, y = 80, w = 264, h = 68` (focal stretches to 68 to fit 2-line sub) ✓
|
|
449
|
+
- LegacyPortal (focal) at zone 3, row 0: `x = 704, y = 80, w = 208, h = 60` ✓
|
|
450
|
+
- SQL Server (custom olive) at zone 2, row 2: container fill `rgba(122,140,71,0.06)`, stroke `rgba(122,140,71,0.45)`, name text `#7a8c47` ✓
|
|
451
|
+
- Connectors 4, 5 (within zone 2) and 7, 8 (within zone 3) are simple vertical `<line>` elements. Cross-zone connectors take rule-compliant routes (see SKILL.md §6 rules 4 & 5):
|
|
452
|
+
- **All three Survey-side → Shared Drive connectors (C1 / C2 / C3) enter Shared Drive's LEFT edge.** A top-edge entry would push the marker body (7 px back along travel, given `refX = 7`) *inside* the destination box, where the box's paper-fill mask hides it — only a 1-pixel tip would peek above the stroke. Entering the left edge with a right-going path keeps the body outside the box and the arrow visible (~7 px shown to the left of the box edge). The three left-edge attach points are fanned at **y = 108 / 124 / 140** (16-px spacing, well above the 12 px rule-4 minimum).
|
|
453
|
+
- **C1** (Survey → Shared Drive) source y matches landing y: single horizontal `M 252,108 H 340`. No bends needed.
|
|
454
|
+
- **C2** (ASP.NET → Shared Drive) detours up through zone-2 background — vertical at `x = 316` (clear of Shared Drive's left edge at `x = 340`): `H 308 Q 316,196 316,188 V 132 Q 316,124 324,124 H 340`. Lands at `(340, 124)`.
|
|
455
|
+
- **C3** (Civil Registry → Shared Drive) detours up through zone-2 background — vertical at `x = 332` (clear of Analyst Machines, which starts at `x = 340`): `H 324 Q 332,284 332,276 V 148 Q 332,140 340,140`. Lands at `(340, 140)` via a final Q-bend (no trailing H needed).
|
|
456
|
+
- **C6** (Analyst Machines → LegacyPortal) cannot use a direct H+Q+V into LegacyPortal's left edge — Analyst Machines and LegacyPortal are in different rows, and the direct horizontal at `y = 268` would cross NatStat Website. It detours through the zone gap and **over** LegacyPortal: `H 654 Q 662,268 662,260 V 72 Q 662,64 670,64 H 800 Q 808,64 808,72 V 80` — vertical at `x = 662` (in zone gap), horizontal at `y = 64` (above LegacyPortal top), then down into LegacyPortal's top center. The path enters LegacyPortal from **above** going down, so the arrow body lives above the box (visible) and only the 1-px tip enters the box.
|
|
457
|
+
|
|
458
|
+
**Marker-visibility rule of thumb:** with the standard arrow marker (`markerWidth = 8`, `refX = 7`), the arrow body extends 7 px *backwards* along the path direction from the endpoint. For the arrow to remain visible, that 7-px tail must sit *outside* the destination box. Translation:
|
|
459
|
+
- Entering a **TOP edge going UP** (path direction up, box below) → body inside box, **only 1 px visible. Avoid this.**
|
|
460
|
+
- Entering a **TOP edge going DOWN** (path direction down, box below) → body above box, ~7 px visible. ✓
|
|
461
|
+
- Entering a **LEFT edge going RIGHT** → body to the left of box, ~7 px visible. ✓
|
|
462
|
+
- Entering a **RIGHT edge going LEFT** → body to the right of box, ~7 px visible. ✓
|
|
463
|
+
- Entering a **BOTTOM edge going DOWN** (box above) → body inside box, **only 1 px visible. Avoid this.**
|
|
464
|
+
- Entering a **BOTTOM edge going UP** (box above) → body below box, ~7 px visible. ✓
|
|
465
|
+
|
|
466
|
+
When the source row matches the destination row's y range (e.g., Survey at y=108 with Shared Drive at y=80–148), prefer **side-edge** entry — a single horizontal path with a fully visible arrow. When the source row is offset, detour through the destination's nearest zone background to enter a side edge rather than approaching a top/bottom edge from the wrong side.
|
|
467
|
+
|
|
468
|
+
When footer bars are added (`N_footer > 0`), `viewBox_h` grows according to the canvas formula in §2 to accommodate the footer rows and custom colors.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# User Journey Map
|
|
2
|
+
|
|
3
|
+
**Best for:** what a person does across the stages of an experience and how it *feels* at each one. The sentiment curve is the load-bearing element — without it this is just a process diagram with extra rows, so if you can't name a sentiment for every stage, use **Process** or **Timeline** instead.
|
|
4
|
+
|
|
5
|
+
**Not this type:** frontstage vs backstage on a shared stage grid, with a line of visibility → **Service blueprint** (`type-service-blueprint.md`). A blueprint is a census of what the customer can see versus what the service hides; it has no sentiment curve.
|
|
6
|
+
|
|
7
|
+
## Layout conventions
|
|
8
|
+
|
|
9
|
+
Vertical stack, top to bottom, for one persona:
|
|
10
|
+
|
|
11
|
+
- **Stage headers** — 5 equal columns, 200px wide, 24px gutters (max 6 stages). Each column: an `eyebrow`-role 8px uppercase tracked eyebrow (`STAGE 1` … `STAGE 5`) over the stage name in the `node-name` role, 12px, weight 600, both centered on the column.
|
|
12
|
+
- **Sentiment band (the differentiator)** — a 160px-tall plot area directly under the headers. 3 horizontal reference hairlines at `rule` 0.10 opacity mark the levels `HIGH` / `NEUTRAL` / `LOW` — `eyebrow` role 8px `muted`, anchored `end` in a 64px left margin. **Never emoji, never `writing-mode` vertical text for these labels.** A smooth `muted` 1.5px polyline runs through one `r=5` dot per stage, each value snapped to one of five ordinal levels (`HIGH`, `MED-HIGH`, `NEUTRAL`, `MED-LOW`, `LOW`) — only the three that are actually used need a labeled hairline. The trough stage's dot and its incoming segment are `accent`; everything else on the curve is `muted`.
|
|
13
|
+
- **Content rows** — up to 3 labelled bands below the sentiment band, each with an `eyebrow`-role 8px uppercase row label sitting in the left margin (same column as the sentiment level labels, never rotated):
|
|
14
|
+
- `ACTIONS` — what the user does, `node-name` family 12px, one short line per stage.
|
|
15
|
+
- `TOUCHPOINTS` — the surface the action happens on (email, app, docs…), `sublabel` role 9px `muted`.
|
|
16
|
+
- An optional third row for a metric or owner, same treatment as touchpoints.
|
|
17
|
+
Rows are separated by hairlines that span the full plot width (from the left margin edge to the last stage's right edge).
|
|
18
|
+
- **Pain markers** — on stages where sentiment drops, a small dashed-stroke tag box (`rx=2`, `accent @ 0.50` stroke dashed `3,3`, no fill or a faint accent tint) sits under that stage's actions cell, with an `arrow-label`-role 8px label naming the friction. Max 2 per diagram, and only on the trough — tagging every stage erases the signal.
|
|
19
|
+
- **Legend** — horizontal strip at the bottom per the global rule (hairline separator above, 160–180px between entries): three keys, in order — the sentiment line, the trough-stage highlight, and the pain-marker tag. The trough key is not optional: the dip is the finding, so the reader needs the highlight named.
|
|
20
|
+
|
|
21
|
+
## Connector note
|
|
22
|
+
|
|
23
|
+
The sentiment polyline is a **data curve**, not a connector between nodes — §6 rule 1 (mandatory orthogonal elbows) does not apply to it. This exemption covers the sentiment curve **only**; any other connector in a journey map (there normally are none) still follows the standard connector rules.
|
|
24
|
+
|
|
25
|
+
## Geometry
|
|
26
|
+
|
|
27
|
+
- Stage grid: left margin 64px, then 5 columns of 200px with 24px gutters (`col_left = 64 + i·224`).
|
|
28
|
+
- Sentiment band: 160px tall. Hairlines at the top (`HIGH`), middle (`NEUTRAL`), and bottom (`LOW`) of the band, 80px apart.
|
|
29
|
+
- Dot x = the horizontal center of its stage column. Dot y = the snapped level's hairline y (or the interpolated position for an unlabeled level).
|
|
30
|
+
- Row height: enough for one line of text plus, in the `ACTIONS` row only, up to two stacked 16px-tall pain-marker boxes.
|
|
31
|
+
|
|
32
|
+
## Focal rule
|
|
33
|
+
|
|
34
|
+
Exactly 2 accent elements: the trough dot + its incoming curve segment (counts as one), and its pain marker(s) (counts as the other). Nothing else on the map is `accent`.
|
|
35
|
+
|
|
36
|
+
## Complexity budget
|
|
37
|
+
|
|
38
|
+
Max 6 stages · max 3 content rows · 5 sentiment levels (ordinal, named — never numeric) · max 2 pain markers · max 2 accent elements.
|
|
39
|
+
|
|
40
|
+
## Anti-patterns
|
|
41
|
+
|
|
42
|
+
- **No sentiment curve.** If every stage feels the same, or you can't name a feeling, you're drawing a process — use **Process** or **Timeline**.
|
|
43
|
+
- **More than 6 stages.** Split into two journeys (e.g. acquisition and retention) rather than cramming a wide funnel into one map.
|
|
44
|
+
- **Numeric sentiment axis** (a 0–100 score). Sentiment here is ordinal — five named levels, not a chart of a continuous metric.
|
|
45
|
+
- **Emoji as sentiment markers.** Use the named levels and hairlines; emoji don't localize, print, or hold up at small sizes.
|
|
46
|
+
- **Multiple personas on one map.** Overlaying two sentiment curves erases both. One map per persona.
|
|
47
|
+
- **Pain markers on every stage.** If nothing is un-marked, nothing is focal.
|
|
48
|
+
- **`writing-mode` vertical row labels.** Horizontal only, in the left margin — same rule as every other type in this skill.
|
|
49
|
+
- **Using it for an internal system flow with no human in it.** No person, no sentiment, no journey map — that's an architecture or data-flow diagram.
|
|
50
|
+
|
|
51
|
+
## Examples
|
|
52
|
+
|
|
53
|
+
- `assets/example-journey.html` — minimal light. *Trial to paid: the first week*, 5 stages, trough at "Hit the limit".
|
|
54
|
+
- `assets/example-journey-dark.html` — minimal dark, same data.
|
|
55
|
+
- `assets/example-journey-full.html` — full editorial: container framing + 3 varied-width summary cards + footer.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Kanban Board
|
|
2
|
+
|
|
3
|
+
**Best for:** a snapshot of work-in-progress by state — what is queued, what is moving, what is stuck, and where the WIP limit is being breached. This is a *state census*, not a flow: a kanban board has **no connectors at all**. That is exactly what separates it from swimlane (lanes plus a flow crossing them, with handoffs as the load-bearing edges) and from process (ordered steps with directional handoffs). If the diagram needs an arrow anywhere, it isn't a kanban board anymore — reach for swimlane or process instead.
|
|
4
|
+
|
|
5
|
+
## Layout conventions
|
|
6
|
+
|
|
7
|
+
- **Up to 5 vertical columns of equal width (240px), 32px gutters.** Column background is `ink @ 0.02`; no column border.
|
|
8
|
+
- **Header band per column:** column name in the `node-name` role, 12px, weight 600, anchored left. A right-anchored **WIP chip** — a rectangular tag (`rx=2`, **never** a pill) holding `n/limit` in the `eyebrow` role at 8px — or bare `n` on a queue or terminal column, which carries no limit. Every in-process column states one. A hairline `rule` separator sits directly under the header band, full column width.
|
|
9
|
+
- **Cards:** the §6 node-box pattern ([primitives-core.md](primitives-core.md#node-box--full-pattern)) at `rx=6`, column width minus 16px padding on each side, 56px tall, 12px vertical gap between cards. Content: title in the `node-name` role, 12px, weight 600, and a `sublabel`-role 9px `muted` sublabel line for `TICKET-ID · owner` (e.g. `AVA-214 · nadia`).
|
|
10
|
+
- **Drawing order:** background → column fills → header text + WIP chips → header rules → cards (each: box, then left accent bar if blocked, then title, then sublabel) → legend.
|
|
11
|
+
|
|
12
|
+
## Card states — the type's semantic vocabulary
|
|
13
|
+
|
|
14
|
+
Every card renders in exactly one of four states. Document and use all four when the board has enough cards to show them:
|
|
15
|
+
|
|
16
|
+
| State | Fill | Stroke | Extra |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| `default` | white | `ink` | — |
|
|
19
|
+
| `blocked` | `accent @ 0.05` | `accent` (full opacity) dashed `4,4` | 4px `accent` bar on the card's left edge |
|
|
20
|
+
| `waiting / external` | `ink @ 0.02` | `ink @ 0.20` dashed `4,3` | — |
|
|
21
|
+
| `done` | `ink @ 0.05` | `muted` | — |
|
|
22
|
+
|
|
23
|
+
These map directly onto the node-treatment table in [style-guide.md](style-guide.md#node-type--treatment) (`security` → blocked, `optional` → waiting/external, `store` → done) — the board reuses the system's existing semantic fills rather than inventing new ones.
|
|
24
|
+
|
|
25
|
+
## Over-limit column
|
|
26
|
+
|
|
27
|
+
When a column's card count `n` exceeds its stated `limit`, the WIP chip's stroke and text go `accent`. That plus one blocked card is the full 2-accent budget for the diagram — don't spend the budget anywhere else.
|
|
28
|
+
|
|
29
|
+
## Complexity budget
|
|
30
|
+
|
|
31
|
+
- Max 5 columns, max 4 cards per column, max 12 cards total.
|
|
32
|
+
- Max 2 accent elements (the over-limit chip counts as one; a blocked card counts as one).
|
|
33
|
+
- Over budget on a single column → aggregate the backlog into one count card (`+14 more`) rather than listing every item.
|
|
34
|
+
|
|
35
|
+
## Anti-patterns
|
|
36
|
+
|
|
37
|
+
- **Drawing arrows between cards.** A board shows state, not flow — if the flow itself needs to be visible, use swimlane or process instead.
|
|
38
|
+
- **More than 4 cards in a column.** Aggregate into a count card; don't let a column scroll off the canvas.
|
|
39
|
+
- **One card per person.** That's an org chart wearing a kanban skin.
|
|
40
|
+
- **In-process columns without WIP limits.** The limit is half the point of the type — a column work flows *through* with no stated limit can't show that it's over budget. The entry queue and the terminal column are the exception: nothing is constrained by holding more done work, so they show a bare count.
|
|
41
|
+
- **Accenting every blocked card.** One or two blocked cards read as signal; a column full of accent reads as noise and erases the focal rule.
|
|
42
|
+
- **A "Done" column that grows without bound.** Cap it and note the archive point in the sublabel or a footnote — an unbounded Done column just becomes a second Backlog.
|
|
43
|
+
- **Pill-shaped WIP tags.** The chip is a rectangle at `rx=2`, matching the type-tag primitive in the §6 node box ([primitives-core.md](primitives-core.md#node-box--full-pattern)) — pills read as status badges from an unrelated design language.
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
|
|
47
|
+
- `assets/example-kanban.html` — minimal light. Platform-team board: Backlog (3), In progress (4/3, over limit), Review (2/3), Done (2), one blocked card.
|
|
48
|
+
- `assets/example-kanban-dark.html` — minimal dark, same data.
|
|
49
|
+
- `assets/example-kanban-full.html` — full editorial: container framing + 3 summary cards of varied widths + footer.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Layer Stack
|
|
2
|
+
|
|
3
|
+
**Best for:** OSI model, CSS cascade, context hierarchy, tech stack, abstraction layers, memory hierarchy.
|
|
4
|
+
|
|
5
|
+
## Layout conventions
|
|
6
|
+
- Horizontal bands stacked vertically. Each layer is a full-width rectangle (same x, same width). 4–6 layers total.
|
|
7
|
+
- Layer height 56–72px, width typically 800–880px inside a 1000px viewBox.
|
|
8
|
+
- Each row contains (left→right):
|
|
9
|
+
1. **Index tag** on the far left (`L3`, `07`, `APPLICATION`) — `eyebrow` role, 8–9px.
|
|
10
|
+
2. **Layer name** slightly right of center-left — `node-name` role, 14–16px 600.
|
|
11
|
+
3. **Sublabel / note** on the far right — `sublabel` role, 9–10px, `muted`.
|
|
12
|
+
- Border between layers: 1px hairline `ink @ 0.12` (the `rule` role). Outer silhouette 1px `ink` or `muted`.
|
|
13
|
+
- Fills: either alternating subtle shades (paper / paper-2) OR all paper with hairline dividers. Pick one and hold it.
|
|
14
|
+
- Direction indicator on the LEFT margin (outside the stack): small up/down arrow + `eyebrow`-role label (`abstraction ↑`, `packets ↓`).
|
|
15
|
+
- Coral on **one** focal layer (stroke + subtle tint fill) — the bottleneck, the pay-rent layer, the one under discussion.
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
- Layers that aren't actually hierarchical (use swimlane or architecture).
|
|
19
|
+
- Skipped numbering (missing L4 between L3 and L5 without explanation).
|
|
20
|
+
- Every layer a different color — hierarchy invisible.
|
|
21
|
+
- Inconsistent layer heights without reason.
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
- `assets/example-layers.html` — minimal light
|
|
25
|
+
- `assets/example-layers-dark.html` — minimal dark
|
|
26
|
+
- `assets/example-layers-full.html` — full editorial
|