aw-spec-cli 0.1.16 → 0.1.18

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 (70) hide show
  1. package/assets/.appweaver/DESIGN-FORMAT.md +18 -18
  2. package/assets/.appweaver/ORCH-DIALECT.md +1 -3
  3. package/assets/.appweaver/RULE-PARTITION.md +29 -13
  4. package/assets/.appweaver/STACK-PROFILES.md +10 -9
  5. package/assets/.appweaver/orchestrator/.state/smoke.state.json +32 -0
  6. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +4 -1
  7. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +251 -0
  8. package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +104 -35
  9. package/assets/.appweaver/orchestrator/orchestrator.py +5 -4
  10. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +94 -36
  11. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +1 -1
  12. package/assets/.appweaver/orchestrator/rev-templates/domain-model-template.skeleton.md +115 -0
  13. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +2 -9
  14. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +16 -40
  15. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +38 -17
  16. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +8 -8
  17. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +10 -11
  18. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +673 -0
  19. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +535 -0
  20. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +643 -0
  21. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +84 -701
  22. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
  23. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +7 -7
  24. package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +16 -14
  25. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +2 -2
  26. package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +243 -144
  27. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +877 -578
  28. package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +4 -4
  29. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +32 -91
  30. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
  31. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +836 -514
  32. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +2 -2
  33. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +132 -0
  34. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +38 -5
  35. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +3 -3
  36. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +271 -979
  37. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +1085 -3385
  38. package/assets/.appweaver/scripts/bash/aw-xref.sh +1 -2
  39. package/assets/.appweaver/scripts/bash/common.sh +47 -0
  40. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +914 -3220
  41. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +1 -2
  42. package/assets/.appweaver/scripts/python/aw-payload-parity.py +19 -3
  43. package/assets/.appweaver/scripts/python/aw-stack.py +6 -2
  44. package/assets/.appweaver/scripts/python/aw-xref.py +86 -350
  45. package/assets/.appweaver/templates/constitution-ui-template.md +1 -1
  46. package/assets/.appweaver/templates/delta-design-template.md +120 -30
  47. package/assets/.appweaver/templates/delta-domain-model-template.md +81 -0
  48. package/assets/.appweaver/templates/delta-spec-template.md +43 -17
  49. package/assets/.appweaver/templates/design-template.md +68 -98
  50. package/assets/.appweaver/templates/domain-model-template.md +130 -0
  51. package/assets/.appweaver/templates/okf-concept-template.md +2 -2
  52. package/assets/.appweaver/templates/source-map-template.md +3 -3
  53. package/assets/.appweaver/templates/spec-template.md +100 -122
  54. package/assets/.appweaver/templates/ui-delta-design-template.md +159 -0
  55. package/assets/.appweaver/templates/ui-design-template.md +46 -75
  56. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +7 -18
  57. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +34 -39
  58. package/assets/guardrails/requirement-spec.txt +2 -2
  59. package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
  60. package/package.json +1 -1
  61. package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +0 -105
  62. package/assets/.appweaver/orchestrator/modules/spec-state-gate.orch.yaml +0 -87
  63. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +0 -251
  64. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +0 -813
  65. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +0 -253
  66. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +0 -663
  67. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +0 -600
  68. package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +0 -1147
  69. package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +0 -1121
  70. package/assets/.appweaver/templates/story-template.md +0 -178
@@ -11,27 +11,21 @@
11
11
  **Input**: User description: "$ARGUMENTS"
12
12
 
