@diagrammo/dgmo 0.52.0 → 0.53.0

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 (329) hide show
  1. package/.cursorrules +59 -58
  2. package/.github/copilot-instructions.md +59 -58
  3. package/.windsurfrules +59 -58
  4. package/SKILL.md +59 -58
  5. package/dist/advanced.d.ts +65 -230
  6. package/dist/advanced.js +278 -611
  7. package/dist/analyzer-TDN5KJFP.js +15 -0
  8. package/dist/auto.css +14 -6
  9. package/dist/auto.js +142 -132
  10. package/dist/auto.mjs +1117 -452
  11. package/dist/block.css +14 -6
  12. package/dist/block.js +85 -72
  13. package/dist/calculator-VBIT6GQF.js +11 -0
  14. package/dist/chart-meta-CPNVUZ5J.d.ts +232 -0
  15. package/dist/chart-meta.d.ts +2 -0
  16. package/dist/chart-meta.js +105 -0
  17. package/dist/charts-d3-DH2XA45I.js +26 -0
  18. package/dist/{chunk-QJMKPUYK.js → chunk-22OQWBWD.js} +14 -7
  19. package/dist/{chunk-5NGAO4QK.js → chunk-27STWBOK.js} +10 -8
  20. package/dist/{chunk-QGATPIPX.js → chunk-2QC4HXCY.js} +31 -17
  21. package/dist/{chunk-HFMYN6N2.js → chunk-3B2GXZCX.js} +4 -3
  22. package/dist/{chunk-6HQH6JZE.js → chunk-3BEKKRH5.js} +10 -10
  23. package/dist/{chunk-AL672HNE.js → chunk-3CZLWOCI.js} +17 -7
  24. package/dist/{chunk-J7TLCB2Q.js → chunk-3IUHKMJI.js} +2 -2
  25. package/dist/{chunk-7L4UJOY6.js → chunk-3TYUXC7D.js} +2 -2
  26. package/dist/{chunk-Y2ZE3MSG.js → chunk-43E26CDA.js} +2 -2
  27. package/dist/{chunk-YTMTPUH4.js → chunk-4ASVFYB2.js} +6 -6
  28. package/dist/{chunk-WCT3NYCV.js → chunk-4ASYQ347.js} +33 -8
  29. package/dist/{chunk-ZNWAYU6N.js → chunk-4K42RUGC.js} +33 -9
  30. package/dist/{chunk-I5IGB56C.js → chunk-4QV26TEG.js} +41 -1
  31. package/dist/{chunk-QOOUC2J5.js → chunk-4RGZFA7H.js} +2 -2
  32. package/dist/{chunk-CXK4DZH3.js → chunk-4W2PE66Q.js} +12 -2
  33. package/dist/{chunk-CIRFIL4M.js → chunk-4WGMGKCZ.js} +13 -13
  34. package/dist/{chunk-JED6ZDEE.js → chunk-5HWPEYWB.js} +2 -2
  35. package/dist/{chunk-VQOCMUWI.js → chunk-65V6IRFN.js} +16 -14
  36. package/dist/{chunk-R3YSD62R.js → chunk-6AUZPPAV.js} +3 -3
  37. package/dist/{chunk-FQ7HTV52.js → chunk-6DCOIN4W.js} +33 -5
  38. package/dist/{chunk-MUE65OTD.js → chunk-6HTRCTAS.js} +4 -4
  39. package/dist/{chunk-TJVLKNGR.js → chunk-6KY7OCZC.js} +5 -5
  40. package/dist/{chunk-YAA6IID3.js → chunk-774C2FF3.js} +2 -2
  41. package/dist/{chunk-UBLHQTLV.js → chunk-7GUF6SDR.js} +15 -14
  42. package/dist/{chunk-5HILBT7X.js → chunk-7JDTNFAK.js} +3 -3
  43. package/dist/{chunk-QBZYACOG.js → chunk-ADYKAKE3.js} +3 -3
  44. package/dist/{chunk-H7KENAZO.js → chunk-AHXIMHDQ.js} +74 -14
  45. package/dist/chunk-AIMLCDAO.js +404 -0
  46. package/dist/{chunk-4IHAV6O7.js → chunk-ALYZ3MAA.js} +4 -4
  47. package/dist/{chunk-ROOE4R4Y.js → chunk-AN2DQB3G.js} +146 -18
  48. package/dist/{chunk-GCYTI3DE.js → chunk-AZNXGWDC.js} +56 -10
  49. package/dist/{chunk-3LK5DNED.js → chunk-B4XS2AF2.js} +3 -3
  50. package/dist/{chunk-3HF5YEFJ.js → chunk-BD3WGY4T.js} +4 -4
  51. package/dist/{chunk-4AQRFDXL.js → chunk-BFDVEO5R.js} +2 -2
  52. package/dist/{chunk-REJAIQ5S.js → chunk-BR7AYN76.js} +8 -8
  53. package/dist/{chunk-P3NRSSUU.js → chunk-BULHGPHK.js} +3 -3
  54. package/dist/{chunk-VILVLS7P.js → chunk-CK2GMDXD.js} +8 -4
  55. package/dist/{chunk-HHKO6SKY.js → chunk-CMVZWP32.js} +3 -3
  56. package/dist/{chunk-GJFAMOGK.js → chunk-CQFNIIQN.js} +7 -7
  57. package/dist/{chunk-FT3ZYWET.js → chunk-DWUMPMV2.js} +11 -10
  58. package/dist/{chunk-USZW2HHU.js → chunk-EQW6HOP4.js} +4 -3
  59. package/dist/{chunk-Z5QVYKR7.js → chunk-FFXCKZOU.js} +4 -4
  60. package/dist/{chunk-WRNFDFPU.js → chunk-FGDSTT3F.js} +2 -2
  61. package/dist/{chunk-FY5MSZAP.js → chunk-FLDC7ZAK.js} +21 -6
  62. package/dist/{chunk-AAXZDUOV.js → chunk-FT7TPPZ5.js} +17 -16
  63. package/dist/{chunk-3QD7VP3U.js → chunk-FUKNRLIJ.js} +14 -7
  64. package/dist/{chunk-3YRPZ7ZZ.js → chunk-FXCB7H5O.js} +4 -4
  65. package/dist/{chunk-SMRFPVLQ.js → chunk-GABSL6TH.js} +4 -4
  66. package/dist/{chunk-BKVOYV6I.js → chunk-GAWKIIPO.js} +17 -17
  67. package/dist/{chunk-HWX6ZHF3.js → chunk-GMAH572Z.js} +6 -6
  68. package/dist/{chunk-MUVJ57EP.js → chunk-GMIJ35PW.js} +23 -20
  69. package/dist/{chunk-7QE3XMRK.js → chunk-GQ644SPD.js} +18 -18
  70. package/dist/{chunk-5QKQSSPO.js → chunk-GRM2A4BG.js} +4 -4
  71. package/dist/{chunk-J7KJR3R6.js → chunk-GWQJKTFS.js} +133 -696
  72. package/dist/{chunk-OTOHI4JO.js → chunk-H3HFC3SQ.js} +2 -2
  73. package/dist/{chunk-SWSIKFEB.js → chunk-HE5J53SZ.js} +4 -4
  74. package/dist/{chunk-7BIZCTAX.js → chunk-HNBY6CNV.js} +3 -3
  75. package/dist/{chunk-J76PIKAT.js → chunk-HO3RCNF6.js} +3 -3
  76. package/dist/{chunk-44VCIPHF.js → chunk-HORZ5H2L.js} +26 -23
  77. package/dist/{chunk-MX2EY5Y7.js → chunk-HOXKNRON.js} +2 -2
  78. package/dist/{chunk-LTXOLDUZ.js → chunk-I64ECJX3.js} +12 -5
  79. package/dist/{chunk-4YFKQ5WT.js → chunk-IQJCVREL.js} +8 -8
  80. package/dist/{chunk-YIBAWQGJ.js → chunk-J7HI6G3G.js} +7 -7
  81. package/dist/{chunk-ICPJPQ5C.js → chunk-JHOAH4TI.js} +3 -3
  82. package/dist/{chunk-6EJITS44.js → chunk-JTMSWEIW.js} +6 -6
  83. package/dist/{chunk-WBM7ZNDI.js → chunk-JYDMBWRP.js} +35 -18
  84. package/dist/{chunk-7DF4J4RL.js → chunk-KKHCNSKK.js} +17 -11
  85. package/dist/{chunk-4UNQ6X24.js → chunk-KUSAVOWZ.js} +4 -4
  86. package/dist/{chunk-77FGAVZC.js → chunk-LC3FFD43.js} +21 -19
  87. package/dist/{chunk-INE5YJBZ.js → chunk-LHILKFDP.js} +10 -10
  88. package/dist/{chunk-ONU3U4GL.js → chunk-LQHVDZYC.js} +52 -16
  89. package/dist/{chunk-75G3Q4DK.js → chunk-MA3HJZHB.js} +5 -5
  90. package/dist/{chunk-QVENJMNX.js → chunk-MEQYZZFR.js} +2 -2
  91. package/dist/{chunk-IM6PDDCE.js → chunk-NNUMX6WX.js} +42 -12
  92. package/dist/{chunk-FQMUHRVC.js → chunk-NNYFQOTK.js} +14 -13
  93. package/dist/{chunk-H6PI3KJT.js → chunk-ODUT5WMC.js} +2 -2
  94. package/dist/{chunk-K4EOKJA6.js → chunk-P3H7QVDH.js} +42 -15
  95. package/dist/{chunk-FUPF2UYQ.js → chunk-PIXZTCKH.js} +51 -108
  96. package/dist/{chunk-BPY242XU.js → chunk-PKNNHU7H.js} +19 -8
  97. package/dist/{chunk-BPIZNB5O.js → chunk-PT4SW76W.js} +11 -11
  98. package/dist/{chunk-UNURMIQO.js → chunk-PV2QO7QL.js} +4 -4
  99. package/dist/{chunk-LGT3PZCJ.js → chunk-PYO4TJJ3.js} +17 -17
  100. package/dist/{chunk-EMLPOL77.js → chunk-Q7AH665U.js} +15 -8
  101. package/dist/{chunk-LBMS4AW6.js → chunk-QAALSCKI.js} +14 -14
  102. package/dist/{chunk-JRCOYRRH.js → chunk-QI3BOLQB.js} +8 -8
  103. package/dist/{chunk-CCNDLW7Z.js → chunk-QWIBT6DS.js} +13 -13
  104. package/dist/{chunk-GU46PPT3.js → chunk-QXGACPS2.js} +5 -5
  105. package/dist/{chunk-FMDSF3OV.js → chunk-QZAW5SFH.js} +2 -2
  106. package/dist/{chunk-QHXCAEMX.js → chunk-R5NH5BZG.js} +8 -8
  107. package/dist/{chunk-5223KXFD.js → chunk-RJ5LBZ5U.js} +7 -7
  108. package/dist/{chunk-PRI2OD4E.js → chunk-RW5PEJ7D.js} +11 -6
  109. package/dist/{chunk-DYWQFQJP.js → chunk-SG4PRYO3.js} +22 -20
  110. package/dist/{chunk-NNS4E7CW.js → chunk-SGPFVDUL.js} +15 -6
  111. package/dist/{chunk-ZEF5M5MB.js → chunk-SQCBSFT5.js} +72 -74
  112. package/dist/{chunk-3HGU63UY.js → chunk-U7NKYLX2.js} +14 -13
  113. package/dist/chunk-U7VO6JAA.js +566 -0
  114. package/dist/{chunk-ZJV7GYR4.js → chunk-UFQJMOVZ.js} +10 -10
  115. package/dist/{chunk-Z72XRXD4.js → chunk-UJRTPOHH.js} +3 -3
  116. package/dist/{chunk-J6QROYDA.js → chunk-UK6DKJLD.js} +26 -10
  117. package/dist/{chunk-QZX5S6R3.js → chunk-UKP5HWB5.js} +149 -89
  118. package/dist/{chunk-T4A4TSTJ.js → chunk-UQRIKAMH.js} +21 -19
  119. package/dist/{chunk-TYS6CSS5.js → chunk-UU6LUYUH.js} +2 -2
  120. package/dist/{chunk-5BHJZH62.js → chunk-UVDCHR4E.js} +18 -6
  121. package/dist/{chunk-HQQNCY7W.js → chunk-VAO6ANGC.js} +5 -5
  122. package/dist/{chunk-6NYWYNBI.js → chunk-VGNIDAPQ.js} +4 -4
  123. package/dist/{chunk-VL2O2F3W.js → chunk-VHO3YBTB.js} +2 -2
  124. package/dist/{chunk-FHGVORFO.js → chunk-VIRANCNY.js} +14 -14
  125. package/dist/{chunk-XD6ZYURY.js → chunk-VJHBSPGF.js} +7 -14
  126. package/dist/{chunk-5RP7JRVP.js → chunk-VKNCC2GX.js} +12 -8
  127. package/dist/{chunk-TPFKKXCB.js → chunk-VRRDUYOK.js} +7 -7
  128. package/dist/{chunk-K2I2XOZD.js → chunk-W2DINCHL.js} +11 -11
  129. package/dist/{chunk-AUIM2NVH.js → chunk-W5KMNC5U.js} +8 -8
  130. package/dist/{chunk-FFUN5D66.js → chunk-WF64MW5G.js} +2 -2
  131. package/dist/{chunk-6LBQ7ELG.js → chunk-X3RXGSCZ.js} +40 -21
  132. package/dist/{chunk-HBPDFCQY.js → chunk-XEAQDIMF.js} +7 -6
  133. package/dist/{chunk-TTIM6YTT.js → chunk-XG4NWFPY.js} +17 -16
  134. package/dist/{chunk-7KINELPI.js → chunk-XQ4KN6JQ.js} +23 -23
  135. package/dist/{chunk-WBRZJOEC.js → chunk-XY3UDKKH.js} +4 -4
  136. package/dist/{chunk-5SEVICBT.js → chunk-YG2BEIQU.js} +14 -13
  137. package/dist/{chunk-BRENJ2BQ.js → chunk-YJVA3QUU.js} +24 -4
  138. package/dist/{chunk-KGVZ5VGH.js → chunk-YR43LJT5.js} +16 -15
  139. package/dist/{chunk-TLVIHFRO.js → chunk-ZKPPI6BF.js} +2 -2
  140. package/dist/{chunk-ARGMQ3H4.js → chunk-ZXUAPTCK.js} +3 -3
  141. package/dist/cli.cjs +156 -154
  142. package/dist/clock.js +9 -1
  143. package/dist/countdown.js +4 -3
  144. package/dist/dgmo-router-B4S23EBH.js +86 -0
  145. package/dist/dimensions-K6PGYYGT.js +22 -0
  146. package/dist/editor.js +33 -5
  147. package/dist/element.js +142 -132
  148. package/dist/element.mjs +1117 -452
  149. package/dist/flowchart-parser-LALR6J6F.js +21 -0
  150. package/dist/{flowchart-renderer-MNCDS7MV.js → flowchart-renderer-DXYB5YRF.js} +14 -14
  151. package/dist/highlight.js +37 -6
  152. package/dist/index.d.ts +4 -2
  153. package/dist/index.js +78 -73
  154. package/dist/layout-3BVDMKXI.js +15 -0
  155. package/dist/layout-3M5UYJHY.js +14 -0
  156. package/dist/{layout-2L3WMRYU.js → layout-3V2A4MUE.js} +8 -8
  157. package/dist/layout-4IHCMWZN.js +19 -0
  158. package/dist/layout-5XGYNYVT.js +9 -0
  159. package/dist/layout-AZUPXWSK.js +15 -0
  160. package/dist/{layout-F4WO357A.js → layout-CAAKQX4W.js} +3 -3
  161. package/dist/{layout-A5UHRWVH.js → layout-CB3XWCOI.js} +3 -3
  162. package/dist/{layout-OAC4PEAC.js → layout-E6HR6PXH.js} +7 -7
  163. package/dist/{layout-7QXCNOVS.js → layout-HBWT2G23.js} +3 -3
  164. package/dist/layout-KPQWJNAG.js +14 -0
  165. package/dist/layout-OL2XFJXA.js +17 -0
  166. package/dist/layout-WCAIKGZG.js +19 -0
  167. package/dist/layout-WSMPBQ4Q.js +17 -0
  168. package/dist/layout-ZE5DRJWX.js +20 -0
  169. package/dist/{layout-search-55FU6HD3.js → layout-search-34DPZD43.js} +51 -35
  170. package/dist/legend-constants-P5EQWRQQ.js +49 -0
  171. package/dist/{palettes-UDLZ2SA4.js → palettes-FGTNFARW.js} +4 -4
  172. package/dist/{parser-EYCKNKQA.js → parser-275KP7JO.js} +8 -8
  173. package/dist/parser-27Z76SN3.js +22 -0
  174. package/dist/parser-3CODK6RG.js +15 -0
  175. package/dist/{parser-YKYMQG3B.js → parser-3KIGEEJM.js} +6 -6
  176. package/dist/parser-3VSWEKBF.js +15 -0
  177. package/dist/parser-4E4I3GNT.js +13 -0
  178. package/dist/parser-5FGJSQNS.js +12 -0
  179. package/dist/parser-5HQXCNOS.js +12 -0
  180. package/dist/parser-5QPFOB5F.js +12 -0
  181. package/dist/parser-6B6SSZT7.js +11 -0
  182. package/dist/parser-6PPHAXXH.js +14 -0
  183. package/dist/parser-7JHWEWXM.js +13 -0
  184. package/dist/{parser-DQAFLUJB.js → parser-7JVIDLLR.js} +7 -7
  185. package/dist/parser-CKA3QMAG.js +18 -0
  186. package/dist/parser-CRKLXGW7.js +13 -0
  187. package/dist/parser-EXNBDNGY.js +11 -0
  188. package/dist/parser-FF4BMRSB.js +16 -0
  189. package/dist/parser-FOOFEJQU.js +13 -0
  190. package/dist/parser-G26MTBFS.js +11 -0
  191. package/dist/parser-GKP2MHHL.js +11 -0
  192. package/dist/parser-GN2MM5CC.js +11 -0
  193. package/dist/parser-IKWK2ZU3.js +18 -0
  194. package/dist/parser-IVGHXLZP.js +14 -0
  195. package/dist/parser-NNIL3HXU.js +11 -0
  196. package/dist/parser-RNLTBIJ6.js +19 -0
  197. package/dist/parser-UWRX52PC.js +16 -0
  198. package/dist/parser-VOERD6XR.js +14 -0
  199. package/dist/parser-XNKJCMMA.js +13 -0
  200. package/dist/parser-XVPTRWZ4.js +15 -0
  201. package/dist/parser-YSLNDFLV.js +22 -0
  202. package/dist/{parser-ZL5QUFVH.js → parser-ZGNXYFPS.js} +5 -5
  203. package/dist/parser-ZQDQTB4X.js +20 -0
  204. package/dist/pert.d.ts +2 -0
  205. package/dist/registry-CaSw0PSH.d.ts +350 -0
  206. package/dist/renderer-2C6DJRYN.js +24 -0
  207. package/dist/renderer-5MPN7CXZ.js +19 -0
  208. package/dist/renderer-6EN5XXJZ.js +27 -0
  209. package/dist/renderer-6WRYVM5R.js +24 -0
  210. package/dist/renderer-7NQSTQMQ.js +16 -0
  211. package/dist/renderer-7ZNVOVFG.js +16 -0
  212. package/dist/{renderer-DT4XRFEP.js → renderer-AK2WO4EI.js} +7 -7
  213. package/dist/renderer-COLQFSFV.js +26 -0
  214. package/dist/{renderer-3F7OS2AX.js → renderer-CWEFGEIC.js} +15 -15
  215. package/dist/renderer-D3BRNOMV.js +29 -0
  216. package/dist/renderer-HIFQVEJA.js +22 -0
  217. package/dist/renderer-JCZG6AYU.js +28 -0
  218. package/dist/{renderer-ZWIH4WDW.js → renderer-JTCX6PCG.js} +13 -13
  219. package/dist/renderer-JWGQSTMR.js +37 -0
  220. package/dist/{renderer-NHO46CT2.js → renderer-K7XLVPH5.js} +6 -6
  221. package/dist/renderer-KARQF3F3.js +22 -0
  222. package/dist/renderer-LVZAHRP6.js +34 -0
  223. package/dist/{renderer-CQY6ATOS.js → renderer-NE5W7CQP.js} +8 -8
  224. package/dist/renderer-QD2SJF2I.js +34 -0
  225. package/dist/renderer-RLMOTXZ6.js +37 -0
  226. package/dist/renderer-SQ54MDSA.js +26 -0
  227. package/dist/{renderer-HSHHVYWF.js → renderer-TYHGXAVT.js} +7 -7
  228. package/dist/renderer-UKXW2QPE.js +23 -0
  229. package/dist/renderer-UPF7NRTI.js +28 -0
  230. package/dist/renderer-VMH6L6CP.js +24 -0
  231. package/dist/{renderer-5DAKMIU2.js → renderer-WCWI4I6A.js} +5 -5
  232. package/dist/renderer-WFSUBKUL.js +25 -0
  233. package/dist/renderer-WNFXYYGL.js +21 -0
  234. package/dist/{renderer-KNFTTOBL.js → renderer-XTXSOK3L.js} +14 -14
  235. package/dist/renderer-YUKPS27O.js +24 -0
  236. package/dist/renderer-YUXGXGSW.js +27 -0
  237. package/dist/renderer-ZBTEX2JK.js +16 -0
  238. package/dist/renderer-radial-WF6VOUOD.js +21 -0
  239. package/dist/{resolver-EMTGNR3D.js → resolver-WFKZYBJ2.js} +4 -4
  240. package/dist/state-parser-L7DHZIQO.js +19 -0
  241. package/dist/state-renderer-TFEUOP4H.js +38 -0
  242. package/dist/{themes-32xj5ZTW.d.ts → themes-tbBkIVsn.d.ts} +2 -349
  243. package/docs/ai-integration.md +59 -58
  244. package/docs/language-reference.md +323 -286
  245. package/fonts/Inter-Bold.woff2 +0 -0
  246. package/fonts/Inter-Regular.woff2 +0 -0
  247. package/gallery/fixtures/boxes-and-lines-diverging.dgmo +1 -2
  248. package/gallery/fixtures/boxes-and-lines.dgmo +1 -1
  249. package/gallery/fixtures/clock.dgmo +1 -1
  250. package/gallery/fixtures/event-line.dgmo +1 -1
  251. package/gallery/fixtures/gantt-full.dgmo +1 -1
  252. package/gallery/fixtures/gantt-sprints.dgmo +9 -9
  253. package/gallery/fixtures/gantt.dgmo +1 -1
  254. package/gallery/fixtures/legacy-syntax-backcompat.dgmo +16 -0
  255. package/gallery/fixtures/state-tags.dgmo +40 -0
  256. package/gallery/fixtures/swimlane.dgmo +1 -1
  257. package/gallery/fixtures/timeline-intraday.dgmo +1 -1
  258. package/package.json +5 -1
  259. package/dist/analyzer-BJ54GIFB.js +0 -15
  260. package/dist/calculator-LDYQCDDY.js +0 -11
  261. package/dist/charts-d3-MXEP6BNP.js +0 -26
  262. package/dist/dgmo-router-X7ZGAPIE.js +0 -86
  263. package/dist/dimensions-45H6JQEY.js +0 -22
  264. package/dist/flowchart-parser-UKELHBSB.js +0 -21
  265. package/dist/layout-46N4JJYK.js +0 -17
  266. package/dist/layout-A4XWNVID.js +0 -14
  267. package/dist/layout-AM2JWW3X.js +0 -15
  268. package/dist/layout-EE6GE46Y.js +0 -17
  269. package/dist/layout-G23F7LDH.js +0 -9
  270. package/dist/layout-GM4UGR7B.js +0 -19
  271. package/dist/layout-GQQJXNYH.js +0 -15
  272. package/dist/layout-IIE2S5FK.js +0 -20
  273. package/dist/layout-VMCRX66I.js +0 -14
  274. package/dist/layout-ZDOSXL5G.js +0 -19
  275. package/dist/parser-2ECN6JA2.js +0 -16
  276. package/dist/parser-4WTIHM5J.js +0 -11
  277. package/dist/parser-5H2BTSJQ.js +0 -11
  278. package/dist/parser-75KVXUNS.js +0 -16
  279. package/dist/parser-774AC53T.js +0 -13
  280. package/dist/parser-BE4YCSRU.js +0 -11
  281. package/dist/parser-CNGUQUQI.js +0 -11
  282. package/dist/parser-DEUUSQIN.js +0 -22
  283. package/dist/parser-FXISIU6A.js +0 -14
  284. package/dist/parser-GTB4XC7P.js +0 -18
  285. package/dist/parser-GVEPAUSD.js +0 -12
  286. package/dist/parser-HSQGTY4G.js +0 -19
  287. package/dist/parser-HVKRINUS.js +0 -11
  288. package/dist/parser-J5MIEYO4.js +0 -15
  289. package/dist/parser-KMZIXLDZ.js +0 -13
  290. package/dist/parser-LJHXWSXU.js +0 -14
  291. package/dist/parser-PT3W72G5.js +0 -15
  292. package/dist/parser-SBJQDPHL.js +0 -15
  293. package/dist/parser-SUWWWCMX.js +0 -12
  294. package/dist/parser-SXDRNZOA.js +0 -13
  295. package/dist/parser-UMILOW3M.js +0 -14
  296. package/dist/parser-UP3AZ367.js +0 -13
  297. package/dist/parser-WHPRV3X5.js +0 -20
  298. package/dist/parser-WX3UODSJ.js +0 -12
  299. package/dist/parser-XCIEN3KN.js +0 -13
  300. package/dist/parser-XIRTUMVN.js +0 -18
  301. package/dist/parser-YKCGIG45.js +0 -11
  302. package/dist/parser-ZGM2OJ6Y.js +0 -22
  303. package/dist/renderer-4QB4K7Q3.js +0 -24
  304. package/dist/renderer-5H4SY7YY.js +0 -22
  305. package/dist/renderer-5PIQPFOX.js +0 -16
  306. package/dist/renderer-6MU37QF5.js +0 -19
  307. package/dist/renderer-AQVMWJ4M.js +0 -27
  308. package/dist/renderer-BDDW6K7N.js +0 -24
  309. package/dist/renderer-BNB3VIDY.js +0 -26
  310. package/dist/renderer-CVW75CXL.js +0 -37
  311. package/dist/renderer-ERHBSTQT.js +0 -25
  312. package/dist/renderer-IDPVUFNB.js +0 -28
  313. package/dist/renderer-ILX6BGKR.js +0 -21
  314. package/dist/renderer-JP663HKG.js +0 -22
  315. package/dist/renderer-MVUZBESR.js +0 -16
  316. package/dist/renderer-N4EBR2FV.js +0 -28
  317. package/dist/renderer-NO2QJ5LZ.js +0 -27
  318. package/dist/renderer-OGFV5RXX.js +0 -34
  319. package/dist/renderer-PDLESJMS.js +0 -37
  320. package/dist/renderer-T4MTNINC.js +0 -24
  321. package/dist/renderer-TOUGFGTM.js +0 -24
  322. package/dist/renderer-U3KPD43Y.js +0 -34
  323. package/dist/renderer-X334IJU2.js +0 -26
  324. package/dist/renderer-Y5OAMOCR.js +0 -23
  325. package/dist/renderer-YONAKAJU.js +0 -16
  326. package/dist/renderer-YWMI6Y2U.js +0 -29
  327. package/dist/renderer-radial-7CGZMVMS.js +0 -21
  328. package/dist/state-parser-BATWAID2.js +0 -18
  329. package/dist/state-renderer-3FKZJ3LP.js +0 -34
