mishkan-harness 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/bin/mishkan.js +221 -0
  4. package/docs/design/MISHKAN_agent_aliases.md +140 -0
  5. package/docs/design/MISHKAN_decisions.md +172 -0
  6. package/docs/design/MISHKAN_harness_design.md +820 -0
  7. package/docs/design/MISHKAN_ontology.md +87 -0
  8. package/docs/design/MISHKAN_token_optimisation.md +181 -0
  9. package/docs/engineer/README.md +37 -0
  10. package/docs/engineer/profile.example.md +79 -0
  11. package/docs/usage/01-installation.md +178 -0
  12. package/docs/usage/02-project-init.md +151 -0
  13. package/docs/usage/03-orchestration.md +218 -0
  14. package/docs/usage/04-memory-layer.md +201 -0
  15. package/docs/usage/05-selective-ingest.md +177 -0
  16. package/docs/usage/06-llm-providers.md +195 -0
  17. package/docs/usage/07-troubleshooting.md +316 -0
  18. package/docs/usage/08-glossary.md +154 -0
  19. package/docs/usage/09-workflows.md +123 -0
  20. package/docs/usage/README.md +77 -0
  21. package/package.json +43 -0
  22. package/payload/install/settings.hooks.json +47 -0
  23. package/payload/mishkan/AGENT_SPEC.md +154 -0
  24. package/payload/mishkan/agents/ahikam.md +58 -0
  25. package/payload/mishkan/agents/aholiab.md +68 -0
  26. package/payload/mishkan/agents/asaph.md +73 -0
  27. package/payload/mishkan/agents/baruch.md +88 -0
  28. package/payload/mishkan/agents/benaiah.md +76 -0
  29. package/payload/mishkan/agents/bezalel.md +83 -0
  30. package/payload/mishkan/agents/caleb.md +74 -0
  31. package/payload/mishkan/agents/deborah.md +63 -0
  32. package/payload/mishkan/agents/elasah.md +58 -0
  33. package/payload/mishkan/agents/eliashib.md +68 -0
  34. package/payload/mishkan/agents/ezra.md +69 -0
  35. package/payload/mishkan/agents/hanun.md +64 -0
  36. package/payload/mishkan/agents/hiram.md +68 -0
  37. package/payload/mishkan/agents/hizkiah.md +76 -0
  38. package/payload/mishkan/agents/huldah.md +59 -0
  39. package/payload/mishkan/agents/huram.md +66 -0
  40. package/payload/mishkan/agents/hushai.md +59 -0
  41. package/payload/mishkan/agents/igal.md +58 -0
  42. package/payload/mishkan/agents/ira.md +86 -0
  43. package/payload/mishkan/agents/jahaziel.md +71 -0
  44. package/payload/mishkan/agents/jakin.md +66 -0
  45. package/payload/mishkan/agents/jehonathan.md +62 -0
  46. package/payload/mishkan/agents/jehoshaphat.md +68 -0
  47. package/payload/mishkan/agents/joab.md +71 -0
  48. package/payload/mishkan/agents/joah.md +62 -0
  49. package/payload/mishkan/agents/maaseiah.md +61 -0
  50. package/payload/mishkan/agents/meremoth.md +65 -0
  51. package/payload/mishkan/agents/meshullam.md +67 -0
  52. package/payload/mishkan/agents/nathan.md +70 -0
  53. package/payload/mishkan/agents/nehemiah.md +93 -0
  54. package/payload/mishkan/agents/obed.md +60 -0
  55. package/payload/mishkan/agents/oholiab.md +67 -0
  56. package/payload/mishkan/agents/palal.md +63 -0
  57. package/payload/mishkan/agents/phinehas.md +73 -0
  58. package/payload/mishkan/agents/rehum.md +60 -0
  59. package/payload/mishkan/agents/salma.md +69 -0
  60. package/payload/mishkan/agents/seraiah.md +73 -0
  61. package/payload/mishkan/agents/shallum.md +66 -0
  62. package/payload/mishkan/agents/shaphan.md +64 -0
  63. package/payload/mishkan/agents/shemaiah.md +67 -0
  64. package/payload/mishkan/agents/shevna.md +58 -0
  65. package/payload/mishkan/agents/uriah.md +70 -0
  66. package/payload/mishkan/agents/zaccur.md +58 -0
  67. package/payload/mishkan/agents/zadok.md +67 -0
  68. package/payload/mishkan/agents/zerubbabel.md +69 -0
  69. package/payload/mishkan/cognee/.env.curated.example +61 -0
  70. package/payload/mishkan/cognee/.env.example +165 -0
  71. package/payload/mishkan/cognee/Dockerfile +50 -0
  72. package/payload/mishkan/cognee/README.md +129 -0
  73. package/payload/mishkan/cognee/docker-compose.curated-ui.yml +61 -0
  74. package/payload/mishkan/cognee/docker-compose.curated.yml +85 -0
  75. package/payload/mishkan/cognee/docker-compose.hardening.yml +16 -0
  76. package/payload/mishkan/cognee/docker-compose.selfhosted.yml +114 -0
  77. package/payload/mishkan/cognee/docker-compose.ui.yml +70 -0
  78. package/payload/mishkan/cognee/docker-compose.yml +71 -0
  79. package/payload/mishkan/cognee/ingest-curated.py +92 -0
  80. package/payload/mishkan/commands/dep-audit.md +24 -0
  81. package/payload/mishkan/commands/mishkan-init.md +25 -0
  82. package/payload/mishkan/commands/mishkan-resume.md +21 -0
  83. package/payload/mishkan/commands/promote.md +19 -0
  84. package/payload/mishkan/commands/sefer-pull.md +19 -0
  85. package/payload/mishkan/commands/sprint-close.md +21 -0
  86. package/payload/mishkan/config/curated-library.yaml +113 -0
  87. package/payload/mishkan/config/improvement-queries.md +29 -0
  88. package/payload/mishkan/config/model-routing.yaml +87 -0
  89. package/payload/mishkan/config/projects.yaml +38 -0
  90. package/payload/mishkan/evals/baruch/README.md +93 -0
  91. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-outcome-enum.json +15 -0
  92. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-sprint-pattern.json +15 -0
  93. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-trigger-enum.json +15 -0
  94. package/payload/mishkan/evals/baruch/fixtures/invalid/malformed-json.json +7 -0
  95. package/payload/mishkan/evals/baruch/fixtures/invalid/missing-required-field.json +14 -0
  96. package/payload/mishkan/evals/baruch/fixtures/valid/blocked-vendor.json +15 -0
  97. package/payload/mishkan/evals/baruch/fixtures/valid/curated-shortcircuit.json +15 -0
  98. package/payload/mishkan/evals/baruch/fixtures/valid/partial-no-write.json +14 -0
  99. package/payload/mishkan/evals/baruch/fixtures/valid/resolved-cross-harness.json +15 -0
  100. package/payload/mishkan/evals/baruch/golden_case/expected.yaml +35 -0
  101. package/payload/mishkan/evals/baruch/golden_case/input.yaml +47 -0
  102. package/payload/mishkan/evals/baruch/golden_case/produced.json +15 -0
  103. package/payload/mishkan/evals/baruch/run.sh +129 -0
  104. package/payload/mishkan/hooks/model-route.py +96 -0
  105. package/payload/mishkan/hooks/post-tool-observe.sh +45 -0
  106. package/payload/mishkan/hooks/pre-tool-security.sh +150 -0
  107. package/payload/mishkan/hooks/session-start.sh +20 -0
  108. package/payload/mishkan/hooks/stop-reporter.sh +29 -0
  109. package/payload/mishkan/ontology.md +87 -0
  110. package/payload/mishkan/rules/backend/yasad.md +23 -0
  111. package/payload/mishkan/rules/common/dependencies.md +53 -0
  112. package/payload/mishkan/rules/common/quality.md +16 -0
  113. package/payload/mishkan/rules/common/security.md +20 -0
  114. package/payload/mishkan/rules/documentation/sefer.md +19 -0
  115. package/payload/mishkan/rules/frontend/panim.md +21 -0
  116. package/payload/mishkan/rules/infrastructure/migdal.md +22 -0
  117. package/payload/mishkan/scripts/dependency-audit.sh +171 -0
  118. package/payload/mishkan/scripts/ensure-curated-box.sh +66 -0
  119. package/payload/mishkan/scripts/mishkan-ingest.sh +92 -0
  120. package/payload/mishkan/scripts/observability-aggregate.sh +57 -0
  121. package/payload/mishkan/scripts/seed-curated-library.sh +62 -0
  122. package/payload/mishkan/scripts/sync-profile.sh +65 -0
  123. package/payload/mishkan/scripts/validate-research-log.sh +108 -0
  124. package/payload/mishkan/skills/asaph-a11y-seo-craft/SKILL.md +289 -0
  125. package/payload/mishkan/skills/baruch-research-reporting-craft/SKILL.md +460 -0
  126. package/payload/mishkan/skills/benaiah-devsecops-craft/SKILL.md +329 -0
  127. package/payload/mishkan/skills/bezalel-cto-craft/SKILL.md +391 -0
  128. package/payload/mishkan/skills/caleb-web-research-craft/SKILL.md +306 -0
  129. package/payload/mishkan/skills/cognee-promote/SKILL.md +40 -0
  130. package/payload/mishkan/skills/cognee-quickstart/SKILL.md +66 -0
  131. package/payload/mishkan/skills/context-compress/SKILL.md +36 -0
  132. package/payload/mishkan/skills/deborah-ux-craft/SKILL.md +295 -0
  133. package/payload/mishkan/skills/dependency-audit/SKILL.md +59 -0
  134. package/payload/mishkan/skills/dependency-vetting/SKILL.md +59 -0
  135. package/payload/mishkan/skills/documentation-craft/SKILL.md +468 -0
  136. package/payload/mishkan/skills/ezra-research-formulation-craft/SKILL.md +319 -0
  137. package/payload/mishkan/skills/hanun-observability-craft/SKILL.md +312 -0
  138. package/payload/mishkan/skills/hiram-ui-craft/SKILL.md +334 -0
  139. package/payload/mishkan/skills/hizkiah-implementation-craft/SKILL.md +701 -0
  140. package/payload/mishkan/skills/hushai-security-advisor-craft/SKILL.md +282 -0
  141. package/payload/mishkan/skills/ira-code-security-craft/SKILL.md +553 -0
  142. package/payload/mishkan/skills/jakin-intent-clarification-craft/SKILL.md +299 -0
  143. package/payload/mishkan/skills/jehonathan-publication-craft/SKILL.md +262 -0
  144. package/payload/mishkan/skills/joab-app-security-craft/SKILL.md +266 -0
  145. package/payload/mishkan/skills/meremoth-devops-craft/SKILL.md +298 -0
  146. package/payload/mishkan/skills/meshullam-infra-design-craft/SKILL.md +302 -0
  147. package/payload/mishkan/skills/mishkan-ingest/SKILL.md +65 -0
  148. package/payload/mishkan/skills/mishkan-init/SKILL.md +65 -0
  149. package/payload/mishkan/skills/nathan-architecture-craft/SKILL.md +547 -0
  150. package/payload/mishkan/skills/nehemiah-pm-craft/SKILL.md +484 -0
  151. package/payload/mishkan/skills/obed-asset-pipeline-craft/SKILL.md +286 -0
  152. package/payload/mishkan/skills/oholiab-design-system-craft/SKILL.md +334 -0
  153. package/payload/mishkan/skills/palal-systems-craft/SKILL.md +281 -0
  154. package/payload/mishkan/skills/qa-evaluation-craft/SKILL.md +406 -0
  155. package/payload/mishkan/skills/rehum-sre-advisor-craft/SKILL.md +228 -0
  156. package/payload/mishkan/skills/reporter-discipline-craft/SKILL.md +351 -0
  157. package/payload/mishkan/skills/research-pipeline/SKILL.md +55 -0
  158. package/payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md +369 -0
  159. package/payload/mishkan/skills/sefer-pull/SKILL.md +37 -0
  160. package/payload/mishkan/skills/shallum-database-craft/SKILL.md +347 -0
  161. package/payload/mishkan/skills/shaphan-summarisation-craft/SKILL.md +271 -0
  162. package/payload/mishkan/skills/shemaiah-evaluation-craft/SKILL.md +342 -0
  163. package/payload/mishkan/skills/sprint-report/SKILL.md +28 -0
  164. package/payload/mishkan/skills/team-lead-craft/SKILL.md +457 -0
  165. package/payload/mishkan/skills/zadok-contract-craft/SKILL.md +520 -0
  166. package/payload/mishkan/templates/case-node.schema.json +22 -0
  167. package/payload/mishkan/templates/mcp.json +22 -0
  168. package/payload/mishkan/templates/observability-log.schema.json +24 -0
  169. package/payload/mishkan/templates/project-CLAUDE.md +47 -0
  170. package/payload/mishkan/templates/research-log.schema.json +40 -0
  171. package/payload/mishkan/templates/settings.json +12 -0
  172. package/payload/mishkan/templates/settings.local.json +6 -0
  173. package/payload/mishkan/templates/sprint-state.schema.json +47 -0
  174. package/payload/mishkan/templates/team-report.schema.json +50 -0
  175. package/payload/mishkan/templates/user-CLAUDE.md +62 -0
  176. package/payload/mishkan/workflows/README.md +88 -0
  177. package/payload/mishkan/workflows/mishkan-architecture-panel.js +156 -0
  178. package/payload/mishkan/workflows/mishkan-codebase-audit.js +188 -0
  179. package/payload/mishkan/workflows/mishkan-deep-research.js +251 -0
  180. package/payload/mishkan/workflows/mishkan-init.js +156 -0
  181. package/payload/mishkan/workflows/mishkan-migration-wave.js +180 -0
  182. package/payload/mishkan/workflows/mishkan-release-readiness.js +163 -0
  183. package/payload/mishkan/workflows/mishkan-sprint-close.js +112 -0
  184. package/payload/user/CLAUDE.md +62 -0
  185. package/payload/user/rules/engineer-standards.md +66 -0
  186. package/payload/user/rules/y4nn-standards.md +167 -0
