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
@@ -1,69 +1,159 @@
1
- # Delta Design — [CR-ID]: [TITLE]
1
+ # Delta Backend Plan — [CR-ID]: [TITLE]
2
2
 
3
- **Feature (aggregate)**: [Aggregate]
3
+ **Feature (aggregate slice)**: `[Feature]`
4
4
 
5
- **Base version**: [vX.Y] <!-- the current master design version; the design phase bumps the minor on close -->
5
+ **Lane**: backend — the service 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
+ **Model delta**: `specs/[Context]/domain-model.[CR-ID].delta.md` <!-- "none" when this change is behaviour-only -->
6
14
 
7
15
  <!--
8
- This delta applies to the SINGLE master design at specs/[Aggregate]/design.md —
9
- never a new design doc. Classify every design change ADDED / MODIFIED / REMOVED
10
- against the current master, per LAYER section (Domain · Application · API · Infra),
11
- in the SAME technology-agnostic form as the master: behaviour as signatures +
12
- pre/post/invariant/raises, contracts as field shapes — NO code. A new command
13
- (e.g. UpdateOrder) is a new USER STORY realised as delta design elements, NOT a
14
- new feature/aggregate. After this delta is applied to design.md, `implement`
15
- regenerates the touched slice; regression re-tests the shared-element dependents.
16
+ ONE CHANGE'S PLAN FOR THE SERVICE LANE. It applies to the feature's master plan at
17
+ specs/[Context]/[Feature]/backend-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
+ service 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 backend-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.
27
+
28
+ WHAT IT PLANS AGAINST — the EFFECTIVE MODEL, not the bare master:
29
+ • specs/[Context]/domain-model.md — the master model, what the domain IS today
30
+ • this change's own domain-model.[CR-ID].delta.md — what this change makes it
31
+ • the PREDECESSOR deltas — the open model deltas in a LOWER wave, which are committed
32
+ to landing first and may therefore be built on
33
+ Same-wave deltas are VISIBLE but are not predecessors: nothing orders them against this
34
+ one, so their proposals are read to avoid a collision, never assumed to be there. Say
35
+ so under "Other open deltas" when one touches the same aggregate.
36
+
37
+ STRUCTURE IS NOT PLANNED HERE. Entities, value objects, domain events and invariants
38
+ (BR-n) belong to the domain model; this document plans where each is ENFORCED and how
39
+ it is REALISED — which use-case, which endpoint, which port, which adapter. Cite
40
+ BR-n / FR-n / CN-n / DC-n / IC-n by id; never restate what an invariant says.
41
+
42
+ Classify every plan change ADDED / MODIFIED / REMOVED against the master, per the
43
+ master's OWN section structure (whatever sections it actually has — do not assume a
44
+ fixed layering), in the SAME technology-agnostic form: behaviour as signatures +
45
+ pre/post/invariant/raises, contracts as field shapes — NO code. A new command (e.g.
46
+ UpdateOrder) is a new USER STORY realised as delta plan elements, NOT a new feature.
47
+ `implement` generates the touched slice from this document and regression re-tests the
48
+ shared-element dependents.
16
49
  -->
17
50
 
18
51
  ## Change summary
19
52
 
20
- [One paragraph: what the design change is and which user story / spec delta it serves.]
53
+ [One paragraph: what the plan change is, and which delta-spec items (FR-/US-/CN-/DC-/IC-)
54
+ it realises. "Realisation only — no spec delta" for a plan-only change.]
55
+
56
+ ## Model changes this plan realises
57
+
58
+ <!--
59
+ The bridge from the model delta to the code. One row per item the domain-model delta
60
+ ADDED / MODIFIED / REMOVED, saying WHERE the change lands in the service. An item in
61
+ the model delta with no row here is a structural change nothing implements — which is
62
+ either a missed realisation or a model change that was never needed.
63
+ "None — behaviour only" when this change does not move the model.
64
+ -->
65
+
66
+ | Model item (from the model delta) | Kind | Realised in | Enforced at |
67
+ |---|---|---|---|
68
+ | `[Entity/VO/Event]` | added | `[element]` | `[where the invariant is checked]` |
69
+ | **BR-[nnn]** | amended | `[element]` | `[guard / handler / constraint]` |
70
+
71
+ ## Depends on
72
+
73
+ <!--
74
+ Other OPEN changes whose plans this one builds on. Every entry MUST be in a LOWER wave
75
+ than this delta — that is what a wave IS. Reading another delta is not depending on it;
76
+ only assuming its changes are in place is. A declared dependency orders the finalizes
77
+ and blocks a recall of the change depended on.
78
+ "None — stands alone" is the common and preferred answer.
79
+ -->
80
+
81
+ - `[CR-ID]` (wave [N-1]) — [what this plan assumes from it]
21
82
 
