@fugood/bricks-ctor 2.25.0-beta.5 → 2.25.0-beta.50

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 (185) hide show
  1. package/compile/__tests__/config-diff.test.js +100 -0
  2. package/compile/__tests__/index.test.js +365 -0
  3. package/compile/__tests__/util.test.js +317 -0
  4. package/compile/action-name-map.ts +64 -0
  5. package/compile/config-diff.ts +155 -0
  6. package/compile/index.ts +273 -32
  7. package/compile/util.ts +26 -7
  8. package/package.json +7 -3
  9. package/skills/bricks-ctor/SKILL.md +23 -17
  10. package/skills/bricks-ctor/{rules → references}/animation.md +3 -2
  11. package/skills/bricks-ctor/{rules → references}/architecture-patterns.md +18 -0
  12. package/skills/bricks-ctor/{rules → references}/automations.md +11 -0
  13. package/skills/bricks-ctor/references/buttress.md +245 -0
  14. package/skills/bricks-ctor/references/data-calculation.md +239 -0
  15. package/skills/bricks-ctor/references/simulator.md +132 -0
  16. package/skills/bricks-ctor/references/source-editing-tools.md +81 -0
  17. package/skills/bricks-ctor/references/verification-toolchain.md +200 -0
  18. package/skills/bricks-design/SKILL.md +150 -45
  19. package/skills/bricks-design/references/architecture-truths.md +132 -0
  20. package/skills/bricks-design/references/avoiding-complexity.md +91 -0
  21. package/skills/bricks-design/references/design-critique.md +195 -0
  22. package/skills/bricks-design/references/design-languages.md +265 -0
  23. package/skills/bricks-design/references/performance.md +116 -0
  24. package/skills/bricks-design/references/presentation-and-slideshow.md +137 -0
  25. package/skills/bricks-design/references/translating-inputs.md +152 -0
  26. package/skills/bricks-design/references/variations-and-tweaks.md +124 -0
  27. package/skills/bricks-design/references/when-the-brief-is-branded.md +284 -0
  28. package/skills/bricks-design/references/when-the-brief-is-vague.md +85 -0
  29. package/skills/bricks-design/references/workflow.md +134 -0
  30. package/skills/bricks-ux/SKILL.md +114 -0
  31. package/skills/bricks-ux/references/accessibility.md +162 -0
  32. package/skills/bricks-ux/references/flow-states.md +175 -0
  33. package/skills/bricks-ux/references/interaction-archetypes.md +189 -0
  34. package/skills/bricks-ux/references/monitoring-screens.md +153 -0
  35. package/skills/bricks-ux/references/pressable-composition.md +126 -0
  36. package/skills/bricks-ux/references/user-journey.md +168 -0
  37. package/skills/bricks-ux/references/ux-critique.md +256 -0
  38. package/tools/__tests__/_cli-error.test.ts +35 -0
  39. package/tools/_cli-error.ts +17 -0
  40. package/tools/_edits-log.ts +41 -0
  41. package/tools/_git-author.ts +10 -2
  42. package/tools/_last-pushed-commit.ts +28 -0
  43. package/tools/_shell.ts +8 -1
  44. package/tools/deploy.ts +17 -6
  45. package/tools/mcp-env.ts +13 -0
  46. package/tools/mcp-server.ts +8 -0
  47. package/tools/mcp-tools/__tests__/data-calc-editing.test.js +516 -0
  48. package/tools/mcp-tools/__tests__/entry-editing.test.js +866 -0
  49. package/tools/mcp-tools/__tests__/huggingface.test.ts +49 -0
  50. package/tools/mcp-tools/__tests__/icons.test.ts +21 -0
  51. package/tools/mcp-tools/__tests__/mcp-env.test.js +19 -0
  52. package/tools/mcp-tools/_editing-helpers.ts +58 -0
  53. package/tools/mcp-tools/_verify.ts +50 -0
  54. package/tools/mcp-tools/compile.ts +21 -9
  55. package/tools/mcp-tools/data-calc-editing.ts +1349 -0
  56. package/tools/mcp-tools/entry-editing.ts +2336 -0
  57. package/tools/mcp-tools/huggingface.ts +23 -13
  58. package/tools/mcp-tools/icons.ts +23 -7
  59. package/tools/mcp-tools/media.ts +4 -1
  60. package/tools/postinstall.ts +80 -3
  61. package/tools/pull.ts +93 -22
  62. package/tools/push-config.ts +114 -0
  63. package/tools/{preview-main.mjs → simulator-main.mjs} +207 -12
  64. package/tools/simulator-preload.cjs +16 -0
  65. package/tools/{preview.ts → simulator.ts} +4 -4
  66. package/types/{animation.ts → animation.d.ts} +24 -8
  67. package/types/{automation.ts → automation.d.ts} +16 -20
  68. package/types/{brick-base.ts → brick-base.d.ts} +1 -1
  69. package/types/bricks/{Camera.ts → Camera.d.ts} +8 -8
  70. package/types/bricks/{Chart.ts → Chart.d.ts} +4 -4
  71. package/types/bricks/{GenerativeMedia.ts → GenerativeMedia.d.ts} +15 -15
  72. package/types/bricks/{Icon.ts → Icon.d.ts} +7 -7
  73. package/types/bricks/{Image.ts → Image.d.ts} +21 -9
  74. package/types/bricks/{Items.ts → Items.d.ts} +7 -7
  75. package/types/bricks/{Lottie.ts → Lottie.d.ts} +10 -10
  76. package/types/bricks/{Maps.ts → Maps.d.ts} +11 -11
  77. package/types/bricks/{QrCode.ts → QrCode.d.ts} +7 -7
  78. package/types/bricks/{Rect.ts → Rect.d.ts} +7 -7
  79. package/types/bricks/{RichText.ts → RichText.d.ts} +12 -9
  80. package/types/bricks/{Rive.ts → Rive.d.ts} +9 -9
  81. package/types/bricks/Scene3D.d.ts +676 -0
  82. package/types/bricks/{Sketch.ts → Sketch.d.ts} +6 -6
  83. package/types/bricks/{Slideshow.ts → Slideshow.d.ts} +7 -7
  84. package/types/bricks/{Svg.ts → Svg.d.ts} +7 -7
  85. package/types/bricks/{Text.ts → Text.d.ts} +9 -9
  86. package/types/bricks/{TextInput.ts → TextInput.d.ts} +10 -10
  87. package/types/bricks/{Video.ts → Video.d.ts} +12 -12
  88. package/types/bricks/{VideoStreaming.ts → VideoStreaming.d.ts} +10 -10
  89. package/types/bricks/{WebRtcStream.ts → WebRtcStream.d.ts} +1 -1
  90. package/types/bricks/{WebView.ts → WebView.d.ts} +4 -4
  91. package/types/bricks/{index.ts → index.d.ts} +1 -0
  92. package/types/{common.ts → common.d.ts} +3 -6
  93. package/types/data-calc-command/base.d.ts +57 -0
  94. package/types/data-calc-command/collection.d.ts +418 -0
  95. package/types/data-calc-command/color.d.ts +432 -0
  96. package/types/data-calc-command/constant.d.ts +50 -0
  97. package/types/data-calc-command/datetime.d.ts +147 -0
  98. package/types/data-calc-command/file.d.ts +129 -0
  99. package/types/data-calc-command/index.d.ts +13 -0
  100. package/types/data-calc-command/iteratee.d.ts +23 -0
  101. package/types/data-calc-command/logictype.d.ts +190 -0
  102. package/types/data-calc-command/math.d.ts +275 -0
  103. package/types/data-calc-command/object.d.ts +119 -0
  104. package/types/data-calc-command/sandbox.d.ts +66 -0
  105. package/types/data-calc-command/string.d.ts +407 -0
  106. package/types/{data-calc.ts → data-calc.d.ts} +1 -0
  107. package/types/{data.ts → data.d.ts} +4 -2
  108. package/types/generators/{Assistant.ts → Assistant.d.ts} +19 -0
  109. package/types/generators/{LlmGgml.ts → LlmGgml.d.ts} +43 -1
  110. package/types/generators/{LlmMlx.ts → LlmMlx.d.ts} +1 -0
  111. package/types/generators/{RerankerGgml.ts → RerankerGgml.d.ts} +5 -1
  112. package/types/generators/{SoundRecorder.ts → SoundRecorder.d.ts} +10 -1
  113. package/types/generators/{SpeechToTextGgml.ts → SpeechToTextGgml.d.ts} +6 -1
  114. package/types/generators/{SttAppleBuiltin.ts → SttAppleBuiltin.d.ts} +27 -4
  115. package/types/generators/{ThermalPrinter.ts → ThermalPrinter.d.ts} +9 -7
  116. package/types/generators/{VadGgml.ts → VadGgml.d.ts} +12 -2
  117. package/types/{subspace.ts → subspace.d.ts} +1 -1
  118. package/utils/__tests__/calc.test.js +25 -0
  119. package/utils/__tests__/id.test.js +154 -0
  120. package/utils/calc.ts +5 -1
  121. package/utils/data.ts +5 -7
  122. package/utils/event-props.ts +17 -0
  123. package/utils/id.ts +109 -56
  124. package/skills/bricks-ctor/rules/buttress.md +0 -156
  125. package/skills/bricks-ctor/rules/data-calculation.md +0 -209
  126. package/skills/bricks-design/LICENSE.txt +0 -180
  127. package/types/data-calc-command.ts +0 -7005
  128. /package/skills/bricks-ctor/{rules → references}/local-sync.md +0 -0
  129. /package/skills/bricks-ctor/{rules → references}/media-flow.md +0 -0
  130. /package/skills/bricks-ctor/{rules → references}/remote-data-bank.md +0 -0
  131. /package/skills/bricks-ctor/{rules → references}/standby-transition.md +0 -0
  132. /package/types/{canvas.ts → canvas.d.ts} +0 -0
  133. /package/types/{data-calc-script.ts → data-calc-script.d.ts} +0 -0
  134. /package/types/generators/{AlarmClock.ts → AlarmClock.d.ts} +0 -0
  135. /package/types/generators/{BleCentral.ts → BleCentral.d.ts} +0 -0
  136. /package/types/generators/{BlePeripheral.ts → BlePeripheral.d.ts} +0 -0
  137. /package/types/generators/{CanvasMap.ts → CanvasMap.d.ts} +0 -0
  138. /package/types/generators/{CastlesPay.ts → CastlesPay.d.ts} +0 -0
  139. /package/types/generators/{DataBank.ts → DataBank.d.ts} +0 -0
  140. /package/types/generators/{File.ts → File.d.ts} +0 -0
  141. /package/types/generators/{GraphQl.ts → GraphQl.d.ts} +0 -0
  142. /package/types/generators/{Http.ts → Http.d.ts} +0 -0
  143. /package/types/generators/{HttpServer.ts → HttpServer.d.ts} +0 -0
  144. /package/types/generators/{Information.ts → Information.d.ts} +0 -0
  145. /package/types/generators/{Intent.ts → Intent.d.ts} +0 -0
  146. /package/types/generators/{Iterator.ts → Iterator.d.ts} +0 -0
  147. /package/types/generators/{Keyboard.ts → Keyboard.d.ts} +0 -0
  148. /package/types/generators/{LlmAnthropicCompat.ts → LlmAnthropicCompat.d.ts} +0 -0
  149. /package/types/generators/{LlmAppleBuiltin.ts → LlmAppleBuiltin.d.ts} +0 -0
  150. /package/types/generators/{LlmMediaTekNeuroPilot.ts → LlmMediaTekNeuroPilot.d.ts} +0 -0
  151. /package/types/generators/{LlmOnnx.ts → LlmOnnx.d.ts} +0 -0
  152. /package/types/generators/{LlmOpenAiCompat.ts → LlmOpenAiCompat.d.ts} +0 -0
  153. /package/types/generators/{LlmQualcommAiEngine.ts → LlmQualcommAiEngine.d.ts} +0 -0
  154. /package/types/generators/{Mcp.ts → Mcp.d.ts} +0 -0
  155. /package/types/generators/{McpServer.ts → McpServer.d.ts} +0 -0
  156. /package/types/generators/{MediaFlow.ts → MediaFlow.d.ts} +0 -0
  157. /package/types/generators/{MqttBroker.ts → MqttBroker.d.ts} +0 -0
  158. /package/types/generators/{MqttClient.ts → MqttClient.d.ts} +0 -0
  159. /package/types/generators/{Question.ts → Question.d.ts} +0 -0
  160. /package/types/generators/{RealtimeTranscription.ts → RealtimeTranscription.d.ts} +0 -0
  161. /package/types/generators/{SerialPort.ts → SerialPort.d.ts} +0 -0
  162. /package/types/generators/{SoundPlayer.ts → SoundPlayer.d.ts} +0 -0
  163. /package/types/generators/{SpeechToTextOnnx.ts → SpeechToTextOnnx.d.ts} +0 -0
  164. /package/types/generators/{SpeechToTextPlatform.ts → SpeechToTextPlatform.d.ts} +0 -0
  165. /package/types/generators/{SqLite.ts → SqLite.d.ts} +0 -0
  166. /package/types/generators/{Step.ts → Step.d.ts} +0 -0
  167. /package/types/generators/{Tcp.ts → Tcp.d.ts} +0 -0
  168. /package/types/generators/{TcpServer.ts → TcpServer.d.ts} +0 -0
  169. /package/types/generators/{TextToSpeechAppleBuiltin.ts → TextToSpeechAppleBuiltin.d.ts} +0 -0
  170. /package/types/generators/{TextToSpeechGgml.ts → TextToSpeechGgml.d.ts} +0 -0
  171. /package/types/generators/{TextToSpeechOnnx.ts → TextToSpeechOnnx.d.ts} +0 -0
  172. /package/types/generators/{TextToSpeechOpenAiLike.ts → TextToSpeechOpenAiLike.d.ts} +0 -0
  173. /package/types/generators/{Tick.ts → Tick.d.ts} +0 -0
  174. /package/types/generators/{Udp.ts → Udp.d.ts} +0 -0
  175. /package/types/generators/{VadOnnx.ts → VadOnnx.d.ts} +0 -0
  176. /package/types/generators/{VadTraditional.ts → VadTraditional.d.ts} +0 -0
  177. /package/types/generators/{VectorStore.ts → VectorStore.d.ts} +0 -0
  178. /package/types/generators/{Watchdog.ts → Watchdog.d.ts} +0 -0
  179. /package/types/generators/{WebCrawler.ts → WebCrawler.d.ts} +0 -0
  180. /package/types/generators/{WebRtc.ts → WebRtc.d.ts} +0 -0
  181. /package/types/generators/{WebSocket.ts → WebSocket.d.ts} +0 -0
  182. /package/types/generators/{index.ts → index.d.ts} +0 -0
  183. /package/types/{index.ts → index.d.ts} +0 -0
  184. /package/types/{switch.ts → switch.d.ts} +0 -0
  185. /package/types/{system.ts → system.d.ts} +0 -0
