aw-spec-cli 0.1.26 → 0.1.28

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 (137) hide show
  1. package/assets/.agents/skills/appweaver/SKILL.md +7 -47
  2. package/assets/.appweaver/ORCH-DIALECT.md +13 -9
  3. package/assets/.appweaver/RULE-PARTITION.md +11 -12
  4. package/assets/.appweaver/STACK-PROFILES.md +260 -108
  5. package/assets/.appweaver/domain.json +1 -1
  6. package/assets/.appweaver/interpreter/run-skill.py +28 -7
  7. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +38 -10
  8. package/assets/.appweaver/orchestrator/LAUNCHER.md +88 -0
  9. package/assets/.appweaver/orchestrator/README.md +120 -53
  10. package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +1 -1
  11. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +17 -7
  12. package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +6 -4
  13. package/assets/.appweaver/orchestrator/modules/foundation-lane.orch.yaml +237 -0
  14. package/assets/.appweaver/orchestrator/modules/foundation-pack.orch.yaml +392 -0
  15. package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +548 -0
  16. package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +4 -4
  17. package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +3 -3
  18. package/assets/.appweaver/orchestrator/orchestrator.py +162 -63
  19. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +5 -4
  20. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +3 -1
  21. package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +2 -2
  22. package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +2 -2
  23. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +21 -13
  24. package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +1 -1
  25. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +28 -31
  26. package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +2 -2
  27. package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +1 -1
  28. package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +3 -3
  29. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +4 -1
  30. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +6 -4
  31. package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +41 -3
  32. package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +1 -1
  33. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +17 -16
  34. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +7 -1
  35. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +7 -1
  36. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +3 -3
  37. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +3 -3
  38. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
  39. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +2 -2
  40. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +61 -12
  41. package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +1 -1
  42. package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +172 -293
  43. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +253 -44
  44. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +72 -71
  45. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
  46. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +38 -14
  47. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +4 -4
  48. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +26 -2
  49. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +21 -15
  50. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +14 -14
  51. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +3 -3
  52. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-model.orch.yaml +3 -3
  53. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-prototype.orch.yaml +6 -6
  54. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +371 -131
  55. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +293 -76
  56. package/assets/.appweaver/scripts/python/aw-foundation.py +885 -20
  57. package/assets/.appweaver/scripts/python/aw-inventory.py +28 -21
  58. package/assets/.appweaver/scripts/python/aw-plan-coverage.py +2 -2
  59. package/assets/.appweaver/scripts/python/aw-rev-constitution.py +6 -6
  60. package/assets/.appweaver/scripts/python/aw-stack.py +676 -99
  61. package/assets/.appweaver/stack-profiles/angular.json +2 -1
  62. package/assets/.appweaver/stack-profiles/blazor-wasm.json +2 -1
  63. package/assets/.appweaver/stack-profiles/dotnet-webapi.json +18 -3
  64. package/assets/.appweaver/stack-profiles/go-chi.json +6 -1
  65. package/assets/.appweaver/stack-profiles/java-spring.json +14 -5
  66. package/assets/.appweaver/stack-profiles/nextjs.json +2 -1
  67. package/assets/.appweaver/stack-profiles/node-express.json +8 -2
  68. package/assets/.appweaver/stack-profiles/python-fastapi.json +9 -2
  69. package/assets/.appweaver/stack-profiles/react-vite.json +2 -1
  70. package/assets/.appweaver/stack-profiles/sveltekit.json +2 -1
  71. package/assets/.appweaver/stack-profiles/vue-vite.json +2 -1
  72. package/assets/.appweaver/stacks.json +40 -1
  73. package/assets/.appweaver/templates/constitution-ui-template.md +2 -2
  74. package/assets/.appweaver/templates/delta-design-template.md +7 -5
  75. package/assets/.appweaver/templates/design-template.md +3 -0
  76. package/assets/.appweaver/templates/ui-delta-design-template.md +1 -1
  77. package/assets/.appweaver/templates/ui-design-template.md +6 -4
  78. package/assets/.claude/skills/appweaver/SKILL.md +7 -46
  79. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.rules.json +31 -0
  80. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.lane.json +6 -0
  81. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.rules.json +16 -0
  82. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.lane.json +6 -0
  83. package/assets/foundations/foundation.spec.template.txt +98 -0
  84. package/assets/foundations/java/Hexagonal/Hexagonal.lane.json +6 -0
  85. package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +8 -1
  86. package/assets/foundations/java/Hexagonal/unpack-foundation.sh +4 -5
  87. package/assets/foundations/node/NextAppRouter/NextAppRouter.spec.txt +68 -0
  88. package/assets/guardrails/README.md +31 -17
  89. package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain-rule-bindings.md +25 -13
  90. package/assets/guardrails/project-specific/tech-rule-bindings.md +296 -0
  91. package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +58 -4
  92. package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +1 -1
  93. package/assets/guardrails/technology/dotnet-webapi/auditing.md +1 -1
  94. package/assets/guardrails/technology/dotnet-webapi/authorization.md +1 -1
  95. package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +1 -1
  96. package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
  97. package/assets/guardrails/technology/dotnet-webapi/cqrs.md +1 -1
  98. package/assets/guardrails/technology/dotnet-webapi/data-classification.md +1 -1
  99. package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
  100. package/assets/guardrails/technology/dotnet-webapi/eventing.md +1 -1
  101. package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +1 -1
  102. package/assets/guardrails/technology/dotnet-webapi/framework-api-map.md +1 -1
  103. package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +1 -1
  104. package/assets/guardrails/technology/dotnet-webapi/persistence.md +1 -1
  105. package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
  106. package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +1 -1
  107. package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +1 -1
  108. package/assets/guardrails/technology/nextjs/accessibility-implementation.md +1 -1
  109. package/assets/guardrails/technology/nextjs/api-client.md +1 -1
  110. package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +1 -1
  111. package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +1 -1
  112. package/assets/guardrails/technology/nextjs/auth-session.md +1 -1
  113. package/assets/guardrails/technology/nextjs/client-security.md +1 -1
  114. package/assets/guardrails/technology/nextjs/component-architecture.md +1 -1
  115. package/assets/guardrails/technology/nextjs/component-conventions.md +2 -2
  116. package/assets/guardrails/technology/nextjs/design-system.md +1 -1
  117. package/assets/guardrails/technology/nextjs/error-handling.md +1 -1
  118. package/assets/guardrails/technology/nextjs/forms-and-validation.md +1 -1
  119. package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
  120. package/assets/guardrails/technology/nextjs/i18n.md +1 -1
  121. package/assets/guardrails/technology/nextjs/observability.md +1 -1
  122. package/assets/guardrails/technology/nextjs/performance-budgets.md +1 -1
  123. package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
  124. package/assets/guardrails/technology/nextjs/state-management.md +1 -1
  125. package/assets/guardrails/technology/nextjs/ui-constitution.md +3 -3
  126. package/package.json +1 -1
  127. package/assets/.agents/skills/appweaver-demo/SKILL.md +0 -59
  128. package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +0 -6
  129. package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +0 -100
  130. package/assets/.claude/skills/appweaver-demo/SKILL.md +0 -59
  131. package/assets/.kilocode/agent.json +0 -28
  132. package/assets/.kilocode/workflows/appweaver-demo.md +0 -59
  133. package/assets/.kilocode/workflows/appweaver.md +0 -55
  134. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +0 -271
  135. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain/domain-requirements.md +0 -0
  136. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/frontend/ui-requirements.md +0 -0
  137. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/service/technical-requirements.md +0 -0