13
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 REQUIREMENT below (FR-n) — NOT a separate
17
- feature and NOT a user story. A later requirement is a new FR-n added here,
18
- never a new spec folder. One spec, and one PLAN per lane that derives from it:
19
- specs/[Aggregate]/backend-plan.md (/appweaver plan) and, where a frontend lane is
20
- declared, specs/[Aggregate]/frontend-plan.md (/appweaver plan-ui). Both move FORWARD
21
- with this document and never write back to it.
22
-
23
- THIS DOCUMENT HOLDS NO USER STORIES. A story is an execution SLICE over this
24
- spec and lives beside it in stories/, citing the FR-/BR- ids it delivers. This
25
- spec is authored ONCE and stories never merge back into it: when a story needs
26
- the contract itself to change, update-spec folds it back through specify's
27
- validate loop and appends a Change History row. Design and code trace to the
28
- FR-/BR- ids here, never to a story id — which is what lets the backlog churn
29
- without disturbing the design.
30
-
31
- Section order is intentional: establish the business need and scope, then the
32
- stable core the aggregate IS (requirements → rules → constraints → entities →
33
- data classification → integration contracts → experience standards → edge cases),
34
- then the prioritized user journeys that exercise it, then measurable success.
14
+ THIS SPEC IS BEHAVIOUR, NOT STRUCTURE. It states what the system must DO and WHY.
15
+ What the domain IS — aggregate boundaries, entities, value objects, events and
16
+ invariants — lives in the bounded context's domain model, specs/[Context]/domain-model.md,
17
+ and is referenced from here by name and id. That split is what lets one aggregate be
18
+ acted on by several specs without any of them owning its definition.
19
+
20
+ Every operation on the aggregate (CreateOrder, UpdateOrder, …) is a USER STORY below —
21
+ NOT a separate feature. A later requirement is a new US-n added as a delta (see
22
+ delta-spec-template.md), never a new spec folder. One spec + one plan per declared
23
+ lane — the PLAN derives from this document and the domain model together.
24
+
25
+ Section order is intentional: establish the business need and scope, then the stable
26
+ core the aggregate's BEHAVIOUR is (requirements → constraints → data classification →
27
+ integration contracts → experience standards → edge cases), then the prioritized user
28
+ journeys that exercise it, then measurable success.
35
29
 
