@nurix/etna 0.18.20 → 0.18.22

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 (272) hide show
  1. package/README.md +1 -1
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/CLAUDE.md +3 -3
  4. package/data/harnesses/code/agents/brainstorm.md +1 -1
  5. package/data/harnesses/code/agents/maintenance.md +8 -7
  6. package/data/harnesses/code/harness.json +2 -2
  7. package/data/harnesses/code/rules/database.md +38 -0
  8. package/data/harnesses/code/rules/express.md +28 -0
  9. package/data/harnesses/code/rules/frontend.md +14 -0
  10. package/data/harnesses/code/rules/general.md +2 -40
  11. package/data/harnesses/code/rules/nomenclature.md +1 -8
  12. package/data/harnesses/code/rules/nustack.md +150 -0
  13. package/data/harnesses/code/skills/brainstorm/README.md +4 -4
  14. package/data/harnesses/code/skills/brainstorm/SKILL.md +5 -3
  15. package/data/harnesses/code/skills/brainstorm/exit-artifacts.md +15 -11
  16. package/data/harnesses/code/skills/brainstorm/templates/source-of-truth.md +5 -5
  17. package/data/harnesses/code/skills/design/SKILL.md +14 -11
  18. package/data/harnesses/code/skills/design/data/catalog/rules.csv +4 -4
  19. package/data/harnesses/code/skills/design/data/combinations/Readme.md +29 -0
  20. package/data/harnesses/code/skills/design/data/combinations/charts.csv +33 -0
  21. package/data/harnesses/code/skills/design/data/combinations/fonts-known.json +437 -0
  22. package/data/harnesses/code/skills/design/data/combinations/icons.csv +157 -0
  23. package/data/harnesses/code/skills/design/data/combinations/landing.csv +38 -0
  24. package/data/harnesses/code/skills/design/data/combinations/lucide-names.json +2001 -0
  25. package/data/harnesses/code/skills/design/data/combinations/manifest.json +283 -0
  26. package/data/harnesses/code/skills/design/data/combinations/palettes.csv +49 -0
  27. package/data/harnesses/code/skills/design/data/combinations/product-router.csv +80 -0
  28. package/data/harnesses/code/skills/design/data/combinations/styles.csv +54 -0
  29. package/data/harnesses/code/skills/design/data/combinations/typography.csv +61 -0
  30. package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +27 -238
  31. package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +7 -88
  32. package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +1 -82
  33. package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +4 -85
  34. package/data/harnesses/code/skills/design/data/design-md/library/apple.md +5 -86
  35. package/data/harnesses/code/skills/design/data/design-md/library/binance.md +4 -87
  36. package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +7 -86
  37. package/data/harnesses/code/skills/design/data/design-md/library/cal.md +4 -84
  38. package/data/harnesses/code/skills/design/data/design-md/library/clay.md +5 -86
  39. package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +3 -84
  40. package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +2 -82
  41. package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +10 -91
  42. package/data/harnesses/code/skills/design/data/design-md/library/composio.md +2 -84
  43. package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +3 -85
  44. package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +7 -90
  45. package/data/harnesses/code/skills/design/data/design-md/library/expo.md +0 -80
  46. package/data/harnesses/code/skills/design/data/design-md/library/figma.md +0 -80
  47. package/data/harnesses/code/skills/design/data/design-md/library/framer.md +5 -85
  48. package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +2 -82
  49. package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +5 -86
  50. package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +9 -91
  51. package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +9 -89
  52. package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +0 -115
  53. package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +5 -85
  54. package/data/harnesses/code/skills/design/data/design-md/library/meta.md +7 -88
  55. package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +3 -84
  56. package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +4 -85
  57. package/data/harnesses/code/skills/design/data/design-md/library/miro.md +8 -88
  58. package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +8 -88
  59. package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +4 -85
  60. package/data/harnesses/code/skills/design/data/design-md/library/notion.md +4 -84
  61. package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +7 -88
  62. package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +5 -86
  63. package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +6 -87
  64. package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +9 -91
  65. package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +5 -88
  66. package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +9 -89
  67. package/data/harnesses/code/skills/design/data/design-md/library/resend.md +4 -119
  68. package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +4 -84
  69. package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +0 -82
  70. package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +3 -86
  71. package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +13 -94
  72. package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +2 -82
  73. package/data/harnesses/code/skills/design/data/design-md/library/slack.md +6 -88
  74. package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +13 -94
  75. package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +4 -86
  76. package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +7 -88
  77. package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +6 -88
  78. package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +5 -86
  79. package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +6 -86
  80. package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +12 -93
  81. package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +11 -91
  82. package/data/harnesses/code/skills/design/data/design-md/library/uber.md +8 -88
  83. package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +2 -82
  84. package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +11 -126
  85. package/data/harnesses/code/skills/design/data/design-md/library/warp.md +8 -88
  86. package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +3 -83
  87. package/data/harnesses/code/skills/design/data/design-md/library/wired.md +10 -91
  88. package/data/harnesses/code/skills/design/data/design-md/library/wise.md +7 -90
  89. package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +6 -88
  90. package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +9 -89
  91. package/data/harnesses/code/skills/design/data/design-md/nurix.md +4 -87
  92. package/data/harnesses/code/skills/design/data/design-tokens/SCHEMA.md +580 -0
  93. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.resolver.json +20 -0
  94. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.tokens.json +964 -0
  95. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.resolver.json +20 -0
  96. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.tokens.json +960 -0
  97. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.resolver.json +20 -0
  98. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.tokens.json +965 -0
  99. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.resolver.json +20 -0
  100. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.tokens.json +954 -0
  101. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.resolver.json +20 -0
  102. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.tokens.json +949 -0
  103. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.resolver.json +20 -0
  104. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.tokens.json +962 -0
  105. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.resolver.json +20 -0
  106. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.tokens.json +958 -0
  107. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.resolver.json +20 -0
  108. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.tokens.json +953 -0
  109. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.resolver.json +20 -0
  110. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.tokens.json +960 -0
  111. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.resolver.json +20 -0
  112. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.tokens.json +973 -0
  113. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.resolver.json +20 -0
  114. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.tokens.json +954 -0
  115. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.resolver.json +20 -0
  116. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.tokens.json +963 -0
  117. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.resolver.json +20 -0
  118. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.tokens.json +968 -0
  119. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.resolver.json +20 -0
  120. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.tokens.json +981 -0
  121. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.resolver.json +20 -0
  122. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.tokens.json +962 -0
  123. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.resolver.json +20 -0
  124. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.tokens.json +964 -0
  125. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.resolver.json +20 -0
  126. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.tokens.json +959 -0
  127. package/data/harnesses/code/skills/design/data/design-tokens/goldens.json +251 -0
  128. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.resolver.json +20 -0
  129. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.tokens.json +965 -0
  130. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.resolver.json +20 -0
  131. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.tokens.json +978 -0
  132. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.resolver.json +20 -0
  133. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.tokens.json +982 -0
  134. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.resolver.json +20 -0
  135. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.tokens.json +958 -0
  136. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.resolver.json +23 -0
  137. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.dark.json +589 -0
  138. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.json +964 -0
  139. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.resolver.json +20 -0
  140. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.tokens.json +955 -0
  141. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.resolver.json +20 -0
  142. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.tokens.json +977 -0
  143. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.resolver.json +20 -0
  144. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.tokens.json +950 -0
  145. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.resolver.json +20 -0
  146. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.tokens.json +976 -0
  147. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.resolver.json +20 -0
  148. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.tokens.json +979 -0
  149. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.resolver.json +20 -0
  150. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.tokens.json +955 -0
  151. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.resolver.json +20 -0
  152. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.tokens.json +958 -0
  153. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.resolver.json +20 -0
  154. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.tokens.json +953 -0
  155. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.resolver.json +20 -0
  156. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.tokens.json +904 -0
  157. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.resolver.json +20 -0
  158. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.tokens.json +957 -0
  159. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.resolver.json +20 -0
  160. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.tokens.json +945 -0
  161. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.resolver.json +20 -0
  162. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.tokens.json +960 -0
  163. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.resolver.json +20 -0
  164. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.tokens.json +953 -0
  165. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.resolver.json +20 -0
  166. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.tokens.json +955 -0
  167. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.resolver.json +20 -0
  168. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.tokens.json +958 -0
  169. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.resolver.json +23 -0
  170. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.dark.json +613 -0
  171. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.json +968 -0
  172. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.resolver.json +20 -0
  173. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.tokens.json +956 -0
  174. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.resolver.json +20 -0
  175. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.tokens.json +960 -0
  176. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.resolver.json +20 -0
  177. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.tokens.json +958 -0
  178. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.resolver.json +20 -0
  179. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.tokens.json +980 -0
  180. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.resolver.json +20 -0
  181. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.tokens.json +964 -0
  182. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.resolver.json +20 -0
  183. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.tokens.json +957 -0
  184. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.resolver.json +20 -0
  185. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.tokens.json +979 -0
  186. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.resolver.json +20 -0
  187. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.tokens.json +974 -0
  188. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.resolver.json +20 -0
  189. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.tokens.json +973 -0
  190. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.resolver.json +20 -0
  191. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.tokens.json +979 -0
  192. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.resolver.json +20 -0
  193. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.tokens.json +966 -0
  194. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.resolver.json +20 -0
  195. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.tokens.json +961 -0
  196. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.resolver.json +20 -0
  197. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.tokens.json +977 -0
  198. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.resolver.json +20 -0
  199. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.tokens.json +991 -0
  200. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.resolver.json +20 -0
  201. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.tokens.json +966 -0
  202. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.resolver.json +20 -0
  203. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.tokens.json +988 -0
  204. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.resolver.json +23 -0
  205. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.dark.json +602 -0
  206. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.json +974 -0
  207. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.resolver.json +20 -0
  208. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.tokens.json +979 -0
  209. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.resolver.json +20 -0
  210. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.tokens.json +960 -0
  211. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.resolver.json +20 -0
  212. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.tokens.json +968 -0
  213. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.resolver.json +20 -0
  214. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.tokens.json +965 -0
  215. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.resolver.json +20 -0
  216. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.tokens.json +988 -0
  217. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.resolver.json +20 -0
  218. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.tokens.json +978 -0
  219. package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +1 -1
  220. package/data/harnesses/code/skills/design/references/create.md +14 -9
  221. package/data/harnesses/code/skills/design/references/diagnosis.md +1 -1
  222. package/data/harnesses/code/skills/design/references/hard-rules.md +4 -4
  223. package/data/harnesses/code/skills/design/references/improve.md +11 -9
  224. package/data/harnesses/code/skills/design/references/introspect.md +1 -1
  225. package/data/harnesses/code/skills/design/references/personality.md +337 -413
  226. package/data/harnesses/code/skills/design/scripts/convert-design-md.mjs +1032 -0
  227. package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +596 -296
  228. package/data/harnesses/code/skills/design/scripts/{detector.mjs → lib/checks.mjs} +145 -140
  229. package/data/harnesses/code/skills/design/scripts/lib/golden.mjs +26 -0
  230. package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +105 -37
  231. package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +60 -73
  232. package/data/harnesses/code/skills/design/scripts/render-rung.mjs +1 -1
  233. package/data/harnesses/code/skills/design/scripts/scaffold.mjs +1 -1
  234. package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +205 -37
  235. package/data/harnesses/code/skills/design/scripts/snapshot-goldens.mjs +68 -0
  236. package/data/harnesses/code/skills/design/scripts/validate-combinations.mjs +314 -0
  237. package/data/harnesses/code/skills/documentation/SKILL.md +61 -17
  238. package/data/harnesses/code/skills/documentation/references/examples.md +41 -0
  239. package/data/harnesses/code/skills/documentation/references/style-guide.md +14 -9
  240. package/data/harnesses/code/skills/documentation/references/templates.md +306 -52
  241. package/data/harnesses/etna/CLAUDE.md +3 -3
  242. package/data/harnesses/etna/agents/brainstorm.md +1 -1
  243. package/data/harnesses/etna/agents/maintenance.md +8 -7
  244. package/data/harnesses/etna/harness.json +2 -2
  245. package/data/harnesses/etna/rules/general.md +2 -40
  246. package/data/harnesses/etna/rules/nomenclature.md +1 -8
  247. package/data/harnesses/etna/skills/brainstorm/README.md +4 -4
  248. package/data/harnesses/etna/skills/brainstorm/SKILL.md +5 -3
  249. package/data/harnesses/etna/skills/brainstorm/exit-artifacts.md +15 -11
  250. package/data/harnesses/etna/skills/brainstorm/templates/source-of-truth.md +5 -5
  251. package/data/harnesses/etna/skills/documentation/SKILL.md +61 -17
  252. package/data/harnesses/etna/skills/documentation/references/examples.md +41 -0
  253. package/data/harnesses/etna/skills/documentation/references/style-guide.md +14 -9
  254. package/data/harnesses/etna/skills/documentation/references/templates.md +306 -52
  255. package/data/harnesses/mobile/CLAUDE.md +3 -3
  256. package/data/harnesses/mobile/agents/brainstorm.md +1 -1
  257. package/data/harnesses/mobile/agents/maintenance.md +8 -7
  258. package/data/harnesses/mobile/harness.json +2 -2
  259. package/data/harnesses/mobile/rules/database.md +38 -0
  260. package/data/harnesses/mobile/rules/general.md +2 -40
  261. package/data/harnesses/mobile/rules/nomenclature.md +1 -8
  262. package/data/harnesses/mobile/rules/nustack.md +150 -0
  263. package/data/harnesses/mobile/skills/brainstorm/README.md +4 -4
  264. package/data/harnesses/mobile/skills/brainstorm/SKILL.md +5 -3
  265. package/data/harnesses/mobile/skills/brainstorm/exit-artifacts.md +15 -11
  266. package/data/harnesses/mobile/skills/brainstorm/templates/source-of-truth.md +5 -5
  267. package/data/harnesses/mobile/skills/documentation/SKILL.md +61 -17
  268. package/data/harnesses/mobile/skills/documentation/references/examples.md +41 -0
  269. package/data/harnesses/mobile/skills/documentation/references/style-guide.md +14 -9
  270. package/data/harnesses/mobile/skills/documentation/references/templates.md +306 -52
  271. package/package.json +1 -1
  272. package/data/harnesses/code/skills/design/scripts/hook-config.json +0 -11
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design
3
- description: Design, build, review, polish, redesign, or introspect internal operator UIs — CRMs, ticket queues, admin panels, analytics dashboards, log viewers, command centers, and any internal/back-office tool an operator, agent, or analyst works in all day. Resolves the project's brand from a design.md, derives structure from the domain objects, emits a working React + Tailwind UI against @nurix/components or shadcn/ui, and holds it to operator-grade quality across a full sixteen-dimension taxonomy. Triggers on "build a dashboard", "design an admin panel", "review this CRM UI", "polish this queue", "redesign this internal tool", "why does this table feel off", "make it feel like Linear", or any create/improve/introspect request for an internal operator interface. Coverage is the operator pack: marketing sites, landing pages, storefronts, homepages, and mobile-native apps are out of scope — no carried pack covers them, so refuse cleanly and redirect. The machinery is not the limit; the packs are.
3
+ description: Design, build, review, polish, redesign, or introspect internal operator UIs — CRMs, ticket queues, admin panels, analytics dashboards, log viewers, command centers, and any internal/back-office tool an operator, agent, or analyst works in all day. Resolves the project's brand from its design-tokens artifact (design.tokens.json), derives structure from the domain objects, emits a working React + Tailwind UI against @nurix/components or shadcn/ui, and holds it to operator-grade quality across a full sixteen-dimension taxonomy. Triggers on "build a dashboard", "design an admin panel", "review this CRM UI", "polish this queue", "redesign this internal tool", "why does this table feel off", "make it feel like Linear", or any create/improve/introspect request for an internal operator interface. Coverage is the operator pack: marketing sites, landing pages, storefronts, homepages, and mobile-native apps are out of scope — no carried pack covers them, so refuse cleanly and redirect. The machinery is not the limit; the packs are.
4
4
  ---