@@ -22,7 +22,7 @@
22
22
  # for either reads as "the document exists" to every gate downstream.
23
23
  #
24
24
  # 3. GOVERNANCE SCAFFOLD — the PROJECT-level governing tier: the split constitution
25
- # (technical + domain), the guardrails/projects/brf-<domain>/domain/ rule-file set
25
+ # (technical + domain), the guardrails/brf-<domain>/domain/ rule-file set
26
26
  # (+ domain-rule-bindings), the domain charter that set is headed by, and the
27
27
  # activated domain. The FIRST context to onboard AUTHORS it from the whole-repo
28
28
  # scan. Every LATER context AMENDS it from its own code — ADDITIVELY: a rule file
@@ -71,8 +71,8 @@
71
71
  #
72
72
  # CODE-DERIVED RULE SETS + MAPS (both tiers): onboard authors, from the code ALONE
73
73
  # (never a greenfield rule file), BOTH the DOMAIN rule-file set
74
- # (guardrails/projects/brf-<domain>/domain/*.domain.md +
75
- # domain-rule-bindings.md) AND the TECHNICAL rule-file set (guardrails/projects/brf-<domain>/service/*.md
74
+ # (guardrails/brf-<domain>/domain/*.domain.md +
75
+ # domain-rule-bindings.md) AND the TECHNICAL rule-file set (guardrails/brf-<domain>/service/*.md
76
76
  # + tech-rule-bindings.md), then WIRES each per-workflow. This is what makes the WHOLE
77
77
  # forward pipeline AND adopt govern against THIS codebase's rules — resolve-domain /
78
78
  # resolve-tech read the activated brf-<domain>'s maps, so no workflow ever falls back to a
@@ -92,11 +92,11 @@
92
92
  # .appweaver/memory/constitution.ui.md — the lane's UX-* base, authored from the UI
93
93
  # source (never from a greenfield UI template's content), then linted like the other
94
94
  # halves and composed in. Parallel to the technical base, so its numbering is its own.
95
- # guardrails/projects/brf-<domain>/frontend/*.md — the code-derived lane rule set, the detail
95
+ # guardrails/brf-<domain>/frontend/*.md — the code-derived lane rule set, the detail
96
96
  # layer under those UX-* principles, wired into tech-rule-bindings.md under the lane's
97
97
  # three headings: `## /aw-spec-ui-constitution` (what a later /appweaver constitution
98
- # re-ratifies the UI half from), `## /aw-spec-plan-ui` and `## /aw-spec-implement-ui`
99
- # (what the frontend lane of `plan` and of `implement` load).
98
+ # re-ratifies the UI half from), `## /aw-spec-plan-frontend` and
99
+ # `## /aw-spec-implement-frontend` (what the frontend lane of `plan` and of `implement` load).
100
100
  # .appweaver/templates/overrides/ui-design-template.md + ui-delta-design-template.md — the
101
101
  # lane's own document pair, reverse-engineered from the UI source the same way the
102
102
  # service pair is reverse-engineered from the service code. The lane is governed by a
@@ -112,7 +112,7 @@
112
112
  # generated, which subtrees are scanned, and what technology the derived rules name.
113
113
  # select-stack detects all three from the repo's own files and proposes them, so answering
114
114
  # it on an existing codebase is mostly confirmation — but it is a person's confirmation,
115
- # which is exactly what detection on a legacy repo needs. A declared source path that is
115
+ # which is exactly what detection on a legacy repo needs. A declared lane root folder that is
116
116
  # not a directory stops this run with the fix named rather than producing a scaffold
117
117
  # reverse-engineered from nothing.
118
118
  #
@@ -122,7 +122,7 @@
122
122
  # for the service lane gets no technical half and no service rules. The deterministic
123
123
  # scan is still what reads the code, now pointed AT the declared subtree: it decides what
124
124
  # the governance SAYS, and the declaration decides what there is to govern. A declared
125
- # lane whose source path holds nothing recognisable is reported, because the governance
125
+ # lane whose lane root folder holds nothing recognisable is reported, because the governance
126
126
  # derived from it will be thin.
127
127
  #
128
128
  # ONE ORACLE, UNCHANGED. Nothing about where the CONTENT comes from has moved. Every
@@ -138,7 +138,7 @@
138
138
  # — select-stack — and this workflow only reads.
139
139
  #
140
140
  # Never modifies source — every write lands in the OKF bundle, the context's specs/
141
- # directories, guardrails/projects/ (domain/ + service/ + frontend/ rule sets + both
141
+ # directories, guardrails/brf-<domain>/ (domain/ + service/ + frontend/ rule sets + both
142
142
  # maps), or the .appweaver/templates/overrides/ design templates.
143
143
  #
144
144
  # Launch: /appweaver onboard [<BoundedContext>] [; concerns: a, b, c]
@@ -149,7 +149,7 @@
149
149
  # =============================================================================
150
150
 
151
151
  name: aw-spec-onboard
152
- description: Onboard an existing codebase for brownfield DEVELOPMENT — a deterministic whole-repo scan produces a high-level OKF feature map (folders/concepts) PLUS the project-level governance scaffold (split constitution + guardrails/projects/brf-<domain>/ with its DOMAIN rule files at domain/ + domain-rule-bindings + code-derived TECHNICAL rule files at service/ + tech-rule-bindings + activated domain), all provisional-from-scan. The first context authors that tier; every later context amends it additively from its own code (new rules, principles and map entries — never a rewrite, renumbering or deletion; a contradiction is recorded as a Divergence note), and a tier that does not exist yet, such as a lane declared after an earlier onboard, is authored in full. Naming an already-onboarded context re-runs that governance pass alone. Where the scan finds a frontend lane in the CODE, it also authors that lane's half — constitution.ui.md (UX-*) — and its code-derived rule files at brf-<domain>/frontend/, mapped under `## /aw-spec-ui-constitution`, `## /aw-spec-plan-ui` and `## /aw-spec-implement-ui`; a backend-only repo gets none of it. Every rule tier is reverse-engineered from the CODE alone (never a greenfield rule file), evidenced-only, and WIRED per-workflow so the whole forward pipeline AND adopt govern against THIS codebase — never a greenfield fallback. It also reverse-engineers the repo's own technical structure into a project-specific design + delta-design template pair, installed as the project template overrides, and — where the lane exists — the frontend lane's own pair from the UI source. Every authoring step is shaped by a NEUTRAL rev-templates skeleton; no greenfield constitution, rule file or document template is ever placed in context. Accepts an optional concerns list to look for (onboard decides which are actually present). Reads any declared lane, never writes one. No migration content; never modifies source.
152
+ description: Onboard an existing codebase for brownfield DEVELOPMENT — a deterministic whole-repo scan produces a high-level OKF feature map (folders/concepts) PLUS the project-level governance scaffold (split constitution + guardrails/brf-<domain>/ with its DOMAIN rule files at domain/ + domain-rule-bindings + code-derived TECHNICAL rule files at service/ + tech-rule-bindings + activated domain), all provisional-from-scan. The first context authors that tier; every later context amends it additively from its own code (new rules, principles and map entries — never a rewrite, renumbering or deletion; a contradiction is recorded as a Divergence note), and a tier that does not exist yet, such as a lane declared after an earlier onboard, is authored in full. Naming an already-onboarded context re-runs that governance pass alone. Where the scan finds a frontend lane in the CODE, it also authors that lane's half — constitution.ui.md (UX-*) — and its code-derived rule files at brf-<domain>/frontend/, mapped under `## /aw-spec-ui-constitution`, `## /aw-spec-plan-frontend` and `## /aw-spec-implement-frontend`; a backend-only repo gets none of it. Every rule tier is reverse-engineered from the CODE alone (never a greenfield rule file), evidenced-only, and WIRED per-workflow so the whole forward pipeline AND adopt govern against THIS codebase — never a greenfield fallback. It also reverse-engineers the repo's own technical structure into a project-specific design + delta-design template pair, installed as the project template overrides, and — where the lane exists — the frontend lane's own pair from the UI source. Every authoring step is shaped by a NEUTRAL rev-templates skeleton; no greenfield constitution, rule file or document template is ever placed in context. Accepts an optional concerns list to look for (onboard decides which are actually present). Reads any declared lane, never writes one. No migration content; never modifies source.
153
153
  version: 2.3.0
