aw-spec-cli 0.1.13 → 0.1.15
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/STACK-PROFILES.md +1 -1
- package/assets/.appweaver/orchestrator/orchestrator.py +5 -0
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +10 -3
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +38 -11
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +2 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +607 -123
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +625 -66
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +407 -134
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +452 -143
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +78 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +597 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +688 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +23 -23
- package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +945 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +1040 -0
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2069 -28
- package/assets/.appweaver/scripts/bash/aw-xref.sh +2 -1
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +1973 -13
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +2 -1
- package/assets/.appweaver/scripts/python/aw-xref.py +246 -20
- package/assets/.appweaver/templates/design-template.md +88 -54
- package/assets/.appweaver/templates/spec-template.md +12 -10
- package/assets/.appweaver/templates/story-template.md +48 -8
- package/assets/.appweaver/templates/ui-design-template.md +71 -39
- package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +19 -7
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +35 -26
- package/package.json +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +0 -386
- package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +0 -382
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
single LIVING source of truth for its whole lifecycle. Every operation on it
|
|
16
16
|
(CreateOrder, UpdateOrder, …) is a REQUIREMENT below (FR-n) — NOT a separate
|
|
17
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
|
|
19
|
-
|
|
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.
|
|
20
22
|
|
|
21
23
|
THIS DOCUMENT HOLDS NO USER STORIES. A story is an execution SLICE over this
|
|
22
24
|
spec and lives beside it in stories/, citing the FR-/BR- ids it delivers. This
|
|
@@ -84,7 +86,7 @@
|
|
|
84
86
|
only place the spec describes the delivery surface at all.
|
|
85
87
|
|
|
86
88
|
NOT SCREENS. No pages, layouts, navigation, components or visual design — those are
|
|
87
|
-
realisation decisions owned by the prototype and
|
|
89
|
+
realisation decisions owned by the prototype and frontend-plan.md, and putting them here
|
|
88
90
|
would break the WHAT/HOW line the whole kit rests on.
|
|
89
91
|
|
|
90
92
|
Lifted with the Experience Standards below, from the frontend lane's constitution
|
|
@@ -203,17 +205,17 @@
|
|
|
203
205
|
The PROJECT-WIDE experience standards this aggregate's UI must satisfy, lifted here by
|
|
204
206
|
specify out of the frontend lane's constitution (constitution.ui.md — the UX-* principle
|
|
205
207
|
series) and the mapped ux/ rule files, exactly as CN-/DC-/IC- lift the domain rules.
|
|
206
|
-
The lift is what makes them binding: prototype, ui
|
|
208
|
+
The lift is what makes them binding: prototype, plan-ui and implement-ui author from
|
|
207
209
|
the SPEC and never from the rule files, so a standard not carried here reaches no UI
|
|
208
210
|
phase and is gated by nothing.
|
|
209
211
|
|
|
210
212
|
HIGH-LEVEL AND PROJECT-WIDE ONLY. Each entry is a standard the whole product holds to,
|
|
211
213
|
stated so it can be checked on ANY surface — never a screen, page, layout, navigation
|
|
212
|
-
model, component or visual-design choice. Those are the prototype's and
|
|
214
|
+
model, component or visual-design choice. Those are the prototype's and frontend-plan.md's
|
|
213
215
|
to settle. An entry that can be satisfied only one way has stopped being a standard and
|
|
214
216
|
has become a design decision in the wrong document.
|
|
215
217
|
|
|
216
|
-
Give each a STABLE id (UX-001, …). Its OWN id class on purpose: ui
|
|
218
|
+
Give each a STABLE id (UX-001, …). Its OWN id class on purpose: plan-ui and the UI
|
|
217
219
|
code gate review and verify these separately from the service lane, so the two never
|
|
218
220
|
have to be untangled out of one list. The consequence to respect — the service-side
|
|
219
221
|
gates (analyze-design, analyze-slice) trace CN- and never read this section, so a bound
|
|
@@ -275,7 +277,7 @@
|
|
|
275
277
|
Fenced out of the ledger ON PURPOSE. The sha256 that guards this document covers the
|
|
276
278
|
CONTRACT, and this section is not contract — it is a projection of the backlog. Were it
|
|
277
279
|
inside the hash, creating a story would look like an unledgered spec edit and refuse the
|
|
278
|
-
next
|
|
280
|
+
next sync-stories; were it visible to the diff, adding a story would read as a
|
|
279
281
|
requirement change and mint a version row. So spec-check, spec-diff and ledger-append
|
|
280
282
|
all cut this block out before they look at anything.
|
|
281
283
|
-->
|
|
@@ -283,7 +285,7 @@
|
|
|
283
285
|
<!-- AW:COVERAGE:BEGIN -->
|
|
284
286
|
| Requirement | Open stories | Closed / cancelled |
|
|
285
287
|
|-------------|--------------|--------------------|
|
|
286
|
-
| _(none yet — run /appweaver
|
|
288
|
+
| _(none yet — run /appweaver sync-stories to raise the backlog)_ | | |
|
|
287
289
|
<!-- AW:COVERAGE:END -->
|
|
288
290
|
|
|
289
291
|
## Change History
|
|
@@ -294,12 +296,12 @@
|
|
|
294
296
|
Each row names the requirement ids that version touched. Every story records the spec
|
|
295
297
|
version it last synced at (spec_version: in its frontmatter), so a story is stale when
|
|
296
298
|
some row above its version names an id that story cites — one version comparison, no
|
|
297
|
-
per-requirement content hashing.
|
|
299
|
+
per-requirement content hashing. sync-stories reads the rows to refresh the backlog;
|
|
298
300
|
update-spec appends one when it folds a hand-edited story back into this document.
|
|
299
301
|
|
|
300
302
|
The ledger is hand-written, so it is guarded. active_version.json carries a sha256 of
|
|
301
303
|
this whole file as of the last ledger-aware write. A body that has changed while the
|
|
302
|
-
version stands still is a hand edit that skipped the ledger:
|
|
304
|
+
version stands still is a hand edit that skipped the ledger: sync-stories and
|
|
303
305
|
check-stories refuse until a row is added, because otherwise every affected story goes
|
|
304
306
|
quietly stale and nothing says so.
|
|
305
307
|
|
|
@@ -6,6 +6,7 @@ title: [one line — the outcome this story delivers]
|
|
|
6
6
|
exercises: []
|
|
7
7
|
spec_version: [vN.N]
|
|
8
8
|
depends_on: []
|
|
9
|
+
wave: 1
|
|
9
10
|
follows:
|
|
10
11
|
work_item:
|
|
11
12
|
created: [DATE]
|
|
@@ -15,7 +16,10 @@ created: [DATE]
|
|
|
15
16
|
USER STORY — one execution slice over a feature's spec.
|
|
16
17
|
|
|
17
18
|
Canonical home: specs/<Feature>/stories/<Feature-NNN>.md
|
|
18
|
-
Execution artefacts, once story-
|
|
19
|
+
Execution artefacts, once story-plan has run: specs/<Feature>/stories/<Feature-NNN>/
|
|
20
|
+
(story-backend-plan.md and story-frontend-plan.md — the ephemeral designs, one per
|
|
21
|
+
declared lane; every run appends a pass to each lane in scope, the latest pass wins,
|
|
22
|
+
and a hand edit to that pass is what implement builds)
|
|
19
23
|
|
|
20
24
|
A story is a slice of work over a spec that is already written. It is NEVER a proposal
|
|
21
25
|
to change the spec — nothing here merges back into spec.md. When a story genuinely
|
|
@@ -23,7 +27,7 @@ created: [DATE]
|
|
|
23
27
|
checklist -> clarify -> validate loop, and the spec's Change History gains a row.
|
|
24
28
|
|
|
25
29
|
ONE STORY, ONE FEATURE. A story whose design touches a second feature is failed by
|
|
26
|
-
|
|
30
|
+
analysis. Cross-feature ordering goes in depends_on, not in a second story.
|
|
27
31
|
|
|
28
32
|
FRONTMATTER — every field the gates read lives here, so checking the backlog is a
|
|
29
33
|
directory scan rather than a markdown parse.
|
|
@@ -55,26 +59,42 @@ created: [DATE]
|
|
|
55
59
|
|
|
56
60
|
spec_version The spec version this story last synced at. A row above this version
|
|
57
61
|
naming an id in exercises means the story is stale; check-stories
|
|
58
|
-
reports it and
|
|
62
|
+
reports it and sync-stories acts on it. Restamped on every sync.
|
|
59
63
|
|
|
60
64
|
depends_on Story ids that must land first, e.g. [Payment-004]. About CODE ordering,
|
|
61
65
|
not spec: implement warns on an open dependency, which is where calling
|
|
62
66
|
into code that does not exist starts to cost something. close-story
|
|
63
67
|
warns but does not block — a dependency still being open does not make
|
|
64
68
|
this story's own work wrong. A cycle is rejected at authoring time.
|
|
69
|
+
sync-stories writes this as a UNION with what is already here, so an
|
|
70
|
+
edge added by hand — including one naming another feature's story — is
|
|
71
|
+
never lost to a re-sync.
|
|
72
|
+
|
|
73
|
+
wave The dependency LEVEL this story sits at, computed by sync-stories from
|
|
74
|
+
depends_on:. Wave 1 means nothing has to land before it; wave N means
|
|
75
|
+
every story in depends_on: sits in a wave below N. STORIES SHARING A WAVE
|
|
76
|
+
HAVE NO ORDERING BETWEEN THEM and can be picked up in parallel — which is
|
|
77
|
+
why it is a wave and not an order or a priority. A rank would have to
|
|
78
|
+
invent a difference between two stories that genuinely have none, and the
|
|
79
|
+
fact that they are equal is the useful half.
|
|
80
|
+
|
|
81
|
+
It says when a story becomes ELIGIBLE, not when anyone should start it.
|
|
82
|
+
Nothing waits for a whole wave to finish: a story is startable the moment
|
|
83
|
+
its own dependencies are done, whatever else shares its wave. A story
|
|
84
|
+
raised by hand floors at 1 — nothing is KNOWN to come first.
|
|
65
85
|
|
|
66
86
|
follows On a follow-on only: the story id this one carries the remainder of.
|
|
67
|
-
When the spec moves under a story that already has a story
|
|
68
|
-
|
|
87
|
+
When the spec moves under a story that already has a story plan,
|
|
88
|
+
sync-stories leaves that story untouched and mints a follow-on
|
|
69
89
|
instead. There is no superseded status; the link is the whole record.
|
|
70
90
|
|
|
71
91
|
work_item Optional tracker id (JIRA-1234). The kit's id and the tracker's id stay
|
|
72
92
|
separate so the kit depends on no particular tracker.
|
|
73
93
|
|
|
74
94
|
CHANGE-STORY-ID IS LEGAL only while the story is open and stories/<ID>/ does not exist.
|
|
75
|
-
After story-
|
|
76
|
-
|
|
77
|
-
|
|
95
|
+
After story-plan runs, the id is in that directory's name, in the OKF log, in commit
|
|
96
|
+
messages and branch names — most of which the kit cannot rewrite. (The story plan's
|
|
97
|
+
TEXT never carries the id; its directory is its identity.)
|
|
78
98
|
|
|
79
99
|
stories.md beside this file is a GENERATED index. Never hand-edit it; it is rebuilt
|
|
80
100
|
from this directory, which is what keeps close-story conflict-free.
|
|
@@ -93,6 +113,26 @@ As a [role], I want [capability], so that [outcome].
|
|
|
93
113
|
|
|
94
114
|
- **[FR-00n]** — [the part of this requirement this story delivers]
|
|
95
115
|
|
|
116
|
+
## Constraints
|
|
117
|
+
|
|
118
|
+
<!-- The spec-level bounds this slice must satisfy, carried BY ID from spec.md and never
|
|
119
|
+
restated — the spec is the wording, this is the subset that binds this story:
|
|
120
|
+
|
|
121
|
+
CN- constraints & NFRs DC- data classification
|
|
122
|
+
IC- integration contracts UX- experience standards
|
|
123
|
+
|
|
124
|
+
Plus the Experience Scope floors (device / browser / assistive technology) wherever
|
|
125
|
+
this slice has a UI surface. UX- and the floors are what stop a story being built to
|
|
126
|
+
a standard the product does not hold, and they are the half most often lost: they
|
|
127
|
+
reach no UI phase except through the story.
|
|
128
|
+
|
|
129
|
+
These are NOT in `exercises:`. That field is FR-/BR- only, because it is the
|
|
130
|
+
delivery relation — what this story DELIVERS — and a constraint is not delivered,
|
|
131
|
+
it is met. story-plan carries these ids into its design pass; analyze-slice
|
|
132
|
+
traces it. Write "None" for a class that does not touch this story. -->
|
|
133
|
+
|
|
134
|
+
- **[UX-00n]** — [what this slice must satisfy of it]
|
|
135
|
+
|
|
96
136
|
## Acceptance
|
|
97
137
|
|
|
98
138
|
<!-- Checkable statements, in the spec's vocabulary. These are what analyze-slice pairs
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
**Aggregate (feature)**: `[Aggregate]` <!-- the feature = the aggregate, e.g. Order -->
|
|
4
4
|
|
|
5
|
-
**Design home**: `specs/[Aggregate]/
|
|
5
|
+
**Design home**: `specs/[Aggregate]/frontend-plan.md` <!-- the frontend lane; the service twin is backend-plan.md, owned by /appweaver plan -->
|
|
6
6
|
|
|
7
7
|
**Source spec**: `specs/[Aggregate]/spec.md`
|
|
8
8
|
|
|
9
9
|
**Lane**: `[lane id]` — the frontend lane declared in `.appweaver/stacks.json`
|
|
10
10
|
|
|
11
|
-
**Version**: v1.0 <!--
|
|
11
|
+
**Version**: v1.0 <!-- SCRIPT-OWNED: plan-stamp sets this to the spec version this plan derives from. Never edit it by hand. -->
|
|
12
12
|
|
|
13
13
|
**Status**: Draft
|
|
14
14
|
|
|
@@ -16,23 +16,36 @@
|
|
|
16
16
|
WHAT THIS DOCUMENT IS
|
|
17
17
|
=====================
|
|
18
18
|
The single, living High-Level Design for ONE feature's EXPERIENCE — the
|
|
19
|
-
|
|
20
|
-
(WHAT/WHY, tech-agnostic)
|
|
21
|
-
It carries screens, navigation,
|
|
22
|
-
the service binding. It is NOT code,
|
|
19
|
+
FEATURE-LEVEL ARCHITECTURAL CONFIRMATION for the frontend lane, twin of
|
|
20
|
+
backend-plan.md. It is the MEDIATOR between spec.md (WHAT/WHY, tech-agnostic)
|
|
21
|
+
and the frontend code `implement-ui` generates. It carries screens, navigation,
|
|
22
|
+
client state, composition, interaction and the service binding. It is NOT code,
|
|
23
|
+
and it is NOT a visual comp.
|
|
23
24
|
|
|
24
|
-
spec.md ──▶
|
|
25
|
-
behaviour structure &
|
|
26
|
-
(UX/
|
|
25
|
+
spec.md ──▶ frontend-plan.md ──▶ story-frontend-plan.md ──▶ frontend code (+ tests)
|
|
26
|
+
behaviour structure & the story's slice generated by `implement-ui`
|
|
27
|
+
(UX/FR/CN/SC) decisions (concrete, ephemeral)
|
|
28
|
+
|
|
29
|
+
It is LONG-LIVED and moves FORWARD with the spec: /appweaver plan-ui authors it,
|
|
30
|
+
and conforms it whenever the spec's Change History says something it realises has
|
|
31
|
+
moved. Story designs READ it and never write back — nothing merges into it.
|
|
27
32
|
|
|
28
33
|
ANCHORING RULES
|
|
29
|
-
- Every element traces UP to a spec id (UX-/
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
- Every element traces UP to a spec id (UX-/FR-/CN-/DC-/IC-/SC-) and the spec's
|
|
35
|
+
experience obligations are covered DOWN here (§7 Traceability). No screen
|
|
36
|
+
without a spec reason; no requirement without a screen home.
|
|
37
|
+
- NO STORY IDS ANYWHERE IN THIS DOCUMENT. Stories live in stories/ and cite the
|
|
38
|
+
requirement ids they deliver; this plan traces to UX-/FR-, which is what keeps
|
|
39
|
+
it stable while the backlog churns.
|
|
40
|
+
- THE CODE IS THE WHAT-EXISTS INPUT, and it is a different authority from the
|
|
41
|
+
spec. Where a frontend already realises this feature, ADJUST to the composition,
|
|
42
|
+
naming and state handling that are actually there rather than to an idealised
|
|
43
|
+
shape. The code never overrides the spec on required behaviour; a deliberate
|
|
44
|
+
divergence is a §9 WA-n.
|
|
32
45
|
- UX- LIVES HERE AND ONLY HERE. The spec's Experience Standards are this
|
|
33
|
-
document's to realise —
|
|
34
|
-
reaches neither
|
|
35
|
-
- THE SPEC IS THE ONLY DOMAIN INPUT — the same rule
|
|
46
|
+
document's to realise — backend-plan.md deliberately excludes them, so a UX-
|
|
47
|
+
that reaches neither plan is a dropped requirement.
|
|
48
|
+
- THE SPEC IS THE ONLY DOMAIN INPUT — the same rule backend-plan.md keeps. This
|
|
36
49
|
document reads the spec + the lane's own standards, never the domain rule
|
|
37
50
|
files. A domain rule the spec omits is an §8 assumption, never an invention.
|
|
38
51
|
- THE SERVICE LANE ENTERS ONLY AT §5. Cite the operations this surface
|
|
@@ -103,7 +116,7 @@
|
|
|
103
116
|
|
|
104
117
|
| Screen | Purpose | Entered from | Leads to | Serves |
|
|
105
118
|
|---|---|---|---|---|
|
|
106
|
-
| `[Screen]` | [the decision made here] | [entry point] | [next screens] |
|
|
119
|
+
| `[Screen]` | [the decision made here] | [entry point] | [next screens] | FR-[nnn] · UX-[n] |
|
|
107
120
|
|
|
108
121
|
**Route / navigation shape**: [how screens are addressed and nested, stated
|
|
109
122
|
conceptually — a path pattern, a stack, a tab set — never named after a router.]
|
|
@@ -148,7 +161,7 @@ anything the service alone may decide. Cite the DC-/CN- id.]
|
|
|
148
161
|
|
|
149
162
|
| Component | Responsibility | Inputs (field shape) | Events raised | Serves |
|
|
150
163
|
|---|---|---|---|---|
|
|
151
|
-
| `[Component]` | [single responsibility] | [field: type, …] | `[event]` | FR-[nnn] ·
|
|
164
|
+
| `[Component]` | [single responsibility] | [field: type, …] | `[event]` | FR-[nnn] · UX-[n] |
|
|
152
165
|
|
|
153
166
|
### 3.n [COMPOSITION AXIS NAME]
|
|
154
167
|
|
|
@@ -170,7 +183,7 @@ decision recorded in §8.]
|
|
|
170
183
|
|
|
171
184
|
| Interaction | States | What the user sees | Serves |
|
|
172
185
|
|---|---|---|---|
|
|
173
|
-
| `[interaction]` | [idle → in-flight → success / error / empty / denied] | [per-state behaviour] |
|
|
186
|
+
| `[interaction]` | [idle → in-flight → success / error / empty / denied] | [per-state behaviour] | FR-[nnn] · UX-[n] |
|
|
174
187
|
|
|
175
188
|
**Validation & feedback**: [when validation runs and how failures are surfaced,
|
|
176
189
|
citing the BR-/FR- ids being echoed. A client-side check NEVER replaces the
|
|
@@ -187,22 +200,33 @@ a lost connection mid-flight.]
|
|
|
187
200
|
## 5. Contract Binding
|
|
188
201
|
|
|
189
202
|
<!-- THE LANE BOUNDARY. One row per service operation this feature's UI depends
|
|
190
|
-
on. Bind against the service's PUBLISHED SURFACE — the
|
|
191
|
-
the
|
|
192
|
-
internals: no table, no handler, no persistence assumption
|
|
193
|
-
line. An interface the experience needs and the service does not
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
| `[Screen]` | `[operation]` | [field: type, …] | [field: type, …] | [the §4 state it produces] | FR-[nnn]
|
|
203
|
+
on. Bind against the service's PUBLISHED SURFACE — the entries in
|
|
204
|
+
`interfaces.md` (cited by IF- id) and the spec's IC- ids — and never against
|
|
205
|
+
the service's internals: no table, no handler, no persistence assumption
|
|
206
|
+
crosses this line. An interface the experience needs and the service does not
|
|
207
|
+
publish is raised back to the service lane, never worked around in the client. -->
|
|
208
|
+
|
|
209
|
+
| Screen / component | Operation | IF- id | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
|
|
210
|
+
|---|---|---|---|---|---|---|
|
|
211
|
+
| `[Screen]` | `[operation]` | IF-00n | [field: type, …] | [field: type, …] | [the §4 state it produces] | FR-[nnn] · IC-[nnn] |
|
|
212
|
+
| `[Screen]` | `[operation]` | (unpublished) | [field: type, …] | [field: type, …] | [the §4 state it produces] | FR-[nnn] |
|
|
200
213
|
|
|
201
214
|
**Write semantics**: [per mutating operation — optimistic or pessimistic, what
|
|
202
215
|
it invalidates, and how an optimistic update rolls back.]
|
|
203
216
|
|
|
204
|
-
**Contract
|
|
205
|
-
|
|
217
|
+
**Contract gaps to raise**: [every row above whose IF- id reads `(unpublished)` —
|
|
218
|
+
what the experience needs that `interfaces.md` does not yet carry. These are raised
|
|
219
|
+
back to the service lane, which publishes them by running /appweaver plan; this lane
|
|
220
|
+
never writes the log. Or `None`.]
|
|
221
|
+
|
|
222
|
+
<!-- WHERE THE CONTRACT LIVES. The service lane's published surface is
|
|
223
|
+
`specs/[Aggregate]/interfaces.md` — the APPEND-ONLY interface log /appweaver plan
|
|
224
|
+
publishes. Bind to the LATEST entry per interface (an entry naming an earlier id
|
|
225
|
+
in `supersedes:` replaces it) and CITE IT BY IF- id in the rows above; never
|
|
226
|
+
restate the contract here, and NEVER write to the log — this lane consumes it.
|
|
227
|
+
An entry at `status: proposed` is the designed contract and is bindable. Where
|
|
228
|
+
the log does not exist yet (the service lane has not planned this feature), bind
|
|
229
|
+
from the spec's IC- ids and record a §8 DA-n saying so. -->
|
|
206
230
|
|
|
207
231
|
## 6. Cross-Cutting
|
|
208
232
|
|
|
@@ -227,13 +251,13 @@ surface does not offer, raised back to the service lane. Or `None`.]
|
|
|
227
251
|
<!-- The two-way guarantee for the lane: every experience obligation in the spec
|
|
228
252
|
has a home here, and every UI element has a spec reason. The last column
|
|
229
253
|
names THIS document's own sections.
|
|
230
|
-
|
|
231
|
-
requirement —
|
|
254
|
+
An FR- with a UI surface and no screen is a coverage failure. A UX- with no row
|
|
255
|
+
is a dropped requirement — backend-plan.md does not carry them, so this is their
|
|
256
|
+
only home. -->
|
|
232
257
|
|
|
233
258
|
| Spec id | Type | UI element(s) | Section |
|
|
234
259
|
|---|---|---|---|
|
|
235
260
|
| UX-[n] | experience standard | [where realised] | [§] |
|
|
236
|
-
| US-[n] | story | [screens + flow realising it] | [§ refs] |
|
|
237
261
|
| FR-[nnn] | requirement | [screen / component / state] | [§] |
|
|
238
262
|
| CN-[nnn] | constraint | [where honoured in the UI] | [§] |
|
|
239
263
|
| DC-[nnn] | classification | [what is withheld from the client] | §6 |
|
|
@@ -264,10 +288,18 @@ surface does not offer, raised back to the service lane. Or `None`.]
|
|
|
264
288
|
|
|
265
289
|
## Change History
|
|
266
290
|
|
|
267
|
-
<!--
|
|
268
|
-
|
|
269
|
-
|
|
291
|
+
<!-- The living-truth ledger, in lockstep with spec.md — MANDATORY, and the one
|
|
292
|
+
section whose loss is refused rather than absorbed: plan-stamp writes no baseline
|
|
293
|
+
at all if it went missing, so a dropped ledger can never be silently stamped over.
|
|
294
|
+
|
|
295
|
+
SCRIPT-OWNED. `plan-stamp` is the only writer: one row per update naming the
|
|
296
|
+
requirement ids conformed, and the **Version** header moved to the spec version
|
|
297
|
+
this plan now derives from. The model writes NO version and NO row, ever.
|
|
298
|
+
Newest last.
|
|
299
|
+
|
|
300
|
+
Three columns, matching exactly what the stamp writes: the derived spec version,
|
|
301
|
+
the date, and what changed (the conformed ids are carried in that cell). -->
|
|
270
302
|
|
|
271
|
-
| Version | Date | Change |
|
|
272
|
-
|
|
273
|
-
| v1.0 | [DATE] | Initial UI design |
|
|
303
|
+
| Version | Date | Change |
|
|
304
|
+
|---------|------|--------|
|
|
305
|
+
| v1.0 | [DATE] | Initial UI design |
|
|
@@ -70,11 +70,18 @@ through the spec/design (as CN-/DC-/IC- ids).
|
|
|
70
70
|
- guardrails/domain/healthcare/api-versioning.domain.md
|
|
71
71
|
- guardrails/domain/healthcare/vertical-slices.domain.md
|
|
72
72
|
|
|
73
|
-
## /aw-spec-
|
|
74
|
-
_None — design loads no domain file. Domain reaches
|
|
73
|
+
## /aw-spec-plan
|
|
74
|
+
_None — the service lane's design loads no domain file. Domain reaches it only through the spec
|
|
75
|
+
(BR-/CN-/DC-/IC-)._
|
|
76
|
+
|
|
77
|
+
## /aw-spec-plan-ui
|
|
78
|
+
_None — the frontend lane's design loads no domain file either, for the same reason: domain
|
|
79
|
+
reaches frontend-plan.md as spec ids (UX-/CN-/DC-/IC-). Stated rather than left absent, because
|
|
80
|
+
an absent heading and an empty one behave identically and only one of them is a decision._
|
|
75
81
|
|
|
76
82
|
## /aw-spec-implement
|
|
77
|
-
_None — implement loads no domain file. Domain reaches implement only through
|
|
83
|
+
_None — implement loads no domain file. Domain reaches implement only through backend-plan.md and
|
|
84
|
+
the story's design pass. Framework
|
|
78
85
|
components are added separately via `/appweaver add-component`._
|
|
79
86
|
|
|
80
87
|
## /aw-spec-gate
|
|
@@ -104,10 +111,15 @@ components are added separately via `/appweaver add-component`._
|
|
|
104
111
|
|---|---|---|
|
|
105
112
|
| /aw-spec-constitution | 14 | domain principles (XVI+) — the industry constitution + standard industry rules + the project's own requirements |
|
|
106
113
|
| /aw-spec-specify | 19 | author into spec (lift → CN-/DC-/IC-) |
|
|
107
|
-
| /aw-spec-
|
|
114
|
+
| /aw-spec-plan | 0 | none — spec is the only domain input |
|
|
115
|
+
| /aw-spec-plan-ui | 0 | none — spec is the only domain input |
|
|
108
116
|
| /aw-spec-implement | 0 | none — design is the only domain input |
|
|
109
117
|
| /aw-spec-gate | 14 | conformance checklist (validate, don't author) |
|
|
110
118
|
|
|
111
|
-
> Retired in the orchestrator pipeline: `/aw-spec-
|
|
112
|
-
> `/aw-spec-
|
|
113
|
-
>
|
|
119
|
+
> Retired in the orchestrator pipeline: `/aw-spec-tasks`, `/aw-spec-taskplan`, `/aw-spec-clarify`,
|
|
120
|
+
> `/aw-spec-analyze` (clarify folds into specify; tasks into the design phase). The collapsed tiers
|
|
121
|
+
> `/aw-spec-fast-implement` and `/aw-spec-minimal-implementation` are pending a ruling.
|
|
122
|
+
>
|
|
123
|
+
> `/aw-spec-plan` is NOT retired. The name was once a dead phase and is now the LIVE service-lane
|
|
124
|
+
> design command (`design` was renamed to `plan`, `design-ui` to `plan-ui`); its heading above is
|
|
125
|
+
> current, and `/appweaver story-plan` reads the same slot.
|
|
@@ -15,7 +15,7 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
15
15
|
`guardrails/technology/nextjs/` (the frontend lane). Both are **standard rules shared by
|
|
16
16
|
every project that maps them**, and neither is domain-specific. The frontend corpus is
|
|
17
17
|
read by three headings — `## /aw-spec-ui-constitution` ratifies the lane's base, and
|
|
18
|
-
`## /aw-spec-
|
|
18
|
+
`## /aw-spec-plan-ui` / `## /aw-spec-implement-ui` carry the detail rules under it.
|
|
19
19
|
- The two files this project authors — `service/technical-requirements.md` and
|
|
20
20
|
`frontend/ui-requirements.md` — live beside this map. They are the only mapped technical
|
|
21
21
|
files expected to differ between two projects on the same stacks.
|
|
@@ -64,7 +64,7 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
64
64
|
|
|
65
65
|
⚠ The ux/ files sit in a DOMAIN corpus folder but are TECHNICAL-tier inputs: a file's
|
|
66
66
|
tier is the map that lists it, not the folder it lives in. guardrails/domain/healthcare/
|
|
67
|
-
ihe-conformance.md under ## /aw-spec-
|
|
67
|
+
ihe-conformance.md under ## /aw-spec-plan is the same pattern. Unmapping them does not
|
|
68
68
|
make the spec's Experience Standards section disappear — the section is unconditional and
|
|
69
69
|
resolves to "None" — it removes the methodology specify fills it from. -->
|
|
70
70
|
- guardrails/technology/dotnet-webapi/domain-driven-design.md
|
|
@@ -74,10 +74,17 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
74
74
|
- guardrails/domain/healthcare/ux/accessibility-standards.md
|
|
75
75
|
- guardrails/domain/healthcare/ux/content-design.md
|
|
76
76
|
|
|
77
|
-
## /aw-spec-
|
|
77
|
+
## /aw-spec-plan
|
|
78
78
|
<!-- The technical/architecture rule files the design author works from (alongside the
|
|
79
|
-
spec and constitution.technical.md), each followed by its worked example.
|
|
80
|
-
|
|
79
|
+
spec and constitution.technical.md), each followed by its worked example. Also read by
|
|
80
|
+
/appweaver story-plan, which reuses this slot deliberately: a story's execution design
|
|
81
|
+
answers to the same HOW rules as the feature plan it derives from.
|
|
82
|
+
|
|
83
|
+
NO DOMAIN-TIER FILE HERE — the domain reaches design only as spec ids (BR-/CN-/DC-/IC-).
|
|
84
|
+
The one bullet under guardrails/domain/ is not an exception to that: TIER IS DECIDED BY
|
|
85
|
+
THE MAP THAT LISTS A FILE, NOT BY THE FOLDER IT SITS IN, so ihe-conformance.md is bound
|
|
86
|
+
here as a TECHNICAL interop rule (the wire-level conformance the design must realise),
|
|
87
|
+
not as domain authoring input. Nothing from domain-rule-bindings reaches this phase. -->
|
|
81
88
|
- guardrails/technology/dotnet-webapi/clean-architecture.md
|
|
82
89
|
- guardrails/technology/dotnet-webapi/cqrs.md
|
|
83
90
|
- guardrails/technology/dotnet-webapi/eventing.md
|
|
@@ -103,13 +110,13 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
103
110
|
- guardrails/technology/dotnet-webapi/examples/authorization.md
|
|
104
111
|
- guardrails/technology/dotnet-webapi/examples/auditing.md
|
|
105
112
|
|
|
106
|
-
## /aw-spec-
|
|
107
|
-
<!-- The FRONTEND LANE's design phase
|
|
108
|
-
the two lanes are governed by different
|
|
109
|
-
paths, so keying the map on this command name
|
|
110
|
-
mechanism change. NO domain file here — the
|
|
111
|
-
exactly as it reaches
|
|
112
|
-
referred to directly and is NOT mapped.
|
|
113
|
+
## /aw-spec-plan-ui
|
|
114
|
+
<!-- The FRONTEND LANE's design phase — /appweaver plan-ui, authoring frontend-plan.md. Its
|
|
115
|
+
own heading, not a branch of ## /aw-spec-plan: the two lanes are governed by different
|
|
116
|
+
constitution halves and own disjoint source paths, so keying the map on this command name
|
|
117
|
+
gives the lane its own rule set for zero mechanism change. NO domain file here — the
|
|
118
|
+
domain reaches frontend-plan.md as spec ids, exactly as it reaches backend-plan.md. The
|
|
119
|
+
lane's ratified base (constitution.ui.md) is referred to directly and is NOT mapped.
|
|
113
120
|
|
|
114
121
|
THE SERVICE LANE ENTERS THROUGH ONE FILE. api-integration.{{backend_stack}}.md is the
|
|
115
122
|
CROSS-LANE pairing rule set — what the service guarantees (paging shape, concurrency
|
|
@@ -119,8 +126,10 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
119
126
|
api-integration.java-spring.md in a Spring repo — both authored — and to a REPORTED
|
|
120
127
|
missing file for a backend whose pairing nobody has written yet, rather than silently
|
|
121
128
|
loading one stack's assumptions into another. A repo with no backend lane skips the
|
|
122
|
-
bullet entirely. No other service-lane file is mapped here
|
|
123
|
-
published surface,
|
|
129
|
+
bullet entirely. No other service-lane file is mapped here, and none is needed: the
|
|
130
|
+
service's published surface reaches this lane as DATA, not as rules — specs/<F>/
|
|
131
|
+
interfaces.md, the append-only interface log /appweaver plan publishes, which
|
|
132
|
+
frontend-plan.md §5 binds to by IF- id. Never the service's internals. -->
|
|
124
133
|
- guardrails/technology/nextjs/component-architecture.md
|
|
125
134
|
- guardrails/technology/nextjs/routing-navigation.md
|
|
126
135
|
- guardrails/technology/nextjs/state-management.md
|
|
@@ -135,8 +144,8 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
135
144
|
|
|
136
145
|
## /aw-spec-implement
|
|
137
146
|
<!-- The FRAMEWORK / code-generation rule files the code generator builds against
|
|
138
|
-
(alongside
|
|
139
|
-
reaches implement only through
|
|
147
|
+
(alongside backend-plan.md, the story's design pass and constitution.technical.md).
|
|
148
|
+
NO domain file — domain reaches implement only through those. clean-architecture/cqrs are design
|
|
140
149
|
concerns; component wiring is a separate /appweaver add-component step. -->
|
|
141
150
|
- guardrails/technology/dotnet-webapi/coding-standards.md
|
|
142
151
|
- guardrails/technology/dotnet-webapi/dependency-policy.md
|
|
@@ -146,9 +155,9 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
146
155
|
|
|
147
156
|
## /aw-spec-implement-ui
|
|
148
157
|
<!-- The FRONTEND LANE's code-generation set — the HOW the UI generator builds against,
|
|
149
|
-
alongside
|
|
150
|
-
through spec ->
|
|
151
|
-
this phase never writes outside the lane's declared source path.
|
|
158
|
+
alongside frontend-plan.md and constitution.ui.md. NO domain file: domain reached the
|
|
159
|
+
lane through spec -> frontend-plan.md. NO service-lane file beyond the pairing rules
|
|
160
|
+
below — this phase never writes outside the lane's declared source path.
|
|
152
161
|
|
|
153
162
|
EIGHT FILES ARE MAPPED FOR BOTH LANE PHASES on purpose. error-handling,
|
|
154
163
|
forms-and-validation, auth-session, design-system, accessibility-implementation, i18n,
|
|
@@ -172,7 +181,7 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
172
181
|
|
|
173
182
|
## /aw-spec-implement-delta
|
|
174
183
|
<!-- The CR analog of implement — same FRAMEWORK / code-generation set (HOW to build).
|
|
175
|
-
The delta's code is generated against the master
|
|
184
|
+
The delta's code is generated against the master backend-plan.md + delta-design.md; no
|
|
176
185
|
domain file (domain reached the delta via delta-spec → delta-design). -->
|
|
177
186
|
- guardrails/technology/dotnet-webapi/coding-standards.md
|
|
178
187
|
- guardrails/technology/dotnet-webapi/dependency-policy.md
|
|
@@ -190,7 +199,7 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
190
199
|
- guardrails/technology/dotnet-webapi/examples/clean-architecture.md
|
|
191
200
|
|
|
192
201
|
## /aw-spec-analyze-slice
|
|
193
|
-
<!-- The
|
|
202
|
+
<!-- The spec↔code conformance gate's TECHNICAL checklist: the code + tests are
|
|
194
203
|
validated against these (alongside the DOMAIN gate overlays, loaded separately via
|
|
195
204
|
resolve-domain `## /aw-spec-gate`). Validation input only — never authoring. -->
|
|
196
205
|
- guardrails/technology/dotnet-webapi/testing.md
|
|
@@ -246,13 +255,13 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
246
255
|
| Command | Technical rule files | Role |
|
|
247
256
|
|---|---|---|
|
|
248
257
|
| /aw-spec-specify | 6 | the modelling methodology the spec is expressed in: DDD for the domain model (+ its example), and the four ux/ rules for the experience model it lifts as UX- ids — no technology |
|
|
249
|
-
| /aw-spec-
|
|
250
|
-
| /aw-spec-
|
|
251
|
-
| /aw-spec-implement | 5 | governance/architecture the code generator builds against (from
|
|
252
|
-
| /aw-spec-implement-ui | 13 | the frontend lane's code-generation set the UI generator builds against (from
|
|
258
|
+
| /aw-spec-plan | 24 | architecture/security/interop the design author mediates the spec against, each with its example (also read by story-plan) |
|
|
259
|
+
| /aw-spec-plan-ui | 11 | the frontend lane's design set — composition, routing, client state, interaction states, forms, auth surface, design system, accessibility, i18n, performance, and the cross-lane API pairing the UI design author works from (from spec.md + interfaces.md) |
|
|
260
|
+
| /aw-spec-implement | 5 | governance/architecture the code generator builds against (from backend-plan.md + the story's design pass) |
|
|
261
|
+
| /aw-spec-implement-ui | 13 | the frontend lane's code-generation set the UI generator builds against (from frontend-plan.md) — conventions, the generated client + its service pairing, auth, client security, states, forms, design system, accessibility, i18n, performance, observability and testing |
|
|
253
262
|
| /aw-spec-implement-delta | 5 | same code-generation set, scoped to the open change's delta-design |
|
|
254
263
|
| /aw-spec-build | 3 | layering + coding rules the compile-fixer respects, + the layering example |
|
|
255
|
-
| /aw-spec-analyze-slice | 2 | testing + coding rules the
|
|
264
|
+
| /aw-spec-analyze-slice | 2 | testing + coding rules the spec↔code gate validates against |
|
|
256
265
|
| /aw-spec-constitution | 17 | what the technical half ratifies — the technology base, the standard technical rules, and the project team's technical-requirements.md |
|
|
257
266
|
| /aw-spec-ui-constitution | 2 | what the frontend lane's half ratifies — the UI base + the project team's ui-requirements.md — and the signal that the lane exists |
|
|
258
267
|
| /aw-spec-run | 2 | persistence rules the execution / data-migration step generates against, + its example |
|
package/package.json
CHANGED