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.
Files changed (384) hide show
  1. package/.agents/skills/diagram-design/LICENSE +4 -0
  2. package/.agents/skills/diagram-design/SKILL.md +413 -0
  3. package/.agents/skills/diagram-design/UPSTREAM.json +76 -0
  4. package/.agents/skills/diagram-design/UPSTREAM.md +23 -0
  5. package/.agents/skills/diagram-design/assets/example-architecture-containment.html +205 -0
  6. package/.agents/skills/diagram-design/assets/example-architecture-delta.html +193 -0
  7. package/.agents/skills/diagram-design/assets/example-architecture.html +183 -0
  8. package/.agents/skills/diagram-design/assets/example-axonometric-plan-campus.html +108 -0
  9. package/.agents/skills/diagram-design/assets/example-axonometric-plan-coffee-shop.html +121 -0
  10. package/.agents/skills/diagram-design/assets/example-axonometric-plan-warehouse.html +127 -0
  11. package/.agents/skills/diagram-design/assets/example-axonometric-plan.html +114 -0
  12. package/.agents/skills/diagram-design/assets/example-bar.html +129 -0
  13. package/.agents/skills/diagram-design/assets/example-beeswarm.html +384 -0
  14. package/.agents/skills/diagram-design/assets/example-box-plot.html +127 -0
  15. package/.agents/skills/diagram-design/assets/example-bubble.html +147 -0
  16. package/.agents/skills/diagram-design/assets/example-bump.html +142 -0
  17. package/.agents/skills/diagram-design/assets/example-data-flow.html +143 -0
  18. package/.agents/skills/diagram-design/assets/example-datalake.html +269 -0
  19. package/.agents/skills/diagram-design/assets/example-db-schema.html +302 -0
  20. package/.agents/skills/diagram-design/assets/example-dependency.html +224 -0
  21. package/.agents/skills/diagram-design/assets/example-deployment.html +190 -0
  22. package/.agents/skills/diagram-design/assets/example-dp-integration.html +81 -0
  23. package/.agents/skills/diagram-design/assets/example-dp-security-matrix.html +88 -0
  24. package/.agents/skills/diagram-design/assets/example-er.html +202 -0
  25. package/.agents/skills/diagram-design/assets/example-exploded-ai-stack.html +85 -0
  26. package/.agents/skills/diagram-design/assets/example-exploded-keyboard.html +84 -0
  27. package/.agents/skills/diagram-design/assets/example-exploded-phone.html +83 -0
  28. package/.agents/skills/diagram-design/assets/example-exploded-unboxing.html +84 -0
  29. package/.agents/skills/diagram-design/assets/example-exploded.html +83 -0
  30. package/.agents/skills/diagram-design/assets/example-fishbone.html +152 -0
  31. package/.agents/skills/diagram-design/assets/example-flowchart.html +163 -0
  32. package/.agents/skills/diagram-design/assets/example-gantt.html +137 -0
  33. package/.agents/skills/diagram-design/assets/example-heatmap.html +224 -0
  34. package/.agents/skills/diagram-design/assets/example-high-level-vertical.html +325 -0
  35. package/.agents/skills/diagram-design/assets/example-high-level.html +301 -0
  36. package/.agents/skills/diagram-design/assets/example-import-drawio.html +185 -0
  37. package/.agents/skills/diagram-design/assets/example-import-excalidraw.html +70 -0
  38. package/.agents/skills/diagram-design/assets/example-import-mermaid.html +70 -0
  39. package/.agents/skills/diagram-design/assets/example-it-state.html +128 -0
  40. package/.agents/skills/diagram-design/assets/example-journey.html +148 -0
  41. package/.agents/skills/diagram-design/assets/example-kanban.html +174 -0
  42. package/.agents/skills/diagram-design/assets/example-layers.html +123 -0
  43. package/.agents/skills/diagram-design/assets/example-line.html +111 -0
  44. package/.agents/skills/diagram-design/assets/example-loop.html +100 -0
  45. package/.agents/skills/diagram-design/assets/example-marimekko.html +148 -0
  46. package/.agents/skills/diagram-design/assets/example-medallion.html +159 -0
  47. package/.agents/skills/diagram-design/assets/example-nested.html +136 -0
  48. package/.agents/skills/diagram-design/assets/example-org-chart.html +45 -0
  49. package/.agents/skills/diagram-design/assets/example-polar.html +116 -0
  50. package/.agents/skills/diagram-design/assets/example-process.html +64 -0
  51. package/.agents/skills/diagram-design/assets/example-pyramid.html +119 -0
  52. package/.agents/skills/diagram-design/assets/example-quadrant-consultant.html +166 -0
  53. package/.agents/skills/diagram-design/assets/example-quadrant.html +135 -0
  54. package/.agents/skills/diagram-design/assets/example-radar.html +139 -0
  55. package/.agents/skills/diagram-design/assets/example-ridgeline.html +104 -0
  56. package/.agents/skills/diagram-design/assets/example-sankey.html +150 -0
  57. package/.agents/skills/diagram-design/assets/example-scatter.html +141 -0
  58. package/.agents/skills/diagram-design/assets/example-sequence-oauth.html +227 -0
  59. package/.agents/skills/diagram-design/assets/example-sequence.html +222 -0
  60. package/.agents/skills/diagram-design/assets/example-service-blueprint.html +185 -0
  61. package/.agents/skills/diagram-design/assets/example-slopegraph.html +119 -0
  62. package/.agents/skills/diagram-design/assets/example-state-lifecycle.html +92 -0
  63. package/.agents/skills/diagram-design/assets/example-state.html +147 -0
  64. package/.agents/skills/diagram-design/assets/example-story-map.html +184 -0
  65. package/.agents/skills/diagram-design/assets/example-streamgraph.html +99 -0
  66. package/.agents/skills/diagram-design/assets/example-swimlane.html +172 -0
  67. package/.agents/skills/diagram-design/assets/example-timeline.html +135 -0
  68. package/.agents/skills/diagram-design/assets/example-tree-block-decomposition.html +151 -0
  69. package/.agents/skills/diagram-design/assets/example-tree.html +173 -0
  70. package/.agents/skills/diagram-design/assets/example-treemap.html +107 -0
  71. package/.agents/skills/diagram-design/assets/example-uml-class.html +188 -0
  72. package/.agents/skills/diagram-design/assets/example-venn.html +110 -0
  73. package/.agents/skills/diagram-design/assets/example-wardley.html +153 -0
  74. package/.agents/skills/diagram-design/assets/example-waterfall.html +129 -0
  75. package/.agents/skills/diagram-design/assets/template-dark.html +99 -0
  76. package/.agents/skills/diagram-design/assets/template-full.html +421 -0
  77. package/.agents/skills/diagram-design/assets/template-motion.html +448 -0
  78. package/.agents/skills/diagram-design/assets/template-terminal.html +188 -0
  79. package/.agents/skills/diagram-design/assets/template.html +100 -0
  80. package/.agents/skills/diagram-design/references/animation.md +143 -0
  81. package/.agents/skills/diagram-design/references/export-registry.md +78 -0
  82. package/.agents/skills/diagram-design/references/export.md +376 -0
  83. package/.agents/skills/diagram-design/references/import-drawio.md +181 -0
  84. package/.agents/skills/diagram-design/references/import-excalidraw.md +130 -0
  85. package/.agents/skills/diagram-design/references/import-mermaid.md +137 -0
  86. package/.agents/skills/diagram-design/references/layout-budget.md +97 -0
  87. package/.agents/skills/diagram-design/references/onboarding.md +368 -0
  88. package/.agents/skills/diagram-design/references/output-spec.md +277 -0
  89. package/.agents/skills/diagram-design/references/primitive-annotation.md +36 -0
  90. package/.agents/skills/diagram-design/references/primitive-icons.md +827 -0
  91. package/.agents/skills/diagram-design/references/primitive-sketchy.md +43 -0
  92. package/.agents/skills/diagram-design/references/primitive-terminal.md +76 -0
  93. package/.agents/skills/diagram-design/references/primitives-core.md +146 -0
  94. package/.agents/skills/diagram-design/references/profiles.md +183 -0
  95. package/.agents/skills/diagram-design/references/semantic-patterns.md +154 -0
  96. package/.agents/skills/diagram-design/references/style-guide.md +236 -0
  97. package/.agents/skills/diagram-design/references/style-vivid.md +148 -0
  98. package/.agents/skills/diagram-design/references/type-architecture-delta.md +143 -0
  99. package/.agents/skills/diagram-design/references/type-architecture.md +117 -0
  100. package/.agents/skills/diagram-design/references/type-axonometric-plan.md +83 -0
  101. package/.agents/skills/diagram-design/references/type-bar.md +108 -0
  102. package/.agents/skills/diagram-design/references/type-data-flow.md +371 -0
  103. package/.agents/skills/diagram-design/references/type-db-schema.md +48 -0
  104. package/.agents/skills/diagram-design/references/type-dependency.md +44 -0
  105. package/.agents/skills/diagram-design/references/type-deployment.md +45 -0
  106. package/.agents/skills/diagram-design/references/type-dp-integration.md +407 -0
  107. package/.agents/skills/diagram-design/references/type-dp-security-matrix.md +379 -0
  108. package/.agents/skills/diagram-design/references/type-er.md +25 -0
  109. package/.agents/skills/diagram-design/references/type-exploded.md +115 -0
  110. package/.agents/skills/diagram-design/references/type-fishbone.md +75 -0
  111. package/.agents/skills/diagram-design/references/type-flowchart.md +23 -0
  112. package/.agents/skills/diagram-design/references/type-gantt.md +45 -0
  113. package/.agents/skills/diagram-design/references/type-heatmap.md +80 -0
  114. package/.agents/skills/diagram-design/references/type-high-level.md +470 -0
  115. package/.agents/skills/diagram-design/references/type-it-state.md +468 -0
  116. package/.agents/skills/diagram-design/references/type-journey.md +55 -0
  117. package/.agents/skills/diagram-design/references/type-kanban.md +49 -0
  118. package/.agents/skills/diagram-design/references/type-layers.md +26 -0
  119. package/.agents/skills/diagram-design/references/type-line.md +337 -0
  120. package/.agents/skills/diagram-design/references/type-loop.md +223 -0
  121. package/.agents/skills/diagram-design/references/type-medallion.md +356 -0
  122. package/.agents/skills/diagram-design/references/type-nested.md +22 -0
  123. package/.agents/skills/diagram-design/references/type-org-chart.md +44 -0
  124. package/.agents/skills/diagram-design/references/type-polar.md +136 -0
  125. package/.agents/skills/diagram-design/references/type-process.md +490 -0
  126. package/.agents/skills/diagram-design/references/type-pyramid.md +33 -0
  127. package/.agents/skills/diagram-design/references/type-quadrant.md +81 -0
  128. package/.agents/skills/diagram-design/references/type-radar.md +82 -0
  129. package/.agents/skills/diagram-design/references/type-sankey.md +75 -0
  130. package/.agents/skills/diagram-design/references/type-scatter.md +276 -0
  131. package/.agents/skills/diagram-design/references/type-sequence.md +130 -0
  132. package/.agents/skills/diagram-design/references/type-service-blueprint.md +103 -0
  133. package/.agents/skills/diagram-design/references/type-state.md +30 -0
  134. package/.agents/skills/diagram-design/references/type-story-map.md +46 -0
  135. package/.agents/skills/diagram-design/references/type-swimlane.md +22 -0
  136. package/.agents/skills/diagram-design/references/type-timeline.md +20 -0
  137. package/.agents/skills/diagram-design/references/type-tree.md +24 -0
  138. package/.agents/skills/diagram-design/references/type-treemap.md +137 -0
  139. package/.agents/skills/diagram-design/references/type-uml-class.md +65 -0
  140. package/.agents/skills/diagram-design/references/type-venn.md +26 -0
  141. package/.agents/skills/diagram-design/references/type-wardley.md +39 -0
  142. package/.agents/skills/diagram-design/references/type-waterfall.md +75 -0
  143. package/.agents/skills/scrum-meta/SKILL.md +36 -36
  144. package/.agents/skills/scrum-planning/SKILL.md +61 -61
  145. package/.agents/skills/scrum-planning/references/schema.md +384 -336
  146. package/.agents/skills/scrum-report/SKILL.md +42 -42
  147. package/.agents/skills/scrum-sprint/SKILL.md +49 -49
  148. package/.agents/skills/scrum-tdd/SKILL.md +140 -127
  149. package/README.md +224 -201
  150. package/assets/board/200.html +1 -1
  151. package/assets/board/404.html +1 -1
  152. package/assets/board/_nuxt/1XlYaCp9.js +1 -0
  153. package/assets/board/_nuxt/4gQF_HS3.js +1 -0
  154. package/assets/board/_nuxt/5okfNy5D.js +1 -0
  155. package/assets/board/_nuxt/{Bb3Limos.js → B0C2jsdk.js} +1 -1
  156. package/assets/board/_nuxt/B1j6UC4U.js +1 -0
  157. package/assets/board/_nuxt/B3LKy6o2.js +1 -0
  158. package/assets/board/_nuxt/BAQQngAq.js +13 -0
  159. package/assets/board/_nuxt/BE6t7Q2m.js +1 -0
  160. package/assets/board/_nuxt/BLvbupFS.js +1 -0
  161. package/assets/board/_nuxt/BQgzP7ur.js +1 -0
  162. package/assets/board/_nuxt/BRZIF_wo.js +1 -0
  163. package/assets/board/_nuxt/BW3xJdEx.js +1 -0
  164. package/assets/board/_nuxt/{Cm9lkUvP.js → BY36DFyj.js} +1 -1
  165. package/assets/board/_nuxt/BZlZD94i.js +1 -0
  166. package/assets/board/_nuxt/BZvXNwev.js +3 -0
  167. package/assets/board/_nuxt/BbxmvdIF.js +1 -0
  168. package/assets/board/_nuxt/BiWrMOsL.js +1 -0
  169. package/assets/board/_nuxt/BizDeOK5.js +1 -0
  170. package/assets/board/_nuxt/BkcaOYQ_.js +95 -0
  171. package/assets/board/_nuxt/BkoKCNUY.js +1 -0
  172. package/assets/board/_nuxt/BlKmZhhF.js +1 -0
  173. package/assets/board/_nuxt/BmBpmU73.js +1 -0
  174. package/assets/board/_nuxt/BrWE0up6.js +1 -0
  175. package/assets/board/_nuxt/Bs52qkgk.js +1 -0
  176. package/assets/board/_nuxt/BtzUbHO_.js +1 -0
  177. package/assets/board/_nuxt/BuBzMkFZ.js +1 -0
  178. package/assets/board/_nuxt/Bubk0xn-.js +1 -0
  179. package/assets/board/_nuxt/BxuBMtk_.js +3 -0
  180. package/assets/board/_nuxt/By1KXXLR.js +1 -0
  181. package/assets/board/_nuxt/BygIGL69.js +2 -0
  182. package/assets/board/_nuxt/C1iO5KH3.js +1 -0
  183. package/assets/board/_nuxt/C2YPmTzt.js +1 -0
  184. package/assets/board/_nuxt/C3SpAhCW.js +1 -0
  185. package/assets/board/_nuxt/C3ZRWz5L.js +1 -0
  186. package/assets/board/_nuxt/C4WdPP6K.js +1 -0
  187. package/assets/board/_nuxt/C6o03JHe.js +1 -0
  188. package/assets/board/_nuxt/C8qB5llI.js +1 -0
  189. package/assets/board/_nuxt/C9MgRdhu.js +1 -0
  190. package/assets/board/_nuxt/CCA81-4P.js +1 -0
  191. package/assets/board/_nuxt/{D2O8Q8x9.js → CFCM18fF.js} +1 -1
  192. package/assets/board/_nuxt/CGXljzd_.js +1 -0
  193. package/assets/board/_nuxt/CI0scS-N.js +1 -0
  194. package/assets/board/_nuxt/CJs9B42o.js +1 -0
  195. package/assets/board/_nuxt/COecDWbb.js +1 -0
  196. package/assets/board/_nuxt/COmtTtfB.js +1 -0
  197. package/assets/board/_nuxt/CPYm4J_K.js +1 -0
  198. package/assets/board/_nuxt/CReA4TEB.js +3 -0
  199. package/assets/board/_nuxt/CXG7GZes.js +1 -0
  200. package/assets/board/_nuxt/CYGiZn-X.js +1 -0
  201. package/assets/board/_nuxt/CaE8VlUp.js +1 -0
  202. package/assets/board/_nuxt/CcGiNUgA.js +1 -0
  203. package/assets/board/_nuxt/Ccgv3lDj.js +1 -0
  204. package/assets/board/_nuxt/CdPGFZyy.js +1 -0
  205. package/assets/board/_nuxt/{DfR3IZN_.js → Cdf_T8Xa.js} +1 -1
  206. package/assets/board/_nuxt/CgQ30j_6.js +1 -0
  207. package/assets/board/_nuxt/ChUHb39z.js +1 -0
  208. package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
  209. package/assets/board/_nuxt/CkWKLtjO.js +1 -0
  210. package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
  211. package/assets/board/_nuxt/CtFknnHZ.js +1 -0
  212. package/assets/board/_nuxt/D166WVUG.js +1 -0
  213. package/assets/board/_nuxt/D4Dpzo9e.js +1 -0
  214. package/assets/board/_nuxt/D5i92OZO.js +1 -0
  215. package/assets/board/_nuxt/D6dUp4Nm.js +9 -0
  216. package/assets/board/_nuxt/DFQDFspC.js +1 -0
  217. package/assets/board/_nuxt/DHX2tw9J.js +1 -0
  218. package/assets/board/_nuxt/DJM7u8P3.js +1 -0
  219. package/assets/board/_nuxt/{BPTrRhcw.js → DLr85ebo.js} +1 -1
  220. package/assets/board/_nuxt/DOMM1wfl.js +1 -0
  221. package/assets/board/_nuxt/DU6ArlUN.js +1 -0
  222. package/assets/board/_nuxt/{B_SlFcWp.js → DUgGsde6.js} +1 -1
  223. package/assets/board/_nuxt/DV4ti-Pq.js +1 -0
  224. package/assets/board/_nuxt/DZ--fXuU.js +1 -0
  225. package/assets/board/_nuxt/D_ct-Stz.js +2 -0
  226. package/assets/board/_nuxt/DbWAComO.js +1 -0
  227. package/assets/board/_nuxt/DbwlcHAt.js +1 -0
  228. package/assets/board/_nuxt/DjzLR9Bl.js +1 -0
  229. package/assets/board/_nuxt/Dki9VkAL.js +3 -0
  230. package/assets/board/_nuxt/DlNJhOoc.js +1 -0
  231. package/assets/board/_nuxt/DqG7CtD4.js +1 -0
  232. package/assets/board/_nuxt/DqUSsCJ2.js +1 -0
  233. package/assets/board/_nuxt/Du2F4WXh.js +1 -0
  234. package/assets/board/_nuxt/DuRiEXn4.js +1 -0
  235. package/assets/board/_nuxt/DxBwVNyP.js +2 -0
  236. package/assets/board/_nuxt/DzmVW5-D.js +1 -0
  237. package/assets/board/_nuxt/I-sGtDIB.js +6 -0
  238. package/assets/board/_nuxt/JU9-x68N.js +1 -0
  239. package/assets/board/_nuxt/Lozm7hhE.js +1 -0
  240. package/assets/board/_nuxt/MMsTMkcB.js +1 -0
  241. package/assets/board/_nuxt/MS7CGmCB.js +1 -0
  242. package/assets/board/_nuxt/OKKaKILz.js +1 -0
  243. package/assets/board/_nuxt/{Csqgy925.js → P6qlvBHA.js} +1 -1
  244. package/assets/board/_nuxt/SrNUvNwO.js +1 -0
  245. package/assets/board/_nuxt/{DSaWoFHS.js → SywdkA98.js} +1 -1
  246. package/assets/board/_nuxt/TBIRpVLG.js +1 -0
  247. package/assets/board/_nuxt/TlTrMIMm.js +1 -0
  248. package/assets/board/_nuxt/Zv9-SOQF.js +1 -0
  249. package/assets/board/_nuxt/_id_.ItzoSaBL.css +1 -0
  250. package/assets/board/_nuxt/builds/latest.json +1 -1
  251. package/assets/board/_nuxt/builds/meta/2218461a-f45b-41d6-ae44-b0d2332a9511.json +1 -0
  252. package/assets/board/_nuxt/burndown.CT8fx1Ge.css +1 -0
  253. package/assets/board/_nuxt/diagrams.D1ybqBem.css +1 -0
  254. package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BCuHiFgF.css} +1 -1
  255. package/assets/board/_nuxt/epics.CUeDIEa0.css +1 -0
  256. package/assets/board/_nuxt/error-404.Y9imKiDC.css +1 -0
  257. package/assets/board/_nuxt/error-500.DufSBGVC.css +1 -0
  258. package/assets/board/_nuxt/gantt.CiC2Ts1t.css +1 -0
  259. package/assets/board/_nuxt/jbri6q1p.js +1 -0
  260. package/assets/board/_nuxt/last-change.C05Vc3BF.css +1 -0
  261. package/assets/board/_nuxt/milestones.Civ3sMiQ.css +1 -0
  262. package/assets/board/_nuxt/oSJF4yHw.js +1 -0
  263. package/assets/board/_nuxt/pages.BshWbOyo.css +1 -0
  264. package/assets/board/_nuxt/q_8bxRMt.js +1 -0
  265. package/assets/board/_nuxt/tests.Ci9fBCka.css +1 -0
  266. package/assets/board/burndown/index.html +1 -1
  267. package/assets/board/diagrams/index.html +1 -0
  268. package/assets/board/epics/index.html +1 -1
  269. package/assets/board/favicon.svg +16 -16
  270. package/assets/board/gantt/index.html +1 -1
  271. package/assets/board/index.html +1 -1
  272. package/assets/board/last-change/index.html +1 -1
  273. package/assets/board/milestones/index.html +1 -1
  274. package/assets/board/tests/index.html +1 -1
  275. package/bin/scrum-skills.mjs +204 -191
  276. package/docs/ai-assistant-guide.md +1008 -1008
  277. package/package.json +42 -41
  278. package/templates/AGENTS.md +84 -74
  279. package/tools/agile-tools.mjs +510 -510
  280. package/tools/ai.mjs +464 -464
  281. package/tools/diagram-import.mjs +238 -0
  282. package/tools/diagram-lint.mjs +518 -0
  283. package/tools/diagram.mjs +299 -0
  284. package/tools/git-commit.mjs +216 -216
  285. package/tools/last-change.mjs +326 -326
  286. package/tools/projects.mjs +240 -215
  287. package/tools/serve.mjs +180 -154
  288. package/tools/validate.mjs +781 -664
  289. package/assets/board/_nuxt/1eqboJxR.js +0 -1
  290. package/assets/board/_nuxt/2K7ag6ES.js +0 -1
  291. package/assets/board/_nuxt/51OWHj8c.js +0 -2
  292. package/assets/board/_nuxt/6gFtTBwm.js +0 -1
  293. package/assets/board/_nuxt/B3jkABw9.js +0 -1
  294. package/assets/board/_nuxt/B5n2_jZN.js +0 -1
  295. package/assets/board/_nuxt/BDK2Hj7B.js +0 -1
  296. package/assets/board/_nuxt/BDcnzXHq.js +0 -1
  297. package/assets/board/_nuxt/BaG8y0Wt.js +0 -1
  298. package/assets/board/_nuxt/BbwJq5pb.js +0 -1
  299. package/assets/board/_nuxt/BgLeKwx0.js +0 -1
  300. package/assets/board/_nuxt/Bi9Axj3V.js +0 -1
  301. package/assets/board/_nuxt/BmxvtaMq.js +0 -1
  302. package/assets/board/_nuxt/BodFvto3.js +0 -1
  303. package/assets/board/_nuxt/BpWeHLuN.js +0 -1
  304. package/assets/board/_nuxt/BuOKDFiJ.js +0 -1
  305. package/assets/board/_nuxt/C40iTe-x.js +0 -1
  306. package/assets/board/_nuxt/C7K0R7F-.js +0 -2
  307. package/assets/board/_nuxt/C8vL692X.js +0 -1
  308. package/assets/board/_nuxt/C9StZL3D.js +0 -3
  309. package/assets/board/_nuxt/CGI_ZV79.js +0 -1
  310. package/assets/board/_nuxt/CJ2mz0WY.js +0 -1
  311. package/assets/board/_nuxt/CJMBJQuf.js +0 -1
  312. package/assets/board/_nuxt/CK-lOYG9.js +0 -1
  313. package/assets/board/_nuxt/CK9_veoz.js +0 -1
  314. package/assets/board/_nuxt/CLBcBrYf.js +0 -1
  315. package/assets/board/_nuxt/CMUi2-Lj.js +0 -1
  316. package/assets/board/_nuxt/COf6E6h4.js +0 -1
  317. package/assets/board/_nuxt/CPCUMJnF.js +0 -1
  318. package/assets/board/_nuxt/CPcKlmSm.js +0 -1
  319. package/assets/board/_nuxt/CQTvWh4i.js +0 -1
  320. package/assets/board/_nuxt/CSEEUF8S.js +0 -1
  321. package/assets/board/_nuxt/CSSb154I.js +0 -13
  322. package/assets/board/_nuxt/CgDTd7jS.js +0 -1
  323. package/assets/board/_nuxt/ChG76uh9.js +0 -1
  324. package/assets/board/_nuxt/Ci0qbkgh.js +0 -1
  325. package/assets/board/_nuxt/CqoQ__I_.js +0 -1
  326. package/assets/board/_nuxt/CuJUHLl8.js +0 -1
  327. package/assets/board/_nuxt/CvLiA4_O.js +0 -1
  328. package/assets/board/_nuxt/Cvs12oA0.js +0 -3
  329. package/assets/board/_nuxt/CyEXFe3V.js +0 -1
  330. package/assets/board/_nuxt/Cz6rZcLK.js +0 -1
  331. package/assets/board/_nuxt/D2FhHl1o.js +0 -1
  332. package/assets/board/_nuxt/D3YCAmfu.js +0 -1
  333. package/assets/board/_nuxt/D5CE81jK.js +0 -1
  334. package/assets/board/_nuxt/D75vbfSb.js +0 -1
  335. package/assets/board/_nuxt/D99LbGfb.js +0 -9
  336. package/assets/board/_nuxt/DEfLc7p3.js +0 -6
  337. package/assets/board/_nuxt/DF-nsa1Z.js +0 -1
  338. package/assets/board/_nuxt/DIc8yx98.js +0 -1
  339. package/assets/board/_nuxt/DLkAKotw.js +0 -1
  340. package/assets/board/_nuxt/DRPlYvb3.js +0 -1
  341. package/assets/board/_nuxt/DRlQgul3.js +0 -1
  342. package/assets/board/_nuxt/DSLbmoWa.js +0 -1
  343. package/assets/board/_nuxt/DWO9c9yp.js +0 -1
  344. package/assets/board/_nuxt/DZo3dYLJ.js +0 -3
  345. package/assets/board/_nuxt/D_S6N7_b.js +0 -1
  346. package/assets/board/_nuxt/DajA-Tkt.js +0 -1
  347. package/assets/board/_nuxt/DbHiyab-.js +0 -1
  348. package/assets/board/_nuxt/Dc7Ql6eE.js +0 -1
  349. package/assets/board/_nuxt/Dd9ZukPU.js +0 -1
  350. package/assets/board/_nuxt/Dg2LiqmN.js +0 -1
  351. package/assets/board/_nuxt/DhuleNnm.js +0 -1
  352. package/assets/board/_nuxt/DkI1Qxpp.js +0 -95
  353. package/assets/board/_nuxt/DnDHGSYI.js +0 -1
  354. package/assets/board/_nuxt/DpXJ_tCU.js +0 -1
  355. package/assets/board/_nuxt/DqZgF3hU.js +0 -1
  356. package/assets/board/_nuxt/DqcxvfbD.js +0 -1
  357. package/assets/board/_nuxt/DsA2lVci.js +0 -1
  358. package/assets/board/_nuxt/Dtsa-1NS.js +0 -1
  359. package/assets/board/_nuxt/Du91iq0p.js +0 -1
  360. package/assets/board/_nuxt/Dx1wcYFo.js +0 -1
  361. package/assets/board/_nuxt/EYTShbt4.js +0 -1
  362. package/assets/board/_nuxt/MaXJprwN.js +0 -1
  363. package/assets/board/_nuxt/P9x67aq2.js +0 -1
  364. package/assets/board/_nuxt/S08nFESZ.js +0 -3
  365. package/assets/board/_nuxt/V0uynWE2.js +0 -1
  366. package/assets/board/_nuxt/Vo4wMbnS.js +0 -1
  367. package/assets/board/_nuxt/ZVTqot-_.js +0 -1
  368. package/assets/board/_nuxt/ZngEd3HB.js +0 -1
  369. package/assets/board/_nuxt/_id_.B2NDKSlX.css +0 -1
  370. package/assets/board/_nuxt/assMu_Wn.js +0 -1
  371. package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +0 -1
  372. package/assets/board/_nuxt/burndown.Do6IbM6o.css +0 -1
  373. package/assets/board/_nuxt/epics.Dmessplu.css +0 -1
  374. package/assets/board/_nuxt/error-404.BFmXOnCT.css +0 -1
  375. package/assets/board/_nuxt/error-500.BZ-DdjQ6.css +0 -1
  376. package/assets/board/_nuxt/gantt.Dmp00GUo.css +0 -1
  377. package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
  378. package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
  379. package/assets/board/_nuxt/pages.Dbj2IVk8.css +0 -1
  380. package/assets/board/_nuxt/rlePnzpc.js +0 -1
  381. package/assets/board/_nuxt/tests.dXlUX16A.css +0 -1
  382. package/assets/board/_nuxt/uKzCKCTq.js +0 -1
  383. package/assets/board/_nuxt/vwxaNGfc.js +0 -1
  384. package/assets/board/_nuxt/yh6sf_D5.js +0 -1
