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.
Files changed (30) hide show
  1. package/assets/.appweaver/STACK-PROFILES.md +1 -1
  2. package/assets/.appweaver/orchestrator/orchestrator.py +5 -0
  3. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +10 -3
  4. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +38 -11
  5. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +2 -1
  6. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +607 -123
  7. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +625 -66
  8. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +407 -134
  9. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +452 -143
  10. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +78 -14
  11. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan-ui.orch.yaml +597 -0
  12. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +688 -0
  13. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +3 -3
  14. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +23 -23
  15. package/assets/.appweaver/orchestrator/workflows/aw-spec-story-plan.orch.yaml +945 -0
  16. package/assets/.appweaver/orchestrator/workflows/aw-spec-sync-stories.orch.yaml +1040 -0
  17. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2069 -28
  18. package/assets/.appweaver/scripts/bash/aw-xref.sh +2 -1
  19. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +1973 -13
  20. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +2 -1
  21. package/assets/.appweaver/scripts/python/aw-xref.py +246 -20
  22. package/assets/.appweaver/templates/design-template.md +88 -54
  23. package/assets/.appweaver/templates/spec-template.md +12 -10
  24. package/assets/.appweaver/templates/story-template.md +48 -8
  25. package/assets/.appweaver/templates/ui-design-template.md +71 -39
  26. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +19 -7
  27. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +35 -26
  28. package/package.json +1 -1
  29. package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +0 -386
  30. 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)."