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.
- package/assets/.appweaver/DESIGN-FORMAT.md +200 -0
- package/assets/.appweaver/ORCH-DIALECT.md +156 -0
- package/assets/.appweaver/RULE-PARTITION.md +175 -0
- package/assets/.appweaver/STACK-PROFILES.md +461 -0
- package/assets/.appweaver/ai-rules.md +180 -0
- package/assets/.appweaver/domain.json +1 -0
- package/assets/.appweaver/extensions/.registry +19 -0
- package/assets/.appweaver/extensions/agent-context/README.md +57 -0
- package/assets/.appweaver/extensions/agent-context/agent-context-config.yml +4 -0
- package/assets/.appweaver/extensions/agent-context/commands/aw-spec.agent-context.update.md +26 -0
- package/assets/.appweaver/extensions/agent-context/extension.yml +37 -0
- package/assets/.appweaver/extensions/agent-context/scripts/bash/update-agent-context.sh +201 -0
- package/assets/.appweaver/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +237 -0
- package/assets/.appweaver/extensions.yml +16 -0
- package/assets/.appweaver/feature.json +3 -0
- package/assets/.appweaver/init-options.json +9 -0
- package/assets/.appweaver/integration.json +15 -0
- package/assets/.appweaver/integrations/aw-spec.manifest.json +9 -0
- package/assets/.appweaver/interpreter/run-skill.py +1176 -0
- package/assets/.appweaver/memory/constitution.md +50 -0
- package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +6 -0
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +94 -0
- package/assets/.appweaver/orchestrator/README.md +300 -0
- package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +74 -0
- package/assets/.appweaver/orchestrator/adapters/google_antigravity.py +74 -0
- package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +105 -0
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +101 -0
- package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +90 -0
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +126 -0
- package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +123 -0
- package/assets/.appweaver/orchestrator/orchestrator.py +1721 -0
- package/assets/.appweaver/orchestrator/rev-templates/ai-rules.reference.md +40 -0
- package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +101 -0
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +245 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +63 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +48 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +59 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-file.skeleton.md +39 -0
- package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +63 -0
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +116 -0
- package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +106 -0
- package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +54 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +125 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +123 -0
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +294 -0
- package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +160 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +270 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +934 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +251 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +265 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +437 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +197 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +475 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +181 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +727 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +100 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +69 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +85 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +386 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +382 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +462 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +265 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +253 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +267 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +287 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +238 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +1822 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +293 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +194 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +83 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +128 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +296 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +439 -0
- package/assets/.appweaver/scripts/bash/aw-inventory.sh +17 -0
- package/assets/.appweaver/scripts/bash/aw-parity.sh +13 -0
- package/assets/.appweaver/scripts/bash/aw-rev-constitution.sh +13 -0
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2626 -0
- package/assets/.appweaver/scripts/bash/aw-xref.sh +15 -0
- package/assets/.appweaver/scripts/bash/common.sh +533 -0
- package/assets/.appweaver/scripts/powershell/aw-inventory.ps1 +17 -0
- package/assets/.appweaver/scripts/powershell/aw-parity.ps1 +13 -0
- package/assets/.appweaver/scripts/powershell/aw-rev-constitution.ps1 +13 -0
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +2232 -0
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +15 -0
- package/assets/.appweaver/scripts/python/aw-component-catalog.py +121 -0
- package/assets/.appweaver/scripts/python/aw-inventory.py +1180 -0
- package/assets/.appweaver/scripts/python/aw-parity.py +380 -0
- package/assets/.appweaver/scripts/python/aw-rev-constitution.py +329 -0
- package/assets/.appweaver/scripts/python/aw-stack.py +1251 -0
- package/assets/.appweaver/scripts/python/aw-xref.py +1330 -0
- package/assets/.appweaver/scripts/python/validate_okf.py +352 -0
- package/assets/.appweaver/stack-profiles/angular.json +16 -0
- package/assets/.appweaver/stack-profiles/blazor-wasm.json +17 -0
- package/assets/.appweaver/stack-profiles/dotnet-webapi.json +15 -0
- package/assets/.appweaver/stack-profiles/go-chi.json +14 -0
- package/assets/.appweaver/stack-profiles/java-spring.json +16 -0
- package/assets/.appweaver/stack-profiles/nextjs.json +16 -0
- package/assets/.appweaver/stack-profiles/node-express.json +15 -0
- package/assets/.appweaver/stack-profiles/python-fastapi.json +16 -0
- package/assets/.appweaver/stack-profiles/react-vite.json +17 -0
- package/assets/.appweaver/stack-profiles/sveltekit.json +16 -0
- package/assets/.appweaver/stack-profiles/vue-vite.json +17 -0
- package/assets/.appweaver/stacks.json +3 -0
- package/assets/.appweaver/templates/constitution-domain-template.md +116 -0
- package/assets/.appweaver/templates/constitution-technical-template.md +108 -0
- package/assets/.appweaver/templates/constitution-ui-template.md +116 -0
- package/assets/.appweaver/templates/delta-design-template.md +69 -0
- package/assets/.appweaver/templates/delta-spec-template.md +63 -0
- package/assets/.appweaver/templates/design-template.md +383 -0
- package/assets/.appweaver/templates/okf-concept-template.md +114 -0
- package/assets/.appweaver/templates/parity-manifest-template.json +49 -0
- package/assets/.appweaver/templates/source-map-template.md +85 -0
- package/assets/.appweaver/templates/spec-template.md +309 -0
- package/assets/.appweaver/templates/ui-design-template.md +273 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.pack.txt +25248 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.pack.txt +5726 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-foundation.ps1 +145 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-foundation.sh +196 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.ps1 +157 -0
- package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.sh +209 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.ps1 +126 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.sh +217 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.ps1 +129 -0
- package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.sh +218 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.pack.txt +19318 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.pack.txt +2833 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-foundation.ps1 +145 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-foundation.sh +196 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.ps1 +157 -0
- package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.sh +209 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.ps1 +126 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.sh +217 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.ps1 +129 -0
- package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.sh +218 -0
- package/assets/foundations/dotnet/components/Email/README.md +119 -0
- package/assets/foundations/dotnet/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +84 -0
- package/assets/foundations/dotnet/components/Email/integration.md +300 -0
- package/assets/foundations/dotnet/components/Jobs/README.md +113 -0
- package/assets/foundations/dotnet/components/Jobs/integration.md +259 -0
- package/assets/foundations/dotnet/components/QrGenerator/README.md +85 -0
- package/assets/foundations/dotnet/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +57 -0
- package/assets/foundations/dotnet/components/QrGenerator/integration.md +230 -0
- package/assets/foundations/dotnet/components/README.md +74 -0
- package/assets/guardrails/README.md +222 -0
- package/assets/guardrails/domain/healthcare/ai-rules.domain.md +34 -0
- package/assets/guardrails/domain/healthcare/api-versioning.domain.md +17 -0
- package/assets/guardrails/domain/healthcare/auditing.domain.md +97 -0
- package/assets/guardrails/domain/healthcare/authorization.domain.md +26 -0
- package/assets/guardrails/domain/healthcare/clinical-terms.md +20 -0
- package/assets/guardrails/domain/healthcare/coding-standards.domain.md +26 -0
- package/assets/guardrails/domain/healthcare/consent.md +19 -0
- package/assets/guardrails/domain/healthcare/cqrs.domain.md +12 -0
- package/assets/guardrails/domain/healthcare/data-classification.domain.md +28 -0
- package/assets/guardrails/domain/healthcare/dependency-policy.domain.md +11 -0
- package/assets/guardrails/domain/healthcare/dicom.md +15 -0
- package/assets/guardrails/domain/healthcare/domain-constitution.md +119 -0
- package/assets/guardrails/domain/healthcare/domain-driven-design.domain.md +28 -0
- package/assets/guardrails/domain/healthcare/eventing.domain.md +18 -0
- package/assets/guardrails/domain/healthcare/fhir.md +36 -0
- package/assets/guardrails/domain/healthcare/folder-structure.domain.md +25 -0
- package/assets/guardrails/domain/healthcare/hipaa.md +34 -0
- package/assets/guardrails/domain/healthcare/hl7.md +15 -0
- package/assets/guardrails/domain/healthcare/ihe-conformance.md +31 -0
- package/assets/guardrails/domain/healthcare/integration-terms.md +21 -0
- package/assets/guardrails/domain/healthcare/persistence.domain.md +20 -0
- package/assets/guardrails/domain/healthcare/terminology.md +30 -0
- package/assets/guardrails/domain/healthcare/testing.domain.md +15 -0
- package/assets/guardrails/domain/healthcare/ux/accessibility-standards.md +36 -0
- package/assets/guardrails/domain/healthcare/ux/content-design.md +32 -0
- package/assets/guardrails/domain/healthcare/ux/interaction-states.md +44 -0
- package/assets/guardrails/domain/healthcare/ux/journey-mapping.md +40 -0
- package/assets/guardrails/domain/healthcare/vertical-slices.domain.md +18 -0
- package/assets/guardrails/domain/healthcare/zero-trust.domain.md +12 -0
- package/assets/guardrails/domain/pharma/ai-rules.domain.md +32 -0
- package/assets/guardrails/domain/pharma/api-versioning.domain.md +20 -0
- package/assets/guardrails/domain/pharma/atc.md +22 -0
- package/assets/guardrails/domain/pharma/auditing.domain.md +90 -0
- package/assets/guardrails/domain/pharma/authorization.domain.md +25 -0
- package/assets/guardrails/domain/pharma/coding-standards.domain.md +28 -0
- package/assets/guardrails/domain/pharma/cqrs.domain.md +16 -0
- package/assets/guardrails/domain/pharma/data-classification.domain.md +24 -0
- package/assets/guardrails/domain/pharma/data-provenance.md +21 -0
- package/assets/guardrails/domain/pharma/dependency-policy.domain.md +11 -0
- package/assets/guardrails/domain/pharma/domain-constitution.md +113 -0
- package/assets/guardrails/domain/pharma/domain-driven-design.domain.md +36 -0
- package/assets/guardrails/domain/pharma/domain-requirements.sample.md +103 -0
- package/assets/guardrails/domain/pharma/eventing.domain.md +18 -0
- package/assets/guardrails/domain/pharma/fhir.md +31 -0
- package/assets/guardrails/domain/pharma/folder-structure.domain.md +26 -0
- package/assets/guardrails/domain/pharma/hl7.md +17 -0
- package/assets/guardrails/domain/pharma/idmp.md +26 -0
- package/assets/guardrails/domain/pharma/integration-terms.md +21 -0
- package/assets/guardrails/domain/pharma/ndc.md +28 -0
- package/assets/guardrails/domain/pharma/persistence.domain.md +23 -0
- package/assets/guardrails/domain/pharma/pharma-terms.md +27 -0
- package/assets/guardrails/domain/pharma/product-lifecycle.domain.md +30 -0
- package/assets/guardrails/domain/pharma/regulatory-compliance.md +19 -0
- package/assets/guardrails/domain/pharma/terminology.md +32 -0
- package/assets/guardrails/domain/pharma/testing.domain.md +19 -0
- package/assets/guardrails/domain/pharma/vertical-slices.domain.md +17 -0
- package/assets/guardrails/domain/pharma/zero-trust.domain.md +12 -0
- package/assets/guardrails/projects/dotnet-default-project/domain/domain-requirements.md +58 -0
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +113 -0
- package/assets/guardrails/projects/dotnet-default-project/frontend/ui-requirements.md +43 -0
- package/assets/guardrails/projects/dotnet-default-project/service/technical-requirements.md +40 -0
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +263 -0
- package/assets/guardrails/requirement-spec.txt +27 -0
- package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +184 -0
- package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +44 -0
- package/assets/guardrails/technology/dotnet-webapi/auditing.md +96 -0
- package/assets/guardrails/technology/dotnet-webapi/authorization-matrix.md +14 -0
- package/assets/guardrails/technology/dotnet-webapi/authorization.md +39 -0
- package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +54 -0
- package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +87 -0
- package/assets/guardrails/technology/dotnet-webapi/cqrs.md +63 -0
- package/assets/guardrails/technology/dotnet-webapi/data-classification.md +38 -0
- package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +40 -0
- package/assets/guardrails/technology/dotnet-webapi/domain-driven-design.md +91 -0
- package/assets/guardrails/technology/dotnet-webapi/eventing.md +57 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/api-versioning.md +75 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/auditing.md +84 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/authorization.md +68 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/clean-architecture.md +37 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/cqrs.md +97 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/domain-driven-design.md +141 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/eventing.md +46 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/persistence.md +207 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/vertical-slices.md +151 -0
- package/assets/guardrails/technology/dotnet-webapi/examples/zero-trust.md +48 -0
- package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +61 -0
- package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +47 -0
- package/assets/guardrails/technology/dotnet-webapi/persistence.md +82 -0
- package/assets/guardrails/technology/dotnet-webapi/technology-constitution.md +162 -0
- package/assets/guardrails/technology/dotnet-webapi/testing.md +55 -0
- package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +70 -0
- package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +48 -0
- package/assets/guardrails/technology/java-spring/README.md +62 -0
- package/assets/guardrails/technology/nextjs/accessibility-implementation.md +56 -0
- package/assets/guardrails/technology/nextjs/api-client.md +56 -0
- package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +174 -0
- package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +203 -0
- package/assets/guardrails/technology/nextjs/auth-session.md +68 -0
- package/assets/guardrails/technology/nextjs/client-security.md +69 -0
- package/assets/guardrails/technology/nextjs/component-architecture.md +60 -0
- package/assets/guardrails/technology/nextjs/component-conventions.md +58 -0
- package/assets/guardrails/technology/nextjs/design-system.md +60 -0
- package/assets/guardrails/technology/nextjs/error-handling.md +72 -0
- package/assets/guardrails/technology/nextjs/forms-and-validation.md +75 -0
- package/assets/guardrails/technology/nextjs/frontend-testing.md +94 -0
- package/assets/guardrails/technology/nextjs/i18n.md +57 -0
- package/assets/guardrails/technology/nextjs/observability.md +67 -0
- package/assets/guardrails/technology/nextjs/performance-budgets.md +66 -0
- package/assets/guardrails/technology/nextjs/routing-navigation.md +52 -0
- package/assets/guardrails/technology/nextjs/state-management.md +70 -0
- package/assets/guardrails/technology/nextjs/ui-constitution.md +166 -0
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/copy-assets.js +8 -8
- package/dist/utils/copy-assets.js.map +1 -1
- package/package.json +1 -1
- 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 | — |
|