22
- ## ADDED — new design elements
83
+ ## ADDED — new plan elements
23
84
 
24
- <!-- New entities/VOs/events, use-cases/handlers, endpoints, ports, adapters, and the
25
- realisation of any new spec constraint/classification/contract. Serves = a spec id
26
- (FR-/BR-/CN-/DC-/IC-/US-); design reads the spec, never the domain rule files. -->
85
+ <!-- New use-cases/handlers, endpoints, ports, adapters, and the realisation of any new
86
+ spec constraint / classification / contract. Serves = a spec id (FR-/BR-/CN-/DC-/IC-/US-);
87
+ the plan reads the spec and the domain model, never the domain rule files. -->
27
88
 
28
- | Layer (§) | Element | Kind | Serves |
89
+ | Section (§) | Element | Kind | Serves |
29
90
  |---|---|---|---|
30
91
  | Application (§2) | `[Command/Query]` + handler | use-case | US-[n] · FR-[nnn] |
31
92
  | API (§3) | `[VERB] [/route]` | endpoint | US-[n] · FR-[nnn] |
32
- | Domain (§1) | `[Event]` / `[VO]` | event / value object | BR-[nnn] · CN-[nnn] |
93
+ | Domain (§1) | `[Event]` handling / `[VO]` mapping | model realisation | BR-[nnn] · CN-[nnn] |
33
94
  | Infrastructure (§4.2) | `I[External]` adapter | contract realisation | IC-[nnn] |
34
95
  | Cross-cutting (§5) | [audit / retention / exposure decision] | constraint realisation | CN-[nnn] · DC-[nnn] |
35
96
 
36
- ## MODIFIED — existing design elements
97
+ ## MODIFIED — existing plan elements
37
98
 
38
99
  <!-- Edits to elements the master already defines (add a behaviour, change a contract). -->
39
100
 
40
- | Layer (§) | Element | What changes | Why |
101
+ | Section (§) | Element | What changes | Why |
41
102
  |---|---|---|---|
42
- | Domain (§1) | `[Root].[Behaviour]` | add [method] + invariant | US-[n] |
103
+ | Domain (§1) | `[Root].[Behaviour]` | add [operation] enforcing BR-[nnn] | US-[n] |
43
104
  | Infrastructure (§4) | `I[Aggregate]Repository` | add [operation] | US-[n] |
44
105
 
45
106
  ## REMOVED
46
107
 
47
- - [design element removed + why] — or `None`
108
+ - [plan element removed + why] — or `None`
109
+
110
+ ## Cross-section impact
111
+
112
+ [Which sections of the master ripple; shared elements touched (e.g. the aggregate root's
113
+ realisation); new migration needed? (yes/no); any contract change other systems couple to.]
48
114
 
49
- ## Cross-layer impact
115
+ ## Contract deltas for the frontend lane
116
+
117
+ <!--
118
+ What this change adds to or alters in the service's PUBLISHED surface — the only part
119
+ of this document the frontend lane may bind against. One row per contract; the frontend
120
+ delta plan cites these rather than re-deriving them. "None" when the surface is
121
+ unchanged, which is what a purely internal refactor should say.
122
+ -->
123
+
124
+ | Contract | Change | Shape | Serves |
125
+ |---|---|---|---|
126
+ | `[VERB] [/route]` | added / changed | [request → response field shapes] | IC-[nnn] · FR-[nnn] |
127
+
128
+ ## Other open deltas
129
+
130
+ <!--
131
+ Which OTHER open changes touch the same aggregates, endpoints or shared elements —
132
+ read from their model deltas, which sit beside the master model. Naming an overlap here
133
+ is what turns a merge-time conflict into a planning decision. "None" when this change
134
+ stands clear of everything in flight.
135
+ -->
50
136
 
