@diagrammo/dgmo 0.51.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 (336) hide show
  1. package/.cursorrules +74 -77
  2. package/.github/copilot-instructions.md +74 -77
  3. package/.windsurfrules +74 -77
  4. package/SKILL.md +74 -77
  5. package/dist/advanced.d.ts +109 -246
  6. package/dist/advanced.js +296 -633
  7. package/dist/analyzer-TDN5KJFP.js +15 -0
  8. package/dist/auto.css +14 -6
  9. package/dist/auto.js +141 -129
  10. package/dist/auto.mjs +2062 -937
  11. package/dist/block.css +14 -6
  12. package/dist/block.js +123 -73
  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-RLFVAKEO.js → chunk-22OQWBWD.js} +25 -8
  19. package/dist/{chunk-I2QZFCS2.js → chunk-27STWBOK.js} +10 -8
  20. package/dist/{chunk-5PZT4DQG.js → chunk-2QC4HXCY.js} +41 -21
  21. package/dist/{chunk-HFMYN6N2.js → chunk-3B2GXZCX.js} +4 -3
  22. package/dist/{chunk-F3FYUFUH.js → chunk-3BEKKRH5.js} +18 -17
  23. package/dist/{chunk-2UJSV2VT.js → chunk-3CZLWOCI.js} +17 -7
  24. package/dist/{chunk-JEUJOX5X.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-ZO27FGJS.js → chunk-4ASVFYB2.js} +10 -7
  28. package/dist/{chunk-WCT3NYCV.js → chunk-4ASYQ347.js} +33 -8
  29. package/dist/{chunk-2ILHQOL3.js → chunk-4K42RUGC.js} +41 -13
  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-EXOQP75F.js → chunk-4WGMGKCZ.js} +53 -33
  34. package/dist/{chunk-JED6ZDEE.js → chunk-5HWPEYWB.js} +2 -2
  35. package/dist/{chunk-3YSQZ75W.js → chunk-65V6IRFN.js} +46 -33
  36. package/dist/{chunk-TMACGPW5.js → chunk-6AUZPPAV.js} +4 -4
  37. package/dist/{chunk-6H7O2OPM.js → chunk-6DCOIN4W.js} +36 -6
  38. package/dist/{chunk-GTWKD3QT.js → chunk-6HTRCTAS.js} +7 -6
  39. package/dist/{chunk-VB4UJ3H2.js → chunk-6KY7OCZC.js} +21 -11
  40. package/dist/{chunk-YAA6IID3.js → chunk-774C2FF3.js} +2 -2
  41. package/dist/{chunk-WJ7RW65H.js → chunk-7GUF6SDR.js} +22 -20
  42. package/dist/{chunk-QYTPPDAO.js → chunk-7JDTNFAK.js} +3 -3
  43. package/dist/{chunk-U6EQI3U6.js → chunk-ADYKAKE3.js} +3 -3
  44. package/dist/{chunk-VNSXLA6G.js → chunk-AHXIMHDQ.js} +84 -20
  45. package/dist/chunk-AIMLCDAO.js +404 -0
  46. package/dist/{chunk-6MNGECP2.js → chunk-ALYZ3MAA.js} +4 -4
  47. package/dist/{chunk-5F5ELR3V.js → chunk-AN2DQB3G.js} +151 -20
  48. package/dist/{chunk-IEWG6J7C.js → chunk-AZNXGWDC.js} +91 -36
  49. package/dist/{chunk-4XFBQT5O.js → chunk-B4XS2AF2.js} +3 -3
  50. package/dist/{chunk-CC4YRBWV.js → chunk-BD3WGY4T.js} +18 -8
  51. package/dist/{chunk-RAHVMKBG.js → chunk-BFDVEO5R.js} +2 -2
  52. package/dist/{chunk-332ZR4QU.js → chunk-BR7AYN76.js} +8 -8
  53. package/dist/{chunk-P3NRSSUU.js → chunk-BULHGPHK.js} +3 -3
  54. package/dist/{chunk-PZDBOK2Q.js → chunk-CK2GMDXD.js} +11 -5
  55. package/dist/{chunk-467TVMQL.js → chunk-CMVZWP32.js} +3 -3
  56. package/dist/{chunk-GNSFLJAA.js → chunk-CQFNIIQN.js} +7 -7
  57. package/dist/{chunk-RBDIYLA5.js → chunk-DAOFNU6J.js} +17 -1
  58. package/dist/{chunk-AFIEPDLX.js → chunk-DWUMPMV2.js} +23 -11
  59. package/dist/{chunk-USZW2HHU.js → chunk-EQW6HOP4.js} +4 -3
  60. package/dist/{chunk-6BQFET7X.js → chunk-FFXCKZOU.js} +12 -4
  61. package/dist/{chunk-WRNFDFPU.js → chunk-FGDSTT3F.js} +2 -2
  62. package/dist/{chunk-6NFYEQDX.js → chunk-FLDC7ZAK.js} +34 -7
  63. package/dist/{chunk-IUJODQKX.js → chunk-FT7TPPZ5.js} +25 -23
  64. package/dist/{chunk-IEDMFNU7.js → chunk-FUKNRLIJ.js} +19 -7
  65. package/dist/{chunk-JJXGQIRV.js → chunk-FXCB7H5O.js} +4 -4
  66. package/dist/{chunk-GGHRAITI.js → chunk-GABSL6TH.js} +4 -4
  67. package/dist/{chunk-RXKTSFDL.js → chunk-GAWKIIPO.js} +35 -43
  68. package/dist/{chunk-ZJ3LS7DW.js → chunk-GMAH572Z.js} +6 -6
  69. package/dist/{chunk-TRM2J7ZN.js → chunk-GMIJ35PW.js} +28 -29
  70. package/dist/{chunk-AB7INMR5.js → chunk-GQ644SPD.js} +26 -25
  71. package/dist/{chunk-5QKQSSPO.js → chunk-GRM2A4BG.js} +4 -4
  72. package/dist/{chunk-3ODS2VGL.js → chunk-GWQJKTFS.js} +161 -704
  73. package/dist/{chunk-OTOHI4JO.js → chunk-H3HFC3SQ.js} +2 -2
  74. package/dist/{chunk-JSSX2SX4.js → chunk-HE5J53SZ.js} +4 -4
  75. package/dist/{chunk-2EQMXBBQ.js → chunk-HNBY6CNV.js} +3 -3
  76. package/dist/{chunk-J76PIKAT.js → chunk-HO3RCNF6.js} +3 -3
  77. package/dist/{chunk-OJTXTQA2.js → chunk-HORZ5H2L.js} +38 -31
  78. package/dist/{chunk-MX2EY5Y7.js → chunk-HOXKNRON.js} +2 -2
  79. package/dist/{chunk-E7Y3SYKW.js → chunk-I64ECJX3.js} +18 -8
  80. package/dist/{chunk-JM4LEPY3.js → chunk-IQJCVREL.js} +11 -8
  81. package/dist/{chunk-3JLKYGBQ.js → chunk-J7HI6G3G.js} +9 -6
  82. package/dist/{chunk-Q62FEYK3.js → chunk-JHOAH4TI.js} +3 -3
  83. package/dist/{chunk-OZPBJM5Q.js → chunk-JTMSWEIW.js} +11 -8
  84. package/dist/{chunk-P6T66CCZ.js → chunk-JYDMBWRP.js} +37 -19
  85. package/dist/{chunk-7DF4J4RL.js → chunk-KKHCNSKK.js} +17 -11
  86. package/dist/{chunk-ENRS56GC.js → chunk-KUSAVOWZ.js} +11 -8
  87. package/dist/{chunk-BYJBIALT.js → chunk-LC3FFD43.js} +23 -18
  88. package/dist/{chunk-65WJYYKJ.js → chunk-LHILKFDP.js} +16 -11
  89. package/dist/{chunk-NEQ6GJXB.js → chunk-LQHVDZYC.js} +52 -16
  90. package/dist/{chunk-5WPNFSXP.js → chunk-MA3HJZHB.js} +5 -5
  91. package/dist/{chunk-Z6XJQ6KO.js → chunk-MEQYZZFR.js} +3 -3
  92. package/dist/{chunk-MVN25IF6.js → chunk-NNUMX6WX.js} +42 -12
  93. package/dist/{chunk-7DYOELRK.js → chunk-NNYFQOTK.js} +78 -38
  94. package/dist/{chunk-NNAAJVBU.js → chunk-NR5HCAUD.js} +1 -1
  95. package/dist/{chunk-H6PI3KJT.js → chunk-ODUT5WMC.js} +2 -2
  96. package/dist/{chunk-5PDTIBLV.js → chunk-P3H7QVDH.js} +56 -19
  97. package/dist/{chunk-ND76YJCN.js → chunk-PIXZTCKH.js} +84 -117
  98. package/dist/{chunk-3LV2NCB6.js → chunk-PKNNHU7H.js} +22 -9
  99. package/dist/{chunk-TK2VQQX2.js → chunk-PT4SW76W.js} +20 -18
  100. package/dist/{chunk-AE7II3E3.js → chunk-PV2QO7QL.js} +4 -4
  101. package/dist/{chunk-FTBZV6NE.js → chunk-PYO4TJJ3.js} +34 -26
  102. package/dist/{chunk-QZPEGJOM.js → chunk-Q7AH665U.js} +28 -14
  103. package/dist/{chunk-QHI5XVUJ.js → chunk-QAALSCKI.js} +27 -26
  104. package/dist/{chunk-GD6L76WD.js → chunk-QI3BOLQB.js} +23 -11
  105. package/dist/{chunk-Y6GBQTBK.js → chunk-QWIBT6DS.js} +50 -28
  106. package/dist/{chunk-GU46PPT3.js → chunk-QXGACPS2.js} +5 -5
  107. package/dist/{chunk-FMDSF3OV.js → chunk-QZAW5SFH.js} +2 -2
  108. package/dist/{chunk-YGJZWZTY.js → chunk-R5NH5BZG.js} +12 -9
  109. package/dist/{chunk-U5SI5NIM.js → chunk-RJ5LBZ5U.js} +43 -26
  110. package/dist/{chunk-XHVV4NVW.js → chunk-RT7ACF77.js} +12 -2
  111. package/dist/{chunk-XEQXCIBC.js → chunk-RW5PEJ7D.js} +18 -6
  112. package/dist/{chunk-4VWJ4LW2.js → chunk-SG4PRYO3.js} +61 -49
  113. package/dist/{chunk-RBHWPDBB.js → chunk-SGPFVDUL.js} +18 -7
  114. package/dist/{chunk-KJGG2JKQ.js → chunk-SQCBSFT5.js} +84 -79
  115. package/dist/{chunk-5X6YQA2J.js → chunk-U7NKYLX2.js} +18 -16
  116. package/dist/chunk-U7VO6JAA.js +566 -0
  117. package/dist/{chunk-32XPAAET.js → chunk-UFQJMOVZ.js} +10 -10
  118. package/dist/{chunk-Z72XRXD4.js → chunk-UJRTPOHH.js} +3 -3
  119. package/dist/{chunk-EDA6C7MV.js → chunk-UK6DKJLD.js} +34 -14
  120. package/dist/{chunk-GROLTAWZ.js → chunk-UKP5HWB5.js} +149 -89
  121. package/dist/{chunk-DY7XLRHK.js → chunk-UQRIKAMH.js} +28 -27
  122. package/dist/{chunk-TYS6CSS5.js → chunk-UU6LUYUH.js} +2 -2
  123. package/dist/{chunk-NI3XQBPB.js → chunk-UVDCHR4E.js} +18 -6
  124. package/dist/{chunk-6K2M4VSR.js → chunk-VAO6ANGC.js} +23 -10
  125. package/dist/{chunk-6NYWYNBI.js → chunk-VGNIDAPQ.js} +4 -4
  126. package/dist/{chunk-VL2O2F3W.js → chunk-VHO3YBTB.js} +2 -2
  127. package/dist/{chunk-IUO34HKW.js → chunk-VIRANCNY.js} +36 -32
  128. package/dist/{chunk-4QZ43D7I.js → chunk-VJHBSPGF.js} +12 -14
  129. package/dist/{chunk-BGP54HVR.js → chunk-VKNCC2GX.js} +12 -8
  130. package/dist/{chunk-FC5I2KXV.js → chunk-VRRDUYOK.js} +7 -7
  131. package/dist/{chunk-G3PF3S7P.js → chunk-W2DINCHL.js} +15 -15
  132. package/dist/{chunk-OU7HLO7I.js → chunk-W5KMNC5U.js} +8 -8
  133. package/dist/{chunk-FFUN5D66.js → chunk-WF64MW5G.js} +2 -2
  134. package/dist/{chunk-X7EC3L2H.js → chunk-X3RXGSCZ.js} +48 -30
  135. package/dist/{chunk-KFNWFNAA.js → chunk-XEAQDIMF.js} +7 -6
  136. package/dist/{chunk-AXW3M6OQ.js → chunk-XG4NWFPY.js} +38 -27
  137. package/dist/{chunk-B63YB7X3.js → chunk-XQ4KN6JQ.js} +127 -65
  138. package/dist/{chunk-WBRZJOEC.js → chunk-XY3UDKKH.js} +4 -4
  139. package/dist/{chunk-IE477RQZ.js → chunk-YG2BEIQU.js} +14 -13
  140. package/dist/{chunk-LV4BETUU.js → chunk-YJVA3QUU.js} +55 -5
  141. package/dist/{chunk-5SVOCD5W.js → chunk-YR43LJT5.js} +20 -16
  142. package/dist/{chunk-TLVIHFRO.js → chunk-ZKPPI6BF.js} +2 -2
  143. package/dist/{chunk-WQLMU7VG.js → chunk-ZXUAPTCK.js} +3 -3
  144. package/dist/cli.cjs +158 -155
  145. package/dist/clock.js +25 -23
  146. package/dist/countdown.js +4 -3
  147. package/dist/dgmo-router-B4S23EBH.js +86 -0
  148. package/dist/dimensions-K6PGYYGT.js +22 -0
  149. package/dist/editor.js +36 -6
  150. package/dist/element.js +143 -131
  151. package/dist/element.mjs +2062 -937
  152. package/dist/flowchart-parser-LALR6J6F.js +21 -0
  153. package/dist/{flowchart-renderer-AQSMEMYF.js → flowchart-renderer-DXYB5YRF.js} +14 -14
  154. package/dist/highlight.d.ts +21 -1
  155. package/dist/highlight.js +129 -8
  156. package/dist/index.d.ts +4 -2
  157. package/dist/index.js +80 -75
  158. package/dist/layout-3BVDMKXI.js +15 -0
  159. package/dist/layout-3M5UYJHY.js +14 -0
  160. package/dist/{layout-JDJAEQ3P.js → layout-3V2A4MUE.js} +8 -8
  161. package/dist/layout-4IHCMWZN.js +19 -0
  162. package/dist/layout-5XGYNYVT.js +9 -0
  163. package/dist/layout-AZUPXWSK.js +15 -0
  164. package/dist/{layout-F4WO357A.js → layout-CAAKQX4W.js} +3 -3
  165. package/dist/layout-CB3XWCOI.js +10 -0
  166. package/dist/{layout-OAC4PEAC.js → layout-E6HR6PXH.js} +7 -7
  167. package/dist/{layout-7QXCNOVS.js → layout-HBWT2G23.js} +3 -3
  168. package/dist/layout-KPQWJNAG.js +14 -0
  169. package/dist/layout-OL2XFJXA.js +17 -0
  170. package/dist/layout-WCAIKGZG.js +19 -0
  171. package/dist/layout-WSMPBQ4Q.js +17 -0
  172. package/dist/layout-ZE5DRJWX.js +20 -0
  173. package/dist/{layout-search-55FU6HD3.js → layout-search-34DPZD43.js} +51 -35
  174. package/dist/legend-constants-P5EQWRQQ.js +49 -0
  175. package/dist/{palettes-PRJ2RI6D.js → palettes-FGTNFARW.js} +4 -4
  176. package/dist/{parser-KKTJ6M3Y.js → parser-275KP7JO.js} +8 -8
  177. package/dist/parser-27Z76SN3.js +22 -0
  178. package/dist/parser-3CODK6RG.js +15 -0
  179. package/dist/{parser-EH5VE7ZN.js → parser-3KIGEEJM.js} +6 -6
  180. package/dist/parser-3VSWEKBF.js +15 -0
  181. package/dist/parser-4E4I3GNT.js +13 -0
  182. package/dist/parser-5FGJSQNS.js +12 -0
  183. package/dist/parser-5HQXCNOS.js +12 -0
  184. package/dist/parser-5QPFOB5F.js +12 -0
  185. package/dist/parser-6B6SSZT7.js +11 -0
  186. package/dist/parser-6PPHAXXH.js +14 -0
  187. package/dist/parser-7JHWEWXM.js +13 -0
  188. package/dist/{parser-5PDYJGWA.js → parser-7JVIDLLR.js} +7 -7
  189. package/dist/parser-CKA3QMAG.js +18 -0
  190. package/dist/parser-CRKLXGW7.js +13 -0
  191. package/dist/parser-EXNBDNGY.js +11 -0
  192. package/dist/parser-FF4BMRSB.js +16 -0
  193. package/dist/parser-FOOFEJQU.js +13 -0
  194. package/dist/parser-G26MTBFS.js +11 -0
  195. package/dist/parser-GKP2MHHL.js +11 -0
  196. package/dist/parser-GN2MM5CC.js +11 -0
  197. package/dist/parser-IKWK2ZU3.js +18 -0
  198. package/dist/parser-IVGHXLZP.js +14 -0
  199. package/dist/parser-NNIL3HXU.js +11 -0
  200. package/dist/parser-RNLTBIJ6.js +19 -0
  201. package/dist/parser-UWRX52PC.js +16 -0
  202. package/dist/parser-VOERD6XR.js +14 -0
  203. package/dist/parser-XNKJCMMA.js +13 -0
  204. package/dist/parser-XVPTRWZ4.js +15 -0
  205. package/dist/parser-YSLNDFLV.js +22 -0
  206. package/dist/parser-ZGNXYFPS.js +15 -0
  207. package/dist/parser-ZQDQTB4X.js +20 -0
  208. package/dist/pert.d.ts +4 -2
  209. package/dist/registry-CaSw0PSH.d.ts +350 -0
  210. package/dist/renderer-2C6DJRYN.js +24 -0
  211. package/dist/renderer-5MPN7CXZ.js +19 -0
  212. package/dist/renderer-6EN5XXJZ.js +27 -0
  213. package/dist/renderer-6WRYVM5R.js +24 -0
  214. package/dist/renderer-7NQSTQMQ.js +16 -0
  215. package/dist/renderer-7ZNVOVFG.js +16 -0
  216. package/dist/{renderer-KQB7UGDS.js → renderer-AK2WO4EI.js} +7 -6
  217. package/dist/renderer-COLQFSFV.js +26 -0
  218. package/dist/renderer-CWEFGEIC.js +36 -0
  219. package/dist/renderer-D3BRNOMV.js +29 -0
  220. package/dist/renderer-HIFQVEJA.js +22 -0
  221. package/dist/renderer-JCZG6AYU.js +28 -0
  222. package/dist/{renderer-6RKQPNJI.js → renderer-JTCX6PCG.js} +13 -13
  223. package/dist/renderer-JWGQSTMR.js +37 -0
  224. package/dist/{renderer-3YPZHMOU.js → renderer-K7XLVPH5.js} +6 -6
  225. package/dist/renderer-KARQF3F3.js +22 -0
  226. package/dist/renderer-LVZAHRP6.js +34 -0
  227. package/dist/{renderer-QXGN5H3A.js → renderer-NE5W7CQP.js} +8 -8
  228. package/dist/renderer-QD2SJF2I.js +34 -0
  229. package/dist/renderer-RLMOTXZ6.js +37 -0
  230. package/dist/renderer-SQ54MDSA.js +26 -0
  231. package/dist/{renderer-UV6MI64M.js → renderer-TYHGXAVT.js} +7 -6
  232. package/dist/renderer-UKXW2QPE.js +23 -0
  233. package/dist/renderer-UPF7NRTI.js +28 -0
  234. package/dist/renderer-VMH6L6CP.js +24 -0
  235. package/dist/{renderer-GHPZMFU2.js → renderer-WCWI4I6A.js} +5 -5
  236. package/dist/renderer-WFSUBKUL.js +25 -0
  237. package/dist/renderer-WNFXYYGL.js +21 -0
  238. package/dist/{renderer-RGIYOTKJ.js → renderer-XTXSOK3L.js} +14 -14
  239. package/dist/renderer-YUKPS27O.js +24 -0
  240. package/dist/renderer-YUXGXGSW.js +27 -0
  241. package/dist/renderer-ZBTEX2JK.js +16 -0
  242. package/dist/renderer-radial-WF6VOUOD.js +21 -0
  243. package/dist/{resolver-EMTGNR3D.js → resolver-WFKZYBJ2.js} +4 -4
  244. package/dist/state-parser-L7DHZIQO.js +19 -0
  245. package/dist/state-renderer-TFEUOP4H.js +38 -0
  246. package/dist/{themes-32xj5ZTW.d.ts → themes-tbBkIVsn.d.ts} +2 -349
  247. package/docs/ai-integration.md +74 -77
  248. package/docs/language-reference.md +329 -290
  249. package/fonts/Inter-Bold.woff2 +0 -0
  250. package/fonts/Inter-Regular.woff2 +0 -0
  251. package/gallery/fixtures/boxes-and-lines-diverging.dgmo +1 -2
  252. package/gallery/fixtures/boxes-and-lines.dgmo +1 -1
  253. package/gallery/fixtures/clock.dgmo +1 -1
  254. package/gallery/fixtures/event-line.dgmo +1 -1
  255. package/gallery/fixtures/gantt-full.dgmo +1 -1
  256. package/gallery/fixtures/gantt-sprints.dgmo +9 -9
  257. package/gallery/fixtures/gantt.dgmo +1 -1
  258. package/gallery/fixtures/legacy-syntax-backcompat.dgmo +16 -0
  259. package/gallery/fixtures/state-tags.dgmo +40 -0
  260. package/gallery/fixtures/swimlane.dgmo +1 -1
  261. package/gallery/fixtures/timeline-intraday.dgmo +1 -1
  262. package/package.json +5 -1
  263. package/dist/analyzer-BJ54GIFB.js +0 -15
  264. package/dist/calculator-LDYQCDDY.js +0 -11
  265. package/dist/charts-d3-7E4B4IMW.js +0 -26
  266. package/dist/dgmo-router-Y2VEX46B.js +0 -86
  267. package/dist/dimensions-F7B5C4BJ.js +0 -22
  268. package/dist/flowchart-parser-MY53QWTZ.js +0 -21
  269. package/dist/layout-46366KBT.js +0 -10
  270. package/dist/layout-46N4JJYK.js +0 -17
  271. package/dist/layout-4DIUOX2T.js +0 -14
  272. package/dist/layout-AM2JWW3X.js +0 -15
  273. package/dist/layout-CBCLPMSG.js +0 -15
  274. package/dist/layout-EE6GE46Y.js +0 -17
  275. package/dist/layout-G23F7LDH.js +0 -9
  276. package/dist/layout-HYZPWAK5.js +0 -18
  277. package/dist/layout-MUPRALE5.js +0 -14
  278. package/dist/layout-YVTNOTN4.js +0 -20
  279. package/dist/layout-ZDOSXL5G.js +0 -19
  280. package/dist/parser-2Q2T4C3B.js +0 -22
  281. package/dist/parser-3A42DZ72.js +0 -11
  282. package/dist/parser-4RFTKAQX.js +0 -15
  283. package/dist/parser-57ILIFZ2.js +0 -20
  284. package/dist/parser-5A2UWU6B.js +0 -11
  285. package/dist/parser-6BJEXUFX.js +0 -13
  286. package/dist/parser-6ZKABF5S.js +0 -22
  287. package/dist/parser-AIMHGJRR.js +0 -19
  288. package/dist/parser-AZJ25OKK.js +0 -13
  289. package/dist/parser-B77S5SZM.js +0 -11
  290. package/dist/parser-BEPSWJAD.js +0 -11
  291. package/dist/parser-BKI42XBQ.js +0 -16
  292. package/dist/parser-C3D7MVXY.js +0 -11
  293. package/dist/parser-CDG7CHV5.js +0 -14
  294. package/dist/parser-CZOJ7XQ6.js +0 -15
  295. package/dist/parser-E2RL6JYF.js +0 -18
  296. package/dist/parser-FQ6GZFMR.js +0 -13
  297. package/dist/parser-GKLZKEIK.js +0 -13
  298. package/dist/parser-H6ABKHZZ.js +0 -12
  299. package/dist/parser-I6GGFKOQ.js +0 -12
  300. package/dist/parser-JA7JQ7NF.js +0 -15
  301. package/dist/parser-OK22AC6Y.js +0 -14
  302. package/dist/parser-OK2ILHRT.js +0 -16
  303. package/dist/parser-OUTPNJWC.js +0 -11
  304. package/dist/parser-PORDUX5E.js +0 -15
  305. package/dist/parser-SRVFR7PM.js +0 -13
  306. package/dist/parser-UKFFZCFJ.js +0 -14
  307. package/dist/parser-UMWPLORP.js +0 -18
  308. package/dist/parser-Z4TZV2CB.js +0 -12
  309. package/dist/renderer-2AUFT3E2.js +0 -24
  310. package/dist/renderer-2HTNBIF2.js +0 -34
  311. package/dist/renderer-3K3IB7D5.js +0 -22
  312. package/dist/renderer-3YNIWF5I.js +0 -16
  313. package/dist/renderer-4WR6WMVF.js +0 -26
  314. package/dist/renderer-66MERVQ2.js +0 -24
  315. package/dist/renderer-ARMJBP6C.js +0 -28
  316. package/dist/renderer-CO2DW7S7.js +0 -37
  317. package/dist/renderer-EDJ2O4S5.js +0 -34
  318. package/dist/renderer-F7U3MFCV.js +0 -22
  319. package/dist/renderer-GD2COXVL.js +0 -16
  320. package/dist/renderer-GQIESYEM.js +0 -25
  321. package/dist/renderer-HCKJDFXD.js +0 -37
  322. package/dist/renderer-HYGHO4SJ.js +0 -28
  323. package/dist/renderer-JC3RDUT7.js +0 -23
  324. package/dist/renderer-NKJ24TEA.js +0 -19
  325. package/dist/renderer-OYO67VZK.js +0 -26
  326. package/dist/renderer-QIWVHWZO.js +0 -15
  327. package/dist/renderer-QRWACQRI.js +0 -21
  328. package/dist/renderer-QXPP4TA2.js +0 -27
  329. package/dist/renderer-RHT4MHFU.js +0 -24
  330. package/dist/renderer-RYR3TJ46.js +0 -36
  331. package/dist/renderer-SRKDNDFB.js +0 -27
  332. package/dist/renderer-TGTUABCI.js +0 -24
  333. package/dist/renderer-TXJFKPOG.js +0 -29
  334. package/dist/renderer-radial-FWABAZHB.js +0 -21
  335. package/dist/state-parser-6T6CNMPX.js +0 -18
  336. package/dist/state-renderer-AWZ3ECAX.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,12 +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