36
30
  LIFTS (specify's job): four sections carry governance INTO the spec, because every
37
31
  later phase authors from the spec ONLY and anything not captured here never reaches
@@ -53,17 +47,26 @@
53
47
 
54
48
  ## Scope & Assumptions
55
49
 
56
- ### Aggregate Boundary
50
+ ### Domain Model Reference
57
51
 
58
52
  <!--
59
- The aggregate = the largest slice whose code no other feature owns. State what
60
- it OWNS, what it only REFERENCES (by identifier, not owned), and what is out of
61
- scope. This anchors the design's "dependencies point inward" and keeps commands
62
- as deltas on THIS aggregate rather than new features.
53
+ THE AGGREGATE IS NOT DEFINED HERE. Its boundary, entities, value objects, events and
54
+ invariants live in the bounded context's domain model —
55
+ specs/[Context]/domain-model.md — which is the single canonical definition every spec
56
+ in this context shares.
57
+
58
+ Name the aggregate(s) this spec's requirements act on and CITE the invariants they
59
+ rely on by id (BR-nnn). Never restate what an aggregate owns or what an invariant
60
+ says: a per-spec copy drifts, and once two specs assert different rules for one
61
+ aggregate nothing arbitrates between them.
62
+
63
+ If a requirement below needs an aggregate, entity or invariant the model does not
64
+ have yet, that is a MODEL change — it belongs in the same specify run's domain-model
65
+ delta, not in prose here.
63
66
  -->
64
67
 
65
- - **Owns**: [entities/behaviour inside this aggregate — e.g. Order, OrderLine]
66
- - **References (by id, not owned)**: [Customer, Product — read-only / by identifier]
68
+ - **Acts on aggregate(s)**: `[Root]` — see `specs/[Context]/domain-model.md`
69
+ - **Relies on invariants**: [BR-001, BR-002]
67
70
  - **Out of scope / non-goals**: [explicitly excluded — e.g. payment settlement, shipping]
68
71
 
69
72
  ### Assumptions
@@ -86,7 +89,7 @@
86
89
  only place the spec describes the delivery surface at all.
87
90
 
88
91
  NOT SCREENS. No pages, layouts, navigation, components or visual design — those are
89
- realisation decisions owned by the prototype and frontend-plan.md, and putting them here
92
+ realisation decisions owned by the prototype and the frontend plan, and putting them here
90
93
  would break the WHAT/HOW line the whole kit rests on.
91
94
 
92
95
  Lifted with the Experience Standards below, from the frontend lane's constitution
@@ -123,18 +126,6 @@
123
126
  - **FR-004**: WHILE [an order is in Draft] THE SYSTEM SHALL [allow line items to be added or removed].
124
127
  - **FR-005**: WHERE [tax calculation is enabled] THE SYSTEM SHALL [apply the regional tax rule].
125
128
 
126
- ## Business Rules *(invariants — always true, technology-agnostic)*
127
-
128
- <!--
129
- ACTION REQUIRED: Constraints that must ALWAYS hold for the aggregate, independent
130
- of any single operation. These become the design's §Domain invariants and must be
131
- enforceable and testable. Give each a STABLE id (BR-001, …).
132
- -->
133
-
134
- - **BR-001**: [An order's total MUST never be negative.]
135
- - **BR-002**: [A submitted order MUST always have at least one line item.]
136
- - **BR-003**: [An order's identifier is immutable once created.]
137
-
138
129
  ## Constraints & Non-Functional Requirements *(domain lift — CN)*
139
130
 
140
131
  <!--
@@ -153,17 +144,6 @@
153
144
  - **CN-003**: [Data integrity — e.g. records subject to [regime] satisfy [integrity standard].]
154
145
  - **CN-004**: [Performance-as-a-limit — e.g. P95 read latency < 200 ms at 200 RPS; not a behaviour, a bound.]
155
146
 
156
- ## Key Entities *(the aggregate's conceptual model — no implementation detail)*
157
-
158
- <!--
159
- The aggregate root and the entities/value objects inside its boundary: what each
160
- represents, its key attributes, lifecycle/states, and relationships. Reference to
161
- OTHER aggregates is by identifier only (see Aggregate Boundary).
162
- -->
163
-
164
- - **[Aggregate root — e.g. Order]**: [what it represents; key attributes; lifecycle/states, e.g. Draft → Submitted → Fulfilled]
165
- - **[Entity / value object — e.g. OrderLine]**: [what it represents; relationship to the root]
166
-
167
147
  ## Data Classification *(domain lift — DC)*
168
148
 
169
149
  <!--
@@ -172,8 +152,8 @@
172
152
  which categories exist, which Key-Entity fields fall in each, and where each category
173
153
  MAY / MUST NOT appear (public API surface, logs, metrics, traces, external projections).
174
154
  Lifted by specify from the domain data-classification rules. Design enforces these; the
175
- analyze-design / analyze-slice gates check them. Give each a STABLE id (DC-001, …); reference fields by
176
- the names used in Key Entities.
155
+ analyze-plan / analyze-slice gates check them. Give each a STABLE id (DC-001, …); reference fields by
156
+ the names the context's domain model defines.
177
157
  -->
178
158
 
179
159
  | id | Category | Applies to (fields / entities) | Exposure rule |
@@ -205,30 +185,30 @@
205
185
  The PROJECT-WIDE experience standards this aggregate's UI must satisfy, lifted here by
206
186
  specify out of the frontend lane's constitution (constitution.ui.md — the UX-* principle
207
187
  series) and the mapped ux/ rule files, exactly as CN-/DC-/IC- lift the domain rules.
208
- The lift is what makes them binding: prototype, plan-ui and implement-ui author from
209
- the SPEC and never from the rule files, so a standard not carried here reaches no UI
210
- phase and is gated by nothing.
188
+ The lift is what makes them binding: the prototype phase and the FRONTEND LANES of plan
189
+ and implement author from the SPEC and never from the rule files, so a standard not
190
+ carried here reaches no UI phase and is gated by nothing.
211
191
 
212
192
  HIGH-LEVEL AND PROJECT-WIDE ONLY. Each entry is a standard the whole product holds to,
213
193
  stated so it can be checked on ANY surface — never a screen, page, layout, navigation
214
- model, component or visual-design choice. Those are the prototype's and frontend-plan.md's
194
+ model, component or visual-design choice. Those are the prototype's and the frontend plan's
215
195
  to settle. An entry that can be satisfied only one way has stopped being a standard and
216
196
  has become a design decision in the wrong document.
217
197
 
218
- Give each a STABLE id (UX-001, …). Its OWN id class on purpose: plan-ui and the UI
198
+ Give each a STABLE id (UX-001, …). Its OWN id class on purpose: ui-design and the UI
219
199
  code gate review and verify these separately from the service lane, so the two never
220
200
  have to be untangled out of one list. The consequence to respect — the service-side
221
- gates (analyze-design, analyze-slice) trace CN- and never read this section, so a bound
201
+ gates (analyze-plan, analyze-slice) trace CN- and never read this section, so a bound
222
202
  the SERVICE must meet stays a CN-. UX- covers what the UI lane realises; where one
223
203
  obligation binds both lanes, state it in both and cross-reference the ids.
224
204
 
225
205
  State each as CHECKABLE, and cite the rule or principle it was lifted from.
226
206
  -->
227
207
 
228
- - **UX-001**: [Accessibility conformance — e.g. every user-facing surface MUST meet [standard, level]; every task the requirements above describe is completable keyboard-only. — lifted from UX-II, ux/accessibility-standards.md]
208
+ - **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]
229
209
  - **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]
