aw-spec-cli 0.1.28 → 0.1.30
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/.amp/agent.json +22 -0
- package/assets/.amp/settings-edit.json +5 -0
- package/assets/.amp/settings-read.json +12 -0
- package/assets/.appweaver/DESIGN-FORMAT.md +9 -0
- package/assets/.appweaver/STACK-PROFILES.md +102 -15
- package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +40 -18
- package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +56 -4
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +17 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +12 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +289 -24
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +370 -85
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +349 -65
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +39 -7
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +63 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +5 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +430 -138
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +392 -76
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-lane.orch.yaml +104 -0
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +20 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +26 -3
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +314 -44
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +249 -20
- package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +17 -2
- package/assets/.appweaver/scripts/python/aw-plangate.py +109 -19
- package/assets/.appweaver/scripts/python/aw-stack.py +1295 -9
- package/assets/.appweaver/templates/delta-design-template.md +7 -5
- package/assets/.appweaver/templates/delta-spec-template.md +2 -0
- package/assets/.appweaver/templates/design-template.md +17 -0
- package/assets/.appweaver/templates/ui-design-template.md +19 -4
- package/assets/.augment/agent.json +22 -0
- package/assets/.augment/commands/appweaver.md +12 -0
- package/assets/.cline/agent.json +22 -0
- package/assets/.clinerules/workflows/appweaver.md +7 -0
- package/assets/.codex/agent.json +22 -0
- package/assets/.continue/agent.json +22 -0
- package/assets/.continue/prompts/appweaver.md +13 -0
- package/assets/.cursor/agent.json +22 -0
- package/assets/.cursor/commands/appweaver.md +7 -0
- package/assets/.devin/agent.json +22 -0
- package/assets/.devin/workflows/appweaver.md +11 -0
- package/assets/.factory/agent.json +22 -0
- package/assets/.factory/commands/appweaver.md +12 -0
- package/assets/.gemini/agent.json +22 -0
- package/assets/.github/prompts/appweaver.prompt.md +13 -0
- package/assets/.kilo/agent.json +28 -0
- package/assets/.kilo/agents/appweaver-edit.md +12 -0
- package/assets/.kilo/agents/appweaver-read.md +12 -0
- package/assets/.kilo/commands/appweaver.md +11 -0
- package/assets/.kiro/agent.json +22 -0
- package/assets/.kiro/skills/appweaver/SKILL.md +12 -0
- package/assets/.opencode/agent.json +22 -0
- package/assets/.opencode/agents/appweaver-edit.md +12 -0
- package/assets/.opencode/agents/appweaver-read.md +13 -0
- package/assets/.opencode/commands/appweaver.md +11 -0
- package/assets/.roo/agent.json +22 -0
- package/assets/.roo/commands/appweaver.md +12 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +14 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/copy-assets.d.ts +16 -3
- package/dist/utils/copy-assets.d.ts.map +1 -1
- package/dist/utils/copy-assets.js +29 -14
- package/dist/utils/copy-assets.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# aw-spec-select-lane (orchestrator) — choose the lane THIS DEVELOPER works on
|
|
3
|
+
#
|
|
4
|
+
# stacks.json says which lanes the project has. .appweaver/lane.json says which of them
|
|
5
|
+
# the developer on this machine is working on: `backend`, `frontend` or `both`. It is not
|
|
6
|
+
# committed, so a backend developer and a frontend developer on one repository each keep
|
|
7
|
+
# their own, and each can work on their lane at a different time from the other.
|
|
8
|
+
#
|
|
9
|
+
# select-stack writes the default — both when both lanes are declared, otherwise the one
|
|
10
|
+
# that is — and a clone without the file reads that same default. Run this command only
|
|
11
|
+
# to narrow it: a developer who builds one lane picks it once, and every later command
|
|
12
|
+
# follows it until it is changed again.
|
|
13
|
+
#
|
|
14
|
+
# WHAT THE CHOICE CHANGES. plan, analyze-plan, implement, build and analyze-slice WRITE
|
|
15
|
+
# only the working lane — they plan it, gate it, generate it, compile it and test it — and
|
|
16
|
+
# still READ the other lane where they need it: a frontend plan binds to the backend
|
|
17
|
+
# plan's published surface, which the backend developer owns. specify, finalize-delta and
|
|
18
|
+
# close-delta do NOT follow it: the spec is written whole, from its rules and standards,
|
|
19
|
+
# and a change merges and closes with whatever its lanes have delivered.
|
|
20
|
+
#
|
|
21
|
+
# THE OPTIONS COME FROM stacks.json. Both lanes declared → backend, frontend and both.
|
|
22
|
+
# One lane declared → that lane only, picked without a question (there is nothing to
|
|
23
|
+
# choose). No lane declared → stop, naming select-stack.
|
|
24
|
+
#
|
|
25
|
+
# ZERO LLM: two scripts, one gate and one select.
|
|
26
|
+
#
|
|
27
|
+
# Run (interactive via launcher):
|
|
28
|
+
# /appweaver select-lane # list the lanes and pick one
|
|
29
|
+
# /appweaver select-lane frontend # pick directly (backend | frontend | both)
|
|
30
|
+
# Headless:
|
|
31
|
+
# --select select_lane=<option line>
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
name: aw-spec-select-lane
|
|
35
|
+
description: Choose the lane this developer works on — backend, frontend or both — and store it in .appweaver/lane.json, which is not committed, so each developer keeps their own. The options come from the stacks declared in .appweaver/stacks.json, all three when both lanes are declared and only the declared one otherwise. plan, analyze-plan, implement, build and analyze-slice then write only that lane while still reading the other; specify, finalize-delta and close-delta do not follow it. select-stack writes the default (every declared lane); run this to narrow it.
|
|
36
|
+
version: 1.0.0
|
|
37
|
+
agent_agnostic: true
|
|
38
|
+
dialect: aw-spec.orchestrator/v1
|
|
39
|
+
|
|
40
|
+
inputs:
|
|
41
|
+
user_input:
|
|
42
|
+
description: Optional working lane to set directly — backend, frontend or both. Only the whole word counts, and only a lane the declared stacks offer; anything else shows the list.
|
|
43
|
+
required: false
|
|
44
|
+
bind: USER_INPUT
|
|
45
|
+
|
|
46
|
+
scripts:
|
|
47
|
+
actions:
|
|
48
|
+
sh: .appweaver/scripts/bash/aw-spec-actions.sh
|
|
49
|
+
ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
|
|
50
|
+
|
|
51
|
+
workflow:
|
|
52
|
+
|
|
53
|
+
# 1. The answers the declared stacks offer, the current choice, and the argument
|
|
54
|
+
# matched against them as a whole word.
|
|
55
|
+
- id: list_lanes
|
|
56
|
+
action: execute_script
|
|
57
|
+
script: { ref: actions }
|
|
58
|
+
subcommand: lane-select
|
|
59
|
+
args: ["--preselect", "{{USER_INPUT}}"]
|
|
60
|
+
outputs:
|
|
61
|
+
- { name: lane_options, from: "$.select_options" }
|
|
62
|
+
- { name: lane_count, from: "$.option_count" }
|
|
63
|
+
- { name: lane_current, from: "$.lane" }
|
|
64
|
+
- { name: lane_source, from: "$.source" }
|
|
65
|
+
- { name: lane_match, from: "$.preselect" }
|
|
66
|
+
|
|
67
|
+
# 2. No declared lane means nothing to work on.
|
|
68
|
+
- id: guard_no_lanes
|
|
69
|
+
action: verify_context
|
|
70
|
+
require_non_empty: lane_options
|
|
71
|
+
on_empty_message: >
|
|
72
|
+
No lane is declared in .appweaver/stacks.json, so there is no lane to work on.
|
|
73
|
+
Run /appweaver select-stack first and declare the backend stack, the frontend
|
|
74
|
+
stack, or both.
|
|
75
|
+
on_empty: stop
|
|
76
|
+
|
|
77
|
+
# 3. Choose. A whole-word argument selects directly; one declared lane is selected
|
|
78
|
+
# without a question.
|
|
79
|
+
- id: select_lane
|
|
80
|
+
action: user_select
|
|
81
|
+
prompt: "Which lane are you working on? You are on `{{lane_current}}` now (from {{lane_source}}). The commands that plan, gate, generate, build and test write only this lane, and still read the other one:"
|
|
82
|
+
options_from_variable: lane_options
|
|
83
|
+
preselect_from: lane_match
|
|
84
|
+
single_option_confirm: true
|
|
85
|
+
outputs:
|
|
86
|
+
- { name: chosen, from: selection }
|
|
87
|
+
|
|
88
|
+
# 4. Persist it.
|
|
89
|
+
- id: set_lane
|
|
90
|
+
action: execute_script
|
|
91
|
+
script: { ref: actions }
|
|
92
|
+
subcommand: lane-select
|
|
93
|
+
args: ["--lane", "{{chosen}}"]
|
|
94
|
+
outputs:
|
|
95
|
+
- { name: working_lane, from: "$.lane" }
|
|
96
|
+
- { name: working_kinds, from: "$.kinds" }
|
|
97
|
+
- { name: lane_file, from: "$.path" }
|
|
98
|
+
|
|
99
|
+
outputs:
|
|
100
|
+
working_lane: "{{working_lane}}"
|
|
101
|
+
working_kinds: "{{working_kinds}}"
|
|
102
|
+
lane_file: "{{lane_file}}"
|
|
103
|
+
note: "Working lane `{{working_lane}}` stored in {{lane_file}}. The file is not committed — it is this developer's choice, and another developer on the same repository keeps their own. From now on plan, analyze-plan, implement, build and analyze-slice write only the working lane: they plan it, gate it with its own receipt, generate it, compile it and test it. They still READ the other lane where they need it — a frontend plan binds to the operation ids the backend plan publishes. specify writes the whole spec whatever lane is chosen, and finalize-delta and close-delta merge and close a change with whatever its lanes have delivered. Re-running /appweaver select-stack resets the working lane to every declared lane."
|
|
104
|
+
next: "Run the lane's flow on the active feature: /appweaver plan → analyze-plan → implement → build → analyze-slice. Switch lanes any time with /appweaver select-lane backend | frontend | both."
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
# lane a person already declared. Every other workflow calls `lane-resolve` to read
|
|
35
35
|
# and `lane-verify` to gate, and neither can write.
|
|
36
36
|
#
|
|
37
|
+
# IT ALSO RESETS THE WORKING LANE. .appweaver/lane.json says which declared lanes the
|
|
38
|
+
# developer on this machine works on — not committed, one per developer. Declaring the
|
|
39
|
+
# lanes writes its default: `both` when both lanes are declared, otherwise the one that
|
|
40
|
+
# is. /appweaver select-lane narrows it afterwards, for a developer who works on one lane.
|
|
41
|
+
#
|
|
37
42
|
# WHY THE LANE ROOT FOLDER IS ASKED AND NOT INHERITED. A lane root folder is the subtree its lane
|
|
38
43
|
# OWNS: the only place implement's lane for it may write, the directory its build and
|
|
39
44
|
# run commands act on, and in brownfield the code onboard reads. A profile's default
|
|
@@ -60,8 +65,8 @@
|
|
|
60
65
|
# =============================================================================
|
|
61
66
|
|
|
62
67
|
name: aw-spec-select-stack
|
|
63
|
-
description: Declare the project's lanes — each lane's STACK and its LANE ROOT FOLDER — and persist them to .appweaver/stacks.json, the single channel every later workflow resolves and gates on. The first command of both the greenfield and the brownfield sequence, and the sole writer of the lane model.
|
|
64
|
-
version: 2.
|
|
68
|
+
description: Declare the project's lanes — each lane's STACK and its LANE ROOT FOLDER — and persist them to .appweaver/stacks.json, the single channel every later workflow resolves and gates on. The first command of both the greenfield and the brownfield sequence, and the sole writer of the lane model. It also writes this developer's working lane, .appweaver/lane.json, to its default — both lanes when both are declared, otherwise the one that is — which /appweaver select-lane narrows to one lane.
|
|
69
|
+
version: 2.4.0
|
|
65
70
|
agent_agnostic: true
|
|
66
71
|
dialect: aw-spec.orchestrator/v1
|
|
67
72
|
|
|
@@ -270,6 +275,17 @@ workflow:
|
|
|
270
275
|
a service lane, a UI lane, or both.
|
|
271
276
|
on_false: stop
|
|
272
277
|
|
|
278
|
+
# 10b. THE WORKING LANE starts at every declared lane. Written only once the declaration
|
|
279
|
+
# is sound, so a run stopped above never leaves a lane.json naming lanes that were
|
|
280
|
+
# not declared. A re-run resets it on purpose: the lanes it named may be gone.
|
|
281
|
+
- id: default_lane
|
|
282
|
+
action: execute_script
|
|
283
|
+
script: { ref: actions }
|
|
284
|
+
subcommand: lane-select
|
|
285
|
+
args: ["--default"]
|
|
286
|
+
outputs:
|
|
287
|
+
- { name: working_lane, from: "$.lane" }
|
|
288
|
+
|
|
273
289
|
# 11. Two ordered sets per lane, because the engine has no conditionals in
|
|
274
290
|
# `outputs:`: state the declined case, then override it where a lane was
|
|
275
291
|
# actually declared.
|
|
@@ -316,5 +332,6 @@ outputs:
|
|
|
316
332
|
api_detected: "{{api_detected}}"
|
|
317
333
|
ui_detected: "{{ui_detected}}"
|
|
318
334
|
prototype: "{{prototype}}"
|
|
319
|
-
|
|
335
|
+
working_lane: "{{working_lane}}" # this developer's working lane, written to .appweaver/lane.json (not committed)
|
|
336
|
+
note: "Lanes persisted to .appweaver/stacks.json. Each lane carries a STACK and a LANE ROOT FOLDER, and both are load-bearing. The LANE ROOT FOLDER is ownership: implement's service lane writes its code only under the service lane's and its frontend lane only under the UI lane's, build/test/run act on it, and onboard reverse-engineers out of it. Each lane also owns a TEST PATH, taken from its stack profile — tests/ beside a .NET src/, the lane root folder itself for a stack that keeps its tests inside — and implement writes the lane's tests there. Overlapping paths of either kind are refused here rather than discovered later as two generators writing one file. The build/test/run commands are project-supplied strings the engine shells out to, which is how it stays stdlib-only and stack-ignorant. api_detected / ui_detected report what this repo's own files pointed at, whether or not it was chosen, as '<stack> at <path>' — or 'nothing detected' on a greenfield repo with nothing to detect. A lane root folder that does not exist yet is NORMAL here and reported rather than refused: greenfield declares src/ before implement creates it. The on-disk check runs in the phases that read the subtree — implement, build, run and onboard all call lane-verify and STOP with the fix named. Declining a lane with (none) is a real declaration and removes any lane of that kind a previous run left behind; it is also what stops that lane's constitution half and rule files being authored. `prototype` is not a lane — it has a root and a run command so an operator can open it, and nothing else. Re-run this workflow any time to re-stack a lane, move a lane root folder, or drop a lane with (none); it is the only workflow that may write this file. It also wrote .appweaver/lane.json — this developer's WORKING lane, set to {{working_lane}} — which is not committed: each developer keeps their own. A developer who works on one lane runs /appweaver select-lane, and from then on plan, analyze-plan, implement, build and analyze-slice write only that lane while still reading the other one."
|
|
320
337
|
next: "GREENFIELD: /appweaver foundation → constitution → specify. The project rules live in guardrails/project-specific/, which .appweaver/domain.json names by default — fill in its rule files and its two maps; /appweaver select-domain switches to another project folder under guardrails/ when you keep more than one. On a project with no specs yet, constitution creates the default bounded context MainContext and its feature CoreFeature and makes both active; to use your own names, run /appweaver select-bounded-context <Name> and then /appweaver select-feature <Name> before specify. Once any bounded context exists, select-feature refuses to run until one is selected. foundation scaffolds every lane declared here in one run, backend then frontend — from a verified pack, from a spec the agent builds the project from, or skipped for a lane whose code already exists — and a spec build follows the technical rules the active project maps under `## /aw-spec-foundation-backend` and `## /aw-spec-foundation-frontend`. BROWNFIELD: /appweaver inventory — it scans the lane root folders declared here and proposes the bounded contexts and features as specs/proposed-inventory.md; edit that map, run /appweaver inventory apply, then /appweaver onboard <Context> once per bounded context, which reverse-engineers the governance out of the same lane root folders and activates it: onboard creates guardrails/brf-<domain>/ from the code and names it in .appweaver/domain.json. Run this workflow FIRST in either sequence: foundation scaffolds into the lane root folders declared here, constitution reads the declaration to decide which halves to author, and inventory and onboard read it to decide what to scan."
|
|
@@ -41,6 +41,12 @@
|
|
|
41
41
|
# defaults a new delta to the wave already in flight (parallel by default); `cr-wave`
|
|
42
42
|
# raises one that turns out to build on another.
|
|
43
43
|
#
|
|
44
|
+
# EACH CHANGE RECORDS ITS LANES. Opening a change asks which lanes it touches — both, the
|
|
45
|
+
# default, or one of them, from the stacks declared — and stamps the answer on the
|
|
46
|
+
# delta-spec's **Lanes** line. The spec is still written whole: the answer says which lanes
|
|
47
|
+
# plan and build the change, never what the change requires. Like the rest of specify it
|
|
48
|
+
# does not follow the developer's working lane (.appweaver/lane.json).
|
|
49
|
+
#
|
|
44
50
|
# EVERY DELTA STAGE NOW ASKS WHICH CHANGE. plan, analyze-plan-delta, implement,
|
|
45
51
|
# recall-delta, finalize-delta and close-delta all list what is open, ask, and activate the
|
|
46
52
|
# answer, with a bare CR id as the argument doubling as the answer. None of them takes
|
|
@@ -74,8 +80,8 @@
|
|
|
74
80
|
# =============================================================================
|
|
75
81
|
|
|
76
82
|
name: aw-spec-specify
|
|
77
|
-
description: Author the ACTIVE feature's specification AND its bounded context's domain model, together. The aggregate root, its entities, events and invariants (BR-n) live in specs/<Context>/domain-model.md — the one canonical definition every spec in the context cites by id and never restates. First call writes the master spec (US-1) plus the master model; a later call opens its OWN change (many may be open at once) and writes that change's delta-spec and delta-domain-model, leaving both masters untouched for finalize-delta to merge. Each change carries a WAVE — deltas sharing one are independent and developable in parallel, a higher wave is implemented after the lower ones land — and its model delta sits beside the master so every other open delta can see it while being authored. Spec phase only — plan/design is separate.
|
|
78
|
-
version: 3.
|
|
83
|
+
description: Author the ACTIVE feature's specification AND its bounded context's domain model, together. The aggregate root, its entities, events and invariants (BR-n) live in specs/<Context>/domain-model.md — the one canonical definition every spec in the context cites by id and never restates. First call writes the master spec (US-1) plus the master model; a later call opens its OWN change (many may be open at once) and writes that change's delta-spec and delta-domain-model, leaving both masters untouched for finalize-delta to merge. Opening a change asks which lanes it touches — both by default — and records the answer on the delta-spec's **Lanes** line; the spec is written whole either way. Each change carries a WAVE — deltas sharing one are independent and developable in parallel, a higher wave is implemented after the lower ones land — and its model delta sits beside the master so every other open delta can see it while being authored. Spec phase only — plan/design is separate.
|
|
84
|
+
version: 3.6.0
|
|
79
85
|
agent_agnostic: true
|
|
80
86
|
dialect: aw-spec.orchestrator/v1
|
|
81
87
|
|
|
@@ -121,6 +127,8 @@ vars:
|
|
|
121
127
|
cr_dir: "" # set on the DELTA path only — changes/<cr-id>/
|
|
122
128
|
delta_model: "" # set on the DELTA path only — <context>/domain-model.<cr-id>.delta.md
|
|
123
129
|
wave: "" # set on the DELTA path only — the parallel-development level
|
|
130
|
+
change_lanes: "" # DELTA path only — the answer to "which lanes does this change touch?"
|
|
131
|
+
change_lanes_csv: "" # DELTA path only — what the **Lanes** line now records
|
|
124
132
|
open_count: "0" # how many changes are open on this feature after this call
|
|
125
133
|
domain_model: "" # the CONTEXT's canonical model — bound by context-paths
|
|
126
134
|
pending_model_files: [] # every OTHER open delta's model change, for build_context
|
|
@@ -717,6 +725,20 @@ workflow:
|
|
|
717
725
|
outputs:
|
|
718
726
|
- { name: checklist_passed, from: "$.after_checked" }
|
|
719
727
|
|
|
728
|
+
# 7a. THE CHANGE'S LANES, written again now that the converge block is done with the
|
|
729
|
+
# delta-spec. The delta-spec module stamped the answer before the document was
|
|
730
|
+
# authored; the clarify and validation passes above rewrite that document whole, and
|
|
731
|
+
# this puts the **Lanes** line back to the answer whatever they did to it.
|
|
732
|
+
- id: restamp_change_lanes
|
|
733
|
+
condition: "{{is_bootstrap}} == false"
|
|
734
|
+
action: execute_script
|
|
735
|
+
on_error: continue
|
|
736
|
+
script: { ref: actions }
|
|
737
|
+
subcommand: cr-lanes
|
|
738
|
+
args: ["--cr-id", "{{cr_id}}", "--feature-dir", "{{feature_dir}}", "--stamp", "--set", "{{change_lanes}}"]
|
|
739
|
+
outputs:
|
|
740
|
+
- { name: change_lanes_csv, from: "$.lanes_csv" }
|
|
741
|
+
|
|
720
742
|
# 7b. THE FIRST DRAFT IS FINISHED — lower the marker. Placed HERE, after the converge
|
|
721
743
|
# block, because that is the last thing the bootstrap path does to the document: a
|
|
722
744
|
# run that died inside the checklist or the clarify loop left a spec.md that is
|
|
@@ -764,13 +786,14 @@ outputs:
|
|
|
764
786
|
domain_model: "{{domain_model}}"
|
|
765
787
|
delta_model: "{{delta_model}}" # DELTA path only — this change's model half
|
|
766
788
|
wave: "{{wave}}" # DELTA path only — its parallel-development level
|
|
789
|
+
change_lanes: "{{change_lanes_csv}}" # DELTA path only — the lanes that plan and build it
|
|
767
790
|
open_changes: "{{open_count}}" # how many changes are now open on this feature
|
|
768
791
|
version: "{{version}}"
|
|
769
792
|
change_id: "{{cr_id}}"
|
|
770
793
|
authored_document: "{{quality_target}}" # spec.md (bootstrap) | delta-spec.md (delta)
|
|
771
794
|
checklist_file: "{{checklist_file}}"
|
|
772
795
|
checklist_quality: "{{checklist_passed}}/{{checklist_total}} items passing"
|
|
773
|
-
note: "Behaviour and structure were authored together: the spec says what the system must do, {{domain_model}} says what the domain IS. The aggregate root, its entities and its invariants (BR-n) live in the model and are cited from the spec by id — never restated there, because several specs act on one aggregate and a per-spec copy drifts. On the DELTA path neither master was touched: this run wrote changes/{{cr_id}}/delta-spec.md and {{delta_model}}, and that model delta sits BESIDE the master where every other open delta can see it while being authored. WAVE {{wave}} is its parallel-development level — deltas sharing a wave are independent, a higher wave is implemented only after the lower ones land. The wave is DERIVED from the model delta's `## Depends on`: one above the highest delta named there, stamped into both halves as soon as it was authored ({{wave_message}}). To move it, correct that section and re-run `.appweaver/scripts/bash/aw-spec-actions.sh cr-wave-derive --cr-id {{cr_id}} --stamp`; finalize-delta refuses a change whose wave contradicts it. {{open_count}} change(s) are open on this feature."
|
|
796
|
+
note: "Behaviour and structure were authored together: the spec says what the system must do, {{domain_model}} says what the domain IS. The aggregate root, its entities and its invariants (BR-n) live in the model and are cited from the spec by id — never restated there, because several specs act on one aggregate and a per-spec copy drifts. On the DELTA path neither master was touched: this run wrote changes/{{cr_id}}/delta-spec.md and {{delta_model}}, and that model delta sits BESIDE the master where every other open delta can see it while being authored. WAVE {{wave}} is its parallel-development level — deltas sharing a wave are independent, a higher wave is implemented only after the lower ones land. The wave is DERIVED from the model delta's `## Depends on`: one above the highest delta named there, stamped into both halves as soon as it was authored ({{wave_message}}). To move it, correct that section and re-run `.appweaver/scripts/bash/aw-spec-actions.sh cr-wave-derive --cr-id {{cr_id}} --stamp`; finalize-delta refuses a change whose wave contradicts it. The change's **Lanes** line records the lanes that plan and build it ({{change_lanes_csv}}); the spec was written whole either way. To change it, run `.appweaver/scripts/bash/aw-spec-actions.sh cr-lanes --cr-id {{cr_id}} --set both|backend|frontend`. {{open_count}} change(s) are open on this feature."
|
|
774
797
|
# Both paths spell out their WHOLE remaining chain. The bootstrap path named only
|
|
775
798
|
# `plan` and stopped there, which left a first greenfield run with no successor at
|
|
776
799
|
# the exact point the delta path was fully documented.
|