- | `solid-fill` | Render nodes/bars at full intent saturation instead of the canonical 25% tint |
295
- | `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.
296
307
 
297
- 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).
298
309
 
299
310
  ### 1.9 In-Arrow Message Labels
300
311
 
@@ -536,10 +547,10 @@ no full date at all; emits a soft `year 20XX` hint).
536
547
 
537
548
  **Directives** (any date-bearing chart; position-independent):
538
549
 
539
- | Directive | Effect |
540
- | --------- | ------ |
541
- | `year 2026` | base year for bare month-days |
542
- | `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`) |
543
554
  | `no-current-year` | a fully-bare chart errors instead of assuming this year |
544
555
 
545
556
  **TIPS (AI authoring):**
@@ -547,7 +558,7 @@ no full date at all; emits a soft `year 20XX` hint).
547
558
  - Prefer `Jul 4` or `07-04` + one `year 2026` line over repeating the ISO year
548
559
  on every row — shorter and reproducible.
549
560
  - `7/4` is **Jul 4** (US month-first). For day-first documents add `date-order
550
- dmy` once at the top; then `7/4` is **Apr 7**.
561
+ dmy` once at the top; then `7/4` is **Apr 7**.
551
562
  - Month-name forms (`Jul 4`) are never ambiguous and ignore `date-order` — use