230
- - **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]
231
- - **UX-004**: [Journey integrity — e.g. each FR-n is completable without leaving this aggregate's surface; destructive actions are confirmed and reversible. — lifted from ux/journey-mapping.md]
210
+ - **UX-003**: [Content and language — e.g. user-facing text uses the context's ubiquitous language; every error names what happened and what to do next; regulated wording is reproduced verbatim. — lifted from UX-V, ux/content-design.md]
211
+ - **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]
232
212
  - **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.]
233
213
 
234
214
  ## Edge Cases & Exceptional Scenarios
@@ -242,6 +222,55 @@
242
222
  - What happens when [boundary condition, e.g., the same order is submitted twice]?
243
223
  - How does the system handle [error scenario, e.g., a referenced product no longer exists]?
244
224
 
225
+ ## User Stories *(prioritized)*
226
+
227
+ <!--
228
+ Prioritized user journeys (P1 = most critical). Each MUST be INDEPENDENTLY
229
+ TESTABLE — implementing just one still yields a viable slice of value that can be
230
+ developed, tested, deployed, and demonstrated on its own.
231
+
232
+ Give each a STABLE id (US-1, US-2, …); design sections trace to these ids. Each
233
+ story exercises specific System Requirements and invariants (BR-n, defined in the
234
+ domain model) — cite them so the spine (US ↔ FR/BR ↔ design ↔ code) stays exact.
235
+ On this living spec, note when a story entered or changed:
236
+ "Added: vX.Y (CR-…)" / "Modified: vX.Y (CR-…)".
237
+ -->
238
+
239
+ ### US-1 - [Brief Title] (Priority: P1) · _Added: v1.0_
240
+
241
+ [Describe this user journey in plain language.]
242
+
243
+ **Why this priority**: [The value and why it ranks here.]
244
+
245
+ **Exercises**: [FR-001, FR-003, BR-001]
246
+
247
+ **Acceptance Criteria**:
248
+
249
+ 1. **Given** [initial state], **When** [action], **Then** [expected outcome]
250
+ 2. **Given** [initial state], **When** [action], **Then** [expected outcome]
251
+
252
+ **Independent Test**: [How this story is verified on its own and the value it delivers.]
253
+
254
+ ---
255
+
256
+ ### US-2 - [Brief Title] (Priority: P2) · _Added: v1.0_
257
+
258
+ [Describe this user journey in plain language.]
259
+
260
+ **Why this priority**: [The value and why it ranks here.]
261
+
262
+ **Exercises**: [FR-…, BR-…]
263
+
264
+ **Acceptance Criteria**:
265
+
266
+ 1. **Given** [initial state], **When** [action], **Then** [expected outcome]
267
+
268
+ **Independent Test**: [How this story is verified on its own.]
269
+
270
+ ---
271
+
272
+ [Add more user stories as needed (US-3, US-4, …), each with a priority and a stable id.]
273
+
245
274
  ## Success Criteria *(mandatory)*
246
275
 
247
276
  <!--
@@ -256,67 +285,16 @@
256
285
  - **SC-003**: [User-satisfaction metric, e.g., "90% of first-time users complete an order without assistance."]