51
- [Which layer sections ripple; shared elements touched (e.g. the aggregate root);
52
- new migration needed? (yes/no); any contract change other systems couple to.]
137
+ - `[CR-ID]` (wave [N]) — [what overlaps, and how this plan stays clear of it]
53
138
 
54
139
  ## Regression targets
55
140
 
56
141
  [Existing user stories / behaviours to re-verify because a shared element changed —
57
- e.g. re-test CreateOrder when the Order root or its repository is MODIFIED.]
142
+ e.g. re-test CreateOrder when the Order root's realisation or its repository is MODIFIED.]
58
143
 
59
144
  ## New assumptions / workarounds (from this change)
60
145
 
61
- <!-- Anything this change defers — folds into the master's §7 / §8 ledgers on apply. -->
146
+ <!-- Anything this change defers. It stays this document's record — the master's ledgers
147
+ are re-derived with the rest of the master plan, not patched from here. -->
62
148
 
63
149
  - **DA-[n]**: [assumption to clarify later] — or `None`
64
150
  - **WA-[n]**: [structural workaround to clear later] — or `None`
65
151
 
66
- ## On close
152
+ ## On merge
67
153
 
68
- The design phase amends the master design.md doc-first, appends the Change History
69
- row, bumps the version (minor), and archives this record under `changes/archive/`.
154
+ `finalize-delta` merges the change's SPEC half into `spec.md` and its MODEL half into the
155
+ context's `domain-model.md`, in one transaction, and leaves the change OPEN. It does NOT
156
+ merge this document: the master plan is derived from those two, so it is re-derived rather
157
+ than patched. `close-delta` archives this file with the change, bumps the minor version and
158
+ writes the Change History rows. None of it is this document's job — it records the change,
159
+ it does not apply it.
@@ -0,0 +1,81 @@
1
+ # Delta Domain Model — [CR-ID]: [TITLE]
2
+
3
+ **Bounded context**: `[Context]`
4
+
5
+ **Feature (aggregate slice)**: `[Feature]`
6
+
7
+ **Wave**: [N] <!-- script-stamped; same wave = developable in parallel, higher wave = after -->
8
+
9
+ **Base context version**: [vX.Y] <!-- the model version this delta was authored against -->
10
+
11
+ **Created**: [DATE]
12
+
13
+ **Aggregates touched**: `[Root]` <!-- the `## Aggregate:` sections finalize-delta will merge -->
14
+
15
+ <!--
16
+ ONE OPEN DELTA'S CHANGE TO THE CONTEXT'S DOMAIN MODEL. It sits BESIDE the master —
17
+ specs/[Context]/domain-model.<CR-id>.delta.md — deliberately, so every other open
18
+ delta can see it while planning and design around it instead of discovering the
19
+ overlap at merge time.
20
+
21
+ IT DOES NOT TOUCH domain-model.md. The master is merged by finalize-delta, one
22
+ `## Aggregate:` section at a time, and only the sections named in "Aggregates touched".
23
+
24
+ READING ANOTHER DELTA IS NOT DEPENDING ON IT. If this delta's content assumes a change
25
+ that another OPEN delta introduces, that is a dependency and it MUST be expressed as a
26
+ higher Wave than that delta (and named under "Depends on" below). Otherwise a delta
27
+ merged out of order silently invalidates this one.
28
+
29
+ WAVE — the parallel-development dependency level:
30
+ • Deltas sharing a wave are independent and may be developed at the same time.
31
+ • A delta in wave N+1 is implemented only after every wave-N delta has landed.
32
+ • Default is the wave of the currently open deltas (parallel by default); raise it
33
+ only when this delta genuinely builds on one of them.
34
+ Scripts stamp the wave — never edit the header by hand; use `cr-wave` to change it.
35
+ -->
36
+
37
+ ## Change summary
38
+
39
+ [One paragraph: what changes in the MODEL and why. Behaviour changes belong in the delta-spec.]
40
+
41
+ ## Depends on
42
+
43
+ <!--
44
+ Other OPEN deltas whose model changes this one builds on, by CR id, with the wave each
45
+ sits in. Every entry here MUST sit in a LOWER wave than this delta. "None" when this
46
+ delta stands alone — which is the common case and what keeps waves flat.
47
+ -->
48
+
49
+ None
50
+
51
+ ## ADDED
52
+
53
+ <!-- New aggregates, entities, value objects, events, invariants (BR-n) or cross-aggregate invariants (XBR-n). Give the aggregate each belongs to. -->
54
+
55
+ - **Aggregate `[Root]` · entity**: [NewEntity — what it represents]
56
+ - **Aggregate `[Root]` · invariant BR-00X**: [the rule, always-true, technology-agnostic]
57
+
58
+ ## MODIFIED
59
+
60
+ <!-- Existing model elements whose definition changes. State the BEFORE and the AFTER — the merge needs both to be unambiguous. -->
61
+
62
+ - **Aggregate `[Root]` · invariant BR-002**: was "[old rule]" → now "[new rule]"
63
+
64
+ ## REMOVED
65
+
66
+ <!-- Model elements retired by this change, and what (if anything) replaces them. A removal that other specs reference is a breaking change — say so in Impact. -->
67
+
68
+ None
69
+
70
+ ## Impact
71
+
72
+ <!--
73
+ Which specs in this context reference the aggregates touched — those are the specs whose
74
+ requirements may need to move with this model change. Also state any OPEN delta that
75
+ touches the same aggregate: that is a merge conflict waiting to happen and is what the
76
+ wave ordering exists to sequence.
77
+ -->
78
+
79
+ - **Specs referencing `[Root]`**: [Feature, OtherFeature]
80
+ - **Open deltas on the same aggregate**: [CR-ID (wave N) — or "none"]
81
+ - **Breaking**: [yes/no — and what breaks]
@@ -6,20 +6,32 @@
6
6
 