552
563
  them when a mixed audience will read the source.
553
564
  - Existing ISO dates keep working unchanged; this is a superset, not a
@@ -821,15 +832,16 @@ tag Team as t
821
832
  APIServer t: Backend
822
833
  BookDB t: Data
823
834
  ```
835
+
824
836
  - Optional `as <alias>` postfix and same-line metadata.
825
837
  - **No nesting.** A group cannot contain another `[...]` group; only indented components.
826
- - Group properties (indented under the bracket line):
827
- - `instances N` or `instances N-M` — capacity multiplier on children (auto-scaling)
828
- - `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.
829
841
 
830
842
  ### 4.7 Infra Options (Space-Separated, NO Colon)
831
843
 
832
- - `direction-tb` (boolean; default is LR)
844
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
833
845
  - `default-latency-ms N`
834
846
  - `default-rps N` — fallback edge RPS when no `rps` is declared on the edge node
835
847
  - `default-uptime DECIMAL`
@@ -839,7 +851,7 @@ tag Team as t
839
851
  - `animate` / `no-animate`
840
852
  - `active-tag GroupName` / `active-tag none` — pre-select a tag filter on render
841
853
 
842
- The universal options `solid-fill` and `no-title` also apply.
854
+ The universal options `no-title` and the `fill-*` family also apply — but severity/SLO status tints are data and are never restyled by the fill family.
843
855
 