257
286
  - **SC-004**: [Business metric, e.g., "Reduce order-related support tickets by 50%."]
258
287
 
259
- ## Story Coverage
260
-
261
- <!--
262
- GENERATED — DO NOT HAND-EDIT. Everything between the two AW:COVERAGE markers is
263
- rewritten wholesale from the stories/ directory, which is the source of truth: each
264
- story's `exercises:` frontmatter says which requirements it delivers, and this table is
265
- that relation read the other way round. Hand-edit it and your edit is gone at the next
266
- write; change who delivers what by editing the story.
267
-
268
- It answers the question the contract cannot answer about itself — who is building this,
269
- and what is nobody building. A requirement with no story is a requirement nobody has
270
- started; a requirement whose stories are all closed is DELIVERED, which is the rule
271
- analyze-code and the pre-deploy gate key on. "Delivered" is never "a story closed" —
272
- a follow-on may still carry the remainder.
273
-
274
- Scoped to FR- and BR-, because those are the ids a story cites. The lifted sections
275
- (CN-/DC-/IC-/UX-) are constraints the design and the gates trace, not slices of work.
276
-
277
- Fenced out of the ledger ON PURPOSE. The sha256 that guards this document covers the
278
- CONTRACT, and this section is not contract — it is a projection of the backlog. Were it
279
- inside the hash, creating a story would look like an unledgered spec edit and refuse the
280
- next sync-stories; were it visible to the diff, adding a story would read as a
281
- requirement change and mint a version row. So spec-check, spec-diff and ledger-append
282
- all cut this block out before they look at anything.
283
- -->
284
-
285
- <!-- AW:COVERAGE:BEGIN -->
286
- | Requirement | Open stories | Closed / cancelled |
287
- |-------------|--------------|--------------------|
288
- | _(none yet — run /appweaver sync-stories to raise the backlog)_ | | |
289
- <!-- AW:COVERAGE:END -->
290
-
291
288
  ## Change History
292
289
 
293
290
  <!--
294
- The living-truth ledger, and the sync anchor between this spec and its story backlog.
295
-
296
- Each row names the requirement ids that version touched. Every story records the spec
297
- version it last synced at (spec_version: in its frontmatter), so a story is stale when
298
- some row above its version names an id that story cites — one version comparison, no
299
- per-requirement content hashing. sync-stories reads the rows to refresh the backlog;
300
- update-spec appends one when it folds a hand-edited story back into this document.
301
-
302
- The ledger is hand-written, so it is guarded. active_version.json carries a sha256 of
303
- this whole file as of the last ledger-aware write. A body that has changed while the
304
- version stands still is a hand edit that skipped the ledger: sync-stories and
305
- check-stories refuse until a row is added, because otherwise every affected story goes
306
- quietly stale and nothing says so.
307
-
308
- Version numbers have a single writer, so the header, the newest row and
309
- active_version.json never disagree: close-delta bumps the minor version in
310
- active_version.json and stamps that same number into this document's **Version**
311
- header. Newest last.
312
-
313
- THE "Requirements changed" CELL IS GENERATED. specify computes it from a diff of the
314
- document it just wrote — including the v1.0 row below, whose placeholder ids are
315
- replaced with the ones the finished spec actually carries. A row that names the ids
316
- somebody believed it changed is worth nothing to a story trying to find out whether it
317
- is stale; only a row derived from the document is.
291
+ The living-truth ledger. Every applied change request appends a row here, carrying
292
+ the version it ships as. finalize-delta writes the row when it merges the delta;
293
+ close-delta then archives the CR, bumps the minor version in active_version.json and
294
+ stamps that same number into this document's **Version** header — one mechanism, one
295
+ stage, so header, row and active_version.json never disagree. Newest last.
318
296
  -->
319
297
 