154
154
  agent_agnostic: true
155
155
  dialect: aw-spec.orchestrator/v1
@@ -242,7 +242,7 @@ workflow:
242
242
  # right technology).
243
243
  #
244
244
  # The on-disk check is ON here, unlike in constitution: this run is about to READ
245
- # those directories. A declared path that is not there stops the run with the fix
245
+ # those directories. A declared lane root folder that is not there stops the run with the fix
246
246
  # named, rather than producing a governance scaffold reverse-engineered from
247
247
  # nothing.
248
248
  - id: lane_model
@@ -272,7 +272,7 @@ workflow:
272
272
  onboard reverse-engineers this repository's governance out of its source, so it
273
273
  has to be told which subtrees hold which lane before it starts scanning. Run
274
274
  /appweaver select-stack first — it detects what this repo already is, proposes
275
- the stack and the source path for each lane, and lets you correct both.
275
+ the stack and the lane root folder for each lane, and lets you correct both.
276
276
 
277
277
  - id: lane_kinds_gate
278
278
  action: verify_context
@@ -507,7 +507,7 @@ workflow:
507
507
  # component library, a front end whose API lives in another repository. The
508
508
  # technical half, the service rule set and the service design templates are all the
509
509
  # SERVICE lane's, so none of them is authored, and saying so is better than leaving
510
- # someone to notice that guardrails/projects/<p>/service/ is empty.
510
+ # someone to notice that guardrails/<p>/service/ is empty.
511
511
  - id: svc_lane_warning
512
512
  action: verify_context
513
513
  require_true: svc_lane
@@ -532,13 +532,13 @@ workflow:
532
532
  condition: "{{fe_declared}}"
533
533
  vars:
534
534
  ui_lane: "true"
535
- ui_evidence: "lane '{{fe_lane_id}}' ({{fe_profile}}) is declared at the source path {{fe_root}}; the scan found UI source there — {{frontend_roots}}"
536
- ui_declaration_note: "lane '{{fe_lane_id}}' ({{fe_profile}}) at {{fe_root}} — the declared source path this run reverse-engineered the UI governance out of"
535
+ ui_evidence: "lane '{{fe_lane_id}}' ({{fe_profile}}) is declared at the lane root folder {{fe_root}}; the scan found UI source there — {{frontend_roots}}"
536
+ ui_declaration_note: "lane '{{fe_lane_id}}' ({{fe_profile}}) at {{fe_root}} — the declared lane root folder this run reverse-engineered the UI governance out of"
537
537
 
538
- # A declared UI lane whose source path holds nothing a scan recognises as UI. The
538
+ # A declared UI lane whose lane root folder holds nothing a scan recognises as UI. The
539
539
  # path exists — lane-verify already refused the run otherwise — so this is not a
540
540
  # broken declaration, it is an empty one: a lane scaffolded but not yet built, or a
541
- # source path one directory too high. Announce and continue rather than stop: the
541
+ # lane root folder one directory too high. Announce and continue rather than stop: the
542
542
  # declaration is a person's statement and is left exactly as it stands, but the UI
543
543
  # governance below will be thin, and it is better to say why now than to let someone
544
544
  # discover a UX base derived from an empty directory.
@@ -551,7 +551,7 @@ workflow:
551
551
  Frontend lane '{{fe_lane_id}}' is declared at {{fe_root}}, but the scan found no
552
552
  component, view or build-config files under that path ({{frontend_file_count}}
553
553
  file(s) there in total). The UI governance authored below is reverse-engineered
554
- from that subtree, so it will be thin or empty. Check that the source path points
554
+ from that subtree, so it will be thin or empty. Check that the lane root folder points
555
555
  at the directory holding the UI — /appweaver select-stack can move it — or
556
556
  retire the lane there with (none) if this repo has no UI yet.
557
557
 
@@ -673,7 +673,7 @@ workflow:
673
673
  repo must not get one). It is the UI counterpart of the platform note and the
674
674
  evidence the frontend lane's constitution is scaffolded from. Read the candidate
675
675
  roots in `frontend_signals` and then READ REPRESENTATIVE UI SOURCE from their
676
- component/route/store file lists, and record AS-BUILT: the lane root(s) and whether
676
+ component/route/store file lists, and record AS-BUILT: the lane root folder(s) and whether
677
677
  the UI is separable or rendered inside the service tree; what it is built with (name
678
678
  it from the code — the `framework_markers` are markers, not conclusions); how
679
679
  components are organized and named; routing/navigation; where client state and
@@ -877,7 +877,7 @@ workflow:
877
877
  - { name: project_name, from: "$.project_name" }
878
878
  - { name: overview, from: "$.overview" }
879
879
 
880
- # Slugify + `brf-` prefix the domain name and create guardrails/projects/brf-<domain>/.
880
+ # Slugify + `brf-` prefix the domain name and create guardrails/brf-<domain>/.
881
881
  # Name: explicit arg → the ACTIVE brf- project → PROJECT name from the OKF overview →
882
882
  # repo basename. It reports which tiers already hold rule files, and lists them.
883
883
  # The governance project is named from the PROJECT — `gov_name` is empty, so
@@ -974,8 +974,8 @@ workflow:
974
974
  permission_mode: acceptEdits
975
975
  task: |
976
976
  Scaffold the PROJECT-level DOMAIN RULE SET for **{{project_name}}** (domain
977
- {{domain_slug}}) into guardrails/projects/{{domain_slug}}/domain/ (the dir exists),
978
- plus the domain map guardrails/projects/{{domain_slug}}/domain-rule-bindings.md at the
977
+ {{domain_slug}}) into guardrails/{{domain_slug}}/domain/ (the dir exists),
978
+ plus the domain map guardrails/{{domain_slug}}/domain-rule-bindings.md at the
979
979
  project root. A project keeps its three rule classes in domain/ · service/ · frontend/