@@ -46,12 +46,13 @@
46
46
  The universal core: the cross-cutting anti-patterns (highest value per token) and the one-line index of all 46 chart types. The blocks below are machine-extracted (HTML-comment anchors) and embedded verbatim into every AI surface — IDE rule files, the Claude skill, the CLAUDE.md snippet — by `scripts/gen-ai-core.mjs`. Edit them here; never hand-edit a generated surface.
47
47
 
48
48
  <!-- AI-CORE:ANTIPATTERNS start -->
49
+
49
50
  ### Disambiguation — where DGMO diverges from LLM priors
50
51
 
51
52
  LLMs default to Mermaid / PlantUML habits; DGMO differs. These rules prevent the most common parse errors:
52
53
 
53
54
  - **No colons in declarations, directives, tags, or data rows.** `bar Revenue` (not `bar: Revenue`); `series Cloud blue, Legacy red` (not `series: ...`); `North 850` (not `North: 850`); `tag Team as t` (not `tag: Team`). A colon binds a value only in metadata (`key: value`), class/function type separators, and a few scoped spots — see §26.
54
- - **No Mermaid arrow-labels.** Put the label *between* the dashes: `A -Login-> B`, never `A -> B: Login`. Sequence: `->` sync, `~>` async; left-to-right only — no `<-` / `<~`.
55
+ - **No Mermaid arrow-labels.** Put the label _between_ the dashes: `A -Login-> B`, never `A -> B: Login`. Sequence: `->` sync, `~>` async; left-to-right only — no `<-` / `<~`.
55
56
  - **No indented edges on a map.** Every map connection is ONE full line — `JFK ~daily~> LAX`; for a hub repeat the origin per spoke (`JFK ~daily~> LHR`, …). A bare source with indented `-> dest` legs errors as `Malformed edge`; indented legs are valid ONLY inside a `route` block (an ordered stop→stop voyage). Edge endpoints auto-create their POIs — don't add separate `poi` lines for places already in an edge.
56
57
  - **No `|` metadata delimiter** (removed 0.18.0 → `E_PIPE_OPERATOR_REMOVED`). Use same-line `Name key: value, k2: v2` or indented `key: value`. (`|` survives only in wireframe `{A | B}` dropdowns, in-arrow label text, and quoted names.)
57
58
  - **No removed participant keywords.** Do not write `X is a service` / `external` / `frontend` / `networking` / `gateway` — these were removed and error. A bare name renders the default shape; for a typed glyph use `is a person` / `is a database` / `is a queue`.
@@ -63,7 +64,7 @@ LLMs default to Mermaid / PlantUML habits; DGMO differs. These rules prevent the
63
64
  - **Declare before reference.** An edge target must be declared on a prior line; put metadata and edges on/under one declaration to avoid `Duplicate node` warnings.