844
856
  ### 4.8 Edge Nodes
845
857
 
@@ -931,13 +943,11 @@ Bracket syntax only.
931
943
 
932
944
  ### 4.6 Options
933
945
 
934
- - `direction-lr` (boolean; default is TB)
935
- - `orientation-vertical` (boolean; default is horizontal)
936
- - `no-color` (boolean; default off — when on, all nodes resolve to the muted neutral fill instead of their default intent color)
937
- - `solid-fill` (boolean; default off — render shapes with their full intent color instead of the canonical 25% tint)
946
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB). The key+value form `direction LR|TB` is accepted legacy.
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)
938
948
  - `no-notes` (boolean; default off — suppress all note boxes, see §4.7)
939
949
 
940
- `no-color` + `solid-fill` precedence: `no-color` wins for nodes with no explicit color (the muted neutral path bypasses `solid-fill`). Nodes with an explicit color survive `no-color` and are then rendered at full saturation if `solid-fill` 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.
941
951
 
942
952
  ### 4.7 Notes (Nodes)
943
953
 
@@ -958,7 +968,7 @@ node; an unknown id is an error, a duplicate note on a node is a warning
958
968
 
959
969
  Notes work on **flowchart**, **state**, **class** (`note <ClassName>`),
960
970
  **er** (`note <Table>`), and **boxes-and-lines** (`note <Box>`). Org and
961
- sitemap are excluded — their indentation *is* the tree structure, which
971
+ sitemap are excluded — their indentation _is_ the tree structure, which
962
972
  collides with the indented-body grammar.
963
973
 
964
974
  ---
@@ -981,10 +991,11 @@ state [Title]
981
991
 