320
- | Version | Date | Change | Requirements changed | Stories |
321
- |---------|------|--------|----------------------|---------|
322
- | v1.0 | [DATE] | Initial specification | FR-001…FR-00n, BR-001…BR-00n | — |
298
+ | Version | Date | Change | User stories | CR |
299
+ |---------|------|--------|--------------|-----|
300
+ | v1.0 | [DATE] | Initial specification | US-1 | — |
@@ -0,0 +1,159 @@
1
+ # Delta Frontend Plan — [CR-ID]: [TITLE]
2
+
3
+ **Feature (aggregate slice)**: `[Feature]`
4
+
5
+ **Lane**: `[lane id]` — the frontend lane declared in `.appweaver/stacks.json`
6
+
7
+ **Wave**: [N] <!-- script-stamped from the delta-spec; same wave = developable in parallel, higher wave = after -->
8
+
9
+ **Base version**: [vX.Y] <!-- the master plan's version when this delta opened; close-delta bumps the minor at the end of the chain -->
10
+
11
+ **Delta spec**: `changes/[CR-ID]/delta-spec.md`
12
+
13
+ **Service delta**: `changes/[CR-ID]/delta-backend-plan.md` <!-- "none — experience-only change" when this change has no service half -->
14
+
15
+ <!--
16
+ ONE CHANGE'S PLAN FOR THE FRONTEND LANE. It applies to the feature's master plan at
17
+ specs/[Context]/[Feature]/frontend-plan.md — never a new plan document. It is authored in
18
+ the change's own directory beside its delta-spec, and it is what `implement` generates the
19
+ frontend lane's code from when this change is the one it is answered with; close-delta
20
+ archives it as the record of how the change was built.
21
+
22
+ IT DOES NOT TOUCH frontend-plan.md, AND NEITHER DOES finalize-delta. Many changes may be
23
+ open at once, so a delta that edited the master would move the baseline every other open
24
+ delta is authored against. The master plan is DERIVED from spec.md and domain-model.md —
25
+ the two documents finalize-delta does merge — so it is re-derived from them rather than
26
+ patched from this file. A UX- item of this change reaches the master through the SPEC's
27
+ Experience Standards, which is where finalize-delta merges it.
28
+
29
+ ONE CHANGE, TWO LANES, ONE VERSION. A change that touches both lanes produces this
30
+ document AND its service twin; the spec and model merge once for both and the
31
+ change closes on ONE version bump. This record never restates the service delta —
32
+ where a change starts in the service contract, this document records only what the
33
+ EXPERIENCE does with it.
34
+
35
+ THE LANE BOUNDARY IS THE PUBLISHED SURFACE. Bind against the delta-spec's IC- ids and
36
+ the service delta's "Contract deltas for the frontend lane" table — CITE those
37
+ contracts, never re-derive or contradict them, and introduce no server-side behaviour,
38
+ persistence assumption or handler detail. Anything the experience needs that the surface
39
+ does not offer is a CONTRACT DELTA raised back to the service lane, never a workaround
40
+ in the client.
41
+
42
+ STRUCTURE IS NOT PLANNED HERE. Entities, value objects and invariants (BR-n) belong to
43
+ the context's domain model; this document plans what the user SEES and DOES. Cite the
44
+ ids; never restate them. The ubiquitous language the model defines is the language this
45
+ plan's labels, states and messages use.
46
+
47
+ Classify every change ADDED / MODIFIED / REMOVED against the master, per the MASTER'S
48
+ OWN sections, in the same technology-agnostic form: responsibilities, inputs as field
49
+ shapes, events and states — no framework, no router, no state library, no component
50
+ library, no code. The stack binds at implement time.
51
+ -->
52
+
53
+ ## Change summary
54
+
55
+ [One paragraph: what the experience change is, and which delta-spec items (UX-/US-/FR-/
56
+ CN-/DC-/IC-) it realises. "Realisation only — no spec delta" for a plan-only change.]
57
+
58
+ ## Depends on
59
+
60
+ <!--
61
+ Other OPEN changes whose plans this one builds on. Every entry MUST be in a LOWER wave
62
+ than this delta — that is what a wave IS. Reading another delta is not depending on it;
63
+ only assuming its changes are in place is.
64
+ "None — stands alone" is the common and preferred answer.
65
+ -->
66
+
67
+ - `[CR-ID]` (wave [N-1]) — [what this plan assumes from it]
68
+
69
+ ## ADDED — new experience elements
70
+
71
+ <!-- New screens, components, client state, interactions or contract bindings.
72
+ "Section" names a section of THIS feature's master frontend plan. -->
73
+
74
+ | Section (§) | Element | Kind | Serves |
75
+ |---|---|---|---|
76
+ | Navigation & Screens (§1) | `[screen]` | screen | US-[n] |
77
+ | Component Structure (§3) | `[component]` | component | US-[n] · FR-[nnn] |
78
+ | Client State (§2) | `[state]` | state | FR-[nnn] · DC-[nnn] |
79
+ | Contract Binding (§5) | `[VERB] [/route]` | binding | IC-[nnn] |
80
+
81
+ ## MODIFIED — existing experience elements
82
+
83
+ <!-- Edits to elements the master already defines. A shared component or a shared state
84
+ container is modified here, IN PLACE — never copied into the change. -->
85
+
86
+ | Section (§) | Element | What changes | Why |
87
+ |---|---|---|---|
88
+ | Component Structure (§3) | `[component]` | [the edit] | US-[n] |
89
+
90
+ ## REMOVED
91
+
92
+ - [experience element removed + why, including where its users now go] — or `None`
93
+
94
+ ## Interaction states touched
95
+
96
+ <!--
97
+ Every state the change adds or alters — loading, empty, error, permission-denied,
98
+ in-flight. A new interaction lists its FULL state set here; an unlisted state reads as
99
+ unchanged, not as absent. A state the UI can reach that the delta-spec does not describe
100
+ is a SPEC gap: log it as a DA-n that routes back to specify, never invent the
101
+ requirement here.
102
+ -->
103
+
104
+ | Interaction | States added / changed | What the user sees | Serves |
105
+ |---|---|---|---|
106
+ | `[interaction]` | [states] | [per-state behaviour] | US-[n] · FR-[nnn] |
107
+
108
+ ## Contract impact
109
+
110
+ <!--
111
+ What this change consumes from the service lane, taken from the service delta's
112
+ contract table: bindings added, changed, or no longer used. Anything the experience
113
+ requires that the surface does not offer goes under "Contract deltas needed" and is
114
+ raised back to the service lane. `None` when the binding surface is unchanged.
115
+ -->
116
+
117
+ | Contract | Consumed as | From |
118
+ |---|---|---|
119
+ | `[VERB] [/route]` | [what the screen does with it] | service delta / IC-[nnn] |
120
+
121
+ **Contract deltas needed**: [what the service must add for this experience to work] — or `None`
122
+
123
+ ## Other open deltas
124
+
125
+ <!--
126
+ Which OTHER open changes touch the same screens, shared components or state containers.
127
+ Naming an overlap here is what turns a merge-time conflict into a planning decision.
128
+ "None" when this change stands clear of everything in flight.
129
+ -->
130
+
131
+ - `[CR-ID]` (wave [N]) — [what overlaps, and how this plan stays clear of it]
132
+
133
+ ## Cross-section impact
134
+
135
+ [Which of the master's sections ripple; shared components or state containers touched;
136
+ navigation edges added or removed; any screen in ANOTHER feature that depends on a changed
137
+ shared element. The app shell, global layout and design system belong to no feature —
138
+ cite them, never claim or redesign them here.]
139
+
140
+ ## Regression targets
141
+
142
+ [Existing user stories / screens to re-verify because a shared component, a shared state
143
+ container or a navigation edge changed.]
144
+
145
+ ## New assumptions / workarounds (from this change)
146
+
147
+ <!-- Anything this change defers. It stays this document's record — the master's DA-n / WA-n
148
+ ledgers are re-derived with the rest of the master plan, not patched from here. -->
149
+
150
+ - **DA-[n]**: [assumption to clarify later] — or `None`
151
+ - **WA-[n]**: [deviation to clear later] — or `None`
152
+
153
+ ## On merge
154
+
155
+ `finalize-delta` merges the change's SPEC half into `spec.md` and its MODEL half into the
156
+ context's `domain-model.md`, in one transaction, and leaves the change OPEN. It does NOT
157
+ merge this document: the master plan is derived from those two, so it is re-derived rather
158
+ than patched. `close-delta` archives this file with the change and bumps the ONE version both
159
+ lanes share. None of it is this document's job — it records the change, it does not apply it.