64
65
  - **No reference scaffolding in output.** Emit only DGMO source. This doc is organized with HTML-comment anchors (the `TYPE`, `TIPS`, and `AI-CORE` markers, each wrapped in comment delimiters); never copy any such `<!-- … -->` comment into a diagram. They mark sections of the docs, not DGMO syntax; the parser flags a stray HTML comment as an `Unexpected line` warning. (DGMO's only comment form is `//`.)
65
66
 
66
- Two traps in the *other* direction (DGMO wants a colon / a space where you might not expect):
67
+ Two traps in the _other_ direction (DGMO wants a colon / a space where you might not expect):
67
68
 
68
69
  - **Infra node properties REQUIRE the colon** — `cache-hit: 80%`, `instances: 3`, `max-rps: 8000`, `latency-ms: 45`. But top-level infra **options** are space-separated (`default-rps 100`). Don't conflate them.
69
70
  - **ER columns are space-separated** — `id int pk`, `email varchar` (the one SQL-DDL carve-out; everything else indented-typed uses a colon).
@@ -83,18 +84,21 @@ API Gateway t: Platform
83
84
  Orders t: Product
84
85
  Billing t: Product
85
86
  ```
87
+
86
88
  <!-- AI-CORE:ANTIPATTERNS end -->
87
89
 
88
90
  <!-- AI-CORE:STYLING start -->
91
+
89
92
  ### Make it look good — authoring guidance
90
93
 
91
94
  Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply these unless the prompt says otherwise:
92
95
 
93
96
  <!-- TITLE start -->
97
+
94
98
  - **Always title it.** Every diagram gets a short title on the type-declaration line (`flowchart Checkout Flow`, `sequence Checkout`, `boxes-and-lines Service Map`) so it is self-describing — never leave the bare type keyword alone. Infer a fitting title from the request when the user gives none.
95
- <!-- TITLE end -->
96
- <!-- CATEGORIZE start -->
97
- - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>`, then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have *fewer* values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
99
+ <!-- TITLE end -->
100
+ <!-- CATEGORIZE start -->
101
+ - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>`, then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
98
102
  <!-- CATEGORIZE end -->
99
103
  - **Keep labels short.** A few words per node. Move detail into notes or metadata, never a full sentence inside a label.
100
104
  - **Let the defaults show.** Don't add `no-*` opt-outs unless the user asked to hide or disable something — they strip helpful labels, values, and color.
@@ -102,64 +106,66 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
102
106
  <!-- AI-CORE:STYLING end -->
103
107
 
104
108
  <!-- AI-CORE:TYPE-INDEX start -->
109
+
105
110
  ### Chart-type index (45) — pick the type, then fetch its section
106
111
 
107
- | id | when to use |
108
- | -- | ----------- |
109
- | `sequence` | message / interaction flows over time |
110
- | `flowchart` | decision trees and process flows |
111
- | `state` | state-machine / lifecycle transitions |
112
- | `class` | UML class hierarchies |
113
- | `er` | database schemas and relationships |
114
- | `c4` | system architecture (context / container / component / deployment) |
115
- | `infra` | infrastructure traffic flow with RPS computation |
116
- | `boxes-and-lines` | general-purpose node-edge diagrams with groups and tags |
117
- | `sitemap` | site / app navigation structure |
118
- | `mindmap` | radial hierarchy of ideas from a central topic |
119
- | `org` | reporting hierarchy |
120
- | `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
121
- | `bracket` | single-elimination tournament bracket: winners auto-advance; seed the field for a day-0 skeleton or list results casually; two sides mirror to a championship |
122
- | `kanban` | task-board columns |
123
- | `gantt` | project scheduling with task dependencies and milestones |
124
- | `pert` | project network with three-point estimates and critical path |
125
- | `swimlane` | cross-functional process flow with lanes, phases and gateways (BPMN-style) |
126
- | `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
127
- | `timeline` | events, eras, and date ranges |
128
- | `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
129
- | `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
130
- | `journey-map` | UX flow with emotion scores, phases, annotations |
131
- | `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
132
- | `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
133
- | `tech-radar` | technology adoption quadrants (adopt / trial / assess / hold) |
134
- | `quadrant` | 2×2 positioning matrix |
135
- | `pyramid` | stacked hierarchy of layers (Maslow, DIKW) |
136
- | `ring` | concentric rings of nested categories |
137
- | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
138
- | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
139
- | `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
140
- | `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
141
- | `countdown` | live "N days until X" that ticks every second and is accurate on every load — trip dates, launches, deadlines; the only dynamic chart type |
142
- | `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
143
- | `map` | geographic concept map: regions, points, routes |
144
- | `wireframe` | low-fidelity UI layout with panels and controls |
145
- | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
146
- | `line` | trends over time (multiple series via a `series` block; filled via `fill`; dual y-axes via `y-label` / `y-right-label`) |
147
- | `pie` | part-to-whole proportions (ring/doughnut via `hole`) |
148
- | `radar` | multi-dimensional metrics |
149
- | `polar-area` | radial bar chart |
150
- | `scatter` | 2D points or bubble chart |
151
- | `heatmap` | matrix intensity |
152
- | `funnel` | conversion pipeline |
153
- | `sankey` | flow / allocation |
154
- | `arc` | network relationships (linear, or circular via `layout chord`) |
155
- | `slope` | change between two periods |
156
- | `venn` | set overlaps |
157
- | `wordcloud` | term-frequency |
158
- | `function` | mathematical expressions (colon required: `f(x): x^2`) |
112
+ | id | when to use |
113
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
114
+ | `sequence` | message / interaction flows over time |
115
+ | `flowchart` | decision trees and process flows |
116
+ | `state` | state-machine / lifecycle transitions |
117
+ | `class` | UML class hierarchies |
118
+ | `er` | database schemas and relationships |
119
+ | `c4` | system architecture (context / container / component / deployment) |
120
+ | `infra` | infrastructure traffic flow with RPS computation |
121
+ | `boxes-and-lines` | general-purpose node-edge diagrams with groups and tags |
122
+ | `sitemap` | site / app navigation structure |
123
+ | `mindmap` | radial hierarchy of ideas from a central topic |
124
+ | `org` | reporting hierarchy |
125
+ | `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
126
+ | `bracket` | single-elimination tournament bracket: winners auto-advance; seed the field for a day-0 skeleton or list results casually; two sides mirror to a championship |
127
+ | `kanban` | task-board columns |
128
+ | `gantt` | project scheduling with task dependencies and milestones |
129
+ | `pert` | project network with three-point estimates and critical path |
130
+ | `swimlane` | cross-functional process flow with lanes, phases and gateways (BPMN-style) |
131
+ | `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
132
+ | `timeline` | events, eras, and date ranges |
133
+ | `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
134
+ | `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
135
+ | `journey-map` | UX flow with emotion scores, phases, annotations |
136
+ | `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
137
+ | `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
138
+ | `tech-radar` | technology adoption quadrants (adopt / trial / assess / hold) |
139
+ | `quadrant` | 2×2 positioning matrix |
140
+ | `pyramid` | stacked hierarchy of layers (Maslow, DIKW) |
141
+ | `ring` | concentric rings of nested categories |
142
+ | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
143
+ | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
144
+ | `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
145
+ | `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
146
+ | `countdown` | live "N days until X" that ticks every second and is accurate on every load — trip dates, launches, deadlines; the only dynamic chart type |
147
+ | `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
148
+ | `map` | geographic concept map: regions, points, routes |
149
+ | `wireframe` | low-fidelity UI layout with panels and controls |
150
+ | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
151
+ | `line` | trends over time (multiple series via a `series` block; filled via `fill`; dual y-axes via `y-label` / `y-right-label`) |
152
+ | `pie` | part-to-whole proportions (ring/doughnut via `hole`) |
153
+ | `radar` | multi-dimensional metrics |
154
+ | `polar-area` | radial bar chart |
155
+ | `scatter` | 2D points or bubble chart |
156
+ | `heatmap` | matrix intensity |
157
+ | `funnel` | conversion pipeline |
158
+ | `sankey` | flow / allocation |
159
+ | `arc` | network relationships (linear, or circular via `layout chord`) |
160
+ | `slope` | change between two periods |
161
+ | `venn` | set overlaps |
162
+ | `wordcloud` | term-frequency |
163
+ | `function` | mathematical expressions (colon required: `f(x): x^2`) |
159
164
 
160
165
  **Need more than the index gives you?** Fetch the per-type section: MCP `get_language_reference(type)` / `get_examples(type)`, or read that type's section below. The `suggest_chart_type` tool returns the chosen type's section automatically.
161
166
 
162
167
  **When the type isn't obvious, ask — don't guess.** Call `suggest_chart_type` first. If it returns an `⚠️ ASK THE USER` directive (the request is ambiguous between candidates, or nothing matched), present those candidate options to the user and wait for their pick before generating — never silently choose. A confident result (high/medium) you can proceed with.
168
+
163
169
  <!-- AI-CORE:TYPE-INDEX end -->
164
170
 
165
171
  <!-- The grouped data-chart / matrix ids share one documented section. This map is the single source of truth for which TYPE block each id resolves to (read by gen-ai-core.mjs and the MCP slicer). -->
@@ -208,7 +214,7 @@ tag GroupName as <alias>
208
214
  - Must appear before diagram content
209
215
  - Legacy bare shorthand (`tag Priority p`) and `alias` keyword (`tag Priority alias p`) emit `E_TAG_SHORTHAND_REMOVED` per TD-18
210
216
 
211
- **Diagram types that support tags**: sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines
217
+ **Diagram types that support tags**: the tag model is near-universal across the structural types — sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines, state (§5.7), pert, swimlane, mindmap, journey-map, event-line, treemap, map, block, sketch, bracket, family, and wireframe all accept `tag <Group> as <alias>` blocks. Check the per-type Options section for the exact directive set; if a type draws a tag legend, it takes tags.
212
218
 
213
219
  ### 1.4 Same-Line Metadata
214
220
 
@@ -289,14 +295,17 @@ no-option-name // off
289
295
 
290
296
  **Cross-cutting boolean directives** (recognized in every chart type that has the corresponding rendering surface):
291
297
 
292
- | Directive | Effect |
293
- | ------------ | --------------------------------------------------------------------------------------- |
294
- | `fill-tint` | The default, spelled explicitly — shapes get the canonical 25% tint fill with a solid intent-color outline |
295
- | `fill-solid` | Render nodes/bars at full intent saturation instead of the canonical 25% tint |
296
- | `fill-outline` | No fill — shapes take the theme background fill; the intent color is carried entirely by the outline |
297
- | `no-title` | Hide the diagram banner title in the rendered output (does not mutate the parsed model) |
298
+ | Directive | Effect |
299
+ | -------------- | ----------------------------------------------------------------------------------------------------------------------- |
300
+ | `fill-tint` | The default, spelled explicitly — shapes get the canonical 25% tint fill with a solid intent-color outline |
301
+ | `fill-solid` | Render nodes/bars at full intent saturation instead of the canonical 25% tint |
302
+ | `fill-outline` | No fill — shapes take the theme background fill; the intent color is carried entirely by the outline |
303
+ | `no-title` | Hide the diagram banner title in the rendered output (does not mutate the parsed model) |
304
+ | `no-legend` | Hide the legend and collapse the vertical band reserved for it — accepted by **every** chart type that renders a legend |
305
+
306
+ `no-legend` is universal: any chart that draws a legend suppresses it, including the data charts (multi-series `bar` / `line` / `radar`, `scatter`, `function`) whose legend was previously always shown, and the tag-legend charts (`sequence`, `kanban`, `timeline`, `org`, `c4`, `gantt`, `er`, `state`, …). Charts that render no legend at all accept the token as a harmless no-op, so authors never have to remember which types honour it.
298
307
 
299
- Examples: `no-legend` (journey-map), `no-color` (flowchart, state), `no-title` (all chart types with a banner title).
308
+ Examples: `no-legend` (universal), `no-title` (all chart types with a banner title), `no-value` (boxes-and-lines, treemap, and the data-chart label family).
300
309
 
301
310
  ### 1.9 In-Arrow Message Labels
302
311
 
@@ -538,10 +547,10 @@ no full date at all; emits a soft `year 20XX` hint).
538
547
 
539
548
  **Directives** (any date-bearing chart; position-independent):
540
549
 
541
- | Directive | Effect |
542
- | --------- | ------ |
543
- | `year 2026` | base year for bare month-days |
544
- | `date-order dmy` | numeric slash/dash dates read day-first (default `mdy`) |
550
+ | Directive | Effect |
551
+ | ----------------- | ------------------------------------------------------- |
552
+ | `year 2026` | base year for bare month-days |
553
+ | `date-order dmy` | numeric slash/dash dates read day-first (default `mdy`) |
545
554
  | `no-current-year` | a fully-bare chart errors instead of assuming this year |
546
555
 
547
556
  **TIPS (AI authoring):**
@@ -549,7 +558,7 @@ no full date at all; emits a soft `year 20XX` hint).
549
558
  - Prefer `Jul 4` or `07-04` + one `year 2026` line over repeating the ISO year
550
559
  on every row — shorter and reproducible.
551
560
  - `7/4` is **Jul 4** (US month-first). For day-first documents add `date-order
552
- dmy` once at the top; then `7/4` is **Apr 7**.
561
+ dmy` once at the top; then `7/4` is **Apr 7**.
553
562
  - Month-name forms (`Jul 4`) are never ambiguous and ignore `date-order` — use
554
563
  them when a mixed audience will read the source.
555
564
  - Existing ISO dates keep working unchanged; this is a superset, not a
@@ -823,15 +832,16 @@ tag Team as t
823
832
  APIServer t: Backend
824
833
  BookDB t: Data
825
834
  ```
835
+
826
836
  - Optional `as <alias>` postfix and same-line metadata.
827
837
  - **No nesting.** A group cannot contain another `[...]` group; only indented components.
828
- - Group properties (indented under the bracket line):
829
- - `instances N` or `instances N-M` — capacity multiplier on children (auto-scaling)
830
- - `collapsed true` — start collapsed; renders as a single node showing the worst child health
838
+ - **Collapse:** a bare `collapsed` trailing flag on the group line (`[Backend] collapsed`, §1.8) starts the group collapsed — it renders as a single node showing the worst child health. (Legacy: indented `collapsed true` / `collapsed: true`.)
839
+ - Group properties (indented under the bracket line, colon-keyed like node properties):
840
+ - `instances: N` or `instances: N-M` — capacity multiplier on children (auto-scaling). The space forms `instances N` / `instances N-M` are accepted legacy.
831
841
 
832
842
  ### 4.7 Infra Options (Space-Separated, NO Colon)
833
843
 
834
- - `direction-tb` (boolean; default is LR)
844
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
835
845
  - `default-latency-ms N`
836
846
  - `default-rps N` — fallback edge RPS when no `rps` is declared on the edge node
837
847
  - `default-uptime DECIMAL`
@@ -933,13 +943,11 @@ Bracket syntax only.
933
943
 
934
944
  ### 4.6 Options
935
945
 
936
- - `direction-lr` (boolean; default is TB)
937
- - `orientation-vertical` (boolean; default is horizontal)
938
- - `no-color` (boolean; default off — when on, all nodes resolve to the muted neutral fill instead of their default intent color)
946
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB). The key+value form `direction LR|TB` is accepted legacy.
939
947
  - `fill-solid` / `fill-outline` (fill family; default is the 25% tint — `fill-solid` renders shapes at full intent color, `fill-outline` drops the fill and carries color on the outline alone)
940
948
  - `no-notes` (boolean; default off — suppress all note boxes, see §4.7)
941
949
 
942
- `no-color` + `fill-solid` precedence: `no-color` wins for nodes with no explicit color (the muted neutral path bypasses `fill-solid`). Nodes with an explicit color survive `no-color` and are then rendered at full saturation if `fill-solid` is also on.
950
+ `no-color` was removed — node colors are assigned automatically by shape, and the parser raises a warning if the line is still present. Delete it.
943
951
 
944
952
  ### 4.7 Notes (Nodes)
945
953
 
@@ -960,7 +968,7 @@ node; an unknown id is an error, a duplicate note on a node is a warning
960
968
 
961
969
  Notes work on **flowchart**, **state**, **class** (`note <ClassName>`),
962
970
  **er** (`note <Table>`), and **boxes-and-lines** (`note <Box>`). Org and
963
- sitemap are excluded — their indentation *is* the tree structure, which
971
+ sitemap are excluded — their indentation _is_ the tree structure, which
964
972
  collides with the indented-body grammar.
965
973
 
966
974
  ---
@@ -983,10 +991,11 @@ state [Title]
983
991
 
984
992
  ```
985
993
  StateName
986
- StateName color
987
994
  [*] // initial/final pseudostate
988
995
  ```
989
996
 
997
+ States have no color slot — color comes from the tag system (§5.7).
998
+
990
999
  ### 5.3 Transitions
991
1000
 
992
1001
  | Type | Syntax |
@@ -1009,23 +1018,45 @@ references, and the `no-notes` opt-out (see §4.7).
1009
1018
 
1010
1019
  ### 5.6 Options
1011
1020
 
1012
- - `direction-tb` (boolean; default is LR)
1013
- - `no-color` (boolean; default off — when on, all states resolve to the muted neutral fill instead of their default intent color)
1014
-
1015
- **Color by state category** — declare a `tag <Name> as <alias>` group (§1.3), then assign each state `<alias>: <Value>` same-line (declare the assignments before the transitions):
1016
-
1017
- ```
1018
- tag Phase as p
1019
- Active blue
1020
- Done green
1021
- Pending p: Active
1022
- Shipped p: Done
1023
- Pending -ship-> Shipped
1024
- ```
1021
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
1025
1022
  - `fill-solid` / `fill-outline` (fill family; default is the 25% tint — collapsed groups follow the same mode, e.g. full saturation under `fill-solid`)
1026
1023
  - `no-notes` (boolean; default off — suppress all note boxes, see §4.7)
1027
-
1028
- `no-color` + `fill-solid` precedence: `no-color` wins for states with no explicit color (the muted neutral path bypasses `fill-solid`). Group colors survive `no-color` and are then rendered at full saturation if `fill-solid` is also on.
1024
+ - `active-tag GroupName` / `active-tag none` (§5.7)
1025
+
1026
+ ### 5.7 Tags
1027
+
1028
+ State diagrams support the universal tag system (§1.3). Declare
1029
+ `tag <Group> as <alias>` blocks above the diagram body and apply values with
1030
+ same-line `key: value` metadata on a **state** line (tags describe states,
1031
+ not transitions — put the assignment on its own line):
1032
+
1033
+ ```
1034
+ state Document Lifecycle
1035
+ tag Phase as ph
1036
+ Intake blue
1037
+ Review orange
1038
+ Terminal green
1039
+
1040
+ Draft ph: Intake
1041
+ Draft -submit-> In Review
1042
+ In Review ph: Review
1043
+ In Review -publish-> Published
1044
+ Published ph: Terminal
1045
+ ```
1046
+
1047
+ - Either the alias (`ph:`) or the canonical group name (`phase:`) works as
1048
+ the metadata key.
1049
+ - Tagged states get the standard treatment — 25% tint fill + solid
1050
+ intent-color outline — and the `fill-*` family (§1.8) applies as usual.
1051
+ - Untagged states take the group's **first** value per §1.3. State is not in
1052
+ the neutral-gray carve-out.
1053
+ - Declaring a tag group renders the standard legend. With several groups the
1054
+ first declared one colors the diagram; `active-tag <Group>` picks another
1055
+ and `active-tag none` turns tag coloring off (states fall back to the
1056
+ default intent color).
1057
+ - Group colors (`[Group Name] color`) and collapsed-group stand-ins keep
1058
+ their explicit color — the tag channel never overrides one.
1059
+ - The `[*]` pseudostate is never tagged.
1029
1060
 
1030
1061
  ---
1031
1062
 
@@ -1092,7 +1123,7 @@ This is key-value metadata assignment, consistent with same-line metadata syntax
1092
1123
 
1093
1124
  ### 6.5 Options
1094
1125
 
1095
- - `direction-tb` (boolean; default is LR)
1126
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB)
1096
1127
  - `sub-node-label Text`
1097
1128
  - `show-sub-node-count`
1098
1129
  - `hide`
@@ -1194,7 +1225,7 @@ Database is a container description: PostgreSQL with read replicas
1194
1225
 
1195
1226
  ### 7.8 Options
1196
1227
 
1197
- - `direction-tb` (boolean; default is LR)
1228
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB)
1198
1229
 
1199
1230
  ---
1200
1231
 
@@ -1461,7 +1492,7 @@ Blog
1461
1492
 
1462
1493
  ### 11.6 Options
1463
1494
 
1464
- - `direction-tb` (boolean; default is LR)
1495
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
1465
1496
 
1466
1497
  ---
1467
1498
 
@@ -1482,7 +1513,7 @@ gantt [Title]
1482
1513
  ### 12.2 Options (Space-Separated, NO Colon)
1483
1514
 
1484
1515
  ```
1485
- start 2026-03-15
1516
+ start-date 2026-03-15
1486
1517
  today-marker
1487
1518
  today-marker 2026-03-27
1488
1519
  critical-path
@@ -1570,7 +1601,7 @@ Design Review start: 2026-04-01
1570
1601
  ```
1571
1602
 
1572
1603
  A task line MUST have `duration:` or `start:` (or both) in its metadata.
1573
- Duration units: `min`, `h`, `d`, `bd` (business days), `w`, `m`, `q`, `y`, `s` (sprints)
1604
+ Duration units: `min`, `h`, `d`, `bd` (business days), `w`, `m`, `q`, `y`, `sp` (sprints)
1574
1605
  Uncertain: `duration: 10bd?` (trailing `?` on the value)
1575
1606
  Progress: `progress: 80` in metadata (integer 0–100)
1576
1607
 
@@ -1638,24 +1669,24 @@ divvy shares 1 2 3
1638
1669
 
1639
1670
  ### Directives
1640
1671
 
1641
- | Directive | Effect |
1642
- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1643
- | `time-unit <unit>` | Unit for bare-number durations (default `d`); accepts `min`, `h`, `d`, `bd`, `w`, `s` (sprints) |
1644
- | `default-confidence <level>` | M-only heuristic: `high`, `medium`, `low`, or a custom `O/P` factor pair (e.g. `0.6/2.5`) |
1645
- | `direction <LR\|TB>` | Layout direction (default `LR`) |
1646
- | `node-detail <compact\|full>` | Visual density; `full` adds slack bars and σ-as-border-thickness |
1647
- | `no-analysis` | Bare flag — hide the analysis layer (tornado + S-curve). The layer renders by default whenever Monte Carlo ran; this suppresses it. An explicit `viewState.an` (app toggle / share link) overrides it |
1648
- | `trials <N>` | Canonical Monte Carlo trial count (`< 100` clamps to analytical) |
1649
- | `seed <N>` | Mulberry32 PRNG seed for deterministic runs |
1650
- | `scrubber-trials <N>` | Fast-MC trials for the interactive duration scrubber |
1651
- | `start-date <YYYY-MM-DD>` | Anchor the forward pass — accepts the literal `now` |
1652
- | `end-date <YYYY-MM-DD>` | Anchor the backward pass (mutually exclusive with `start-date`) |
1653
- | `sprint-length <duration>` | Sprint length when sprint mode is active (default `2w`) |
1654
- | `sprint-number <N>` | Starting sprint label N — cells render as `S<N+offset>` (default `1`) |
1655
- | `sprint-start <YYYY-MM-DD>` | Optional ISO date the starting sprint begins on |
1656
- | `active-tag <GroupName>` | Pre-expand a tag group + drive node fill |
1657
-
1658
- Sprint mode activates automatically when `time-unit s` is set, or explicitly when any `sprint-*` directive appears. ES/EF/LS/LF cells then render as `S5`, `S7`, etc.
1672
+ | Directive | Effect |
1673
+ | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1674
+ | `time-unit <unit>` | Unit for bare-number durations (default `d`); accepts `min`, `h`, `d`, `bd`, `w`, `sp` (sprints) |
1675
+ | `default-confidence <level>` | M-only heuristic: `high`, `medium`, `low`, or a custom `O/P` factor pair (e.g. `0.6/2.5`) |
1676
+ | `direction-lr` / `direction-tb` | Layout direction booleans (last one wins; default `LR`); key+value `direction LR\|TB` accepted legacy |
1677
+ | `node-detail <compact\|full>` | Visual density; `full` adds slack bars and σ-as-border-thickness |
1678
+ | `no-analysis` | Bare flag — hide the analysis layer (tornado + S-curve). The layer renders by default whenever Monte Carlo ran; this suppresses it. An explicit `viewState.an` (app toggle / share link) overrides it |
1679
+ | `trials <N>` | Canonical Monte Carlo trial count (`< 100` clamps to analytical) |
1680
+ | `seed <N>` | Mulberry32 PRNG seed for deterministic runs |
1681
+ | `scrubber-trials <N>` | Fast-MC trials for the interactive duration scrubber |
1682
+ | `start-date <YYYY-MM-DD>` | Anchor the forward pass — accepts the literal `now` |
1683
+ | `end-date <YYYY-MM-DD>` | Anchor the backward pass (mutually exclusive with `start-date`) |
1684
+ | `sprint-length <duration>` | Sprint length when sprint mode is active (default `2w`) |
1685
+ | `sprint-number <N>` | Starting sprint label N — cells render as `S<N+offset>` (default `1`) |
1686
+ | `sprint-start <YYYY-MM-DD>` | Optional ISO date the starting sprint begins on |
1687
+ | `active-tag <GroupName>` | Pre-expand a tag group + drive node fill |
1688
+
1689
+ Sprint mode activates automatically when `time-unit sp` is set, or explicitly when any `sprint-*` directive appears. ES/EF/LS/LF cells then render as `S5`, `S7`, etc.
1659
1690
 
1660
1691
  ### Activities
1661
1692
 
@@ -1722,14 +1753,14 @@ Bracketed `[group-name]` blocks cluster activities. Whether a group renders as a
1722
1753
  sail to atoll 3 5 8
1723
1754
  ```
1724
1755
 
1725
- Groups can author `collapsed: true` to start collapsed.
1756
+ Groups can author a bare `collapsed` trailing flag (§1.8) to start collapsed (legacy: `collapsed: true`).
1726
1757
 
1727
1758
  ### Same-line metadata
1728
1759
 
1729
1760
  | Key | Where | Meaning |
1730
1761
  | ------------------------------- | --------------- | --------------------------------------------------------------------------------- |
1731
1762
  | `confidence` | activity | Per-activity override of `default-confidence` (`high` / `medium` / `low` / `O/P`) |
1732
- | `collapsed` | group | `true` to start the group collapsed |
1763
+ | `collapsed` | group | bare trailing flag (§1.8) — start the group collapsed (legacy: `collapsed: true`) |
1733
1764
  | tag aliases (e.g. `c: Captain`) | activity, group | Resolves to the declared tag group; drives node fill when the group is active |
1734
1765
 
1735
1766
  ### Tags
@@ -1806,7 +1837,7 @@ Henry Turner + Carina Smyth m: 1751
1806
1837
  - **`generations`** (option): draws a left gutter of Roman-numeral generation labels (`Gen I`, `Gen II`, …) plus subtle zebra shading behind alternating generations.
1807
1838
  - **`highlight <name>`** (directive): dims everyone outside that person's bloodline (ancestors + descendants + spouses stay lit).
1808
1839
  - **Sex → color:** `sex: m` → blue, `sex: f` → purple, unset → gray (25% tint). An explicit `tag`/inline color overrides the sex color.
1809
- - The union split cuts `m:` metadata first, THEN splits ` + ` within the name region — so a `+` inside a quoted name (`"Anne + Jack"`) or a metadata value never mis-splits. Per-side `key: value` metadata on a union line is not supported — declare the person standalone.
1840
+ - The union split cuts `m:` metadata first, THEN splits `+` within the name region — so a `+` inside a quoted name (`"Anne + Jack"`) or a metadata value never mis-splits. Per-side `key: value` metadata on a union line is not supported — declare the person standalone.
1810
1841
 
1811
1842
  ---
1812
1843
 
@@ -1818,11 +1849,11 @@ Henry Turner + Carina Smyth m: 1751
1818
1849
  **Styling tips:** Give each lane a color and let nodes inherit it — reach for a `tag` group only when you need a *second* dimension (e.g. risk) that deliberately breaks lane color. Echo the gateway/terminal delimiters (`<Review>`, `(Paid) success`) even though bare names also resolve — it keeps the source self-documenting. Put every edge label *inside* the arrow (`-invalid->`), never as a trailing word.
1819
1850
  <!-- TIPS end -->
1820
1851
 
1821
- Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction LR` default, `TB` transposes), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`). A `lane` block **owns its edges** — nodes and their outgoing `->` edges are written inline, no separate flow block. A back-edge to an earlier node draws a routed loop.
1852
+ Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction-lr` default, `direction-tb` transposes; key+value `direction LR|TB` accepted legacy), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`). A `lane` block **owns its edges** — nodes and their outgoing `->` edges are written inline, no separate flow block. A back-edge to an earlier node draws a routed loop.
1822
1853
 