980
980
  and both maps at its root; adopt reconciles this set in place, so a file written
981
981
  anywhere else is unreachable.
@@ -1036,11 +1036,13 @@ workflow:
1036
1036
  charter; a later step in this same run authors it, so wire the bullet now), then the
1037
1037
  domain identity/regulatory/interop files → domain principles.
1038
1038
  - `## /aw-spec-specify` — the FULL domain set (specify models the domain, lifts CN-/DC-/IC-).
1039
- - `## /aw-spec-plan` — `_None — plan loads no domain file. Domain reaches plan through the spec and the context's domain-model.md._`
1040
- - `## /aw-spec-implement` — `_None — implement loads no domain file. Domain reaches implement through the lane plans and the context's domain-model.md._`
1039
+ - `## /aw-spec-plan-backend` — `_None — the service lane of plan loads no domain file. Domain reaches it through the spec and the context's domain-model.md._`
1040
+ - `## /aw-spec-plan-frontend` — `_None — the frontend lane of plan loads no domain file. Domain reaches it through the spec and the context's domain-model.md._`
1041
+ - `## /aw-spec-implement-backend` — `_None — the service lane of implement loads no domain file. Domain reaches it through backend-plan.md and the context's domain-model.md._`
1042
+ - `## /aw-spec-implement-frontend` — `_None — the frontend lane of implement loads no domain file. Domain reaches it through frontend-plan.md and the context's domain-model.md._`
1041
1043
  - `## /aw-spec-gate` — the conformance-checklist set (the *.domain.md files).
1042
- Each bullet is a workspace-relative path `- guardrails/projects/{{domain_slug}}/domain/<file>`.
1043
- Write ONLY inside guardrails/projects/{{domain_slug}}/ (domain/ + the map). Report the
1044
+ Each bullet is a workspace-relative path `- guardrails/{{domain_slug}}/domain/<file>`.
1045
+ Write ONLY inside guardrails/{{domain_slug}}/ (domain/ + the map). Report the
1044
1046
  files written.
1045
1047
  outputs:
1046
1048
  - { name: pack_files, from: "$.files" }
@@ -1050,7 +1052,7 @@ workflow:
1050
1052
  action: verify_context
1051
1053
  require_non_empty: pack_files
1052
1054
  on_empty: stop
1053
- on_empty_message: "No domain rule files were written to guardrails/projects/{{domain_slug}}/domain/. Ensure the feature map carries a modellable domain (a feature map + ubiquitous language) and re-run."
1055
+ on_empty_message: "No domain rule files were written to guardrails/{{domain_slug}}/domain/. Ensure the feature map carries a modellable domain (a feature map + ubiquitous language) and re-run."
1054
1056
  - id: require_domain_rule_bindings
1055
1057
  condition: "{{author_repo}} == true"
1056
1058
  action: verify_context
@@ -1367,7 +1369,7 @@ workflow:
1367
1369
  existing files (frontmatter origin: reverse-engineered, generated_by:
1368
1370
  {{generated_by}}, concern); every rule cites a UI code coordinate from this
1369
1371
  context and the UX numeral it details. Wire it into tech-rule-bindings.md under
1370
- `## /aw-spec-plan-ui` and/or `## /aw-spec-implement-ui` as its rules serve
1372
+ `## /aw-spec-plan-frontend` and/or `## /aw-spec-implement-frontend` as its rules serve
1371
1373
  planning or generating, and give it its table row. frontend/ui-constitution.md
1372
1374
  stays the only file under `## /aw-spec-ui-constitution` that is not also a
1373
1375
  concern file.
@@ -1426,7 +1428,7 @@ workflow:
1426
1428
 
1427
1429
  EVIDENCE = THE UI CODE ITSELF (deep read). Authority, in order:
1428
1430
  1. THE ACTUAL UI SOURCE (ground truth). Use {{inventory_ui_json}} (in context):
1429
- `frontend_signals` lists the candidate lane roots with their kind
1431
+ `frontend_signals` lists the candidate lane root folders with their kind
1430
1432
  (spa / server-rendered / desktop), their framework markers, and their
1431
1433
  component / route / store / style file lists. READ ENOUGH OF THOSE FILES to
1432
1434
  state each principle from what the UI ACTUALLY does. Do NOT assert an
@@ -1580,8 +1582,8 @@ workflow:
1580
1582
  named after the concern the code exhibits. Wire it into
1581
1583
  domain-rule-bindings.md under `## /aw-spec-specify` and `## /aw-spec-gate`
1582
1584
  (plus `## /aw-spec-constitution` for an identity / regulatory file), as the
1583
- existing files are wired. `## /aw-spec-plan` and `## /aw-spec-implement` keep
1584
- loading no domain file.
1585
+ existing files are wired. The plan and implement headings (`-backend` and
1586
+ `-frontend`) keep loading no domain file.
1585
1587
  - NEW rules appended to an EXISTING rule file, where this context's code enforces
1586
1588
  a rule of that concern the file does not state — each citing this context's code
