@nurix/etna 0.19.65 → 0.19.67

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 (250) hide show
  1. package/bin/etna.js +10 -1
  2. package/data/harness-index.json +1 -5
  3. package/data/harnesses/code/CLAUDE.md +3 -1
  4. package/data/harnesses/code/agents/maintenance.md +4 -1
  5. package/data/harnesses/code/harness.json +7 -2
  6. package/data/harnesses/code/hooks/check-completion-integrity.mjs +8 -0
  7. package/data/harnesses/code/hooks/compliance.mjs +139 -27
  8. package/data/harnesses/code/hooks/lib/frozen.mjs +3 -0
  9. package/data/harnesses/code/hooks/lib/ledger.mjs +31 -0
  10. package/data/harnesses/code/hooks/lib/ownership.mjs +3 -1
  11. package/data/harnesses/code/hooks/lib/session-log.mjs +75 -0
  12. package/data/harnesses/code/rules/changelog.md +2 -0
  13. package/data/harnesses/code/skills/documentation/SKILL.md +1 -0
  14. package/data/harnesses/code/skills/documentation/references/frontmatter.md +1 -1
  15. package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +2 -2
  16. package/data/harnesses/code/skills/documentation/templates/Readme.md +1 -0
  17. package/data/harnesses/code/skills/documentation/templates/behavioral-checklist.md +2 -0
  18. package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +2 -2
  19. package/data/harnesses/code/skills/documentation/templates/feature.md +1 -0
  20. package/data/harnesses/code/skills/documentation/templates/implementation-map.md +42 -0
  21. package/data/harnesses/code/skills/testing/SKILL.md +5 -5
  22. package/data/harnesses/delivery/agents/maintenance.md +4 -1
  23. package/data/harnesses/delivery/harness.json +2 -2
  24. package/data/harnesses/delivery/rules/changelog.md +2 -0
  25. package/data/harnesses/delivery/skills/documentation/SKILL.md +1 -0
  26. package/data/harnesses/delivery/skills/documentation/references/frontmatter.md +1 -1
  27. package/data/harnesses/delivery/skills/documentation/scripts/doc-lint.mjs +2 -2
  28. package/data/harnesses/delivery/skills/documentation/templates/Readme.md +1 -0
  29. package/data/harnesses/delivery/skills/documentation/templates/behavioral-checklist.md +2 -0
  30. package/data/harnesses/delivery/skills/documentation/templates/changelog-entry.md +2 -2
  31. package/data/harnesses/delivery/skills/documentation/templates/feature.md +1 -0
  32. package/data/harnesses/delivery/skills/documentation/templates/implementation-map.md +42 -0
  33. package/data/harnesses/etna/agents/maintenance.md +4 -1
  34. package/data/harnesses/etna/harness.json +2 -2
  35. package/data/harnesses/etna/rules/changelog.md +2 -0
  36. package/data/harnesses/etna/skills/documentation/SKILL.md +1 -0
  37. package/data/harnesses/etna/skills/documentation/references/frontmatter.md +1 -1
  38. package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +2 -2
  39. package/data/harnesses/etna/skills/documentation/templates/Readme.md +1 -0
  40. package/data/harnesses/etna/skills/documentation/templates/behavioral-checklist.md +2 -0
  41. package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +2 -2
  42. package/data/harnesses/etna/skills/documentation/templates/feature.md +1 -0
  43. package/data/harnesses/etna/skills/documentation/templates/implementation-map.md +42 -0
  44. package/lib/install/materialize.mjs +51 -57
  45. package/package.json +2 -2
  46. package/data/harnesses/apollo/.mcp.json +0 -8
  47. package/data/harnesses/apollo/.prettierignore +0 -29
  48. package/data/harnesses/apollo/.prettierrc.json +0 -3
  49. package/data/harnesses/apollo/.vscode/settings.json +0 -19
  50. package/data/harnesses/apollo/CLAUDE.md +0 -162
  51. package/data/harnesses/apollo/agents/bookkeeper.md +0 -28
  52. package/data/harnesses/apollo/agents/brainstorm.md +0 -144
  53. package/data/harnesses/apollo/agents/change-review.md +0 -251
  54. package/data/harnesses/apollo/agents/lld-mode.md +0 -58
  55. package/data/harnesses/apollo/agents/maintenance.md +0 -233
  56. package/data/harnesses/apollo/agents/performance-review.md +0 -223
  57. package/data/harnesses/apollo/agents/retro.md +0 -46
  58. package/data/harnesses/apollo/codex/agents/bookkeeper.toml +0 -26
  59. package/data/harnesses/apollo/codex/agents/brainstorm.toml +0 -142
  60. package/data/harnesses/apollo/codex/agents/change-review.toml +0 -249
  61. package/data/harnesses/apollo/codex/agents/lld-mode.toml +0 -52
  62. package/data/harnesses/apollo/codex/agents/maintenance.toml +0 -228
  63. package/data/harnesses/apollo/codex/agents/performance-review.toml +0 -222
  64. package/data/harnesses/apollo/codex/agents/retro.toml +0 -45
  65. package/data/harnesses/apollo/harness.json +0 -19
  66. package/data/harnesses/apollo/hooks/approved-packages.md +0 -44
  67. package/data/harnesses/apollo/hooks/awareness.mjs +0 -405
  68. package/data/harnesses/apollo/hooks/check-bookkeeping-clean.mjs +0 -19
  69. package/data/harnesses/apollo/hooks/check-changelog-presence.mjs +0 -57
  70. package/data/harnesses/apollo/hooks/check-completion-integrity.mjs +0 -71
  71. package/data/harnesses/apollo/hooks/check-ownership.mjs +0 -22
  72. package/data/harnesses/apollo/hooks/compliance.mjs +0 -457
  73. package/data/harnesses/apollo/hooks/hooks.json +0 -23
  74. package/data/harnesses/apollo/hooks/lib/frozen.mjs +0 -58
  75. package/data/harnesses/apollo/hooks/lib/ownership.mjs +0 -242
  76. package/data/harnesses/apollo/hooks/lib/state.mjs +0 -170
  77. package/data/harnesses/apollo/rules/changelog.md +0 -25
  78. package/data/harnesses/apollo/rules/database.md +0 -34
  79. package/data/harnesses/apollo/rules/frontend.md +0 -30
  80. package/data/harnesses/apollo/rules/general.md +0 -40
  81. package/data/harnesses/apollo/rules/nomenclature.md +0 -30
  82. package/data/harnesses/apollo/rules/pnpm.md +0 -57
  83. package/data/harnesses/apollo/rules/testing.md +0 -64
  84. package/data/harnesses/apollo/skills/boundary/SKILL.md +0 -75
  85. package/data/harnesses/apollo/skills/boundary/references/index.md +0 -16
  86. package/data/harnesses/apollo/skills/boundary/references/mechanisms.md +0 -99
  87. package/data/harnesses/apollo/skills/boundary/references/packs/async-messaging.md +0 -81
  88. package/data/harnesses/apollo/skills/boundary/references/packs/auth.md +0 -93
  89. package/data/harnesses/apollo/skills/boundary/references/packs/build-config-runtime.md +0 -93
  90. package/data/harnesses/apollo/skills/boundary/references/packs/cloudflare.md +0 -93
  91. package/data/harnesses/apollo/skills/boundary/references/packs/frontend.md +0 -93
  92. package/data/harnesses/apollo/skills/boundary/references/packs/generic-tail.md +0 -55
  93. package/data/harnesses/apollo/skills/boundary/references/packs/persistence.md +0 -93
  94. package/data/harnesses/apollo/skills/boundary/references/packs/wire-api.md +0 -87
  95. package/data/harnesses/apollo/skills/brainstorm/README.md +0 -56
  96. package/data/harnesses/apollo/skills/brainstorm/SKILL.md +0 -173
  97. package/data/harnesses/apollo/skills/brainstorm/references/doctrine.md +0 -98
  98. package/data/harnesses/apollo/skills/brainstorm/references/harvest.md +0 -86
  99. package/data/harnesses/apollo/skills/brainstorm/references/session-schema.md +0 -186
  100. package/data/harnesses/apollo/skills/brainstorm/scripts/detector.mjs +0 -460
  101. package/data/harnesses/apollo/skills/design/SKILL.md +0 -121
  102. package/data/harnesses/apollo/skills/design/components/charts.md +0 -76
  103. package/data/harnesses/apollo/skills/design/components/collections.md +0 -132
  104. package/data/harnesses/apollo/skills/design/components/feedback.md +0 -47
  105. package/data/harnesses/apollo/skills/design/components/hooks.md +0 -35
  106. package/data/harnesses/apollo/skills/design/components/index.md +0 -143
  107. package/data/harnesses/apollo/skills/design/components/inputs.md +0 -327
  108. package/data/harnesses/apollo/skills/design/components/layout.md +0 -52
  109. package/data/harnesses/apollo/skills/design/components/media.md +0 -66
  110. package/data/harnesses/apollo/skills/design/components/motion.md +0 -82
  111. package/data/harnesses/apollo/skills/design/components/navigation.md +0 -29
  112. package/data/harnesses/apollo/skills/design/components/overlays.md +0 -72
  113. package/data/harnesses/apollo/skills/design/components/setup.md +0 -40
  114. package/data/harnesses/apollo/skills/design/components/typography.md +0 -46
  115. package/data/harnesses/apollo/skills/design/components/utils.md +0 -37
  116. package/data/harnesses/apollo/skills/design/data/blueprints/browse.md +0 -38
  117. package/data/harnesses/apollo/skills/design/data/blueprints/creation-flow.md +0 -38
  118. package/data/harnesses/apollo/skills/design/data/blueprints/dashboard.md +0 -38
  119. package/data/harnesses/apollo/skills/design/data/blueprints/grid.md +0 -38
  120. package/data/harnesses/apollo/skills/design/data/blueprints/queue.md +0 -38
  121. package/data/harnesses/apollo/skills/design/data/blueprints/record-detail.md +0 -38
  122. package/data/harnesses/apollo/skills/design/data/blueprints/settings.md +0 -38
  123. package/data/harnesses/apollo/skills/design/data/charts/census.csv +0 -58
  124. package/data/harnesses/apollo/skills/design/data/checklists/browse.md +0 -21
  125. package/data/harnesses/apollo/skills/design/data/checklists/creation-flow.md +0 -20
  126. package/data/harnesses/apollo/skills/design/data/checklists/dashboard.md +0 -21
  127. package/data/harnesses/apollo/skills/design/data/checklists/grid.md +0 -21
  128. package/data/harnesses/apollo/skills/design/data/checklists/queue.md +0 -21
  129. package/data/harnesses/apollo/skills/design/data/checklists/record-detail.md +0 -21
  130. package/data/harnesses/apollo/skills/design/data/checklists/settings.md +0 -21
  131. package/data/harnesses/apollo/skills/design/data/chrome/board-column.md +0 -68
  132. package/data/harnesses/apollo/skills/design/data/chrome/data-table.md +0 -63
  133. package/data/harnesses/apollo/skills/design/data/chrome/side-panel.md +0 -60
  134. package/data/harnesses/apollo/skills/design/data/chrome/sidebar.md +0 -78
  135. package/data/harnesses/apollo/skills/design/data/chrome/stat-cards.md +0 -62
  136. package/data/harnesses/apollo/skills/design/data/chrome/topbar.md +0 -65
  137. package/data/harnesses/apollo/skills/design/data/elevation/ant-design-directional-shadow.md +0 -19
  138. package/data/harnesses/apollo/skills/design/data/elevation/apple-liquid-glass-material.md +0 -18
  139. package/data/harnesses/apollo/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +0 -20
  140. package/data/harnesses/apollo/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +0 -20
  141. package/data/harnesses/apollo/skills/design/data/elevation/github-primer-sparing-shadow.md +0 -19
  142. package/data/harnesses/apollo/skills/design/data/elevation/ibm-carbon-layer-and-border.md +0 -19
  143. package/data/harnesses/apollo/skills/design/data/elevation/linear-dark-surface-ladder.md +0 -17
  144. package/data/harnesses/apollo/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +0 -19
  145. package/data/harnesses/apollo/skills/design/data/elevation/material-3-tonal-elevation.md +0 -21
  146. package/data/harnesses/apollo/skills/design/data/elevation/neobrutalist-hard-offset.md +0 -19
  147. package/data/harnesses/apollo/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +0 -18
  148. package/data/harnesses/apollo/skills/design/data/elevation/notion-warm-minimal-hairline.md +0 -17
  149. package/data/harnesses/apollo/skills/design/data/elevation/polaris-elevation-inset-bevel.md +0 -21
  150. package/data/harnesses/apollo/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +0 -19
  151. package/data/harnesses/apollo/skills/design/data/elevation/shadcn-neutral-derived-radius.md +0 -19
  152. package/data/harnesses/apollo/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +0 -18
  153. package/data/harnesses/apollo/skills/design/data/elevation/tailwind-default-utility-scale.md +0 -19
  154. package/data/harnesses/apollo/skills/design/data/elevation/vercel-geist-shadow-as-border.md +0 -20
  155. package/data/harnesses/apollo/skills/design/data/iconography.md +0 -199
  156. package/data/harnesses/apollo/skills/design/data/motion/accordion-expand.md +0 -18
  157. package/data/harnesses/apollo/skills/design/data/motion/destructive-hold-confirm.md +0 -18
  158. package/data/harnesses/apollo/skills/design/data/motion/drag-dismiss-momentum.md +0 -18
  159. package/data/harnesses/apollo/skills/design/data/motion/empty-state-arrive.md +0 -18
  160. package/data/harnesses/apollo/skills/design/data/motion/hover-lift.md +0 -18
  161. package/data/harnesses/apollo/skills/design/data/motion/modal-center-arrive.md +0 -18
  162. package/data/harnesses/apollo/skills/design/data/motion/number-ticker-roll.md +0 -18
  163. package/data/harnesses/apollo/skills/design/data/motion/onboarding-bounce.md +0 -18
  164. package/data/harnesses/apollo/skills/design/data/motion/panel-slide.md +0 -18
  165. package/data/harnesses/apollo/skills/design/data/motion/press-feedback.md +0 -18
  166. package/data/harnesses/apollo/skills/design/data/motion/progress-linear-loop.md +0 -18
  167. package/data/harnesses/apollo/skills/design/data/motion/route-crossfade.md +0 -18
  168. package/data/harnesses/apollo/skills/design/data/motion/rubber-band-overscroll.md +0 -18
  169. package/data/harnesses/apollo/skills/design/data/motion/skeleton-shimmer.md +0 -18
  170. package/data/harnesses/apollo/skills/design/data/motion/stagger-arrive.md +0 -18
  171. package/data/harnesses/apollo/skills/design/data/motion/toast-enter-stack.md +0 -18
  172. package/data/harnesses/apollo/skills/design/data/motion/tooltip-chain-instant.md +0 -18
  173. package/data/harnesses/apollo/skills/design/data/motion/trigger-anchored-reveal.md +0 -18
  174. package/data/harnesses/apollo/skills/design/data/tells.csv +0 -34
  175. package/data/harnesses/apollo/skills/design/data/voices/bright-collaborator.md +0 -29
  176. package/data/harnesses/apollo/skills/design/data/voices/direct-operator.md +0 -29
  177. package/data/harnesses/apollo/skills/design/data/voices/earnest-helper.md +0 -29
  178. package/data/harnesses/apollo/skills/design/data/voices/editorial-composed.md +0 -29
  179. package/data/harnesses/apollo/skills/design/data/voices/quiet-concierge.md +0 -29
  180. package/data/harnesses/apollo/skills/design/data/voices/warm-guide.md +0 -29
  181. package/data/harnesses/apollo/skills/design/references/compose.md +0 -23
  182. package/data/harnesses/apollo/skills/design/references/content.md +0 -28
  183. package/data/harnesses/apollo/skills/design/references/emission.md +0 -21
  184. package/data/harnesses/apollo/skills/design/references/existing-apps.md +0 -27
  185. package/data/harnesses/apollo/skills/design/references/foundations.md +0 -57
  186. package/data/harnesses/apollo/skills/design/references/intake.md +0 -40
  187. package/data/harnesses/apollo/skills/design/references/object-pass.md +0 -24
  188. package/data/harnesses/apollo/skills/design/references/ship-gate.md +0 -29
  189. package/data/harnesses/apollo/skills/design/references/ux-patterns/Readme.md +0 -195
  190. package/data/harnesses/apollo/skills/design/references/ux-patterns/ai-layer.md +0 -49
  191. package/data/harnesses/apollo/skills/design/references/ux-patterns/attributes-lifecycle.md +0 -43
  192. package/data/harnesses/apollo/skills/design/references/ux-patterns/container-choice.md +0 -44
  193. package/data/harnesses/apollo/skills/design/references/ux-patterns/creation-paths.md +0 -46
  194. package/data/harnesses/apollo/skills/design/references/ux-patterns/dashboards.md +0 -42
  195. package/data/harnesses/apollo/skills/design/references/ux-patterns/modes.md +0 -42
  196. package/data/harnesses/apollo/skills/design/references/ux-patterns/object-model.md +0 -46
  197. package/data/harnesses/apollo/skills/design/references/ux-patterns/page-archetype.md +0 -48
  198. package/data/harnesses/apollo/skills/design/references/ux-patterns/promotion-demotion.md +0 -37
  199. package/data/harnesses/apollo/skills/design/references/ux-patterns/settings.md +0 -42
  200. package/data/harnesses/apollo/skills/design/references/ux-patterns/standard-pages.md +0 -46
  201. package/data/harnesses/apollo/skills/design/references/ux-patterns/state-matrix.md +0 -41
  202. package/data/harnesses/apollo/skills/design/references/ux-patterns/table-mechanics.md +0 -48
  203. package/data/harnesses/apollo/skills/design/references/ux-patterns/verbs.md +0 -45
  204. package/data/harnesses/apollo/skills/design/references/ux-patterns/viewer-context.md +0 -40
  205. package/data/harnesses/apollo/skills/design/scripts/README-validator.md +0 -27
  206. package/data/harnesses/apollo/skills/design/scripts/select-chart.mjs +0 -622
  207. package/data/harnesses/apollo/skills/design/scripts/validate-design-md.mjs +0 -1198
  208. package/data/harnesses/apollo/skills/documentation/SKILL.md +0 -134
  209. package/data/harnesses/apollo/skills/documentation/references/examples.md +0 -279
  210. package/data/harnesses/apollo/skills/documentation/references/frontmatter.md +0 -44
  211. package/data/harnesses/apollo/skills/documentation/references/instruction-style.md +0 -50
  212. package/data/harnesses/apollo/skills/documentation/references/style-guide.md +0 -384
  213. package/data/harnesses/apollo/skills/documentation/references/untemplated.md +0 -38
  214. package/data/harnesses/apollo/skills/documentation/scripts/doc-lint.mjs +0 -140
  215. package/data/harnesses/apollo/skills/documentation/templates/Readme.md +0 -34
  216. package/data/harnesses/apollo/skills/documentation/templates/api-reference.md +0 -20
  217. package/data/harnesses/apollo/skills/documentation/templates/architecture-decision.md +0 -121
  218. package/data/harnesses/apollo/skills/documentation/templates/backlog.md +0 -33
  219. package/data/harnesses/apollo/skills/documentation/templates/behavioral-checklist.md +0 -79
  220. package/data/harnesses/apollo/skills/documentation/templates/bookkeeping.md +0 -18
  221. package/data/harnesses/apollo/skills/documentation/templates/changelog-entry.md +0 -57
  222. package/data/harnesses/apollo/skills/documentation/templates/changelog-index.md +0 -41
  223. package/data/harnesses/apollo/skills/documentation/templates/docs-readme.md +0 -72
  224. package/data/harnesses/apollo/skills/documentation/templates/domain-model.md +0 -30
  225. package/data/harnesses/apollo/skills/documentation/templates/environment-registry.md +0 -15
  226. package/data/harnesses/apollo/skills/documentation/templates/feature.md +0 -149
  227. package/data/harnesses/apollo/skills/documentation/templates/glossary.md +0 -11
  228. package/data/harnesses/apollo/skills/documentation/templates/journal.md +0 -13
  229. package/data/harnesses/apollo/skills/documentation/templates/memory-main.md +0 -25
  230. package/data/harnesses/apollo/skills/documentation/templates/migration-runbook.md +0 -34
  231. package/data/harnesses/apollo/skills/documentation/templates/non-goals.md +0 -11
  232. package/data/harnesses/apollo/skills/documentation/templates/operations-procedure.md +0 -36
  233. package/data/harnesses/apollo/skills/documentation/templates/plan.md +0 -88
  234. package/data/harnesses/apollo/skills/documentation/templates/protected-files.md +0 -37
  235. package/data/harnesses/apollo/skills/documentation/templates/root-readme.md +0 -104
  236. package/data/harnesses/apollo/skills/documentation/templates/security-overview.md +0 -27
  237. package/data/harnesses/apollo/skills/documentation/templates/structure.md +0 -65
  238. package/data/harnesses/apollo/skills/documentation/templates/system-overview.md +0 -32
  239. package/data/harnesses/apollo/skills/documentation/templates/testing-strategy.md +0 -29
  240. package/data/harnesses/apollo/skills/schema-design/SKILL.md +0 -141
  241. package/data/harnesses/apollo/skills/test/SKILL.md +0 -104
  242. package/data/harnesses/apollo/skills/testing/SKILL.md +0 -166
  243. package/data/harnesses/apollo/skills/workflow-mapper/SKILL.md +0 -451
  244. package/data/harnesses/apollo/skills/workflow-mapper/references/patterns.md +0 -214
  245. /package/data/harnesses/{apollo → code}/docs/README.md +0 -0
  246. /package/data/harnesses/{apollo → code}/docs/history/CHANGELOG.md +0 -0
  247. /package/data/harnesses/{apollo → code}/docs/history/backlog.md +0 -0
  248. /package/data/harnesses/{apollo → code}/docs/memory/main.md +0 -0
  249. /package/data/harnesses/{apollo → code}/docs/structure.md +0 -0
  250. /package/data/harnesses/{apollo → code}/rules/cloudflare.md +0 -0