1823
1854
  ```
1824
1855
  swimlane Weekly Publishing
1825
- direction LR
1856
+ direction-lr
1826
1857
 
1827
1858
  lane Writer gray
1828
1859
  Draft Post -> Review
@@ -1846,15 +1877,15 @@ lane Social green
1846
1877
 
1847
1878
  ### Node tokens
1848
1879
 
1849
- | Token | Meaning |
1850
- | ----- | ------- |
1851
- | `Submit Claim` | task |
1852
- | `<Validate>` | exclusive (XOR) gateway |
1853
- | `<+ Fork>` | parallel (AND) gateway |
1854
- | `(Start)` | terminal (neutral) |
1855
- | `(!Rejected)` | error terminal (`!` prefix → red) |
1856
- | `(Paid) success` | success terminal (trailing word → green); also `terminate` |
1857
- | `[[Inspect Property]]` | subprocess (collapsible) |
1880
+ | Token | Meaning |
1881
+ | ---------------------- | ---------------------------------------------------------- |
1882
+ | `Submit Claim` | task |
1883
+ | `<Validate>` | exclusive (XOR) gateway |
1884
+ | `<+ Fork>` | parallel (AND) gateway |
1885
+ | `(Start)` | terminal (neutral) |
1886
+ | `(!Rejected)` | error terminal (`!` prefix → red) |
1887
+ | `(Paid) success` | success terminal (trailing word → green); also `terminate` |
1888
+ | `[[Inspect Property]]` | subprocess (collapsible) |
1858
1889
 
1859
1890
  ### Flow & color
1860
1891
 
@@ -1962,9 +1993,9 @@ Indented shorthand also supports groups (place arrow directly after group header
1962
1993
 
1963
1994
  ### 13.6 Directives
1964
1995
 
1965
- - `direction TB` — top-to-bottom layout (default: `LR`)
1996
+ - `direction-tb` — top-to-bottom layout; `direction-lr` restates the `LR` default (booleans, last one wins; key+value `direction LR|TB` accepted legacy)
1966
1997
  - `heat <Label> [low] [high]` — name a numeric colour ramp (see §13.8); one trailing color sets the high hue over a neutral low, two set explicit `low high` ramp endpoints (pairs with the `heat:` key)
1967
- - `show-values` — print each box's numeric value as text (off by default)
1998
+ - `no-value` — suppress the per-box numeric value labels (values render by default; legacy `show-values` is accepted as a no-op)
1968
1999
 
1969
2000
  ### 13.7 Options
1970
2001
 
@@ -1981,7 +2012,6 @@ choropleth-style "heat dimension" alongside the categorical tag groups.
1981
2012
  ```