@@ -0,0 +1,356 @@
1
+ # Medallion
2
+
3
+ **Best for:** documenting a multi-tier data-storage layout where each tier is a distinct *quality / access level* of the same dataset — typically raw landing zone, anonymised, staging/cleaned, aggregated business indicators, and cold archive. Used when the reader needs to see at a glance *what each bucket contains*, *who writes it*, *with what tool and format*, and *how data is promoted between tiers*.
4
+
5
+ Prefer **Process** if the subject is a workflow with role lanes. Prefer **High-Level** if the subject is the cluster architecture rather than the storage tier organisation.
6
+
7
+ This type is **parametric** — the inputs schema in §1 drives every coordinate via the formulas in §2. Two generations from the same inputs must produce visually identical SVG. The rule shapes mirror `type-process.md` and `type-data-flow.md` so color override, focal rule, and reproducibility checklist read identically across types.
8
+
9
+ ---
10
+
11
+ ## 1. Inputs — the parameter contract
12
+
13
+ ```yaml
14
+ title: "Five-Tier Medallion Architecture"
15
+ subtitle: "Quarterly survey through Raw → Anonymized → Staging → Aggregated → Archive"
16
+
17
+ tiers: # 3..6 tier columns, ordered left → right
18
+ - { name: "Raw", bucket: "raw-bucket", style: "outer",
19
+ fields: { tool: "NiFi · raw write", format: "CSV · Parquet · JSON", writer: "Data Engineer",
20
+ example: ["Q1 dump · w/ PII", "verbatim CAPI export"] } }
21
+ - { name: "Anonymized", bucket: "anon-bucket", style: "default",
22
+ fields: { tool: "Trino INSERT", format: "Iceberg · partitioned", writer: "Data Engineer",
23
+ example: ["no name · address", "stable household ID"] } }
24
+ - { name: "Staging", bucket: "staging-bucket", style: "default", color: "#c9a23a", # warm yellow — analytical working zone
25
+ fields: { tool: "Trino · JupyterHub", format: "Iceberg · cleaned", writer: "Data Scientist",
26
+ example: ["weighted records", "harmonised codings"] } }
27
+ - { name: "Aggregated", bucket: "aggregated-bucket", style: "focal", focal: true,
28
+ fields: { tool: "Trino INSERT · SAS JDBC", format: "Iceberg · indicators", writer: "Data Scientist",
29
+ example: ["unemployment rate", "labour participation"] } }
30
+ - { name: "Archive", bucket: "archive-bucket", style: "cold",
31
+ fields: { tool: "MinIO lifecycle", format: "cold tier · immutable", writer: "Data Administrator",
32
+ example: ["historical Q1–Q4 sets", "5+ years retained"] } }
33
+
34
+ example_label: "Quarterly survey example" # bottom field label (varies per domain)
35
+
36
+ promotions: # adjacent-tier arrows; len = n_tiers - 1
37
+ - { from: 0, to: 1, label: "PII REMOVE", style: "normal" }
38
+ - { from: 1, to: 2, label: "CLEAN+WEIGHT", style: "normal" }
39
+ - { from: 2, to: 3, label: "AGGREGATE", style: "focal" } # auto-accent because target is focal
40
+ - { from: 3, to: 4, label: "LIFECYCLE", style: "lifecycle" } # dashed
41
+
42
+ paths: # 0..2 write-method cards at the bottom (optional)
43
+ - { tag: "SQL PATH", title: "Trino INSERT INTO … SELECT",
44
+ sub: "filter · reshape · join · aggregate — set-based transforms" }
45
+ - { tag: "NOTEBOOK PATH", title: "DuckDB + Python/R in JupyterHub",
46
+ sub: "stats · ML · interactive analysis — row-iterative work" }
47
+
48
+ dark: false
49
+ ```
50
+
51
+ **Reserved field semantics:**
52
+ - `tiers[i].style` — one of `outer`, `default`, `focal`, `cold`. Drives the card's fill/stroke palette (§2.4).
53
+ - `tiers[i].focal: true` — exactly **one** tier may declare this. Overrides `style` to `focal` and switches the promotion arrow *into* this tier to `focal` automatically.
54
+ - `tiers[i].fields` — `{tool, format, writer, example}`. `example` is a 1- or 2-item list; the section heading uses `example_label`.
55
+ - `tiers[i].color` — optional `"#hex"` per-tier color override. See §4.
56
+ - `promotions[].style` — `normal` | `focal` | `lifecycle`. The connector rule (§3) binds each style to fixed stroke / dash / marker.
57
+ - `paths` — 0–2 entries. When 0 entries, the bottom row is omitted and `viewBox_h` shrinks accordingly.
58
+
59
+ ---
60
+
61
+ ## 2. Layout formulas — deterministic geometry
62
+
63
+ ```
64
+ # Tier dimensions
65
+ tier_w = 172
66
+ tier_h = 380
67
+ tier_gap = 16
68
+ left_pad = 16
69
+ right_pad = 100
70
+ n_tiers = len(tiers)
71
+
72
+ # Canvas
73
+ viewBox_w = left_pad + n_tiers * tier_w + (n_tiers - 1) * tier_gap + right_pad
74
+ # 5 tiers → 16 + 860 + 64 + 100 = 1040
75
+ arc_band_h = 80 # space above tiers reserved for promotion arcs
76
+ path_h = 56
77
+ path_gap = 16 # gap between tier row and path row
78
+ bottom_pad = 16
79
+ viewBox_h = arc_band_h + tier_h + (path_gap + path_h if paths else 0) + bottom_pad
80
+ # with paths → 80+380+72+16 = 548
81
+ # without paths → 80+380+16 = 476
82
+
83
+ # Tier positions
84
+ tier_x(i) = left_pad + i * (tier_w + tier_gap) # 16, 204, 392, 580, 768
85
+ tier_y = arc_band_h # 80 — tier tops sit just below the arc band
86
+ tier_cx(i) = tier_x(i) + tier_w/2 # 102, 290, 478, 666, 854
87
+
88
+ # Promotion arcs (between adjacent tiers — over the top, anchored at tier top-centers)
89
+ arc_src_x(i) = tier_cx(i) # top-center of tier i (102, 290, 478, 666)
90
+ arc_dst_x(i) = tier_cx(i+1) # top-center of tier i+1 (290, 478, 666, 854)
91
+ arc_peak_x(i) = (arc_src_x(i) + arc_dst_x(i)) / 2 # midpoint (196, 384, 572, 760)
92
+ arc_label_y = 50 # label sits inside the arc, 30px below tier top
93
+
94
+ # Path row (bottom)
95
+ path_y = tier_y + tier_h + path_gap # 476
96
+ path_w = (viewBox_w - 2*left_pad - path_gap) / 2 if len(paths) == 2 else (viewBox_w - 2*left_pad)
97
+ # Canonical 5-tier shape uses path_w=460 explicitly (see §2.5)
98
+ ```
99
+
100
+ ### 2.1 Background
101
+
102
+ Solid paper fill across the full viewBox. No dot pattern.
103
+
104
+ ### 2.2 Tier card (172 × 380)
105
+
106
+ Each tier renders as a rounded-rect card with a tinted header band, a centered bucket name, four labeled field rows, and a separated `example_label` section near the bottom.
107
+
108
+ ```
109
+ tier_x(i), tier_y = card top-left (tier_y = 80, just below the arc band)
110
+ header_band_h = 40 # band from y=tier_y to y=tier_y+40 (i.e., 80..120)
111
+ header_band_extra = 10 # 10-px extension below band, same tint
112
+
113
+ # Inside the card (absolute y; tier_y = 80):
114
+ title_text at (tier_cx(i), 106) # node-name role, 13px, weight 700, ink
115
+ bucket_text at (tier_cx(i), 144) # sublabel role, muted (accent on focal tier)
116
+
117
+ field_x = tier_x(i) + 16 # 16-px left inset for field text
118
+ field_w = 140 # 172-px tier_w minus two 16-px insets
119
+ field rows (absolute y):
120
+ tool_label at 180, tool_value at 186 (foreignObject, height 24)
121
+ format_label at 220, format_value at 226 (foreignObject, height 24)
122
+ writer_label at 260, writer_value at 266 (foreignObject, height 24)
123
+ # gap (open whitespace below writer row, above the example section)
124
+ example_label_text at 360, example_line_0 at 374, example_line_1 at 388
125
+ ```
126
+
127
+ **Field-value wrapping rule:** field values (tool / format / writer) render inside an SVG `<foreignObject>` with an HTML `<div>` so they auto-wrap when text exceeds 140 px. Each `foreignObject` is 140 wide × 24 tall (fits 2 lines in the `sublabel` role at 1.25 line-height). The 26-px gap to the next field's label absorbs the second line cleanly.
128
+
129
+ ```svg
130
+ <foreignObject x="{field_x}" y="{value_top}" width="140" height="24">
131
+ <div xmlns="http://www.w3.org/1999/xhtml"
132
+ style="font-family: {sublabel}; color: {muted}; line-height: 1.25;">
133
+ {field_value}
134
+ </div>
135
+ </foreignObject>
136
+ ```
137
+
138
+ The HTML namespace declaration on the `<div>` is required for SVG to render the inline content. Browsers and Playwright/Chromium render this faithfully; if your export target doesn't support `<foreignObject>` (some older Inkscape builds), hand-split long values into two `<tspan>` lines instead.
139
+
140
+ Field labels use the `node-name` role at 11px in ink. Field values use the `sublabel` role in muted. Bucket and field values can be retinted by `color` override (§4).
141
+
142
+ ### 2.3 Tier styles
143
+
144
+ Four canonical styles, picked per tier via `tiers[i].style`. Default mapping if `style` is omitted: tier 0 → `outer`, last tier → `cold`, focal tier (if any) → `focal`, others → `default`.
145
+
146
+ | `style` | Card fill | Card stroke | Header band fill | Bucket text | Example value text |
147
+ |---|---|---|---|---|---|
148
+ | `outer` | `#FFFFFF` | `muted` 1.0 solid | `muted @ 0.10` | `muted` | `muted` |
149
+ | `default` | `#FFFFFF` | `ink` 1.0 solid | `ink @ 0.06` | `muted` | `muted` |
150
+ | `focal` | `accent @ 0.07` | `accent` 1.6 solid | `accent @ 0.14` | `accent` | `accent` |
151
+ | `cold` | `paper-2` | `muted` 1.0 dashed `5,3` | `muted @ 0.18` | `muted` | `muted` |
152
+
153
+ `rx = 6` on all card rects.
154
+
155
+ **Focal styling note:** the focal tier's accent treatment cascades — its bucket text and its example-value lines render in accent. Other field values (tool/format/writer) stay muted; only the bucket name and the example payload carry the focal signal so the tier card doesn't fully drown in coral.
156
+
157
+ ### 2.4 Promotion arcs (over the top of the tiers)
158
+
159
+ Each promotion is a **cubic Bézier arc** anchored at the **top-center** of each adjacent tier — `(tier_cx(i), tier_y)` to `(tier_cx(i+1), tier_y)`. The arc rises into the 80-px `arc_band` above the cards, peaking at y ≈ 20. Both the connector and its label remain fully visible — no paper masks, no overlap with card content.
160
+
161
+ ```svg
162
+ <path d="M {tier_cx(i)},{tier_y} C {tier_cx(i)},0 {tier_cx(i+1)},0 {tier_cx(i+1)},{tier_y}"
163
+ fill="none" stroke="…" stroke-width="…" marker-end="…"/>
164
+ ```
165
+
166
+ Concrete for the canonical 5-tier shape (`tier_y = 80`, tier centers at x = 102, 290, 478, 666, 854):
167
+ - 0→1: `M 102,80 C 102,0 290,0 290,80`
168
+ - 1→2: `M 290,80 C 290,0 478,0 478,80`
169
+ - 2→3: `M 478,80 C 478,0 666,0 666,80` (focal — accent)
170
+ - 3→4: `M 666,80 C 666,0 854,0 854,80` (lifecycle — dashed)
171
+
172
+ The cubic geometry: anchor y = 80 (tier top), control y = 0 (top of viewBox). Curve peak at t=0.5 sits at y ≈ 20 (computed from `0.125·80 + 0.375·0 + 0.375·0 + 0.125·80 = 20`). Each arc spans one full tier-stride (188 px on the canonical layout), giving the connector a clearly visible vertical excursion.
173
+
174
+ **Marker orientation:** `marker-end` with `orient="auto"` rotates the arrow to match the path tangent at the endpoint. The control point sits directly above the anchor so the tangent at landing is straight **down** — the arrowhead enters the top-center of tier *i+1* cleanly, pointing into the header band.
175
+
176
+ **Chained anchors:** consecutive arcs share their meeting points (arc 0→1 ends at the same `(tier_cx(1), 80)` where arc 1→2 begins). Visually each tier's top-center acts as a "joint" — data arrives at the top of the card, gets transformed inside, and leaves out the top toward the next tier. The arrow-head plunge plus the next arc's straight-up emergence read as a single payload-handoff motion.
177
+
178
+ | `style` | Stroke | Width | Dash | Marker |
179
+ |---|---|---|---|---|
180
+ | `normal` | `muted` | 1.4 | — | `arrow` |
181
+ | `focal` | `accent` | 1.6 | — | `arrow-accent` |
182
+ | `lifecycle` | `muted` | 1.4 | `4,3` | `arrow` |
183
+
184
+ **Auto-style rules:**
185
+ - If `promotions[k].to` references the **focal tier**, the style auto-promotes to `focal` (accent, width 1.6, `arrow-accent` marker).
186
+ - If `promotions[k].to` references a tier with a **`color` override** (§4), the arrow inherits that hex — stroke = `C`, label fill = `C`, marker-end uses a color-matched marker (e.g., `arrow-yellow` for `#c9a23a`). Width stays at 1.4 — the color override is a "concern" signal, not a focal promotion. Lifecycle/dashed arrows keep their dash but adopt the color.
187
+ - Focal wins if both apply (a colored tier marked focal still uses accent).
188
+
189
+ **Label inside the arc:**
190
+ - Anchored at `(arc_peak_x(k), arc_label_y)` = `((arc_src_x + arc_dst_x) / 2, 50)`.
191
+ - `arrow-label` role at 10px with `letter-spacing=0.08em`, uppercase. Color matches the arrow stroke.
192
+ - **No mask rect needed** — the cubic curve peaks at y ≈ 20 and the label sits at y=50, well below the curve. The label floats inside the open space *enclosed* by the arc, reading "X transforms into Y" with the arc itself as the visual frame.
193
+
194
+ For shorter inter-tier gaps (if `tier_gap` is overridden below the default 16 px), the arc anchors `arc_inset` may need to shrink correspondingly to keep the arc visible.
195
+
196
+ ### 2.5 Path row (bottom, optional)
197
+
198
+ Up to **2** write-method cards. The canonical 5-tier shape (with `arc_band_h = 80`):
199
+
200
+ ```
201
+ path_y = 476 # tier_y + tier_h + path_gap = 80 + 380 + 16
202
+ path_h = 56
203
+ path_x[0] = 16
204
+ path_w[0] = 460
205
+ path_x[1] = 16 + 460 + 16 = 492
206
+ path_w[1] = 460
207
+ ```
208
+
209
+ (Both paths land 460-wide despite the viewBox being 1040 — the right pad is taken from the card's tier strip, not the path strip. Keep `path_w=460` for the canonical 5-tier shape. For other tier counts, derive `path_w = (viewBox_w - 2*left_pad - path_gap) / 2`.)
210
+
211
+ Per-card content:
212
+ - Container rect: white fill, `ink @ 0.20` stroke width 1, `rx=6`.
213
+ - Tag chip: rect at `(path_x + 8, path_y + 6)`, `h=12 rx=2`, fill transparent, stroke `ink @ 0.30` width 0.8. Tag text centered inside in the `eyebrow` role with letter-spacing 0.08em, ink.
214
+ - Title at `(path_x + 80, path_y + 30)`: `node-name` role at 11px, ink.
215
+ - Sub at `(path_x + 80, path_y + 46)`: `sublabel` role, muted.
216
+
217
+ ---
218
+
219
+ ## 3. Connector rules (mandatory)
220
+
221
+ Three styles, bound to topology. Mirror §3 of `type-process.md` so the rule reads identically.
222
+
223
+ ```svg
224
+ <defs>
225
+ <marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="{muted}"/></marker>
226
+ <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>
227
+ <!-- Per-color markers: declare one per custom tier color in use. -->
228
+ <marker id="arrow-yellow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#c9a23a"/></marker>
229
+ </defs>
230
+ ```
231
+
232
+ Add a new `<marker>` for each `color` override used in the diagram. Naming convention: `arrow-{semantic}` (e.g., `arrow-yellow`, `arrow-slate`, `arrow-red`) — matches the recommended palette so the marker id reads cleanly in source.
233
+
234
+ **Z-order:** promotion arcs draw **before** any tier card rect, so the cards layer on top and any arc overshoot is masked inside the cards.
235
+
236
+ **Arc shape rule:** medallion promotions are always **cubic arcs over the top** of the tier strip, anchored at the **top-center** of source and target tiers; control points directly above anchors at y=0. No horizontal "through the gap" lines — the arc-over-top is what makes connector + label both clearly visible.
237
+
238
+ ---
239
+
240
+ ## 4. Component color override
241
+
242
+ Any tier or path entry accepts an optional `color: "#hex"`. Mirrors `type-process.md` §4 / `type-data-flow.md` §4.
243
+
244
+ ### 4.1 Per-tier `color`
245
+
246
+ Applied to:
247
+
248
+ | Element | Light | Dark |
249
+ |---|---|---|
250
+ | Card fill | `rgba(C, 0.07)` | `rgba(C_light, 0.10)` |
251
+ | Card stroke | `C` (width 1.4) | `C_light` (width 1.4) |
252
+ | Header band fill | `rgba(C, 0.14)` | `rgba(C_light, 0.18)` |
253
+ | Title text | ink (unchanged — title stays readable) | ink (unchanged) |
254
+ | Bucket text | `C` | `C_light` |
255
+ | Example values | `C` | `C_light` |
256
+ | Field labels / field values | **unchanged** (ink / muted) | **unchanged** |
257
+ | Connectors touching this tier | **unchanged** — topology-driven | **unchanged** |
258
+
259
+ `C_light` = the same hex lightened ~15% for dark-mode contrast.
260
+
261
+ ### 4.2 Per-path `color`
262
+
263
+ Replaces the path card's stroke with `rgba(C, 0.45)` and the tag chip stroke with `rgba(C, 0.55)`. Tag text and title text use `C`. Sub stays muted.
264
+
265
+ ### 4.3 Rules
266
+
267
+ - **Never on focal tiers.** The accent already carries that signal — a `color` on the focal tier is ignored.
268
+ - **Never on the `cold` tier in addition to its dashed treatment.** Pick either dashed-cold or a custom color, not both.
269
+ - **Cap at 2 custom-colored elements** per diagram (tier or path), in addition to the focal tier.
270
+ - **Promotion arrows inherit the target tier's color** (§3 auto-style rule). A `color: "#c9a23a"` on the Staging tier means the CLEAN+WEIGHT arc landing in Staging is also rendered in yellow — connector, label, and arrowhead match. This keeps visual coherence: the colored tier and its incoming flow read as a single "concern" group. Arrows do **not** inherit color from the source tier — only the target — so the arc *out of* a colored tier reverts to muted (or to the next target's color/style).
271
+
272
+ ### 4.4 Semantic palette (recommended)
273
+
274
+ Same palette as the other parametric types so a reader scanning multiple diagrams sees the same colors meaning the same thing:
275
+
276
+ - `#b85450` rust-red — Security / Identity / Governance (PII-bearing tiers, audit tiers)
277
+ - `#5a7d9a` slate-blue — Observability / Quality (validated tiers, monitored zones)
278
+ - `#7a8c47` olive-green — Data Products / Publication (consumer-facing aggregates, public-release tiers)
279
+ - `#c9a23a` warm yellow / gold — Analytical / Working zones (staging tier, scientist sandbox, intermediate computation surface)
280
+ - `#8c6d3f` warm-brown — Backup / DR / Archive (alternative cold-tier styling)
281
+
282
+ ---
283
+
284
+ ## 5. Focal rule
285
+
286
+ Exactly **one** focal tier per diagram. Defaults to the tier marked `focal: true` in inputs; if none is marked, defaults to the analytical pivot tier (typically `Aggregated` or whichever tier downstream consumers query).
287
+
288
+ The focal tier:
289
+ - Uses `style: focal` (accent fill + stroke 1.6 + accent header band).
290
+ - Renders bucket text and example-value lines in accent.
291
+ - Has its **incoming** promotion arrow auto-promoted to `style: focal` (accent).
292
+ - Has its **outgoing** promotion arrow (if any) — typically into the cold archive — kept at the user-declared style (usually `lifecycle` dashed).
293
+
294
+ If zero or >1 tiers carry `focal: true`, halt and ask the user.
295
+
296
+ ---
297
+
298
+ ## 6. Dark mode
299
+
300
+ | Token | Light | Dark |
301
+ |---|---|---|
302
+ | Paper | `paper` | `ink` |
303
+ | Ink | `ink` | `paper` |
304
+ | Muted | `muted` | `soft` |
305
+ | Accent | `accent` | `accent` |
306
+ | Fog (cold tier fill) | `paper-2` | `paper @ 0.06` |
307
+ | White (default card fill) | `#FFFFFF` | `paper @ 0.04` |
308
+ | Card stroke ink (default style) | `ink` | `paper @ 0.30` |
309
+ | Header band ink-tint | `ink @ 0.06` | `paper @ 0.08` |
310
+ | Header band muted-tint | `muted @ 0.10` | `soft @ 0.16` |
311
+ | Header band cold-tint | `muted @ 0.18` | `soft @ 0.24` |
312
+ | Header band accent-tint | `accent @ 0.14` | `accent @ 0.20` |
313
+ | Custom component colors | `C` | `C_light` (lighten ~15%) |
314
+
315
+ ---
316
+
317
+ ## 7. Reproducibility checklist (taste gate)
318
+
319
+ Before emitting SVG, verify **every** item:
320
+
321
+ 1. `viewBox = "0 0 {viewBox_w} {viewBox_h}"` derived via §2 (5 tiers + 2 paths → 1040 × 548).
322
+ 2. Each tier card at `(tier_x(i), 80)` size `172 × 380`, `rx=6`.
323
+ 3. Tier header band fills `(tier_x(i), 80, 172, 40)` plus a 10-px extension under the band.
324
+ 4. Exactly **one** focal tier; its incoming arc auto-styled to `focal`.
325
+ 5. Promotion arcs render as cubic Béziers over the top of adjacent tiers; anchors at `(tier_cx(i), 80)` → `(tier_cx(i+1), 80)`, controls at y=0. Label inside the arc at `(arc_peak_x, 50)`, no mask.
326
+ 6. Bottom path row only present when `len(paths) > 0`. Cards at `y=476`, height 56.
327
+ 7. Custom component colors ≤ 2 in addition to the focal tier. Never on arrows.
328
+ 8. All promotion arrows + label masks emitted **before** any tier rect (z-order rule — cards mask the line ends inside the cards).
329
+ 9. The focal tier's bucket text and example values render in accent; the rest stay muted.
330
+ 10. `rx=6` on every tier and path card; `rx=2` on tag chips.
331
+
332
+ ---
333
+
334
+ ## 8. Anti-patterns
335
+
336
+ - **More than one focal tier** — focal exists to mark the central analytical surface; >1 erases the signal.
337
+ - **Cold styling on a non-archive tier** — the dashed fog look is reserved for retention/archive tiers.
338
+ - **Bidirectional promotion arrows** — promotions always flow left → right. Backflow (e.g., an aggregate writing back to raw) is wrong for this type; use a different diagram.
339
+ - **Custom-colored arrows** — connectors are topology-driven; color on a tier never spreads to its edges.
340
+ - **Path cards explaining tier semantics** — paths describe *write methods* (how data moves between tiers), not what each tier holds. If you find yourself writing "Raw stores …" in a path card, that content belongs in the Raw tier's fields.
341
+ - **Missing `example_label` content** — every tier should show a concrete example payload (quarterly survey rows, customer records, claims, …). Without it the diagram becomes abstract and stops earning its space.
342
+ - **Promotion arrow label longer than the tier-gap label mask** — keep labels to ≤ 14 chars in the uppercase `arrow-label` role. Long verbs ("CALCULATE & SUMMARIZE") break the rhythm; shorten to "AGGREGATE" or split into two diagrams.
343
+
344
+ ---
345
+
346
+ ## 9. Examples
347
+
348
+ - `assets/example-medallion.html` — minimal light (NatStat quarterly survey: 5 tiers, 2 path cards, Aggregated focal). Gallery default.
349
+ - `assets/example-medallion-dark.html` — same, dark skin.
350
+ - `assets/example-medallion-full.html` — same, editorial-card frame with subtitle + summary cards.
351
+
352
+ ---
353
+
354
+ ## 10. Worked YAML
355
+
356
+ The YAML in §1 is the **complete** inputs definition for the shipped `example-medallion.html`. Every coordinate in that file's SVG is derivable from §2 applied to those inputs. The same YAML is embedded as a top-of-file HTML comment inside `example-medallion.html` so source view shows the parametric inputs immediately above the SVG.
@@ -0,0 +1,22 @@
1
+ # Nested Containment
2
+
3
+ **Best for:** hierarchy through containment — scope boundaries, trust zones, folder nesting, blast radius. Outer = broader, inner = more specific.
4
+
5
+ ## Layout conventions
6
+ - 3–5 rounded rectangles (`rx=8`), nested with consistent inset padding (24–32px horizontal, 32–36px vertical recommended).
7
+ - Each level labeled at the top-left in the `eyebrow` role (7–8px, letter-spacing 0.14em). Labels sit on a paper-colored mask rect over the ring's top border.
8
+ - Stroke hierarchy: outer rings faint (`rgba(..,0.30–0.45)`), progressing to muted, to ink, to coral at the innermost focal.
9
+ - Fills step up in opacity from outer to inner: `rgba(..,0.015)` → `rgba(..,0.025)` → accent-tint on the innermost.
10
+ - Optional file-icon glyph (folded-corner rect) inside each level hints at scope content.
11
+ - Italic `callout`-role asides (see `references/primitive-annotation.md`) — 1–2 max.
12
+
13
+ ## Anti-patterns
14
+ - More than 6 levels (information disappears inward).
15
+ - Irregular padding between levels — unaligned nesting looks accidental.
16
+ - Content inside rings that isn't part of the hierarchy — use a sibling diagram.
17
+ - Coral on multiple levels — hierarchy collapses.
18
+
19
+ ## Examples
20
+ - `assets/example-nested.html` — minimal light
21
+ - `assets/example-nested-dark.html` — minimal dark
22
+ - `assets/example-nested-full.html` — full editorial
@@ -0,0 +1,44 @@
1
+ # Org Chart / Responsibility Map
2
+
3
+ **Best for:** human teams, agent teams, support escalation maps, role ownership, routing maps, and any hierarchy where the reader needs to know *who owns what* rather than just parent → child structure.
4
+
5
+ Use **Org Chart** instead of **Tree** when the nodes are people, agents, teams, roles, or accountable owners. A tree shows generic hierarchy. An org chart shows responsibility, invocation paths, and coverage gaps.
6
+
7
+ ## Layout conventions
8
+ - Root owner or front door at top center. Use one coral focal node for the person/team/agent that receives ambiguous work.
9
+ - Tier 1 nodes are departments, pods, queues, or primary routing buckets. Keep them horizontally aligned.
10
+ - Tier 2 nodes are responsible owners or specialists. If there are more than 8 specialists, group them under pod nodes instead of making one giant row.
11
+ - Use orthogonal connectors: vertical drop from parent → horizontal bus → vertical drops to children. No diagonal lines.
12
+ - Each node should answer three questions when space allows:
13
+ 1. **Name** — human-readable role/person/agent in the `node-name` role.
14
+ 2. **How to invoke** — Slack handle, queue, issue prefix, or trigger in the `sublabel` role.
15
+ 3. **Scope** — 2–4 terse ownership words, not a paragraph.
16
+ - Show non-Slack / not-yet-live owners with dashed optional styling rather than hiding them. Missing routes are operationally important.
17
+ - Put escalation / approval rules in a small side callout or footer strip, not as extra org nodes.
18
+
19
+ ## Node treatments
20
+ - **Front door / command center:** focal treatment (`accent-tint` + `accent`).
21
+ - **Team / pod / department:** backend treatment (white + `ink`).
22
+ - **Individual agent / owner:** store or external treatment depending on whether it is active in the system.
23
+ - **Gap / needs setup:** optional dashed treatment.
24
+ - **Approval gate:** security treatment, separate from reporting hierarchy.
25
+
26
+ ## Complexity budget
27
+ - Max visible org nodes: 12. If more, create an overview org chart plus separate detail charts per pod.
28
+ - Max depth: 4 tiers.
29
+ - Max direct reports under one parent: 5. If there are more, introduce grouping nodes.
30
+ - Max coral nodes: 1. The org chart's job is clarity, not highlighting everything.
31
+ - Max side callouts: 2.
32
+
33
+ ## Anti-patterns
34
+ - Using a swimlane when the user's real question is "who does what?" Swimlanes explain process; org charts explain ownership.
35
+ - Drawing every person/agent as an identical box. It hides the front door, specialists, gaps, and escalation paths.
36
+ - Cramming full job descriptions into nodes. Keep scope phrases short and move detail to summary cards below.
37
+ - Showing unavailable / not-yet-wired agents as normal active owners. Use dashed optional styling so gaps are visible.
38
+ - Repeating Slack handles in body paragraphs when a node sublabel can carry the invocation path.
39
+ - Floating legends in the org area. Use the standard bottom legend strip.
40
+
41
+ ## Examples
42
+ - `assets/example-org-chart.html` — minimal light
43
+ - `assets/example-org-chart-dark.html` — minimal dark
44
+ - `assets/example-org-chart-full.html` — full editorial
@@ -0,0 +1,136 @@
1
+ # Polar Chart
2
+
3
+ **Best for:** one quantitative series across 4–8 categories whose clockwise order is meaningful.
4
+
5
+ ## Input contract
6
+
7
+ ```yaml
8
+ title: "Request demand by UTC window"
9
+ unit: "% of daily peak"
10
+ scale:
11
+ min: 0
12
+ max: 100
13
+ categories:
14
+ - { label: "00–03", value: 32 }
15
+ - { label: "03–06", value: 18 }
16
+ - { label: "06–09", value: 24 }
17
+ - { label: "09–12", value: 58 }
18
+ - { label: "12–15", value: 100, focal: true }
19
+ - { label: "15–18", value: 82 }
20
+ - { label: "18–21", value: 76 }
21
+ - { label: "21–24", value: 45 }
22
+ start_angle: -90
23
+ clockwise: true
24
+ source_note: "Illustrative normalized workload profile"
25
+ ```
26
+
27
+ Validation rules:
28
+
29
+ 1. `scale.min` is exactly `0`; truncated radial scales are invalid.
30
+ 2. `scale.max` is finite and greater than `0`.
31
+ 3. Every value is finite and satisfies `0 <= value <= scale.max`.
32
+ 4. Category labels are unique after trimming and category count is 4–8.
33
+ 5. At most one category is focal.
34
+ 6. Categories retain input order; sorting by value would destroy circular meaning.
35
+
36
+ Missing values are out of scope for the first version. The agent must stop and ask whether to omit the category or supply a value; it must not coerce missing data to zero.
37
+
38
+ ## Quantitative encoding
39
+
40
+ For category `i` of `N`, value `v`, center `(cx, cy)`, and outer radius `R`:
41
+
42
+ ```text
43
+ theta_i = start_angle + clockwise_sign * 2π * i / N
44
+ radius_i = R * v / scale.max
45
+ x_i = cx + radius_i * cos(theta_i)
46
+ y_i = cy + radius_i * sin(theta_i)
47
+ ```
48
+
49
+ Angles are expressed in radians for calculation; `start_angle` is supplied in degrees and defaults to `-90`, placing the first category at twelve o'clock. `clockwise_sign` is `+1` for the default clockwise order and `-1` otherwise.
50
+
51
+ The value ray is the line segment from `(cx, cy)` to `(x_i, y_i)`. Its visible length is exactly proportional to `v`. Endpoint circles have constant radius and encode no additional quantity. No filled sector may sit behind or beneath a value ray, because its area would compete with the declared radius encoding.
52
+
53
+ The element carrying `data-polar-chart` must be the chart's root `<svg>`. Its descendants are limited to `<g>`, `<line>`, `<circle>`, `<rect>`, `<text>`, `<title>`, and `<desc>`; nested SVGs, paths, polygons, external references, images, and every other element are rejected. Duplicate attributes, mismatched markup, URL-valued SVG references, transforms, CSS loading through `@import`/`url()`, and geometry-affecting CSS are forbidden. Chart elements carry neither `class` nor inline `style`; document styles may not use selectors capable of matching the chart, except the canonical root `svg` layout rule. The only external stylesheet allowed is Google Fonts. Every line carries exactly one of `data-polar-spoke`, `data-polar-ray`, or `data-polar-rule` and uses the role's declared stroke width; spoke and ray geometry is verified within `min(0.75 px, 5% of R)`. The five grid circles carry `data-polar-ring`, use `fill="none"`, a 0.8 px stroke, the chart center, and the 20% through 100% radius intervals exactly once. Every endpoint circle carries `data-polar-marker` and uses the declared 4 px radius, or 5 px for the focal category, with a 1.2 px stroke. The optional full-canvas background is the only rectangle and carries `data-polar-background`. This fail-closed allowlist prevents contributors from bypassing the radius-only encoding with an unannotated or falsely annotated filled shape.
54
+
55
+ ### Zero
56
+
57
+ For `v = 0`, `radius_i = 0`. Render no value ray and no endpoint marker. Keep the faint full-radius category spoke, and render the category's numeric label as `0`. A single scale label at the center also marks the shared zero baseline. Do not add a minimum hub, minimum ray length, displaced marker, or other visible magnitude.
58
+
59
+ ## Layout conventions
60
+
61
+ Version 1 supports:
62
+
63
+ - one quantitative series;
64
+ - 4–8 equally spaced categories in a meaningful clockwise order;
65
+ - a shared linear scale with `min = 0` and `max > 0`;
66
+ - five circular grid rings at 20%, 40%, 60%, 80%, and 100%;
67
+ - one optional focal category rendered with the accent token;
68
+ - minimal light, minimal dark, and full-editorial examples;
69
+ - horizontal, upright category labels outside the outer ring;
70
+ - one numeric value label per category.
71
+
72
+ Version 1 excludes:
73
+
74
+ - DISC, personality, competency, and role-profile wheels whose sectors are qualitative;
75
+ - arbitrary point placement within sectors;
76
+ - filled quantitative wedges, gradient bands, or donut hubs;
77
+ - multiple series, negative values, logarithmic scales, unequal sector angles, and more than eight categories;
78
+ - animation or interaction.
79
+
80
+ Use Radar for multiple entities scored across common criteria, Line for more than eight ordered time buckets, and Bar when circular order adds no meaning.
81
+
82
+ ## Geometry
83
+
84
+ All three examples use `viewBox="0 0 1000 520"`, center `(500, 230)`, and `R = 160`.
85
+
86
+ - Grid rings: `r = 32, 64, 96, 128, 160`.
87
+ - Category spokes: center to `R`, 0.8 px rule stroke, no arrowhead.
88
+ - Non-focal value rays: 2 px muted stroke; endpoint marker radius 4.
89
+ - Focal value ray: 2.4 px accent stroke; endpoint marker radius 5.
90
+ - Ring labels: `0.2 × max` through `1.0 × max` on the first axis only, `arrow-label` role 8 px; the example therefore shows `20, 40, 60, 80, 100`.
91
+ - Category labels: at `R + 28`, `node-name` role 11 px semibold, horizontal and upright.
92
+ - Numeric labels: at `R + 44`, `arrow-label` role 8 px, including the unit in the chart subtitle rather than repeating it eight times.
93
+ - Label anchor: `middle` within 15 degrees of vertical, `start` on the right half, and `end` on the left half.
94
+ - Drawing order: background, rings, spokes, scale labels, non-focal rays, focal ray, endpoint markers, category labels, numeric labels, legend/source note.
95
+
96
+ The minimal examples use the full 1000×520 canvas. The full-editorial example places the same chart in the existing editorial frame and adds summary cards without changing chart geometry.
97
+
98
+ ## Visual treatment
99
+
100
+ - One accent category maximum. All other value rays use the muted token.
101
+ - Circular rings and spokes are structural grid marks, never category colors.
102
+ - Endpoint markers are constant-size lollipop heads, not bubbles.
103
+ - Category labels remain horizontal; tangent rotation is intentionally excluded because it lowers scanability and belongs to the rejected qualitative wheel direction.
104
+ - The chart must remain understandable in grayscale: position and numeric labels carry the data; accent only directs attention.
105
+ - The SVG accessible description names the peak category, the scale, and the clockwise category order without narrating geometry.
106
+
107
+ ## Complexity budget
108
+
109
+ - 4–8 categories.
110
+ - Exactly one quantitative series.
111
+ - At most one focal category.
112
+ - Five grid rings and one numeric value label per category. Numeric labels must be visible through their ancestors: ancestor `display="none"` and zero opacity suppress descendants, while an explicit child `visibility="visible"` can restore inherited hidden visibility.
113
+ - Static output only; split or change type rather than adding interaction or another encoding.
114
+
115
+ ## When not to use
116
+
117
+ - Multiple series → use Radar.
118
+ - Non-cyclic categories → use Bar.
119
+ - More than eight ordered time buckets → use Line.
120
+ - Qualitative profiles, arbitrary sector placement, negative values, or logarithmic scales → choose a truthful non-polar representation.
121
+
122
+ ## Anti-patterns
123
+
124
+ - Donut hubs or any non-zero inner baseline.
125
+ - Filled wedges, sectors, or gradient bands that imply area encodes magnitude.
126
+ - Tangent or rotated category labels.
127
+ - Multiple series on the same polar chart.
128
+ - Truncated scales whose minimum is not zero.
129
+ - Categories sorted by value instead of retaining their meaningful circular order.
130
+ - Treating a missing value as zero.
131
+
132
+ ## Examples
133
+
134
+ - `assets/example-polar.html` — minimal light.
135
+ - `assets/example-polar-dark.html` — minimal dark with the same dataset and geometry.
136
+ - `assets/example-polar-full.html` — full editorial with three unequal summary cards and unchanged chart geometry.