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
|
@@ -1,69 +1,159 @@
|
|
|
1
|
-
# Delta
|
|
1
|
+
# Delta Backend Plan — [CR-ID]: [TITLE]
|
|
2
2
|
|
|
3
|
-
**Feature (aggregate)**: [
|
|
3
|
+
**Feature (aggregate slice)**: `[Feature]`
|
|
4
4
|
|
|
5
|
-
**
|
|
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
|
-
|
|
9
|
-
never a new
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
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
|
|
83
|
+
## ADDED — new plan elements
|
|
23
84
|
|
|
24
|
-
<!-- New
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
|
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]` |
|
|
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
|
|
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
|
-
|
|
|
101
|
+
| Section (§) | Element | What changes | Why |
|
|
41
102
|
|---|---|---|---|
|
|
42
|
-
| Domain (§1) | `[Root].[Behaviour]` | add [
|
|
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
|
-
- [
|
|
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
|
-
##
|
|
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
|
-
[
|
|
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
|
|
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
|
|
152
|
+
## On merge
|
|
67
153
|
|
|
68
|
-
|
|
69
|
-
|
|
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,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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,
|
|
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 /
|
|
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 /
|
|
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
|
|
63
|
-
|
|
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.
|