982
992
  ```
983
993
  StateName
984
- StateName color
985
994
  [*] // initial/final pseudostate
986
995
  ```
987
996
 
997
+ States have no color slot — color comes from the tag system (§5.7).
998
+
988
999
  ### 5.3 Transitions
989
1000
 
990
1001
  | Type | Syntax |
@@ -1007,23 +1018,45 @@ references, and the `no-notes` opt-out (see §4.7).
1007
1018
 
1008
1019
  ### 5.6 Options
1009
1020
 
1010
- - `direction-tb` (boolean; default is LR)
1011
- - `no-color` (boolean; default off — when on, all states resolve to the muted neutral fill instead of their default intent color)
1012
-
1013
- **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):
1014
-
1015
- ```
1016
- tag Phase as p
1017
- Active blue
1018
- Done green
1019
- Pending p: Active
1020
- Shipped p: Done
1021
- Pending -ship-> Shipped
1022
- ```
1023
- - `solid-fill` (boolean; default off — render states with their full intent color instead of the canonical 25% tint; collapsed groups are also rendered at full saturation)
1021
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
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`)
1024
1023
  - `no-notes` (boolean; default off — suppress all note boxes, see §4.7)
1025
-
1026
- `no-color` + `solid-fill` precedence: `no-color` wins for states with no explicit color (the muted neutral path bypasses `solid-fill`). Group colors survive `no-color` and are then rendered at full saturation if `solid-fill` 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.
1027
1060
 
1028
1061
  ---
1029
1062
 
@@ -1090,7 +1123,7 @@ This is key-value metadata assignment, consistent with same-line metadata syntax
1090
1123
 
1091
1124
  ### 6.5 Options
1092
1125
 
1093
- - `direction-tb` (boolean; default is LR)
1126
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB)
1094
1127
  - `sub-node-label Text`
1095
1128
  - `show-sub-node-count`
1096
1129
  - `hide`
@@ -1192,7 +1225,7 @@ Database is a container description: PostgreSQL with read replicas
1192
1225
 
1193
1226
  ### 7.8 Options
1194
1227
 
1195
- - `direction-tb` (boolean; default is LR)
1228
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is TB)
1196
1229
 
1197
1230
  ---
1198
1231
 
@@ -1459,7 +1492,7 @@ Blog
1459
1492
 
1460
1493
  ### 11.6 Options
1461
1494
 
1462
- - `direction-tb` (boolean; default is LR)
1495
+ - `direction-lr` / `direction-tb` (booleans, last one wins; default is LR)
1463
1496
 
1464
1497
  ---
1465
1498
 
@@ -1480,7 +1513,7 @@ gantt [Title]
1480
1513
  ### 12.2 Options (Space-Separated, NO Colon)
1481
1514
 
1482
1515
  ```
1483
- start 2026-03-15
1516
+ start-date 2026-03-15
1484
1517
  today-marker
1485
1518
  today-marker 2026-03-27
1486
1519
  critical-path
@@ -1568,7 +1601,7 @@ Design Review start: 2026-04-01
1568
1601
  ```
1569
1602
 
1570
1603
  A task line MUST have `duration:` or `start:` (or both) in its metadata.
1571
- 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)
1572
1605
  Uncertain: `duration: 10bd?` (trailing `?` on the value)
1573
1606
  Progress: `progress: 80` in metadata (integer 0–100)
1574
1607
 
@@ -1636,24 +1669,24 @@ divvy shares 1 2 3
1636
1669
 
1637
1670
  ### Directives
1638
1671
 
1639
- | Directive | Effect |
1640
- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1641
- | `time-unit <unit>` | Unit for bare-number durations (default `d`); accepts `min`, `h`, `d`, `bd`, `w`, `s` (sprints) |
1642
- | `default-confidence <level>` | M-only heuristic: `high`, `medium`, `low`, or a custom `O/P` factor pair (e.g. `0.6/2.5`) |
1643
- | `direction <LR\|TB>` | Layout direction (default `LR`) |
1644
- | `node-detail <compact\|full>` | Visual density; `full` adds slack bars and σ-as-border-thickness |
1645
- | `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 |
1646
- | `trials <N>` | Canonical Monte Carlo trial count (`< 100` clamps to analytical) |
1647
- | `seed <N>` | Mulberry32 PRNG seed for deterministic runs |
1648
- | `scrubber-trials <N>` | Fast-MC trials for the interactive duration scrubber |
1649
- | `start-date <YYYY-MM-DD>` | Anchor the forward pass — accepts the literal `now` |
1650
- | `end-date <YYYY-MM-DD>` | Anchor the backward pass (mutually exclusive with `start-date`) |
1651
- | `sprint-length <duration>` | Sprint length when sprint mode is active (default `2w`) |
1652
- | `sprint-number <N>` | Starting sprint label N — cells render as `S<N+offset>` (default `1`) |
1653
- | `sprint-start <YYYY-MM-DD>` | Optional ISO date the starting sprint begins on |
1654
- | `active-tag <GroupName>` | Pre-expand a tag group + drive node fill |
1655
-
1656
- 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.
1657
1690
 
1658
1691
  ### Activities
1659
1692
 
@@ -1720,14 +1753,14 @@ Bracketed `[group-name]` blocks cluster activities. Whether a group renders as a
1720
1753
  sail to atoll 3 5 8
1721
1754
  ```
1722
1755
 
1723
- 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`).
1724
1757
 
1725
1758
  ### Same-line metadata
1726
1759
 
1727
1760
  | Key | Where | Meaning |
1728
1761
  | ------------------------------- | --------------- | --------------------------------------------------------------------------------- |
1729
1762
  | `confidence` | activity | Per-activity override of `default-confidence` (`high` / `medium` / `low` / `O/P`) |
1730
- | `collapsed` | group | `true` to start the group collapsed |
1763
+ | `collapsed` | group | bare trailing flag (§1.8) — start the group collapsed (legacy: `collapsed: true`) |
1731
1764
  | tag aliases (e.g. `c: Captain`) | activity, group | Resolves to the declared tag group; drives node fill when the group is active |
1732
1765
 
1733
1766
  ### Tags
@@ -1804,7 +1837,7 @@ Henry Turner + Carina Smyth m: 1751
1804
1837
  - **`generations`** (option): draws a left gutter of Roman-numeral generation labels (`Gen I`, `Gen II`, …) plus subtle zebra shading behind alternating generations.
1805
1838
  - **`highlight <name>`** (directive): dims everyone outside that person's bloodline (ancestors + descendants + spouses stay lit).
1806
1839
  - **Sex → color:** `sex: m` → blue, `sex: f` → purple, unset → gray (25% tint). An explicit `tag`/inline color overrides the sex color.
1807
- - 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.
1808
1841
 
1809
1842
  ---
1810
1843
 
@@ -1816,11 +1849,11 @@ Henry Turner + Carina Smyth m: 1751
1816
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.
1817
1850
  <!-- TIPS end -->
1818
1851
 
1819
- 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.
1820
1853
 