7
7
  **Created**: [DATE]
8
8
 
9
+ **Wave**: [N] <!-- script-stamped; same wave = developable in parallel, higher wave = after -->
10
+
9
11
  **Base version**: [vX.Y] <!-- the current master version; close-delta bumps the minor at the end of the chain -->
10
12
 
13
+ **Model delta**: `specs/[Context]/domain-model.[CR-ID].delta.md` <!-- "none" when this change is behaviour-only -->
14
+
11
15
  <!--
12
16
  A change request is a DELTA on the feature's existing spec.md — never a new spec.
13
17
  Classify every item ADDED / MODIFIED / REMOVED against the current master, using
14
- the SAME vocabulary as the master spec: System Requirements in EARS, Business
15
- Rules (BR-n) as invariants, User Stories with Given/When/Then acceptance criteria,
16
- and — where their rules apply — Constraints & NFRs (CN-n), Data Classification
17
- (DC-n), Integration Contracts (IC-n) and Experience Standards (UX-n). A CR that changes
18
- a retention/audit rule, a data-exposure rule, an interop obligation or a project-wide
19
- experience standard is a CN-/DC-/IC-/UX- delta, not a smuggled code change. A UX- delta
20
- states the standard only — never a screen, page or component, which the prototype and
21
- design.ui.md settle. Adding a command (e.g. UpdateOrder to the Order aggregate) is a new
22
- user story (US-n), NOT a new feature. Feature = aggregate (see spec-template.md).
18
+ the SAME vocabulary as the master spec: System Requirements in EARS, User Stories with
19
+ Given/When/Then acceptance criteria, and — where their rules apply — Constraints & NFRs
20
+ (CN-n), Data Classification (DC-n), Integration Contracts (IC-n) and Experience
21
+ Standards (UX-n). A CR that changes a retention/audit rule, a data-exposure rule, an
22
+ interop obligation or a project-wide experience standard is a CN-/DC-/IC-/UX- delta, not
23
+ a smuggled code change. A UX- delta states the standard only — never a screen, page or
24
+ component, which the prototype and frontend-plan.md settle. Adding a command (e.g.
25
+ UpdateOrder to the Order aggregate) is a new user story (US-n), NOT a new feature.
26
+
27
+ MODEL CHANGES DO NOT BELONG HERE. A new entity, a changed aggregate boundary or a new
28
+ or amended invariant (BR-n) goes in this change's domain-model delta — the "Model delta"
29
+ file named above, authored by the SAME specify run. Cite invariants here by id; state
30
+ behaviour here, structure there.
31
+
32
+ WAVE — the parallel-development dependency level. Deltas sharing a wave are independent
33
+ and may be developed at the same time; a wave-N+1 delta is implemented only after every
34
+ wave-N delta has landed. Scripts stamp it — use `cr-wave` to change it, never a hand edit.
23
35
  -->
