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.
- package/assets/.appweaver/DESIGN-FORMAT.md +18 -18
- package/assets/.appweaver/ORCH-DIALECT.md +1 -3
- package/assets/.appweaver/RULE-PARTITION.md +29 -13
- package/assets/.appweaver/STACK-PROFILES.md +10 -9
- package/assets/.appweaver/orchestrator/.state/smoke.state.json +32 -0
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +4 -1
- package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +251 -0
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +104 -35
- package/assets/.appweaver/orchestrator/orchestrator.py +5 -4
- package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +94 -36
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/domain-model-template.skeleton.md +115 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +2 -9
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +16 -40
- package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +38 -17
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +8 -8
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +10 -11
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +673 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +535 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +643 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +84 -701
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +7 -7
- package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +16 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +243 -144
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +877 -578
- package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +32 -91
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +836 -514
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +132 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +38 -5
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +271 -979
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +1085 -3385
- package/assets/.appweaver/scripts/bash/aw-xref.sh +1 -2
- package/assets/.appweaver/scripts/bash/common.sh +47 -0
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +914 -3220
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +1 -2
- package/assets/.appweaver/scripts/python/aw-payload-parity.py +19 -3
- package/assets/.appweaver/scripts/python/aw-stack.py +6 -2
- package/assets/.appweaver/scripts/python/aw-xref.py +86 -350
- package/assets/.appweaver/templates/constitution-ui-template.md +1 -1
- package/assets/.appweaver/templates/delta-design-template.md +120 -30
- package/assets/.appweaver/templates/delta-domain-model-template.md +81 -0
- package/assets/.appweaver/templates/delta-spec-template.md +43 -17
- package/assets/.appweaver/templates/design-template.md +68 -98
- package/assets/.appweaver/templates/domain-model-template.md +130 -0
- package/assets/.appweaver/templates/okf-concept-template.md +2 -2
- package/assets/.appweaver/templates/source-map-template.md +3 -3
- package/assets/.appweaver/templates/spec-template.md +100 -122
- package/assets/.appweaver/templates/ui-delta-design-template.md +159 -0
- package/assets/.appweaver/templates/ui-design-template.md +46 -75
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +7 -18
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +34 -39
- package/assets/guardrails/requirement-spec.txt +2 -2
- package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
- package/package.json +1 -1
- package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +0 -105
- package/assets/.appweaver/orchestrator/modules/spec-state-gate.orch.yaml +0 -87
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +0 -251
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +0 -813
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +0 -253
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +0 -663
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +0 -600
- package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +0 -1147
- package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +0 -1121
- package/assets/.appweaver/templates/story-template.md +0 -178
|
@@ -11,27 +11,21 @@
|
|
|
11
11
|
**Input**: User description: "$ARGUMENTS"
|
|
12
12
|
|
|
13
13
|
<!--
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
the
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
###
|
|
50
|
+
### Domain Model Reference
|
|
57
51
|
|
|
58
52
|
<!--
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
- **
|
|
66
|
-
- **
|
|
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
|
|
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-
|
|
176
|
-
the names
|
|
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
|
|
209
|
-
the SPEC and never from the rule files, so a standard not
|
|
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
|
|
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:
|
|
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-
|
|
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
|
|
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
|
|
231
|
-
- **UX-004**: [Journey integrity — e.g. each
|
|
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
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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 |
|
|
321
|
-
|
|
322
|
-
| v1.0 | [DATE] | Initial specification |
|
|
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.
|