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,386 +0,0 @@
1
- # =============================================================================
2
- # aw-spec-design-ui (orchestrator) — the FRONTEND LANE's Design phase
3
- #
4
- # Authors ONE high-level UI design document per feature — specs/<Aggregate>/design.ui.md
5
- # — the frontend lane's twin of design.md and the MEDIATOR between the spec and the
6
- # frontend code. Its sections are the experience, not the four clean-architecture
7
- # layers: navigation & screen structure · client state · component structure ·
8
- # interaction & flow · contract binding · cross-cutting · traceability, plus the same
9
- # two deferral ledgers (DA-n / WA-n). `implement-ui` GENERATES the components from it.
10
- # See .appweaver/DESIGN-FORMAT.md ("Frontend lane variant") +
11
- # .appweaver/templates/ui-design-template.md.
12
- #
13
- # WHY A SEPARATE COMMAND, NOT A UI BRANCH INSIDE `design`. The two lanes are governed
14
- # by different constitution halves, take their rules from different map headings, and
15
- # own disjoint source paths. Keying the rule maps on `## /aw-spec-design-ui` gives the
16
- # lane its own rule set for zero mechanism change; a UI section inside design.md would
17
- # put the lane's structure under the service lane's rules and hand this phase the whole
18
- # service design to read.
19
- #
20
- # THE LANE BOUNDARY IS §5. This phase reads the WHOLE spec — the experience is stated
21
- # there, as UX- standards and as the interaction its user stories imply — but only the
22
- # service's PUBLISHED SURFACE: the spec's IC- ids and, where design.md exists, the API
23
- # contracts it states. No table, handler or persistence choice crosses that line.
24
- # design.md is OPTIONAL context for exactly that reason: a UI-only project authors §5
25
- # from the spec's IC- surface and records a DA-n. (⌛ B-11 replaces the optional
26
- # design.md with design-contract.md, the projection `design` will emit — the prompt's
27
- # rule does not change when it does.)
28
- #
29
- # UX- LIVES HERE AND ONLY HERE. design.md deliberately excludes the spec's Experience
30
- # Standards — the service design realises no experience standard — so a UX- that reaches
31
- # neither design is a dropped requirement. §7 Traceability is where that is caught.
32
- #
33
- # TEMPLATE-DRIVEN AUTHORING (greenfield-safe), the same pair `design` uses:
34
- # • GREENFIELD (default) — the experience template shipped at
35
- # .appweaver/templates/ui-design-template.md. Sections §0–§9 as above.
36
- # • BROWNFIELD — when /appweaver onboard has GENERATED the code-derived
37
- # `ui-design-template` override (reverse-engineered from the repo's own UI source;
38
- # override_active), a NEW feature added to an existing app is authored with the
39
- # as-built composition axes instead, so it slots into the lane already there.
40
- #
41
- # BOOTSTRAP ONLY. The trigger is design.ui.md's OWN existence, symmetric with how
42
- # `design` keys off design.md. No design.ui.md ⇒ author the master. One already there
43
- # ⇒ the change is a DELTA, and ⌛ `delta-design-ui` owns that record — this command
44
- # stops rather than overwrite a master finalize-delta is the sole writer of.
45
- #
46
- # Forward path: select-stack → select-domain → constitution → select-feature →
47
- # specify → design-ui → ⌛ analyze-design-ui → implement-ui → build
48
- #
49
- # Launch: /appweaver design-ui [guidance]
50
- # Prereq: /appweaver specify (the spec is this phase's only domain input)
51
- # =============================================================================
52
-
53
- name: aw-spec-design-ui
54
- description: "Author the frontend lane's single high-level design.ui.md from the spec — the experience twin of design.md, and the MEDIATOR between spec.md and the code implement-ui generates. Sections are navigation & screen structure, client state, component structure, interaction & flow, contract binding, cross-cutting, traceability and the two deferral ledgers. Technology-agnostic: no framework, router, state library or component library appears; the stack binds at implement-ui. Realises the spec's UX- Experience Standards, which design.md excludes by contract. The service lane enters only at §5 Contract Binding, as its published surface. Authoring is template-driven — the shipped experience template by default, or the code-derived as-built structure when onboard installed it as the ui-design-template override. Bootstrap only: an existing design.ui.md means the change is a delta and routes to delta-design-ui."
55
- version: 1.0.0
56
- agent_agnostic: true
57
- dialect: aw-spec.orchestrator/v1
58
-
59
- inputs:
60
- user_input:
61
- description: Optional design guidance (flow preferences, screen decomposition hints, constraints).
62
- required: false
63
- bind: USER_INPUT
64
-
65
- scripts:
66
- actions:
67
- sh: .appweaver/scripts/bash/aw-spec-actions.sh
68
- ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
69
-
70
- # Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The lane's
71
- # FRONTEND rule files are CONFIGURATION, loaded per-command from
72
- # guardrails/projects/<project>/tech-rule-bindings.md under `## /aw-spec-design-ui` by the
73
- # tech-select module. Per the rule-partition this phase loads NO domain rule file —
74
- # the domain reaches it as spec ids, exactly as it reaches design.md. The lane's
75
- # ratified base arrives via constitution.ui.md (referred to directly, as-is — NOT
76
- # mapped). (missing files skipped at assembly time)
77
- standards:
78
- - { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
79
-
80
- vars:
81
- ui_design_mode: "bootstrap_gf" # resolved below → bootstrap_gf | bootstrap_bf
82
- ui_is_delta: "no" # "yes" ⇒ design.ui.md already exists ⇒ the change is a delta
83
- version: ""
84
-
85
- workflow:
86
-
87
- # 0. FRONTEND rule files → sticky standards (configuration, not hardcoded).
88
- # No blocking gate: a project that has not mapped the heading soft-continues,
89
- # because constitution.ui.md still carries the lane's ratified base.
90
- - id: tech_select
91
- action: include
92
- module: .appweaver/orchestrator/modules/tech-select.orch.yaml
93
- with: { command: aw-spec-design-ui }
94
-
95
- # 1. The lane must EXIST. This phase writes a document, not code, so it asks the
96
- # declaration whether there is a frontend lane at all — not the lane-gate module,
97
- # whose on-disk check would refuse a greenfield project that has declared `web/`
98
- # but not scaffolded it yet. A UI design is authored before the UI exists; that is
99
- # the point of designing.
100
- - id: lane_resolve
101
- action: execute_script
102
- on_error: continue # never crash raw on an undeclared lane — the gate below explains it
103
- script: { ref: actions }
104
- subcommand: lane-resolve
105
- outputs:
106
- - { name: fe_declared, from: "$.frontend_declared" }
107
- - { name: lane_id, from: "$.frontend_lane_id" }
108
- - { name: lane_title, from: "$.frontend_title" }
109
- - { name: lane_language, from: "$.frontend_language" }
110
- - { name: lane_ecosystem, from: "$.frontend_ecosystem" }
111
- - { name: lane_root, from: "$.frontend_source_path" }
112
-
113
- - id: require_lane
114
- action: verify_context
115
- require_true: fe_declared
116
- on_false: stop
117
- on_false_message: "No frontend lane is declared in .appweaver/stacks.json, so there is no experience to design. Run /appweaver select-stack and declare the UI stack plus its source path, then re-run design-ui. A project that genuinely has no UI designs the service lane alone with /appweaver design."
118
-
119
- # 2. Resolve the current feature and require its spec — this phase's only domain input.
120
- - id: feature_paths
121
- action: execute_script
122
- on_error: continue # never crash raw on 'no feature set' — the gate below explains it
123
- script: { ref: actions }
124
- subcommand: feature-paths
125
- outputs:
126
- - { name: feature_dir, from: "$.feature_dir" }
127
- - { name: spec_file, from: "$.spec_file" }
128
- - { name: spec_exists, from: "$.spec_exists" }
129
- - { name: service_design, from: "$.design_file" }
130
- - { name: ui_design_exists, from: "$.ui_design_exists" }
131
-
132
- - id: require_feature
133
- action: verify_context
134
- require_non_empty: feature_dir
135
- on_empty: stop
136
- on_empty_message: "No active feature. Run /appweaver select-feature first (pick or create the aggregate, e.g. Order), then re-run design-ui."
137
-
138
- - id: verify_spec
139
- action: verify_context
140
- require_true: spec_exists
141
- on_false: stop
142
- on_false_message: "No spec.md for the current feature. Run /appweaver specify first — the spec is this phase's only domain input, and its Experience Standards (UX-) are what design.ui.md realises."
143
-
144
- # 2a. BOOTSTRAP ONLY. design.ui.md's own existence is the delta trigger, symmetric
145
- # with design's design.md trigger. Stop rather than overwrite the master: it is
146
- # finalize-delta's to write, and ⌛ delta-design-ui owns the change record.
147
- # The flag is carried as a literal string because the two readers disagree on a
148
- # JSON boolean: a `condition:` resolves it through json.dumps ("false"), while
149
- # `require_value` reads the variable raw (str(False) -> "False"). Setting a
150
- # string under a condition keeps both readings the same one.
151
- - id: mark_delta
152
- condition: "{{ui_design_exists}} == true"
153
- action: set
154
- vars: { ui_is_delta: "yes" }
155
-
156
- - id: refuse_delta
157
- action: verify_context
158
- require_value: ui_is_delta
159
- equals: "no"
160
- on_mismatch: stop
161
- on_mismatch_message: "design.ui.md already exists for this feature, so a change to it is a DELTA, not a re-bootstrap — the master is finalize-delta's to write. ⌛ /appweaver delta-design-ui, which owns the delta-design.ui.md record, is not built yet. To regenerate the master from scratch instead, delete specs/<Feature>/design.ui.md first."
162
-
163
- # 3. Read the version so the authored header is stamped consistently with its siblings.
164
- - id: read_change
165
- action: execute_script
166
- on_error: continue
167
- script: { ref: actions }
168
- subcommand: version-read
169
- args: ["--feature-dir", "{{feature_dir}}"]
170
- outputs:
171
- - { name: version, from: "$.version" }
172
-
173
- # 4. Scaffold design.ui.md from the LANE's template pair (--lane ui resolves
174
- # ui-design-template → design.ui.md, so no caller can write the service template
175
- # under the UI lane's filename). Idempotent; the delta refusal above already
176
- # guarantees it is a create.
177
- - id: ui_design_scaffold
178
- action: execute_script
179
- script: { ref: actions }
180
- subcommand: design-scaffold
181
- args: ["--feature-dir", "{{feature_dir}}", "--lane", "ui"]
182
- outputs:
183
- - { name: ui_design_doc, from: "$.design_doc" }
184
- - { name: ui_override, from: "$.override_active" } # true ⇒ onboard installed the code-derived template
185
-
186
- # 4a. Resolve the authoring MODE. Ordered override rather than a branch — the engine
187
- # has no compound conditions: state the greenfield default, let the code-derived
188
- # override replace it.
189
- - id: mode_brownfield
190
- condition: "{{ui_override}} == true"
191
- action: set
192
- vars: { ui_design_mode: "bootstrap_bf" }
193
-
194
- # 5. Pre-execution hooks.
195
- - id: resolve_pre_hooks
196
- action: execute_script
197
- script: { ref: actions }
198
- subcommand: resolve-hooks
199
- args: ["--phase", "before_design_ui"]
200
- outputs:
201
- - { name: before_hooks, from: "$.hooks" }
202
- - id: dispatch_pre_hooks
203
- action: dispatch_hooks
204
- hooks_from_variable: before_hooks
205
-
206
- # ═══════════ GREENFIELD — the shipped experience template (§0–§9) ═══════════
207
- # build_context REPLACES the per-request envelope; the sticky frontend standards
208
- # stay prepended. The ENGINE writes ui_design_doc.
209
- - id: ctx_ui_design
210
- condition: "{{ui_design_mode}} == bootstrap_gf"
211
- action: build_context
212
- context:
213
- - { path: "{{ui_design_doc}}" } # the copied template = section structure
214
- - { path: "{{spec_file}}" } # the source of truth (UX/US/FR/CN/DC/IC/SC)
215
- - { path: .appweaver/DESIGN-FORMAT.md } # the design-doc contract + its frontend lane variant
216
- - { path: .appweaver/memory/constitution.ui.md, optional: true } # the lane's ratified UX-* base — optional: a lane may be declared before it is ratified
217
- - { path: "{{service_design}}", optional: true } # §5 ONLY — the service's published surface, never its internals
218
- - id: gen_ui_design
219
- condition: "{{ui_design_mode}} == bootstrap_gf"
220
- action: agent_author
221
- output_target: { type: file, path: "{{ui_design_doc}}" }
222
- task: |
223
- Author the MASTER UI design (the target design.ui.md in context) for this
224
- feature's EXPERIENCE by filling out the template from the feature spec + the
225
- loaded frontend standards. This is the frontend lane's MEDIATOR between the spec
226
- and the components `implement-ui` will generate. Guidance: {{USER_INPUT}}
227
- Rules:
228
- - THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + frontend standards, and
229
- NO domain rule files. The domain arrives as spec ids only — realise them, and
230
- invent no domain rule the spec omits (an unavoidable new concept → §8 DA-n).
231
- - Keep the template's section order and headings: §0 Design Overview, §1
232
- Navigation & Screen Structure, §2 Client State, §3 Component Structure, §4
233
- Interaction & Flow, §5 Contract Binding, §6 Cross-Cutting, §7 Traceability,
234
- §8 Assumptions, §9 Workarounds, Change History.
235
- - REALISE THE SPEC'S EXPERIENCE CONTENT:
236
- • Experience Standards (UX-) are THIS document's to realise — design.md
237
- excludes them by contract, so a UX- with no home here is a DROPPED
238
- requirement, not a tidy omission. Every UX- gets a §7 row.
239
- • Experience Scope (actors · channels · device/browser/AT floors) bounds §1
240
- and §6 — design for the floors the spec names and no more.
241
- • Each User Story (US-) gets a screen home in §1 and a flow in §4. A US- with
242
- no screen is a coverage failure.
243
- • Interaction-state requirements are ordinary FR- ids (the EARS
244
- unwanted-behaviour form). Each one gets a §4 row.
245
- - REALISE THE LIFTED CONSTRAINTS, each citing its spec id:
246
- • CN- → §6 Authorization surface and the §1 access conditions (what is hidden
247
- vs disabled vs enforced server-side — the client never becomes the authority).
248
- • DC- → §2 "what must NOT be held" and the §6 data-exposure row: what may not
249
- reach the client, its logs, its storage or its URLs.
250
- • IC-/SC- → §5 binding rows and the §6 performance row respectively.
251
- - §4 INTERACTION & FLOW AND §6 CROSS-CUTTING ARE NEVER OMITTED, however thin the
252
- feature. Loading, empty, error, permission-denied and in-flight states, plus
253
- validation timing, focus placement and keyboard reachability, are where most UI
254
- defects live. A state the UI can reach that the spec does not describe is a SPEC
255
- gap: log it as a §8 DA-n and say it routes to `specify`; never invent the
256
- requirement here.
257
- - §5 IS THE LANE BOUNDARY. Bind against the service's PUBLISHED surface only —
258
- the spec's IC- ids, and where design.md is in context, the API contracts it
259
- states. CITE those contracts; do NOT restate, re-derive or contradict them, and
260
- introduce NO server-side behaviour, persistence assumption or handler detail.
261
- Anything the experience needs that the surface does not offer is a CONTRACT
262
- DELTA raised back to the service lane under "Contract deltas needed" — never a
263
- workaround in the client. Where no service design is in context, bind from the
264
- spec's IC- surface and record that as a §8 DA-n.
265
- - CONSTITUTION-MANDATED CROSS-CUTTING (from the loaded UI constitution, NOT the
266
- spec): a NON-NEGOTIABLE UX principle you must apply that has no per-feature spec
267
- id. APPLY it, and because it is not spec-derived, LOG it as a §8 DA-n whose
268
- basis cites the mandating principle ("per constitution.ui.md UX-<n>"); set the
269
- corresponding §6 row's "Serves" to that DA-n. Do NOT fabricate a spec UX- for
270
- it, and do NOT leave it uncited.
271
- - TECHNOLOGY-AGNOSTIC: name no framework, router, state library, component library
272
- or styling approach. Describe a component by its RESPONSIBILITY, its INPUTS as
273
- field shapes, the EVENTS it raises and the STATES it can be in; describe routing
274
- as a conceptual shape. The framework binds at `implement-ui`. Do NOT include
275
- file placement, naming conventions or test mechanics — those are the UI
276
- constitution's and `implement-ui`'s, identical for every feature.
277
- - The header's Lane field is `{{lane_id}}`. That identifier is the ONLY thing you
278
- are told about the lane: its framework and language are deliberately withheld,
279
- because a design that knows them starts naming them.
280
- - STAY IN THE LANE'S SCOPE. This feature's screens only. The app shell, global
281
- layout and the design system belong to no single feature: cite them under
282
- "Screens this feature does NOT own" / "Reused from the design system", and do
283
- not claim or redesign them here.
284
- - §7 TRACEABILITY IS THE SPINE — fill it completely, both ways: a row for EVERY
285
- UX-, US-, and for every CN-/DC-/IC-/SC- with an experience obligation, so no
286
- lifted constraint is silently dropped; and no UI element without a spec reason.
287
- - Fill the two ledgers: §8 Assumptions (DA-n, to clarify later) and §9 Workarounds
288
- (WA-n, to clear later). Empty → "None (as of v1.0)".
289
- - This is v1.0: set the initial Change History row. No component code anywhere.
290
-
291
- # ═══ BROWNFIELD — code-derived template, NEW feature in an EXISTING app ════
292
- # Same contract as above (technology-agnostic, spec is the only domain input, full §7
293
- # and both ledgers), with ONE difference: the STRUCTURE follows the code-derived
294
- # template's own composition axes and the lane's as-built conventions, so a new
295
- # feature slots into the app already there instead of introducing a second convention.
296
- # Runs only when onboard generated the ui-design-template override.
297
- - id: ctx_ui_design_brownfield
298
- condition: "{{ui_design_mode}} == bootstrap_bf"
299
- action: build_context
300
- context:
301
- - { path: "{{ui_design_doc}}" } # the scaffolded CODE-DERIVED template = as-built section structure
302
- - { path: "{{spec_file}}" } # the source of truth (UX/US/FR/CN/DC/IC/SC)
303
- - { path: .appweaver/DESIGN-FORMAT.md } # the design-doc contract + its frontend lane variant
304
- - { path: .appweaver/memory/constitution.ui.md, optional: true } # the lane's UX-* base, reversed by onboard from this same UI
305
- - { path: knowledge/architecture/frontend.md, optional: true } # the as-built UI architecture + the SHARED surface no slice owns
306
- - { path: "{{service_design}}", optional: true } # §5 ONLY — the service's published surface, never its internals
307
- - id: gen_ui_design_brownfield
308
- condition: "{{ui_design_mode}} == bootstrap_bf"
309
- action: agent_author
310
- output_target: { type: file, path: "{{ui_design_doc}}" }
311
- task: |
312
- Author the MASTER UI design (the target design.ui.md in context — it is this
313
- project's CODE-DERIVED UI design template) for this NEW feature being added to an
314
- EXISTING frontend, by filling the template from the feature spec + the loaded
315
- frontend standards. It is the MEDIATOR between the spec and the components
316
- `implement-ui` will generate. Guidance: {{USER_INPUT}}
317
- Rules:
318
- - THE SPEC IS THE ONLY DOMAIN INPUT. You have the spec + frontend standards + the
319
- lane's as-built architecture reference, and NO domain rule files. The domain
320
- arrives as spec ids only; an unavoidable new concept is an Assumption (DA-n).
321
- - STRUCTURE FOLLOWS THE TEMPLATE AND THE LANE AS-BUILT, not a fixed screen
322
- taxonomy. Keep the template's own section order and headings, and create one
323
- component subsection per composition axis THIS feature actually needs, titled
324
- with the lane's OWN name for it. ALIGN this feature to the app already there —
325
- read the as-built architecture reference in context and MATCH its screen
326
- organisation, its state and data-fetching placement and its styling approach, so
327
- the feature slots in rather than introducing a second convention.
328
- - KEEP THE NEUTRAL ANCHORS the template pins: the navigation/screen inventory, the
329
- client-state table, the interaction-and-flow section, the cross-cutting table
330
- and the traceability spine exist in every UI design, whatever the axes are
331
- called. INTERACTION & FLOW and CROSS-CUTTING are NEVER omitted, however thin the
332
- feature — loading, empty, error, permission-denied and in-flight states, focus
333
- placement and keyboard reachability are where most UI defects live.
334
- - REALISE THE SPEC'S EXPERIENCE CONTENT: every Experience Standard (UX-) gets a
335
- traceability row (design.md excludes them by contract, so this is their only
336
- home), every User Story a screen and a flow, every interaction-state FR- a flow
337
- row. Realise the lifted constraints citing their ids — CN- as the authorization
338
- surface and access conditions, DC- as what may not reach the client or its logs,
339
- storage and URLs, IC- as binding rows, SC- as the performance decision.
340
- - THE LANE BOUNDARY: bind against the service's PUBLISHED surface only — the
341
- spec's IC- ids and, where design.md is in context, the API contracts it states.
342
- Cite them; do not restate, re-derive or contradict them, and introduce no
343
- server-side behaviour. What the experience needs and the surface lacks is a
344
- contract delta raised back to the service lane, never a client workaround.
345
- - CONSTITUTION-MANDATED CROSS-CUTTING with no per-feature spec id: apply it, and
346
- log it as a DA-n citing the mandating principle ("per constitution.ui.md
347
- UX-<n>"). Do not fabricate a spec id for it and do not leave it uncited.
348
- - TECHNOLOGY-AGNOSTIC: name no framework, router, state library, component library
349
- or styling approach — responsibilities, field shapes, events and states only.
350
- Naming the lane's as-built CONVENTION is not naming a framework; naming the
351
- library that implements it is. The framework binds at `implement-ui`.
352
- - The header's Lane field is `{{lane_id}}`. That identifier is the ONLY thing you
353
- are told about the lane: its framework and language are deliberately withheld,
354
- because a design that knows them starts naming them.
355
- - THE SHARED SURFACE (app shell, global layout, design system) belongs to no
356
- feature. Cite it; do not copy it in and do not claim it here.
357
- - Fill the traceability spine completely, both ways, and both ledgers —
358
- Assumptions (DA-n) and Workarounds (WA-n), "None (as of v1.0)" when empty.
359
- - This is v1.0: set the initial Change History row. No component code anywhere.
360
-
361
- # ═══════════ HANDOFF — authoring only; the gate is a SEPARATE stage ════════
362
- # ⌛ /appweaver analyze-design-ui — the spec↔design.ui.md conformance gate (every
363
- # UX-/US-/FR- with an experience obligation realised here) — is not built yet.
364
- # Until it is, review §7 Traceability by hand before generating: it is the only
365
- # two-way check that a UX- did not fall between the two designs.
366
- # → /appweaver implement-ui generates the components from this document alone.
367
-
368
- # 6. Post-execution hooks.
369
- - id: resolve_post_hooks
370
- action: execute_script
371
- script: { ref: actions }
372
- subcommand: resolve-hooks
373
- args: ["--phase", "after_design_ui"]
374
- outputs:
375
- - { name: after_hooks, from: "$.hooks" }
376
- - id: dispatch_post_hooks
377
- action: dispatch_hooks
378
- hooks_from_variable: after_hooks
379
-
380
- outputs:
381
- feature_dir: "{{feature_dir}}"
382
- ui_design_doc: "{{ui_design_doc}}"
383
- lane_id: "{{lane_id}}"
384
- lane_root: "{{lane_root}}"
385
- version: "{{version}}"
386
- next: "design.ui.md authored for the {{lane_id}} lane at {{ui_design_doc}}. Review §7 Traceability by hand — ⌛ /appweaver analyze-design-ui (the spec↔design.ui.md gate) is not built yet, and §7 is the only two-way check that a UX- did not fall between design.md and design.ui.md. Then /appweaver implement-ui, which generates the components from this document alone. A later change to it is a delta: ⌛ /appweaver delta-design-ui."