1587
1589
  and marked `(context: {{bc}})`. Mark unresolved specifics `PROVISIONAL —
@@ -1764,14 +1766,14 @@ workflow:
1764
1766
  # under a constitution.technical.md principle (thin ratified line ↑ / enforceable rule ↓).
1765
1767
  # Evidence = the CODE (deep read via inventory_json's file lists) + the validated technical
1766
1768
  # constitution + the shallow platform note (corroboration only). Writes:
1767
- # 1. guardrails/projects/<domain>/service/<concern>.md — evidenced-only code-derived tech rule
1769
+ # 1. guardrails/<domain>/service/<concern>.md — evidenced-only code-derived tech rule
1768
1770
  # files (the ANALOG of a greenfield project's architecture · security · governance set, but reverse-
1769
1771
  # engineered from THIS code, never a greenfield file), INCLUDING the one file that
1770
1772
  # feeds /specify: service/domain-modelling.md, the as-built modelling METHODOLOGY (the
1771
1773
  # analog of the greenfield corpus's technology/<stack>/domain-driven-design.md). Without it brownfield
1772
1774
  # specify has a model but no HOW-to-model standard, and models a NEW feature in a
1773
1775
  # different idiom than the code it joins, and
1774
- # 2. guardrails/projects/<domain>/tech-rule-bindings.md — the TECHNICAL map (resolve-tech +
1776
+ # 2. guardrails/<domain>/tech-rule-bindings.md — the TECHNICAL map (resolve-tech +
1775
1777
  # tech-select read it by that exact name), wiring the generated files per-workflow.
1776
1778
  # Because onboard already ACTIVATED brf-<domain>, the forward pipeline's + adopt's tech_select
1777
1779
  # steps now resolve to THESE files — never another project's rules, ever. The files live
@@ -1796,8 +1798,8 @@ workflow:
1796
1798
  task: |
1797
1799
  Scaffold the PROJECT-level TECHNICAL RULE SET for **{{project_name}}** (domain
1798
1800
  {{domain_slug}}) — the CODE-DERIVED replacement for the greenfield technical rule set —
1799
- into guardrails/projects/{{domain_slug}}/service/ (create it), plus the technical map
1800
- guardrails/projects/{{domain_slug}}/tech-rule-bindings.md. This is the TECHNICAL twin of the
1801
+ into guardrails/{{domain_slug}}/service/ (create it), plus the technical map
1802
+ guardrails/{{domain_slug}}/tech-rule-bindings.md. This is the TECHNICAL twin of the
1801
1803
  already-generated domain set: it feeds the HOW phases (plan/implement/build/…) plus
1802
1804
  ONE modelling-methodology file for /specify (see domain-modelling below) — and nothing
1803
1805
  else ever reaches /specify from this tier.
@@ -1815,9 +1817,9 @@ workflow:
1815
1817
  numeral on the rules it details. Never contradict it; never restate it wholesale.
1816
1818
  3. The OKF platform.md (in context, if present) — SECONDARY, shallow corroboration only.
1817
1819
  NEVER reference, read, copy, or list a rule file belonging to another project
1818
- (guardrails/projects/<other>/**) — those are the
1820
+ (any other project folder under guardrails/, e.g. guardrails/project-specific/**) — those are the
1819
1821
  greenfield fixture, NOT this project's rules. Every path you write lives under
1820
- guardrails/projects/{{domain_slug}}/service/.
1822
+ guardrails/{{domain_slug}}/service/.
1821
1823
 
1822
1824
  CONCERNS HINT: {{concerns_line}} Treat any listed concern as a SEARCH HINT — look for it
1823
1825
  in the code — but DECIDE presence from evidence: write a tech rule file for a concern ONLY
@@ -1859,17 +1861,16 @@ workflow:
1859
1861
  ONLY a heading you have a generated file for (an absent heading soft-continues → loads
1860
1862
  nothing):
1861
1863
  - `## /aw-spec-specify` — EXACTLY ONE bullet: `service/domain-modelling.md`, the modelling methodology. NEVER an architecture / persistence / codegen / security file here — specify is the domain phase and any technology rule under this heading breaks its domain purity. Omit the heading only if you did not write domain-modelling.md.
1862
- - `## /aw-spec-plan` — the as-built architecture / cross-cutting rules the SERVICE lane's plan author mediates the spec against.
1863
- - `## /aw-spec-implement` — the code-generation / convention set the SERVICE lane's generator builds against (from backend-plan.md).
1864
- - `## /aw-spec-implement-delta` — the same set for the service lane on the DELTA path. `implement` is one command that keys this heading when it is generating a change's delta plan and the one above when it is generating the master, so a project that wants the same rules on both paths repeats them here.
1864
+ - `## /aw-spec-plan-backend` — the as-built architecture / cross-cutting rules the SERVICE lane's plan author mediates the spec against.
1865
+ - `## /aw-spec-implement-backend` — the code-generation / convention set the SERVICE lane's generator builds against (from backend-plan.md), on both the master and the delta path.
1865
1866
  - `## /aw-spec-build` — the layering + convention rules the compile-fixer respects.
1866
1867
  - `## /aw-spec-analyze-slice` — the conformance rules the plan↔code gate validates against.