24
36
 
25
37
  ## Change summary
@@ -28,7 +40,7 @@
28
40
 
29
41
  ## ADDED
30
42
 
31
- <!-- New user stories, system requirements, business rules, entities, or lifted items (CN/DC/IC/UX). -->
43
+ <!-- New user stories, system requirements, or lifted items (CN/DC/IC/UX). A new entity or invariant is a MODEL change — put it in the domain-model delta and cite it here by id. -->
32
44
 
33
45
  - **US-[n] — [title]** (Priority: P?)
34
46
  - **Why this priority**: [the value and why it ranks here]
@@ -36,28 +48,42 @@
36
48
  - **Acceptance**: Given [state], When [action], Then [outcome]
37
49
  - **Independent test**: [how this story is verified on its own]
38
50
  - **FR-[nnn]**: WHEN [trigger] THE SYSTEM SHALL [response] <!-- EARS — pick the fitting pattern -->
39
- - **BR-[nnn]**: [a new invariant that must always hold] — or `None`
40
51
  - **CN-[nnn]**: [new constraint / NFR — retention, immutability, audit, performance-as-a-limit; cite lifted source] — or `None`
41
52
  - **DC-[nnn]**: [new data-classification category or exposure rule] — or `None`
42
53
  - **IC-[nnn]**: [new integration contract / interop obligation] — or `None`
43
54
  - **UX-[nnn]**: [new project-wide experience standard — accessibility, interaction states, content, journey integrity, responsiveness-as-a-limit; cite lifted source] — or `None`
44
- - **Entity**: [new entity / value object + what it represents] — or `None`
45
55
 
46
56
  ## MODIFIED
47
57
 
48
58
  - **FR-[nnn]**: was [old] → now [new] <!-- keep EARS form -->
49
- - **BR-[nnn]**: was [old] → now [new]
50
59
  - **CN-[nnn]** / **DC-[nnn]** / **IC-[nnn]** / **UX-[nnn]**: was [old] → now [new]
51
60
  - **US-[n]**: [what changes and why]
52
61
 
53
62
  ## REMOVED
54
63
 
55
- - [FR / BR / CN / DC / IC / UX / US / entity removed and why] — or `None`
64
+ - [FR / CN / DC / IC / UX / US removed and why] — or `None`
65
+
66
+ ## Model changes *(summary — the authority is the domain-model delta)*
67
+
68
+ <!--
69
+ A one-line pointer per model element this change touches, so a reader of the delta-spec
70
+ can see at a glance whether the model moves with it. The ACTUAL definitions live in the
71
+ "Model delta" file named in the header, and finalize-delta merges them into
72
+ specs/[Context]/domain-model.md. "None — behaviour only" is a common, valid answer.
73
+ -->
74
+
75
+ - **Aggregates touched**: [Root] — or `None — behaviour only`
76
+ - **New / changed invariants**: [BR-nnn] — defined in the model delta, cited here
77
+ - **Wave rationale**: [why this wave — "independent" or "builds on CR-xxx (wave N-1)"]
56
78
 
57
79
  ## Impact
58
80
 
59
- - **Affected FR / BR / CN / DC / IC / UX / US / SC**: [ids]
81
+ - **Affected FR / CN / DC / IC / UX / US / SC**: [ids]
60
82
  - **Regression risk**: [existing behaviour that must still hold — e.g. CreateOrder must still pass]
83
+ - **Other open deltas**: [CR-ID (wave N) touching the same FRs or the same aggregate — or `none`]
61
84
  - **On merge**: the new US-[n] is tagged `Added: (this CR)` in the master; finalize-delta
62
- merges this delta into spec.md + design.md and appends the Change History row, and
63
- close-delta (after analyze-slice) archives the change and bumps the minor version.
85
+ merges this delta into spec.md and its model delta into domain-model.md — the two
86
+ documents that DEFINE the slice, in one transaction — and appends the spec's Change
87
+ History row. The lane plans are not merged: they are derived from those two and are
88
+ re-derived from them. close-delta (after analyze-slice) archives the change and bumps
89
+ the minor version.