1821
1854
  ```
1822
1855
  swimlane Weekly Publishing
1823
- direction LR
1856
+ direction-lr
1824
1857
 
1825
1858
  lane Writer gray
1826
1859
  Draft Post -> Review
@@ -1844,15 +1877,15 @@ lane Social green
1844
1877
 
1845
1878
  ### Node tokens
1846
1879
 
1847
- | Token | Meaning |
1848
- | ----- | ------- |
1849
- | `Submit Claim` | task |
1850
- | `<Validate>` | exclusive (XOR) gateway |
1851
- | `<+ Fork>` | parallel (AND) gateway |
1852
- | `(Start)` | terminal (neutral) |
1853
- | `(!Rejected)` | error terminal (`!` prefix → red) |
1854
- | `(Paid) success` | success terminal (trailing word → green); also `terminate` |
1855
- | `[[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) |
1856
1889
 
1857
1890
  ### Flow & color
1858
1891
 
@@ -1960,9 +1993,9 @@ Indented shorthand also supports groups (place arrow directly after group header
1960
1993
 
1961
1994
  ### 13.6 Directives
1962
1995
 
1963
- - `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)
1964
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)
1965
- - `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)
1966
1999
 
1967
2000
  ### 13.7 Options
1968
2001
 
@@ -1979,7 +2012,6 @@ choropleth-style "heat dimension" alongside the categorical tag groups.
1979
2012
  ```
1980
2013
  boxes-and-lines Fleet Crews
1981
2014
  heat Crew blue
1982
- show-values
1983
2015
 
1984
2016
  Flagship heat: 120
1985
2017
  Frigate heat: 40
@@ -1993,7 +2025,7 @@ Flagship -> Sloop
1993
2025
  - `heat <Label> [low] [high]` names the dimension and optionally sets the
1994
2026
  ramp endpoint colors: no color → primary hue / neutral low; one color → that
1995
2027
  high hue / neutral low; two → explicit `low high` (e.g. `heat Risk green
1996
- 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
1997
2029
  pair routes through a neutral midpoint (so green→red mid values stay clean);
1998
2030
  analogous pairs blend directly.
1999
2031
  - The ramp anchors at `0` for all-non-negative data, else at the data minimum.
@@ -2004,7 +2036,7 @@ Flagship -> Sloop
2004
2036
  between a tag group and the heat label, the tag group wins.
2005
2037
  - When the heat ramp is active, every box tints along the min→max ramp and the
2006
2038
  legend shows a gradient capsule; boxes without a `heat:` get a neutral fill.
2007
- - `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`.
2008
2040
 
2009
2041
  ### 13.9 Tag groups (categorical color)
2010
2042
 
@@ -2241,7 +2273,6 @@ Q1 400 700 300 500
2241
2273
  **Options (space-separated, NO colon):**
2242
2274
 
2243
2275
  ```
2244
- title My Chart
2245
2276
  x-label X Label
2246
2277
  y-label Y Label
2247
2278
  orientation-horizontal // bar: horizontal bars
@@ -2260,7 +2291,11 @@ no-auto-y // line: anchor the y-axis at 0 (opt out of auto-fit)
2260
2291
  padded window around the data (min→max across all series, not a forced 0
2261
2292
  baseline), so a tight high-valued series fills the plot. `no-auto-y` restores
2262
2293
  the 0 baseline. Bars always anchor at 0 and ignore the flag.
2263
- - 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.
2264
2299
 
2265
2300
  **Value-display flags — show-everything default.** Every renderable part is on by default. Suppress with `no-*`:
2266
2301
 
@@ -2555,12 +2590,12 @@ Group a run of events into a labeled section with a `[Name]` bracket, then **ind
2555
2590
  Tim Berners-Lee publishes the first site.
2556
2591
  1993 Mosaic t: Browser
2557
2592
 
2558
- [The App Era] collapsed: true
2593
+ [The App Era] collapsed
2559
2594
  2005 Ajax t: Platform
2560
2595
  ```
2561
2596
 
2562
- - **Trailing metadata** after `]` — optional `collapsed: true` and/or a named color (`[The 1960s] collapsed: true blue`).
2563
- - **`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.
2564
2599
 
2565
2600
  #### Directives
2566
2601
 
@@ -2670,7 +2705,7 @@ main
2670
2705
 
2671
2706
  #### Directives
2672
2707
 
2673
- - `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.
2674
2709
  - `no-labels` (hide messages), `no-lanes` (hide branch lanes), `no-head`.
2675
2710
 
2676
2711
  ### 16.5 Venn Diagrams
@@ -2749,7 +2784,7 @@ Development p: High
2749
2784
  Auth System
2750
2785
  description: Login, signup, OAuth
2751
2786
  Dashboard
2752
- Nice-to-haves p: Low, collapsed: true
2787
+ Nice-to-haves p: Low collapsed
2753
2788
  Dark Mode
2754
2789
  ```
2755
2790
 
@@ -2808,16 +2843,16 @@ Auth System
2808
2843
 
2809
2844
  Same-line metadata uses the universal `key: value, key2: value2` form (§1.4). Recognized keys:
2810
2845
 
2811
- | Key | Effect |
2812
- | --------------------------- | ---------------------------------------- |
2813
- | `description` | Description text (see above). |
2814
- | `collapsed` | `true` collapses the subtree by default. |
2815
- | 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. |
2816
2851
 
2817
2852
  ```
2818
2853
  Task p: High, d: Engineering
2819
2854
  Demo Video description: 2-min product walkthrough
2820
- Nice-to-haves p: Low, collapsed: true
2855
+ Nice-to-haves p: Low collapsed
2821
2856
  ```
2822
2857
 
2823
2858
  ### Node color
@@ -2838,19 +2873,19 @@ Polish UX p: Medium
2838
2873
 
2839
2874
  ### Collapse
2840
2875
 
2841
- 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.
2842
2877
 
2843
2878
  ```
2844
- Nice-to-haves p: Low, collapsed: true
2879
+ Nice-to-haves p: Low collapsed
2845
2880
  Dark Mode
2846
2881
  Export PDF
2847
2882
  ```
2848
2883
 
2849
2884
  ### Options
2850
2885
 
2851
- | Option | Effect |
2852
- | ---------------------- | ---------------------------------- |
2853
- | `active-tag GroupName` | Sets the default active tag group. |
2886
+ | Option | Effect |
2887
+ | ---------------------- | -------------------------------------------------------------------- |
2888
+ | `active-tag GroupName` | Sets the default active tag group. |
2854
2889
  | `color-by-depth` | Bare flag; colour nodes by depth instead of by tag (off by default). |
2855
2890
 
2856
2891
  Universal options (`palette`, `theme`) apply as elsewhere.
@@ -3065,6 +3100,10 @@ Further-indented lines below a blip. Supports inline markdown (bold, italic, cod
3065
3100
 
3066
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.
3067
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
+
3068
3107
  ---
3069
3108
 
3070
3109
  ## 21. Cycle Diagrams
@@ -3426,7 +3465,7 @@ LayerLabel green
3426
3465
  ```
3427
3466
  ring Captain's Sphere of Influence
3428
3467
 
3429
- solid-fill
3468
+ fill-solid
3430
3469
 
3431
3470
  Captain purple
3432
3471
  Final word on heading and plunder,
@@ -3457,9 +3496,9 @@ Indented lines under a layer are description text. Markdown inline formatting is
3457
3496
 
3458
3497
  ### Directives
3459
3498
 
3460
- | Directive | Effect |
3461
- | ------------ | -------------------------------------------------------------------- |
3462
- | `solid-fill` | Render rings with full intent color instead of the default 25% tint. |
3499
+ | Directive | Effect |
3500
+ | ----------------------------- | ---------------------------------------------------------------------------------------------------- |
3501
+ | `fill-solid` / `fill-outline` | Render rings with full intent color, or outline-only, instead of the default 25% tint (fill family). |
3463
3502
 
3464
3503
  `inverted` is **not** valid on ring diagrams (rings are rotationally symmetric). Using it emits an error-severity diagnostic and the line is discarded.
3465
3504
 
@@ -3524,13 +3563,13 @@ Operations t: Ops
3524
3563
 
3525
3564
  ### Color modes
3526
3565
 
3527
- 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:
3528
3567
 
3529
- | Mode | When it's the default | Coloring |
3530
- | ---------- | --------------------------- | ------------------------------------------------------------ |
3531
- | **tag** | a `tag` group is declared | categorical color per tag value (legend hover-dims) |
3532
- | **heat** | any `heat:` value / `heat` directive | value ramp over a second per-node `heat:` metric |
3533
- | **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 |
3534
3573
 
3535
3574
  ### Tags
3536
3575
 
@@ -3542,29 +3581,29 @@ Add a per-node `heat:` number (a second metric, distinct from size; negatives/fl
3542
3581
 
3543
3582
  ### Node Metadata
3544
3583
 
3545
- | Key | Type | Default | Description |
3546
- | ------- | --------------- | ------- | -------------------------------------------- |
3547
- | `heat` | number | — | Color-by-value metric (signed / float ok) |
3548
- | `<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 |
3549
3588
 
3550
3589
  ### Directives
3551
3590
 
3552
- | Directive | Effect |
3553
- | --------------- | --------------------------------------------------------------------------------------- |
3554
- | `heat <Label>` | Name (and optionally color) the value ramp; pairs with the `heat:` key. |
3555
- | `depth N` | Render N levels; deeper subtrees collapse to a drillable solid block (a render budget). |
3556
- | `other-below N` | Roll children under N% of their parent into a single hatched **Other** bucket (opt-in). |
3557
- | `no-values` | Hide value labels. |
3558
- | `no-percent` | Hide percentage labels. |
3559
- | `no-headers` | Hide parent header bars (a no-op in `radial` mode). |
3560
- | `no-legend` | Hide the legend. |
3561
- | `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. |
3562
3601
 
3563
3602
  Numbers auto-compact (1.2M, 940k). Units live in the title — there is no format/currency directive.
3564
3603
 
3565
3604
  ### Radial mode (sunburst / hierarchical pie)
3566
3605
 
3567
- 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.
3568
3607
 
3569
3608
  ```dgmo
3570
3609
  treemap Plunder Spend ($k)
@@ -3654,18 +3693,18 @@ For an **uneven** span (a block covering some but not all columns), use the same
3654
3693
 
3655
3694
  ### Node Metadata
3656
3695
 
3657
- | Key | Type | Default | Description |
3658
- | --------- | -------------- | ------- | --------------------------------------------- |
3659
- | `span` | integer ≥ 1 | 1 | Column span (clamps to the column count) |
3660
- | `collapsed` | flag | — | Start this container folded (collapse-bar) |
3661
- | `<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 |
3662
3701
 
3663
3702
  ### Directives
3664
3703
 
3665
- | Directive | Effect |
3666
- | ------------ | ----------------------------------------------------------------- |
3667
- | `columns N` | Override the inferred column count for a grid. |
3668
- | `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. |
3669
3708
 
3670
3709
  ### Interactivity vs export
3671
3710
 
@@ -3731,18 +3770,18 @@ Indented under the source shape, targeting an alias (or an unambiguous bare labe
3731
3770
 
3732
3771
  ### Node Metadata
3733
3772
 
3734
- | Key | Type | Default | Description |
3735
- | --------- | -------------- | --------- | ----------------------------------------------- |
3736
- | `shape` | closed set | rectangle | `database` / `queue` / `cloud` / `person` / `document` / `note` |
3737
- | `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
3738
- | `collapsed` | flag | — | Box only — start folded (collapse-bar) |
3739
- | `<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) |
3740
3779
 
3741
3780
  ### Directives
3742
3781
 
3743
- | Directive | Effect |
3744
- | ------------ | ----------------------- |
3745
- | `no-legend` | Hide the tag legend. |
3782
+ | Directive | Effect |
3783
+ | ----------- | -------------------- |
3784
+ | `no-legend` | Hide the tag legend. |
3746
3785
 
3747
3786
  ### Interactivity vs export
3748
3787
 
@@ -3755,7 +3794,7 @@ In the desktop and web app a sketch opens in the **canvas editor** (the code pan
3755
3794
  <!-- TYPE:goal -->
3756
3795
 
3757
3796
  <!-- TIPS start -->
3758
- **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. `solid-fill` 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.
3759
3798
  <!-- TIPS end -->
3760
3799
 
3761
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.
@@ -3783,18 +3822,18 @@ target 10000
3783
3822
 
3784
3823
  ### Directives
3785
3824
 
3786
- | Directive | Effect |
3787
- | ---------------------- | ------------------------------------------------------------- |
3788
- | `thermometer` / `gauge`| Select the render face (bare flag; omit for the progress bar). |
3789
- | `now <number>` | Current value (required; may exceed the target). |
3790
- | `target <number>` | Goal value (required; must be > 0). |
3791
- | `no-percent` | Hide the `%` label. |
3792
- | `no-value` | Hide the raw `now / target` label. |
3793
- | `solid-fill` | Full-saturation fill instead of the default 25% tint. |
3794
- | `no-title` | Hide the banner title. |
3795
- | `no-note` | Suppress the `note` block even if one is authored. |
3796
- | `no-auto-color` | Disable the traffic-light bands; use the flat palette color. |
3797
- | `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). |
3798
3837
 
3799
3838
  ### Note block
3800
3839
 
@@ -3811,11 +3850,11 @@ note
3811
3850
  - Columbus — *almost there!*
3812
3851
  ```
3813
3852
 
3814
- 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.
3815
3854
 
3816
3855
  ### Values & color
3817
3856
 
3818
- Values accept `_` separators (`10_000`) but not thousands commas; the unit lives in the title. Color precedence: (1) an explicit trailing color token on the title line (`goal Marathon Fund ($) green`, §1.5) always wins; (2) otherwise the **auto traffic-light** band by completion — `< 50%` red, `50–80%` orange, `≥ 80%` green (over-target stays green), which needs a `target`; (3) `no-auto-color` disables the bands and falls back to the palette series color. The fill is a 25% tint of the resolved color; `solid-fill` opts into full saturation.
3857
+ Values accept `_` separators (`10_000`) but not thousands commas; the unit lives in the title. Color precedence: (1) an explicit trailing color token on the title line (`goal Marathon Fund ($) green`, §1.5) always wins; (2) otherwise the **auto traffic-light** band by completion — `< 50%` red, `50–80%` orange, `≥ 80%` green (over-target stays green), which needs a `target`; (3) `no-auto-color` disables the bands and falls back to the palette series color. The fill is a 25% tint of the resolved color; `fill-solid` opts into full saturation; `fill-outline` hollows the meter (color on the rim, advancement reads from the outlined extent).
3819
3858
 
3820
3859
  ### Semantics
3821
3860
 
@@ -3828,10 +3867,10 @@ Percent is `now / target`. Over-target clamps the fill at 100% while the `%` lab
3828
3867
  <!-- TYPE:countdown -->
3829
3868
 
3830
3869
  <!-- TIPS start -->
3831
- **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.
3832
3871
  <!-- TIPS end -->
3833
3872
 
3834
- 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`.
3835
3874
 
3836
3875
  ### Declaration
3837
3876
 
@@ -3853,12 +3892,12 @@ target 2026-08-21
3853
3892
 
3854
3893
  ### Directives
3855
3894
 
3856
- | Directive | Effect |
3857
- | ----------------------- | ---------------------------------------------------------------------- |
3858
- | `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). |
3859
- | `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. |
3860
- | `units <days\|full>` | `days` (default) shows whole days (ceil); `full` ticks `Nd HH:MM:SS` on live surfaces. |
3861
- | `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!"`. |
3862
3901
 
3863
3902
  ### Values & color
3864
3903
 
@@ -3866,7 +3905,7 @@ A bare `YYYY-MM-DD` counts to **midnight** and a datetime with no offset to that
3866
3905
 
3867
3906
  ### Semantics
3868
3907
 
3869
- 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.
3870
3909
 
3871
3910
  ---
3872
3911
 
@@ -3875,10 +3914,10 @@ Days mode uses `ceil` — a target later *today* reads "1 day", not "0". Full mo
3875
3914
  <!-- TYPE:clock -->
3876
3915
 
3877
3916
  <!-- TIPS start -->
3878
- **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.
3879
3918
  <!-- TIPS end -->
3880
3919
 
3881
- 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.
3882
3921
 
3883
3922
  ### Declaration
3884
3923
 
@@ -3887,11 +3926,11 @@ clock [Title]
3887
3926
 
3888
3927
  analog // analog dials; digital is the default face
3889
3928
  hours <start>-<end> // optional working window (24h, HH:MM or am/pm)
3890
- 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)
3891
3930
  no-sun // hide the sundown/sunrise line (on by default)
