aw-spec-cli 0.1.7 → 0.1.9

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 (261) hide show
  1. package/assets/.appweaver/DESIGN-FORMAT.md +200 -0
  2. package/assets/.appweaver/ORCH-DIALECT.md +156 -0
  3. package/assets/.appweaver/RULE-PARTITION.md +175 -0
  4. package/assets/.appweaver/STACK-PROFILES.md +461 -0
  5. package/assets/.appweaver/ai-rules.md +180 -0
  6. package/assets/.appweaver/domain.json +1 -0
  7. package/assets/.appweaver/extensions/.registry +19 -0
  8. package/assets/.appweaver/extensions/agent-context/README.md +57 -0
  9. package/assets/.appweaver/extensions/agent-context/agent-context-config.yml +4 -0
  10. package/assets/.appweaver/extensions/agent-context/commands/aw-spec.agent-context.update.md +26 -0
  11. package/assets/.appweaver/extensions/agent-context/extension.yml +37 -0
  12. package/assets/.appweaver/extensions/agent-context/scripts/bash/update-agent-context.sh +201 -0
  13. package/assets/.appweaver/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +237 -0
  14. package/assets/.appweaver/extensions.yml +16 -0
  15. package/assets/.appweaver/feature.json +3 -0
  16. package/assets/.appweaver/init-options.json +9 -0
  17. package/assets/.appweaver/integration.json +15 -0
  18. package/assets/.appweaver/integrations/aw-spec.manifest.json +9 -0
  19. package/assets/.appweaver/interpreter/run-skill.py +1176 -0
  20. package/assets/.appweaver/memory/constitution.md +50 -0
  21. package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +6 -0
  22. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +94 -0
  23. package/assets/.appweaver/orchestrator/README.md +300 -0
  24. package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +74 -0
  25. package/assets/.appweaver/orchestrator/adapters/google_antigravity.py +74 -0
  26. package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +105 -0
  27. package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +101 -0
  28. package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +90 -0
  29. package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +126 -0
  30. package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +123 -0
  31. package/assets/.appweaver/orchestrator/orchestrator.py +1721 -0
  32. package/assets/.appweaver/orchestrator/rev-templates/ai-rules.reference.md +40 -0
  33. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +101 -0
  34. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +245 -0
  35. package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +63 -0
  36. package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +48 -0
  37. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +59 -0
  38. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-file.skeleton.md +39 -0
  39. package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +63 -0
  40. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +116 -0
  41. package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +106 -0
  42. package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +54 -0
  43. package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +125 -0
  44. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +123 -0
  45. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +294 -0
  46. package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +160 -0
  47. package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +270 -0
  48. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +934 -0
  49. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +251 -0
  50. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +265 -0
  51. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +437 -0
  52. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +197 -0
  53. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +475 -0
  54. package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +181 -0
  55. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +727 -0
  56. package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +100 -0
  57. package/assets/.appweaver/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +69 -0
  58. package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +85 -0
  59. package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +386 -0
  60. package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +382 -0
  61. package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +462 -0
  62. package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +265 -0
  63. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +253 -0
  64. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +267 -0
  65. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +287 -0
  66. package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +238 -0
  67. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +1822 -0
  68. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +293 -0
  69. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +194 -0
  70. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +83 -0
  71. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +128 -0
  72. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +296 -0
  73. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +439 -0
  74. package/assets/.appweaver/scripts/bash/aw-inventory.sh +17 -0
  75. package/assets/.appweaver/scripts/bash/aw-parity.sh +13 -0
  76. package/assets/.appweaver/scripts/bash/aw-rev-constitution.sh +13 -0
  77. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2626 -0
  78. package/assets/.appweaver/scripts/bash/aw-xref.sh +15 -0
  79. package/assets/.appweaver/scripts/bash/common.sh +533 -0
  80. package/assets/.appweaver/scripts/powershell/aw-inventory.ps1 +17 -0
  81. package/assets/.appweaver/scripts/powershell/aw-parity.ps1 +13 -0
  82. package/assets/.appweaver/scripts/powershell/aw-rev-constitution.ps1 +13 -0
  83. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +2232 -0
  84. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +15 -0
  85. package/assets/.appweaver/scripts/python/aw-component-catalog.py +121 -0
  86. package/assets/.appweaver/scripts/python/aw-inventory.py +1180 -0
  87. package/assets/.appweaver/scripts/python/aw-parity.py +380 -0
  88. package/assets/.appweaver/scripts/python/aw-rev-constitution.py +329 -0
  89. package/assets/.appweaver/scripts/python/aw-stack.py +1251 -0
  90. package/assets/.appweaver/scripts/python/aw-xref.py +1330 -0
  91. package/assets/.appweaver/scripts/python/validate_okf.py +352 -0
  92. package/assets/.appweaver/stack-profiles/angular.json +16 -0
  93. package/assets/.appweaver/stack-profiles/blazor-wasm.json +17 -0
  94. package/assets/.appweaver/stack-profiles/dotnet-webapi.json +15 -0
  95. package/assets/.appweaver/stack-profiles/go-chi.json +14 -0
  96. package/assets/.appweaver/stack-profiles/java-spring.json +16 -0
  97. package/assets/.appweaver/stack-profiles/nextjs.json +16 -0
  98. package/assets/.appweaver/stack-profiles/node-express.json +15 -0
  99. package/assets/.appweaver/stack-profiles/python-fastapi.json +16 -0
  100. package/assets/.appweaver/stack-profiles/react-vite.json +17 -0
  101. package/assets/.appweaver/stack-profiles/sveltekit.json +16 -0
  102. package/assets/.appweaver/stack-profiles/vue-vite.json +17 -0
  103. package/assets/.appweaver/stacks.json +3 -0
  104. package/assets/.appweaver/templates/constitution-domain-template.md +116 -0
  105. package/assets/.appweaver/templates/constitution-technical-template.md +108 -0
  106. package/assets/.appweaver/templates/constitution-ui-template.md +116 -0
  107. package/assets/.appweaver/templates/delta-design-template.md +69 -0
  108. package/assets/.appweaver/templates/delta-spec-template.md +63 -0
  109. package/assets/.appweaver/templates/design-template.md +383 -0
  110. package/assets/.appweaver/templates/okf-concept-template.md +114 -0
  111. package/assets/.appweaver/templates/parity-manifest-template.json +49 -0
  112. package/assets/.appweaver/templates/source-map-template.md +85 -0
  113. package/assets/.appweaver/templates/spec-template.md +309 -0
  114. package/assets/.appweaver/templates/ui-design-template.md +273 -0
  115. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.pack.txt +25248 -0
  116. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.pack.txt +5726 -0
  117. package/assets/foundations/dotnet/ModularMonolith/pack-foundation.ps1 +145 -0
  118. package/assets/foundations/dotnet/ModularMonolith/pack-foundation.sh +196 -0
  119. package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.ps1 +157 -0
  120. package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.sh +209 -0
  121. package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.ps1 +126 -0
  122. package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.sh +217 -0
  123. package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.ps1 +129 -0
  124. package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.sh +218 -0
  125. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.pack.txt +19318 -0
  126. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.pack.txt +2833 -0
  127. package/assets/foundations/dotnet/VerticalSlice/pack-foundation.ps1 +145 -0
  128. package/assets/foundations/dotnet/VerticalSlice/pack-foundation.sh +196 -0
  129. package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.ps1 +157 -0
  130. package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.sh +209 -0
  131. package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.ps1 +126 -0
  132. package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.sh +217 -0
  133. package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.ps1 +129 -0
  134. package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.sh +218 -0
  135. package/assets/foundations/dotnet/components/Email/README.md +119 -0
  136. package/assets/foundations/dotnet/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +84 -0
  137. package/assets/foundations/dotnet/components/Email/integration.md +300 -0
  138. package/assets/foundations/dotnet/components/Jobs/README.md +113 -0
  139. package/assets/foundations/dotnet/components/Jobs/integration.md +259 -0
  140. package/assets/foundations/dotnet/components/QrGenerator/README.md +85 -0
  141. package/assets/foundations/dotnet/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +57 -0
  142. package/assets/foundations/dotnet/components/QrGenerator/integration.md +230 -0
  143. package/assets/foundations/dotnet/components/README.md +74 -0
  144. package/assets/guardrails/README.md +222 -0
  145. package/assets/guardrails/domain/healthcare/ai-rules.domain.md +34 -0
  146. package/assets/guardrails/domain/healthcare/api-versioning.domain.md +17 -0
  147. package/assets/guardrails/domain/healthcare/auditing.domain.md +97 -0
  148. package/assets/guardrails/domain/healthcare/authorization.domain.md +26 -0
  149. package/assets/guardrails/domain/healthcare/clinical-terms.md +20 -0
  150. package/assets/guardrails/domain/healthcare/coding-standards.domain.md +26 -0
  151. package/assets/guardrails/domain/healthcare/consent.md +19 -0
  152. package/assets/guardrails/domain/healthcare/cqrs.domain.md +12 -0
  153. package/assets/guardrails/domain/healthcare/data-classification.domain.md +28 -0
  154. package/assets/guardrails/domain/healthcare/dependency-policy.domain.md +11 -0
  155. package/assets/guardrails/domain/healthcare/dicom.md +15 -0
  156. package/assets/guardrails/domain/healthcare/domain-constitution.md +119 -0
  157. package/assets/guardrails/domain/healthcare/domain-driven-design.domain.md +28 -0
  158. package/assets/guardrails/domain/healthcare/eventing.domain.md +18 -0
  159. package/assets/guardrails/domain/healthcare/fhir.md +36 -0
  160. package/assets/guardrails/domain/healthcare/folder-structure.domain.md +25 -0
  161. package/assets/guardrails/domain/healthcare/hipaa.md +34 -0
  162. package/assets/guardrails/domain/healthcare/hl7.md +15 -0
  163. package/assets/guardrails/domain/healthcare/ihe-conformance.md +31 -0
  164. package/assets/guardrails/domain/healthcare/integration-terms.md +21 -0
  165. package/assets/guardrails/domain/healthcare/persistence.domain.md +20 -0
  166. package/assets/guardrails/domain/healthcare/terminology.md +30 -0
  167. package/assets/guardrails/domain/healthcare/testing.domain.md +15 -0
  168. package/assets/guardrails/domain/healthcare/ux/accessibility-standards.md +36 -0
  169. package/assets/guardrails/domain/healthcare/ux/content-design.md +32 -0
  170. package/assets/guardrails/domain/healthcare/ux/interaction-states.md +44 -0
  171. package/assets/guardrails/domain/healthcare/ux/journey-mapping.md +40 -0
  172. package/assets/guardrails/domain/healthcare/vertical-slices.domain.md +18 -0
  173. package/assets/guardrails/domain/healthcare/zero-trust.domain.md +12 -0
  174. package/assets/guardrails/domain/pharma/ai-rules.domain.md +32 -0
  175. package/assets/guardrails/domain/pharma/api-versioning.domain.md +20 -0
  176. package/assets/guardrails/domain/pharma/atc.md +22 -0
  177. package/assets/guardrails/domain/pharma/auditing.domain.md +90 -0
  178. package/assets/guardrails/domain/pharma/authorization.domain.md +25 -0
  179. package/assets/guardrails/domain/pharma/coding-standards.domain.md +28 -0
  180. package/assets/guardrails/domain/pharma/cqrs.domain.md +16 -0
  181. package/assets/guardrails/domain/pharma/data-classification.domain.md +24 -0
  182. package/assets/guardrails/domain/pharma/data-provenance.md +21 -0
  183. package/assets/guardrails/domain/pharma/dependency-policy.domain.md +11 -0
  184. package/assets/guardrails/domain/pharma/domain-constitution.md +113 -0
  185. package/assets/guardrails/domain/pharma/domain-driven-design.domain.md +36 -0
  186. package/assets/guardrails/domain/pharma/domain-requirements.sample.md +103 -0
  187. package/assets/guardrails/domain/pharma/eventing.domain.md +18 -0
  188. package/assets/guardrails/domain/pharma/fhir.md +31 -0
  189. package/assets/guardrails/domain/pharma/folder-structure.domain.md +26 -0
  190. package/assets/guardrails/domain/pharma/hl7.md +17 -0
  191. package/assets/guardrails/domain/pharma/idmp.md +26 -0
  192. package/assets/guardrails/domain/pharma/integration-terms.md +21 -0
  193. package/assets/guardrails/domain/pharma/ndc.md +28 -0
  194. package/assets/guardrails/domain/pharma/persistence.domain.md +23 -0
  195. package/assets/guardrails/domain/pharma/pharma-terms.md +27 -0
  196. package/assets/guardrails/domain/pharma/product-lifecycle.domain.md +30 -0
  197. package/assets/guardrails/domain/pharma/regulatory-compliance.md +19 -0
  198. package/assets/guardrails/domain/pharma/terminology.md +32 -0
  199. package/assets/guardrails/domain/pharma/testing.domain.md +19 -0
  200. package/assets/guardrails/domain/pharma/vertical-slices.domain.md +17 -0
  201. package/assets/guardrails/domain/pharma/zero-trust.domain.md +12 -0
  202. package/assets/guardrails/projects/dotnet-default-project/domain/domain-requirements.md +58 -0
  203. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +113 -0
  204. package/assets/guardrails/projects/dotnet-default-project/frontend/ui-requirements.md +43 -0
  205. package/assets/guardrails/projects/dotnet-default-project/service/technical-requirements.md +40 -0
  206. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +263 -0
  207. package/assets/guardrails/requirement-spec.txt +27 -0
  208. package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +184 -0
  209. package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +44 -0
  210. package/assets/guardrails/technology/dotnet-webapi/auditing.md +96 -0
  211. package/assets/guardrails/technology/dotnet-webapi/authorization-matrix.md +14 -0
  212. package/assets/guardrails/technology/dotnet-webapi/authorization.md +39 -0
  213. package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +54 -0
  214. package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +87 -0
  215. package/assets/guardrails/technology/dotnet-webapi/cqrs.md +63 -0
  216. package/assets/guardrails/technology/dotnet-webapi/data-classification.md +38 -0
  217. package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +40 -0
  218. package/assets/guardrails/technology/dotnet-webapi/domain-driven-design.md +91 -0
  219. package/assets/guardrails/technology/dotnet-webapi/eventing.md +57 -0
  220. package/assets/guardrails/technology/dotnet-webapi/examples/api-versioning.md +75 -0
  221. package/assets/guardrails/technology/dotnet-webapi/examples/auditing.md +84 -0
  222. package/assets/guardrails/technology/dotnet-webapi/examples/authorization.md +68 -0
  223. package/assets/guardrails/technology/dotnet-webapi/examples/clean-architecture.md +37 -0
  224. package/assets/guardrails/technology/dotnet-webapi/examples/cqrs.md +97 -0
  225. package/assets/guardrails/technology/dotnet-webapi/examples/domain-driven-design.md +141 -0
  226. package/assets/guardrails/technology/dotnet-webapi/examples/eventing.md +46 -0
  227. package/assets/guardrails/technology/dotnet-webapi/examples/persistence.md +207 -0
  228. package/assets/guardrails/technology/dotnet-webapi/examples/vertical-slices.md +151 -0
  229. package/assets/guardrails/technology/dotnet-webapi/examples/zero-trust.md +48 -0
  230. package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +61 -0
  231. package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +47 -0
  232. package/assets/guardrails/technology/dotnet-webapi/persistence.md +82 -0
  233. package/assets/guardrails/technology/dotnet-webapi/technology-constitution.md +162 -0
  234. package/assets/guardrails/technology/dotnet-webapi/testing.md +55 -0
  235. package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +70 -0
  236. package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +48 -0
  237. package/assets/guardrails/technology/java-spring/README.md +62 -0
  238. package/assets/guardrails/technology/nextjs/accessibility-implementation.md +56 -0
  239. package/assets/guardrails/technology/nextjs/api-client.md +56 -0
  240. package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +174 -0
  241. package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +203 -0
  242. package/assets/guardrails/technology/nextjs/auth-session.md +68 -0
  243. package/assets/guardrails/technology/nextjs/client-security.md +69 -0
  244. package/assets/guardrails/technology/nextjs/component-architecture.md +60 -0
  245. package/assets/guardrails/technology/nextjs/component-conventions.md +58 -0
  246. package/assets/guardrails/technology/nextjs/design-system.md +60 -0
  247. package/assets/guardrails/technology/nextjs/error-handling.md +72 -0
  248. package/assets/guardrails/technology/nextjs/forms-and-validation.md +75 -0
  249. package/assets/guardrails/technology/nextjs/frontend-testing.md +94 -0
  250. package/assets/guardrails/technology/nextjs/i18n.md +57 -0
  251. package/assets/guardrails/technology/nextjs/observability.md +67 -0
  252. package/assets/guardrails/technology/nextjs/performance-budgets.md +66 -0
  253. package/assets/guardrails/technology/nextjs/routing-navigation.md +52 -0
  254. package/assets/guardrails/technology/nextjs/state-management.md +70 -0
  255. package/assets/guardrails/technology/nextjs/ui-constitution.md +166 -0
  256. package/dist/commands/init.js +2 -2
  257. package/dist/commands/init.js.map +1 -1
  258. package/dist/utils/copy-assets.js +8 -8
  259. package/dist/utils/copy-assets.js.map +1 -1
  260. package/package.json +1 -1
  261. package/assets/docs/pharma-constitution.my-ref.md +0 -86
