aw-spec-cli 0.1.16 → 0.1.17
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,14 +1,14 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Frontend Plan: [AGGREGATE]
|
|
2
2
|
|
|
3
3
|
**Aggregate (feature)**: `[Aggregate]` <!-- the feature = the aggregate, e.g. Order -->
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**Plan home**: `specs/[Aggregate]/frontend-plan.md`
|
|
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 <!-- moves in lockstep with spec.md and backend-plan.md; one change closes on ONE bump -->
|
|
12
12
|
|
|
13
13
|
**Status**: Draft
|
|
14
14
|
|
|
@@ -16,35 +16,22 @@
|
|
|
16
16
|
WHAT THIS DOCUMENT IS
|
|
17
17
|
=====================
|
|
18
18
|
The single, living High-Level Design for ONE feature's EXPERIENCE — the
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
and it is NOT a visual comp.
|
|
19
|
+
frontend lane's twin of backend-plan.md. It is the MEDIATOR between spec.md
|
|
20
|
+
(WHAT/WHY, tech-agnostic) and the frontend code `implement` generates in this lane.
|
|
21
|
+
It carries screens, navigation, client state, composition, interaction and
|
|
22
|
+
the service binding. It is NOT code, and it is NOT a visual comp.
|
|
24
23
|
|
|
25
|
-
spec.md ──▶ frontend-plan.md ──▶
|
|
26
|
-
behaviour structure &
|
|
27
|
-
(UX/FR/
|
|
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.
|
|
24
|
+
spec.md ──▶ frontend-plan.md ──▶ frontend code (+ tests)
|
|
25
|
+
behaviour structure & generated by `implement`, frontend lane
|
|
26
|
+
(UX/US/FR/SC) decisions (framework bound at generation time)
|
|
32
27
|
|
|
33
28
|
ANCHORING RULES
|
|
34
|
-
- Every element traces UP to a spec id (UX-/FR-/CN-/DC-/IC-/SC-) and the
|
|
35
|
-
experience obligations are covered DOWN here (§7 Traceability). No
|
|
36
|
-
without a spec reason; no
|
|
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.
|
|
29
|
+
- Every element traces UP to a spec id (UX-/US-/FR-/CN-/DC-/IC-/SC-) and the
|
|
30
|
+
spec's experience obligations are covered DOWN here (§7 Traceability). No
|
|
31
|
+
screen without a spec reason; no user story without a screen home.
|
|
45
32
|
- UX- LIVES HERE AND ONLY HERE. The spec's Experience Standards are this
|
|
46
|
-
document's to realise — backend-plan.md deliberately excludes them, so a UX-
|
|
47
|
-
|
|
33
|
+
document's to realise — backend-plan.md deliberately excludes them, so a UX- that
|
|
34
|
+
reaches neither design is a dropped requirement.
|
|
48
35
|
- THE SPEC IS THE ONLY DOMAIN INPUT — the same rule backend-plan.md keeps. This
|
|
49
36
|
document reads the spec + the lane's own standards, never the domain rule
|
|
50
37
|
files. A domain rule the spec omits is an §8 assumption, never an invention.
|
|
@@ -62,16 +49,16 @@
|
|
|
62
49
|
approach. Describe a component by its RESPONSIBILITY, its INPUTS (props /
|
|
63
50
|
params as field shapes), the EVENTS it raises and the STATES it can be in.
|
|
64
51
|
The same design must be realisable on another frontend stack without edits.
|
|
65
|
-
The framework binds
|
|
66
|
-
|
|
52
|
+
The framework binds in `implement`'s frontend lane, from constitution.ui.md
|
|
53
|
+
+ that lane's rule set.
|
|
67
54
|
|
|
68
55
|
WHAT LIVES ELSEWHERE (do NOT repeat it here — it is identical for every feature)
|
|
69
56
|
- The lane's folder structure, naming conventions, forbidden patterns and CI
|
|
70
57
|
gates are constitution.ui.md's. This document uses them; it does not restate
|
|
71
58
|
them.
|
|
72
59
|
- HOW to turn this design into components (file placement, one-component-per-
|
|
73
|
-
file, test pairing, client generation) is a solution-wide rule applied
|
|
74
|
-
`implement
|
|
60
|
+
file, test pairing, client generation) is a solution-wide rule applied in
|
|
61
|
+
`implement`'s frontend lane.
|
|
75
62
|
- The app shell, global layout and the design system belong to no single
|
|
76
63
|
feature. Cite them; do not claim them here.
|
|
77
64
|
|
|
@@ -116,7 +103,7 @@
|
|
|
116
103
|
|
|
117
104
|
| Screen | Purpose | Entered from | Leads to | Serves |
|
|
118
105
|
|---|---|---|---|---|
|
|
119
|
-
| `[Screen]` | [the decision made here] | [entry point] | [next screens] |
|
|
106
|
+
| `[Screen]` | [the decision made here] | [entry point] | [next screens] | US-[n] · FR-[nnn] |
|
|
120
107
|
|
|
121
108
|
**Route / navigation shape**: [how screens are addressed and nested, stated
|
|
122
109
|
conceptually — a path pattern, a stack, a tab set — never named after a router.]
|
|
@@ -161,7 +148,7 @@ anything the service alone may decide. Cite the DC-/CN- id.]
|
|
|
161
148
|
|
|
162
149
|
| Component | Responsibility | Inputs (field shape) | Events raised | Serves |
|
|
163
150
|
|---|---|---|---|---|
|
|
164
|
-
| `[Component]` | [single responsibility] | [field: type, …] | `[event]` | FR-[nnn] ·
|
|
151
|
+
| `[Component]` | [single responsibility] | [field: type, …] | `[event]` | FR-[nnn] · US-[n] |
|
|
165
152
|
|
|
166
153
|
### 3.n [COMPOSITION AXIS NAME]
|
|
167
154
|
|
|
@@ -183,7 +170,7 @@ decision recorded in §8.]
|
|
|
183
170
|
|
|
184
171
|
| Interaction | States | What the user sees | Serves |
|
|
185
172
|
|---|---|---|---|
|
|
186
|
-
| `[interaction]` | [idle → in-flight → success / error / empty / denied] | [per-state behaviour] |
|
|
173
|
+
| `[interaction]` | [idle → in-flight → success / error / empty / denied] | [per-state behaviour] | US-[n] · FR-[nnn] |
|
|
187
174
|
|
|
188
175
|
**Validation & feedback**: [when validation runs and how failures are surfaced,
|
|
189
176
|
citing the BR-/FR- ids being echoed. A client-side check NEVER replaces the
|
|
@@ -200,33 +187,22 @@ a lost connection mid-flight.]
|
|
|
200
187
|
## 5. Contract Binding
|
|
201
188
|
|
|
202
189
|
<!-- THE LANE BOUNDARY. One row per service operation this feature's UI depends
|
|
203
|
-
on. Bind against the service's PUBLISHED SURFACE — the
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
| `[Screen]` | `[operation]` |
|
|
190
|
+
on. Bind against the service's PUBLISHED SURFACE — the spec's IC- ids and
|
|
191
|
+
the API contracts backend-plan.md states — and never against the service's
|
|
192
|
+
internals: no table, no handler, no persistence assumption crosses this
|
|
193
|
+
line. An interface the experience needs and the service does not offer is a
|
|
194
|
+
CONTRACT DELTA raised back to the service lane, never a workaround in the
|
|
195
|
+
client. -->
|
|
196
|
+
|
|
197
|
+
| Screen / component | Operation | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
|
|
198
|
+
|---|---|---|---|---|---|
|
|
199
|
+
| `[Screen]` | `[operation]` | [field: type, …] | [field: type, …] | [the §4 state it produces] | FR-[nnn] · IC-[nnn] |
|
|
213
200
|
|
|
214
201
|
**Write semantics**: [per mutating operation — optimistic or pessimistic, what
|
|
215
202
|
it invalidates, and how an optimistic update rolls back.]
|
|
216
203
|
|
|
217
|
-
**Contract
|
|
218
|
-
|
|
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. -->
|
|
204
|
+
**Contract deltas needed**: [anything the experience requires that the service
|
|
205
|
+
surface does not offer, raised back to the service lane. Or `None`.]
|
|
230
206
|
|
|
231
207
|
## 6. Cross-Cutting
|
|
232
208
|
|
|
@@ -251,13 +227,13 @@ never writes the log. Or `None`.]
|
|
|
251
227
|
<!-- The two-way guarantee for the lane: every experience obligation in the spec
|
|
252
228
|
has a home here, and every UI element has a spec reason. The last column
|
|
253
229
|
names THIS document's own sections.
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
only home. -->
|
|
230
|
+
A US- with no screen is a coverage failure. A UX- with no row is a dropped
|
|
231
|
+
requirement — backend-plan.md does not carry them, so this is their only home. -->
|
|
257
232
|
|
|
258
233
|
| Spec id | Type | UI element(s) | Section |
|
|
259
234
|
|---|---|---|---|
|
|
260
235
|
| UX-[n] | experience standard | [where realised] | [§] |
|
|
236
|
+
| US-[n] | story | [screens + flow realising it] | [§ refs] |
|
|
261
237
|
| FR-[nnn] | requirement | [screen / component / state] | [§] |
|
|
262
238
|
| CN-[nnn] | constraint | [where honoured in the UI] | [§] |
|
|
263
239
|
| DC-[nnn] | classification | [what is withheld from the client] | §6 |
|
|
@@ -288,18 +264,13 @@ never writes the log. Or `None`.]
|
|
|
288
264
|
|
|
289
265
|
## Change History
|
|
290
266
|
|
|
291
|
-
<!--
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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). -->
|
|
267
|
+
<!-- A row is appended when this plan is RE-DERIVED to carry a change: this document is
|
|
268
|
+
derived from spec.md (its UX- Experience Standards) and the context's domain-model.md,
|
|
269
|
+
and finalize-delta merges a change into those two, never into this one. close-delta
|
|
270
|
+
bumps the ONE version both lanes share and stamps it into the header, so a header
|
|
271
|
+
ahead of the newest row below means the plan has not been re-derived since that
|
|
272
|
+
version. Newest last. -->
|
|
302
273
|
|
|
303
|
-
| Version | Date | Change |
|
|
304
|
-
|
|
305
|
-
| v1.0 | [DATE] | Initial UI design |
|
|
274
|
+
| Version | Date | Change | User stories | CR |
|
|
275
|
+
|---------|------|--------|--------------|-----|
|
|
276
|
+
| v1.0 | [DATE] | Initial UI design | US-1 | — |
|
|
@@ -71,21 +71,14 @@ through the spec/design (as CN-/DC-/IC- ids).
|
|
|
71
71
|
- guardrails/domain/healthcare/vertical-slices.domain.md
|
|
72
72
|
|
|
73
73
|
## /aw-spec-plan
|
|
74
|
-
_None —
|
|
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._
|
|
74
|
+
_None — design loads no domain file. Domain reaches design only through the spec (BR-/CN-/DC-/IC-)._
|
|
81
75
|
|
|
82
76
|
## /aw-spec-implement
|
|
83
|
-
_None — implement loads no domain file. Domain reaches implement only through
|
|
84
|
-
the story's design pass. Framework
|
|
77
|
+
_None — implement loads no domain file. Domain reaches implement only through design.md. Framework
|
|
85
78
|
components are added separately via `/appweaver add-component`._
|
|
86
79
|
|
|
87
80
|
## /aw-spec-gate
|
|
88
|
-
<!-- Conformance checklist for the gates (analyze-
|
|
81
|
+
<!-- Conformance checklist for the gates (analyze-plan · analyze-slice): the domain-derived
|
|
89
82
|
constraints design/implement were NOT given as authoring input, VALIDATED against the
|
|
90
83
|
output. Domain re-enters here as a check, never as authoring input. -->
|
|
91
84
|
- guardrails/domain/healthcare/persistence.domain.md
|
|
@@ -112,14 +105,10 @@ components are added separately via `/appweaver add-component`._
|
|
|
112
105
|
| /aw-spec-constitution | 14 | domain principles (XVI+) — the industry constitution + standard industry rules + the project's own requirements |
|
|
113
106
|
| /aw-spec-specify | 19 | author into spec (lift → CN-/DC-/IC-) |
|
|
114
107
|
| /aw-spec-plan | 0 | none — spec is the only domain input |
|
|
115
|
-
| /aw-spec-plan-ui | 0 | none — spec is the only domain input |
|
|
116
108
|
| /aw-spec-implement | 0 | none — design is the only domain input |
|
|
117
109
|
| /aw-spec-gate | 14 | conformance checklist (validate, don't author) |
|
|
118
110
|
|
|
119
|
-
> Retired in the orchestrator pipeline:
|
|
120
|
-
> `/aw-spec-analyze` (clarify
|
|
121
|
-
>
|
|
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.
|
|
111
|
+
> Retired in the orchestrator pipeline: the prose `/aw-spec-plan` phase, `/aw-spec-tasks`,
|
|
112
|
+
> `/aw-spec-taskplan`, `/aw-spec-clarify`, `/aw-spec-analyze` (clarify folded into specify; the
|
|
113
|
+
> prose plan/tasks pair into the design phase, which is now itself named `/aw-spec-plan`). The
|
|
114
|
+
> collapsed tiers `/aw-spec-fast-implement` and `/aw-spec-minimal-implementation` are pending a ruling.
|
|
@@ -76,15 +76,8 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
76
76
|
|
|
77
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
|
-
|
|
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. -->
|
|
79
|
+
spec and constitution.technical.md), each followed by its worked example. NO domain file
|
|
80
|
+
here — domain reaches design only as spec ids (BR-/CN-/DC-/IC-). -->
|
|
88
81
|
- guardrails/technology/dotnet-webapi/clean-architecture.md
|
|
89
82
|
- guardrails/technology/dotnet-webapi/cqrs.md
|
|
90
83
|
- guardrails/technology/dotnet-webapi/eventing.md
|
|
@@ -111,12 +104,12 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
111
104
|
- guardrails/technology/dotnet-webapi/examples/auditing.md
|
|
112
105
|
|
|
113
106
|
## /aw-spec-plan-ui
|
|
114
|
-
<!-- The FRONTEND LANE's design phase
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
107
|
+
<!-- The FRONTEND LANE's design phase. Its own heading, not a branch of ## /aw-spec-plan:
|
|
108
|
+
the two lanes are governed by different constitution halves and own disjoint source
|
|
109
|
+
paths, so keying the map on this command name gives the lane its own rule set for zero
|
|
110
|
+
mechanism change. NO domain file here — the domain reaches design.ui.md as spec ids,
|
|
111
|
+
exactly as it reaches design.md. The lane's ratified base (constitution.ui.md) is
|
|
112
|
+
referred to directly and is NOT mapped.
|
|
120
113
|
|
|
121
114
|
THE SERVICE LANE ENTERS THROUGH ONE FILE. api-integration.{{backend_stack}}.md is the
|
|
122
115
|
CROSS-LANE pairing rule set — what the service guarantees (paging shape, concurrency
|
|
@@ -126,10 +119,8 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
126
119
|
api-integration.java-spring.md in a Spring repo — both authored — and to a REPORTED
|
|
127
120
|
missing file for a backend whose pairing nobody has written yet, rather than silently
|
|
128
121
|
loading one stack's assumptions into another. A repo with no backend lane skips the
|
|
129
|
-
bullet entirely. No other service-lane file is mapped here
|
|
130
|
-
|
|
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. -->
|
|
122
|
+
bullet entirely. No other service-lane file is mapped here: design.ui.md consumes the
|
|
123
|
+
published surface, never the service's internals. -->
|
|
133
124
|
- guardrails/technology/nextjs/component-architecture.md
|
|
134
125
|
- guardrails/technology/nextjs/routing-navigation.md
|
|
135
126
|
- guardrails/technology/nextjs/state-management.md
|
|
@@ -143,10 +134,10 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
143
134
|
- guardrails/technology/nextjs/api-integration.{{backend_stack}}.md
|
|
144
135
|
|
|
145
136
|
## /aw-spec-implement
|
|
146
|
-
<!-- The FRAMEWORK / code-generation rule files the
|
|
147
|
-
(alongside backend-plan.md
|
|
148
|
-
NO domain file — domain reaches implement only through
|
|
149
|
-
concerns; component wiring is a separate /appweaver add-component step. -->
|
|
137
|
+
<!-- The FRAMEWORK / code-generation rule files the SERVICE lane's generator builds against
|
|
138
|
+
(alongside backend-plan.md and constitution.technical.md), on the BOOTSTRAP path.
|
|
139
|
+
NO domain file — domain reaches implement only through the plan. clean-architecture/cqrs
|
|
140
|
+
are planning concerns; component wiring is a separate /appweaver add-component step. -->
|
|
150
141
|
- guardrails/technology/dotnet-webapi/coding-standards.md
|
|
151
142
|
- guardrails/technology/dotnet-webapi/dependency-policy.md
|
|
152
143
|
- guardrails/technology/dotnet-webapi/folder-structure.md
|
|
@@ -154,10 +145,11 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
154
145
|
- guardrails/technology/dotnet-webapi/PACKAGING.md
|
|
155
146
|
|
|
156
147
|
## /aw-spec-implement-ui
|
|
157
|
-
<!-- The FRONTEND LANE's code-generation set — the HOW
|
|
158
|
-
alongside frontend-plan.md and constitution.ui.md.
|
|
159
|
-
lane
|
|
160
|
-
|
|
148
|
+
<!-- The FRONTEND LANE's code-generation set — the HOW that lane of `implement` builds
|
|
149
|
+
against, alongside frontend-plan.md and constitution.ui.md. It is loaded on BOTH paths,
|
|
150
|
+
master and delta, because the lane never had a separate delta heading. NO domain file
|
|
151
|
+
(domain reached the lane through spec -> frontend-plan.md), and NO service-lane file
|
|
152
|
+
beyond the pairing rules below — this lane never writes outside its declared source path.
|
|
161
153
|
|
|
162
154
|
EIGHT FILES ARE MAPPED FOR BOTH LANE PHASES on purpose. error-handling,
|
|
163
155
|
forms-and-validation, auth-session, design-system, accessibility-implementation, i18n,
|
|
@@ -180,9 +172,12 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
180
172
|
- guardrails/technology/nextjs/frontend-testing.md
|
|
181
173
|
|
|
182
174
|
## /aw-spec-implement-delta
|
|
183
|
-
<!-- The
|
|
184
|
-
|
|
185
|
-
|
|
175
|
+
<!-- The SERVICE lane's set on the DELTA path — same FRAMEWORK / code-generation rules (HOW
|
|
176
|
+
to build). `implement` is one command for both paths and both lanes: it keys this
|
|
177
|
+
heading while generating a change's delta-backend-plan.md and `## /aw-spec-implement`
|
|
178
|
+
while generating the master, so keep the two identical unless a change deliberately
|
|
179
|
+
needs different rules. The delta's code is generated against the master backend-plan.md
|
|
180
|
+
+ the delta plan; no domain file (domain reached the delta via delta-spec → delta plan). -->
|
|
186
181
|
- guardrails/technology/dotnet-webapi/coding-standards.md
|
|
187
182
|
- guardrails/technology/dotnet-webapi/dependency-policy.md
|
|
188
183
|
- guardrails/technology/dotnet-webapi/folder-structure.md
|
|
@@ -199,7 +194,7 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
199
194
|
- guardrails/technology/dotnet-webapi/examples/clean-architecture.md
|
|
200
195
|
|
|
201
196
|
## /aw-spec-analyze-slice
|
|
202
|
-
<!-- The
|
|
197
|
+
<!-- The design↔code conformance gate's TECHNICAL checklist: the code + tests are
|
|
203
198
|
validated against these (alongside the DOMAIN gate overlays, loaded separately via
|
|
204
199
|
resolve-domain `## /aw-spec-gate`). Validation input only — never authoring. -->
|
|
205
200
|
- guardrails/technology/dotnet-webapi/testing.md
|
|
@@ -255,18 +250,18 @@ NOT listed here — every consumer refers to it directly, as-is.
|
|
|
255
250
|
| Command | Technical rule files | Role |
|
|
256
251
|
|---|---|---|
|
|
257
252
|
| /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 |
|
|
258
|
-
| /aw-spec-plan | 24 | architecture/security/interop the design author mediates the spec against, each with its example
|
|
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
|
|
260
|
-
| /aw-spec-implement | 5 | governance/architecture the
|
|
261
|
-
| /aw-spec-implement-ui | 13 | the
|
|
262
|
-
| /aw-spec-implement-delta | 5 | same
|
|
253
|
+
| /aw-spec-plan | 24 | architecture/security/interop the design author mediates the spec against, each with its example |
|
|
254
|
+
| /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) |
|
|
255
|
+
| /aw-spec-implement | 5 | governance/architecture the SERVICE lane builds against (from backend-plan.md), master path |
|
|
256
|
+
| /aw-spec-implement-ui | 13 | the FRONTEND lane's code-generation set (from frontend-plan.md), both paths — conventions, the generated client + its service pairing, auth, client security, states, forms, design system, accessibility, i18n, performance, observability and testing |
|
|
257
|
+
| /aw-spec-implement-delta | 5 | the same set as /aw-spec-implement, for the service lane when implement is generating a change's delta plan |
|
|
263
258
|
| /aw-spec-build | 3 | layering + coding rules the compile-fixer respects, + the layering example |
|
|
264
|
-
| /aw-spec-analyze-slice | 2 | testing + coding rules the
|
|
259
|
+
| /aw-spec-analyze-slice | 2 | testing + coding rules the design↔code gate validates against |
|
|
265
260
|
| /aw-spec-constitution | 17 | what the technical half ratifies — the technology base, the standard technical rules, and the project team's technical-requirements.md |
|
|
266
261
|
| /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 |
|
|
267
262
|
| /aw-spec-run | 2 | persistence rules the execution / data-migration step generates against, + its example |
|
|
268
263
|
|
|
269
|
-
> All migrated workflows are on this map. The conformance-gate workflows **analyze-
|
|
270
|
-
> and **analyze-delta
|
|
264
|
+
> All migrated workflows are on this map. The conformance-gate workflows **analyze-plan**
|
|
265
|
+
> and **analyze-plan-delta** are intentionally NOT here — they validate the plans / the delta
|
|
271
266
|
> against the spec + DOMAIN gate overlays only (domain-rule-bindings `## /aw-spec-gate`), with no
|
|
272
267
|
> technical gate checklist.
|
|
@@ -16,9 +16,9 @@ Acceptance:
|
|
|
16
16
|
- A product missing a required attribute, an active ingredient, or a packaging configuration is rejected.
|
|
17
17
|
- The creation is recorded in the audit trail.
|
|
18
18
|
|
|
19
|
-
/appweaver
|
|
19
|
+
/appweaver plan
|
|
20
20
|
|
|
21
|
-
/appweaver analyze-
|
|
21
|
+
/appweaver analyze-plan
|
|
22
22
|
|
|
23
23
|
/appweaver implement
|
|
24
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Testing Standards
|
|
2
2
|
|
|
3
|
-
> Pure technology (domain-agnostic) — domain additions in [[testing.domain]]. Commands: `/aw-spec-
|
|
3
|
+
> Pure technology (domain-agnostic) — domain additions in [[testing.domain]]. Commands: `/aw-spec-plan`, `/aw-spec-implement`, `/aw-spec-implement-delta`, `/aw-spec-analyze-slice`.
|
|
4
4
|
|
|
5
5
|
## Test-first engineering
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# delta-design (orchestrator module) — author the DESIGN-side DELTA of a change
|
|
3
|
-
#
|
|
4
|
-
# Included by /appweaver design on its DELTA branch (design.md already exists).
|
|
5
|
-
# This is the DESIGN half of the former standalone `cr` capture, relocated here.
|
|
6
|
-
# JOIN-or-OPEN the change: if one is already open (specify opened it via delta-spec)
|
|
7
|
-
# JOIN it; otherwise OPEN one here (a DESIGN-ONLY change — the design's realisation of
|
|
8
|
-
# EXISTING spec ids changes without a spec delta). It then authors the DELTA-DESIGN
|
|
9
|
-
# ONLY — it does NOT touch the master design.md. The change stays OPEN; finalize-delta
|
|
10
|
-
# merges the delta into design.md later in the chain and close-delta closes it at the
|
|
11
|
-
# end. No version bump here, no code (that is /appweaver implement-delta).
|
|
12
|
-
#
|
|
13
|
-
# Runs in the CALLER's context (include semantics): shares vars + the sticky standards
|
|
14
|
-
# (design's TECHNICAL/architecture set) + the caller's scripts map + replay cache.
|
|
15
|
-
# EXPECTS caller vars: feature_dir, spec_file, design_doc, has_change, active_change,
|
|
16
|
-
# need_new_change (design_mode==delta AND no change open yet), USER_INPUT.
|
|
17
|
-
# PRODUCES: active_change, delta_spec, delta_design, downstream_count, impact_report.
|
|
18
|
-
# =============================================================================
|
|
19
|
-
|
|
20
|
-
name: delta-design
|
|
21
|
-
dialect: aw-spec.orchestrator/v1
|
|
22
|
-
|
|
23
|
-
# Scripts this module invokes. A module's scripts EXTEND the caller's map (setdefault, so
|
|
24
|
-
# the caller's refs WIN at runtime — these are inert when design already supplies them);
|
|
25
|
-
# declaring both keeps the module self-contained + validatable on its own. `actions` mirrors
|
|
26
|
-
# the caller's (design's) ref; `xref` (the OKF cross-reference substrate) is ADDED for the
|
|
27
|
-
# advisory blast-radius step below, which design does not otherwise provide.
|
|
28
|
-
scripts:
|
|
29
|
-
actions:
|
|
30
|
-
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
31
|
-
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
32
|
-
xref:
|
|
33
|
-
sh: .appweaver/scripts/bash/aw-xref.sh
|
|
34
|
-
ps1: .appweaver/scripts/powershell/aw-xref.ps1
|
|
35
|
-
|
|
36
|
-
workflow:
|
|
37
|
-
|
|
38
|
-
# OPEN a change only when none is open (a design-only change). cr-setup refuses if
|
|
39
|
-
# one is already open, so the JOIN case (specify opened it) SKIPS this and keeps the
|
|
40
|
-
# caller's active_change. cr-setup also scaffolds delta-design.md from its template.
|
|
41
|
-
- id: open_change
|
|
42
|
-
condition: "{{need_new_change}} == true"
|
|
43
|
-
action: execute_script
|
|
44
|
-
script: { ref: actions }
|
|
45
|
-
subcommand: cr-setup
|
|
46
|
-
args: ["--feature-dir", "{{feature_dir}}", "--title", "{{USER_INPUT}}"]
|
|
47
|
-
outputs:
|
|
48
|
-
- { name: active_change, from: "$.cr_id" } # the design-opened change becomes the active one
|
|
49
|
-
- { name: delta_spec, from: "$.delta_spec" }
|
|
50
|
-
- { name: delta_design, from: "$.delta_design" }
|
|
51
|
-
|
|
52
|
-
# Resolve the delta doc paths from the active change (covers the JOIN case, where
|
|
53
|
-
# open_change was skipped; recomputes the same paths on the OPEN case — harmless).
|
|
54
|
-
- id: paths
|
|
55
|
-
action: set
|
|
56
|
-
vars:
|
|
57
|
-
delta_design: "{{feature_dir}}/changes/{{active_change}}/delta-design.md"
|
|
58
|
-
delta_spec: "{{feature_dir}}/changes/{{active_change}}/delta-spec.md"
|
|
59
|
-
|
|
60
|
-
- id: ctx
|
|
61
|
-
action: build_context
|
|
62
|
-
context:
|
|
63
|
-
- { path: "{{delta_design}}" } # the delta-design template to fill
|
|
64
|
-
- { path: "{{delta_spec}}" } # the spec-side change (from specify/delta-spec)
|
|
65
|
-
- { path: "{{spec_file}}" }
|
|
66
|
-
- { path: "{{design_doc}}" } # the current master design.md (READ ONLY — never amended here)
|
|
67
|
-
- { path: .appweaver/DESIGN-FORMAT.md }
|
|
68
|
-
- id: author
|
|
69
|
-
action: agent_author # design's technical standards stay ON (default) — correct here
|
|
70
|
-
output_target: { type: file, path: "{{delta_design}}" }
|
|
71
|
-
task: |
|
|
72
|
-
Fill the delta-design record (target in context) for this change, from the
|
|
73
|
-
delta-spec and the CURRENT master design.md (both in context) — the DELTA ONLY.
|
|
74
|
-
Do NOT edit design.md: finalize-delta merges the delta into the master later.
|
|
75
|
-
Classify every change to the design as ADDED / MODIFIED / REMOVED against the
|
|
76
|
-
master, per the master's OWN section structure (whatever sections it actually has
|
|
77
|
-
— do not assume a fixed layering), plus the cross-section impact, the regression
|
|
78
|
-
targets, and any new assumption (DA-n) or workaround (WA-n) the change introduces.
|
|
79
|
-
Stay technology-agnostic (no code). A shared element (e.g. the aggregate root) is
|
|
80
|
-
MODIFIED in place, never duplicated.
|
|
81
|
-
TWO CASES — decide from the delta-spec in context:
|
|
82
|
-
• SPEC-DRIVEN — the delta-spec lists ADDED/MODIFIED/REMOVED spec items: realise
|
|
83
|
-
them; every changed design element serves one of those spec ids.
|
|
84
|
-
• DESIGN-ONLY — the delta-spec is an unfilled stub (no spec delta): this change
|
|
85
|
-
refines HOW the EXISTING spec is realised (an architectural / decision change)
|
|
86
|
-
driven by the guidance below. The spec is unchanged, so every changed element
|
|
87
|
-
MUST still trace to an EXISTING spec id (FR-/BR-/CN-/DC-/IC-/US-/SC-) — you are
|
|
88
|
-
changing the realisation, never inventing a requirement.
|
|
89
|
-
Guidance: {{USER_INPUT}}
|
|
90
|
-
|
|
91
|
-
# ADVISORY blast radius (restored from the retired `cr`): who currently depends on THIS
|
|
92
|
-
# aggregate (its Cross-References in the OKF bundle). A change here may ripple to them —
|
|
93
|
-
# surfaced now, at delta-review time, and written to the change dir (impact.md) for the
|
|
94
|
-
# record. Read-only + on_error: continue: it INFORMS how to scope the change; the actual
|
|
95
|
-
# downstream-green enforcement is finalize-delta's job. Uses the change's own id
|
|
96
|
-
# ({{active_change}}) — the JOIN case inherits it from specify, the OPEN case sets it above.
|
|
97
|
-
- id: xref_impact
|
|
98
|
-
action: execute_script
|
|
99
|
-
on_error: continue
|
|
100
|
-
script: { ref: xref }
|
|
101
|
-
subcommand: list
|
|
102
|
-
args: ["--feature-dir", "{{feature_dir}}", "--out", "{{feature_dir}}/changes/{{active_change}}/impact.md"]
|
|
103
|
-
outputs:
|
|
104
|
-
- { name: downstream_count, from: "$.count" }
|
|
105
|
-
- { name: impact_report, from: "$.impact_report" }
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# spec-state-gate (orchestrator) — the ledger tripwire, gated on STATE
|
|
3
|
-
#
|
|
4
|
-
# Included by every phase that READS spec.md as an oracle and does not stamp it.
|
|
5
|
-
# It answers one question before that phase starts doing work:
|
|
6
|
-
#
|
|
7
|
-
# is spec.md's version an honest name for spec.md's contents?
|
|
8
|
-
#
|
|
9
|
-
# WHY THE `ok` BOOLEAN IS NOT ENOUGH. spec-check's decisive branch asks only "is
|
|
10
|
-
# there a version ROW above the version the kit last recorded", and never opens the
|
|
11
|
-
# body. Two of its states are therefore ok:true with a body nobody has re-baselined:
|
|
12
|
-
#
|
|
13
|
-
# ledgered_edit a row exists above the recorded version — the edit was RECORDED,
|
|
14
|
-
# but the kit has not re-hashed, so every LATER edit lands inside
|
|
15
|
-
# the same window and passes the same test. Verified: a requirement
|
|
16
|
-
# DELETED with no row naming it passes.
|
|
17
|
-
# header_behind the same, with the document's header not yet caught up.
|
|
18
|
-
#
|
|
19
|
-
# Both are legitimate transient states and both have the same remedy — spec-stamp,
|
|
20
|
-
# which re-baselines the hash and closes the window. That remedy is already named in
|
|
21
|
-
# these phases' own refusal messages and in SPEC-EDIT-PROTOCOL.md.
|
|
22
|
-
#
|
|
23
|
-
# WHY NOT FLIP `ok` INSTEAD. Because specify is the stamper. It MUST keep accepting
|
|
24
|
-
# both states — it is the command that resolves them — so making spec-check refuse
|
|
25
|
-
# them would wedge the one workflow that can fix them. The distinction belongs at the
|
|
26
|
-
# consumer, which is what this module is.
|
|
27
|
-
#
|
|
28
|
-
# WHAT IT DOES NOT DO. It never stamps, never edits and never repairs. Every state
|
|
29
|
-
# spec-check already refuses (unrowed_edit, unledgered_edit, rollback, no_ledger,
|
|
30
|
-
# delta_open) still stops on `ok`, with spec-check's own message.
|
|
31
|
-
#
|
|
32
|
-
# Inputs (via include `with`):
|
|
33
|
-
# command — the phase being gated, quoted back in the failure message
|
|
34
|
-
#
|
|
35
|
-
# Produces: spec_ok / spec_state (the raw answers) and spec_current (true when the
|
|
36
|
-
# state is one this phase may read from), for a caller that wants to say more.
|
|
37
|
-
# =============================================================================
|
|
38
|
-
|
|
39
|
-
name: spec-state-gate
|
|
40
|
-
dialect: aw-spec.orchestrator/v1
|
|
41
|
-
|
|
42
|
-
scripts:
|
|
43
|
-
actions:
|
|
44
|
-
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
45
|
-
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
46
|
-
|
|
47
|
-
workflow:
|
|
48
|
-
|
|
49
|
-
- id: spec_guard_read
|
|
50
|
-
action: execute_script
|
|
51
|
-
script: { ref: actions }
|
|
52
|
-
subcommand: spec-check
|
|
53
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
54
|
-
outputs:
|
|
55
|
-
- { name: spec_ok, from: "$.ok" }
|
|
56
|
-
- { name: spec_state, from: "$.state" }
|
|
57
|
-
|
|
58
|
-
# The states spec-check itself refuses. Kept first and kept separate: its own error
|
|
59
|
-
# text says which one and why, and this module has nothing to add to it.
|
|
60
|
-
- id: spec_guard
|
|
61
|
-
action: verify_context
|
|
62
|
-
require_true: spec_ok
|
|
63
|
-
on_false: stop
|
|
64
|
-
on_false_message: "{{command}} cannot run: spec.md has moved outside the ledger (state: {{spec_state}}), so its version no longer names its contents and nothing read from it can be trusted. Record what changed in a Change History row naming the ids, then re-run spec-stamp to re-baseline — or, when the edit touched no requirement at all, spec-stamp alone (see .appweaver/SPEC-EDIT-PROTOCOL.md)."
|
|
65
|
-
|
|
66
|
-
# The two states that pass `ok` and still leave the body un-baselined. Ordered sets
|
|
67
|
-
# rather than a compound condition — the evaluator takes single comparisons only, so
|
|
68
|
-
# the refusal is the default and each acceptable state lifts it.
|
|
69
|
-
- id: spec_state_default
|
|
70
|
-
action: set
|
|
71
|
-
vars: { spec_current: "false" }
|
|
72
|
-
- id: spec_state_clean
|
|
73
|
-
condition: "{{spec_state}} == clean"
|
|
74
|
-
action: set
|
|
75
|
-
vars: { spec_current: "true" }
|
|
76
|
-
# A pre-ledger spec the kit has never stamped. Legitimate: nothing has been recorded
|
|
77
|
-
# against it, so there is no window between a row and a baseline to fall into.
|
|
78
|
-
- id: spec_state_unstamped
|
|
79
|
-
condition: "{{spec_state}} == unstamped"
|
|
80
|
-
action: set
|
|
81
|
-
vars: { spec_current: "true" }
|
|
82
|
-
|
|
83
|
-
- id: spec_state_gate
|
|
84
|
-
action: verify_context
|
|
85
|
-
require_true: spec_current
|
|
86
|
-
on_false: stop
|
|
87
|
-
on_false_message: "{{command}} cannot run: spec.md is in state '{{spec_state}}' — the edit is recorded in a Change History row, but the kit has not re-baselined the document, so its recorded hash still describes the text before the edit. Until it does, every FURTHER edit passes the same tripwire unnoticed, including a requirement deleted with no row naming it. Run /appweaver specify (which stamps), or re-run spec-stamp to re-baseline directly, then re-run {{command}}."
|