5
5
 
6
6
  # design
@@ -11,8 +11,8 @@ The design skill. Its shipped coverage is the **operator pack**: internal tools
11
11
 
12
12
  **Recognition, by precedence — stop at the first that resolves.**
13
13
 
14
- 1. **Project-declared identity wins.** A resolved `design.md` carrying `product-traits` decides coverage outright.
15
- 2. **The signal checklist recognizes** when no `design.md` speaks: the audience is employees / agents / analysts; the metric is task throughput, not conversion; the surfaces are queues / tables / forms / monitors. The `design.md` library (`data/design-md/library/`) assists the lookup by resemblance — it never overrides the checklist.
14
+ 1. **Project-declared identity wins.** A resolved token artifact whose payload carries `product-traits` decides coverage outright.
15
+ 2. **The signal checklist recognizes** when no project artifact speaks: the audience is employees / agents / analysts; the metric is task throughput, not conversion; the surfaces are queues / tables / forms / monitors. The design.md library (`data/design-md/library/`) assists the lookup by resemblance — it never overrides the checklist.
16
16
  3. **Refuse with a redirect** when no carried pack covers the brief — marketing sites, landing pages, storefronts, mobile-native. State plainly which pack is missing and point elsewhere; never a degraded attempt. The machinery is artifact-agnostic; the boundary is pack coverage, and it moves only by adding a pack.