3892
3931
  time-24 // 24-hour readout (12h am/pm is the default)
3893
3932
  no-title // suppress the board title
3894
- 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
3895
3934
  color-by <place|work|daylight|time|none> // zone coloring; default place
3896
3935
 
3897
3936
  <anchor> [as <label…>] [color]
@@ -3902,7 +3941,7 @@ color-by <place|work|daylight|time|none> // zone coloring; default place
3902
3941
  ```
3903
3942
  clock Crew standups
3904
3943
  hours 9-17
3905
- days mon-fri
3944
+ workweek mon-fri
3906
3945
 
3907
3946
  London as UK team
3908
3947
  New York as Dani (NY)
@@ -3922,15 +3961,15 @@ UTC as Servers
3922
3961
 
3923
3962
  ### Directives
3924
3963
 
3925
- | Directive | Effect |
3926
- | ---------------------- | ---------------------------------------------------------------------- |
3927
- | `analog` | Analog dials for the WHOLE board. Digital is the default face. |
3928
- | `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. |
3929
- | `days <range\|list>` | Working days: `mon-fri` or `mon,wed,fri`. Default Mon–Fri. No effect without `hours`. |
3930
- | `no-sun` | Hide the sundown/sunrise line (on by default when the zone's city coordinates are known). |
3931
- | `time-24` | 24-hour readout (12-hour am/pm is the default). |
3932
- | `no-title` | Suppress the board title. |
3933
- | `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. |
3934
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. |
3935
3974
 
3936
3975
  ### Entry grammar
@@ -3983,18 +4022,18 @@ Black Pearl beats Salty Dog 6-5
3983
4022
 
3984
4023
  ### Directives
3985
4024
 
3986
- | Directive | Effect |
3987
- | ------------------------------ | ---------------------------------------------------------------------------- |
3988
- | `rounds A, B, C` | Name the columns entry-round → inner (or an indented block with per-round `Name color`); absent → generic `Round N` / `Final`. |
3989
- | `seed N [Name] [k: v]` | Declare a seeded entrant → seeded mode + day-0 skeleton (top seeds get byes); trailing `k: v` tags the team. |
3990
- | `tag Group [as g]` | Tag group (block/kanban idiom) — a competitor's tag value colors its box outline; a legend renders. |
3991
- | `[Side] [color]` | A bracket column (kanban idiom); two sides mirror to a center championship. |
3992
- | `[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. |
3993
- | `[A] vs [B]` | A pending, undecided match (both boxes drawn, no winner emphasis). |
3994
- | `accent <color>` | Winner accent color override (default blue). Tags/sides still win per-box. |
3995
- | `no-round` | Suppress the round/column labels. |
3996
- | `no-legend` | Hide the tag legend (outlines still colored). |
3997
- | `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. |
3998
4037
 
3999
4038
  ### Semantics
4000
4039
 
@@ -4102,7 +4141,7 @@ Markers in cells are always **rendered in canonical alphabet order** (`R A C I`,
4102
4141
  <!-- TYPE:map -->
4103
4142
 
4104
4143
  <!-- TIPS start -->
4105
- **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.
4106
4145
  <!-- TIPS end -->
4107
4146
 
4108
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.
@@ -4183,15 +4222,15 @@ Flag a POI with `clock` and it grows a **live local-time card** above the marker
4183
4222
  ```
4184
4223
  map Team offices
4185
4224
  hours 9-17 # per-pin availability window (open/closed dot)
4186
- days mon-fri
4225
+ workweek mon-fri
4187
4226
  poi San Francisco clock # zone auto-derived from the place
4188
4227
  poi London clock
4189
4228
  poi Bengaluru clock
4190
4229
  poi 1.29 103.85 as SG clock: Asia/Singapore # bare-coord pin names its zone
4191
4230
  ```
4192
4231
 
4193
- - **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).
4194
- - `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**.
4195
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.
4196
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.
4197
4236
 
@@ -4210,12 +4249,12 @@ There is no header `style:` — bow a whole voyage by using `~>` on every leg.
4210
4249
 
4211
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:
4212
4251
 
4213
- | | no label | labeled |
4214
- |---|---|---|
4215
- | directed straight | `A -> B` | `A -ships-> B` |
4216
- | directed arc | `A ~> B` | `A ~trade~> B` |
4217
- | undirected straight | `A -- B` | `A -ferry- B` |
4218
- | 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` |
4219
4258
 
4220
4259
  ```
4221
4260
  A -> B # one-off, directed
@@ -4252,7 +4291,7 @@ cove -> hav l: March # the LINE turns green
4252
4291
  - Title is the declaration line; `caption` (data-source attribution, travels with the exported PNG) is the only chrome directive. There is no `subtitle`.
4253
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.
4254
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.
4255
- - **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).
4256
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.
4257
4296
 
4258
4297
  ### Name resolution
@@ -4266,7 +4305,7 @@ cove -> hav l: March # the LINE turns green
4266
4305
  - **Name + scope** (readable): `Georgia US heat: 5` → the state, `Georgia GE heat: 5` → the country.
4267
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.
4268
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.
4269
- - **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.
4270
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.
4271
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`).
4272
4311
 
@@ -4299,23 +4338,23 @@ The directive set is **13, all colon-free**: six naming intent the renderer can'
4299
4338
 
4300
4339
  ### Colons NOT USED
4301
4340
 
4302
- | Construct | Diagram Type | Example |
4303
- | ---------------------- | ---------------- | ------------------------------------- |
4304
- | Chart type declaration | all | `bar Title` |
4305
- | Tag declarations | all | `tag Name as x` |
4306
- | Boolean options | all | `activations`, `no-activations` |
4307
- | Key-value options | all | `start 2026-03-15`, `active-tag Team` |
4308
- | Series declarations | data charts | `series A B C` |
4309
- | Data rows | bar/line/pie/etc | `Label 100` |
4310
- | ER columns | er | `id int pk` |
4311
- | Sequence messages | sequence | `A -msg-> B` |
4312
- | Groups/containers | all | `[Group Name]` |
4313
- | Section dividers | sequence | `== Phase ==` |
4314
- | Comments | all | `// comment` |
4315
- | Wordcloud data | wordcloud | `swordsmanship 95` |
4316
- | Slope data rows | slope | `Blackbeard 40 4` |
4317
- | Slope period directive | slope | `period 1715 1725` |
4318
- | 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` |
4319
4358
 
4320
4359
  ### The Rule
4321
4360
 
@@ -4330,7 +4369,7 @@ A colon binds a value, and it appears in exactly **four syntactic positions**
4330
4369
 
4331
4370
  **Colons never appear in:**
4332
4371
 
4333
- - 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`)
4334
4373
  - Tag declarations and chart type declarations