@@ -1,18 +0,0 @@
1
- ---
2
- id: route-crossfade
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/animation-vocabulary/SKILL.md (Crossfade; Page transition) + review-animations/STANDARDS.md (sub-300ms rule; masking imperfect crossfades; easing decision order — opacity/color → ease)"
6
- license: open
7
- feel: "a single ~250ms crossfade between views reads like one continuous product; a staggered reveal of each panel on arrival reads like a slideshow"
8
- aliases: { slideshow: "child elements staggering in individually on route arrival instead of one crossfade", "double-exposed": "old and new view both fully visible mid-transition — mask with a subtle blur (~2px, never above 20px)" }
9
- ---
10
- Navigating between routes or top-level views — a same-place opacity morph, not a spatial entrance, so `ease` rather than the entrance curve. One crossfade only; never an orchestrated sequence of the destination's own elements arriving one by one. A product loads into a task, not a reveal.
11
-
12
- ```yaml values
13
- duration: 250ms
14
- easing: ease
15
- element-class: page
16
- interruptible: n/a
17
- budget: { page: 200-300ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: rubber-band-overscroll
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/animation-vocabulary/SKILL.md (Rubber-banding) + apple-design/SKILL.md §8 (boundary resistance) and spring cheat-sheet (critically-damped default)"
6
- license: open
7
- feel: "resistance that grows the further you pull, then a quick snap-back, reads alive and physical; a hard stop at the edge reads frozen"
8
- aliases: { frozen: "a hard stop at the scroll boundary instead of progressive resistance", overshoot: "snap-back overshoots past the origin instead of settling cleanly" }
9
- ---
10
- Scrollable containers and pull-to-refresh regions at their boundary. Resistance increases continuously with drag distance past the edge; release animates back with a critically-damped spring, never a linear tween.
11
-
12
- ```yaml values
13
- duration: 300ms (snap-back)
14
- easing: spring(damping increases near boundary)
15
- element-class: page
16
- interruptible: required
17
- budget: { page: 200-400ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: skeleton-shimmer
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/animation-vocabulary/SKILL.md (Skeleton/Shimmer) + review-animations/STANDARDS.md (easing decision order — constant motion → linear)"
6
- license: open
7
- feel: "a slow, continuous sheen reads like content is genuinely on its way; a fast or jittery shimmer reads anxious"
8
- aliases: { anxious: "shimmer cycle faster than ~1s, reading twitchy instead of calm", stuck: "a static placeholder with no shimmer at all, giving no sense of progress" }
9
- ---
10
- Loading placeholders for cards, rows, and detail panes before content resolves. Runs as a continuous ambient loop, exempt from the sub-300ms UI budget (constant-motion class); swap to real content with a quick crossfade, not a hard cut.
11
-
12
- ```yaml values
13
- duration: 1400ms (loop)
14
- easing: linear
15
- element-class: list-item
16
- interruptible: n/a
17
- budget: { list-item: 1200-1600ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: stagger-arrive
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/review-animations/STANDARDS.md (stagger — 30-80ms, decorative, never blocks interaction)"
6
- license: open
7
- feel: "a ~50ms cascade with a small upward drift reads considered; everything landing at once reads dumped, and gaps above 80ms read slow"
8
- aliases: { dumped: "no stagger at all on a multi-item entrance", draggy: "per-item stagger delay above the 80ms budget" }
9
- ---
10
- List and grid entrances for freshly-loaded content within a task (search results, new rows) — never on initial page load or route arrival (no orchestrated load sequences). Purely decorative — must never delay the list becoming interactive; keep the per-item delay inside 30-80ms so a ten-row list finishes well under half a second.
11
-
12
- ```yaml values
13
- duration: 300ms
14
- easing: cubic-bezier(0.23, 1, 0.32, 1)
15
- element-class: list-item
16
- interruptible: n/a
17
- budget: { list-item: 250-350ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: toast-enter-stack
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/review-animations/STANDARDS.md (interruptibility — toast transition example; cohesion — the Sonner register)"
6
- license: open
7
- feel: "a 400ms transition-based stack reads calm even when toasts pile up fast; a keyframe stack reads jumpy every time a new one lands"
8
- aliases: { jumpy: "@keyframes restarting already-stacked toasts instead of one continuous transition retargeting them", jarring: "no @starting-style/mount fallback, so the first toast snaps in with no entrance" }
9
- ---
10
- Toast/notification stacks. A new arrival must not restart the position transition of toasts already stacked — everything reflows on one continuous transition, never per-toast keyframes.
11
-
12
- ```yaml values
13
- duration: 400ms
14
- easing: ease
15
- element-class: overlay
16
- interruptible: required
17
- budget: { overlay: 300-450ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: tooltip-chain-instant
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/emil-design-eng/SKILL.md (tooltip-chaining example) + review-animations/STANDARDS.md (duration table, tooltip row; perceived performance)"
6
- license: open
7
- feel: "the first tooltip's 125ms fade-and-lift reads considered; every later tooltip in the same toolbar should read instant, with zero animation"
8
- aliases: { "laggy-toolbar": "every tooltip in a group replaying the full delay+animation instead of chaining to instant after the first", floaty: "duration above the small-popover budget" }
9
- ---
10
- Tooltips, especially adjacent ones in a toolbar. First open: full delay + animation. While the pointer stays within the tooltip group, later tooltips switch to 0ms — this is the frequency law being satisfied, not an exception to it.
11
-
12
- ```yaml values
13
- duration: 125ms
14
- easing: cubic-bezier(0.23, 1, 0.32, 1)
15
- element-class: control
16
- interruptible: n/a
17
- budget: { control: 0-200ms }
18
- ```
@@ -1,18 +0,0 @@
1
- ---
2
- id: trigger-anchored-reveal
3
- class: a6
4
- sourced: 2026-07-12
5
- source: "emilkowalski.skills/skills/review-animations/STANDARDS.md (physicality — origin-aware popovers; duration table, dropdown row) + improve-animations/AUDIT.md §3"
6
- license: open
7
- feel: "growing out of the trigger at ~200ms reads anchored and native; center-scale or scale(0) reads like a random popup"
8
- aliases: { disconnected: "transform-origin left at center instead of the trigger element", glitchy: "scale(0) start instead of scale(0.9-0.97) + opacity" }
9
- ---
10
- Popovers, dropdowns, select menus, tooltips. `transform-origin` follows the trigger (Radix/Base UI expose it as a CSS var); never centers. Rapid open/close/open must retarget, not restart.
11
-
12
- ```yaml values
13
- duration: 200ms
14
- easing: cubic-bezier(0.23, 1, 0.32, 1)
15
- element-class: overlay
16
- interruptible: required
17
- budget: { overlay: 150-250ms }
18
- ```
@@ -1,34 +0,0 @@
1
- id,tell,category,provenance,sourced,status
2
- tell-001,"every shadow set to zero and every border the same 1px gray — structure without a single elevation decision",wireframe-smell,"design-skill 01 §E5; impeccable detector registry",2026-07-12,active
3
- tell-002,"rounded-square icon tile stacked above the heading on every card — the universal generated feature-card template",template,"impeccable detector registry (icon-tile-stack)",2026-07-12,active
4
- tell-003,"cards nested inside cards — double borders and stacked radii standing in for hierarchy",card-abuse,"impeccable detector registry (nested-cards); design-skill 01 §E5",2026-07-12,active
5
- tell-004,"thick colored stripe down one edge of a card as the accent device",accent-abuse,"impeccable detector registry (side-tab); design-skill 01 §E5",2026-07-12,active
6
- tell-005,"accent border wrapped around a rounded card — the stripe fighting the corner radius",accent-abuse,"impeccable detector registry (border-accent-on-rounded)",2026-07-12,active
7
- tell-006,"hero-metric template — a row of identical stat tiles each icon + label + big number, with no comparison, trend, state, or door",template,"design-skill 01 §E5; b2b-ux-patterns dashboards chapter",2026-07-12,active
8
- tell-007,"cream or warm-beige page surface reached by reflex as the tasteful default",palette,"impeccable detector registry (cream-palette); taste-skill §9.A; design-skill 01 §A2 anti-cream guardband",2026-07-12,active
9
- tell-008,"ghost cards — bordered or shadowed containers wrapping a single short text run or nothing at all",card-abuse,"design-skill 01 §E5",2026-07-12,active
10
- tell-009,"purple-violet gradients and cyan-on-dark as the default accent scheme",palette,"impeccable detector registry (ai-color-palette)",2026-07-12,active
11
- tell-010,"dark theme expressed as colored box-shadow glows instead of a surface-lightness ladder",palette,"impeccable detector registry (dark-glow); design-skill 01 §A3 dark ladder",2026-07-12,active
12
- tell-011,"gradient fills on heading or metric text",typography,"impeccable detector registry (gradient-text)",2026-07-12,active
13
- tell-012,"flat type ramp — adjacent sizes too close together to carry hierarchy anywhere on the surface",typography,"impeccable detector registry (flat-type-hierarchy)",2026-07-12,active
14
- tell-013,"one spacing value everywhere — no tight grouping of related controls, no generous seams between sections",layout,"impeccable detector registry (monotonous-spacing)",2026-07-12,active
15
- tell-014,"hairline border and a wide diffuse shadow on the same container — two elevation systems at once",elevation,"impeccable detector registry (generated-UI signature set)",2026-07-12,active
16
- tell-015,"decorative two-axis hairline grid background behind a surface that is not a canvas, map, or measurement view",template,"impeccable detector registry (generated-UI signature set)",2026-07-12,active
17
- tell-016,"numbered section markers (01 / 02 / 03) as structural scaffolding",template,"impeccable detector registry (numbered-section-markers); taste-skill §9.F",2026-07-12,active
18
- tell-017,"tiny uppercase letter-spaced kicker label repeated above every section heading",template,"impeccable detector registry (repeated-section-kickers)",2026-07-12,active
19
- tell-018,"colored status dots decorating every nav item, row, or badge with no real state behind them",chrome,"taste-skill §9.F production-observed tells",2026-07-12,active
20
- tell-019,"middle-dot chains as the default separator for every metadata strip",chrome,"taste-skill §9.F production-observed tells",2026-07-12,active
21
- tell-020,"top and bottom hairline borders on every row of a long table or spec list",wireframe-smell,"taste-skill §9.F production-observed tells",2026-07-12,active
22
- tell-021,"fake build or version strings as decoration where no real build data exists",demo-content,"taste-skill §9.F production-observed tells",2026-07-12,active
23
- tell-022,"placeholder-generic person names in demo data (the John Doe class)",demo-content,"taste-skill §9.D (Jane Doe effect); design-skill 01 §E5",2026-07-12,active
24
- tell-023,"the same gray egg or user-icon avatar on every person row",demo-content,"taste-skill §9.D production-observed tells",2026-07-12,active
25
- tell-024,"fake-perfect numbers — round percentages, sequential IDs, totals that reconcile too neatly",demo-content,"taste-skill §9.D; design-skill 01 §E5",2026-07-12,active
26
- tell-025,"startup-slop company names in demo data (the Acme / Nexus / Cloudly class)",demo-content,"taste-skill §9.D production-observed tells",2026-07-12,active
27
- tell-026,"marketing buzzwords in interface copy (streamline, empower, supercharge, enterprise-grade)",copy,"impeccable detector registry (marketing-buzzword); taste-skill §9.D",2026-07-12,active
28
- tell-027,"em-dash-heavy microcopy — the character recurring across labels, empty states, and tooltips",copy,"taste-skill §9.G; impeccable detector registry (em-dash-overuse)",2026-07-12,active
29
- tell-028,"transition: all on interactive elements",motion,"design-skill 02 ship-gate Tier-2 motion tells",2026-07-12,active
30
- tell-029,"ease-in easing on an entrance",motion,"design-skill 02 ship-gate Tier-2 motion tells; emilkowalski motion canon",2026-07-12,active
31
- tell-030,"animation attached to a keyboard-triggered action",motion,"design-skill 02 ship-gate Tier-2 motion tells; emilkowalski frequency law",2026-07-12,active
32
- tell-031,"bounce or elastic easing on product chrome",motion,"impeccable detector registry (bounce-easing)",2026-07-12,active
33
- tell-032,"width, height, padding, or margin animated instead of transform and opacity",motion,"impeccable detector registry (layout-transition)",2026-07-12,active
34
- tell-033,"orchestrated staggered entrance choreography on a work surface — a product loads into a task",motion,"design-skill 01 §A6 admission criteria; emilkowalski motion canon",2026-07-12,active
@@ -1,29 +0,0 @@
1
- ---
2
- id: bright-collaborator
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from Slack's voice & tone guidance (api.slack.com/best-practices/voice-and-tone) — confident not cocky, witty not silly, clear-concise-human, tone as seasoning not the dish."
6
- license: open
7
- ---
8
- # Voice: bright-collaborator
9
-
10
- **Feel:** Confident and a little playful, but the point always lands first.
11
-
12
- Conversational rhythm — short sentences mixed with one longer one for cadence, contractions standard, second person throughout. Personality is seasoning: light wit is reserved for confirmations and empty states, never for errors. Actions open with a verb. Numbers are digits. One idea per sentence — never two clauses competing for attention.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** verb-first with a light conversational lift
19
- - **error:** personality drops out entirely — plain statement, then the fix
20
- - **success:** wit is allowed, one line, never stacked
21
- - **destructive confirmation:** playfulness fully off, states the stakes plainly
22
-
23
- ## Examples
24
-
25
- - **button:** "Invite teammate"
26
- - **empty state (heading + motivation):** "Quiet in here" / "Invite a teammate and this space starts filling up."
27
- - **error:** "That invite didn't go through. Check the email and send it again."
28
- - **tooltip:** "Only workspace admins can see this."
29
- - **confirmation:** "Teammate invited — welcome aboard."
@@ -1,29 +0,0 @@
1
- ---
2
- id: direct-operator
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from Atlassian's 'bold, optimistic, practical' brevity mandate (atlassian.design/content/voice-and-tone-principles) and Material Design's clarity-to-anyone standard (m3.material.io/foundations/content-design)."
6
- license: open
7
- ---
8
- # Voice: direct-operator
9
-
10
- **Feel:** Brisk and task-first — reads like a command line, not a conversation.
11
-
12
- Imperative mood by default; sentence fragments are acceptable where a full sentence adds nothing ("Upload failed. Retry."). No adjectives unless load-bearing. Numerals are always digits, units abbreviated once established. No exclamation points, no rhetorical questions, no throat-clearing openers ("Please note that…"). Density over politeness — every word has to justify its presence.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** imperative, fragments allowed
19
- - **error:** states failure plus count or reason, no softening
20
- - **success:** single clipped phrase, no embellishment
21
- - **destructive confirmation:** same flat register as everything else — no added urgency language, the plainness is the safeguard
22
-
23
- ## Examples
24
-
25
- - **button:** "Create workspace"
26
- - **empty state (heading + motivation):** "No records" / "Import a file or add one manually to begin."
27
- - **error:** "Save failed. 3 fields are invalid."
28
- - **tooltip:** "Locks the row for editing by others."
29
- - **confirmation:** "Workspace created."
@@ -1,29 +0,0 @@
1
- ---
2
- id: earnest-helper
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from Intercom's PREACH framework (intercom.com/blog/preach-framework-for-customer-support-tone) — Proud, Responsible, Empathetic, Articulate, Concise, Human."
6
- license: open
7
- ---
8
- # Voice: earnest-helper
9
-
10
- **Feel:** Owns the failure, states the fix, never grovels.
11
-
12
- First-person-plural ownership when the product is at fault ("we couldn't…"), second person when guiding the user's next step. Sentences are short and declarative; empathy is shown through precision and a clear next step rather than apology words ("sorry," "oops" are avoided). No exclamation points, even on success — confidence doesn't need punctuation. Numbers are digits throughout.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** second person, concise, no flourish
19
- - **error:** first-person-plural ownership ("we couldn't…"), immediate next step
20
- - **success:** short, no exclamation, confidence without decoration
21
- - **destructive confirmation:** states irreversibility explicitly, still no apology language
22
-
23
- ## Examples
24
-
25
- - **button:** "Submit request"
26
- - **empty state (heading + motivation):** "No requests yet" / "Submit one and track its progress here."
27
- - **error:** "We couldn't submit that request. Reconnect and try again."
28
- - **tooltip:** "Requests are visible to your whole team once submitted."
29
- - **confirmation:** "Request submitted."
@@ -1,29 +0,0 @@
1
- ---
2
- id: editorial-composed
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from Material Design's AP-style clarity standard (m3.material.io/foundations/content-design/style-guide/ux-writing-best-practices) and Atlassian's 'practical, with a wink' brand register (atlassian.design/content/writing-style), slowed to an editorial cadence."
6
- license: open
7
- ---
8
- # Voice: editorial-composed
9
-
10
- **Feel:** Measured and literate — composed sentences, unhurried but exact.
11
-
12
- Longer, fully-formed sentences that favor a subordinate clause over a fragment; still one idea per sentence, but the idea is given room. Verbs remain the engine of the sentence rather than being buried under nominalizations. Numbers under ten are spelled out even in most UI text; digits are reserved for data-dense contexts (tables, counters, timestamps). Restraint reads as taste, not coldness — warmth comes from word choice, never from exclamation.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** a fuller sentence, still verb-led
19
- - **error:** composed, no blame, the fix named in a complete sentence
20
- - **success:** a complete, satisfying sentence rather than a clipped label
21
- - **destructive confirmation:** the most fully-formed of the four — consequence and reversibility spelled out in full
22
-
23
- ## Examples
24
-
25
- - **button:** "Add collection"
26
- - **empty state (heading + motivation):** "Nothing archived yet" / "Items you archive will be kept here, in order, for as long as you need them."
27
- - **error:** "The collection couldn't be saved. Review the highlighted fields and try again."
28
- - **tooltip:** "Determines the order collections appear in for every viewer."
29
- - **confirmation:** "Collection added and ready to share."
@@ -1,29 +0,0 @@
1
- ---
2
- id: quiet-concierge
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from Shopify Polaris content fundamentals (polaris-react.shopify.com — verb-first directness, plain language, 'remove until it breaks') and Atlassian voice & tone (atlassian.design — say it once, then get out of the way)."
6
- license: open
7
- ---
8
- # Voice: quiet-concierge
9
-
10
- **Feel:** Understated and precise — says the necessary thing once, then steps back.
11
-
12
- Short-to-medium declarative sentences, verb-first for any instruction ("Add," "Move," "Archive"). Warmth comes from precision, not adjectives — no exclamation points, no stacked modifiers, no filler words ("just," "simply," "easily"). Numbers render as digits even under ten, to keep the eye moving. Contractions are allowed ("it's," "can't") to keep the register human. If a sentence can be cut without losing meaning, cut it.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** plain, verb-first, no ornament
19
- - **error:** flat statement of what happened, then the fix — no apology
20
- - **success:** states the fact and stops there
21
- - **destructive confirmation:** names exactly what's lost, in the same even register — precision is the only warning
22
-
23
- ## Examples
24
-
25
- - **button:** "Add customer"
26
- - **empty state (heading + motivation):** "No reports yet" / "Reports appear here once your first one is generated."
27
- - **error:** "The file didn't upload. Check your connection and try again."
28
- - **tooltip:** "Archives the record without deleting its history."
29
- - **confirmation:** "Customer added."
@@ -1,29 +0,0 @@
1
- ---
2
- id: warm-guide
3
- class: c2
4
- sourced: 2026-07-12
5
- source: "Distilled from the Mailchimp Content Style Guide (styleguide.mailchimp.com) — voice & tone, writing principles, web elements, and grammar & mechanics pages: plainspoken warmth, dry humor, active voice, treats users as capable partners. Mailchimp's style guide content is published under a Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0); reworded and distilled throughout, no verbatim reuse."
6
- license: licensed
7
- ---
8
- # Voice: warm-guide
9
-
10
- **Feel:** Plainspoken and warm — talks to you like a colleague who respects your time.
11
-
12
- Medium sentences in active voice, contractions throughout. One dry aside is permitted per surface, never forced. Numbers under ten are spelled out in body copy, digits in dense UI (tables, counters). Confidence over cheerleading — no "Great job!"; encouragement is implied by clarity, not stated outright. The register never talks down to the reader.
13
-
14
- ## Tone map
15
-
16
- Voice is constant; tone dials by situation.
17
-
18
- - **routine action:** relaxed, active voice, one idea per sentence
19
- - **error:** takes ownership ("we couldn't…"), calm next step, no exclamation
20
- - **success:** quietly confident, still no exclamation
21
- - **destructive confirmation:** slows down a beat, spells out what's being removed and that it can't be undone
22
-
23
- ## Examples
24
-
25
- - **button:** "Send invoice"
26
- - **empty state (heading + motivation):** "Nothing here yet" / "Once you add a project, it'll show up in this list."
27
- - **error:** "We couldn't send that invoice. Check the email address and try again."
28
- - **tooltip:** "Sends a copy to your own inbox too."
29
- - **confirmation:** "Invoice sent."
@@ -1,23 +0,0 @@
1
- # Step 4 — Compose: one mind, whole canvas
2
-
3
- Build the app — all surfaces in one continuous context, the chosen package's design.md in view throughout. This step is never decomposed into per-surface handoffs with frozen intermediate artifacts; the composing mind holds the whole canvas.
4
-
5
- ## Chrome
6
-
7
- Per the primitives switch recorded in the project's `design.md`:
8
-
9
- - **`nurix`** — compose chrome from `@nurix/components`. The chrome recipes (`data/chrome/` — read only the recipes for surfaces in the structure doc) carry composition, states, and when-to-use; the component dictionary (`components/`) carries props, imports, and usage across both provenances — consult the index for what exists, and open the touched category's API reference on need.
10
- - **`native`** — the recipes are *specifications*: anatomy, the eight states, keyboard behavior, token reach — implement them with the incumbent stack's own components. The index's shadcn/fallback columns carry the composition; category API references never load.
11
-
12
- Recipes are starting points, not jails: restyle or extend them in place when the package demands it.
13
-
14
- ## Composition rules
15
-
16
- - **Every surface starts from a chosen layout blueprint** (`data/blueprints/<archetype>.md`) — pick the shape reading the brief, record it in one line. Structural variety, not visual variety, is what reads as designed.
17
- - **Values come from the token artifact** — components consume the emitted custom properties and never invent raw values ([emission.md](emission.md) has the pipe rules). Switching packages must re-skin the whole app.
18
- - **Positive obligations apply** — load the surface's archetype checklist (`data/checklists/<archetype>.md`); the checklists are ceilings: a sidebar ships with brand block, icons, and user context; a dashboard tile ships with number + comparison + trend + state + door; every surface ships its state matrix.
19
- - **The register scope holds**: the display face never touches cells, buttons, labels, or form chrome; data numerals run the mono face with `tabular-nums`.
20
- - **Motion follows the package's §7** and the frequency law: actions performed 100+ times a day, and any keyboard-initiated action, get no animation, ever; panel/drawer motion is interruptible; entrances never `ease-in`.
21
- - **No ownership jails.** Any file may be edited at any time, including generated ones and library compositions.
22
- - **No paper-trail bureaucracy.** Decision-log lines only, through `record`; attention goes to pixels.
23
- - **A finishing pass with authority over everything is part of this step** — walk the whole canvas once at the end: rhythm, alignment, density, identity-consistency across surfaces, the one-accent discipline.
@@ -1,28 +0,0 @@
1
- # Step 3 — Content: the believable book
2
-
3
- Author the demo data **before composing surfaces**. Data credibility is the single largest scoring dimension in blind judging; this step is where builds are won.
4
-
5
- ## From the corpus
6
-
7
- Fetch the chosen domain's corpus — `search_catalog` (family `corpus`) to find it, `get_entry` to load it: the body (vocabulary, number-shape recipes, the invariants block) arrives with its `people` and `companies` rosters in one payload.
8
-
9
- - Names come from the corpus roster; emails derive from names; roles are domain-correct.
10
- - Activity strings use the corpus vocabulary — a CRM logs "Intro call with Elena — pricing discussion", never webhook noise.
11
- - Numbers follow the corpus's shape recipes (log-normal deal values, plausible deltas); dates vary around the corpus's **fixed reference instant**, never around "now".
12
- - **Acceptance is rendered plausibility against the declared invariants**: aggregates reconcile with their rows; legal ranges hold; forbidden repetition (same surname clusters, identical amounts) never shows. The ship gate checks these mechanically — author to them now.
13
- - **Edge-case rows (nulls, zeros, outliers) go only into dedicated state fixtures** (`empty*`, `degraded*`), never into the primary dataset.
14
-
15
- ## Voice
16
-
17
- Load the package-bound voice pack (`data/voices/<id>.md` — the package's §9 names it). All authored strings — buttons, empty states, errors, tooltips, confirmations — speak in that voice, with tone varying by situation per the pack's tone map.
18
-
19
- ## Chart choice
20
-
21
- Every data-bearing surface consults the chart-selection engine — **one graph question per consult**. The census ships beside the engine; nothing is fetched:
22
-
23
- 1. Author the data signature (the judgment half): the question, measures, dimensions, semantic flags (temporal, parts-form-whole, target-exists, …), constraints. Decompose multi-question asks first.
24
- 2. Run `node scripts/select-chart.mjs <signature.json>` and read the typed output: admissible set, eliminations with reason codes, ranking, recommendation, or a refusal code.
25
- 3. **Honor refusals** — a refusal means the question isn't chartable as posed (often: it's a table). Never invent a measure to force a chart.
26
- 4. `record` the pick in one line. Taking a non-recommended admissible option needs a reason on that line; taking an eliminated option is out of contract.
27
-
28
- Chart *styling* is not this step's concern — the package's §8 and the chart-styling axis own it at composition.
@@ -1,21 +0,0 @@
1
- # Package emission — design.md → token artifact
2
-
3
- One source, one derivation: the project's `design.md` is canonical; the token artifact is compiled from it and **never hand-edited**. Emit with `node scripts/validate-design-md.mjs <project design.md> --emit > design.tokens.css` (the artifact lives beside `design.md` at the repo base; the app's global stylesheet imports it). Re-emit on every design.md change; the ship gate's drift check byte-compares a fresh emission against the committed artifact.
4
-
5
- ## Coverage
6
-
7
- The artifact is complete by construction — the validator fails the design.md before emission otherwise: every one of the 36 color roles in **both** themes, the full type ramp, the elevation system, the motion base, layout dimensions. Composition consumes tokens and never invents values; switching packages re-skins the whole app.
8
-
9
- ## Emission constraints
10
-
11
- Each prevents a known silent-failure class:
12
-
13
- - **Specificity armor.** Theme blocks are `:root, :root[data-theme="light"]` and `:root[data-theme="dark"]` — both specificity (0,2,0) — so a component library's later bare `:root` block cannot silently defeat a theme.
14
- - **Font binding by derivation.** Font stacks bind to installed packages under **registered family names** (`"Inter Variable"`, not `"Inter"`), each with its declared fallback stack — otherwise the flagship font silently never renders. Install the font packages the design.md declares (e.g. Fontsource) and verify the name matches what the package registers.
15
- - **Every authored token group reaches a named consumer.** An authored ramp with no emitter vanishes without a trace — wire each group (colors → theme classes/utilities, ramp → text styles, elevation → radius/shadow utilities, motion → duration/easing vars) and let the ship gate's reach check prove it.
16
- - **Compile the emitted CSS once per change** — a stray utility string inside a CSS comment can defeat a fully green byte-level check.
17
- - **One linear precedence, later wins:** package defaults → brief bindings → recorded deviations. Values resolve at emission; the runtime cascade carries only contexts (theme, density).
18
-
19
- ## Stack neutrality
20
-
21
- The artifact is plain CSS custom properties — every stack consumes it. Under `primitives: nurix`, Tailwind maps the properties through the theme config; under `native`, the incumbent styling layer reads the same variables. No emission step is React-specific.
@@ -1,27 +0,0 @@
1
- # Improve, judge, and extract on existing apps
2
-
3
- The same machinery runs on existing UIs, under a preservation contract.
4
-
5
- ## Judge — a user-invoked service
6
-
7
- A critique of an existing UI against the brief, the project's `design.md`, the archetype checklists, and the workspace's taste profile (`get_preferences`), producing a **severity-ranked (never scored) report**. Judge is a service the user asks for — never a self-check the skill runs on its own output. Read the actual rendered state (screenshots the user provides, or captures the user asks for); refuse to critique from source alone when the ask is "does it look right", and never imagine what unrendered code looks like. Each finding: severity, the on-screen element, what's wrong, the exact fix.
8
-
9
- ## Improve — judge + the fix pass
10
-
11
- Whole-canvas authority holds, under the **preservation contract**:
12
-
13
- 1. **Pre-flight findings block** — record the incumbent system with file citations: tokens, fonts, framework, component conventions. When the product already lives on an official design system, that system is respected, never replaced. The primitives switch reads `native` on these runs unless the incumbent already uses `@nurix/components`.
14
- 2. **Preserve/introduce declaration** precedes any change: what stays, what enters, in one block.
15
- 3. **The never-silently-change list** holds regardless of authority: routes and slugs, nav labels, form field names and IDs, brand marks, legal copy. The no-jails law is about *our* generated files; a user's existing brand and IA are theirs. Changing anything on this list requires the user's explicit ask.
16
-
17
- Improve runs then proceed through the standard steps as scoped: intake (against the incumbent — the package choice may be "extract", below), structure only where surfaces change, content only where data is fake, compose with the finishing pass, and the ship gate on what was touched.
18
-
19
- ## Extract — reading an identity package out of a foreign UI
20
-
21
- A supported entry path, under **attestation and provenance**:
22
-
23
- - Record what the source is and whose it is: own product / public reference / third party.
24
- - Extract **structure and system, never pixels or assets**: roles, ramps, spacing, elevation, motion posture — into a `tier: project` design.md in the package schema, validator-checked.
25
- - Write a provenance block into the extracted file (`source-package: extracted@<date>` plus the attestation lines).
26
- - Record what **is**, never what should be — extraction is documentation, not improvement; the improve pass comes after, separately, if asked.
27
- - Admission of an extracted package into the shared roster later requires the provenance check to pass; third-party extractions stay project-local.
@@ -1,57 +0,0 @@
1
- # Foundations — the brief fixed doctrine
2
-
3
- Cross-cutting decisions every build makes once, stated at the length they deserve and no longer (the obviousness rule: what competent intelligence already knows gets nothing). Load the touched entry at the step that decides it, never the file whole.
4
-
5
- ## The five status palettes
6
-
7
- Pick **one** per project at intake and hold it everywhere — status colors are semantics, not decoration, and deltas color by *meaning* (down is green when down is good):
8
-
9
- | Palette | success | warning | danger | info | neutral | Feel |
10
- | --- | --- | --- | --- | --- | --- | --- |
11
- | `signal` | `oklch(0.64 0.15 150)` | `oklch(0.75 0.15 80)` | `oklch(0.58 0.20 25)` | `oklch(0.60 0.14 250)` | `oklch(0.65 0.02 260)` | the default — clear, saturated, unmistakable |
12
- | `muted-pro` | `oklch(0.60 0.09 155)` | `oklch(0.68 0.10 75)` | `oklch(0.55 0.13 25)` | `oklch(0.58 0.08 250)` | `oklch(0.62 0.015 260)` | desaturated for dense dashboards — readable without shouting |
13
- | `warm-ledger` | `oklch(0.62 0.11 140)` | `oklch(0.70 0.13 60)` | `oklch(0.56 0.17 30)` | `oklch(0.60 0.10 230)` | `oklch(0.64 0.02 80)` | warm-neutral products (finance, ops review) |
14
- | `cool-console` | `oklch(0.66 0.12 165)` | `oklch(0.74 0.12 85)` | `oklch(0.60 0.18 15)` | `oklch(0.62 0.12 265)` | `oklch(0.66 0.02 250)` | cool/dark consoles — holds up on deep backgrounds |
15
- | `high-contrast` | `oklch(0.55 0.17 150)` | `oklch(0.60 0.16 70)` | `oklch(0.50 0.21 27)` | `oklch(0.50 0.16 255)` | `oklch(0.50 0.02 260)` | accessibility-first; every value ≥4.5:1 on white |
16
-
17
- Each value is the light-theme anchor; derive the dark-theme sibling by raising lightness ~0.08 and trimming chroma ~0.02. Severity ladders (P0–P3 and kin) map onto danger → warning → info → neutral, never onto new hues.
18
-
19
- ## Data-viz palettes
20
-
21
- No database — three constraints, values yours: **categorical** series need distinguishable hues that survive colorblind simulation (rotate hue ≥40° apart, vary lightness too, ≤8 series then facet); **sequential** ramps run light→dark in one hue for magnitude; **diverging** ramps put two hues around a *meaningful* zero, neutral at the middle. Validate every ramp in both themes; charts consume package tokens, never raw hex.
22
-
23
- ## Number, date, unit formatting
24
-
25
- Tabular figures in tables and KPIs; thousands separators; unit or currency attached to the number; consistent decimals per column; large values truncate meaningfully (`1.2M`, never `1,200,000` in a tile); timestamps show relative when recent and absolute on hover; timezones explicit anywhere ambiguity costs money.
26
-
27
- ## Spacing & density
28
-
29
- The 2/4/6/8 scale, period. Operator surfaces default **compact** (data rows 32–36px) with a comfortable mode only when `product.md` says reading, not scanning. Density is a per-project decision made once, not a per-surface mood.
30
-
31
- ## Radius & stroke
32
-
33
- Radius is identity — sharp (0–2px), soft (4–6px), or round (10px+) — chosen by the package and applied consistently; mixing radii on one surface reads as templated. One border weight per surface; elevation *or* borders separate layers, never both at full strength.
34
-
35
- ## Loading, skeleton, progress
36
-
37
- Skeletons for layout-known loads, spinners only for unknowable ones, optimistic updates for high-frequency mutations with undo. Skeletons mirror the real layout's bones (no generic gray blocks). Nothing pulses faster than 1.2s.
38
-
39
- ## Empty states
40
-
41
- The three empties (first-use, no-results, cleared-filter) each say what happened and what to do next, in the project voice. Art direction follows the package's restraint: an icon or nothing for dense tools; illustration only where the package's feel says warm. Never a bare "No data".
42
-
43
- ## Keyboard
44
-
45
- The operator vocabulary: `⌘K` command palette, `j/k` traversal where lists dominate, `esc` closes the topmost layer only, `enter` commits, focus visible always. Declare shortcuts in a discoverable surface (palette footer or `?` overlay).
46
-
47
- ## Dark mode physics
48
-
49
- Elevation becomes lightness (surfaces lighten as they rise — shadows barely read); desaturate fills ~15%; never pure black (`oklch(0.13–0.18 …)` floors); borders drop to low-alpha white; charts re-derive from dark-theme tokens, never inherit light values.
50
-
51
- ## Code, log, terminal surfaces
52
-
53
- Mono face with `tabular-nums`; a shiki theme paired to the package (dark identity → dark code surface even in light theme is legitimate); log levels use the status palette; wrap off by default with horizontal scroll.
54
-
55
- ## Polish
56
-
57
- Focus rings on-brand (2px, offset, the accent — never browser default blue on a styled app); selection color derived from the accent at low alpha; scrollbars styled thin on dense panes; cursor changes only where affordance is real.
@@ -1,40 +0,0 @@
1
- # Step 1 — Intake: brief → recorded choices
2
-
3
- Read the brief and choose from the menus: one identity package (the design.md system), any axis overrides the brief demands, layout blueprints per surface, and the product domain for content. Every choice is one recorded line.
4
-
5
- **Returning workspace first.** If the repo carries a `workspaceId` (or the Apollo context supplies one), open with `get_preferences`: the workspace's `design.md`, `taste.md`, and `product.md` rows are the session's context — then run the drift check (compare the repo's `design.md` against the server row; on mismatch, tell the user which is newer and ask). A workspace with a recorded identity re-enters the steps with that identity already chosen; the rules below are for first intake.
6
-
7
- ## Rules
8
-
9
- - **The brief's own words outrank any database default.** "Beautiful" means the ceiling, not the safe row.
10
- - **Adjectives become referents.** When the brief speaks in adjectives ("premium", "editorial"), name the 2–3 real products the brief is pointing at and pick the package whose recorded identity sits in that class — unnamed ambition becomes beige.
11
- - **Search is a retrieval aid, never a router.** `search_catalog` (family `design_md`) with the brief's segment/keyword resemblance; shortlist 2–3 results by their head metadata (feel, reads-as, keywords), then choose reading the brief. After the choice, `get_entry` **once**: the chosen package's full design.md enters context and **stays in view through step 4**; unchosen candidates are never fetched.
12
- - **The escape hatch fires mechanically.** No catalog hit, plus a recorded one-line reason why the closest package fails → author a one-off project design.md in the package schema, `tier: project` — the validator is the schema authority and checks it like any library entry. This path is expected to be common; flag the file as a curation candidate for the roster.
13
- - **Record the identity.** First intake ends with `record`: the identity choice as a decision line, and the resolved fork pushed as the workspace's `design.md` preference row. The `workspaceId` is committed to the repo if it is not ambient. Design taste is workspace-level — an app never gets its own.
14
- - **Axis overrides fetch or read the single named entry** — color/font/gradient/chart-style overrides `get_entry` their dictionary entry; elevation/motion/iconography overrides read the named local entry under `data/`.
15
- - **Set the primitives switch** — write one `primitives: nurix | native` line into the project's `design.md`. Default by the probe: the project resolves `@nurix/components` (check package.json / lockfile / node_modules) → `nurix`; otherwise — existing apps, foreign stacks, no library access — → `native`. Set once here; nothing downstream re-asks. Also write `source-package: <slug>` (or `authored` for escape-hatch one-offs).
16
- - **Write or update `product.md`**: users and their jobs, roles/permissions, action frequency, risk level, accessibility commitments, brand anti-references. Package choice, UX decisions, motion intensity, and demo data all cite it. Push it as a preference row too — Studio shows it.
17
- - **The taste profile biases every choice** — `get_preferences` returns the workspace's `taste.md` (per-dimension feel/avoid lines); user reactions to shipped output update it via `record`. No profile yet = no bias, never a block.
18
- - **Stated-choice awareness:** if prior package picks are visible in the workspace, name them and say in one line why this pick repeats or differs — awareness, never forced rotation.
19
- - **Questions go to the user only when the answer changes the design** (theme, audience, density); everything else is inferred and marked inferred.
20
-
21
- ## The preview block
22
-
23
- Step 1 ends with a preview block:
24
-
25
- - chosen package + one-line reason
26
- - the primitives switch position
27
- - axis overrides (each: axis → entry id → one-line reason)
28
- - blueprints per surface
29
- - domain corpus
30
- - surface map with archetypes
31
- - planned deviations
32
-
33
- When a user is present, pause here **once** for confirm-or-redirect — a wrong pick costs one message now instead of a full build. Autonomous runs proceed. Either way the block goes to workspace memory — `record` it as decision lines heading this run's choices, with the app as context.
34
-
35
- ## Outputs
36
-
37
- - `design.md` (project fork: chosen package + switch line + provenance + brief bindings; deviations accrue as they are recorded) — pushed as the workspace preference row
38
- - `product.md` written/updated and pushed
39
- - the identity pin and the preview block recorded
40
- - the chosen package's full design.md held in context
@@ -1,24 +0,0 @@
1
- # Step 2 — Structure: the object pass
2
-
3
- Derive the object model and surface map using the UX-pattern decision layer (`references/ux-patterns/`). Load **one pass file at a time**, in this order, consulting only the passes the brief makes material:
4
-
5
- 1. `object-model` — the domain objects and their relationships
6
- 2. `attributes-lifecycle` — attributes, lifecycle states, history requirements
7
- 3. `verbs` — actions per object × state × role
8
- 4. `viewer-context` — how rendering changes by viewer
9
- 5. `modes` — modal contexts the product runs in
10
- 6. `promotion-demotion` — surface prominence by frequency × criticality
11
- 7. `page-archetype` — each surface's archetype from the pinned roster: **browse, queue, grid, record-detail, dashboard, creation-flow, settings**. View-types (table, board, cards, calendar) are projections of an archetype, never archetypes.
12
- 8. `container-choice` — container by workflow (duration, interruption, comparison need), never by size
13
- 9. `creation-paths` — form, import, conversion, clone, recurrence
14
- 10. `table-mechanics` — where tables project a surface
15
- 11. `state-matrix` — loading, the three empties (first-use, no-results, cleared), degraded, stale — per surface
16
- 12. `standard-pages` / `ai-layer` / `dashboards` / `settings` — when the brief has them
17
-
18
- Each pass file carries its rule as prose plus its machine-readable decision table; **follow the table's answer**. Disagreement is legitimate craft only when recorded — one `record` line naming the pass, the table's answer, yours, and why. An unrecorded divergence is the violation.
19
-
20
- When a pass fires a clarification code (an input the table needs that the brief doesn't give), resolve it: infer-and-mark when the answer doesn't change the design, ask when it does.
21
-
22
- ## Output: the structure document
23
-
24
- A single document — entities, surfaces, archetype per surface, projections, container choices, creation paths, and the state matrix per surface. It is an **input** to composition, never a jail: no file it implies is ever marked do-not-edit, and step 4 may revise it with a one-line record.