@@ -0,0 +1,85 @@
1
+ # When the Brief is Vague — Direction Advisor
2
+
3
+ If the brief is too open to execute ("design me a signage app", "make something for the lobby", "I don't know what kind of kiosk I want"), do not improvise on generic intuition. That's how every signage screen ends up looking like every other signage screen.
4
+
5
+ Switch into **Direction Advisor** mode. The output of this mode is *a chooser*, not a design — a small set of differentiated directions the user can pick or blend. Once they pick, drop out of Advisor mode and continue the normal workflow.
6
+
7
+ ## What "differentiated" means
8
+
9
+ Pick directions that disagree on a real axis. Three minimalist variants is not three directions; it is one direction at three opacities.
10
+
11
+ The strongest axis is **interaction archetype** — what the user *does* in front of the screen. Six archetypes:
12
+
13
+ | Archetype | The user... | Dominant Brick(s) | Generator load | Canvas count |
14
+ |---|---|---|---|---|
15
+ | Glance | reads in 1–2 seconds while passing | Slideshow, RichText, Video | Light — content fetch only | 1 |
16
+ | Browse | scans options without commitment | Items, Slideshow, Maps | Light to medium | 1–3 |
17
+ | Interact | drives a flow, taps to choose | Items, BrickRect tiles, TextInput | Light | 2–5 |
18
+ | Transact | completes a task with stakes (payment, identity) | TextInput, BrickRect, Camera, payment | Heavy — peripheral generators | 4–8 |
19
+ | Monitor | watches changing state | Chart, Items bound to live Data | Heavy — MQTT/HTTP/MCP | 1–2 |
20
+ | Dwell | inhabits the space; the screen is ambient | Video, Slideshow, Lottie | Light — looped media | 1 |
21
+
22
+ Full rule sets per archetype (what carries forward, failure modes, which UX disciplines weight strongest) live in the companion skill — see `bricks-ux/references/interaction-archetypes.md`. Use the table above to pick at Advisor time; consult the companion file when the picked archetype needs to drive structural decisions.
23
+
24
+ For most vague briefs you can spread three options across this set — e.g., "lobby screen" reasonably maps to {Glance, Dwell, Interact}, "retail aisle screen" to {Glance, Browse, Transact}, "transit platform" to {Glance, Monitor, Browse}.
25
+
26
+ You can also differentiate on:
27
+ - **Visual system** — Editorial / Cinematic / Brutalist / Soft minimalist / Maximalist. Useful when the deployment is fixed and the conversation is about expression.
28
+ - **Brick set** — what the design is *built from* (image-led / type-led / map-led / video-led / chart-led).
29
+ - **Motion language** — calm vs. cinematic vs. snappy.
30
+
31
+ But interaction archetype is the most useful starting axis because it changes the entire shape of the Subspace, not just its skin.
32
+
33
+ ## What to deliver in Advisor mode
34
+
35
+ A direction is the combination of three choices — two axes the user perceives, and one structural decision that flows from them:
36
+
37
+ - **Interaction archetype** (above) — *what the user does*. Drives Subspace structure.
38
+ - **Visual language** — *what the design says*. Drives expression: type, color, motion, signature moves, asset emphasis. Pick from the curated library in [`design-languages.md`](design-languages.md) (Swiss Editorial / Kenya Hara emptiness / Field.io motion poetics / Brutalist web / Y2K futurist-retro / etc.) or invent one rooted in the same discipline.
39
+ - **Canvas-graph shape** — when the brief reads as a presentation / pitch deck / introduction / explainer / slideshow / storyboard / demo / training-loop / kiosk-welcome, the choice between **Shape A** (Slideshow Generator — uniform layout, content-driven), **Shape B** (multi-Canvas state machine — bespoke layouts, hero continuity), and **Shape C** (hybrid) is a real direction differentiator. See [`presentation-and-slideshow.md`](presentation-and-slideshow.md). When the brief is not sequenced (single Canvas signage, dashboard, dwell loop), this collapses to "single Canvas" and isn't a real axis.
40
+
41
+ For each of 3 directions, write:
42
+
43
+ - **One-sentence pitch** combining the axes ("Glanceable signage in the Kenya Hara emptiness register — a single hero photograph holding the canvas, captions smaller than instinct demands.").
44
+ - **A real-world flagship** for the visual language (the user is unlikely to recognize an interaction archetype on its own, but they will recognize "MUJI lobby loops" or "Bloomberg Terminal").
45
+ - **3 vibe keywords**.
46
+ - **Interaction archetype + visual language pairing**, named explicitly so the user can refer back.
47
+ - **Canvas-graph shape** (only for sequenced work — Shape A / B / C).
48
+ - **Dominant Brick / Generator** the work will be built from.
49
+ - **Canvas-count shape** — single canvas / 2–3 / state machine.
50
+ - **Trade-off** — what this direction gives up.
51
+
52
+ Keep each direction to ~5 lines. The chooser is the artefact, not finished work.
53
+
54
+ **Spread across the axes.** Three directions all in the same archetype but different languages is a thin spread. Three different archetypes paired with the same language is also thin. For sequenced work, also spread across Canvas-graph shapes when it changes the user's experience meaningfully (Slideshow Generator vs multi-Canvas state machine is a different *kind* of presentation, not just a different look). Aim for at least two different archetypes and at least two different language schools across the three options.
55
+
56
+ ## The 3-cell preview
57
+
58
+ Build a lightweight preview that lets the user compare side by side:
59
+
60
+ - **Best**: 3 minimal Subspaces (one Canvas each, placeholder content, real Brick layout) loadable in `bricks-ctor` `preview`. The user can render each.
61
+ - **Good**: 3 sketches in a single Canvas — three frames within one Subspace, each labelled. Use this when speed matters more than fidelity.
62
+ - **Acceptable**: 3 hand-drawn or screenshot-style images placed as Image Bricks with captions.
63
+
64
+ Don't build full Subspaces. Direction Advisor is a 5–10 minute cycle. If you're 30 minutes in, ship what you have and let the user redirect.
65
+
66
+ ## When the user picks
67
+
68
+ Once they pick (or pick a blend):
69
+
70
+ 1. **Drop out of Advisor mode.** Stop offering alternatives. Commit.
71
+ 2. **Re-confirm deployment context.** The pick changes some assumptions (e.g., picking Transact when the deployment is no-touch is wrong; surface that and renegotiate).
72
+ 3. **Continue the normal workflow.** Declare a system, build a runnable skeleton, iterate, ship variations within the chosen direction (variants on visual / motion / content rhythm — not on archetype anymore).
73
+
74
+ ## Anti-patterns
75
+
76
+ - **Three options that all want the same archetype.** Three "elegant minimalist" variants is not a chooser. The user can't decide because the options haven't disagreed yet.
77
+ - **Naming the visual style without naming the interaction.** "Editorial / Brutalist / Soft" tells the user nothing about what they'll do in front of the screen. Lead with archetype.
78
+ - **Building all three to high fidelity.** You're spending design budget you should spend after the user picks.
79
+ - **Skipping Advisor when the brief is "kind of vague" but you have a strong opinion.** State your opinion in plain language ("I'd default to a glanceable signage loop because of the lobby context — want me to start there, or see two other options?") and let them redirect. Skipping the chooser without checking is how design budgets get burned on the wrong direction.
80
+
81
+ ## When to skip Advisor mode
82
+
83
+ - The user supplied concrete references (a Figma render, an HTML mockup, a competitor URL). The translation rules in [`translating-inputs.md`](translating-inputs.md) take over; Advisor is unnecessary.
84
+ - The brief is concrete enough to act on — specific screen, specific interaction, specific brand. Don't manufacture ambiguity.
85
+ - The user is impatient and named a clear preference. State your default and proceed; offer to revisit if they want options later.
@@ -0,0 +1,134 @@
1
+ # Workflow — questions and staged delivery
2
+
3
+ Two disciplines bundled because they're both about how the work moves through time: deciding when to ask vs. when to build, and pacing the build itself so misalignment is caught early instead of after twelve Canvases.
4
+
5
+ ## Ask vs. build
6
+
7
+ Ask when the design space has too many free variables. Build when constraints are already pinned.
8
+
9
+ **Ask** if any of these are unclear:
10
+
11
+ - Hardware / scene / network / language / brand (Priority #0 — never improvise on these).
12
+ - Fidelity expectation — rough Canvas with tokens only, fully lit single scene, or full system across all Canvases.
13
+ - Variation scope — one direction or multiple to choose from.
14
+ - Variation axes — visual language, palette, density, motion, Canvas-graph shape.
15
+ - Content provenance — does the user have copy/assets, or should you write placeholder in a declared voice?
16
+
17
+ **Build** if:
18
+
19
+ - Deployment context is concrete, brief names a recognisable shape, brand is supplied or absent-by-design.
20
+ - Reference material was supplied (Figma / HTML / screenshot / website) — translation rules in [`translating-inputs.md`](translating-inputs.md) take over; ask only the residual.
21
+ - The user named a strong preference. State your default, build, offer to revisit.
22
+
23
+ **Batch the asks.** Single round of questions, not staged. Volleys cost user momentum. Aim for 5–10 well-targeted questions per round; fewer than 3 means you're missing problem-specific depth; more than 12 means you're stalling.
24
+
25
+ ## Question playbook by axis
26
+
27
+ When you do ask, cover these axes — in one batch, omitting any already pinned:
28
+
29
+ **Deployment context** (Priority #0 — covered in SKILL.md, repeat checklist if any is missing).
30
+
31
+ **Output shape**
32
+
33
+ - Single Canvas / multi-Canvas state machine / Slideshow Generator / hybrid?
34
+ - How many Canvases roughly? (Calibrates effort, not a contract.)
35
+
36
+ **Fidelity**
37
+
38
+ - Rough skeleton with tokens declared / one fully-lit hero Canvas / full system across every Canvas?
39
+ - Is the deliverable for review, for handoff to another designer, or for direct deployment?
40
+
41
+ **Variations**
42
+
43
+ - One direction, or three to pick from?
44
+ - Axes that should vary — visual language, palette, density, motion, Canvas-graph shape, interaction archetype?
45
+ - Conservative spread or one bold option included?
46
+
47
+ **Tone and content**
48
+
49
+ - Audience for the deployed Application (passersby / customers / employees / operators / VIPs)?
50
+ - Tone register (formal / warm / playful / technical / quiet / loud)?
51
+ - Copy supplied or placeholder-in-voice?
52
+
53
+ **Problem-specific** (3–5 questions tailored to output shape — examples below):
54
+
55
+ - *Slideshow / pitch deck*: how many slides, target duration per slide, narration or silent, branching or linear, who advances (auto-timer / operator remote / interaction).
56
+ - *Kiosk / interactive*: peripherals attached, identity capture, payment terminal, queue/wait behaviour, idle reset interval.
57
+ - *Dashboard / monitor*: data sources, refresh cadence, alert thresholds, what action a viewer might take from each state.
58
+ - *Signage / glanceable*: dwell-time at the screen, day/night cycle, ambient sound, fleet vs. single-instance, content feed.
59
+
60
+ ## Staged delivery — five passes
61
+
62
+ Don't sprint to a finished Subspace. Stage the work so wrong direction is caught at the cheapest point.
63
+
64
+ ### Pass 0 — Deployment context + style declaration
65
+
66
+ Confirm Priority #0 verbatim. Write the style declaration block at the top of the Subspace file before placing any Brick:
67
+
68
+ ```ts
69
+ /**
70
+ * System: <picked design language, e.g., Swiss Editorial>
71
+ * Archetype: <interaction archetype, e.g., glance>
72
+ * Type: <font family> · <size scale in grid units, e.g., 2 / 4 / 8 / 16 gu>
73
+ * Color: <ground> on <ink> · accent <#hex> (used only for …)
74
+ * Spacing: <scale in grid units, e.g., 2 / 4 / 8 / 16 gu>
75
+ * Grid stance: lean / break / breathe
76
+ * Motion: <Standby easing + ms> entrance · <ms> exit · loops only on <element>
77
+ * Heroes: <Brick id(s) that persist across Canvases via auto-tween>
78
+ * Asset emphasis: <real photography / type-only / hero video / …>
79
+ */
80
+ ```
81
+
82
+ The grid substrate is given (Truth #6). What you commit to is type scale, palette, **spacing scale in grid units**, motion vocabulary, grid stance, and hero Bricks. The spacing scale is a small enumeration (3–5 values); inter-Brick gaps come from this set, not arbitrary integers. This block keeps the agent's arithmetic consistent across many Bricks and is what the design-critique pass cites.
83
+
84
+ ### Pass 1 — Showcase Canvas (the lockdown moment)
85
+
86
+ Build **one** Canvas, fully lit, that represents the work at its highest fidelity. Choose the hardest Canvas — the boot screen, the most content-dense state, or the moment that carries the brand most. Run through Verification (compile + screenshot + view back). Show the user.
87
+
88
+ This is the cheapest point to discover the direction is wrong. If the user wants the type bigger, the photography swapped, the rhythm slower, the language different — fix the Canvas and the style declaration, not twelve Canvases.
89
+
90
+ **Do not** build the full Canvas graph before this checkpoint. The temptation is real because state-machine work feels productive; resist it. Sign-off on one Canvas first.
91
+
92
+ ### Pass 2 — Full Canvas graph
93
+
94
+ After Pass 1 sign-off, build the remaining Canvases and the Switch / Data wiring that connects them. Hero Bricks use the same id across Canvases (Truth #3). Every visible Brick has a Standby Transition (Truth #7).
95
+
96
+ Mid-review checkpoint partway through: show the user 3–4 representative Canvases (not all of them) and the navigation flow. Caught here is still cheap. Wait until everything is finished and you've spent the budget.
97
+
98
+ ### Pass 3 — Polish, edge cases, content rhythm
99
+
100
+ Pass over every Canvas for:
101
+
102
+ - Spacing-scale adherence (every gap from the declared set).
103
+ - Density rhythm across consecutive Canvases (not three identical layouts in a row).
104
+ - Standby Transitions consistent vocabulary, not 6 different easings.
105
+ - Asset fidelity at the 5-10-2-8 bar (per `when-the-brief-is-branded.md`).
106
+ - Multilingual content fits without breaking layout, if relevant.
107
+
108
+ ### Pass 4 — Verification + self-critique
109
+
110
+ The non-negotiable Definition of done from SKILL.md plus the 5-dimension self-critique in [`design-critique.md`](design-critique.md). Compile, screenshot every Canvas, view back, critique pass, fix anything < 8 or surface as an accepted trade-off.
111
+
112
+ Only after Pass 4 do you declare done.
113
+
114
+ ## When to compress passes
115
+
116
+ Smaller deliverables don't need all five.
117
+
118
+ - **Single-Canvas glanceable signage**: Pass 0 + a one-pass build + Pass 4. Pass 1 *is* the deliverable.
119
+ - **Iterative changes on existing Subspace**: skip to the affected passes; don't re-declare the system.
120
+ - **Direction Advisor mode**: 3 lightweight Pass 1 candidates, no Pass 2/3 until the user picks.
121
+
122
+ Don't compress passes on:
123
+
124
+ - Multi-Canvas state machines (3+ Canvases).
125
+ - Anything with branding (Pass 1 lockdown catches asset-bar problems before they propagate).
126
+ - Anything with peripherals, payment, or identity (Path 2 verification mandatory in Pass 4).
127
+
128
+ ## Anti-patterns
129
+
130
+ - **Sprinting to a finished Subspace and showing it.** The user can't easily redirect a finished thing. Pass 1 is for redirection.
131
+ - **Asking one question at a time.** Burns volleys, drains user energy.
132
+ - **Asking nothing and inferring.** The five Priority #0 items are not inferrable; trying to is the most expensive mistake.
133
+ - **Declaring done after Pass 2.** Pass 4 critique is what separates "runs" from "good."
134
+ - **Re-declaring the style block on every iteration.** If you find yourself updating five values at once mid-Pass-3, you're rebuilding the system — back up to Pass 1.
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: bricks-ux
3
+ description: >-
4
+ Interaction design and end-user experience for any Application or Subspace
5
+ built on Canvases, Bricks, Generators, Data, DataCalculation. TRIGGER on
6
+ usability / flow / interaction / journey / state / affordance / feedback /
7
+ recovery / accessibility audits and design work — "audit this flow", "improve
8
+ usability", "design the wait state", "make the kiosk usable", "design the
9
+ payment flow", "design idle and attractor states", "design for multilingual /
10
+ low vision". Also triggers in parallel with visual-design work for end-to-end
11
+ deliverables (kiosk, signage, dashboard, interactive screen, pitch deck) where
12
+ interaction shape matters as much as look. SKIP for purely visual / aesthetic
13
+ / style / brand-asset / typography / palette work — that is bricks-design.
14
+ Encodes a universal user-journey spine, interaction archetypes, pressable
15
+ composition, monitoring-screen discipline, designed flow states,
16
+ accessibility, tiered UX critique; hardware floors are deployment-relative and
17
+ web habits do not transfer.
18
+ ---
19
+
20
+ # BRICKS UX
21
+
22
+ You are a BRICKS interaction designer. Your output is a **designed user journey** expressed through Canvas graphs, Brick affordances, Standby Transitions, Switch thresholds, and Data states. The deliverable is a Subspace whose interaction shape, not just its visual surface, is intentional.
23
+
24
+ Web interaction habits do not transfer. There is no hover, no scroll, no `<form>` submit, no modal-as-default, no semantic link, no document flow. Hardware varies wildly — a phone-shaped PWA, a 32" landscape kiosk, a 75" portrait signage panel, a curved retail display. **Floors and discipline are deployment-relative**; pinning pixel measurements is the wrong altitude. Express discipline in grid units, viewing distances, fractions of viewport, deployment-shape categories.
25
+
26
+ ## Priority #0 — Verify the end user
27
+
28
+ Before designing any flow, confirm:
29
+
30
+ - **Who** uses the screen — passersby, customers, employees, operators, VIPs, mixed.
31
+ - **What they're doing** in front of it — passing through, queuing, ordering, paying, monitoring, dwelling, troubleshooting.
32
+ - **What state they arrive in** — fresh / mid-task / returning / interrupted / under time pressure / under emotional pressure (payment, identity).
33
+ - **What stress they're under** — daylight glare, queue behind them, low literacy, accessibility need, multilingual mix, watchdog reset just happened.
34
+ - **How they leave** — completion, abandonment, idle timeout, peripheral disconnect, someone else taking over.
35
+
36
+ If any of the first four is missing, stop and ask in a single batch. UX without a named end user is decoration.
37
+
38
+ ## Priority #0.5 — Walk the journey end-to-end before designing
39
+
40
+ Before placing Bricks for a flow, narrate the journey step-by-step out loud in your reply. Every step gets:
41
+
42
+ - **Who's acting** — the user, the runtime, a peripheral, an operator.
43
+ - **What they see** — Canvas + dominant Bricks at that moment.
44
+ - **What they feel** — confident / hesitant / waiting / stuck / relieved.
45
+ - **What can go wrong** — including the silent failures (peripheral delay, network blip, watchdog reset, language fallback).
46
+
47
+ A flow you cannot narrate is a flow you cannot design. This step catches the missing-state cases (no in-flight visibility, no error recovery, no closure) before they ship.
48
+
49
+ ## The universal user-journey spine
50
+
51
+ Every interaction — touch, peripheral, remote, external trigger — follows the same seven steps. Skipping any of them is the most common failure mode. Full file: [`references/user-journey.md`](references/user-journey.md).
52
+
53
+ 1. **Affordance** — "Can I do something here?"
54
+ 2. **Instruction** — "What do I do?"
55
+ 3. **Immediate feedback** — "Did I do it?"
56
+ 4. **In-flight visibility** — "Is it being handled?"
57
+ 5. **Continuation** — "What's next?"
58
+ 6. **Recovery** — "What if it went wrong?"
59
+ 7. **Closure** — "When can I leave?"
60
+
61
+ This scaffold replaces device-specific recipes. QR scan, face detection, BLE proximity, NFC tap, payment, voice mic, touch — all the same seven steps, expressed through different Brick families and Generator events.
62
+
63
+ ## Interaction archetypes
64
+
65
+ The user does one of six things in front of a BRICKS screen. The archetype determines Subspace structure (Canvas count, Brick dominance, motion vocabulary, what carries forward across Canvases).
66
+
67
+ Glance · Browse · Interact · Transact · Monitor · Dwell.
68
+
69
+ Each has its own rule set, what reads as fail, and which UX disciplines weight strongest. See [`references/interaction-archetypes.md`](references/interaction-archetypes.md).
70
+
71
+ ## Flow states are first-class
72
+
73
+ Idle, loading, empty, error, attractor, boot, maintenance — these are not afterthoughts. They are states the deployment will spend real time in. A flow whose error state is a stack of red text in a corner is a flow that fails in the field. See [`references/flow-states.md`](references/flow-states.md).
74
+
75
+ ## Pressable composition
76
+
77
+ Every composite (multi-element) button needs a deliberate decision about where `on_press` sits and how overlapping press chains resolve. Pressable-capable Bricks with no press events auto-bypass at the runtime, so the trivial wrapper case works without ceremony; explicit `pressable: 'bypass'` matters when inner Bricks carry their own chains. Affordance is a UX signal — the user must be able to *see* what's pressable before discovering it by accident. See [`references/pressable-composition.md`](references/pressable-composition.md).
78
+
79
+ ## Monitoring screens have their own discipline
80
+
81
+ Calm state must be readable and forgettable. Change must be detectable without being demanding. Demand must compel response without crying wolf. Stale data is worse than no data. See [`references/monitoring-screens.md`](references/monitoring-screens.md).
82
+
83
+ ## Accessibility is non-optional, deployment-relative
84
+
85
+ Universal access is not a checkbox; it's a deployment-floor commitment. Contrast, scale, motor, reduced-motion, color-not-only, predictable navigation, audio cues — each applies at a deployment-specific floor (viewing distance, ambient light, user posture, hardware capability). See [`references/accessibility.md`](references/accessibility.md).
86
+
87
+ ## Verification — UX critique
88
+
89
+ Verification proves the flow *runs*. UX critique proves the flow is *usable*. Tiered by deployment risk (CRITICAL on transact / identity / safety-critical; HIGH on interact / monitor with alarms; MEDIUM on browse / dwell; LOW on glance / loop) with Must Have / Anti-Pattern pairs per section. See [`references/ux-critique.md`](references/ux-critique.md).
90
+
91
+ UX critique runs alongside visual-design critique (in `bricks-design`), not after. The two are concurrent; a Canvas can fail one and pass the other, and both block ship.
92
+
93
+ ## Boundaries
94
+
95
+ - Do not design flows for users not yet identified — Priority #0 must be answered first.
96
+ - Do not invent peripheral behaviour — if a peripheral's behaviour at threshold is unknown, the journey has an unsafe step; surface it before designing past it.
97
+ - Do not declare a flow done after testing only the golden path. Edge states (timeout, error, abandon, watchdog reset, peripheral disconnect) are part of the design.
98
+ - Do not import web interaction patterns — hover affordances, scroll-to-reveal, modal overlays, page-submit forms — to no-touch or peripheral-bound hardware without translation.
99
+
100
+ ## Companion skill
101
+
102
+ For visual design — type, palette, asset acquisition, design language, system commitment, visual rhythm — use `bricks-design` (companion skill). Most end-to-end briefs ("design a kiosk for X", "build a presentation about Y") invoke both in parallel.
103
+
104
+ ## Reference index
105
+
106
+ | When you need to... | Read |
107
+ |---|---|
108
+ | Walk the universal interaction journey | [`references/user-journey.md`](references/user-journey.md) |
109
+ | Pick the right interaction archetype + apply its rule set | [`references/interaction-archetypes.md`](references/interaction-archetypes.md) |
110
+ | Compose a button so taps land where intended | [`references/pressable-composition.md`](references/pressable-composition.md) |
111
+ | Design monitoring / dashboard / status-board UX | [`references/monitoring-screens.md`](references/monitoring-screens.md) |
112
+ | Design idle / loading / empty / error / attractor / boot / maintenance states | [`references/flow-states.md`](references/flow-states.md) |
113
+ | Ensure universal access at deployment-relative floors | [`references/accessibility.md`](references/accessibility.md) |
114
+ | UX critique before declaring done | [`references/ux-critique.md`](references/ux-critique.md) |
@@ -0,0 +1,162 @@
1
+ # Accessibility
2
+
3
+ Universal access is not a checkbox; it is a deployment-floor commitment. The floors themselves are **deployment-relative** — a 75" signage panel viewed at 5m has a different contrast floor than a 13" PWA at arm's length. Pinning pixel measurements is the wrong altitude; pin the principle to viewing distance, ambient light, user posture, hardware capability, and the audience that will actually be in front of the screen.
4
+
5
+ This is design discipline, not compliance citation. Standards like WCAG are useful references for ratios and thresholds; the deployment is the audit.
6
+
7
+ ## The seven disciplines
8
+
9
+ Each below is non-optional unless the brief explicitly removes the constraint (rare). Each is expressed in deployment-relative terms.
10
+
11
+ ### 1. Contrast at viewing distance
12
+
13
+ The screen must remain readable under the deployment's actual luminance conditions — direct sunlight on outdoor signage, dim lobby, fluorescent retail, surgical-theatre lighting, day-night cycles in 24-hour venues.
14
+
15
+ **Discipline:**
16
+
17
+ - Body text contrast: at viewing distance, the text must be readable to a viewer with imperfect vision. Use the deployment's worst-case ambient (peak sun for outdoor; lowest lobby level for indoor) as the calibration point.
18
+ - Critical-action elements (alarm indicators, transact-flow CTAs, way-finding directional cues): higher contrast than body, reads through glare and reflection.
19
+ - The 4.5:1 ratio (a common reference) is a *floor*, not a goal — comfortable reading on a kiosk at 1m is more like 7:1 for body, 10:1 for critical.
20
+ - Adjacent fills (a coloured Rect over a coloured ground) must also meet contrast — don't measure ink-on-ground only.
21
+ - Audit by squint test: at 25% zoom on the design preview, primary content should still be readable. If it isn't, the contrast is wrong.
22
+
23
+ **Failure modes:**
24
+
25
+ - Mid-tone-grey body text on a slightly-lighter-grey ground — reads on the designer's monitor, vanishes under the deployment's actual conditions.
26
+ - Brand-palette pastels on white grounds — pretty in a mockup, illegible on a sunlit signage panel.
27
+ - Dark-mode invert without re-balancing contrast — see `bricks-design/design-critique.md` anti-slop list.
28
+
29
+ ### 2. Scale at viewing distance
30
+
31
+ Text and pressable elements must be large enough for the deployment's actual viewing distance and user capability.
32
+
33
+ **Discipline:**
34
+
35
+ - Body text scale: pick a grid-unit height that, at deployment resolution and viewing distance, reads comfortably for the audience. A wayfinding screen for an aged audience at 3m needs body text larger than a control-room dashboard at 0.6m.
36
+ - Touch targets: on touch-enabled hardware, every pressable Brick must be large enough that an adult finger lands reliably. Children-using-it deployments scale up; gloves-on factory deployments scale up further. The 44pt-equivalent web reference is a desk-laptop floor, not a kiosk floor.
37
+ - Inter-element spacing: pressable Bricks need breathing room — accidental adjacent presses are common with single-finger interaction on dense layouts.
38
+
39
+ **Failure modes:**
40
+
41
+ - Web-default 14–16px body text on a 65" signage panel at 3m — readable only if the viewer walks up.
42
+ - Touch targets sized for mouse cursors — 32px tiles on a kiosk; thumb miss rate is high; users press the wrong tile and abandon.
43
+ - Inter-element spacing < 1 grid unit on a no-haptic-feedback touch panel — adjacent presses happen routinely.
44
+
45
+ ### 3. Color is necessary but never sufficient
46
+
47
+ Critical information (status, error, severity, success) must be encoded by *more than colour*. Colour blindness is common; viewing conditions degrade colour rendering; monochrome failover paths exist.
48
+
49
+ **Discipline:**
50
+
51
+ - Status indicators encode by **colour + shape + label**. A red diamond labelled "CRITICAL" survives where a red dot doesn't.
52
+ - Severity tiers use distinct shape vocabularies, not just hue ramps. Critical = filled, Warning = outlined, Normal = absent. Or critical = diamond, warning = triangle.
53
+ - Form validation: errors marked by colour AND icon AND positional cue (the field with the error gets a distinct outline, an icon, and an inline message — not just a red border).
54
+ - Print / screenshot / monochrome screenshot of the design should still convey the same information hierarchy.
55
+
56
+ **Failure modes:**
57
+
58
+ - Charts encoded by hue alone — multi-series charts unreadable when desaturated or for colour-blind viewers.
59
+ - Red "alarm" badge in a corner with no shape or label distinction — invisible to red-green colour-blind operators.
60
+ - Form-validation error styled only by red text — unreadable without a colour distinction the user can perceive.
61
+
62
+ ### 4. Motor allowances
63
+
64
+ Some users have reduced fine motor control. Some are using gloves. Some are children. Some have pressed the wrong tile three times and are frustrated. Design for the realistic worst case the deployment will see.
65
+
66
+ **Discipline:**
67
+
68
+ - Touch targets sized for the audience and conditions (see §2).
69
+ - No precise gestures (multi-touch, swipe-to-confirm, drag-to-amount) when the audience may include reduced-motor users. If gesture is needed, a tap alternative exists.
70
+ - Accidental-press protection on consequential actions: confirm-step for transact, undo window for destructive actions, "press twice to confirm" for irreversible operator commands.
71
+ - No time-pressure that fails the slow user. A 3-second confirmation timer that auto-cancels frustrates older users and accommodates none.
72
+
73
+ **Failure modes:**
74
+
75
+ - Swipe-to-pay as the only commit gesture — unusable for some, harder than a tap for most.
76
+ - "Press twice within 1 second" — fails users who hesitate.
77
+ - Tiny "X" close buttons on dialogs — children, gloved users, and users with tremor cannot hit them reliably.
78
+
79
+ ### 5. Reduced motion
80
+
81
+ Some users find continuous motion distressing or disorienting. Some hardware deployments (in clinical settings, in environments with motion-sickness-prone audiences) need to minimise screen motion.
82
+
83
+ **Discipline:**
84
+
85
+ - Animation that's part of the design language can be reduced via a Data flag (`reduceMotion: true`). `Animation.runType` is a literal `'once' | 'loop'` and does not accept a `DataLink`, so the flag has to drive a `Switch` (`SwitchCondData`) whose `animation` override swaps the looping slot for a non-looping Animation or omits it entirely; Standby easing is shortened the same way. The flag is a deployment-time setting, not a per-user runtime toggle (since BRICKS deployments typically don't have OS-level reduce-motion).
86
+ - Critical state changes (alarm transitions, success acknowledgement) remain animated even with reduced motion — these are functional, not decorative.
87
+ - Where motion is the design language (Field.io poetics), reduced-motion mode reframes the deployment — possibly delivers a different Subspace. Don't half-fly the motion design.
88
+
89
+ **Failure modes:**
90
+
91
+ - Continuous looped animation on every Brick — fatiguing in the best case, distressing in the worst.
92
+ - No reduced-motion path for a deployment in a clinical / safety-critical setting.
93
+ - Reduced-motion that also breaks critical state visibility (the alarm pulse silenced along with the decorative motion).
94
+
95
+ ### 6. Predictable navigation
96
+
97
+ Operators and users build mental models of where things live on the screen. Layout shifts that move primary elements between Canvases (or between states on one Canvas) destroy that mental model.
98
+
99
+ **Discipline:**
100
+
101
+ - Hero Bricks (logo, primary CTA, page indicator, time) keep position across Canvases via Truth #3 shared ids. The eye-anchor doesn't move.
102
+ - Navigation affordances (back, next, home) sit in consistent positions across Canvases.
103
+ - Error states do not relocate the user — the error appears in or near the affected element, not on a completely different Canvas that erases context.
104
+ - Idle-reset returns to the *same* idle Canvas every time, not to a variant; reliability over novelty.
105
+
106
+ **Failure modes:**
107
+
108
+ - Brand chrome that moves between Canvases — the eye lands in different places every time.
109
+ - "Back" button that moves around or disappears mid-flow.
110
+ - Idle rotation that breaks the eye-anchor — the same brand element appears at top-left, then top-right, then centre across rotation cycles.
111
+
112
+ ### 7. Audio cues (when hardware allows)
113
+
114
+ Visual is the dominant channel, but sound complements where it can. Sound becomes especially important when the user is *looking at the peripheral, not the screen* (a payment terminal, a card reader, a printer) and needs confirmation from the screen.
115
+
116
+ **Discipline:**
117
+
118
+ - Tap / press feedback: a brief audio cue (50–100ms) at the moment of registration helps users with reduced peripheral vision and confirms action when the visual feedback might be missed.
119
+ - Alarm / demand state: an audio signal with the visual change. Distinguishable from ambient music or environment.
120
+ - Success closure on transact: a short success cue when the transaction completes, especially when the user's attention is on the peripheral / receipt.
121
+ - Volume and timing aware — late-night deployments quiet, daytime louder. Schedule via Data, not hardcoded.
122
+ - Audio is never the *only* cue — pair with visual. A user wearing earphones, in a noisy environment, or hard-of-hearing must still see the change.
123
+
124
+ **Failure modes:**
125
+
126
+ - Audio cue at constant volume regardless of time of day — disruptive at 11pm, inaudible during a busy lunch rush.
127
+ - Audio-only confirmation — the user without good hearing is left guessing.
128
+ - Default OS / browser system sounds — unbranded, often jarring, dated.
129
+
130
+ ## Multilingual is an accessibility concern (for some deployments)
131
+
132
+ Where the audience speaks multiple languages, accessibility includes language access. See [`multilingual-and-rtl.md`](multilingual-and-rtl.md) when that file exists; until then:
133
+
134
+ - Strings used in the UI go through Data so a locale can be swapped (Truth #2 + critique bonus on hardcoded English).
135
+ - Type scales must accommodate the longest expected translation — German strings are often 30%+ longer than English; CJK is often shorter but with different optical density.
136
+ - RTL layouts (Arabic, Hebrew) flip at the Subspace / Canvas level — not a per-Brick CSS prop. Plan the Canvas to support flipping if RTL is in-scope.
137
+
138
+ ## Cognitive load discipline
139
+
140
+ Universal-access also covers cognitive accessibility — users who are tired, distracted, unfamiliar with the system, under stress.
141
+
142
+ **Discipline:**
143
+
144
+ - One primary action per Canvas. The user knows what they're being asked to do.
145
+ - Plain language over jargon. "Pay now" beats "Authorize transaction."
146
+ - Reading comprehension at the audience's likely level — a venue-of-the-public deployment writes at a lower grade level than a control-room console.
147
+ - Predictable patterns — same kind of action gets the same kind of affordance across the deployment.
148
+
149
+ **Failure modes:**
150
+
151
+ - Three competing CTAs on one Canvas — the user freezes choosing.
152
+ - Jargon error messages (HTTP codes, internal error names) — the user doesn't know what to do.
153
+ - Inconsistent affordance vocabulary — tiles look pressable on Canvas 1, identical tiles are decorative on Canvas 2.
154
+
155
+ ## How to use this file
156
+
157
+ 1. **Confirm the audience and conditions** as part of Priority #0. Reduced-motor users? Multilingual? Outdoor sun? Night-shift fatigue? Each shifts which disciplines weight strongest.
158
+ 2. **Apply the seven disciplines as a baseline.** Each has a deployment-relative floor; calibrate to the conditions, not to a default.
159
+ 3. **Verify at the deployment.** Path 2 (on-device DevTools, see `bricks-ctor/rules/verification-toolchain.md`) is the only way to confirm contrast under real lighting, touch-target size under real fingers, audio cue volume in real ambient.
160
+ 4. **Surface gaps in trade-off notes.** A deployment that opts out of one of the seven (e.g., audio cues skipped because the hardware is muted; reduced motion skipped because the design language IS motion) must say so explicitly in the handoff.
161
+
162
+ A design that passes visual critique but fails accessibility floors is not done. Accessibility critique runs in parallel.