1982
2013
  boxes-and-lines Fleet Crews
1983
2014
  heat Crew blue
1984
- show-values
1985
2015
 
1986
2016
  Flagship heat: 120
1987
2017
  Frigate heat: 40
@@ -1995,7 +2025,7 @@ Flagship -> Sloop
1995
2025
  - `heat <Label> [low] [high]` names the dimension and optionally sets the
1996
2026
  ramp endpoint colors: no color → primary hue / neutral low; one color → that
1997
2027
  high hue / neutral low; two → explicit `low high` (e.g. `heat Risk green
1998
- red`). Order is literal — polarity (good vs bad) is your choice. A wide-hue-gap
2028
+ red`). Order is literal — polarity (good vs bad) is your choice. A wide-hue-gap
1999
2029
  pair routes through a neutral midpoint (so green→red mid values stay clean);
2000
2030
  analogous pairs blend directly.
2001
2031
  - The ramp anchors at `0` for all-non-negative data, else at the data minimum.
@@ -2006,7 +2036,7 @@ Flagship -> Sloop
2006
2036
  between a tag group and the heat label, the tag group wins.
2007
2037
  - When the heat ramp is active, every box tints along the min→max ramp and the
2008
2038
  legend shows a gradient capsule; boxes without a `heat:` get a neutral fill.
2009
- - `show-values` additionally prints each box's number as text.
2039
+ - Each box's number also prints as text by default; suppress with `no-value`.
2010
2040
 
2011
2041
  ### 13.9 Tag groups (categorical color)
2012
2042
 
@@ -2243,7 +2273,6 @@ Q1 400 700 300 500
2243
2273
  **Options (space-separated, NO colon):**
2244
2274
 
2245
2275
  ```
2246
- title My Chart
2247
2276
  x-label X Label
2248
2277
  y-label Y Label
2249
2278
  orientation-horizontal // bar: horizontal bars
@@ -2262,7 +2291,11 @@ no-auto-y // line: anchor the y-axis at 0 (opt out of auto-fit)
2262
2291
  padded window around the data (min→max across all series, not a forced 0
2263
2292
  baseline), so a tight high-valued series fills the plot. `no-auto-y` restores
2264
2293
  the 0 baseline. Bars always anchor at 0 and ignore the flag.
2265
- - Legend is always shown (no option needed)
2294
+ - `title` directive removed — the chart title is line 1 (`bar My Chart`). Using
2295
+ `title` raises an error diagnostic.
2296
+ - Legend shows by default whenever the chart is multi-series; suppress it with
2297
+ the universal `no-legend` flag (§1.8). Single-series charts render no legend,
2298
+ and take the flag as a no-op.
2266
2299
 
2267
2300
  **Value-display flags — show-everything default.** Every renderable part is on by default. Suppress with `no-*`:
2268
2301
 
@@ -2557,12 +2590,12 @@ Group a run of events into a labeled section with a `[Name]` bracket, then **ind
2557
2590
  Tim Berners-Lee publishes the first site.
2558
2591
  1993 Mosaic t: Browser
2559
2592
 
2560
- [The App Era] collapsed: true
2593
+ [The App Era] collapsed
2561
2594
  2005 Ajax t: Platform
2562
2595
  ```
2563
2596
 
2564
- - **Trailing metadata** after `]` — optional `collapsed: true` and/or a named color (`[The 1960s] collapsed: true blue`).
2565
- - **`collapsed: true`** folds the era into a single summary card (its name + a bulleted list of member events) while a bracket stays on the spine; in the app a reader toggles it live.
2597
+ - **Trailing tokens** after `]` — an optional bare `collapsed` flag (§1.8) and/or a named color, in either order (`[The 1960s] collapsed blue`). Legacy: `collapsed: true`.
2598
+ - **`collapsed`** folds the era into a single summary card (its name + a bulleted list of member events) while a bracket stays on the spine; in the app a reader toggles it live.
2566
2599
 
2567
2600
  #### Directives
2568
2601
 
@@ -2672,7 +2705,7 @@ main
2672
2705
 
2673
2706
  #### Directives
2674
2707
 
2675
- - `direction LR|TB|BT` — `LR` default (newest right); `TB`/`BT` is the git-log column view.
2708
+ - `direction-lr` / `direction-tb` — booleans, last one wins; `direction-lr` is the `LR` default (newest right), `direction-tb` the git-log column view. Key+value `direction LR|TB` accepted legacy.
2676
2709
  - `no-labels` (hide messages), `no-lanes` (hide branch lanes), `no-head`.
2677
2710
 
2678
2711
  ### 16.5 Venn Diagrams
@@ -2751,7 +2784,7 @@ Development p: High
2751
2784
  Auth System
2752
2785
  description: Login, signup, OAuth
2753
2786
  Dashboard
2754
- Nice-to-haves p: Low, collapsed: true
2787
+ Nice-to-haves p: Low collapsed
2755
2788
  Dark Mode
2756
2789
  ```
2757
2790
 
@@ -2810,16 +2843,16 @@ Auth System
2810
2843
 
2811
2844
  Same-line metadata uses the universal `key: value, key2: value2` form (§1.4). Recognized keys:
2812
2845
 
2813
- | Key | Effect |
2814
- | --------------------------- | ---------------------------------------- |
2815
- | `description` | Description text (see above). |
2816
- | `collapsed` | `true` collapses the subtree by default. |
2817
- | Tag alias (e.g. `p:`, `d:`) | Assigns the node to a tag-group value. |
2846
+ | Key | Effect |
2847
+ | --------------------------- | ---------------------------------------------------------------------------------- |
2848
+ | `description` | Description text (see above). |
2849
+ | `collapsed` | Legacy `collapsed: true` — canonical is the bare trailing `collapsed` flag (§1.8). |
2850
+ | Tag alias (e.g. `p:`, `d:`) | Assigns the node to a tag-group value. |
2818
2851
 
2819
2852
  ```
2820
2853
  Task p: High, d: Engineering
2821
2854
  Demo Video description: 2-min product walkthrough
2822
- Nice-to-haves p: Low, collapsed: true
2855
+ Nice-to-haves p: Low collapsed
2823
2856
  ```
2824
2857
 
2825
2858
  ### Node color
@@ -2840,19 +2873,19 @@ Polish UX p: Medium
2840
2873
 
2841
2874
  ### Collapse
2842
2875
 
2843
- Any node with children may be collapsed. Set `collapsed: true` in same-line metadata to make a subtree start collapsed; collapsed nodes render with an accent drill-bar so they remain discoverable. Collapse is **portable view-state** — because `collapsed: true` lives in the source, every renderer (app, `dgmo` CLI, remark-dgmo, Obsidian, code-fence embeds) reproduces the collapsed view from the `.dgmo` alone; in the app, collapsing/expanding a node writes/removes the marker in the source (source stays the single source of truth), and a runtime `viewState.cg` from a share-link is applied in addition to source markers.
2876
+ Any node with children may be collapsed. Add a bare `collapsed` trailing flag to the node line (§1.8) to make a subtree start collapsed (legacy: `collapsed: true` in same-line metadata); collapsed nodes render with an accent drill-bar so they remain discoverable. The flag is case-sensitive lowercase — a node actually named "… Collapsed" (capitalized) or a quoted name keeps the word as label text. Collapse is **portable view-state** — because the `collapsed` marker lives in the source, every renderer (app, `dgmo` CLI, remark-dgmo, Obsidian, code-fence embeds) reproduces the collapsed view from the `.dgmo` alone; in the app, collapsing/expanding a node writes/removes the marker in the source (source stays the single source of truth), and a runtime `viewState.cg` from a share-link is applied in addition to source markers.
2844
2877
 
2845
2878
  ```
2846
- Nice-to-haves p: Low, collapsed: true
2879
+ Nice-to-haves p: Low collapsed
2847
2880
  Dark Mode
2848
2881
  Export PDF
2849
2882
  ```
2850
2883
 
2851
2884
  ### Options
2852
2885
 
2853
- | Option | Effect |
2854
- | ---------------------- | ---------------------------------- |
2855
- | `active-tag GroupName` | Sets the default active tag group. |
2886
+ | Option | Effect |
2887
+ | ---------------------- | -------------------------------------------------------------------- |
2888
+ | `active-tag GroupName` | Sets the default active tag group. |
2856
2889
  | `color-by-depth` | Bare flag; colour nodes by depth instead of by tag (off by default). |
2857
2890
 
2858
2891
  Universal options (`palette`, `theme`) apply as elsewhere.
