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
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# aw-spec-design (orchestrator) — the spec-anchored Design phase (delta-aware)
|
|
3
|
-
#
|
|
4
|
-
# Authors ONE high-level design document per feature — specs/<Aggregate>/design.md
|
|
5
|
-
# — the tech-agnostic HLD that MEDIATES between the spec and the code. It covers all
|
|
6
|
-
# four clean-architecture layers as SECTIONS (Domain · Application · API · Infra),
|
|
7
|
-
# carries structure/behaviour/contracts/decisions + the Assumptions and Workarounds
|
|
8
|
-
# ledgers, but NO complete code. `implement` GENERATES the code from spec + design.md
|
|
9
|
-
# (model-driven, not a deterministic extract). See .appweaver/DESIGN-FORMAT.md +
|
|
10
|
-
# .appweaver/templates/design-template.md.
|
|
11
|
-
#
|
|
12
|
-
# TEMPLATE-DRIVEN AUTHORING (greenfield-safe). The master-authoring step follows the
|
|
13
|
-
# structure of whichever design template is ACTIVE, chosen deterministically:
|
|
14
|
-
# • GREENFIELD (default) — the four-layer template (Domain·Application·API·Infra).
|
|
15
|
-
# This path and its prompt are UNCHANGED.
|
|
16
|
-
# • BROWNFIELD — when /appweaver onboard has GENERATED the code-derived
|
|
17
|
-
# `design-template` override (reverse-engineered from the repo's own structure;
|
|
18
|
-
# override_active), a NEW feature added to an existing repo (NO adopt) is authored
|
|
19
|
-
# with the code-derived structure instead, consistent with the as-built architecture.
|
|
20
|
-
# The two are separate steps selected by a single `design_mode` var, so greenfield
|
|
21
|
-
# authoring never sees the brownfield guidance and vice-versa.
|
|
22
|
-
#
|
|
23
|
-
# AUTHORS only — the gates are SEPARATE stages. SELF-DETECTS the branch from
|
|
24
|
-
# design.md's OWN existence (symmetric with how specify keys off spec.md):
|
|
25
|
-
# • BOOTSTRAP (no design.md yet) → author the MASTER design.md. Version stays as-is.
|
|
26
|
-
# Next: /appweaver analyze-design (spec↔design gate) → implement.
|
|
27
|
-
# • DELTA (design.md exists) → delegate to the delta-design module: author the
|
|
28
|
-
# DELTA-DESIGN record ONLY; the master design.md is left UNTOUCHED (finalize-delta
|
|
29
|
-
# merges it later). The change stays OPEN. On the delta path design is DECOUPLED
|
|
30
|
-
# from specify: it JOINS the change specify opened when one is open, or OPENS its
|
|
31
|
-
# OWN when none is — a DESIGN-ONLY change (the design's realisation of EXISTING spec
|
|
32
|
-
# ids changes without any spec delta). Next: the CR chain —
|
|
33
|
-
# /appweaver analyze-delta-design → implement-delta → build → finalize-delta →
|
|
34
|
-
# analyze-slice → close-delta.
|
|
35
|
-
# Because the trigger is design.md-exists (not an open change), re-running design after
|
|
36
|
-
# the bootstrap is a DELTA, not a re-bootstrap — to regenerate the master, delete
|
|
37
|
-
# design.md first.
|
|
38
|
-
# The forward paths are explicit:
|
|
39
|
-
# NEW : specify → design → analyze-design → implement
|
|
40
|
-
# CHANGE : specify (delta-spec) → design (delta-design) → analyze-delta-design →
|
|
41
|
-
# implement-delta → build → finalize-delta → analyze-slice → close-delta
|
|
42
|
-
# (The former standalone `cr` capture is RETIRED — its delta-spec / delta-design
|
|
43
|
-
# authoring now lives in specify / design via the delta-spec / delta-design modules.)
|
|
44
|
-
#
|
|
45
|
-
# Feature = the aggregate; commands (CreateOrder/UpdateOrder) are user stories on
|
|
46
|
-
# this same design.md — a later one is a delta here, never a separate design doc.
|
|
47
|
-
#
|
|
48
|
-
# Launch: /appweaver design [strategy] [guidance]
|
|
49
|
-
# Prereq: /appweaver specify (bootstrap authors US-1; a later specify opens a change + delta-spec)
|
|
50
|
-
# =============================================================================
|
|
51
|
-
|
|
52
|
-
name: aw-spec-design
|
|
53
|
-
description: "Author the single high-level design.md from the spec (bootstrap when no design.md yet), or author a delta-design (when design.md already exists) — self-detecting on design.md, symmetric with specify's spec.md trigger. On the delta path it delegates to the delta-design module: JOIN the change specify opened or OPEN its own (a design-only change), author the delta-design ONLY (master design.md untouched — finalize-delta merges it). Tech-agnostic HLD that mediates spec → code. Master authoring is template-driven — greenfield four-layer by default, or the code-derived brownfield structure when onboard has installed it as the design-template override. Authoring only — bootstrap gates at analyze-design; a change ships via analyze-delta-design → implement-delta → build → finalize-delta → analyze-slice → close-delta."
|
|
54
|
-
version: 3.4.0
|
|
55
|
-
agent_agnostic: true
|
|
56
|
-
dialect: aw-spec.orchestrator/v1
|
|
57
|
-
|
|
58
|
-
inputs:
|
|
59
|
-
user_input:
|
|
60
|
-
description: Optional design guidance (architectural constraints, trade-off preferences).
|
|
61
|
-
required: false
|
|
62
|
-
bind: USER_INPUT
|
|
63
|
-
|
|
64
|
-
scripts:
|
|
65
|
-
actions:
|
|
66
|
-
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
67
|
-
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
68
|
-
|
|
69
|
-
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The
|
|
70
|
-
# TECHNICAL/architecture rule files are no longer hardcoded here — they are now
|
|
71
|
-
# CONFIGURATION, loaded per-command from guardrails/projects/<project>/tech-rule-bindings.md
|
|
72
|
-
# by the tech-select module (see the workflow's tech_select step), exactly as the
|
|
73
|
-
# DOMAIN rule files are loaded by domain-select. Per the rule-partition, design still
|
|
74
|
-
# loads NO domain file — the tech map lists only technical files; domain reaches
|
|
75
|
-
# design solely as spec ids (BR-/CN-/DC-/IC-). The technology base itself arrives via
|
|
76
|
-
# constitution.technical.md (referred to directly, as-is — NOT mapped). DDD stays in
|
|
77
|
-
# specify; coding-standards in implement. (missing files skipped at assembly time)
|
|
78
|
-
standards:
|
|
79
|
-
- { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
|
|
80
|
-
|
|
81
|
-
vars:
|
|
82
|
-
active_change: ""
|
|
83
|
-
has_change: "false"
|
|
84
|
-
version: ""
|
|
85
|
-
brownfield_design: "false" # set from design-scaffold.override_active (onboard installed the code-derived template)
|
|
86
|
-
design_created: "false" # set from design-scaffold.created — true ⇒ design.md was ABSENT (just scaffolded) ⇒ bootstrap
|
|
87
|
-
design_exists: "false" # NOT design_created ⇒ design.md pre-existed ⇒ this is a DELTA
|
|
88
|
-
design_no_change: "true" # NOT has_change ⇒ no change open yet ⇒ on the delta path design opens its OWN (design-only)
|
|
89
|
-
need_new_change: "false" # design_mode==delta AND design_no_change ⇒ design must open a change here
|
|
90
|
-
design_mode: "bootstrap_gf" # resolved below → bootstrap_gf | bootstrap_bf | delta
|
|
91
|
-
|
|
92
|
-
workflow:
|
|
93
|
-
|
|
94
|
-
# 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded).
|
|
95
|
-
# tech-select reads guardrails/projects/<project>/tech-rule-bindings.md under
|
|
96
|
-
# "## /aw-spec-design" and loads that set. No domain rule file is loaded here —
|
|
97
|
-
# the tech map lists only technical files, so design still authors from the spec
|
|
98
|
-
# + technical standards (rule-partition intact). No blocking gate: an unconfigured
|
|
99
|
-
# project soft-continues (constitution.technical.md still carries the tech base).
|
|
100
|
-
- id: tech_select
|
|
101
|
-
action: include
|
|
102
|
-
module: .appweaver/orchestrator/modules/tech-select.orch.yaml
|
|
103
|
-
with: { command: aw-spec-design }
|
|
104
|
-
|
|
105
|
-
# 1. Resolve the current feature and require its spec.
|
|
106
|
-
- id: feature_paths
|
|
107
|
-
action: execute_script
|
|
108
|
-
on_error: continue # never crash raw on 'no feature set' — the gate below explains it
|
|
109
|
-
script: { ref: actions }
|
|
110
|
-
subcommand: feature-paths
|
|
111
|
-
outputs:
|
|
112
|
-
- { name: feature_dir, from: "$.feature_dir" }
|
|
113
|
-
- { name: spec_file, from: "$.spec_file" }
|
|
114
|
-
- { name: spec_exists, from: "$.spec_exists" }
|
|
115
|
-
|
|
116
|
-
- id: require_feature
|
|
117
|
-
action: verify_context
|
|
118
|
-
require_non_empty: feature_dir
|
|
119
|
-
on_empty: stop
|
|
120
|
-
on_empty_message: "No active feature. Run /appweaver select-feature first (pick or create the aggregate, e.g. Order), then re-run design."
|
|
121
|
-
|
|
122
|
-
- id: verify_spec
|
|
123
|
-
action: verify_context
|
|
124
|
-
require_true: spec_exists
|
|
125
|
-
on_false: stop
|
|
126
|
-
on_false_message: "No spec.md for the current feature. Run /appweaver specify first."
|
|
127
|
-
|
|
128
|
-
# 3. Read the open change (set by specify). has_change picks the branch below.
|
|
129
|
-
- id: read_change
|
|
130
|
-
action: execute_script
|
|
131
|
-
script: { ref: actions }
|
|
132
|
-
subcommand: version-read
|
|
133
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
134
|
-
outputs:
|
|
135
|
-
- { name: active_change, from: "$.active_change" }
|
|
136
|
-
- { name: has_change, from: "$.has_change" }
|
|
137
|
-
- { name: version, from: "$.version" }
|
|
138
|
-
|
|
139
|
-
# 3b. Whether a change is already OPEN (specify opened it). Drives join-vs-open on the
|
|
140
|
-
# delta path: an open change ⇒ design JOINS it; none ⇒ design opens its OWN.
|
|
141
|
-
- id: flag_change_open
|
|
142
|
-
condition: "{{has_change}} == true"
|
|
143
|
-
action: set
|
|
144
|
-
vars: { design_no_change: "false" }
|
|
145
|
-
|
|
146
|
-
# 4. Scaffold the single design.md from design-template.md (idempotent — returns
|
|
147
|
-
# the existing path when it already exists, e.g. on the delta path).
|
|
148
|
-
- id: design_scaffold
|
|
149
|
-
action: execute_script
|
|
150
|
-
script: { ref: actions }
|
|
151
|
-
subcommand: design-scaffold
|
|
152
|
-
args: ["--feature-dir", "{{feature_dir}}"]
|
|
153
|
-
outputs:
|
|
154
|
-
- { name: design_doc, from: "$.design_doc" }
|
|
155
|
-
- { name: brownfield_design, from: "$.override_active" } # true ⇒ onboard installed the code-derived template
|
|
156
|
-
- { name: design_created, from: "$.created" } # true ⇒ design.md was ABSENT (just scaffolded) ⇒ bootstrap
|
|
157
|
-
|
|
158
|
-
# 4a. Self-detect the DELTA trigger from design.md's OWN existence (symmetric with
|
|
159
|
-
# specify's spec.md trigger). Scaffold reports created=true only when it had to
|
|
160
|
-
# CREATE design.md (i.e. it was absent) — so created=false ⇒ it pre-existed ⇒ delta.
|
|
161
|
-
- id: mark_design_exists
|
|
162
|
-
condition: "{{design_created}} == false"
|
|
163
|
-
action: set
|
|
164
|
-
vars: { design_exists: "true" }
|
|
165
|
-
|
|
166
|
-
# 4b. Resolve the authoring MODE deterministically (the condition evaluator supports
|
|
167
|
-
# only single == / != comparisons, so collapse the booleans into ordered sets).
|
|
168
|
-
# bootstrap_gf (default) → greenfield master authoring (four-layer template)
|
|
169
|
-
# bootstrap_bf → brownfield master authoring (code-derived template)
|
|
170
|
-
# delta → design.md ALREADY EXISTS (delta authoring)
|
|
171
|
-
# Order matters: the brownfield override flips the greenfield default; an EXISTING
|
|
172
|
-
# design.md flips either into a delta (a delta is a delta regardless of template).
|
|
173
|
-
- id: mode_brownfield
|
|
174
|
-
condition: "{{brownfield_design}} == true"
|
|
175
|
-
action: set
|
|
176
|
-
vars: { design_mode: "bootstrap_bf" }
|
|
177
|
-
- id: mode_delta
|
|
178
|
-
condition: "{{design_exists}} == true"
|
|
179
|
-
action: set
|
|
180
|
-
vars: { design_mode: "delta" }
|
|
181
|
-
|
|
182
|
-
# 4c. On the delta path, does design need to OPEN its own change? Yes iff no change is
|
|
183
|
-
# already open (design_no_change). This collapses (design_mode==delta AND
|
|
184
|
-
# design_no_change) into one var: it takes design_no_change's value only in delta
|
|
185
|
-
# mode, and stays false in either bootstrap mode.
|
|
186
|
-
- id: flag_need_new_change
|
|
187
|
-
condition: "{{design_mode}} == delta"
|
|
188
|
-
action: set
|
|
189
|
-
vars: { need_new_change: "{{design_no_change}}" }
|
|
190
|
-
|
|
191
|
-
# 5. Pre-execution hooks.
|
|
192
|
-
- id: resolve_pre_hooks
|
|
193
|
-
action: execute_script
|
|
194
|
-
script: { ref: actions }
|
|
195
|
-
subcommand: resolve-hooks
|
|
196
|
-
args: ["--phase", "before_design"]
|
|
197
|
-
outputs:
|
|
198
|
-
- { name: before_hooks, from: "$.hooks" }
|
|
199
|
-
- id: dispatch_pre_hooks
|
|
200
|
-
action: dispatch_hooks
|
|
201
|
-
hooks_from_variable: before_hooks
|
|
202
|
-
|
|
203
|
-
# ══════════════════ BOOTSTRAP — no open change (author design.md) ═══════════
|
|
204
|
-
# Author the whole HLD in one pass: all four layers as sections, tech-agnostic,
|
|
205
|
-
# traced to the spec. build_context REPLACES the per-request envelope; sticky
|
|
206
|
-
# standards stay prepended. The ENGINE writes design_doc.
|
|
207
|
-
- id: ctx_design
|
|
208
|
-
condition: "{{design_mode}} == bootstrap_gf"
|
|
209
|
-
action: build_context
|
|
210
|
-
context:
|
|
211
|
-
- { path: "{{design_doc}}" } # the copied template = section structure
|
|
212
|
-
- { path: "{{spec_file}}" } # the source of truth (FR/BR/CN/DC/IC/US/SC)
|
|
213
|
-
- { path: .appweaver/DESIGN-FORMAT.md } # the HLD contract
|
|
214
|
-
- { path: .appweaver/memory/constitution.technical.md, optional: true } # technology base ONLY — no domain (domain enters via the spec)
|
|
215
|
-
- id: gen_design
|
|
216
|
-
condition: "{{design_mode}} == bootstrap_gf"
|
|
217
|
-
action: agent_author
|
|
218
|
-
output_target: { type: file, path: "{{design_doc}}" }
|
|
219
|
-
task: |
|
|
220
|
-
Author the MASTER high-level design (the target design.md in context) for this
|
|
221
|
-
aggregate by filling out the template, based on the feature spec + the loaded
|
|
222
|
-
technical/architecture standards. This is the MEDIATOR between the spec and the
|
|
223
|
-
generated code. Guidance: {{USER_INPUT}}
|
|
224
|
-
Rules:
|
|
225
|
-
- THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + technical standards, and
|
|
226
|
-
NO domain rule files. The domain arrives as spec ids only — realise them, and
|
|
227
|
-
invent no domain rule the spec omits (an unavoidable new concept → §7 DA-n).
|
|
228
|
-
- Cover the four layers as sections: Domain (§1), Application (§2), API (§3),
|
|
229
|
-
Infrastructure (§4). Keep the template's section order and headings.
|
|
230
|
-
- The DOMAIN layer (§1) MUST follow spec.md EXACTLY: entities & value objects
|
|
231
|
-
are the spec's Key Entities (SAME names), invariants are the spec's Business
|
|
232
|
-
Rules (BR-nnn — cite each), the aggregate boundary is the spec's Aggregate
|
|
233
|
-
Boundary, and states are the lifecycle the spec describes. Elaborate with
|
|
234
|
-
domain events / state machines / behaviour signatures ONLY to realise spec
|
|
235
|
-
behaviour; do NOT invent or contradict. Any unavoidable new concept goes in
|
|
236
|
-
§7 as a DA-n assumption.
|
|
237
|
-
- REALISE THE LIFTED CONSTRAINTS (each cites its spec id):
|
|
238
|
-
• Constraints & NFRs (CN-) → structural ones (immutability, append-only audit,
|
|
239
|
-
no-hard-delete) as §1 invariants/events; retention/performance/audit as §5
|
|
240
|
-
Cross-Cutting rows or §4 persistence.
|
|
241
|
-
• Data Classification (DC-) → §5 data-protection + the §2/§3 projection surface
|
|
242
|
-
(what MUST NOT be exposed in API/logs/traces).
|
|
243
|
-
• Integration Contracts (IC-) → §4.2 External integrations (one port/adapter row
|
|
244
|
-
per IC-), realising the obligation the spec named.
|
|
245
|
-
- CONSTITUTION-MANDATED CROSS-CUTTING (from the loaded technical constitution, NOT
|
|
246
|
-
the spec): a NON-NEGOTIABLE technical principle you must apply that has NO
|
|
247
|
-
per-feature spec id. APPLY it (it is non-negotiable), and because it is not
|
|
248
|
-
spec-derived, LOG it as a §7 DA-n whose basis cites the mandating principle
|
|
249
|
-
("per Const. §<n>"); set the corresponding §5 row's "Serves" to that DA-n. Do
|
|
250
|
-
NOT fabricate a spec CN- for it, and do NOT leave it uncited — an uncited
|
|
251
|
-
non-spec element reads as spec over-reach at the analyze gate.
|
|
252
|
-
- TECHNOLOGY-AGNOSTIC: express behaviour as signatures + pre/post/invariant/
|
|
253
|
-
raises pseudocode and contracts as field shapes — NEVER language code. Use
|
|
254
|
-
conceptual types. The stack is bound only at `implement` time. Do NOT include
|
|
255
|
-
code-generation mechanics or the layering/dependency rule — those are
|
|
256
|
-
solution-wide rules applied in `implement` / the constitution, not per feature.
|
|
257
|
-
- Every design element traces UP to a spec id (FR-/BR-/CN-/DC-/IC-/US-/SC-); the
|
|
258
|
-
whole spec traces DOWN — fill §6 Traceability completely, with a row for EVERY
|
|
259
|
-
CN-/DC-/IC- so no lifted constraint is silently dropped.
|
|
260
|
-
- Fill the two ledgers: §7 Assumptions (DA-n, to clarify later) and §8
|
|
261
|
-
Workarounds (WA-n, to clear later). Empty → "None (as of v1.0)".
|
|
262
|
-
- Physical persistence schema is OUT OF SCOPE (defer to the technical-data-model).
|
|
263
|
-
- This is v1.0: set the initial Change History row + keep US-1's mapping.
|
|
264
|
-
- Omit a LAYER section only if the aggregate genuinely has nothing there
|
|
265
|
-
(state why); never write "N/A". No complete code anywhere.
|
|
266
|
-
|
|
267
|
-
# ═══════ BOOTSTRAP (BROWNFIELD) — code-derived template, NEW feature, no adopt ═══
|
|
268
|
-
# Same contract as the greenfield bootstrap above (tech-agnostic HLD, spec is the only
|
|
269
|
-
# domain input, full §Traceability + the two ledgers), with ONE difference: the design
|
|
270
|
-
# STRUCTURE follows the code-derived brownfield template + the project's AS-BUILT
|
|
271
|
-
# architecture, not the fixed four layers — so a new feature added to an existing repo
|
|
272
|
-
# is consistent with the code already there. Runs only when onboard generated the
|
|
273
|
-
# code-derived design-template override (design_mode == bootstrap_bf).
|
|
274
|
-
- id: ctx_design_brownfield
|
|
275
|
-
condition: "{{design_mode}} == bootstrap_bf"
|
|
276
|
-
action: build_context
|
|
277
|
-
context:
|
|
278
|
-
- { path: "{{design_doc}}" } # the scaffolded BROWNFIELD template = code-derived section structure
|
|
279
|
-
- { path: "{{spec_file}}" } # the source of truth (FR/BR/CN/DC/IC/US/SC)
|
|
280
|
-
- { path: .appweaver/DESIGN-FORMAT.md } # the HLD contract (see its Brownfield variant note)
|
|
281
|
-
- { path: knowledge/architecture/overview.md, optional: true } # the project's AS-BUILT architecture (onboard) — align to it
|
|
282
|
-
- { path: knowledge/architecture/platform.md, optional: true } # the as-built technology base / cross-cutting reality
|
|
283
|
-
- { path: .appweaver/memory/constitution.technical.md, optional: true } # technology base ONLY — no domain (domain enters via the spec)
|
|
284
|
-
- id: gen_design_brownfield
|
|
285
|
-
condition: "{{design_mode}} == bootstrap_bf"
|
|
286
|
-
action: agent_author
|
|
287
|
-
output_target: { type: file, path: "{{design_doc}}" }
|
|
288
|
-
task: |
|
|
289
|
-
Author the MASTER high-level design (the target design.md in context — it is the
|
|
290
|
-
code-derived BROWNFIELD template) for this NEW feature being added to an EXISTING
|
|
291
|
-
codebase, by filling the template from the spec + the loaded technical/architecture
|
|
292
|
-
standards. It is the MEDIATOR between the spec and the code `implement` will
|
|
293
|
-
generate. Guidance: {{USER_INPUT}}
|
|
294
|
-
Rules:
|
|
295
|
-
- THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + technical standards + the
|
|
296
|
-
project's as-built architecture references, and NO domain rule files. The domain
|
|
297
|
-
arrives as spec ids only — realise them, invent no domain rule the spec omits (an
|
|
298
|
-
unavoidable new concept → a §5 DA-n assumption).
|
|
299
|
-
- STRUCTURE FOLLOWS THE TEMPLATE + THE PROJECT'S AS-BUILT ARCHITECTURE, NOT the four
|
|
300
|
-
greenfield layers. Keep the template's own section order and headings (§0 Overview
|
|
301
|
-
+ ubiquitous language; §1 Architecture Context & Domain Model; §2 Component &
|
|
302
|
-
Behaviour Design; §3 Cross-Cutting; §4 Traceability; §5 Assumptions; §6
|
|
303
|
-
Deviations). Fill §1.1 (As-Built Architecture) by ALIGNING this feature to the
|
|
304
|
-
project's existing style/patterns/folders — read knowledge/architecture/
|
|
305
|
-
overview.md + platform.md (in context) and MATCH them, so the new feature slots
|
|
306
|
-
into the codebase as-built. Create ONE §2 subsection per structural axis THIS
|
|
307
|
-
feature actually needs (its use-cases, endpoints/UI, persistence, external
|
|
308
|
-
adapters, jobs) — titled after the project's OWN module/folder conventions, not a
|
|
309
|
-
fixed Domain/Application/API/Infrastructure layering. A component that fits no
|
|
310
|
-
textbook layer gets its own section; a layer the feature does not need does NOT
|
|
311
|
-
appear.
|
|
312
|
-
- KEEP THE NEUTRAL ANCHORS (the template pins them): §1.2 is the domain/data MODEL
|
|
313
|
-
and MUST follow spec.md EXACTLY — entities & value objects are the spec's Key
|
|
314
|
-
Entities (SAME names), invariants are the spec's Business Rules (BR-nnn, cite
|
|
315
|
-
each), the boundary is the spec's Aggregate Boundary, states are its lifecycle;
|
|
316
|
-
cross-slice references-by-id live here. One §2 subsection is the EXTERNAL
|
|
317
|
-
INTEGRATIONS table (its heading contains "Integration") — one port/adapter row
|
|
318
|
-
per IC-, realising the obligation the spec named.
|
|
319
|
-
- REALISE THE LIFTED CONSTRAINTS (each cites its spec id): CN- → structural ones
|
|
320
|
-
(immutability, append-only audit, no-hard-delete) as §1.2 invariants/events;
|
|
321
|
-
retention/performance/audit as §2 persistence or §3 Cross-Cutting rows. DC- → §3
|
|
322
|
-
data-protection + the projection surface (what MUST NOT be exposed in
|
|
323
|
-
API/logs/traces).
|
|
324
|
-
- CONSTITUTION-MANDATED CROSS-CUTTING (from the loaded technical constitution, NOT
|
|
325
|
-
the spec): a NON-NEGOTIABLE technical principle with no per-feature spec id —
|
|
326
|
-
APPLY it, and LOG it as a §5 DA-n whose basis cites the mandating principle
|
|
327
|
-
("per Const. §<n>"); do NOT fabricate a spec CN- for it, and do NOT leave it
|
|
328
|
-
uncited.
|
|
329
|
-
- TECHNOLOGY-AGNOSTIC: signatures + pre/post/invariant/raises pseudocode and
|
|
330
|
-
field-shape contracts — NEVER language code. Conceptual types only; the stack is
|
|
331
|
-
bound at `implement` time. Do NOT include code-generation mechanics or the
|
|
332
|
-
layering/dependency rule (those are solution-wide / constitution rules).
|
|
333
|
-
- Every design element traces UP to a spec id; fill §4 Traceability completely (a
|
|
334
|
-
row for EVERY FR/BR/CN/DC/IC/US/SC so no lifted constraint is dropped). Fill the
|
|
335
|
-
§5 Assumptions (DA-n) and §6 Deviations (WA-n) ledgers — "None (as of v1.0)" if
|
|
336
|
-
empty. §6 records only genuine deviations, not "organised unlike a reference
|
|
337
|
-
architecture" (that is the as-built shape, §1.1).
|
|
338
|
-
- This is v1.0: set the initial Change History row + keep US-1's mapping. Omit a
|
|
339
|
-
section only if the feature genuinely has nothing there (state why); no complete
|
|
340
|
-
code anywhere.
|
|
341
|
-
|
|
342
|
-
# ══════════════════ DELTA — design.md exists (delegate to delta-design) ═══════
|
|
343
|
-
# design.md exists ⇒ delta. Delegate to the delta-design module: it JOINs the change
|
|
344
|
-
# specify opened (need_new_change=false) or OPENs its own (a design-only change —
|
|
345
|
-
# spec unchanged), then authors the delta-design ONLY — the master design.md is left
|
|
346
|
-
# UNTOUCHED. The change stays OPEN; finalize-delta merges the delta into design.md
|
|
347
|
-
# later. Runs in this context (shares vars + the technical sticky standards). The
|
|
348
|
-
# former standalone `cr` capture's design half now lives here.
|
|
349
|
-
- id: delta_design_module
|
|
350
|
-
condition: "{{design_mode}} == delta"
|
|
351
|
-
action: include
|
|
352
|
-
module: .appweaver/orchestrator/modules/delta-design.orch.yaml
|
|
353
|
-
|
|
354
|
-
# ═══════════ HANDOFF — authoring only; the gates are SEPARATE stages ═══════
|
|
355
|
-
# Design AUTHORS only.
|
|
356
|
-
# • BOOTSTRAP → /appweaver analyze-design (spec↔design conformance gate) →
|
|
357
|
-
# implement. No open change.
|
|
358
|
-
# • DELTA → the change stays OPEN with a filled delta-design. Ship it via the CR
|
|
359
|
-
# chain: /appweaver analyze-delta-design (delta-design ↔ delta-spec coherence)
|
|
360
|
-
# → implement-delta (delta code + regression tests) → build (compile) →
|
|
361
|
-
# finalize-delta (downstream fence, then merge the delta into spec.md + design.md;
|
|
362
|
-
# the change stays OPEN) → analyze-slice (verify the slice against the merged
|
|
363
|
-
# master) → close-delta (archive the change, bump the minor version).
|
|
364
|
-
|
|
365
|
-
# 6. Post-execution hooks.
|
|
366
|
-
- id: resolve_post_hooks
|
|
367
|
-
action: execute_script
|
|
368
|
-
script: { ref: actions }
|
|
369
|
-
subcommand: resolve-hooks
|
|
370
|
-
args: ["--phase", "after_design"]
|
|
371
|
-
outputs:
|
|
372
|
-
- { name: after_hooks, from: "$.hooks" }
|
|
373
|
-
- id: dispatch_post_hooks
|
|
374
|
-
action: dispatch_hooks
|
|
375
|
-
hooks_from_variable: after_hooks
|
|
376
|
-
|
|
377
|
-
outputs:
|
|
378
|
-
feature_dir: "{{feature_dir}}"
|
|
379
|
-
design_doc: "{{design_doc}}"
|
|
380
|
-
version: "{{version}}"
|
|
381
|
-
active_change: "{{active_change}}"
|
|
382
|
-
next: "BOOTSTRAP (new design.md): /appweaver analyze-design (spec↔design gate) → implement. DELTA (change {{active_change}} open, delta-design authored): /appweaver analyze-delta-design → implement-delta → build → finalize-delta → analyze-slice → close-delta (finalize-delta merges the delta into spec.md + design.md but leaves the change open; analyze-slice verifies the slice against the merged master; close-delta archives the change and bumps the minor version)."
|