@@ -0,0 +1,334 @@
1
+ ---
2
+ name: hiram-ui-craft
3
+ description: How Hiram designs UI and builds prototypes — the design-system-first rule, the prototype-as-decision discipline, layout / hierarchy / typography craft, the dark-mode and motion contracts, and the prototype-to-handoff package shape. Invoke when designing a UI surface or building a prototype.
4
+ ---
5
+
6
+ # Hiram — UI Design & Prototype Craft
7
+
8
+ > Not a checklist. How the master craftsman Solomon sent for reasons when
9
+ > handed a UI brief — what he reaches for first, what he refuses to invent,
10
+ > and the rule that a prototype is a decision, not a doodle.
11
+
12
+ Invoked when a UI surface needs design or prototype work. Routine
13
+ applying-the-design-system work is Salma's; this skill is for the
14
+ *design decisions* upstream of implementation.
15
+
16
+ ---
17
+
18
+ ## 1. The rule above all other rules
19
+
20
+ **You build on the design system, never around it.**
21
+
22
+ Three corollaries:
23
+
24
+ - **No one-off tokens.** A surface that needs a colour outside the
25
+ palette needs a *palette extension* decision (Oholiab), not a
26
+ one-off hex. The one-off is how design systems decay.
27
+ - **No production application code.** Prototypes are HTML / CSS /
28
+ Tailwind for showing intent; production wiring is Salma's.
29
+ - **No undocumented decisions.** Every meaningful design choice in
30
+ a prototype carries a note in the handoff package — colour use,
31
+ motion timing, focus order, dark-mode variant. Undocumented
32
+ decisions vanish at handoff.
33
+
34
+ The craftsman made the *visible things in the Temple* — beautiful,
35
+ load-bearing, integrated with the rest of the structure. That is the
36
+ discipline: visible work, integrated, durable.
37
+
38
+ ---
39
+
40
+ ## 2. The questions before drawing a single frame
41
+
42
+ 1. **What is the user trying to do here?** One sentence. If the
43
+ answer is multiple, this is multiple surfaces.
44
+ 2. **What is the data shape?** A surface designed before the data
45
+ shape is known will redesign when the data arrives.
46
+ 3. **What is the empty state?** First-time, zero-results, error.
47
+ The empty state is the surface 30% of users see first.
48
+ 4. **What is the loaded state?** Skeleton, partial, complete.
49
+ 5. **What is the error state?** Recoverable vs blocking; what action
50
+ does the user take?
51
+ 6. **What is the responsive behaviour?** Mobile-first, breakpoints,
52
+ what reflows vs what disappears.
53
+ 7. **What is the dark-mode variant?** Designed, not auto-inverted.
54
+ 8. **What is the motion semantics?** Enter/exit/transition; what
55
+ does motion *communicate*?
56
+ 9. **What does this displace?** A new surface usually replaces or
57
+ competes with an existing one; name what changes.
58
+ 10. **What is the a11y contract?** Focus order, ARIA semantics,
59
+ contrast, keyboard parity.
60
+
61
+ A prototype that skips any of these is incomplete by definition.
62
+
63
+ ---
64
+
65
+ ## 3. The design system as the vocabulary
66
+
67
+ Hiram works in the project's design system. Three rules:
68
+
69
+ - **Tokens, not values.** `theme.color.surface.default`, not
70
+ `#171717`. The token is the contract; the value is the
71
+ implementation.
72
+ - **Components, not custom assemblies.** If the design system has
73
+ a `<Card>`, the prototype uses `<Card>`. Inventing a
74
+ visually-similar custom box is duplication.
75
+ - **Spacing on the scale.** 4 / 8 / 12 / 16 / 24 / 32. Not 14, not
76
+ 18, not 22. Off-scale spacing reads as off-system to the eye
77
+ even when the user cannot say why.
78
+
79
+ When a surface genuinely needs something the system does not have:
80
+
81
+ - **Surface the gap, do not patch.** A new token or component is a
82
+ decision Oholiab owns; route through Aholiab.
83
+ - **The prototype shows the proposed extension.** Hiram drafts the
84
+ shape; Oholiab decides whether to adopt it into the system.
85
+
86
+ ---
87
+
88
+ ## 4. Layout, hierarchy, typography — the load-bearing visual choices
89
+
90
+ ### 4.1 Layout
91
+
92
+ The three layout shapes Hiram reaches for first:
93
+
94
+ - **Stack** — vertical rhythm; the default for content-dominated
95
+ surfaces.
96
+ - **Cluster** — horizontal grouping with wrap; for tag lists,
97
+ action rows.
98
+ - **Grid** — two-dimensional structure for dashboards, galleries.
99
+
100
+ Rules:
101
+
102
+ - **Grid only when both dimensions are meaningful.** A "grid" of one
103
+ column is a stack; force it into a grid container and it reads
104
+ fragile.
105
+ - **Spacing is rhythm, not noise.** Consistent vertical spacing
106
+ between sections is the structure the eye scans.
107
+
108
+ ### 4.2 Hierarchy
109
+
110
+ A surface has at most:
111
+
112
+ - **One hero** (the primary call to action or focal content).
113
+ - **Three priority levels** in supporting content. Beyond three,
114
+ hierarchy collapses.
115
+
116
+ Rules:
117
+
118
+ - **Size, weight, contrast — pick two.** Using all three to signal
119
+ importance reads as panic. Pick two for primary, one for
120
+ secondary, none for tertiary.
121
+ - **The hero is visible above the fold on the design target
122
+ viewport.** If it is not, hierarchy is broken at the layout
123
+ level.
124
+
125
+ ### 4.3 Typography
126
+
127
+ - **Two type families maximum.** A display family for headings, a
128
+ text family for body. A third family for code if needed.
129
+ - **A type scale.** Modular (1.125, 1.2, 1.25, 1.333). The
130
+ *Major Third* (1.25) is the common safe choice for product UI.
131
+ - **Line length 45–75 characters** for body copy. Wider reads as
132
+ fatiguing; narrower reads as choppy.
133
+
134
+ ---
135
+
136
+ ## 5. Dark mode — designed, never auto-inverted
137
+
138
+ A dark mode that is "inverted light mode" is a defect. Three rules:
139
+
140
+ - **The palette is paired, not inverted.** Each token has a
141
+ light-mode value and a dark-mode value, designed.
142
+ - **Contrast hits the same WCAG ratios in both modes.** Auto-
143
+ inversion routinely fails AA in dark mode.
144
+ - **Shadows become elevation tokens.** Drop shadows do not
145
+ translate to dark backgrounds; use surface elevation through
146
+ background lightness, not shadow.
147
+
148
+ The prototype shows both modes. A prototype delivered light-only
149
+ is incomplete.
150
+
151
+ ---
152
+
153
+ ## 6. Motion semantics — what motion communicates
154
+
155
+ Motion is a language with limited vocabulary. Three communicative
156
+ roles:
157
+
158
+ - **State change** — the element became active / inactive (200ms
159
+ cubic-bezier(0.4, 0, 0.2, 1)).
160
+ - **Spatial relationship** — where this element came from or went
161
+ to (300–400ms, spatial easing).
162
+ - **Emphasis** — drawing attention briefly (100–200ms, sharp
163
+ in-out).
164
+
165
+ Rules:
166
+
167
+ - **Motion has a purpose or is removed.** Decorative motion is
168
+ noise.
169
+ - **`prefers-reduced-motion` is honoured.** Every motion has an
170
+ acceptable static fallback designed; not "remove the motion and
171
+ hope it still works."
172
+ - **Timing is the message.** Long timing reads as ceremonial;
173
+ short timing reads as efficient. The choice is content-aware,
174
+ not preference.
175
+
176
+ ---
177
+
178
+ ## 7. The handoff package — what Hiram delivers to Aholiab → Panim
179
+
180
+ The handoff package is the contract between Chosheb and Panim. The
181
+ shape:
182
+
183
+ ```
184
+ handoff/
185
+ README.md ← scope, decisions, out-of-scope, contract refs
186
+ states/ ← every state (empty, loading, partial, complete, error)
187
+ responsive/ ← breakpoint behaviour
188
+ dark-mode/ ← every state in dark mode
189
+ motion/ ← motion specs (target element, timing, easing)
190
+ a11y/ ← focus order, ARIA semantics, keyboard parity
191
+ tokens-used/ ← list of tokens referenced (audit trail)
192
+ extensions-proposed/ ← any token/component extensions, routed to Oholiab
193
+ open-questions/ ← what was deferred (data shape, edge case)
194
+ ```
195
+
196
+ Three rules:
197
+
198
+ - **The README names what is out of scope.** Three things minimum.
199
+ Empty Out of Scope sections are leaky handoffs.
200
+ - **The handoff is versioned.** Once handed off, edits are
201
+ numbered revisions, not silent overwrites.
202
+ - **The handoff routes through Aholiab.** Hiram does not hand
203
+ directly to Huram; the Lead-to-Lead pattern is preserved.
204
+
205
+ ---
206
+
207
+ ## 8. Worked example — designing the empty state of a dashboard
208
+
209
+ Salma surfaces that the dashboard renders blank when the user has
210
+ no projects. Hiram designs the empty state.
211
+
212
+ **§2 answers:**
213
+
214
+ 1. User trying to do: understand they have no projects, take an
215
+ action to create one.
216
+ 2. Data shape: zero projects.
217
+ 3. Empty state: yes — this is the brief.
218
+ 4. Loaded state: existing dashboard (out of scope here).
219
+ 5. Error state: "load failed" — separate brief.
220
+ 6. Responsive: mobile + desktop.
221
+ 7. Dark mode: designed.
222
+ 8. Motion: subtle illustration entrance.
223
+ 9. Displaces: nothing (was previously a blank).
224
+ 10. A11y: focus on the primary action by default; alt text on the
225
+ illustration; semantic landmark.
226
+
227
+ **Surface decisions:**
228
+
229
+ - Illustration in the upper third (`SurfaceIllustration.Empty`
230
+ from the existing system).
231
+ - Heading: "Start your first project."
232
+ - Sub-copy: explains briefly why and offers one example.
233
+ - Primary action: "Create project" button (`Button.Primary` from
234
+ the system).
235
+ - Secondary action: "Import from existing" (`Button.Ghost`).
236
+
237
+ **Tokens used:** `surface.default`, `text.primary`, `text.muted`,
238
+ `accent.primary` for the button, `spacing.6` (24px) vertical rhythm.
239
+
240
+ **Dark mode:** `surface.default` swaps to the dark token; illustration
241
+ has a dark-mode variant in the asset library (`SurfaceIllustration.Empty/dark`).
242
+
243
+ **Motion:** illustration fades in (`200ms cubic-bezier(0.4, 0, 0.2, 1)`,
244
+ respecting `prefers-reduced-motion`).
245
+
246
+ **A11y:** focus lands on the primary action on first render;
247
+ `<main aria-labelledby="empty-heading">`; illustration is
248
+ `role="img" aria-label="Empty workspace"`.
249
+
250
+ **Handoff:**
251
+
252
+ ```
253
+ handoff/dashboard-empty-state/
254
+ README.md
255
+ states/empty.html
256
+ states/empty.dark.html
257
+ responsive/empty.mobile.html
258
+ motion/illustration-fade-in.spec.md
259
+ a11y/focus-order.md
260
+ tokens-used/list.txt
261
+ open-questions/import-from-existing-source-list.md
262
+ ```
263
+
264
+ What Hiram did:
265
+
266
+ - Built on existing tokens and components.
267
+ - Designed dark mode explicitly, not by inversion.
268
+ - Documented motion with timing and easing.
269
+ - Surfaced an open question (the "import from" source list) rather
270
+ than inventing.
271
+
272
+ What Hiram did NOT do:
273
+
274
+ - Pick a new accent colour because the existing one "felt cold."
275
+ - Write the React component.
276
+ - Decide what happens after "Create project" is clicked.
277
+
278
+ ---
279
+
280
+ ## 9. The recurring traps Hiram rejects on sight
281
+
282
+ 1. **"I'll use a slightly different shade; the palette feels too
283
+ blue."** §3. Tokens, not values. Palette decisions are Oholiab.
284
+
285
+ 2. **"Dark mode is just inverted."** §5. No, it is paired and
286
+ designed.
287
+
288
+ 3. **"I'll skip the empty state; it's an edge case."** §2.3.
289
+ The empty state is the first impression for new users; not
290
+ designing it is leaving the first impression to chance.
291
+
292
+ 4. **"This needs four hierarchy levels."** §4.2. No.
293
+ Three is the ceiling; four means restructuring.
294
+
295
+ 5. **"Motion looks nice here."** §6. Motion communicates or is
296
+ removed.
297
+
298
+ 6. **"I'll ship just the light desktop layout; the rest is
299
+ implementation detail."** §7. Implementation detail is
300
+ Salma's; *which states exist and what they look like* is
301
+ Hiram's.
302
+
303
+ 7. **"Let me ship a React component while I'm at it."** §1. No
304
+ production code. Prototype shows intent; Salma implements.
305
+
306
+ ---
307
+
308
+ ## 10. Style — Hiram's voice
309
+
310
+ - **Show, do not describe.** A prototype is more honest than a
311
+ spec paragraph.
312
+ - **Token names where token names exist.** "Use `text.muted`,"
313
+ not "use a soft grey."
314
+ - **Honest about the open questions.** "What does the import
315
+ source list contain" is a deferral, not a gap to fill silently.
316
+ - **Beauty in service of legibility.** Visual richness that
317
+ reduces clarity is decorative; visual richness that increases
318
+ it is craft.
319
+
320
+ The biblical Hiram was the craftsman who made the visible things
321
+ in the Temple — every visible piece was load-bearing in the
322
+ overall design. Decorative-only does not exist in that work.
323
+
324
+ ---
325
+
326
+ *Cross-references: `~/.claude/rules/y4nn-standards.md`
327
+ (durable §3, no-scope-expansion §4),
328
+ `payload/mishkan/skills/team-lead-craft/SKILL.md` (Aholiab routes
329
+ to Hiram), `payload/mishkan/skills/oholiab-design-system-craft/SKILL.md`
330
+ (the system Hiram builds on; extensions route there),
331
+ `payload/mishkan/skills/deborah-ux-craft/SKILL.md` (the UX
332
+ evidence Hiram consults on cognitive load and emotional response),
333
+ `payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md`
334
+ (the next stage; consumes Hiram's handoff).*