4335
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`)
4336
4375
  - Structural syntax (groups, sections, arrows, comments)
@@ -4377,16 +4416,16 @@ API description: Main gateway
4377
4416
 
4378
4417
  Some constructs _look_ universal but are scoped to specific chart types. Don't transplant them across charts.
4379
4418
 
4380
- | Construct | Scope |
4381
- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
4382
- | `collapsed: true` metadata | sequence, infra, mindmap, pert |
4383
- | Same-line / indented metadata on declarations | all chart types except flowchart, state, data charts (§1.4) |
4384
- | Trailing-keyword flag list | wireframe only (§19) |
4385
- | `progress: <N>` key | gantt only (§13) |
4386
- | `score: <N>` + `emotion: <Word>` keys | journey-map only (§22) |
4387
- | `description: <text>` shorthand for layers | pyramid, ring (§23, §24) |
4388
- | `milestone` keyword | **removed** — use `<name> 0` (§13A) |
4389
- | `\|` 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"` |
4390
4429
 
4391
4430
  ### 26.4 Quoted Names + Aliases — Pick One
4392
4431
 
@@ -4415,7 +4454,7 @@ Before considering DGMO output complete, mentally verify:
4415
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.
4416
4455
  4. Wireframe flags are written as space-separated lowercase trailing keywords from the closed enum (§19).
4417
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).
4418
- 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).
4419
4458
  7. Quoted names don't carry `as <alias>` on the same line.
4420
4459
  8. Sequence participants with alias or quoted names use `is a <type>`.
4421
4460
  9. No `milestone` keyword in PERT — use `<name> 0`.