@@ -0,0 +1,309 @@
1
+ # Specification: [AGGREGATE]
2
+
3
+ **Aggregate (feature)**: `[Aggregate]` <!-- the feature = the aggregate, e.g. Order -->
4
+
5
+ **Spec home**: `specs/[Aggregate]/`
6
+
7
+ **Version**: v1.0 <!-- living truth; every applied change request bumps this — see Change History -->
8
+
9
+ **Status**: Draft
10
+
11
+ **Input**: User description: "$ARGUMENTS"
12
+
13
+ <!--
14
+ AGGREGATE = FEATURE. This spec covers ONE aggregate (e.g. Order) and is the
15
+ single LIVING source of truth for its whole lifecycle. Every operation on it
16
+ (CreateOrder, UpdateOrder, …) is a USER STORY below — NOT a separate feature.
17
+ A later requirement is a new US-n added here as a delta (see .appweaver/changes/
18
+ and delta-spec-template.md), never a new spec folder. One spec + one design.md
19
+ (specs/[Aggregate]/design.md) — the DESIGN derives from THIS document.
20
+
21
+ Section order is intentional: establish the business need and scope, then the
22
+ stable core the aggregate IS (requirements → rules → constraints → entities →
23
+ data classification → integration contracts → experience standards → edge cases),
24
+ then the prioritized user journeys that exercise it, then measurable success.
25
+
26
+ LIFTS (specify's job): four sections carry governance INTO the spec, because every
27
+ later phase authors from the spec ONLY and anything not captured here never reaches
28
+ it. Three lift the DOMAIN rules — Constraints & NFRs (CN-), Data Classification
29
+ (DC-), Integration Contracts (IC-). The fourth, Experience Standards (UX-), lifts
30
+ the frontend lane's constitution and its ux/ rules, and is what the UI lane authors
31
+ and verifies against. Fill each when its rules apply; keep it (empty → "None")
32
+ otherwise — the section is always present, only its content is conditional.
33
+ -->
34
+
35
+ ## Business Need
36
+
37
+ <!--
38
+ ACTION REQUIRED: Why this aggregate exists — the problem, the affected users,
39
+ and the value delivered. Business-facing; no implementation detail.
40
+ -->
41
+
42
+ [The problem this aggregate solves, who it serves, and the value it delivers.]
43
+
44
+ ## Scope & Assumptions
45
+
46
+ ### Aggregate Boundary
47
+
48
+ <!--
49
+ The aggregate = the largest slice whose code no other feature owns. State what
50
+ it OWNS, what it only REFERENCES (by identifier, not owned), and what is out of
51
+ scope. This anchors the design's "dependencies point inward" and keeps commands
52
+ as deltas on THIS aggregate rather than new features.
53
+ -->
54
+
55
+ - **Owns**: [entities/behaviour inside this aggregate — e.g. Order, OrderLine]
56
+ - **References (by id, not owned)**: [Customer, Product — read-only / by identifier]
57
+ - **Out of scope / non-goals**: [explicitly excluded — e.g. payment settlement, shipping]
58
+
59
+ ### Assumptions
60
+
61
+ <!--
62
+ Reasonable defaults chosen where the description was silent, plus dependencies
63
+ on existing systems/services.
64
+ -->
65
+
66
+ - [Assumption about target users, e.g., "Users have stable internet connectivity"]
67
+ - [Assumption about scope, e.g., "Mobile support is out of scope for v1"]
68
+ - [Dependency on an existing system/service, e.g., "Requires the existing user-profile API"]
69
+
70
+ ### Experience Scope
71
+
72
+ <!--
73
+ The experience envelope this aggregate is specified against: WHO reaches it through a
74
+ UI, THROUGH WHAT, and the floor the frontend lane has to hold. Scope, not requirement —
75
+ it bounds what the Experience Standards and the prototype are held to, and it is the
76
+ only place the spec describes the delivery surface at all.
77
+
78
+ NOT SCREENS. No pages, layouts, navigation, components or visual design — those are
79
+ realisation decisions owned by the prototype and design.ui.md, and putting them here
80
+ would break the WHAT/HOW line the whole kit rests on.
81
+
82
+ Lifted with the Experience Standards below, from the frontend lane's constitution
83
+ (constitution.ui.md) and the mapped ux/ rules. A project with no frontend lane has no
84
+ surface to bound: write "None (as of vX.Y)" — never delete the section.
85
+ -->
86
+
87
+ - **Actors**: [the user roles that reach this aggregate through a UI — e.g. clinician, scheduler; distinct from a system/API caller]
88
+ - **Channels**: [where the experience is delivered — e.g. responsive web; internal back-office only]
89
+ - **Device / viewport floor**: [the smallest supported surface — e.g. 360 px wide]
90
+ - **Browser / platform floor**: [the oldest supported targets — e.g. the last two major versions of evergreen browsers]
91
+ - **Assistive-technology floor**: [the input modes and readers that MUST work — e.g. keyboard-only; NVDA + VoiceOver]
92
+
93
+ ## System Requirements *(mandatory)*
94
+
95
+ <!--
96
+ Functional requirements in EARS notation (Easy Approach to Requirements Syntax):
97
+ atomic, testable, unambiguous. Choose the pattern that fits each requirement —
98
+
99
+ • Ubiquitous THE SYSTEM SHALL <requirement>
100
+ • Event-driven WHEN <trigger> THE SYSTEM SHALL <response>
101
+ • State-driven WHILE <in a state> THE SYSTEM SHALL <response>
102
+ • Unwanted IF <condition/error> THEN THE SYSTEM SHALL <response>
103
+ • Optional WHERE <feature is present> THE SYSTEM SHALL <response>
104
+
105
+ Give each a STABLE id (FR-001, …) — design sections and code trace to these ids.
106
+ Mark genuine unknowns "[NEEDS CLARIFICATION: <question>]" (≤3; scope/UX/security
107
+ only, and only where no reasonable default exists).
108
+ -->
109
+
110
+ - **FR-001**: WHEN [a customer submits an order] THE SYSTEM SHALL [create it in Draft state].
111
+ - **FR-002**: THE SYSTEM SHALL [persist every order under a unique identifier].
112
+ - **FR-003**: IF [the order has no line items] THEN THE SYSTEM SHALL [reject the submission].
113
+ - **FR-004**: WHILE [an order is in Draft] THE SYSTEM SHALL [allow line items to be added or removed].
114
+ - **FR-005**: WHERE [tax calculation is enabled] THE SYSTEM SHALL [apply the regional tax rule].
115
+
116
+ ## Business Rules *(invariants — always true, technology-agnostic)*
117
+
118
+ <!--
119
+ ACTION REQUIRED: Constraints that must ALWAYS hold for the aggregate, independent
120
+ of any single operation. These become the design's §Domain invariants and must be
121
+ enforceable and testable. Give each a STABLE id (BR-001, …).
122
+ -->
123
+
124
+ - **BR-001**: [An order's total MUST never be negative.]
125
+ - **BR-002**: [A submitted order MUST always have at least one line item.]
126
+ - **BR-003**: [An order's identifier is immutable once created.]
127
+
128
+ ## Constraints & Non-Functional Requirements *(domain lift — CN)*
129
+
130
+ <!--
131
+ ACTION REQUIRED (when the domain applies; else "None (as of vX.Y)"). Constraints the
132
+ aggregate MUST satisfy that are NEITHER functional behaviour (those are FR) NOR
133
+ always-true business invariants (those are BR): the regulatory, retention,
134
+ immutability, audit-mandate, and performance-as-a-limit rules. Many are LIFTED here
135
+ by specify from the domain rule files (e.g. persistence.domain, auditing.domain,
136
+ data-classification.domain) so they survive into design — which reads the spec ONLY.
137
+ Give each a STABLE id (CN-001, …); design's §5 Cross-Cutting and the analyze gate
138
+ trace to these ids. State each as testable; where lifted, cite the source rule.
139
+ -->
140
+
141
+ - **CN-001**: [Retention — e.g. submitted orders + their audit trail are retained for [period] per [policy]; hard delete is forbidden once submitted (logical/retire only). — lifted from persistence.domain]
142
+ - **CN-002**: [Audit immutability — e.g. every create/modify/cancel emits an append-only audit entry (User, Timestamp, Action, Previous, New). — lifted from auditing.domain]
143
+ - **CN-003**: [Data integrity — e.g. records subject to [regime] satisfy [integrity standard].]
144
+ - **CN-004**: [Performance-as-a-limit — e.g. P95 read latency < 200 ms at 200 RPS; not a behaviour, a bound.]
145
+
146
+ ## Key Entities *(the aggregate's conceptual model — no implementation detail)*
147
+
148
+ <!--
149
+ The aggregate root and the entities/value objects inside its boundary: what each
150
+ represents, its key attributes, lifecycle/states, and relationships. Reference to
151
+ OTHER aggregates is by identifier only (see Aggregate Boundary).
152
+ -->
153
+
154
+ - **[Aggregate root — e.g. Order]**: [what it represents; key attributes; lifecycle/states, e.g. Draft → Submitted → Fulfilled]
155
+ - **[Entity / value object — e.g. OrderLine]**: [what it represents; relationship to the root]
156
+
157
+ ## Data Classification *(domain lift — DC)*
158
+
159
+ <!--
160
+ ACTION REQUIRED (when the aggregate handles sensitive data; else "None (as of vX.Y)").
161
+ The sensitivity taxonomy for this aggregate's data and the exposure rules that follow:
162
+ which categories exist, which Key-Entity fields fall in each, and where each category
163
+ MAY / MUST NOT appear (public API surface, logs, metrics, traces, external projections).
164
+ Lifted by specify from the domain data-classification rules. Design enforces these; the
165
+ analyze-design / analyze-slice gates check them. Give each a STABLE id (DC-001, …); reference fields by
166
+ the names used in Key Entities.
167
+ -->
168
+
169
+ | id | Category | Applies to (fields / entities) | Exposure rule |
170
+ |---|---|---|---|
171
+ | DC-001 | [Public] | [id, status, non-sensitive attributes] | [may appear on the public API + external projections] |
172
+ | DC-002 | [Sensitive / restricted] | [PII, pre-release, commercially-sensitive fields] | [MUST NOT appear on the public surface, nor in logs / metrics / traces] |
173
+ | DC-003 | [Externally-sourced] | [imported fields] | [carries provenance; [handling rule]] |
174
+
175
+ ## Integration Contracts *(domain lift — IC)*
176
+
177
+ <!--
178
+ ACTION REQUIRED (when the aggregate interoperates; else "None (as of vX.Y)"). The
179
+ external contracts this aggregate MUST satisfy — interoperability obligations lifted by
180
+ specify from the domain interop rules (e.g. FHIR/HL7/DICOM projections, terminology
181
+ services, inbound feeds). State each at CONTRACT level: which standard, which resources,
182
+ direction (inbound/outbound), projection vs system-of-record — NOT the adapter design
183
+ (design realises these in its API / Infrastructure layers). Give each a STABLE id
184
+ (IC-001, …); design's §4.2 External Integrations traces to these ids.
185
+ -->
186
+
187
+ - **IC-001**: [Outbound projection — e.g. the aggregate SHALL project to [external standard / resources] as read-only projections (not the system of record); identifiers map to [external identifier]; coded fields to [coded type].]
188
+ - **IC-002**: [Reference-data validation — e.g. coded values SHALL validate against [terminology / reference service]; no invented codes.]
189
+ - **IC-003**: [Inbound feed — e.g. inbound [feed/standard] SHALL flow through an Interop adapter, never a direct write path to the aggregate.]
190
+
191
+ ## Experience Standards *(experience lift — UX)*
192
+
193
+ <!--
194
+ ACTION REQUIRED (when the frontend lane's rules apply; else "None (as of vX.Y)").
195
+ The PROJECT-WIDE experience standards this aggregate's UI must satisfy, lifted here by
196
+ specify out of the frontend lane's constitution (constitution.ui.md — the UX-* principle
197
+ series) and the mapped ux/ rule files, exactly as CN-/DC-/IC- lift the domain rules.
198
+ The lift is what makes them binding: prototype, ui-design and ui-implement author from
199
+ the SPEC and never from the rule files, so a standard not carried here reaches no UI
200
+ phase and is gated by nothing.
201
+
202
+ HIGH-LEVEL AND PROJECT-WIDE ONLY. Each entry is a standard the whole product holds to,
203
+ stated so it can be checked on ANY surface — never a screen, page, layout, navigation
204
+ model, component or visual-design choice. Those are the prototype's and design.ui.md's
205
+ to settle. An entry that can be satisfied only one way has stopped being a standard and
206
+ has become a design decision in the wrong document.
207
+
208
+ Give each a STABLE id (UX-001, …). Its OWN id class on purpose: ui-design and the UI
209
+ code gate review and verify these separately from the service lane, so the two never
210
+ have to be untangled out of one list. The consequence to respect — the service-side
211
+ gates (analyze-design, analyze-slice) trace CN- and never read this section, so a bound
212
+ the SERVICE must meet stays a CN-. UX- covers what the UI lane realises; where one
213
+ obligation binds both lanes, state it in both and cross-reference the ids.
214
+
215
+ State each as CHECKABLE, and cite the rule or principle it was lifted from.
216
+ -->
217
+
218
+ - **UX-001**: [Accessibility conformance — e.g. every user-facing surface MUST meet [standard, level]; every task in the User Stories is completable keyboard-only. — lifted from UX-II, ux/accessibility-standards.md]
219
+ - **UX-002**: [Interaction states — e.g. every asynchronous operation MUST present its loading, empty, partial-failure, recovery and success states; no state leaves the user without a next action. — lifted from UX-IV, ux/interaction-states.md]
220
+ - **UX-003**: [Content and language — e.g. user-facing text uses the ubiquitous language of Key Entities; every error names what happened and what to do next; regulated wording is reproduced verbatim. — lifted from UX-V, ux/content-design.md]
221
+ - **UX-004**: [Journey integrity — e.g. each US-n is completable without leaving this aggregate's surface; destructive actions are confirmed and reversible. — lifted from ux/journey-mapping.md]
222
+ - **UX-005**: [Responsiveness-as-a-limit — e.g. an interaction acknowledges input within [n] ms and shows progress past [n] s. A front-end bound; the server-side budget it depends on is CN-nnn.]
223
+
224
+ ## Edge Cases & Exceptional Scenarios
225
+
226
+ <!--
227
+ ACTION REQUIRED: Boundary conditions, error paths, and concurrency/consistency
228
+ cases. Each should map to a System Requirement (often an IF…THEN unwanted-behaviour
229
+ requirement) or a Business Rule.
230
+ -->
231
+
232
+ - What happens when [boundary condition, e.g., the same order is submitted twice]?
233
+ - How does the system handle [error scenario, e.g., a referenced product no longer exists]?
234
+
235
+ ## User Stories *(prioritized)*
236
+
237
+ <!--
238
+ Prioritized user journeys (P1 = most critical). Each MUST be INDEPENDENTLY
239
+ TESTABLE — implementing just one still yields a viable slice of value that can be
240
+ developed, tested, deployed, and demonstrated on its own.
241
+
242
+ Give each a STABLE id (US-1, US-2, …); design sections trace to these ids. Each
243
+ story exercises specific System Requirements / Business Rules — cite them so the
244
+ spine (US ↔ FR/BR ↔ design ↔ code) stays exact. On this living spec, note when a
245
+ story entered or changed: "Added: vX.Y (CR-…)" / "Modified: vX.Y (CR-…)".
246
+ -->
247
+
248
+ ### US-1 - [Brief Title] (Priority: P1) · _Added: v1.0_
249
+
250
+ [Describe this user journey in plain language.]
251
+
252
+ **Why this priority**: [The value and why it ranks here.]
253
+
254
+ **Exercises**: [FR-001, FR-003, BR-001]
255
+
256
+ **Acceptance Criteria**:
257
+
258
+ 1. **Given** [initial state], **When** [action], **Then** [expected outcome]
259
+ 2. **Given** [initial state], **When** [action], **Then** [expected outcome]
260
+
261
+ **Independent Test**: [How this story is verified on its own and the value it delivers.]
262
+
263
+ ---
264
+
265
+ ### US-2 - [Brief Title] (Priority: P2) · _Added: v1.0_
266
+
267
+ [Describe this user journey in plain language.]
268
+
269
+ **Why this priority**: [The value and why it ranks here.]
270
+
271
+ **Exercises**: [FR-…, BR-…]
272
+
273
+ **Acceptance Criteria**:
274
+
275
+ 1. **Given** [initial state], **When** [action], **Then** [expected outcome]
276
+
277
+ **Independent Test**: [How this story is verified on its own.]
278
+
279
+ ---
280
+
281
+ [Add more user stories as needed (US-3, US-4, …), each with a priority and a stable id.]
282
+
283
+ ## Success Criteria *(mandatory)*
284
+
285
+ <!--
286
+ ACTION REQUIRED: Measurable, technology-agnostic outcomes — verified at the
287
+ `analyze-slice` phase. Give each a STABLE id (SC-001, …).
288
+ -->
289
+
290
+ ### Measurable Outcomes
291
+
292
+ - **SC-001**: [Measurable metric, e.g., "A customer can place an order in under 2 minutes."]
293
+ - **SC-002**: [Measurable metric, e.g., "The system sustains 1000 concurrent orders without degradation."]
294
+ - **SC-003**: [User-satisfaction metric, e.g., "90% of first-time users complete an order without assistance."]
295
+ - **SC-004**: [Business metric, e.g., "Reduce order-related support tickets by 50%."]
296
+
297
+ ## Change History
298
+
299
+ <!--
300
+ The living-truth ledger. Every applied change request appends a row here, carrying
301
+ the version it ships as. finalize-delta writes the row when it merges the delta;
302
+ close-delta then archives the CR, bumps the minor version in active_version.json and
303
+ stamps that same number into this document's **Version** header — one mechanism, one
304
+ stage, so header, row and active_version.json never disagree. Newest last.
305
+ -->
306
+
307
+ | Version | Date | Change | User stories | CR |
308
+ |---------|------|--------|--------------|-----|
309
+ | v1.0 | [DATE] | Initial specification | US-1 | — |
@@ -0,0 +1,273 @@
1
+ # UI Design: [AGGREGATE]
2
+
3
+ **Aggregate (feature)**: `[Aggregate]` <!-- the feature = the aggregate, e.g. Order -->
4
+
5
+ **Design home**: `specs/[Aggregate]/design.ui.md`
6
+
7
+ **Source spec**: `specs/[Aggregate]/spec.md`
8
+
9
+ **Lane**: `[lane id]` — the frontend lane declared in `.appweaver/stacks.json`
10
+
11
+ **Version**: v1.0 <!-- moves in lockstep with spec.md and design.md; one change closes on ONE bump -->
12
+
13
+ **Status**: Draft
14
+
15
+ <!--
16
+ WHAT THIS DOCUMENT IS
17
+ =====================
18
+ The single, living High-Level Design for ONE feature's EXPERIENCE — the
19
+ frontend lane's twin of design.md. It is the MEDIATOR between spec.md
20
+ (WHAT/WHY, tech-agnostic) and the frontend code `implement-ui` generates.
21
+ It carries screens, navigation, client state, composition, interaction and
22
+ the service binding. It is NOT code, and it is NOT a visual comp.
23
+
24
+ spec.md ──▶ design.ui.md ──▶ frontend code (+ tests)
25
+ behaviour structure & generated by `implement-ui`
26
+ (UX/US/FR/SC) decisions (framework bound at generation time)
27
+
28
+ ANCHORING RULES
29
+ - Every element traces UP to a spec id (UX-/US-/FR-/CN-/DC-/IC-/SC-) and the
30
+ spec's experience obligations are covered DOWN here (§7 Traceability). No
31
+ screen without a spec reason; no user story without a screen home.
32
+ - UX- LIVES HERE AND ONLY HERE. The spec's Experience Standards are this
33
+ document's to realise — design.md deliberately excludes them, so a UX- that
34
+ reaches neither design is a dropped requirement.
35
+ - THE SPEC IS THE ONLY DOMAIN INPUT — the same rule design.md keeps. This
36
+ document reads the spec + the lane's own standards, never the domain rule
37
+ files. A domain rule the spec omits is an §8 assumption, never an invention.
38
+ - THE SERVICE LANE ENTERS ONLY AT §5. Cite the operations this surface
39
+ consumes; never restate, re-derive or contradict the service design, and
40
+ never place server-side behaviour here.
41
+
42
+ ONE LANE, ONE DOCUMENT
43
+ - This document governs the frontend lane only, and the lane owns the subtree
44
+ `.appweaver/stacks.json` declares for it. The two lanes share the feature, the
45
+ spec, the version and the OKF concept — nothing else.
46
+
47
+ TECHNOLOGY-AGNOSTIC (mandatory)
48
+ - Name no framework, router, state library, component library or styling
49
+ approach. Describe a component by its RESPONSIBILITY, its INPUTS (props /
50
+ params as field shapes), the EVENTS it raises and the STATES it can be in.
51
+ The same design must be realisable on another frontend stack without edits.
52
+ The framework binds at `implement-ui` from constitution.ui.md + that
53
+ command's rule set.
54
+
55
+ WHAT LIVES ELSEWHERE (do NOT repeat it here — it is identical for every feature)
56
+ - The lane's folder structure, naming conventions, forbidden patterns and CI
57
+ gates are constitution.ui.md's. This document uses them; it does not restate
58
+ them.
59
+ - HOW to turn this design into components (file placement, one-component-per-
60
+ file, test pairing, client generation) is a solution-wide rule applied at
61
+ `implement-ui`.
62
+ - The app shell, global layout and the design system belong to no single
63
+ feature. Cite them; do not claim them here.
64
+
65
+ HOW TO AUTHOR
66
+ - Fill every [PLACEHOLDER]. Keep the section order.
67
+ - §4 Interaction & Flow and §6 Cross-Cutting are NEVER omitted, however thin
68
+ the feature. Loading, empty, error and permission-denied states are where
69
+ most UI defects live, and they are the two sections a backend-shaped process
70
+ silently drops.
71
+ - §8 Assumptions and §9 Workarounds are MANDATORY ledgers — an empty one reads
72
+ "None (as of vX.Y)", never a deletion.
73
+ - Delete these authoring comments as you fill each section.
74
+ -->
75
+
76
+ ## 0. Design Overview
77
+
78
+ <!--
79
+ One paragraph: the shape of this feature's experience and the 3–5 decisions
80
+ that matter most — the entry point, the primary flow, the hardest trade-off.
81
+ The lane's standing conventions are NOT restated here; they are the UI
82
+ constitution's.
83
+ -->
84
+
85
+ [The essence of this feature's experience in 3–6 sentences.]
86
+
87
+ ### Ubiquitous Language (design delta)
88
+
89
+ <!-- Only the terms this design introduces or sharpens beyond the spec — a screen
90
+ name, a state name, a shared component concept. These become code
91
+ identifiers, so name them once here and use them verbatim everywhere. -->
92
+
93
+ | Term | Meaning in this design |
94
+ |---|---|
95
+ | [Screen / component / state name] | [precise definition] |
96
+
97
+ ## 1. Navigation & Screen Structure
98
+
99
+ <!-- The screen inventory and how a user moves between them. One row per screen
100
+ THIS feature owns. A screen belongs to the feature that owns the DECISION
101
+ the user makes there; a screen that merely reads another aggregate's data
102
+ declares a dependency rather than duplicating it. -->
103
+
104
+ | Screen | Purpose | Entered from | Leads to | Serves |
105
+ |---|---|---|---|---|
106
+ | `[Screen]` | [the decision made here] | [entry point] | [next screens] | US-[n] · FR-[nnn] |
107
+
108
+ **Route / navigation shape**: [how screens are addressed and nested, stated
109
+ conceptually — a path pattern, a stack, a tab set — never named after a router.]
110
+
111
+ **Access conditions**: [which screens require what — authentication state, a
112
+ role, a record state — each citing the spec id that imposes it, or `None`.]
113
+
114
+ **Screens this feature does NOT own**: [shared shell, navigation chrome, or
115
+ another aggregate's screens this flow passes through — cited, not designed here.
116
+ Or `None`.]
117
+
118
+ ## 2. Client State
119
+
120
+ <!-- What the client holds, where it lives, and who may write it. Separate
121
+ server-derived data from local UI state: they have different owners,
122
+ different lifetimes and different failure modes. Invalidation is part of
123
+ the design — a stale-data defect is a design defect, not an implementation
124
+ one. -->
125
+
126
+ | State | Kind | Owner / scope | Shape | Written by | Invalidated by |
127
+ |---|---|---|---|---|---|
128
+ | `[State]` | [server-derived / local UI / session] | [scope] | [field: type, …] | [screen / component] | [event] |
129
+
130
+ **Derived state**: [what is computed rather than stored, and from what. A value
131
+ that can be derived is not stored twice.]
132
+
133
+ **What must NOT be held**: [fields the spec's DC- ids keep off the client, and
134
+ anything the service alone may decide. Cite the DC-/CN- id.]
135
+
136
+ ## 3. Component Structure
137
+
138
+ <!-- ONE `### 3.n` SUBSECTION PER COMPOSITION AXIS THIS FEATURE ACTUALLY NEEDS,
139
+ each titled with the lane's own name for it (screens, feature components,
140
+ shared compositions, forms, …). The slots below are illustrative positions,
141
+ not a required set: create the ones this feature has and stop.
142
+ In each: what lives there, what it is responsible for, its inputs as field
143
+ shapes, and the events it raises. -->
144
+
145
+ ### 3.1 [COMPOSITION AXIS NAME]
146
+
147
+ <!-- [What this axis holds for this feature.] -->
148
+
149
+ | Component | Responsibility | Inputs (field shape) | Events raised | Serves |
150
+ |---|---|---|---|---|
151
+ | `[Component]` | [single responsibility] | [field: type, …] | `[event]` | FR-[nnn] · US-[n] |
152
+
153
+ ### 3.n [COMPOSITION AXIS NAME]
154
+
155
+ <!-- … one per axis this feature needs, then stop … -->
156
+
157
+ **Reused from the design system**: [the shared components this feature composes
158
+ rather than defines. Composing is the default; a new shared component is a
159
+ decision recorded in §8.]
160
+
161
+ ## 4. Interaction & Flow
162
+
163
+ <!-- MANDATORY — never omitted, never thinned to the happy path. For each
164
+ significant interaction: the states it passes through and what the user
165
+ sees in each. Cover loading, empty, error, permission-denied and
166
+ in-flight/disabled, plus validation timing and what happens on cancel or
167
+ navigate-away. Each unwanted-behaviour state the spec states as an FR- has
168
+ a row here; a state with no FR- is a spec gap routed to `specify`, never
169
+ invented in a component. -->
170
+
171
+ | Interaction | States | What the user sees | Serves |
172
+ |---|---|---|---|
173
+ | `[interaction]` | [idle → in-flight → success / error / empty / denied] | [per-state behaviour] | US-[n] · FR-[nnn] |
174
+
175
+ **Validation & feedback**: [when validation runs and how failures are surfaced,
176
+ citing the BR-/FR- ids being echoed. A client-side check NEVER replaces the
177
+ service-side rule — it restates it for feedback, and the service stays the
178
+ authority.]
179
+
180
+ **Keyboard, focus & announcement**: [focus placement on navigation and on error,
181
+ keyboard reachability of every interaction above, and what is announced to
182
+ assistive technology — citing the UX- standard that governs it.]
183
+
184
+ **Concurrency & recovery**: [what happens on a double submit, a stale record, or
185
+ a lost connection mid-flight.]
186
+
187
+ ## 5. Contract Binding
188
+
189
+ <!-- THE LANE BOUNDARY. One row per service operation this feature's UI depends
190
+ on. Bind against the service's PUBLISHED SURFACE — the spec's IC- ids and
191
+ the API contracts design.md states — and never against the service's
192
+ internals: no table, no handler, no persistence assumption crosses this
193
+ line. An interface the experience needs and the service does not offer is a
194
+ CONTRACT DELTA raised back to the service lane, never a workaround in the
195
+ client. -->
196
+
197
+ | Screen / component | Operation | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
198
+ |---|---|---|---|---|---|
199
+ | `[Screen]` | `[operation]` | [field: type, …] | [field: type, …] | [the §4 state it produces] | FR-[nnn] · IC-[nnn] |
200
+
201
+ **Write semantics**: [per mutating operation — optimistic or pessimistic, what
202
+ it invalidates, and how an optimistic update rolls back.]
203
+
204
+ **Contract deltas needed**: [anything the experience requires that the service
205
+ surface does not offer, raised back to the service lane. Or `None`.]
206
+
207
+ ## 6. Cross-Cutting
208
+
209
+ <!-- MANDATORY — never omitted. One row per concern this feature's UI must
210
+ honour, each tracing to a spec id or, where the obligation comes from the UI
211
+ constitution rather than the spec, to an §8 DA-n citing that principle.
212
+ Keep the rows this feature genuinely carries; a concern that does not apply
213
+ says so and says why. -->
214
+
215
+ | Concern | Design decision | Serves |
216
+ |---|---|---|
217
+ | Data exposure on the client | [what MUST NOT reach the client, its logs, its storage or its URLs] | DC-[nnn] |
218
+ | Authorization surface | [what is hidden vs disabled vs enforced server-side] | CN-[nnn] |
219
+ | Accessibility | [the conformance obligations this feature meets and how] | UX-[n] |
220
+ | Internationalization | [what is localized and where the strings come from] | UX-[n] / DA-[n] |
221
+ | Performance & responsiveness | [target + the structural choice that meets it] | SC-[nnn] |
222
+ | Error & offline behaviour | [what the user gets when the service is unreachable] | FR-[nnn] |
223
+ | Telemetry | [what is recorded, and what is deliberately not] | [spec id / DA-n] |
224
+
225
+ ## 7. Traceability (the spine)
226
+
227
+ <!-- The two-way guarantee for the lane: every experience obligation in the spec
228
+ has a home here, and every UI element has a spec reason. The last column
229
+ names THIS document's own sections.
230
+ A US- with no screen is a coverage failure. A UX- with no row is a dropped
231
+ requirement — design.md does not carry them, so this is their only home. -->
232
+
233
+ | Spec id | Type | UI element(s) | Section |
234
+ |---|---|---|---|
235
+ | UX-[n] | experience standard | [where realised] | [§] |
236
+ | US-[n] | story | [screens + flow realising it] | [§ refs] |
237
+ | FR-[nnn] | requirement | [screen / component / state] | [§] |
238
+ | CN-[nnn] | constraint | [where honoured in the UI] | [§] |
239
+ | DC-[nnn] | classification | [what is withheld from the client] | §6 |
240
+ | IC-[nnn] | contract | [binding row] | §5 |
241
+ | SC-[nnn] | success | [where met + how verified] | [§] |
242
+
243
+ ## 8. Assumptions (to clarify later)
244
+
245
+ <!-- MANDATORY LEDGER. Every default or open interpretation this design commits
246
+ to so it can proceed without blocking — including any element
247
+ constitution.ui.md mandates that has no per-feature spec id (state the basis
248
+ as "per constitution.ui.md UX-<n>"). Empty → "None (as of vX.Y)". -->
249
+
250
+ | id | Assumption | Why deferred | Impact if wrong | Owner / resolve-by |
251
+ |---|---|---|---|---|
252
+ | DA-1 | [what was assumed] | [why not clarified now] | [blast radius] | [role / phase] |
253
+
254
+ ## 9. Workarounds (to clear later)
255
+
256
+ <!-- MANDATORY LEDGER. Experience debt KNOWINGLY taken — a screen that does too
257
+ much, a duplicated component, state held in the wrong place — with the
258
+ proper end-state and the trigger that forces the cleanup.
259
+ Empty → "None (as of vX.Y)". -->
260
+
261
+ | id | Workaround taken | Proper end-state | Trigger to revisit | Serves / caused by |
262
+ |---|---|---|---|---|
263
+ | WA-1 | [the shortcut / coupling] | [the clean design] | [what forces it] | [FR / constraint] |
264
+
265
+ ## Change History
266
+
267
+ <!-- In lockstep with spec.md and design.md — a change that touches both lanes
268
+ closes on ONE version bump. finalize-delta appends the row; close-delta
269
+ bumps the version and stamps it into the header. Newest last. -->
270
+
271
+ | Version | Date | Change | User stories | CR |
272
+ |---------|------|--------|--------------|-----|
273
+ | v1.0 | [DATE] | Initial UI design | US-1 | — |