17
17
 
18
18
  **Then the intent digest — infer and confirm.** Build a structured digest — entities, archetype guesses, density tier, substrate — with **every inference marked as inferred**. Present it once for confirmation before any derivation begins. Ask questions only for strategic unknowns whose answers change the design. Nothing auto-runs on silent inference; nothing stalls on a blanket interview.
@@ -28,24 +28,27 @@ Before **any** design output, read [`references/hard-rules.md`](references/hard-
28
28
  | **introspect** (why is it wrong) | [`references/introspect.md`](references/introspect.md) + [`references/diagnosis.md`](references/diagnosis.md) |
29
29
  | JIT — archetype exemplar | `data/operator-pack/exemplars/<slug>.tsx` at that archetype's emission gate during surfaces — never at boot |
30
30
  | JIT — fixture pair | `data/catalog/fixtures/<id>.{flag,pass}` only when a rule is contested and the contrastive pair teaches it (authoring repo only — pairs are stripped from shipped bundles; when the folder is absent, the finding's exact-fix line carries the teaching) |
31
+ | JIT — combination tables, look | `data/combinations/product-router.csv` at every intake; `typography.csv` / `palettes.csv` / `styles.csv` at intake only when the look resolves to authoring a fresh artifact, typography and palettes again at tokens before any hint resolves — contract: [`data/combinations/Readme.md`](data/combinations/Readme.md) |
32
+ | JIT — combination tables, surface picks | `data/combinations/charts.csv` at the emission gate of any chart-composing surface; `icons.csv` once at the first surface-composition gate — same contract |
33
+
34
+ A consulted combination table is a **floor** — going off-table is allowed only against a stated reason recorded into what the run produces (the token `$description`, an adjacent code comment, the finding body — sites per the contract); an unrecorded off-table pick is a violation, the same class as skipping a gate.
31
35
 
32
36
  ## The three workflows
33
37
 
34
38
  **Create** makes taste where nothing exists. It runs **six gated phases** — intake, structure, scaffold, tokens, fixtures, surfaces — and closes on the verification ladder. Each boundary is `phase-gate.mjs <phase>`; the next phase does not open until the gate is green. The object pass is never skipped — a small brief earns a proportionally small pass, never a guessed archetype; every surface takes an archetype from the closed six <!-- count:archetypes=6 --> (`list-detail`, `dashboard`, `entity-detail`, `create-edit`, `log-stream`, `command-center`). Fixtures are seeded and generated **before** surfaces, because realistic data is taste-bearing design material. See [`create.md`](references/create.md).
35
39
 
36
- **Improve** is one engine over a UI that already exists, run at a point on scope × depth × authority; the verbs — review, polish, redesign, typeset — are parameter bindings, never sibling files. Emission is **jailed to the lever manifest** by default: an edit may emit only values inside the project's `design.md` vocabulary, enforced by `detector.mjs --manifest`. On a foreign UI, **extract a `design.md` first** (`provenance: extracted`) — record what IS, never what should be. Wrong fundamentals are tier-two (`lever-change`) findings: finish the within-levers work, report them, and offer a consent-gated lever run — never change levers unbidden. See [`improve.md`](references/improve.md) + [`diagnosis.md`](references/diagnosis.md).
40
+ **Improve** is one engine over a UI that already exists, run at a point on scope × depth × authority; the verbs — review, polish, redesign, typeset — are parameter bindings, never sibling files. Emission is **jailed to the lever manifest** by default: an edit may emit only values inside the project artifact's vocabulary, enforced by the end-of-run verify sweep (`preship-sweep.mjs --files <touched...> --manifest design.tokens.json`). On a foreign UI, **extract a token artifact first** (payload `provenance: extracted`) — record what IS, never what should be. Wrong fundamentals are tier-two (`lever-change`) findings: finish the within-levers work, report them, and offer a consent-gated lever run — never change levers unbidden. At the fix step, a finding that names a chart or icon loads `data/combinations/charts.csv` / `icons.csv` before the edit. See [`improve.md`](references/improve.md) + [`diagnosis.md`](references/diagnosis.md).
37
41
 
38
- **Introspect** explains **why** a UI isn't working; it reads code and never edits it. **Ask the reader question first**, every run, verbatim — designer / developer / PM — never inferred, never a stored default. Diagnose causes-first (Structure → Behavior → Perception), narrate each finding from the felt symptom down to its cause, render it in the reader's register, and **always file a dated report**. See [`introspect.md`](references/introspect.md) + [`diagnosis.md`](references/diagnosis.md).
42
+ **Introspect** explains **why** a UI isn't working; it reads code and never edits it. **Ask the reader question first**, every run, verbatim — designer / developer / PM — never inferred, never a stored default. Diagnose causes-first (Structure → Behavior → Perception), narrate each finding from the felt symptom down to its cause, render it in the reader's register, and **always file a dated report**. When the audited UI renders charts, diagnosis loads `data/combinations/charts.csv`. See [`introspect.md`](references/introspect.md) + [`diagnosis.md`](references/diagnosis.md).
39
43
 
40
44
  ## Scripts
41
45
 
42
- Under `scripts/`; spawn them from this skill directory. All ESM, Node ≥ 22, zero dependencies.
46
+ Under `scripts/`; spawn them from this skill directory. All ESM, Node ≥ 22, zero dependencies. **You drive them — nothing hooks them to the session or to your edits; you decide when to run each, at the moments below.** Machine rules fire at the structural boundaries — the phase gates, improve's end-of-run verify, and the pre-ship sweep; the gates are the wall, not your discipline. Exit 1 anywhere means violations: resolve every one — fix now, or classify the inapplicability into the decay ledger; never ignore.
43
47
 
44
- - `detector.mjs <file...> [--manifest design.md] [--json]` — per-edit source rules + lever-manifest drift; exit 1 with the fix-or-classify directive (fix now, or classify the inapplicability into the decay ledger — never ignore).
45
- - `phase-gate.mjs <phase> [--project <dir>]` — validates a phase's exit preconditions; exit non-zero printing the exact fix. Phases: `intake`, `structure`, `scaffold`, `tokens`, `fixtures`, `surfaces`.
46
- - `preship-sweep.mjs [--project <dir>]` — whole-app catalog sweep + viewport sweep + copy audit + scope cross-check; prints the manual `proc-*` checklist.
48
+ - `phase-gate.mjs <phase> [--project <dir>]` — validates a phase's exit preconditions **and runs the machine catalog + lever-manifest drift check over the project's UI files**; exit non-zero printing the exact fix. Phases: `intake`, `structure`, `scaffold`, `tokens`, `fixtures`, `surfaces`.
49
+ - `preship-sweep.mjs [--project <dir>] [--files <file...>] [--manifest design.tokens.json]` — whole-app catalog sweep + viewport sweep + copy audit + scope cross-check; prints the manual `proc-*` checklist. With `--files`, a scoped verify run over just those files — improve's end-of-run gate.
47
50
  - `render-rung.mjs [--project <dir>] [--url <dev-server>]` — render-only rules at 375/768/1024/1440 plus the render instruments (evidence, never gates); a one-line notice and exit 0 when no headless browser is importable.
48
- - `derive-personality.mjs <design.md> [--check|--emit <outdir>]` — `--check` is the coverage gate; `--emit` writes `personality.css` + `globals.css`. The gate fails unless all 26 primitives <!-- count:primitives=26 -->, both dials, and every one of the 34 color values (17 semantic <!-- count:semantic-tokens=17 --> + 17 substrate <!-- count:substrate-tokens=17 -->) <!-- count:color-tokens=34 --> is assigned or hinted.
51
+ - `derive-personality.mjs <artifact-dir> [--check|--emit <outdir>] [--theme light|dark]` — `--check` is the coverage gate over the design-tokens artifact; `--emit` writes `personality.css` + `globals.css`. The gate fails unless all 26 primitives <!-- count:primitives=26 -->, both dials, and every one of the 34 color values (17 semantic <!-- count:semantic-tokens=17 --> + 17 substrate <!-- count:substrate-tokens=17 -->) <!-- count:color-tokens=34 --> is assigned or hinted; emit refuses while any token carries a hint.
49
52
  - `scaffold.mjs <structure.md> --out <dir>` — routes, nav, state-shells, and fixture wiring from the entity/surface map.
50
53
  - `generate-fixtures.mjs <structure.md> --seed <n> --out <dir>` — seeded, domain-shaped fixture modules.
51
54
  - `self-integrity.mjs` — run from `skills/design/`: anchor parity (prose ↔ catalog), stated counts, fixture-pair presence and contrastive validity. CI-owned.
@@ -54,7 +57,7 @@ Under `scripts/`; spawn them from this skill directory. All ESM, Node ≥ 22, ze
54
57
 
55
58
  The skill writes these into the consumer project; the emitted code and these files are the only design record — no sidecar caches.
56
59
 
57
- - `design.md` (project root) — the brand document + lever manifest. Create writes it; improve reads and, on a foreign UI, extracts it. Provenance is one of `project | extracted | library | default` (extracted sits at project precedence).
60
+ - `design.tokens.json` + `design.resolver.json` (+ `design.tokens.dark.json` when the look has dark values) at project root — the canonical look artifact + lever manifest ([schema](data/design-tokens/SCHEMA.md)). Create writes it; improve reads and, on a foreign UI, extracts it. Payload provenance is one of `project | extracted | library | default` (extracted sits at project precedence).
58
61
  - `docs/design/structure.md` — the entity/surface map, in a fenced `yaml structure` block; `scaffold.mjs` consumes it.
59
62
  - `docs/design/findings/YYYY-MM-DD-<slug>.md` — dated introspect and review reports.
60
63
  - `docs/memory/design-decay.md` — the decay ledger: rules skipped or fought, the fix-or-classify classifications, guidance that produced wrong output. Append-only, maintainer-read, human-closed. The skill never self-modifies — it observes decay; the maintainer closes it.
@@ -38,7 +38,7 @@ spc-02,P3,"Adjacent spacing values stay at least a quarter apart.",">=25%",machi
38
38
  spc-03,P3,"Click and tap targets clear the minimum target size (WCAG 2.2 SC 2.5.8); touch-primary surfaces go larger.",">=24x24px; >=44px touch; dense-row 28px; >=8px spacing exception",machine,render,render,"Assembled as one SC 2.5.8 (spatial + interaction restatement); dense data-row controls compact to 28px; undersized allowed only via the >=8px target-spacing exception (int-11). Actual geometry measured at render.",WCAG 2.5.8;HIG;volt/binance;wcag22;deep-research,na
39
39
  spc-04,P3,"Numeric table columns right-align, text left-aligns; ban center-aligned data columns.",,machine,edit,source,,new;ben,yes
40
40
  spc-05,P3,"Group spacing exceeds within-group spacing so proximity encodes structure.","within 4-16px; between 24-64px",judged,sweep,none,"Judgment on what reads as a group.",imp;gnu,na
41
- spc-06,P3,"Corners land on a fixed radius scale, one scale per page.","2/4/6/8/12/9999",machine,edit,source,"Per token set.",volt/binance;volt/theverge;taste,yes
41
+ spc-06,P3,"Corners land on a fixed radius scale, one scale per page.","0/2/4/6/8/12/16/24/9999",machine,edit,source,"Per token set; 0 = flat, 9999 = pill; project token artifact may narrow it.",volt/binance;volt/theverge;taste,yes
42
42
  spc-07,P3,"Table rows run tight: vertical cell padding plus hairline dividers, buttons compacted inside dense rows, mono numbers on every figure.","12px vertical padding; 28px button height",machine,edit,source,"Per token set; operator gold.",volt/binance,yes
43
43
  spc-08,P3,"Full-viewport height uses min-h dvh, never h-screen or 100vh.","min-h-[100dvh]",machine,edit,source,,stitch;taste;uupm,yes
44
44
  spc-09,P3,"Ban calc-percentage layout arithmetic; CSS Grid instead.","calc(33% - 1rem)",machine,edit,source,,stitch;taste,yes
@@ -99,7 +99,7 @@ cod-09,S2,"Component line ceilings hold and files outside scope are never modifi
99
99
  cod-10,P6,"No div-built fake product screenshots.",,judged,sweep,none,"The number-one LLM-design tell.",taste,na
100
100
  cod-11,S2,"Every emitted component exports a typed Props interface; no HTML tags in React Native output.",,machine,edit,source,"Proven (stitch validate.js); the HTML-tag ban is framework-scoped.",stitch,yes
101
101
  cod-12,S4,"Runtime perf budgets: LCP, INP, CLS, and frame time.","LCP <2.5s; INP <200ms; CLS <0.1; 16ms frame",machine,render,render,"Runtime metrics measured at the render rung.",taste;uupm,na
102
- cod-13,B5,"Audit output carries a numeric before to after per finding; no vague language, no feels without a measurable change.",,judged,sweep,none,"The D22 finding-schema contract, enforced by self-integrity over findings rather than the UI detector.",ben,na
102
+ cod-13,B5,"Audit output carries a numeric before to after per finding; no vague language, no feels without a measurable change.",,judged,sweep,none,"The D22 finding-schema contract, enforced by self-integrity over findings rather than the UI check engine.",ben,na
103
103
  cod-14,B5,"One name per concept, one concept per name, across UI copy, help text, and API names.",,judged,sweep,none,"Legacy-locked internal names may lag a renamed label; divergence must be deliberate, never accidental.",jam,na
104
104
  inst-01,P5,"Edge density: Canny edge pixels over total pixels, the cheapest instrument, start here.","Canny edges / pixels; r~0.83 with visual-search times",judged,render,render,"Instrument, never a gate: dense is not bad (lower-complexity-is-better refuted 0-3); a number is evidence inside a judged finding, never a verdict.",rosenholtz 2007;deep-research,na
105
105
  inst-02,P5,"Feature congestion of the rendered surface.",,judged,render,render,"Instrument, never a gate: dense is not bad; evidence inside a judged finding, never a verdict.",rosenholtz 2007;deep-research,na
@@ -116,11 +116,11 @@ trust-01,B1,"AI presence is disclosed on the surface.",,judged,sweep,none,"Absen
116
116
  trust-02,B1,"A human override path is visible.",,judged,sweep,none,"Absence grades auto-critical (D34).",D34,na
117
117
  trust-03,B1,"AI-initiated irreversible actions are consent-gated with a preview.",,judged,sweep,none,"Absence grades auto-critical (D34).",D34,na
118
118
  trust-04,B1,"AI actions are auditable.",,judged,sweep,none,"Judged trust dimension (D34).",D34,na
119
- proc-01,S3,"Extract levers before any improve run on a foreign UI.",,procedure,gate,procedure,"Recover the lever manifest from code into a design.md before writing (D10).",D10,na
119
+ proc-01,S3,"Extract levers before any improve run on a foreign UI.",,procedure,gate,procedure,"Recover the lever manifest from code into a design-tokens artifact before writing (D10).",D10,na
120
120
  proc-02,B5,"Ask the reader question before any introspect run.",,procedure,gate,procedure,"One question, every run; never inferred, never a stored default (D14).",D14,na
121
121
  proc-03,P5,"Run the object pass before screens.",,procedure,gate,procedure,"Six-archetype catalog, no brief-size threshold; a small brief earns a proportionally small pass, never a skipped one (D28).",D28,na
122
122
  proc-04,P3,"Declare the density tier per surface archetype before emission.",,procedure,gate,procedure,"Global tier plus per-archetype relative modifiers (D31).",D31,na
123
- proc-05,P7,"Name the taste anchor before look decisions: the selected design.md, project over library over Nurix default.",,procedure,gate,procedure,"Named-reference discipline (D5).",D5;imp,na
123
+ proc-05,P7,"Name the taste anchor before look decisions: the selected look artifact, project over library over Nurix default.",,procedure,gate,procedure,"Named-reference discipline (D5).",D5;imp,na
124
124
  proc-06,S2,"Run the self-critique pass against the brief and the ban list before declaring a create run done.",,procedure,sweep,procedure,"The four-rung verification ladder (D32).",D32,na
125
125
  proc-07,S3,"Resolve the design system and persist it before any UI code.",,procedure,gate,procedure,"Resolver-before-code; the machine complement of the named-taste-anchor step, occupied by personality.css emission.",uupm,na
126
126
  proc-08,S3,"Token-lock at emission: after resolution, no value lands outside the emitted token file.",,procedure,gate,procedure,"The procedural counterpart of cod-03 (stitch validate.js pattern).",stitch,na
@@ -0,0 +1,29 @@
1
+ # Combinations — the consumption contract
2
+
3
+ Seven curated pick tables — typography pairings, palettes, movement styles, product-router priors, chart choices, icon picks, landing patterns — that ground the skill's picks in vetted combinations instead of free association. Rows carry a tier: **operator-active** rows are consumable; **dormant-marketing** rows are ignored by operator work — no operator run reads them; they await a future marketing pack. Presence on disk is not consumption: every dataset declares its consumer steps below, and the routing path loads the table into context mechanically at each declared step — consulting is not skippable, exactly like the boot prose.
4
+
5
+ ## The contract
6
+
7
+ | Dataset | create | improve | introspect |
8
+ | --- | --- | --- | --- |
9
+ | `typography.csv` | intake — only when the look resolves to authoring a fresh artifact (not a library copy / default); tokens — loaded before any typography hint is resolved | — (emission is jailed to the lever manifest) | — |
10
+ | `palettes.csv` | intake — fresh-artifact authoring only; tokens — loaded before any color hint is resolved | — | — |
11
+ | `styles.csv` | intake — fresh-artifact authoring only (movement vocabulary for the look) | — | — |
12
+ | `product-router.csv` | intake — always: the front gate's recognition assist and the digest's density/archetype priors | — | — |
13
+ | `charts.csv` | surfaces — loaded at the emission gate of any surface that composes a chart | fix step — when a finding names a chart | diagnosis — when the audited UI renders charts |
14
+ | `icons.csv` | surfaces — loaded once at the first surface-composition gate (icon picks happen throughout) | fix step — when a finding names an icon | — |
15
+ | `landing.csv` | — dormant; no load point anywhere (activation = a future marketing pack) | — | — |
16
+
17
+ ## The deviation rule
18
+
19
+ A consulted table is a **floor** — going off-table is allowed only against a stated reason recorded into what the run produces:
20
+
21
+ - **look values** (a pairing, a palette) — the token's `$description`;
22
+ - **surface picks** (a chart type, an icon) — a code comment adjacent to the deviating pick;
23
+ - **improve / introspect** — the finding body.
24
+
25
+ An unrecorded off-table pick is a violation, the same class as skipping a gate.
26
+
27
+ ## Provenance
28
+
29
+ Per-dataset provenance lives in [manifest.json](manifest.json); refresh is trigger-based, never calendar-based.
@@ -0,0 +1,33 @@
1
+ id,data_shape,tier,keywords,best_chart,alternatives,when,when_not,volume_guidance,series_tokens,a11y_notes,fallback,interaction
2
+ 1,trend over time,operator-active,"trend, time series, over time, growth, traffic, history, rate",line,"area, sparkline","A continuous time axis where the question is direction or rate of change. Two to five series compare cleanly when each line is labeled at its endpoint.","Fewer than 4 points on the axis (state the number in a stat card) or more than 5 concurrent series, which turns to spaghetti - facet or aggregate instead.","Up to ~300 rendered points per series reads cleanly; past that downsample to display resolution or aggregate to coarser intervals; past ~10k raw points aggregate server-side before charting.","Single series: --chart-1. Comparisons assign --chart-1..--chart-5 in series order; past 5 series aggregate the remainder or facet - never invent a hue beyond --chart-5.","Differentiate concurrent lines by dash pattern and direct end-of-line labels, not hue alone; enable the substrate's accessibilityLayer for keyboard and screen-reader traversal.","Toggleable data table of timestamp/value pairs plus CSV export.","Hover tooltip synced across series; brush to zoom a time window; a preset range picker (1h/24h/7d/30d) beats freeform zoom for operators."
3
+ 2,trend at a glance (inline),operator-active,"sparkline, inline trend, table cell, compact, glance, row-level",sparkline,"sparkline area, mini bar","A trend needs to ride inside a table row, stat card, or list item where the shape matters but axes would be noise. Ideal for scanning many entities at once.","When the reader must read values off the chart - a sparkline has no scale. Not for comparing magnitudes across rows unless every sparkline shares one y-domain.","20-50 points per sparkline; resample anything longer. Dozens per screen are fine since each renders as a single path.","One series per sparkline, always --chart-1 (or the row's established status token from --chart-1..--chart-5); never multi-hue inside a sparkline.","Pair every sparkline with the current value and a signed delta as text; the sparkline is decoration, the text is the record.","Current value plus signed delta as plain text; full-size chart on click.","No hover affordances inline; click or expand opens the full line chart with axes."
4
+ 3,single KPI snapshot,operator-active,"kpi, big number, stat card, metric, headline, snapshot, count",stat card,"stat card with sparkline, stat card with delta","One number answers the question: current error rate, open tickets, requests per second. The most legible chart is no chart - fewer than 4 historical points always lands here.","When the trend or distribution behind the number is the actual question, or when a wall of stat cards (more than ~6 in a row) hides the one that matters.","One value per card, optionally a 20-50 point sparkline behind it; cap a dashboard header at 4-6 cards.","An embedded sparkline uses --chart-1; the number itself is foreground text, not a chart token.","The value is real text at a large size with unit and comparison period spelled out; deltas carry a +/- sign and a direction word, not color alone.","It already is the fallback: text. Add the comparison value ('vs 4.1% last week') inline.","Click drills into the full chart or filtered table behind the metric; no hover state needed."
5
+ 4,KPI vs target,operator-active,"target, threshold, goal, slo, quota, attainment, benchmark",bar with reference line (bullet style),"stat card with target delta, radial progress","A measure has a defined target or limit and the question is distance to it - SLO attainment, quota consumption. A horizontal bar with the target as a reference line stacks well for 3-10 KPIs in a grid.","No real target exists (a decorative gauge invents one), or a single KPI where a stat card with 'x of y' text is simpler.","One measure per bar; grids of 3-10 bullet-style bars compare well; past 10 move to a sortable table with inline bars.","Measure bar: --chart-1; the target marker uses neutral border/foreground tokens, not a second chart hue; a breach state may switch the bar to --chart-5 if that slot is the dashboard's alert hue.","Always print the value and percent-of-target as text beside the bar; the reference marker gets a text label, never position alone.","Table of metric / current / target / attainment percent.","Hover reveals exact values; click filters the dashboard to that KPI's detail view."
6
+ 5,part-to-whole snapshot,operator-active,"share, proportion, percentage, composition, breakdown, split",stacked bar (100%),"donut, bar","Composition of one total at one moment - traffic by source, storage by tenant. A single 100% stacked bar reads precisely and labels every segment. A donut is defensible only with 4 or fewer segments, values near quarter marks, and a center KPI worth the space.","Segments differ by less than ~5 points (readers cannot rank them - use a sorted bar of raw values) or more than 6 segments (aggregate the tail into Other).","3-6 segments; collapse everything past the top 5 into an Other segment; more than 6 shares belongs in a sorted bar or table.","Segments take --chart-1..--chart-5 in descending-size order; the Other bucket reuses the last assigned token at reduced emphasis - the surface never exceeds five hues.","Label each segment directly with name and percent; adjacent segments must also differ by a separator border, not hue alone; donuts additionally repeat all values in a legend list.","List of segment / value / percent rows summing to the labeled total.","Hover isolates a segment and shows value plus percent; click cross-filters the rest of the dashboard to that segment."
7
+ 6,composition over time,operator-active,"stacked area, share over time, composition trend, mix shift, by component",stacked area,"100% stacked area, small-multiple lines","How a total and its parts move together across time - request volume by service, cost by team. Use the 100% variant when the mix, not the total, is the story.","When individual component trends are the question - middle layers of a stack are unreadable for that; switch to small-multiple lines. Also wrong for series that cross zero.","3-5 layers maximum, largest or steadiest layer at the bottom; more components means grouping into Other or faceting.","Layers map --chart-1..--chart-5 bottom-up in stack order; over 5 components aggregate into the existing tokens rather than adding hues.","Direct-label layers at the right edge where each band is widest; order the legend to match stack order - hue plus adjacency is not enough.","Pivot table of period x component with row totals.","Hover shows the full component breakdown at that timestamp; toggle between absolute and 100% modes; legend click isolates a layer."
8
+ 7,category comparison,operator-active,"compare, categories, magnitude, count by type, by service, by queue",bar,"horizontal bar, lollipop-style bar","Discrete categories compared by size with no time axis - errors by service, jobs by queue. Vertical bars suit up to ~8 short labels; go horizontal when labels are long.","A time dimension exists (line) or the point is share of a total (100% stacked bar). Never truncate the value axis - bars encode length from zero.","Up to ~12 vertical or ~20 horizontal bars; beyond that filter to top N with an Other bar, paginate, or drop to a sortable table.","Uniform bars in --chart-1 with one highlighted bar allowed in --chart-2; per-bar rainbow coloring wastes the surface unless bars map to an established category coloring within --chart-1..--chart-5.","Value labels on or beside each bar by default; sorting by value is itself an accessibility feature - it removes the visual estimation step.","The same data as a sorted two-column table with CSV export.","Hover for exact value; toggle sort (value vs alphabetical); click a bar to drill into that category."
9
+ 8,ranking,operator-active,"ranking, top n, leaderboard, worst, slowest, sorted, offenders",horizontal bar (sorted),"lollipop-style bar, slope (rank change)","Order is the insight - top 10 noisiest endpoints, slowest queries. Sort descending and keep ranks visible as row numbers.","When every entity matters equally (that is comparison, not ranking) or the list exceeds ~20 - operators want the head of the distribution, not all of it.","Show top 10-20 and fold the remainder into a labeled 'Other (n)' entry or a view-all table link.","All bars --chart-1; the focal entity under investigation may take --chart-2; do not encode rank position as a hue ramp across --chart-1..--chart-5.","Rank number and value as text on every row; announce the sort direction; direct labels beat a shared axis at this density.","Numbered table with rank, name, value, and change-in-rank columns.","Sort toggle (value / delta); search-to-highlight an entity; click drills into the entity's detail."
10
+ 9,grouped comparison,operator-active,"grouped bar, side by side, versus, before after, a/b, per category pairs",grouped bar,"slope, small-multiple bars","Two or three series compared within each category - this week vs last week per service. The within-category gap must be the question.","More than 3 series per group turns into a picket fence - facet or use small multiples. If the across-category trend matters more than the within-group gap, use lines or a slope chart.","Up to ~8 categories x 2-3 series; beyond that, small multiples (one panel per series) scale further than wider groups.","Series take --chart-1..--chart-3 consistently across every group; keep the same series-to-token mapping on every panel of the dashboard.","A legend is mandatory and must match within-group ordering; add per-bar value labels when groups are few; two series close in luminance need a texture or border difference.","Category x series pivot table with a difference column.","Hover shows all series for that category together; legend click toggles a series; sort by any series."
11
+ 10,distribution (single variable),operator-active,"distribution, histogram, spread, frequency, buckets, shape, skew",histogram (bar),"cumulative curve (line), strip plot (scatter)","The shape of one variable matters - normal, bimodal, or skewed? Pre-bucket the values and render counts as near-touching bars; 15-40 buckets usually reveal the shape.","Under ~30 observations (show the points or a table - shape is noise at that size) or when the comparison is across groups (box plots or overlaid cumulative curves).","Bucket server-side past ~5k raw values; the chart should receive bucket counts, never raw observations.","Single distribution: --chart-1; overlaying a second period or cohort takes --chart-2 at reduced fill opacity; more than 2 overlays means small multiples.","State the summary stats (median, p95, count) as text above the chart; the histogram illustrates, the numbers testify.","Bucket table (range, count, percent) plus the summary-statistics line.","Hover per bucket for range and count; brush to select a range and filter the dashboard to those entities."
12
+ 11,distribution across groups,operator-active,"box plot, compare distributions, spread by group, quartiles, variance by cohort",box plot (bar + error-bar composition),"small-multiple histograms, overlaid cumulative curves","Comparing spread and central tendency across 3-10 groups - latency per region, job duration per queue. Boxes summarize median, quartiles, and outliers in one row per group.","Audience unfamiliar with quartile notation (small-multiple histograms are self-evident) or under ~20 observations per group where quartiles are unstable.","3-10 groups per panel; compute the five-number summary server-side - the chart draws summaries, not raw points.","All boxes in --chart-1 unless groups carry an established categorical mapping across the dashboard; a single comparison baseline group may take --chart-2.","Annotate median values as text per box; explain the box encoding once in a caption; outlier dots need a marker shape distinct from data points elsewhere.","Table of group / min / p25 / median / p75 / p95 / max.","Hover a box for the five-number summary; click a group to open its full histogram."
13
+ 12,correlation,operator-active,"correlation, scatter, relationship, x vs y, drivers, cluster, outliers",scatter,"bubble scatter, binned heatmap","Two continuous variables and the question is whether they move together - payload size vs latency, retries vs errors. Clusters and outliers are the payoff.","Either variable is categorical (grouped bar) or under ~20 points, where a pattern claim is not supportable.","Up to ~2k points at 0.5-0.7 fill opacity; beyond that bin into a density grid server-side rather than drawing every point.","One population: --chart-1. Cohorts split across --chart-1..--chart-5 with distinct marker shapes doubling the hue; more than 5 cohorts must be re-grouped.","Pair hue with marker shape per cohort; annotate named outliers directly; report the relationship's direction in the caption as text.","Sortable table of the plotted pairs with flagged outliers on top.","Hover identifies the entity behind a point; brush selects a cluster to filter the dashboard; zoom for dense regions."
14
+ 13,three-variable magnitude,operator-active,"bubble, size encoding, third variable, impact vs volume, weight",scatter with sized points (bubble),"scatter (drop the third variable), faceted scatter","A scatter relationship where a third magnitude (volume, spend) deserves emphasis - area-scale the points and the big movers surface.","The third variable is the primary question (readers cannot rank areas - use a sorted bar) or point counts past a few hundred where overlap hides the sizes.","Under ~200 bubbles; scale radius by the square root of the value so area, not radius, carries it.","Same rules as scatter: --chart-1 for one population, --chart-1..--chart-5 for cohorts; size is the third encoding, never a sixth hue.","Size differences below ~2x are invisible - print the sized value in the tooltip and label the largest bubbles directly.","Table sorted by the size variable with both axis values as columns.","Hover for all three values; a size legend with 2-3 reference bubbles; click to drill into the entity."
15
+ 14,deviation from reference,operator-active,"deviation, above below, delta, variance from plan, plus minus, baseline",diverging bar,"line against a zero baseline, sign-split area","Values carry sign relative to a reference - capacity delta per node, budget variance per team. Bars growing left/right of a shared zero make the split legible instantly.","The reference itself shifts over time (plot both series as lines instead) or nearly all values share one sign - that is just a bar chart.","Up to ~20 entities; sort by signed value so the extremes bracket the chart.","Positive side --chart-2, negative side --chart-5 (or the dashboard's two most luminance-separated slots among --chart-1..--chart-5), applied identically everywhere sign appears.","Sign must survive grayscale: keep the zero axis prominent and add signed value labels; direction words (over/under) in the tooltip.","Table with signed deltas and a direction column.","Hover for value and percent deviation; toggle absolute vs percent; click through to the entity."
16
+ 15,additive breakdown to a total,operator-active,"waterfall, bridge, contribution, cost walk, increase decrease, net change",waterfall (stacked bar with transparent base),"diverging bar, table with running total","Explaining how signed components sum to a net change - the cost walk from last month to this month. Build it as a stacked bar whose invisible base positions each floating segment.","Components are not additive, or more than ~10 steps - the running-total thread gets lost; aggregate small contributors.","4-10 steps plus start and end anchors; fold minor contributors into one Other step.","Increases --chart-2, decreases --chart-5, start/end anchor totals --chart-1 - three slots of the surface, fixed across all waterfall panels.","Every step carries a signed label; connect steps with faint leader lines so the sequence survives without color; state the net change in the title.","Ordered table of step / signed change / running total.","Hover shows the step's contribution and the running total at that point; click expands an aggregated step."
17
+ 16,cumulative flow of work states,operator-active,"cumulative flow, backlog, wip, queue states, ticket states, pipeline health",stacked area (cumulative flow),"line per state, stacked bar per day","Items moving through states over time - open/in-progress/done tickets, queued/running/completed jobs. Band width is queue depth; a widening band is a growing bottleneck, visible before any threshold trips.","States are not sequential or items skip freely between them - the bands stop meaning anything; chart per-state counts as lines instead.","3-5 states at daily or hourly snapshots; a 30-90 day window keeps band slopes readable.","States take --chart-1..--chart-5 in pipeline order with the terminal state at the bottom; the mapping stays fixed across every board the product shows.","Label bands directly at the right edge; call out the widest band's depth as text; stack order must match legend order.","Per-snapshot table of counts per state, with arrival and completion rates.","Hover shows per-state counts at a date; brush a period to inspect a slowdown."
18
+ 17,sequential stage drop-off,operator-active,"funnel, pipeline, conversion, drop-off, stages, onboarding steps",funnel,"ordered bar with conversion labels, waterfall","A strictly ordered pipeline where each stage can only shrink - signup steps, job pipeline stages. The between-stage conversion percentages are the actual content; print them.","Entities can re-enter or skip stages (that is a flow - use a sankey) or only 2 stages exist (a stat card with one conversion rate).","3-7 stages; merge micro-steps until each transition carries a decision-worthy percentage.","Single-hue funnel in --chart-1 with stage depth shown by geometry; reserve --chart-5 (or the designated alert slot) to flag the worst drop-off stage.","Stage name, absolute count, and conversion-from-previous as text at every stage - the shape alone understates late-stage losses.","Ordered table: stage, count, percent of start, percent of previous.","Hover a stage for counts in and out; click to see the cohort that dropped at that stage."
19
+ 18,flow between states,operator-active,"sankey, flow, source to target, migration, traffic routing, transitions",sankey,"grouped bar of top transitions, transition-matrix heatmap","Quantities moving between named nodes - traffic from origin to destination, plan upgrades and downgrades. Link thickness carries volume; a handful of dominant links is the story.","Flows loop back on themselves, more than ~15 links matter, or precise link values must be compared - a transition-matrix heatmap or table wins there.","Up to ~12 nodes and ~20 links; aggregate minor links into an Other flow before rendering.","Color links by source node using --chart-1..--chart-5; when sources exceed 5, group them - a link gradient stays within its assigned pair of tokens.","Node labels with totals always visible; link values in tooltips and the fallback table - ribbon widths are not precisely readable by anyone.","Source / target / volume table sorted by volume.","Hover highlights a full path end to end; click a node isolates its inbound and outbound flows."
20
+ 19,latency percentiles over time,operator-active,"latency, percentiles, p50 p95 p99, tail, response time, slo latency",multi-line (percentile set),"line + band between percentiles, latency heatmap over time","Service latency where the tail is the story. Plot p50, p95, and p99 on one time axis: the gap between median and tail is the signal - a diverging gap means tail degradation even while the median looks healthy.","Averages stand in for percentiles (an average hides the tail entirely) or a single snapshot is the question (histogram of the distribution instead).","Compute percentiles server-side from histogram buckets; cap at 3 percentile series - p50/p95/p99 is the operator convention; consider a log y-axis when p99 dwarfs p50 by 10x or more.","Fixed mapping across the whole product: p50 --chart-1, p95 --chart-2, p99 --chart-3 - an operator should never have to re-read a latency legend.","Distinct dash patterns per percentile plus end-of-line labels; the caption names which line the SLO binds.","Table of time buckets x p50/p95/p99 with an SLO-threshold column.","Hover shows all three percentiles at once; SLO threshold as a reference line; brush-zoom into an incident window."
21
+ 20,long-tail magnitude distribution,operator-active,"log scale, heavy tail, orders of magnitude, skew, duration spread",histogram with log-scale buckets,"cumulative curve (line), top-N bar plus summary stats","Values spanning several orders of magnitude - request durations, payload sizes, queue waits. Log-spaced buckets (1-10ms, 10-100ms, ...) keep the tail visible instead of crushing 99% of the data into one bar.","Values sit within one order of magnitude (linear buckets are more honest) or the audience will misread a log axis without labels at every decade.","10-20 log-spaced buckets, bucketed server-side; label every decade tick explicitly.","Single distribution --chart-1; a second overlay (previous deploy, other region) takes --chart-2 at reduced fill opacity.","Say 'log scale' in the axis label itself, not just the ticks; report p50 and p99 as text so the compression cannot mislead.","Bucket table with range, count, and cumulative-percent columns.","Hover per bucket; toggle linear/log axis; brush a bucket range to list the entities inside it."
22
+ 21,count and rate on one timeline,operator-active,"composed, volume and rate, bars and line, throughput and errors, overlay",composed bar + line,"two stacked panels sharing an x-axis, two lines (same unit)","An amount and a rate that explain each other over time - deploys (bars) against error rate (line). Bars carry the count, the line carries the rate, and the shared time axis carries the causality question.","The measures do not share a time grain or have no causal reading together; if both are rates in one unit, two plain lines are clearer. Treat a second y-axis with suspicion - aligned stacked panels avoid implying false correlation.","Same budgets as line and bar individually; prefer aligned panels over dual axes when scales differ by more than ~10x.","Bars --chart-1, line --chart-2; an essential second line takes --chart-3 - three encodings is the ceiling for one panel.","Each axis labeled with its unit and matched to its series in the legend; the line already differs from bars by geometry, keep it that way.","One table with a timestamp column and one column per measure.","Shared hover across both encodings at a timestamp; brush zoom moves both together."
23
+ 22,intensity across two dimensions,operator-active,"heatmap, hour by day, matrix, density grid, cadence, when does it happen",heatmap,"small-multiple bars, calendar heatmap","A metric across two categorical or binned axes - errors by hour x weekday, load by node x hour. Cyclical patterns (the 3am cron spike, the Monday surge) pop out at a glance.","Exact values must be read (heatmaps rank, they do not measure - pair with a table) or fewer than ~20 cells, where bars say it better.","Up to ~1-2k visible cells; aggregate beyond that; a year-long calendar heatmap is ~370 cells and fine.","A single-hue ramp built from --chart-1 via lightness/opacity steps - never a hue ramp across --chart-1..--chart-5, which misorders intensity; a diverging scale anchors its ends on --chart-2 and --chart-5 through a neutral midpoint.","Show the numeric value in-cell when the grid is small enough, always in tooltips otherwise; include a labeled color-scale legend with tick values.","The same matrix as a table, or the top-N hottest cells as a ranked list.","Hover for cell value; click a cell to filter the dashboard to that slice; a control for the time-bucket size."
24
+ 23,state over time per entity,operator-active,"status timeline, uptime, availability, incident history, up down, per host",status strip (segmented horizontal bar),"heatmap (entity x time), event markers","Discrete states per entity across time - up/degraded/down per service, job success history. One horizontal strip per entity, colored segments per state, stacked into a fleet overview.","Continuous measures (that is a line) or state changes so frequent that segments fall under a pixel - aggregate to percent-uptime per bucket and use a heatmap.","Up to ~30 entity rows per screen with 100-300 time segments each; past that paginate or group entities by team or tier.","States get a fixed mapping from --chart-1..--chart-5 (e.g. healthy --chart-2, degraded --chart-4, down --chart-5) used identically on every strip and legend in the product.","States must differ by more than hue - add a pattern or icon in the legend key; announce current state and last transition as text per row.","Per-entity table: current state, uptime percent, last incident timestamp.","Hover a segment for state, start, and duration; click opens the incident or run detail; time-range picker shared with the page."
25
+ 24,error-budget burn,operator-active,"error budget, slo burn, budget remaining, burn rate, reliability target",line vs threshold reference,"area (budget consumed), stat card with burn multiple","Consumption of an SLO error budget across a window - the line is budget remaining (or burn rate), the reference line is the exhaustion bound. The slope tells the operator whether the month survives.","No SLO is defined (define it first - a budget chart without a bound is just a line) or the audience only needs the current number (stat card with the burn multiple).","One series per SLO over a 28-30 day rolling window; multiple SLOs get one panel each, never overlaid.","Budget line --chart-1; the exhaustion threshold is a neutral reference line; the segment past a breach may re-color to --chart-5 where the line crosses it.","Annotate the crossing point ('budget exhausted Jun 24') as text on the chart; show remaining budget and burn multiple as a text pair beside it.","Stat pair (remaining percent, burn multiple) plus a daily consumption table.","Hover for remaining budget at a date; window toggle (7d/28d); click a burn spike to jump to that incident window."
26
+ 25,anomaly surveillance,operator-active,"anomaly, outlier detection, spike, expected range, deviation band, triage",line with reference band + highlighted points,"line with threshold reference lines, event-marked line","A live metric watched against an expected envelope - the normal band as a soft area, the actual as a line, flagged anomalies as marked, annotated points. The chart's job is triage: when, how far out, recovered or not.","Anomalies are already classified events (a table of incidents outranks dots on a line) or the expected band is invented rather than computed from history.","Same budgets as a line chart; keep anomaly markers a separate small series so hundreds of raw points never become hundreds of alerts.","Actual line --chart-1; expected band --chart-1 at low fill opacity; anomaly markers --chart-5 (the designated alert slot) with a distinct marker shape.","Every anomaly gets a text annotation or a numbered reference into a side list; marker shape distinguishes anomalies before color does.","Anomaly list (timestamp, metric, deviation magnitude, duration) beside the raw series table.","Hover an anomaly for deviation details; click jumps to logs or traces for that window; pause/resume live updates and honor reduced-motion preferences."
27
+ 26,forecast with uncertainty,operator-active,"forecast, projection, confidence interval, capacity planning, expected range",line + confidence area band,"fan of percentile lines, table of projected dates","History plus a projection - disk-full forecasting, traffic growth. Solid line for actuals, dashed continuation for the forecast, a widening band for the interval; the seam between observed and predicted must be unmistakable.","No stated confidence interval (a bare forecast line overstates certainty) or a forecast horizon longer than roughly half the visible history, which reads as fiction.","Keep the forecast to at most ~30% of the x-axis; one forecast per panel - competing forecasts get small multiples.","Actuals --chart-1 solid; forecast --chart-2 dashed; band --chart-2 at low fill opacity - never the same treatment for observed and predicted.","The actual/forecast split is carried by line style and a labeled vertical seam, not hue; name the interval ('80% band') in the legend text.","Table of projected values with lower and upper bounds, plus the headline date ('capacity reached ~Aug 12').","Hover shows point estimate and bounds; toggle the band; drag the horizon control to extend or shorten the projection."
28
+ 27,utilization against capacity,operator-active,"capacity, utilization, saturation, headroom, limit, disk, memory, pool",area with capacity reference line,"line with threshold, bullet-style bar (current snapshot)","A consumable resource against a hard limit over time - memory vs allocation, connections vs pool size. The filled area makes consumed-vs-headroom spatial; the reference line is the wall.","The limit is soft or autoscaling moves it constantly - plot the limit as its own step line instead of a fixed reference; snapshots without history belong in bullet-style bars.","Standard line-chart budgets; one resource per panel - a wall of small multiples beats six areas in one frame.","Consumption area --chart-1; the capacity bound is a neutral reference line, not a chart hue; crossing the warning threshold may flip the fill to --chart-4 or --chart-5 per the dashboard's alert convention.","Print current utilization percent and absolute headroom as text; threshold lines get labels ('80% warn'), not just position.","Stat card (current percent, headroom) with a history table.","Hover for value and percent-of-limit; brush to inspect a saturation event; click through to the per-instance breakdown."
29
+ 28,two-point change,operator-active,"slope, before after, two periods, rank shift, regression check, deploy delta",slope (two-point line),"grouped bar, diverging bar of deltas","Many entities measured at exactly two moments - latency per endpoint before and after a deploy. One line per entity between two vertical axes; crossings and steep slopes are the story.","More than 2 time points (a full line chart) or more than ~20 entities without highlighting - a muted field with 3-5 highlighted entities is the readable version.","Label up to ~12 entities directly; beyond that render the field muted and highlight only the largest movers.","The muted field uses a neutral low-emphasis stroke; highlighted movers take --chart-1..--chart-3; improvement/regression coloring reuses the deviation pair (--chart-2 / --chart-5).","Direct labels at both endpoints for highlighted entities; the delta as signed text in the tooltip and the fallback.","Table of entity, before, after, signed delta, percent change.","Hover isolates one entity's line; search-to-highlight; sort control on the fallback table."
30
+ 29,single proportion progress,operator-active,"progress, percent complete, radial, completion, rollout, migration status",radial progress (radial bar),"linear progress bar, stat card with fraction","One bounded percentage with a natural end state - rollout 68% complete, backfill progress. A radial or linear progress indicator plus the number reads instantly on a stat card.","The value is unbounded or can meaningfully regress (use a line so history shows) or several proportions need comparing (bars compare, rings do not).","One value per indicator; a grid of many progress indicators should become a sorted horizontal bar list.","Filled arc --chart-1 on the neutral track; a stalled or failing state borrows the alert slot --chart-5, never a new hue.","The percentage as large text in the center or beside the bar - the geometry is redundant to it; include the fraction ('682 of 1000 shards').","Text fraction and percent; nothing else needed.","Click drills into the remaining items; no hover needed beyond the exact fraction."
31
+ 30,multi-attribute profile,operator-active,"radar, profile, dimensions, scorecard, capability, shape comparison",radar,"grouped bar, small-multiple bars, scored table","1-3 entities compared across 4-6 shared, equally scaled attributes where the overall shape ('strong on reliability, weak on cost') matters more than exact reads.","Attributes on different scales or more than 6 axes (normalize or switch to grouped bars), any need for precise values, or more than 3 overlaid entities.","4-6 axes and 1-3 series; anything larger goes to a grouped bar or a scored table.","Entities take --chart-1..--chart-3 with translucent fills and full-opacity strokes; needing more than 3 means the radar was the wrong call.","Radar is a recognition chart, not a reading chart - the scored-table fallback is mandatory, and axis labels must be full words, not abbreviations.","Entity x attribute table with the same normalized scores.","Hover an axis for exact scores of all series; legend toggle per entity."
32
+ 31,discrete events on a timeline,operator-active,"events, deploys, incidents, annotations, markers, releases, audit points",event markers on a time axis,"bar of event counts per bucket, status strip","Point-in-time events that give context to trends - deploy markers over an error-rate line, incident flags on a latency panel. Events render as vertical reference lines or a marker lane under the main chart.","Events are the metric itself at high frequency (aggregate to counts per interval and use bars) or the descriptions matter more than the timing (a log table).","Up to ~30 visible markers per window; beyond that cluster into count badges that expand on zoom.","Markers use --chart-3 (or any slot not taken by the series they annotate); event categories cap at the surface's five slots - vary the marker glyph before the hue.","Each marker needs an accessible label (event type plus timestamp); a marker legend maps glyph to event type; the event list is keyboard-reachable.","Chronological event table alongside the metric table.","Hover a marker for the event summary; click opens the deploy or incident record; toggle event lanes on and off."
33
+ 32,geographic distribution,operator-active,"geo, region, country, datacenter, by location, spatial",horizontal bar by region (sorted),"heatmap (region x metric), table with inline bars","A metric broken down by region or datacenter where the values, not the geography, answer the question - a sorted bar of regions is more precise than any map and needs no map dependency.","A true spatial pattern (adjacency, routing paths) is the insight - that needs a real map layer, which sits outside the substrate's chart family; flag it as a bespoke component rather than forcing a chart.","Up to ~20 regions as bars; more than that, group by continent or tier first.","Same as ranked bars: --chart-1 uniform with --chart-2 for the focal region; per-region rainbow coloring communicates nothing.","Region names as full text labels with values printed; sorting by value replaces spatial scanning.","Region / value / share table with CSV export.","Hover for exact values; click a region to filter the dashboard; sort toggle."