@@ -3067,6 +3100,10 @@ Further-indented lines below a blip. Supports inline markdown (bold, italic, cod
3067
3100
 
3068
3101
  Blips receive sequential global numbers. Order: quadrants clockwise (top-left → top-right → bottom-right → bottom-left), then by ring (innermost first), then declaration order.
3069
3102
 
3103
+ ### Directives
3104
+
3105
+ - `no-blip-legend` — suppress the four-column blip listing. The listing renders by default on every surface (export and live/interactive alike). Legacy `show-blip-legend` is accepted as a no-op.
3106
+
3070
3107
  ---
3071
3108
 
3072
3109
  ## 21. Cycle Diagrams
@@ -3459,8 +3496,8 @@ Indented lines under a layer are description text. Markdown inline formatting is
3459
3496
 
3460
3497
  ### Directives
3461
3498
 
3462
- | Directive | Effect |
3463
- | ------------ | -------------------------------------------------------------------- |
3499
+ | Directive | Effect |
3500
+ | ----------------------------- | ---------------------------------------------------------------------------------------------------- |
3464
3501
  | `fill-solid` / `fill-outline` | Render rings with full intent color, or outline-only, instead of the default 25% tint (fill family). |
3465
3502
 
3466
3503
  `inverted` is **not** valid on ring diagrams (rings are rotationally symmetric). Using it emits an error-severity diagnostic and the line is discarded.
@@ -3526,13 +3563,13 @@ Operations t: Ops
3526
3563
 
3527
3564
  ### Color modes
3528
3565
 
3529
- Three modes, with the source-declared default selected as **tag → heat → branch** (the desktop app adds a runtime switcher that previews the others without editing source):
3566
+ Three modes, with the source-declared default selected as **heat → tag → branch** — the universal precedence shared with map and boxes-and-lines. The `active-tag` directive pre-selects a dimension from source; the desktop app adds a runtime switcher that previews the others without editing source:
3530
3567
 
3531
- | Mode | When it's the default | Coloring |
3532
- | ---------- | --------------------------- | ------------------------------------------------------------ |
3533
- | **tag** | a `tag` group is declared | categorical color per tag value (legend hover-dims) |
3534
- | **heat** | any `heat:` value / `heat` directive | value ramp over a second per-node `heat:` metric |
3535
- | **branch** | neither tags nor heat | each top-level branch a distinct hue, tinted with depth |
3568
+ | Mode | When it's the default | Coloring |
3569
+ | ---------- | --------------------------------------- | ------------------------------------------------------- |
3570
+ | **heat** | any `heat:` value / `heat` directive | value ramp over a second per-node `heat:` metric |
3571
+ | **tag** | a `tag` group is declared (and no heat) | categorical color per tag value (legend hover-dims) |
3572
+ | **branch** | neither tags nor heat | each top-level branch a distinct hue, tinted with depth |
3536
3573
 
3537
3574
  ### Tags
3538
3575
 
@@ -3544,29 +3581,29 @@ Add a per-node `heat:` number (a second metric, distinct from size; negatives/fl
3544
3581
 
3545
3582
  ### Node Metadata
3546
3583
 
3547
- | Key | Type | Default | Description |
3548
- | ------- | --------------- | ------- | -------------------------------------------- |
3549
- | `heat` | number | — | Color-by-value metric (signed / float ok) |
3550
- | `<tag>` | declared value | — | Tag value via the group's alias or name |
3584
+ | Key | Type | Default | Description |
3585
+ | ------- | -------------- | ------- | ----------------------------------------- |
3586
+ | `heat` | number | — | Color-by-value metric (signed / float ok) |
3587
+ | `<tag>` | declared value | — | Tag value via the group's alias or name |
3551
3588
 
3552
3589
  ### Directives
3553
3590
 
3554
- | Directive | Effect |
3555
- | --------------- | --------------------------------------------------------------------------------------- |
3556
- | `heat <Label>` | Name (and optionally color) the value ramp; pairs with the `heat:` key. |
3557
- | `depth N` | Render N levels; deeper subtrees collapse to a drillable solid block (a render budget). |
3558
- | `other-below N` | Roll children under N% of their parent into a single hatched **Other** bucket (opt-in). |
3559
- | `no-values` | Hide value labels. |
3560
- | `no-percent` | Hide percentage labels. |
3561
- | `no-headers` | Hide parent header bars (a no-op in `radial` mode). |
3562
- | `no-legend` | Hide the legend. |
3563
- | `radial` | Render as a **sunburst / hierarchical pie** (concentric rings) instead of rectangles. |
3591
+ | Directive | Effect |
3592
+ | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3593
+ | `heat <Label>` | Name (and optionally color) the value ramp; pairs with the `heat:` key. |
3594
+ | `active-tag <GroupName \| HeatLabel>` | Pre-select the resting color dimension from source: a tag group name for categorical fill, or the heat ramp's label (`Value` if unnamed) for the ramp. `active-tag none` forces branch mode. The app's runtime switcher still previews the others. |
3595
+ | `depth N` | Render N levels; deeper subtrees collapse to a drillable solid block (a render budget). |
3596
+ | `no-value` | Hide value labels. |
3597
+ | `no-percent` | Hide percentage labels. |
3598
+ | `no-headers` | Hide parent header bars (a no-op in `radial` mode). |
3599
+ | `no-legend` | Hide the legend. |
3600
+ | `radial` | Render as a **sunburst / hierarchical pie** (concentric rings) instead of rectangles. |
3564
3601
 
3565
3602
  Numbers auto-compact (1.2M, 940k). Units live in the title — there is no format/currency directive.
3566
3603
 
3567
3604
  ### Radial mode (sunburst / hierarchical pie)
3568
3605
 
3569
- Add a bare `radial` flag and the same hierarchy renders as a sunburst: the center disc is the whole (chart title + grand total), the first ring is the top-level groups, and each outer ring breaks a group into its parts. Tags, `heat`, and `no-values`/`no-percent`/`no-legend` all carry over; `no-headers` is a no-op. An arc's angle is its share of the whole; radius is depth only, so slices stay in **source order** and very thin arcs drop their inline label. Best for shallow trees (≈3 levels); for deep trees or precise magnitude, prefer the rectangular treemap.
3606
+ Add a bare `radial` flag and the same hierarchy renders as a sunburst: the center disc is the whole (chart title + grand total), the first ring is the top-level groups, and each outer ring breaks a group into its parts. Tags, `heat`, and `no-value`/`no-percent`/`no-legend` all carry over; `no-headers` is a no-op. An arc's angle is its share of the whole; radius is depth only, so slices stay in **source order** and very thin arcs drop their inline label. Best for shallow trees (≈3 levels); for deep trees or precise magnitude, prefer the rectangular treemap.
3570
3607
 
3571
3608
  ```dgmo
3572
3609
  treemap Plunder Spend ($k)
@@ -3656,18 +3693,18 @@ For an **uneven** span (a block covering some but not all columns), use the same
3656
3693
 
3657
3694
  ### Node Metadata
3658
3695
 
3659
- | Key | Type | Default | Description |
3660
- | --------- | -------------- | ------- | --------------------------------------------- |
3661
- | `span` | integer ≥ 1 | 1 | Column span (clamps to the column count) |
3662
- | `collapsed` | flag | — | Start this container folded (collapse-bar) |
3663
- | `<tag>` | declared value | — | Tag value via the group's alias or name |
3696
+ | Key | Type | Default | Description |
3697
+ | ----------- | -------------- | ------- | ------------------------------------------ |
3698
+ | `span` | integer ≥ 1 | 1 | Column span (clamps to the column count) |
3699
+ | `collapsed` | flag | — | Start this container folded (collapse-bar) |
3700
+ | `<tag>` | declared value | — | Tag value via the group's alias or name |
3664
3701
 
3665
3702
  ### Directives
3666
3703
 
3667
- | Directive | Effect |
3668
- | ------------ | ----------------------------------------------------------------- |
3669
- | `columns N` | Override the inferred column count for a grid. |
3670
- | `no-legend` | Hide the tag legend. |
3704
+ | Directive | Effect |
3705
+ | ----------- | ---------------------------------------------- |
3706
+ | `columns N` | Override the inferred column count for a grid. |
3707
+ | `no-legend` | Hide the tag legend. |
3671
3708
 
3672
3709
  ### Interactivity vs export
3673
3710
 
@@ -3733,18 +3770,18 @@ Indented under the source shape, targeting an alias (or an unambiguous bare labe
3733
3770
 
3734
3771
  ### Node Metadata
3735
3772
 
3736
- | Key | Type | Default | Description |
3737
- | --------- | -------------- | --------- | ----------------------------------------------- |
3738
- | `shape` | closed set | rectangle | `database` / `queue` / `cloud` / `person` / `document` / `note` |
3739
- | `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
3740
- | `collapsed` | flag | — | Box only — start folded (collapse-bar) |
3741
- | `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
3773
+ | Key | Type | Default | Description |
3774
+ | ----------- | -------------- | ----------------------- | --------------------------------------------------------------- |
3775
+ | `shape` | closed set | rectangle | `database` / `queue` / `cloud` / `person` / `document` / `note` |
3776
+ | `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
3777
+ | `collapsed` | flag | — | Box only — start folded (collapse-bar) |
3778
+ | `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
3742
3779
 
3743
3780
  ### Directives
3744
3781
 
3745
- | Directive | Effect |
3746
- | ------------ | ----------------------- |
3747
- | `no-legend` | Hide the tag legend. |
3782
+ | Directive | Effect |
3783
+ | ----------- | -------------------- |
3784
+ | `no-legend` | Hide the tag legend. |
3748
3785
 
3749
3786
  ### Interactivity vs export
3750
3787
 
@@ -3757,7 +3794,7 @@ In the desktop and web app a sketch opens in the **canvas editor** (the code pan
3757
3794
  <!-- TYPE:goal -->
3758
3795
 
3759
3796
  <!-- TIPS start -->
3760
- **Styling tips:** A single progress-toward-a-target reading — one `now` against one `target`, answering "how close am I?". Reach for it for a KPI tile, a fundraising thermometer, a quarterly quota, or a completion percentage; there is no time axis, series, or milestones (use `line` for a trend, `countdown` for a live deadline). Put the **unit in the title** (`Marathon Fund ($)`, `Grog Barrel Fill (L)`) — there is no format/currency directive. `now` and `target` are **space-separated `key value`** directives, no colon (`now 6400` / `target 10000`); the percent is `now / target` and values auto-compact (`6.4k`, `1.2M`). Pick the face for the story with a bare flag on its own line: the default progress **bar** for a plain KPI, `thermometer` for fundraising/fill-the-tank framings, `gauge` for a speedometer/quota dial — all three read the same value pair. The fill is **auto traffic-light** by completion (`< 50%` red, `50–80%` orange, `≥ 80%` green; over-target stays green) so the color already reads the number's health — leave it unless you have reason to override with a trailing color on the title line (`goal Marathon Fund ($) green`) or `no-auto-color` (flat palette color). Over-target clamps the fill at 100% while the `%` label stays truthful (`120%`). Add a `note` — inline (`note Still waiting on three crews`) or a block header on its own line with an indented body — to caption the number with context (who's still owed, what's left); it takes simple markdown (`**bold**`, `*italic*`, `` `code` ``) and `- ` bullets. `fill-solid` for a bolder fill; `no-percent` / `no-value` / `no-title` / `no-note` to drop labels.
3797
+ **Styling tips:** A single progress-toward-a-target reading — one `now` against one `target`, answering "how close am I?". Reach for it for a KPI tile, a fundraising thermometer, a quarterly quota, or a completion percentage; there is no time axis, series, or milestones (use `line` for a trend, `countdown` for a live deadline). Put the **unit in the title** (`Marathon Fund ($)`, `Grog Barrel Fill (L)`) — there is no format/currency directive. `now` and `target` are **space-separated `key value`** directives, no colon (`now 6400` / `target 10000`); the percent is `now / target` and values auto-compact (`6.4k`, `1.2M`). Pick the face for the story with a bare flag on its own line: the default progress **bar** for a plain KPI, `thermometer` for fundraising/fill-the-tank framings, `gauge` for a speedometer/quota dial — all three read the same value pair. The fill is **auto traffic-light** by completion (`< 50%` red, `50–80%` orange, `≥ 80%` green; over-target stays green) so the color already reads the number's health — leave it unless you have reason to override with a trailing color on the title line (`goal Marathon Fund ($) green`) or `no-auto-color` (flat palette color). Over-target clamps the fill at 100% while the `%` label stays truthful (`120%`). Add a `note` — inline (`note Still waiting on three crews`) or a block header on its own line with an indented body — to caption the number with context (who's still owed, what's left); it takes simple markdown (`**bold**`, `*italic*`, `` `code` ``) and `- ` bullets. `fill-solid` for a bolder fill; `no-percent` / `no-value` / `no-title` / `no-notes` to drop labels.
3761
3798
  <!-- TIPS end -->
3762
3799
 
3763
3800
  A single progress-toward-a-target value: one `now` measured against one `target`, drawn in one of three static faces. No time axis, no series, no milestones — just "how close am I?". The face is a bare-flag mode directive under the title (like treemap's `radial`); all three faces consume the same value pair.
@@ -3785,18 +3822,18 @@ target 10000
3785
3822
 
3786
3823
  ### Directives
3787
3824
 
3788
- | Directive | Effect |
3789
- | ---------------------- | ------------------------------------------------------------- |
3790
- | `thermometer` / `gauge`| Select the render face (bare flag; omit for the progress bar). |
3791
- | `now <number>` | Current value (required; may exceed the target). |
3792
- | `target <number>` | Goal value (required; must be > 0). |
3793
- | `no-percent` | Hide the `%` label. |
3794
- | `no-value` | Hide the raw `now / target` label. |
3795
- | `fill-solid` | Full-saturation fill instead of the default 25% tint (`fill-outline` hollows the meter — color on the rim). |
3796
- | `no-title` | Hide the banner title. |
3797
- | `no-note` | Suppress the `note` block even if one is authored. |
3798
- | `no-auto-color` | Disable the traffic-light bands; use the flat palette color. |
3799
- | `note <text>` / `note` + indented body | Free-text caption beside/below the face (§ note block). |
3825
+ | Directive | Effect |
3826
+ | -------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
3827
+ | `thermometer` / `gauge` | Select the render face (bare flag; omit for the progress bar). |
3828
+ | `now <number>` | Current value (required; may exceed the target). |
3829
+ | `target <number>` | Goal value (required; must be > 0). |
3830
+ | `no-percent` | Hide the `%` label. |
3831
+ | `no-value` | Hide the raw `now / target` label. |
3832
+ | `fill-solid` | Full-saturation fill instead of the default 25% tint (`fill-outline` hollows the meter — color on the rim). |
3833
+ | `no-title` | Hide the banner title. |
3834
+ | `no-notes` | Suppress the `note` block even if one is authored. |
3835
+ | `no-auto-color` | Disable the traffic-light bands; use the flat palette color. |
3836
+ | `note <text>` / `note` + indented body | Free-text caption beside/below the face (§ note block). |
3800
3837
 
3801
3838
  ### Note block
3802
3839
 
@@ -3813,7 +3850,7 @@ note
3813
3850
  - Columbus — *almost there!*
3814
3851
  ```
3815
3852
 
3816
- The body supports inline `**bold**` / `*italic*` / `` `code` ``, `- `/`* ` bullets, and blank-line gaps. It renders in the left column for `thermometer`/`gauge` and under the bar for the default face. `no-note` hides it even when authored.
3853
+ The body supports inline `**bold**` / `*italic*` / `` `code` ``, `- `/`* ` bullets, and blank-line gaps. It renders in the left column for `thermometer`/`gauge` and under the bar for the default face. `no-notes` hides it even when authored.
3817
3854
 
3818
3855
  ### Values & color
3819
3856
 
@@ -3830,10 +3867,10 @@ Percent is `now / target`. Over-target clamps the fill at 100% while the `%` lab
3830
3867
  <!-- TYPE:countdown -->
3831
3868
 
3832
3869
  <!-- TIPS start -->
3833
- **Styling tips:** The only dynamic chart — it ticks every second and is accurate on every load, so use it for a live "N days until X" widget, not a static report. Keep the title to the event (`Trip to Japan`); the target date renders as a caption automatically. `target` is a space-separated `key value` directive (no colon): a bare date (`2026-08-21`) counts to midnight, a datetime or offset is honored. By default those times are **viewer-local** — each person sees their own; add `tz America/New_York` (any IANA zone, no colon) to **pin** the count so a shared launch/livestream page shows everyone the same remaining time and it doesn't shift when you carry the laptop to another zone. Default `units days` reads best for weeks/months out; use `units full` for a launch-day `Nd HH:MM:SS` clock. Set `expired` to the celebration text (`🚀 Shipped!`); after the target passes every live surface shows it and the tick stops. On images (PNG export, `.svg` via `<img>`, GitHub camo) it can't tick and shows the whole-day count baked at export time — the correct fallback.
3870
+ **Styling tips:** The only dynamic chart — it ticks every second and is accurate on every load, so use it for a live "N days until X" widget, not a static report. Keep the title to the event (`Trip to Japan`); the target date renders as a caption automatically. `target` is a space-separated `key value` directive (no colon): a bare date (`2026-08-21`) counts to the viewer's local midnight, a datetime or offset is honored. Default `units days` reads best for weeks/months out; use `units full` for a launch-day `Nd HH:MM:SS` clock. Set `expired` to the celebration text (`🚀 Shipped!`); after the target passes every live surface shows it and the tick stops. On images (PNG export, `.svg` via `<img>`, GitHub camo) it can't tick and shows the whole-day count baked at export time — the correct fallback.
3834
3871
  <!-- TIPS end -->
3835
3872
 
3836
- The only *dynamic* dgmo chart: a single "N days until X" recomputed against the viewer's clock on every load and ticking every second on any live surface. Distinct from `goal` (static) — a countdown has no `now`/`target` pair, just one future instant. The renderer bakes a whole-day fallback number (the no-JS floor); a tiny page-level ticker overwrites it live and, in `units full`, upgrades it to `Nd HH:MM:SS`.
3873
+ The only _dynamic_ dgmo chart: a single "N days until X" recomputed against the viewer's clock on every load and ticking every second on any live surface. Distinct from `goal` (static) — a countdown has no `now`/`target` pair, just one future instant. The renderer bakes a whole-day fallback number (the no-JS floor); a tiny page-level ticker overwrites it live and, in `units full`, upgrades it to `Nd HH:MM:SS`.
3837
3874
 
3838
3875
  ### Declaration
3839
3876
 
@@ -3855,12 +3892,12 @@ target 2026-08-21
3855
3892
 
3856
3893
  ### Directives
3857
3894
 
3858
- | Directive | Effect |
3859
- | ----------------------- | ---------------------------------------------------------------------- |
3860
- | `target <iso>` | The future instant (required). `2026-08-21`, `2026-08-21T18:00`, or with a tz offset. The literal `now` resolves at render (→ immediately expired; for testing). |
3861
- | `tz <IANA>` | Pin authored times to a zone (`America/New_York`, `Asia/Kolkata`, `UTC`) so the count is the **same for every viewer** and doesn't drift when the host moves zones. Default viewer-local. Footer then shows the in-zone time + a `UTC±` tag. |
3862
- | `units <days\|full>` | `days` (default) shows whole days (ceil); `full` ticks `Nd HH:MM:SS` on live surfaces. |
3863
- | `expired <text>` | Shown once the target passes; the tick stops. Default `"Now!"`. |
3895
+ | Directive | Effect |
3896
+ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3897
+ | `target <iso>` | The future instant (required). `2026-08-21`, `2026-08-21T18:00`, or with a tz offset. The literal `now` resolves at render (→ immediately expired; for testing). |
3898
+ | `tz <IANA>` | Pin authored times to a zone (`America/New_York`, `Asia/Kolkata`, `UTC`) so the count is the **same for every viewer** and doesn't drift when the host moves zones. Default viewer-local. Footer then shows the in-zone time + a `UTC±` tag. |
3899
+ | `units <days\|full>` | `days` (default) shows whole days (ceil); `full` ticks `Nd HH:MM:SS` on live surfaces. |
3900
+ | `expired <text>` | Shown once the target passes; the tick stops. Default `"Now!"`. |
3864
3901
 
3865
3902
  ### Values & color
3866
3903
 
@@ -3868,7 +3905,7 @@ A bare `YYYY-MM-DD` counts to **midnight** and a datetime with no offset to that
3868
3905
 
3869
3906
  ### Semantics
3870
3907
 
3871
- Days mode uses `ceil` — a target later *today* reads "1 day", not "0". Full mode floors the days and shows `HH:MM:SS` for the remainder. Once the target passes, the `expired` text replaces the number and that node stops ticking (no negative counts). Live surfaces recompute from the absolute target on every load/route-change/note-open, so there is **no persisted state** and no drift; image surfaces (PNG, `.svg`-as-image, GitHub camo) show the whole-day count baked at export time.
3908
+ Days mode uses `ceil` — a target later _today_ reads "1 day", not "0". Full mode floors the days and shows `HH:MM:SS` for the remainder. Once the target passes, the `expired` text replaces the number and that node stops ticking (no negative counts). Live surfaces recompute from the absolute target on every load/route-change/note-open, so there is **no persisted state** and no drift; image surfaces (PNG, `.svg`-as-image, GitHub camo) show the whole-day count baked at export time.
3872
3909
 
3873
3910
  ---
3874
3911
 
@@ -3877,10 +3914,10 @@ Days mode uses `ceil` — a target later *today* reads "1 day", not "0". Full mo
3877
3914
  <!-- TYPE:clock -->
3878
3915
 
3879
3916
  <!-- TIPS start -->
3880
- **Styling tips:** A live world clock — one panel per person or place, each showing the CURRENT time in its zone and ticking every second, accurate the instant the page loads. Reach for it to answer "what time is it for the crew right now": a distributed team's local times, a single collaborator's clock, or the overlap window for scheduling a call. The first line declares the type and a title (`Crew standups`). Each entry is one line, `<anchor> [as <label>] [color]`: name the zone once as the anchor — a plain **city name** (`London`, `NYC`, `Bombay`, `Los Angeles` — easiest, resolved through the bundled gazetteer to its canonical zone and displayed as the canonical city), a full **IANA id** (the token containing `/`, like `Europe/London` or `America/New_York`), or a **UTC/GMT offset** (`UTC`, `UTC+1`, `UTC+5:30`, `GMT+2`) which pins a **fixed** offset with no daylight-saving shift (bare `UTC`/`GMT` = +00:00, and no sun line). Use `as <label>` to name the person or role behind a zone (`New York as Dani (NY)`); the label becomes the caption and defaults to the resolved city (or the offset label for a fixed row). The single-clock case is common and encouraged — one title, one entry (`clock Dani` / `New York`). Global directives are flat, no colon: `analog` for analog dials (digital is the default face), `time-24` for a 24-hour readout (12h am/pm is the default), and optional context bands `hours 9-17` + `days mon-fri` (the window accepts `HH:MM` and am/pm, e.g. `hours 8:30-17:15`) to shade each zone's working window so out-of-hours people read at a glance. `no-sun` hides the sunrise/sundown indicator (on by default). Add `hours`/`days` only when the point is scheduling overlap; drop them for a plain "current time" widget. Zones are **colorized by default** (`color-by`, default `place` — a distinct palette accent per place); reach for a semantic mode when color should *mean* something: `color-by time` or `color-by daylight` make an at-a-glance world board read as day-vs-night (order the zones west→east so the daylight sweeps across), and `color-by work` turns a standup/team board green/amber/grey by availability — it needs `hours` set. A hand-set per-zone color (`London as UK team purple`, or just `London purple`) is a **defined** shade that always wins over the dimension, so you can pin one zone and let the rest follow. `color-by none` goes neutral. On image surfaces (PNG, `.svg` via `<img>`, GitHub camo) it can't tick and bakes the time at export — the correct graceful fallback.
3917
+ **Styling tips:** A live world clock — one panel per person or place, each showing the CURRENT time in its zone and ticking every second, accurate the instant the page loads. Reach for it to answer "what time is it for the crew right now": a distributed team's local times, a single collaborator's clock, or the overlap window for scheduling a call. The first line declares the type and a title (`Crew standups`). Each entry is one line, `<anchor> [as <label>]`, where the **anchor** names the zone in one of three forms (first match wins): (1) a **city name** resolved through a built-in gazetteer — just write it the way you'd say it (`London`, `New York`, `Los Angeles`, `Tokyo`, and aliases like `NYC`/`LA`/`Bombay`) — this is the easiest and preferred form; (2) an explicit **IANA id** containing a `/` (`Europe/London`, `America/New_York`) for anything ambiguous or obscure; (3) a raw **UTC offset** (`UTC`, `UTC+5:30`, `UTC-7`, `GMT+2`) — a FIXED offset that does not track daylight saving, so it renders with a small "no DST" marker and no sunrise line (use it for `UTC` itself or regions that don't shift, e.g. India `UTC+5:30`). You name the zone ONCE — do NOT write a place and an IANA zone as two tokens. Use `as <label>` to name the person or role (`New York as Dani (NY)`); the label becomes the caption and defaults to the resolved city. The single-clock case is common and encouraged — one title, one entry (`clock Dani` / `New York`). An ambiguous city (e.g. `San Jose`) errors listing the candidate zones; an unknown place is skipped with a did-you-mean. Global directives are flat, no colon: `analog` for analog dials (digital is the default face), `time-24` for a 24-hour readout (12h am/pm is the default), and optional context bands `hours 9-17` + `workweek mon-fri` (the window accepts `HH:MM` and am/pm, e.g. `hours 8:30-17:15`) to shade each zone's working window so out-of-hours people read at a glance. `no-sun` hides the sunrise/sundown indicator (on by default). Add `hours`/`workweek` only when the point is scheduling overlap; drop them for a plain "current time" widget. Zones are **colorized by default** (`color-by`, default `place` — a distinct palette accent per place); reach for a semantic mode when color should *mean* something: `color-by time` or `color-by daylight` make an at-a-glance world board read as day-vs-night (order the zones west→east so the daylight sweeps across), and `color-by work` turns a standup/team board green/amber/grey by availability — it needs `hours` set. A hand-set per-zone color (`London as UK team purple`) is a **defined** shade that always wins over the dimension, so you can pin one zone and let the rest follow. `color-by none` goes neutral. On image surfaces (PNG, `.svg` via `<img>`, GitHub camo) it can't tick and bakes the time at export — the correct graceful fallback.
3881
3918
  <!-- TIPS end -->
3882
3919
 
3883
- The second *dynamic* dgmo chart (with `countdown`): a live board of world clocks recomputed against the viewer's clock every second. Flat syntax — the first line is `clock <Title>`; every other non-blank line is either a board-level directive (its first token is an option keyword) or a place row. Order-independent; no colons anywhere.
3920
+ The second _dynamic_ dgmo chart (with `countdown`): a live board of world clocks recomputed against the viewer's clock every second. Flat syntax — the first line is `clock <Title>`; every other non-blank line is either a board-level directive (its first token is an option keyword) or a place row. Order-independent; no colons anywhere.
3884
3921
 
3885
3922
  ### Declaration
3886
3923
 
@@ -3889,11 +3926,11 @@ clock [Title]
3889
3926
 
3890
3927
  analog // analog dials; digital is the default face
3891
3928
  hours <start>-<end> // optional working window (24h, HH:MM or am/pm)
3892
- days <mon-fri | mon,wed,fri> // optional working days (default mon-fri)
3929
+ workweek <mon-fri | mon,wed,fri> // optional working days (default mon-fri)
3893
3930
  no-sun // hide the sundown/sunrise line (on by default)
3894
3931
  time-24 // 24-hour readout (12h am/pm is the default)
3895
3932
  no-title // suppress the board title
3896
- direction lr // lay the panels out in a row
3933
+ direction-lr // lay the panels out in a row (columns); direction-tb restates the default rows
3897
3934
  color-by <place|work|daylight|time|none> // zone coloring; default place
3898
3935
 
3899
3936
  <anchor> [as <label…>] [color]
@@ -3904,7 +3941,7 @@ color-by <place|work|daylight|time|none> // zone coloring; default place
3904
3941
  ```
3905
3942
  clock Crew standups
3906
3943
  hours 9-17
3907
- days mon-fri
3944
+ workweek mon-fri
3908
3945
 
3909
3946
  London as UK team
3910
3947
  New York as Dani (NY)
@@ -3924,15 +3961,15 @@ UTC as Servers
3924
3961
 
3925
3962
  ### Directives
3926
3963
 
3927
- | Directive | Effect |
3928
- | ---------------------- | ---------------------------------------------------------------------- |
3929
- | `analog` | Analog dials for the WHOLE board. Digital is the default face. |
3930
- | `hours <start>-<end>` | Working window (e.g. `9-17`, `8:30-17:15`, or am/pm); drives the status chip, evaluated in each row's own zone. |
3931
- | `days <range\|list>` | Working days: `mon-fri` or `mon,wed,fri`. Default Mon–Fri. No effect without `hours`. |
3932
- | `no-sun` | Hide the sundown/sunrise line (on by default when the zone's city coordinates are known). |
3933
- | `time-24` | 24-hour readout (12-hour am/pm is the default). |
3934
- | `no-title` | Suppress the board title. |
3935
- | `direction lr` | Lay the panels out in a row (columns) instead of stacked. |
3964
+ | Directive | Effect |
3965
+ | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
3966
+ | `analog` | Analog dials for the WHOLE board. Digital is the default face. |
3967
+ | `hours <start>-<end>` | Working window (e.g. `9-17`, `8:30-17:15`, or am/pm); drives the status chip, evaluated in each row's own zone. |
3968
+ | `workweek <range\|list>` | Working days: `mon-fri` or `mon,wed,fri`. Default Mon–Fri. No effect without `hours`. |
3969
+ | `no-sun` | Hide the sundown/sunrise line (on by default when the zone's city coordinates are known). |
3970
+ | `time-24` | 24-hour readout (12-hour am/pm is the default). |
3971
+ | `no-title` | Suppress the board title. |
3972
+ | `direction-lr` | Lay the panels out in a row (columns) instead of stacked; `direction-tb` restates the default rows. Key+value `direction lr | tb`(and`direction columns`) accepted legacy. |
3936
3973
  | `color-by <place\|work\|daylight\|time\|none>` | Which dimension colors the zones. Default `place`; `color-by none` goes neutral. `place` = identity accent per place; `work` = green/amber/grey by the `hours` window; `daylight` = warm sun-up / cool sun-down; `time` = local-hour dawn→night ramp (order zones west→east). A hand-set (**defined**) per-zone trailing color always wins over the dimension. |
3937
3974
 
3938
3975
  ### Entry grammar
@@ -3985,18 +4022,18 @@ Black Pearl beats Salty Dog 6-5
3985
4022
 
3986
4023
  ### Directives
3987
4024
 
3988
- | Directive | Effect |
3989
- | ------------------------------ | ---------------------------------------------------------------------------- |
3990
- | `rounds A, B, C` | Name the columns entry-round → inner (or an indented block with per-round `Name color`); absent → generic `Round N` / `Final`. |
3991
- | `seed N [Name] [k: v]` | Declare a seeded entrant → seeded mode + day-0 skeleton (top seeds get byes); trailing `k: v` tags the team. |
3992
- | `tag Group [as g]` | Tag group (block/kanban idiom) — a competitor's tag value colors its box outline; a legend renders. |
3993
- | `[Side] [color]` | A bracket column (kanban idiom); two sides mirror to a center championship. |
3994
- | `[Winner] beats [Loser] [score] [@ Home]` | A decided match — the left name advances; score is cosmetic; `@ Home` marks the host. Indent prose under it for commentary. |
3995
- | `[A] vs [B]` | A pending, undecided match (both boxes drawn, no winner emphasis). |
3996
- | `accent <color>` | Winner accent color override (default blue). Tags/sides still win per-box. |
3997
- | `no-round` | Suppress the round/column labels. |
3998
- | `no-legend` | Hide the tag legend (outlines still colored). |
3999
- | `single-elim` / `double-elim` / `seeded` | Format flags. `double-elim` reserved — not yet supported; `seeded` forces seeded mode. |
4025
+ | Directive | Effect |
4026
+ | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
4027
+ | `rounds A, B, C` | Name the columns entry-round → inner (or an indented block with per-round `Name color`); absent → generic `Round N` / `Final`. |
4028
+ | `seed N [Name] [k: v]` | Declare a seeded entrant → seeded mode + day-0 skeleton (top seeds get byes); trailing `k: v` tags the team. |
4029
+ | `tag Group [as g]` | Tag group (block/kanban idiom) — a competitor's tag value colors its box outline; a legend renders. |
4030
+ | `[Side] [color]` | A bracket column (kanban idiom); two sides mirror to a center championship. |
4031
+ | `[Winner] beats [Loser] [score] [@ Home]` | A decided match — the left name advances; score is cosmetic; `@ Home` marks the host. Indent prose under it for commentary. |
4032
+ | `[A] vs [B]` | A pending, undecided match (both boxes drawn, no winner emphasis). |
4033
+ | trailing color on the title line | Winner accent color override (default blue), e.g. `bracket Champions Cup red` (§1.5 title-line accent slot). Legacy `accent <color>` directive is accepted; the title-line token wins on conflict. Tags/sides still win per-box. |
4034
+ | `no-round` | Suppress the round/column labels. |
4035
+ | `no-legend` | Hide the tag legend (outlines still colored). |
4036
+ | `single-elim` / `double-elim` / `seeded` | Format flags. `double-elim` reserved — not yet supported; `seeded` forces seeded mode. |
4000
4037
 
4001
4038
  ### Semantics
4002
4039
 
@@ -4104,7 +4141,7 @@ Markers in cells are always **rendered in canonical alphabet order** (`R A C I`,
4104
4141
  <!-- TYPE:map -->
4105
4142
 
4106
4143
  <!-- TIPS start -->
4107
- **Styling tips:** the zero-config map already looks good — name places and stop. When POIs fall into categories, tag them so each category gets its own color; keep place labels to the place name; leave region colorize and coastlines on unless the user asks to hide them. **For flights and airport routes, use IATA codes, not city names** — `LHR ~> JFK`, `LHR ~> DXB`, `LHR ~> SIN`, `LHR ~> HND` — the bundled airport set (large international hubs + all US commercial airports) resolves them to the right coordinates and labels them with the code. **For cities, use the exact canonical name**: "New York City" (NOT "New York"), "Washington, D.C.", etc. — a name the gazetteer doesn't have **silently drops that point** and the map just reframes around the rest, so it looks fine but is wrong. When unsure of the exact token, look it up: `dgmo map-search "<place>"` (or the `lookup_map_location` MCP tool) returns the city name or airport code to paste; fall back to coordinates (`poi Name as 40.71,-74.0`) for anything not found. **For routes/flows from a hub** (an airport's daily flights, a distribution center's shipments), write ONE edge per line and repeat the origin — never indented edges (those error). Use **arcs** (`~>`) for flights and long-haul links so the spokes separate; the connector label carries the relationship (`~daily~>`, `~2x daily~>`). Endpoints auto-create POIs, so don't add separate `poi` lines for places already in an edge. Reach for a `route` block only when the trip is an **ordered voyage** that continues stop→stop (a cruise itinerary), not a set of independent routes from one origin. **For a "what time is it at each office" map**, flag each POI with `clock` — the zone comes from the place automatically, so just `poi Denver clock`; add `hours 9-17` + `days mon-fri` for open/closed dots, and `clock: <IANA>` only on bare-coordinate pins. Use `label:` (not `as`) for a multi-word office name.
4144
+ **Styling tips:** the zero-config map already looks good — name places and stop. When POIs fall into categories, tag them so each category gets its own color; keep place labels to the place name; leave region colorize and coastlines on unless the user asks to hide them. **For flights and airport routes, use IATA codes, not city names** — `LHR ~> JFK`, `LHR ~> DXB`, `LHR ~> SIN`, `LHR ~> HND` — the bundled airport set (large international hubs + all US commercial airports) resolves them to the right coordinates and labels them with the code. **For cities, use the exact canonical name**: "New York City" (NOT "New York"), "Washington, D.C.", etc. — a name the gazetteer doesn't have **silently drops that point** and the map just reframes around the rest, so it looks fine but is wrong. When unsure of the exact token, look it up: `dgmo map-search "<place>"` (or the `lookup_map_location` MCP tool) returns the city name or airport code to paste; fall back to coordinates (`poi Name as 40.71,-74.0`) for anything not found. **For routes/flows from a hub** (an airport's daily flights, a distribution center's shipments), write ONE edge per line and repeat the origin — never indented edges (those error). Use **arcs** (`~>`) for flights and long-haul links so the spokes separate; the connector label carries the relationship (`~daily~>`, `~2x daily~>`). Endpoints auto-create POIs, so don't add separate `poi` lines for places already in an edge. Reach for a `route` block only when the trip is an **ordered voyage** that continues stop→stop (a cruise itinerary), not a set of independent routes from one origin.
4108
4145
  <!-- TIPS end -->
4109
4146
 
4110
4147
  Geographic concept maps: highlight/shade political subdivisions, drop points of interest (POIs), and connect them with routes or edges. For "share a concept" business maps, not cartography. Renders at a fixed, auto-fit position — no pan/zoom. Basemap and viewport are **inferred from the content you reference** — most maps need no directives. v1 boundaries: world countries + US states.
@@ -4185,15 +4222,15 @@ Flag a POI with `clock` and it grows a **live local-time card** above the marker
4185
4222
  ```
4186
4223
  map Team offices
4187
4224
  hours 9-17 # per-pin availability window (open/closed dot)
4188
- days mon-fri
4225
+ workweek mon-fri
4189
4226
  poi San Francisco clock # zone auto-derived from the place
4190
4227
  poi London clock
4191
4228
  poi Bengaluru clock
4192
4229
  poi 1.29 103.85 as SG clock: Asia/Singapore # bare-coord pin names its zone
4193
4230
  ```
4194
4231
 
4195
- - **The place picks the zone — don't type it.** A named city derives its IANA zone from the gazetteer (correct by construction, e.g. Austin → Central). Only a **bare-coordinate** pin needs the valued form `clock: <zone>` — an IANA id (`Asia/Tokyo`) or a fixed offset (`clock: UTC+9`, no DST). The valued form also *overrides* a city, but a mismatch warns (you almost never want it).
4196
- - `hours 9-17` + `days mon-fri` (map-level) give a status dot per pin — green open / amber opening soon / hollow closed·weekend — evaluated in **each pin's own zone**.
4232
+ - **The place picks the zone — don't type it.** A named city derives its IANA zone from the gazetteer (correct by construction, e.g. Austin → Central). Only a **bare-coordinate** pin needs the valued form `clock: <zone>` — an IANA id (`Asia/Tokyo`) or a fixed offset (`clock: UTC+9`, no DST). The valued form also _overrides_ a city, but a mismatch warns (you almost never want it).
4233
+ - `hours 9-17` + `workweek mon-fri` (map-level) give a status dot per pin — green open / amber opening soon / hollow closed·weekend — evaluated in **each pin's own zone**.
4197
4234
  - Use `label:` for a multi-word office name (`poi Los Angeles clock, label: El Segundo`); the `as` alias is a single word and doesn't render.
4198
4235
  - The card ticks every second on live surfaces and bakes a snapshot for PNG/SVG. It shows the weekday only when the pin's day differs from the viewer's.
4199
4236
 
@@ -4212,12 +4249,12 @@ There is no header `style:` — bow a whole voyage by using `~>` on every leg.
4212
4249
 
4213
4250
  Native edges handle any other connection (no `link`/`leg` keyword). A token draws an arrowhead iff it ends in `>`, an arc iff it starts with `~`; drop the `>` for a plain line when an arrow would mislead. The label always sits between the delimiters:
4214
4251
 
4215
- | | no label | labeled |
4216
- |---|---|---|
4217
- | directed straight | `A -> B` | `A -ships-> B` |
4218
- | directed arc | `A ~> B` | `A ~trade~> B` |
4219
- | undirected straight | `A -- B` | `A -ferry- B` |
4220
- | undirected arc | `A ~~ B` | `A ~cable~ B` |
4252
+ | | no label | labeled |
4253
+ | ------------------- | -------- | -------------- |
4254
+ | directed straight | `A -> B` | `A -ships-> B` |
4255
+ | directed arc | `A ~> B` | `A ~trade~> B` |
4256
+ | undirected straight | `A -- B` | `A -ferry- B` |
4257
+ | undirected arc | `A ~~ B` | `A ~cable~ B` |
4221
4258
 
4222
4259
  ```
4223
4260
  A -> B # one-off, directed
@@ -4254,7 +4291,7 @@ cove -> hav l: March # the LINE turns green
4254
4291
  - Title is the declaration line; `caption` (data-source attribution, travels with the exported PNG) is the only chrome directive. There is no `subtitle`.
4255
4292
  - Legend auto-composes below the title: the heat ramp + `region-heat` and each tag group are **selectable colouring groups** (collapse/activate to flip the fill); POI size (`poi-size`) and edge thickness (`flow-width`) are self-evident from scale and carry no legend key in v1. `no-legend` suppresses all of it.
4256
4293
  - **Region and POI labels are on by default.** Region labels auto-fit **full → abbrev → hide** (a US-state 2-letter abbreviation is tried when the full name doesn't fit; other regions degrade full → hide); POI labels are collision-managed. Labels render **on the map** (export-safe), escalating inline → leader line → numbered pin in dense clusters; markers never move. A wide map in a narrow column (< ~480px) prefers abbreviations and drops reference relief, as if zoomed out.
4257
- - **Cosmetic features are on by default**; the only switches are bare `no-*` opt-outs (no positive opt-in flag): `no-coastline`, `no-relief`, `no-context-labels`, `no-region-labels`, `no-poi-labels`, `no-legend`, `no-colorize`. A plain look = the four basemap flags together (`no-colorize` is **not** one of the four — it toggles region *fill style*, not a basemap backdrop layer).
4294
+ - **Cosmetic features are on by default**; the only switches are bare `no-*` opt-outs (no positive opt-in flag): `no-coastline`, `no-relief`, `no-context-labels`, `no-region-labels`, `no-poi-labels`, `no-legend`, `no-colorize`. A plain look = the four basemap flags together (`no-colorize` is **not** one of the four — it toggles region _fill style_, not a basemap backdrop layer).
4258
4295
  - **Colorize (distinct political fills) is the default for any map without region data.** Unless a region carries data (a `heat:` or a tag), every region drawn at the resolved extent is filled a **distinct light pastel** such that no two bordering regions share a hue — the conventional "colour the countries/states so neighbours separate" look, with zero config. It applies to named-region maps, POI/route-only maps, and even a bare `map` (the whole world colours as the backdrop). The fills are **non-semantic** (no legend entry) and **extent-independent** (a region's colour is the same at any width and in an inset). A direct trailing colour (`Texas red`) paints on top as a highlight and does not suppress colorize; adding any `heat:`/tag flips the map to the data dress (colorize auto-suppressed, no error). `no-colorize` forces the plain green-land + blue-water dress — useful when many POIs/routes should pop against a calm map.
4259
4296
 
4260
4297
  ### Name resolution
@@ -4268,7 +4305,7 @@ cove -> hav l: March # the LINE turns green
4268
4305
  - **Name + scope** (readable): `Georgia US heat: 5` → the state, `Georgia GE heat: 5` → the country.
4269
4306
  - The redundant `Georgia US-GA` still works but isn't needed (a mismatched code like `Georgia US-CA` is rejected). A bare ambiguous `Georgia` follows the inferred US-scope signal and warns with both fixes named.
4270
4307
  - **IATA airport codes** resolve to airport coordinates — `poi JFK`, `route JFK -> LAX` — with no new syntax (large international hubs + all US scheduled-commercial airports). Case-insensitive (`jfk`/`JFK`). Airports are the **lowest-precedence** identifier: a token that is both a city and a code resolves to the **city** (`Ufa` → the city, not UFA airport), with a hint naming the airport. Resolution is by **code only** (never by airport name); the POI label is the typed code. An unknown three-letter code errors with an `as <CODE>` coordinates hint.
4271
- - **A city name must match the gazetteer's canonical form** — `New York City`, not `New York`; `Washington, D.C.`, not `Washington`. An unrecognized name is dropped (with a did-you-mean note) and the map reframes around the places that *did* resolve, so the result can look complete but be missing a point. Use the exact name or coordinates.
4308
+ - **A city name must match the gazetteer's canonical form** — `New York City`, not `New York`; `Washington, D.C.`, not `Washington`. An unrecognized name is dropped (with a did-you-mean note) and the map reframes around the places that _did_ resolve, so the result can look complete but be missing a point. Use the exact name or coordinates.
4272
4309
  - **Discover the exact token** with the lookup surface rather than guessing — `dgmo map-search "<place>"` (CLI; `--json` for machine output) or the `lookup_map_location` MCP tool. It substring-searches cities **and** the bundled airports and returns the precise token to paste (e.g. `york` → `New York City`; `heathrow` → `LHR`). There is intentionally **no exhaustive printed list** — the gazetteer holds thousands of cities plus ~1,500 airports; search is the interface.
4273
4310
  - Positional coordinates are the escape hatch for anything missing/ambiguous (including forcing an airport over a colliding city: `poi 54.56 55.87 as UFA`).
4274
4311
 
@@ -4301,23 +4338,23 @@ The directive set is **13, all colon-free**: six naming intent the renderer can'
4301
4338
 
4302
4339
  ### Colons NOT USED
4303
4340
 
4304
- | Construct | Diagram Type | Example |
4305
- | ---------------------- | ---------------- | ------------------------------------- |
4306
- | Chart type declaration | all | `bar Title` |
4307
- | Tag declarations | all | `tag Name as x` |
4308
- | Boolean options | all | `activations`, `no-activations` |
4309
- | Key-value options | all | `start 2026-03-15`, `active-tag Team` |
4310
- | Series declarations | data charts | `series A B C` |
4311
- | Data rows | bar/line/pie/etc | `Label 100` |
4312
- | ER columns | er | `id int pk` |
4313
- | Sequence messages | sequence | `A -msg-> B` |
4314
- | Groups/containers | all | `[Group Name]` |
4315
- | Section dividers | sequence | `== Phase ==` |
4316
- | Comments | all | `// comment` |
4317
- | Wordcloud data | wordcloud | `swordsmanship 95` |
4318
- | Slope data rows | slope | `Blackbeard 40 4` |
4319
- | Slope period directive | slope | `period 1715 1725` |
4320
- | Venn intersections | venn | `sw + nav Sea Raiders` |
4341
+ | Construct | Diagram Type | Example |
4342
+ | ---------------------- | ---------------- | ------------------------------------------ |
4343
+ | Chart type declaration | all | `bar Title` |
4344
+ | Tag declarations | all | `tag Name as x` |
4345
+ | Boolean options | all | `activations`, `no-activations` |
4346
+ | Key-value options | all | `start-date 2026-03-15`, `active-tag Team` |
4347
+ | Series declarations | data charts | `series A B C` |
4348
+ | Data rows | bar/line/pie/etc | `Label 100` |
4349
+ | ER columns | er | `id int pk` |
4350
+ | Sequence messages | sequence | `A -msg-> B` |
4351
+ | Groups/containers | all | `[Group Name]` |
4352
+ | Section dividers | sequence | `== Phase ==` |
4353
+ | Comments | all | `// comment` |
4354
+ | Wordcloud data | wordcloud | `swordsmanship 95` |
4355
+ | Slope data rows | slope | `Blackbeard 40 4` |
4356
+ | Slope period directive | slope | `period 1715 1725` |
4357
+ | Venn intersections | venn | `sw + nav Sea Raiders` |
4321
4358
 
4322
4359
  ### The Rule
4323
4360
 
@@ -4332,7 +4369,7 @@ A colon binds a value, and it appears in exactly **four syntactic positions**
4332
4369
 
4333
4370
  **Colons never appear in:**
4334
4371
 
4335
- - Directives and options — space-separated (`start 2026-03-15`, `x-label Low, High`, `region`)
4372
+ - Directives and options — space-separated (`start-date 2026-03-15`, `x-label Low, High`, `region`)
4336
4373
  - Tag declarations and chart type declarations
4337
4374
  - Series declarations and data rows for simple/data charts (incl. sankey/arc links `Source -> Target value` and quadrant data; space-delimited — a comma in a data-row value raises `E_DATA_COMMA_REMOVED`)
4338
4375
  - Structural syntax (groups, sections, arrows, comments)
@@ -4379,16 +4416,16 @@ API description: Main gateway
4379
4416
 
4380
4417
  Some constructs _look_ universal but are scoped to specific chart types. Don't transplant them across charts.
4381
4418
 
4382
- | Construct | Scope |
4383
- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
4384
- | `collapsed: true` metadata | sequence, infra, mindmap, pert |
4385
- | Same-line / indented metadata on declarations | all chart types except flowchart, state, data charts (§1.4) |
4386
- | Trailing-keyword flag list | wireframe only (§19) |
4387
- | `progress: <N>` key | gantt only (§13) |
4388
- | `score: <N>` + `emotion: <Word>` keys | journey-map only (§22) |
4389
- | `description: <text>` shorthand for layers | pyramid, ring (§23, §24) |
4390
- | `milestone` keyword | **removed** — use `<name> 0` (§13A) |
4391
- | `\|` operator as metadata delimiter | **removed** (§1.4). Surviving uses: wireframe `{A \| B}` braces, in-arrow `A -file\|name-> B`, quoted `"Order \| Items"` |
4419
+ | Construct | Scope |
4420
+ | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
4421
+ | Bare `collapsed` trailing flag (§1.8) | sequence, infra, gantt, kanban, mindmap, pert, state, c4, event-line (eras), block, sketch, wireframe. Legacy: `collapsed: true` metadata |
4422
+ | Same-line / indented metadata on declarations | all chart types except flowchart, state, data charts (§1.4) |
4423
+ | Trailing-keyword flag list | wireframe only (§19) |
4424
+ | `progress: <N>` key | gantt only (§13) |
4425
+ | `score: <N>` + `emotion: <Word>` keys | journey-map only (§22) |
4426
+ | `description: <text>` shorthand for layers | pyramid, ring (§23, §24) |
4427
+ | `milestone` keyword | **removed** — use `<name> 0` (§13A) |
4428
+ | `\|` operator as metadata delimiter | **removed** (§1.4). Surviving uses: wireframe `{A \| B}` braces, in-arrow `A -file\|name-> B`, quoted `"Order \| Items"` |
4392
4429
 
4393
4430
  ### 26.4 Quoted Names + Aliases — Pick One
4394
4431
 
@@ -4417,7 +4454,7 @@ Before considering DGMO output complete, mentally verify:
4417
4454
  3. Metadata uses §1.4 — same-line `key: value, ...` after the name region, or indented `key: value` for reserved keys. No `|` delimiter anywhere except wireframe dropdowns, in-arrow label characters, and quoted name characters.
4418
4455
  4. Wireframe flags are written as space-separated lowercase trailing keywords from the closed enum (§19).
4419
4456
  5. Journey-map steps use `score: N, emotion: Word`; gantt tasks use `progress: N`; pyramid/ring layers use `description: <text>` (quote when the value contains commas).
4420
- 6. All chart types use `collapsed: true` metadata for collapse (§27.3).
4457
+ 6. Collapse is the bare `collapsed` trailing flag on the group/container line (§1.8; legacy: `collapsed: true` metadata).
4421
4458
  7. Quoted names don't carry `as <alias>` on the same line.
4422
4459
  8. Sequence participants with alias or quoted names use `is a <type>`.
4423
4460
  9. No `milestone` keyword in PERT — use `<name> 0`.