1867
- - `## /aw-spec-adopt` — the technical reference set the reversed plan mediates against (a subset of plan's).
1868
+ - `## /aw-spec-adopt-backend` — the technical reference set the reversed backend plan mediates against (a subset of `## /aw-spec-plan-backend`'s).
1868
1869
  - `## /aw-spec-constitution` — the standards a later `/appweaver constitution` re-ratifies the TECHNICAL half from. You authored that half from code evidence before these files existed; this heading is what makes a re-run author from THIS project's rules rather than from an empty set. Ratifiable standards only, no worked `examples/` sample, no domain file.
1869
1870
  - `## /aw-spec-run` — the runtime / execution conventions the app-run step honors (add ONLY if the code evidences a runtime/hosting concern file; NOT data-migration — migration is the deferred later phase).
1870
1871
  Each bullet is a
1871
- workspace-relative path `- guardrails/projects/{{domain_slug}}/service/<file>`. Close with the
1872
- quick-reference table. Write ONLY inside guardrails/projects/{{domain_slug}}/ (service/ + the map);
1872
+ workspace-relative path `- guardrails/{{domain_slug}}/service/<file>`. Close with the
1873
+ quick-reference table. Write ONLY inside guardrails/{{domain_slug}}/ (service/ + the map);
1873
1874
  modify no source. Report the files written + the concerns you found present (with the code
1874
1875
  paths that evidence them).
1875
1876
  outputs:
@@ -1880,7 +1881,7 @@ workflow:
1880
1881
  condition: "{{author_svc}} == true"
1881
1882
  require_non_empty: tech_pack_files
1882
1883
  on_empty: stop
1883
- on_empty_message: "No technical rule files were written to guardrails/projects/{{domain_slug}}/service/. Ensure the scan substrate (inventory_json) + the validated technical constitution carry an as-built technology base and re-run."
1884
+ on_empty_message: "No technical rule files were written to guardrails/{{domain_slug}}/service/. Ensure the scan substrate (inventory_json) + the validated technical constitution carry an as-built technology base and re-run."
1884
1885
  - id: require_tech_rule_bindings
1885
1886
  condition: "{{author_svc}} == true"
1886
1887
  action: verify_context
@@ -1908,7 +1909,7 @@ workflow:
1908
1909
  require_non_empty: specify_rules
1909
1910
  on_empty: continue
1910
1911
  on_empty_message: >
1911
- guardrails/projects/{{domain_slug}}/tech-rule-bindings.md maps nothing under
1912
+ guardrails/{{domain_slug}}/tech-rule-bindings.md maps nothing under
1912
1913
  `## /aw-spec-specify`, so brownfield specify will model new features with no
1913
1914
  as-built modelling methodology to follow. That is correct only where the code has no
1914
1915
  discernible domain model (a pure script/ETL repo). Otherwise add
@@ -1925,7 +1926,7 @@ workflow:
1925
1926
  # (or creates the file, in a project with no service lane). `## /aw-spec-ui-constitution`
1926
1927
  # is what makes a later /appweaver constitution re-ratify the UI half from THIS project's
1927
1928
  # lane rules, and the authoritative signal that the project HAS a frontend lane.
1928
- # `## /aw-spec-plan-ui` and `## /aw-spec-implement-ui` are what the frontend lane of
1929
+ # `## /aw-spec-plan-frontend` and `## /aw-spec-implement-frontend` are what the frontend lane of
1929
1930
  # `plan` and of `implement` load; without them that lane plans and generates against no
1930
1931
  # project rule at all.
1931
1932
  - id: ctx_ui_pack
@@ -1947,15 +1948,15 @@ workflow:
1947
1948
  task: |
1948
1949
  Scaffold the PROJECT-level FRONTEND RULE-FILE PACK for **{{project_name}}** (domain
1949
1950
  {{domain_slug}}) — the CODE-DERIVED lane rules — into
1950
- guardrails/projects/{{domain_slug}}/frontend/ (create it), and WIRE it into the existing
1951
- guardrails/projects/{{domain_slug}}/tech-rule-bindings.md. This is the FRONTEND LANE's
1951
+ guardrails/{{domain_slug}}/frontend/ (create it), and WIRE it into the existing
1952
+ guardrails/{{domain_slug}}/tech-rule-bindings.md. This is the FRONTEND LANE's
1952
1953
  twin of the service/ set you have already generated: it is the detail layer under
1953
- constitution.ui.md's UX-* principles, and it governs only code under the lane's root.
1954
+ constitution.ui.md's UX-* principles, and it governs only code under the lane root folder.
1954
1955
 
1955
1956
  EVIDENCE = THE UI CODE ITSELF (deep read) + THE VALIDATED UI CONSTITUTION. Authority,
1956
1957
  in order:
1957
1958
  1. THE ACTUAL UI SOURCE (ground truth). Use {{inventory_ui_json}} (in context):
1958
- `frontend_signals` gives the lane roots, their kind, their framework markers and
1959
+ `frontend_signals` gives the lane root folders, their kind, their framework markers and
1959
1960
  their component / route / store / style file lists. Read enough of those files to
1960
1961
  state each rule from what the UI ACTUALLY does. Do NOT assert a convention you
1961
1962
  have not seen in the code.
@@ -1964,10 +1965,10 @@ workflow:
1964
1965
  it details. Never contradict it; never restate it wholesale.
1965
1966
  3. The OKF architecture/frontend.md (in context, if present) — SECONDARY, shallow.
1966
1967
  NEVER reference, read, copy, or list a rule file belonging to another project
1967
- (guardrails/projects/<other>/**) — those are the greenfield fixture, NOT this project's
1968
+ (any other project folder under guardrails/, e.g. guardrails/project-specific/**) — those are the greenfield fixture, NOT this project's
1968
1969
  rules. Never carry over a convention, an accessibility target, a folder taxonomy or a
1969
1970
  quality gate from a greenfield UI rule file or from how frontends are usually built.
1970
- Every path you write lives under guardrails/projects/{{domain_slug}}/frontend/.
1971
+ Every path you write lives under guardrails/{{domain_slug}}/frontend/.
1971
1972
 
1972
1973
  EVIDENCED-ONLY (lean). Follow the SHAPE of frontend-rule-file.skeleton.md (in context):
1973
1974
  frontmatter (origin: reverse-engineered, generated_by: {{generated_by}}, concern),
@@ -1986,21 +1987,21 @@ workflow:
1986
1987
  divergence with its coordinates. Do not upgrade a partial into a greenfield ideal, and
1987
1988
  do not create a debt/backlog sink — modernization is a separate later phase.
1988
1989
 
1989
- WIRE THE MAP — guardrails/projects/{{domain_slug}}/tech-rule-bindings.md. Where the
1990
+ WIRE THE MAP — guardrails/{{domain_slug}}/tech-rule-bindings.md. Where the
1990
1991
  service rule set was generated it exists and carries the technical headings: EDIT IT IN
1991
1992
  PLACE and PRESERVE every one of them byte-for-byte. Where this project has no service
1992
1993
  lane it does not exist yet: CREATE it with the skeleton's title and framing and only the
1993
1994
  headings below. Add the lane's THREE headings after the last technical heading and
1994
1995
  BEFORE the closing quick-reference table. Every bullet is a workspace-relative path
1995
- `- guardrails/projects/{{domain_slug}}/frontend/<file>` naming a file you just generated:
1996
+ `- guardrails/{{domain_slug}}/frontend/<file>` naming a file you just generated:
1996
1997
  1. `## /aw-spec-ui-constitution` — the lane's RATIFIABLE standards,
1997
1998
  `frontend/ui-constitution.md` first. It is what a later /appweaver constitution
1998
1999
  re-ratifies the UI half from, and the authoritative signal that the project has a
1999
2000
  frontend lane; precede the bullets with a short HTML comment saying both.
2000
- 2. `## /aw-spec-plan-ui` — the files the FRONTEND lane of `plan` authors
2001
+ 2. `## /aw-spec-plan-frontend` — the files the FRONTEND lane of `plan` authors
2001
2002
  frontend-plan.md against: those whose rules decide a feature's screens, navigation,
2002
2003
  client state, interaction states, forms, accessibility and service binding.
2003
- 3. `## /aw-spec-implement-ui` — the files the FRONTEND lane of `implement` generates
2004
+ 3. `## /aw-spec-implement-frontend` — the files the FRONTEND lane of `implement` generates
2004
2005
  code against, on the master and the delta path alike: those whose rules govern
2005
2006
  component conventions, state and data fetching, styling, forms and UI tests.
2006
2007
  A file whose rules carry both a planning half and a generating half is listed under both
@@ -2010,7 +2011,7 @@ workflow:
2010
2011
  file, no service/ file and no example under any of the three. Give each heading its row
2011
2012
  in the quick-reference table, in the same format as the existing rows.
2012
2013
 
2013
- Write ONLY inside guardrails/projects/{{domain_slug}}/ (frontend/ + the map edit); modify
2014
+ Write ONLY inside guardrails/{{domain_slug}}/ (frontend/ + the map edit); modify
2014
2015
  no source. Report the files written, the concerns you found present with the code paths
2015
2016
  that evidence them, and the concerns you deliberately omitted.
2016
2017
  outputs:
@@ -2022,7 +2023,7 @@ workflow:
2022
2023
  require_non_empty: ui_pack_files
2023
2024
  required_files: ["{{pack_dir}}/frontend/ui-constitution.md", "{{pack_dir}}/tech-rule-bindings.md"]
2024
2025
  on_empty: stop
2025
- on_empty_message: "A frontend lane was detected ({{ui_evidence}}) but no lane rule files were written to guardrails/projects/{{domain_slug}}/frontend/. Check that the scan substrate's frontend_signals carry readable UI source, then re-run."
2026
+ on_empty_message: "A frontend lane was detected ({{ui_evidence}}) but no lane rule files were written to guardrails/{{domain_slug}}/frontend/. Check that the scan substrate's frontend_signals carry readable UI source, then re-run."
2026
2027
 
2027
2028
  # Did the lane's heading land in the map? The files above are only half the wiring:
2028
2029
  # `## /aw-spec-ui-constitution` is what a later /appweaver constitution re-ratifies
@@ -2044,8 +2045,8 @@ workflow:
2044
2045
  require_non_empty: ui_map_rules
2045
2046
  on_empty: continue
2046
2047
  on_empty_message: >
2047
- The lane rule files were written to guardrails/projects/{{domain_slug}}/frontend/,
2048
- but guardrails/projects/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2048
+ The lane rule files were written to guardrails/{{domain_slug}}/frontend/,
2049
+ but guardrails/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2049
2050
  `## /aw-spec-ui-constitution`. Without that heading a later /appweaver
2050
2051
  constitution finds no lane rules to re-ratify the UI half from, and reads this
2051
2052
  project as backend-only. Add the heading after the last technical one, bulleting
@@ -2060,7 +2061,7 @@ workflow:
2060
2061
  on_error: continue
2061
2062
  script: { ref: actions }
2062
2063
  subcommand: resolve-tech
2063
- args: ["--command", "aw-spec-plan-ui"]
2064
+ args: ["--command", "aw-spec-plan-frontend"]
2064
2065
  outputs:
2065
2066
  - { name: ui_plan_rules, from: "$.candidates" }
2066
2067
  - id: warn_ui_plan_wiring
@@ -2069,8 +2070,8 @@ workflow:
2069
2070
  require_non_empty: ui_plan_rules
2070
2071
  on_empty: continue
2071
2072
  on_empty_message: >
2072
- guardrails/projects/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2073
- `## /aw-spec-plan-ui`, so the frontend lane of /appweaver plan will author
2073
+ guardrails/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2074
+ `## /aw-spec-plan-frontend`, so the frontend lane of /appweaver plan will author
2074
2075
  frontend-plan.md with no project rule file. Add the heading, bulleting the
2075
2076
  frontend/ files whose rules shape a feature's screens, state and interactions.
2076
2077
  - id: probe_ui_impl_wiring
@@ -2079,7 +2080,7 @@ workflow:
2079
2080
  on_error: continue
2080
2081
  script: { ref: actions }
2081
2082
  subcommand: resolve-tech
2082
- args: ["--command", "aw-spec-implement-ui"]
2083
+ args: ["--command", "aw-spec-implement-frontend"]
2083
2084
  outputs:
2084
2085
  - { name: ui_impl_rules, from: "$.candidates" }
2085
2086
  - id: warn_ui_impl_wiring
@@ -2088,8 +2089,8 @@ workflow:
2088
2089
  require_non_empty: ui_impl_rules
2089
2090
  on_empty: continue
2090
2091
  on_empty_message: >
2091
- guardrails/projects/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2092
- `## /aw-spec-implement-ui`, so the frontend lane of /appweaver implement will
2092
+ guardrails/{{domain_slug}}/tech-rule-bindings.md maps nothing under
2093
+ `## /aw-spec-implement-frontend`, so the frontend lane of /appweaver implement will
2093
2094
  generate UI code with no project rule file. Add the heading, bulleting the
2094
2095
  frontend/ files whose rules govern component, state, styling and test conventions.
2095
2096
 
@@ -2161,7 +2162,7 @@ workflow:
2161
2162
  #
2162
2163
  # WHERE A FRONTEND LANE EXISTS the lane gets its OWN pair (ui-design-template +
2163
2164
  # ui-delta-design-template, below), so this pair covers the SERVICE lane only and excludes
2164
- # the lane's roots from the structure it derives. One lane's template never describes the
2165
+ # the lane root folders from the structure it derives. One lane's template never describes the
2165
2166
  # other's code. The templates are authored when their lane's tier is first authored — by
2166
2167
  # the first context, or by the run that first sees a lane declared later — and are never
2167
2168
  # amended: every plan already written follows their shape.
@@ -2215,7 +2216,7 @@ workflow:
2215
2216
  into §1.1 or §2 from memory. DESIGN-FORMAT.md (in context, § Brownfield variant) states
2216
2217
  which anchors are pinned and why.
2217
2218
 
2218
- SERVICE LANE ONLY. Frontend lane roots this repo has: {{frontend_roots}} (empty = none).
2219
+ SERVICE LANE ONLY. Frontend lane root folders this repo has: {{frontend_roots}} (empty = none).
2219
2220
  Where that is non-empty, EXCLUDE those roots when deriving the structure — the lane has
2220
2221
  its own design template pair, generated next, and one lane's template must never describe
2221
2222
  the other's code. A UI tier that is NOT a separable lane (rendered inside the service
@@ -2458,7 +2459,7 @@ workflow:
2458
2459
 
2459
2460
  GROUND EVERYTHING IN THE LANE'S OWN CODE. Evidence authority, in order:
2460
2461
  1. THE ACTUAL UI SOURCE (ground truth). Use {{inventory_ui_json}} (in context):
2461
- `frontend_signals` gives the lane roots, their kind (spa / server-rendered /
2462
+ `frontend_signals` gives the lane root folders, their kind (spa / server-rendered /
2462
2463
  desktop), their framework markers and their component / route / store / style
2463
2464
  file lists. READ ENOUGH OF THOSE FILES to state each structural claim from what
2464
2465
  the UI ACTUALLY does. Do NOT assert a convention you have not seen.
@@ -2467,7 +2468,7 @@ workflow:
2467
2468
  serves; cite them by their real numerals.
2468
2469
  3. The generated frontend/ui-constitution.md and the OKF architecture/frontend.md
2469
2470
  (in context, if present) — the lane's own rule detail and a shallow corroboration.
2470
- STAY INSIDE THE LANE. Derive structure ONLY from code under the lane's roots. The
2471
+ STAY INSIDE THE LANE. Derive structure ONLY from code under the lane root folders. The
2471
2472
  service lane has its own template, generated just above; this one never describes
2472
2473
  server-side structure.
2473
2474
 
@@ -2655,4 +2656,4 @@ outputs:
2655
2656
  amended_domain_files: "{{amended_domain_files}}"
2656
2657
  amended_service_files: "{{amended_service_files}}"
2657
2658
  amended_ui_files: "{{amended_ui_files}}"
2658
- next: "Onboarded bounded context {{bc}} ({{bc_feature_count}} feature(s): {{bc_features}}). Its aggregate concepts ({{bc_aggregates}}) are in {{bundle_dir}}, each keyed `bounded_context: {{bc}}` and listing the features that act on it — the bundle is the project's knowledge, one concept per aggregate, never one per feature — and its specs tree now exists at {{bc_dir}}/ with a directory per feature ({{feature_dirs}}) — EMPTY on purpose: the directory says the feature is known, and the documents that describe it are written per feature by /appweaver adopt and per context by /appweaver specify. {{bc}} is now the ACTIVE bounded context (.appweaver/context.json), so /appweaver select-feature lists exactly these features and nothing from a neighbouring context; switch with /appweaver select-bounded-context. ONBOARD RUNS ONCE PER CONTEXT: contexts already done — {{onboarded_contexts}}; still open — {{remaining_contexts}}; the order the map gives is {{contexts_ordered}}. Run /appweaver onboard <NextContext> for each remaining one, or with no argument to take the next one automatically. GOVERNANCE — {{gov_mode}}. The project tier is the PROVISIONAL governance scaffold — the split constitution, the domain rule set at guardrails/projects/{{domain_slug}}/domain/*.domain.md + domain-rule-bindings.md, each declared LANE's rule set and constitution half, the activated domain {{active_domain}}, and the code-derived design / delta-design / domain-model template overrides in .appweaver/templates/overrides/. The first context authors it; every later context AMENDS it from its own code, additively — rules, principles and map entries its code evidences, never a rewrite, renumbering or deletion of what an earlier context wrote — and a lane tier that did not exist yet is authored in full. Files this run amended — domain: {{amended_domain_files}}; service: {{amended_service_files}}; frontend: {{amended_ui_files}}. Search them for `Divergence ({{bc}})`: each marks a rule this context's code contradicts, left as written for you to decide with /appweaver constitution, which is also how you amend the tier by hand. The templates are written once per lane and never amended. To re-run this governance pass later — after declaring a lane with /appweaver select-stack, say — name an onboarded context: /appweaver onboard <Context>. ONE HALF AND ONE RULE SET PER LANE: service_lane / ui_lane report which lanes .appweaver/stacks.json declared, and the declaration is what decided. A lane declared (none) in select-stack gets none of it, which is the correct outcome and not an omission. LANE DECLARATION: read, never written — select-stack is its sole writer, and this run scanned the source paths it named (scanned_service_root / scanned_ui_root); scanned_backend_files / scanned_ui_files report each. ui_source_evidence_found false means the UI lane's declared path held nothing a scan recognises as UI, so its governance is thin — move the source path with /appweaver select-stack and re-run. The build/test/run commands on each lane are that PROFILE's defaults and may not match a legacy layout — review them. Because the domain is activated, resolve-domain + resolve-tech route the WHOLE forward pipeline to these code-derived rules — never another project's rules as a fallback. THE BOUNDARIES CAME FROM THE MAP, not from this run: /appweaver inventory proposed them and you confirmed them in specs/proposed-inventory.md. To change a boundary, edit that file and run /appweaver inventory apply — a context whose concepts already exist is not re-mapped; naming it re-runs only its governance pass. Develop an EXISTING feature just-in-time: /appweaver adopt <Feature> reverse-engineers its spec.md + backend-plan.md + source-map.md and deepens the OKF concept of the aggregate it acts on. Develop a NEW feature straight through the forward pipeline — /appweaver select-feature FIRST (specify and every stage after it read the active feature and STOP without one), then specify → plan → analyze-plan → implement → build → analyze-slice → run. Then drive every change through the CR delta loop (/appweaver specify → plan → analyze-plan-delta → implement → build → analyze-slice-delta → finalize-delta → analyze-slice → close-delta), and re-derive the master plans after it with /appweaver plan main → analyze-plan — finalize-delta merges a change into spec.md and domain-model.md, never into the plans. If a validation_ok is false, its constitution half needs a manual touch (see its Sync Impact Report)."
2659
+ next: "Onboarded bounded context {{bc}} ({{bc_feature_count}} feature(s): {{bc_features}}). Its aggregate concepts ({{bc_aggregates}}) are in {{bundle_dir}}, each keyed `bounded_context: {{bc}}` and listing the features that act on it — the bundle is the project's knowledge, one concept per aggregate, never one per feature — and its specs tree now exists at {{bc_dir}}/ with a directory per feature ({{feature_dirs}}) — EMPTY on purpose: the directory says the feature is known, and the documents that describe it are written per feature by /appweaver adopt and per context by /appweaver specify. {{bc}} is now the ACTIVE bounded context (.appweaver/context.json), so /appweaver select-feature lists exactly these features and nothing from a neighbouring context; switch with /appweaver select-bounded-context. ONBOARD RUNS ONCE PER CONTEXT: contexts already done — {{onboarded_contexts}}; still open — {{remaining_contexts}}; the order the map gives is {{contexts_ordered}}. Run /appweaver onboard <NextContext> for each remaining one, or with no argument to take the next one automatically. GOVERNANCE — {{gov_mode}}. The project tier is the PROVISIONAL governance scaffold — the split constitution, the domain rule set at guardrails/{{domain_slug}}/domain/*.domain.md + domain-rule-bindings.md, each declared LANE's rule set and constitution half, the activated domain {{active_domain}}, and the code-derived design / delta-design / domain-model template overrides in .appweaver/templates/overrides/. The first context authors it; every later context AMENDS it from its own code, additively — rules, principles and map entries its code evidences, never a rewrite, renumbering or deletion of what an earlier context wrote — and a lane tier that did not exist yet is authored in full. Files this run amended — domain: {{amended_domain_files}}; service: {{amended_service_files}}; frontend: {{amended_ui_files}}. Search them for `Divergence ({{bc}})`: each marks a rule this context's code contradicts, left as written for you to decide with /appweaver constitution, which is also how you amend the tier by hand. The templates are written once per lane and never amended. To re-run this governance pass later — after declaring a lane with /appweaver select-stack, say — name an onboarded context: /appweaver onboard <Context>. ONE HALF AND ONE RULE SET PER LANE: service_lane / ui_lane report which lanes .appweaver/stacks.json declared, and the declaration is what decided. A lane declared (none) in select-stack gets none of it, which is the correct outcome and not an omission. LANE DECLARATION: read, never written — select-stack is its sole writer, and this run scanned the lane root folders it named (scanned_service_root / scanned_ui_root); scanned_backend_files / scanned_ui_files report each. ui_source_evidence_found false means the declared lane root folder of the UI lane held nothing a scan recognises as UI, so its governance is thin — move the lane root folder with /appweaver select-stack and re-run. The build/test/run commands on each lane are that PROFILE's defaults and may not match a legacy layout — review them. Because the domain is activated, resolve-domain + resolve-tech route the WHOLE forward pipeline to these code-derived rules — never another project's rules as a fallback. THE BOUNDARIES CAME FROM THE MAP, not from this run: /appweaver inventory proposed them and you confirmed them in specs/proposed-inventory.md. To change a boundary, edit that file and run /appweaver inventory apply — a context whose concepts already exist is not re-mapped; naming it re-runs only its governance pass. Develop an EXISTING feature just-in-time: /appweaver adopt <Feature> reverse-engineers its spec.md + backend-plan.md + source-map.md and deepens the OKF concept of the aggregate it acts on. Develop a NEW feature straight through the forward pipeline — /appweaver select-feature FIRST (specify and every stage after it read the active feature and STOP without one), then specify → plan → analyze-plan → implement → build → analyze-slice → run. Then drive every change through the CR delta loop (/appweaver specify → plan → analyze-plan-delta → implement → build → analyze-slice-delta → finalize-delta → analyze-slice → close-delta), and re-derive the master plans after it with /appweaver plan main → analyze-plan — finalize-delta merges a change into spec.md and domain-model.md, never into the plans. If a validation_ok is false, its constitution half needs a manual touch (see its Sync Impact Report)."
@@ -53,7 +53,7 @@ scripts:
53
53
 
54
54
  # Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The code-generation
55
55
  # set (triage may fix the CANDIDATE code to match legacy) is no longer hardcoded here — it is
56
- # now CONFIGURATION, loaded per-command from guardrails/projects/<project>/tech-rule-bindings.md
56
+ # now CONFIGURATION, loaded per-command from guardrails/<project>/tech-rule-bindings.md
57
57
  # under "## /aw-spec-parity" by the tech-select module (see the tech_select step below). No
58
58
  # domain files: the target behaviour is defined by the running legacy system, not domain rules —
59
59
  # the tech map lists only technical files. (parity does not reference constitution.technical.md.)
@@ -68,7 +68,7 @@ vars:
68
68
  workflow:
69
69
 
70
70
  # 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded). tech-select
71
- # reads guardrails/projects/<project>/tech-rule-bindings.md under "## /aw-spec-parity" and
71
+ # reads guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-parity" and
72
72
  # loads that code-generation set into the sticky standards the agent_generate triage step
73
73
  # ALWAYS prepends. No domain rule file is loaded here — the tech map lists only technical
74
74
  # files. No blocking gate: an unconfigured project soft-continues (the target behaviour is