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
@@ -0,0 +1,68 @@
1
+ # kind: frontend
2
+ # profiles: nextjs
3
+ # title: Next.js App Router base (TypeScript, ESLint, Vitest) built from this spec
4
+
5
+ # Next.js App Router foundation — frontend lane
6
+
7
+ ## Purpose
8
+ A clean, building Next.js frontend for the lane: App Router, TypeScript in strict mode,
9
+ ESLint, a token-based design-system layer and a working test setup. No business screens —
10
+ /appweaver implement adds those per feature later, from frontend-plan.md.
11
+
12
+ ## Create
13
+ Run at the repository root, naming the lane root folder, so the app lands directly in that
14
+ folder (not in a folder inside or beside it):
15
+ - `npx create-next-app@latest <lane root folder without trailing slash> --typescript --eslint --app --no-src-dir --import-alias "@/*" --use-npm --no-tailwind --yes`
16
+ Set `"name"` in package.json to the project name in lower-kebab form
17
+ (e.g. AppWeaver.Health -> appweaver-health).
18
+
19
+ ## Packages
20
+ Development dependencies:
21
+ - vitest, @vitejs/plugin-react, jsdom
22
+ - @testing-library/react, @testing-library/jest-dom, @testing-library/user-event
23
+ - vitest-axe (accessibility assertions)
24
+
25
+ ## Layout
26
+ Under the lane root folder (create empty folders with a .gitkeep):
27
+ ```
28
+ app/ App Router — layout.tsx, page.tsx, loading.tsx, error.tsx, not-found.tsx
29
+ components/ design-system compositions, presentational only
30
+ features/ one folder per spec feature (empty at start)
31
+ lib/api/ the generated contract client (empty at start — never hand-written)
32
+ lib/ cross-feature client utilities
33
+ locales/ locale catalogues — en.json to start
34
+ styles/tokens.css the semantic design tokens
35
+ tests/ component, integration and accessibility tests
36
+ ```
37
+
38
+ ## Starter files
39
+ - `styles/tokens.css` — semantic CSS custom properties only (`--color-surface`,
40
+ `--color-text`, `--color-muted`, `--color-danger`, `--space-1..6`, `--radius-1..3`,
41
+ `--font-body`), with a `prefers-color-scheme: dark` block. Imported once by
42
+ `app/layout.tsx`; no literal colour anywhere else.
43
+ - `app/layout.tsx` — html `lang` from the default locale, the tokens import, a skip-to-content
44
+ link, `<main id="main">`.
45
+ - `app/page.tsx` — a server component rendering the app name and one line of text.
46
+ - `app/loading.tsx`, `app/error.tsx` (client component with a retry button), `app/not-found.tsx`.
47
+ - `components/Button.tsx` — one presentational component styled only with tokens, as the
48
+ pattern later components follow.
49
+ - `lib/env.ts` — reads `NEXT_PUBLIC_API_BASE_URL` once and exports it typed; nothing else
50
+ reads `process.env`.
51
+ - `locales/en.json` — the strings the starter pages use.
52
+ - `.env.example` — `NEXT_PUBLIC_API_BASE_URL=http://localhost:5000`.
53
+ Remove the create-next-app demo content (the default page body, its CSS module and images).
54
+
55
+ ## Configuration
56
+ - `tsconfig.json`: `"strict": true`, keep the `@/*` alias.
57
+ - `vitest.config.ts`: jsdom environment, the React plugin, `tests/setup.ts` as setup file
58
+ (registers jest-dom and vitest-axe matchers), the `@/*` alias.
59
+ - package.json scripts: `dev`, `build`, `start`, `lint` (from create-next-app), plus
60
+ `"test": "vitest run"` and `"typecheck": "tsc --noEmit"`.
61
+
62
+ ## Tests
63
+ - `tests/page.test.tsx` — renders the home page and asserts the app name is shown.
64
+ - `tests/button.a11y.test.tsx` — renders `Button` and asserts no axe violations.
65
+
66
+ ## Done when
67
+ `npm install`, `npm run build`, `npm test` and `npm run lint` all pass in the lane root
68
+ folder, and `npm run dev` serves the home page at http://localhost:3000.
@@ -13,27 +13,39 @@ guardrails/
13
13
  ├── domain/<industry>/ domain rules — vary by industry, never by stack
14
14
  │ ├── healthcare/
15
15
  │ └── pharma/
16
- └── projects/<project>/ what a project SELECTS
17
- └── dotnet-default-project/
18
- ├── tech-rule-bindings.md → technology/dotnet-webapi/ + technology/nextjs/
19
- ├── domain-rule-bindings.md → domain/healthcare/
20
- ├── service/technical-requirements.md PROJECT-SUPPLIED
21
- ├── frontend/ui-requirements.md PROJECT-SUPPLIED
22
- └── domain/domain-requirements.md PROJECT-SUPPLIED
16
+ ├── project-specific/ the project's own rules — what it SELECTS from the corpora
17
+ │ ├── tech-rule-bindings.md → technology/{{backend_stack}}/ + technology/{{frontend_stack}}/
18
+ │ ├── domain-rule-bindings.md → domain/healthcare/
19
+ │ ├── service/technical-requirements.md PROJECT-SUPPLIED
20
+ │ ├── frontend/ui-requirements.md PROJECT-SUPPLIED
21
+ │ └── domain/domain-requirements.md PROJECT-SUPPLIED
22
+ └── brf-<name>/ a project `onboard` reverse-engineers from existing code
23
23
  ```
24
24
 
25
- `/appweaver select-domain` selects a **project** folder and stores it in `.appweaver/domain.json`;
26
- `resolve-tech` and `resolve-domain` read that project's two maps. **To change what a command loads,
27
- edit the map — never a workflow.** The folder names `technology/` and `domain/` are the only
25
+ **The active project is the folder `.appweaver/domain.json` names** — `project-specific` as shipped,
26
+ and `brf-<name>` once `onboard` has run, because onboard creates that folder and writes its name
27
+ there. No sequence selects a project. To use another one, copy `project-specific/` to a new folder
28
+ here, change the `guardrails/project-specific/` paths inside its two maps to the new folder, and run
29
+ the optional `/appweaver select-domain <name>` — it lists the folders here that hold a map and
30
+ writes the one picked into `domain.json` (editing `"domain"` by hand does the same). It never
31
+ creates a folder. Re-run `/appweaver constitution` after switching so the constitution follows.
32
+ `resolve-tech` and `resolve-domain` read the active project's two maps. **To change what a command
33
+ loads, edit the map — never a workflow.** The folder names `technology/` and `domain/` are the only
28
34
  vocabulary here: a project's maps may point anywhere, in any combination.
29
35
 
30
- **A directory under `projects/` is a project only if it carries a rule map.** Both shells'
31
- `list-domains` enforces that, exactly as `foundations/` requires a `*.pack.txt`. Either map
36
+ **A directory under `guardrails/` is a project only if it carries a rule map.** Both shells'
37
+ `list-domains` enforces that, exactly as `foundations/` requires a `*.pack.txt` or `*.spec.txt` — the
38
+ corpora `technology/` and `domain/` carry no map, so they are never taken for a project. Either map
32
39
  qualifies, because `onboard` writes the domain map several steps before the technical one.
33
40
 
34
- **A brownfield project owns its rules outright.** `dotnet-default-project` above holds only three
41
+ **The technical map names no stack.** Every path in `project-specific/tech-rule-bindings.md` writes
42
+ its stack directory as `{{backend_stack}}` or `{{frontend_stack}}`, resolved from the lanes in
43
+ `.appweaver/stacks.json`, so the same map serves a .NET repo and a Spring one. A corpus that lacks a
44
+ mapped file reports it as missing and loads nothing in its place.
45
+
46
+ **A brownfield project owns its rules outright.** `project-specific/` above holds only three
35
47
  files because it maps the rest from the shared corpora. A project `onboard` reverse-engineers —
36
- `projects/brf-<name>/` — holds everything: the domain set in `domain/`, the technical set in
48
+ `brf-<name>/` — holds everything: the domain set in `domain/`, the technical set in
37
49
  `service/`, the lane set in `frontend/`, and its own charter at `domain/domain-constitution.md`,
38
50
  named the way an industry corpus names its charter. Both maps still sit at the project root, and
39
51
  nothing a project owns is written outside its own folder — which is what lets two onboarded
@@ -91,7 +103,7 @@ is what lists it. Infer the tier from the folder and the fold breaks.
91
103
  `stacks.json` and a rule folder are the same word.
92
104
  - **An industry** — create `domain/<industry>/`, author the overlays, point a project's
93
105
  `domain-rule-bindings.md` at it. The technical map needs no edit.
94
- - **A project** — copy `projects/dotnet-default-project/`, repoint the bullets, replace the three
106
+ - **A project** — fill in `project-specific/`: repoint the bullets and replace the three
95
107
  project-supplied files. Nothing outside that folder changes.
96
108
 
97
109
  ## Files — technical (`technology/dotnet-webapi/`)
@@ -214,8 +226,10 @@ Everything this tree once held that governance does not load left it on 2026-08-
214
226
  `foundations/<stack>/`:
215
227
 
216
228
  - **Scaffold corpora** — `foundations/dotnet/ModularMonolith/` and `foundations/dotnet/VerticalSlice/`:
217
- a `<Name>.pack.txt` payload and the scripts that pack and unpack it, read by
218
- `/appweaver foundation`.
229
+ a `<Name>.pack.txt` payload and the scripts that pack and unpack it; and specs —
230
+ `foundations/node/NextAppRouter/NextAppRouter.spec.txt` — that describe a project an agent
231
+ builds into the lane. Both read by `/appweaver foundation`; the shape of a spec is
232
+ `foundations/foundation.spec.template.txt`.
219
233
  - **Framework component runbooks** — `foundations/dotnet/components/`: the integration contracts
220
234
  `/appweaver add-component` follows when wiring an opt-in component into a scaffolded project.
221
235
 
@@ -1,4 +1,4 @@
1
- # dotnet-default-project — Command → Domain-Rule-File Map
1
+ # project-specific — Command → Domain-Rule-File Map
2
2
 
3
3
  Per-command list of the **domain** rule files this project loads (via `resolve-domain`
4
4
  + the `domain-select` module, into the sticky standards set) for the spec-anchored
@@ -19,8 +19,8 @@ through the spec/design (as CN-/DC-/IC- ids).
19
19
  - To govern a different industry, repoint these bullets at another
20
20
  `guardrails/domain/<industry>/` corpus — `guardrails/domain/pharma/` also ships. Nothing
21
21
  else changes: the technical map, the workflows and the engine are untouched.
22
- - This file is the **canonical domain mapping** for this project; `/appweaver
23
- select-domain` selects this project folder as active.
22
+ - This file is the **canonical domain mapping** for this project; it is used whenever
23
+ `.appweaver/domain.json` names `project-specific`, which it does by default.
24
24
 
25
25
  ---
26
26
 
@@ -49,12 +49,12 @@ through the spec/design (as CN-/DC-/IC- ids).
49
49
  - guardrails/domain/healthcare/zero-trust.domain.md
50
50
  - guardrails/domain/healthcare/ai-rules.domain.md
51
51
  - guardrails/domain/healthcare/folder-structure.domain.md
52
- - guardrails/projects/dotnet-default-project/domain/domain-requirements.md
52
+ - guardrails/project-specific/domain/domain-requirements.md
53
53
 
54
54
  ## /aw-spec-specify
55
55
  <!-- The FULL domain set. Specify models the domain COMPLETELY and LIFTS the constraint
56
56
  overlays into the spec's CN-/DC-/IC- sections (design/implement never see these files). -->
57
- - guardrails/projects/dotnet-default-project/domain/domain-requirements.md
57
+ - guardrails/project-specific/domain/domain-requirements.md
58
58
  - guardrails/domain/healthcare/domain-driven-design.domain.md
59
59
  - guardrails/domain/healthcare/clinical-terms.md
60
60
  - guardrails/domain/healthcare/terminology.md
@@ -74,12 +74,22 @@ through the spec/design (as CN-/DC-/IC- ids).
74
74
  - guardrails/domain/healthcare/api-versioning.domain.md
75
75
  - guardrails/domain/healthcare/vertical-slices.domain.md
76
76
 
77
- ## /aw-spec-plan
78
- _None — design loads no domain file. Domain reaches design only through the spec (BR-/CN-/DC-/IC-)._
77
+ ## /aw-spec-plan-backend
78
+ _None — the service lane of plan loads no domain file. Domain reaches it only through the spec
79
+ (BR-/CN-/DC-/IC-) and the context's domain-model.md._
79
80
 
80
- ## /aw-spec-implement
81
- _None — implement loads no domain file. Domain reaches implement only through design.md. Framework
82
- components are added separately via `/appweaver add-component`._
81
+ ## /aw-spec-plan-frontend
82
+ _None — the frontend lane of plan loads no domain file. Domain reaches it only through the spec
83
+ and the context's domain-model.md._
84
+
85
+ ## /aw-spec-implement-backend
86
+ _None — the service lane of implement loads no domain file. Domain reaches it only through
87
+ backend-plan.md and the context's domain-model.md. Framework components are added separately via
88
+ `/appweaver add-component`._
89
+
90
+ ## /aw-spec-implement-frontend
91
+ _None — the frontend lane of implement loads no domain file. Domain reaches it only through
92
+ frontend-plan.md and the context's domain-model.md._
83
93
 
84
94
  ## /aw-spec-gate
85
95
  <!-- Conformance checklist for the gates (analyze-plan · analyze-slice): the domain-derived
@@ -106,10 +116,12 @@ components are added separately via `/appweaver add-component`._
106
116
 
107
117
  | Command | Domain rule files | Role |
108
118
  |---|---|---|
109
- | /aw-spec-constitution | 14 | domain principles (XVI+) — the industry constitution + standard industry rules + the project's own requirements |
119
+ | /aw-spec-constitution | 16 | domain principles (XVI+) — the industry constitution + standard industry rules + the project's own requirements |
110
120
  | /aw-spec-specify | 19 | author into spec (lift → CN-/DC-/IC-) |
111
- | /aw-spec-plan | 0 | none — spec is the only domain input |
112
- | /aw-spec-implement | 0 | none — design is the only domain input |
121
+ | /aw-spec-plan-backend | 0 | none — the spec and the domain model carry the domain |
122
+ | /aw-spec-plan-frontend | 0 | none — the spec and the domain model carry the domain |
123
+ | /aw-spec-implement-backend | 0 | none — backend-plan.md and the domain model carry the domain |
124
+ | /aw-spec-implement-frontend | 0 | none — frontend-plan.md and the domain model carry the domain |
113
125
  | /aw-spec-gate | 14 | conformance checklist (validate, don't author) |
114
126
 
115
127
  > Retired in the orchestrator pipeline: the prose `/aw-spec-plan` phase, `/aw-spec-tasks`,
@@ -0,0 +1,296 @@
1
+ # project-specific — Command → Technical-Rule-File Map
2
+
3
+ Per-command list of the **technical** rule files this project loads (via `resolve-tech` +
4
+ the `tech-select` module, into the sticky standards set) for the spec-anchored
5
+ orchestrator pipeline. This is the technical counterpart of `domain-rule-bindings.md`
6
+ (which maps the DOMAIN rule files).
7
+
8
+ **The model:** the technical rule files are CONFIGURATION — tune this map, not the
9
+ workflows. They live in the **shared technology corpora**, one folder per stack, and this
10
+ map is what binds a project to them. The ratified output (`constitution.technical.md`) is
11
+ NOT listed here — every consumer refers to it directly, as-is.
12
+
13
+ - All paths are workspace-relative. This project maps two stack corpora:
14
+ `guardrails/technology/{{backend_stack}}/` (the service) and
15
+ `guardrails/technology/{{frontend_stack}}/` (the frontend lane). Both are **standard rules
16
+ shared by every project that maps them**, and neither is domain-specific. The frontend corpus is
17
+ read by four headings — `## /aw-spec-ui-constitution` ratifies the lane's base,
18
+ `## /aw-spec-plan-frontend` / `## /aw-spec-implement-frontend` carry the detail rules under
19
+ it, and `## /aw-spec-foundation-frontend` is what a spec-built scaffold of the lane follows.
20
+ - `plan`, `implement` and `foundation` are keyed per lane KIND, not per command: each runs
21
+ both lanes in one run and loads one set or the other for each — `## /aw-spec-<command>-backend`
22
+ for the service lane, `## /aw-spec-<command>-frontend` for the frontend lane. `foundation`
23
+ loads its set only when the lane is built from a spec — a pack is unpacked as-is.
24
+ - The two files this project authors — `service/technical-requirements.md` and
25
+ `frontend/ui-requirements.md` — live beside this map. They are the only mapped technical
26
+ files expected to differ between two projects on the same stacks.
27
+ - A corpus's `examples/` folder holds the worked `<SampleProjectName>` sample for the
28
+ rule file beside it, split out so a phase can load the rules without the sample code. The
29
+ code-generating phases map both; `## /aw-spec-constitution` maps the rules alone, because a
30
+ thin authority document has no use for sample code.
31
+ - `resolve-tech --command <name>` collects the `- ` bullets under `## /<name>`.
32
+ - **Every stack directory below is a placeholder**, resolved from the lanes in
33
+ `.appweaver/stacks.json`: `{{backend_stack}}` is the service lane's stack and
34
+ `{{frontend_stack}}` the frontend lane's (`{{stack}}`, `{{backend_ecosystem}}` and
35
+ `{{frontend_ecosystem}}` are also available). `guardrails/technology/{{backend_stack}}/persistence.md`
36
+ reads as `dotnet-webapi/` in a .NET repo and `java-spring/` in a Spring one, so this one map
37
+ serves whatever stacks the project declares. A placeholder for an undeclared lane skips
38
+ that bullet, so a backend-only repo loads no frontend rules. A resolved path with no file
39
+ on disk is reported as missing and loads nothing in its place. The bullets were written
40
+ against the `dotnet-webapi` and `nextjs` corpora; another stack's corpus may hold only
41
+ part of them. See STACK-PROFILES.md §7a.
42
+ - Adding a stack is adding a corpus under `guardrails/technology/<stack>/` with the same file
43
+ names — the placeholders then reach it with no change to this map, and no workflow, script
44
+ or engine change is involved.
45
+ - This file is the **canonical technical mapping** for this project; it is used whenever
46
+ `.appweaver/domain.json` names `project-specific`, which it does by default.
47
+ - A command with no heading here loads no mapped technical file (only the workflow's
48
+ universal `ai-rules.md` seed + `constitution.technical.md`, referred to directly).
49
+ - `## /aw-spec-specify` is the one **modelling-methodology** slot (see the rule partition):
50
+ a domain-agnostic way of *modelling*, never a technology choice. Everything below it is a
51
+ HOW-phase technical set.
52
+
53
+ ---
54
+
55
+ ## /aw-spec-specify
56
+ <!-- MODELLING METHODOLOGY ONLY, in two halves. Specify is the domain phase: the single kind
57
+ of technical input it may take is a domain-agnostic way of MODELLING, never a technology
58
+ choice. Do NOT add an architecture / persistence / codegen file here — that would break
59
+ specify's domain purity (design/implement own those). The domain's own DDD overlay
60
+ (domain-driven-design.domain.md) arrives separately via domain-rule-bindings.
61
+
62
+ 1. THE DOMAIN MODEL — DDD tactical patterns, plus the same methodology worked through
63
+ in code as the example beside it.
64
+ 2. THE EXPERIENCE MODEL — the ux/ rules that govern how specify states the experience:
65
+ Experience Scope, and the project-wide Experience Standards it lifts as UX- ids for
66
+ prototype / design-ui / implement-ui to author and verify against. These are
67
+ methodology, not visual design; each file's own "What must NOT appear" section is
68
+ what keeps screens out of the spec.
69
+
70
+ ⚠ The ux/ files sit in a DOMAIN corpus folder but are TECHNICAL-tier inputs: a file's
71
+ tier is the map that lists it, not the folder it lives in. guardrails/domain/healthcare/
72
+ ihe-conformance.md under ## /aw-spec-plan-backend is the same pattern. Unmapping them does not
73
+ make the spec's Experience Standards section disappear — the section is unconditional and
74
+ resolves to "None" — it removes the methodology specify fills it from. -->
75
+ - guardrails/technology/{{backend_stack}}/domain-driven-design.md
76
+ - guardrails/technology/{{backend_stack}}/examples/domain-driven-design.md
77
+ - guardrails/domain/healthcare/ux/journey-mapping.md
78
+ - guardrails/domain/healthcare/ux/interaction-states.md
79
+ - guardrails/domain/healthcare/ux/accessibility-standards.md
80
+ - guardrails/domain/healthcare/ux/content-design.md
81
+
82
+ ## /aw-spec-plan-backend
83
+ <!-- The technical/architecture rule files the design author works from (alongside the
84
+ spec and constitution.technical.md), each followed by its worked example. NO domain file
85
+ here — domain reaches design only as spec ids (BR-/CN-/DC-/IC-). -->
86
+ - guardrails/technology/{{backend_stack}}/clean-architecture.md
87
+ - guardrails/technology/{{backend_stack}}/cqrs.md
88
+ - guardrails/technology/{{backend_stack}}/eventing.md
89
+ - guardrails/technology/{{backend_stack}}/modular-monolith.md
90
+ - guardrails/technology/{{backend_stack}}/vertical-slices.md
91
+ - guardrails/technology/{{backend_stack}}/persistence.md
92
+ - guardrails/technology/{{backend_stack}}/folder-structure.md
93
+ - guardrails/technology/{{backend_stack}}/testing.md
94
+ - guardrails/technology/{{backend_stack}}/api-versioning.md
95
+ - guardrails/technology/{{backend_stack}}/zero-trust.md
96
+ - guardrails/technology/{{backend_stack}}/authorization.md
97
+ - guardrails/technology/{{backend_stack}}/authorization-matrix.md
98
+ - guardrails/technology/{{backend_stack}}/auditing.md
99
+ - guardrails/technology/{{backend_stack}}/data-classification.md
100
+ - guardrails/domain/healthcare/ihe-conformance.md
101
+ - guardrails/technology/{{backend_stack}}/examples/clean-architecture.md
102
+ - guardrails/technology/{{backend_stack}}/examples/cqrs.md
103
+ - guardrails/technology/{{backend_stack}}/examples/eventing.md
104
+ - guardrails/technology/{{backend_stack}}/examples/vertical-slices.md
105
+ - guardrails/technology/{{backend_stack}}/examples/persistence.md
106
+ - guardrails/technology/{{backend_stack}}/examples/api-versioning.md
107
+ - guardrails/technology/{{backend_stack}}/examples/zero-trust.md
108
+ - guardrails/technology/{{backend_stack}}/examples/authorization.md
109
+ - guardrails/technology/{{backend_stack}}/examples/auditing.md
110
+
111
+ ## /aw-spec-plan-frontend
112
+ <!-- The FRONTEND LANE's design phase. Its own heading, not a branch of ## /aw-spec-plan-backend:
113
+ the two lanes are governed by different constitution halves and own disjoint source
114
+ paths, so keying the map on a heading of its own gives the lane its own rule set for zero
115
+ mechanism change. NO domain file here — the domain reaches design.ui.md as spec ids,
116
+ exactly as it reaches design.md. The lane's ratified base (constitution.ui.md) is
117
+ referred to directly and is NOT mapped.
118
+
119
+ THE SERVICE LANE ENTERS THROUGH ONE FILE. api-integration.{{backend_stack}}.md is the
120
+ CROSS-LANE pairing rule set — what the service guarantees (paging shape, concurrency
121
+ token, error codes, redaction, caching, CORS) and what the client therefore must do.
122
+ It is named for the service stack and mapped through the placeholder, so ONE bullet
123
+ serves every backend: it resolves to api-integration.dotnet-webapi.md in a .NET repo and to
124
+ api-integration.java-spring.md in a Spring repo — both authored — and to a REPORTED
125
+ missing file for a backend whose pairing nobody has written yet, rather than silently
126
+ loading one stack's assumptions into another. A repo with no backend lane skips the
127
+ bullet entirely. No other service-lane file is mapped here: design.ui.md consumes the
128
+ published surface, never the service's internals. -->
129
+ - guardrails/technology/{{frontend_stack}}/component-architecture.md
130
+ - guardrails/technology/{{frontend_stack}}/routing-navigation.md
131
+ - guardrails/technology/{{frontend_stack}}/state-management.md
132
+ - guardrails/technology/{{frontend_stack}}/error-handling.md
133
+ - guardrails/technology/{{frontend_stack}}/forms-and-validation.md
134
+ - guardrails/technology/{{frontend_stack}}/auth-session.md
135
+ - guardrails/technology/{{frontend_stack}}/design-system.md
136
+ - guardrails/technology/{{frontend_stack}}/accessibility-implementation.md
137
+ - guardrails/technology/{{frontend_stack}}/i18n.md
138
+ - guardrails/technology/{{frontend_stack}}/performance-budgets.md
139
+ - guardrails/technology/{{frontend_stack}}/api-integration.{{backend_stack}}.md
140
+
141
+ ## /aw-spec-implement-backend
142
+ <!-- The FRAMEWORK / code-generation rule files the SERVICE lane's generator builds against
143
+ (alongside backend-plan.md and constitution.technical.md). It is loaded on BOTH paths,
144
+ master and delta: a change's code follows the same rules as the master it changes.
145
+ NO domain file — domain reaches implement only through the plan (on the delta path, the
146
+ master backend-plan.md + the change's delta plan). clean-architecture/cqrs are planning
147
+ concerns; component wiring is a separate /appweaver add-component step. -->
148
+ - guardrails/technology/{{backend_stack}}/coding-standards.md
149
+ - guardrails/technology/{{backend_stack}}/dependency-policy.md
150
+ - guardrails/technology/{{backend_stack}}/folder-structure.md
151
+ - guardrails/technology/{{backend_stack}}/framework-api-map.md
152
+ - guardrails/technology/{{backend_stack}}/testing.md
153
+ - guardrails/technology/{{backend_stack}}/PACKAGING.md
154
+
155
+ ## /aw-spec-implement-frontend
156
+ <!-- The FRONTEND LANE's code-generation set — the HOW that lane of `implement` builds
157
+ against, alongside frontend-plan.md and constitution.ui.md. It is loaded on BOTH paths,
158
+ master and delta, as the service lane's set is. NO domain file
159
+ (domain reached the lane through spec -> frontend-plan.md), and NO service-lane file
160
+ beyond the pairing rules below — this lane never writes outside its declared lane root folder.
161
+
162
+ EIGHT FILES ARE MAPPED FOR BOTH LANE PHASES on purpose. error-handling,
163
+ forms-and-validation, auth-session, design-system, accessibility-implementation, i18n,
164
+ performance-budgets and the api-integration pairing each carry a DESIGN half and an
165
+ IMPLEMENT half of one rule: the design decides the states, the affordances and the
166
+ targets; this phase realises them. A rule read by only one of the two loses the
167
+ pairing, and the half that goes unread is always the one that then goes unbuilt. -->
168
+ - guardrails/technology/{{frontend_stack}}/component-conventions.md
169
+ - guardrails/technology/{{frontend_stack}}/api-client.md
170
+ - guardrails/technology/{{frontend_stack}}/api-integration.{{backend_stack}}.md
171
+ - guardrails/technology/{{frontend_stack}}/auth-session.md
172
+ - guardrails/technology/{{frontend_stack}}/client-security.md
173
+ - guardrails/technology/{{frontend_stack}}/error-handling.md
174
+ - guardrails/technology/{{frontend_stack}}/forms-and-validation.md
175
+ - guardrails/technology/{{frontend_stack}}/design-system.md
176
+ - guardrails/technology/{{frontend_stack}}/accessibility-implementation.md
177
+ - guardrails/technology/{{frontend_stack}}/i18n.md
178
+ - guardrails/technology/{{frontend_stack}}/performance-budgets.md
179
+ - guardrails/technology/{{frontend_stack}}/observability.md
180
+ - guardrails/technology/{{frontend_stack}}/frontend-testing.md
181
+
182
+ ## /aw-spec-build
183
+ <!-- The compile/fix reference set: the layering + coding rules the fixer respects when
184
+ repairing compile errors against the design intent, plus the layering example it repairs
185
+ towards. NO domain file (build loads domain rules separately via domain-select) and no
186
+ constitution.technical here. -->
187
+ - guardrails/technology/{{backend_stack}}/clean-architecture.md
188
+ - guardrails/technology/{{backend_stack}}/coding-standards.md
189
+ - guardrails/technology/{{backend_stack}}/examples/clean-architecture.md
190
+
191
+ ## /aw-spec-analyze-slice
192
+ <!-- The design↔code conformance gate's TECHNICAL checklist: the code + tests are
193
+ validated against these (alongside the DOMAIN gate overlays, loaded separately via
194
+ resolve-domain `## /aw-spec-gate`). Validation input only — never authoring. -->
195
+ - guardrails/technology/{{backend_stack}}/testing.md
196
+ - guardrails/technology/{{backend_stack}}/coding-standards.md
197
+ - guardrails/technology/{{backend_stack}}/framework-api-map.md
198
+
199
+ ## /aw-spec-constitution
200
+ <!-- What the TECHNICAL half of the split constitution ratifies into
201
+ constitution.technical.md: the technology base, then the STANDARD technical rules for
202
+ this industry — the same corpus design and implement build against, so a ratified
203
+ principle can cite the rule it governs — and last the PROJECT-SUPPLIED file the project
204
+ team authors. Loaded BEFORE the technical half and before domain-select, so the
205
+ technical author stays domain-free (the seam). NO domain file here: the domain half's
206
+ sources are the domain map's ## /aw-spec-constitution. NO examples/ file either — the
207
+ ratified half is one declarative line and a `→` pointer per principle, so sample code is
208
+ weight without a reader. -->
209
+ - guardrails/technology/{{backend_stack}}/technology-constitution.md
210
+ - guardrails/technology/{{backend_stack}}/clean-architecture.md
211
+ - guardrails/technology/{{backend_stack}}/modular-monolith.md
212
+ - guardrails/technology/{{backend_stack}}/vertical-slices.md
213
+ - guardrails/technology/{{backend_stack}}/domain-driven-design.md
214
+ - guardrails/technology/{{backend_stack}}/cqrs.md
215
+ - guardrails/technology/{{backend_stack}}/persistence.md
216
+ - guardrails/technology/{{backend_stack}}/eventing.md
217
+ - guardrails/technology/{{backend_stack}}/folder-structure.md
218
+ - guardrails/technology/{{backend_stack}}/testing.md
219
+ - guardrails/technology/{{backend_stack}}/zero-trust.md
220
+ - guardrails/technology/{{backend_stack}}/authorization.md
221
+ - guardrails/technology/{{backend_stack}}/auditing.md
222
+ - guardrails/technology/{{backend_stack}}/data-classification.md
223
+ - guardrails/technology/{{backend_stack}}/api-versioning.md
224
+ - guardrails/technology/{{backend_stack}}/coding-standards.md
225
+ - guardrails/technology/{{backend_stack}}/dependency-policy.md
226
+ - guardrails/project-specific/service/technical-requirements.md
227
+
228
+ ## /aw-spec-ui-constitution
229
+ <!-- What the UI half ratifies into constitution.ui.md as a UX-* principle series: the
230
+ standard frontend rules for this industry, then the PROJECT-SUPPLIED file. This heading
231
+ is also the AUTHORITATIVE signal that the project HAS a frontend lane — with no heading
232
+ here the constitution command skips the UI half and creates no file at all. Domain-free,
233
+ and loaded before domain-select for the same reason as the set above. -->
234
+ - guardrails/technology/{{frontend_stack}}/ui-constitution.md
235
+ - guardrails/project-specific/frontend/ui-requirements.md
236
+
237
+ ## /aw-spec-run
238
+ <!-- Execution / data migration: the persistence rules the migration step generates against,
239
+ plus their worked example. NO domain file; run does not reference constitution.technical.md. -->
240
+ - guardrails/technology/{{backend_stack}}/persistence.md
241
+ - guardrails/technology/{{backend_stack}}/examples/persistence.md
242
+
243
+ ## /aw-spec-foundation-backend
244
+ <!-- What `foundation` builds the SERVICE lane's base project against when the operator picks
245
+ a spec ([spec] or [manual spec]) instead of a pack. A pack is verified against these rules
246
+ when it is made; a spec build is not, so the agent gets them as standards and follows them
247
+ wherever the spec is silent. The set is the SHAPE of a base project — stack base, folder
248
+ structure, packages, coding and test conventions, the framework's own types, and the
249
+ project team's technical requirements — not the architecture/persistence detail set plan
250
+ and implement load for features. NO domain file: a scaffold has no domain yet. -->
251
+ - guardrails/technology/{{backend_stack}}/technology-constitution.md
252
+ - guardrails/technology/{{backend_stack}}/folder-structure.md
253
+ - guardrails/technology/{{backend_stack}}/dependency-policy.md
254
+ - guardrails/technology/{{backend_stack}}/coding-standards.md
255
+ - guardrails/technology/{{backend_stack}}/framework-api-map.md
256
+ - guardrails/technology/{{backend_stack}}/testing.md
257
+ - guardrails/project-specific/service/technical-requirements.md
258
+
259
+ ## /aw-spec-foundation-frontend
260
+ <!-- The same for the FRONTEND lane: the lane base (ui-constitution, which carries the
261
+ mandatory frontend folder structure), how components are split and named, routing, the
262
+ design system, the generated API client the lane talks to the service through, the test
263
+ setup, and the project team's ui-requirements. Loaded INSTEAD of the backend set, never
264
+ on top of it — foundation swaps the standards between the two lanes. -->
265
+ - guardrails/technology/{{frontend_stack}}/ui-constitution.md
266
+ - guardrails/technology/{{frontend_stack}}/component-architecture.md
267
+ - guardrails/technology/{{frontend_stack}}/component-conventions.md
268
+ - guardrails/technology/{{frontend_stack}}/routing-navigation.md
269
+ - guardrails/technology/{{frontend_stack}}/design-system.md
270
+ - guardrails/technology/{{frontend_stack}}/api-client.md
271
+ - guardrails/technology/{{frontend_stack}}/frontend-testing.md
272
+ - guardrails/project-specific/frontend/ui-requirements.md
273
+
274
+ ---
275
+
276
+ ## Quick reference (command → technical file count)
277
+
278
+ | Command | Technical rule files | Role |
279
+ |---|---|---|
280
+ | /aw-spec-specify | 6 | the modelling methodology the spec is expressed in: DDD for the domain model (+ its example), and the four ux/ rules for the experience model it lifts as UX- ids — no technology |
281
+ | /aw-spec-plan-backend | 24 | architecture/security/interop the design author mediates the spec against, each with its example |
282
+ | /aw-spec-plan-frontend | 11 | the frontend lane's design set — composition, routing, client state, interaction states, forms, auth surface, design system, accessibility, i18n, performance, and the cross-lane API pairing the UI design author works from (from spec.md) |
283
+ | /aw-spec-implement-backend | 6 | governance/architecture the SERVICE lane builds against (from backend-plan.md), both paths |
284
+ | /aw-spec-implement-frontend | 13 | the FRONTEND lane's code-generation set (from frontend-plan.md), both paths — conventions, the generated client + its service pairing, auth, client security, states, forms, design system, accessibility, i18n, performance, observability and testing |
285
+ | /aw-spec-build | 3 | layering + coding rules the compile-fixer respects, + the layering example |
286
+ | /aw-spec-analyze-slice | 3 | testing + coding rules and the framework API map the design↔code gate validates against |
287
+ | /aw-spec-constitution | 18 | what the technical half ratifies — the technology base, the standard technical rules, and the project team's technical-requirements.md |
288
+ | /aw-spec-ui-constitution | 2 | what the frontend lane's half ratifies — the UI base + the project team's ui-requirements.md — and the signal that the lane exists |
289
+ | /aw-spec-run | 2 | persistence rules the execution / data-migration step generates against, + its example |
290
+ | /aw-spec-foundation-backend | 7 | what `foundation` builds the service lane's base project against when it is built from a spec rather than unpacked from a pack |
291
+ | /aw-spec-foundation-frontend | 8 | the same for the frontend lane — loaded instead of the backend set, never on top of it |
292
+
293
+ > All migrated workflows are on this map. The conformance-gate workflows **analyze-plan**
294
+ > and **analyze-plan-delta** are intentionally NOT here — they validate the plans / the delta
295
+ > against the spec + DOMAIN gate overlays only (domain-rule-bindings `## /aw-spec-gate`), with no
296
+ > technical gate checklist.
@@ -162,12 +162,63 @@ AAABAAE...
162
162
 
163
163
  ---
164
164
 
165
+ ## The rule file (`<pack name>.rules.json`)
166
+
167
+ Every file in a pack is unpacked as packed, and a file that is already there is replaced. A
168
+ pack that needs some files treated otherwise ships a rule file beside it, named after the
169
+ pack: `VerticalSlice.rules.json` for `VerticalSlice.pack.txt`,
170
+ `VerticalSlice.Reference.rules.json` for `VerticalSlice.Reference.pack.txt`. Without one, the
171
+ pack unpacks exactly as described above.
172
+
173
+ ```json
174
+ {
175
+ "format": "aw-spec-pack-rules/v1",
176
+ "rules": [
177
+ {
178
+ "path": "src/AppWeaver.VerticalSlice.Service/Infrastructure/ApplicationDbContext.cs",
179
+ "action": "merge",
180
+ "note": "why this file is merged — for the reader only",
181
+ "instruction": [
182
+ "Produce one ApplicationDbContext based on the EXISTING file:",
183
+ "- insert every INCOMING `public DbSet<...>` property right after the class's opening brace;",
184
+ "- keep everything else in the EXISTING file unchanged."
185
+ ]
186
+ },
187
+ { "path": "src/AppWeaver.VerticalSlice.Service/Features/", "action": "replace" }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ - **`path`** is written as the pack holds it, sentinel included, and is renamed the way the
193
+ pack's files are — one rule file serves every app name. A path ending in `/` covers every
194
+ pack file under that folder; a rule for a file wins over its folder's rule.
195
+ - **`action`** is `merge` or `replace`. `replace` writes the pack's file over the existing one,
196
+ which is also what happens to every file no rule names. `merge` applies only when the file is
197
+ already there (from the base project, or from the lane before a re-unpack); otherwise the
198
+ pack's file is simply written.
199
+ - **`instruction`** (required for `merge`; a string or a list of lines) tells the merging
200
+ agent how to combine the two versions. It sees the **EXISTING** file — the one in the lane
201
+ before this pack was unpacked — and the **INCOMING** file — the pack's own, with the sentinel
202
+ already renamed — and returns the merged file; the engine writes it.
203
+ - **`note`** is optional and ignored by the kit.
204
+
205
+ A rule file that does not parse, or a rule with an unknown action or a merge with no
206
+ instruction, stops that pack before anything is written: the base pack reports the lane "not
207
+ scaffolded", and a broken reference rule file leaves the sample out with the reason. A rule
208
+ whose path the pack does not hold is reported in the lane's line — a sign the pack changed
209
+ and the rule file was not updated with it.
210
+
211
+ ---
212
+
165
213
  ## How scaffolding consumes the bundle
166
214
 
167
- `/appweaver foundation VerticalSlice <AppName> [OutputDir]` runs `unpack-foundation.ps1`,
168
- which reads the sentinel from the pack header, derives the four target case forms, and
169
- writes the renamed files to the output directory (**repo root by default**). The phase is
170
- defined in `.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml`.
215
+ `/appweaver foundation` unpacks the pack a lane picks into that lane's **lane root folder**
216
+ (`backend/` by default) with `unpack-foundation.ps1` (or `.sh`), which reads the sentinel from
217
+ the pack header, derives the four target case forms, and writes the renamed files. Before it
218
+ runs, the pack's rule file is read and every file to be merged is put aside; after it, each
219
+ merge runs as its rule says. A reference sample, when the pack ships one and the operator
220
+ wants it, goes on top the same way with its own rule file. The steps are in
221
+ `.appweaver/orchestrator/modules/foundation-pack.orch.yaml`.
171
222
 
172
223
  ```powershell
173
224
  ./unpack-foundation.ps1 -PackFile ./VerticalSlice.pack.txt -TargetAppName AppWeaver.Health -OutDir ../../../
@@ -182,3 +233,6 @@ defined in `.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml`.
182
233
  - [ ] No `bin/obj/.vs` or local `.db` files committed into the pack.
183
234
  - [ ] `pack-foundation.ps1` reported a non-zero sentinel hit count.
184
235
  - [ ] `VerticalSlice.pack.txt` regenerated and committed after any change.
236
+ - [ ] Each pack's rule file names every file that must be merged rather than replaced (for a
237
+ reference sample: every file it shares with the base pack that is not a straight
238
+ replacement), and no rule names a path the pack no longer holds.
@@ -1,6 +1,6 @@
1
1
  # API Versioning Policy
2
2
 
3
- > Pure technology (domain-agnostic) — domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-plan`.
3
+ > Pure technology (domain-agnostic) — domain (e.g. FHIR) versioning in [[api-versioning.domain]]. Commands: `/aw-spec-plan-backend`.
4
4
 
5
5
  ## REST versioning
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Auditing & Observability Standards
2
2
 
3
- > Pure technology (domain-agnostic) — domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan`.
3
+ > Pure technology (domain-agnostic) — domain audit additions in [[auditing.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`.
4
4
 
5
5
  ## Observability baseline
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Authorization Standards
2
2
 
3
- > Pure technology (domain-agnostic) — domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan`.
3
+ > Pure technology (domain-agnostic) — domain roles & matrix in [[authorization.domain]]. NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`.
4
4
 
5
5
  ## Authorization model
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Clean Architecture Standards
2
2
 
3
- > Pure technology (domain-agnostic). NON-NEGOTIABLE. Commands: `/aw-spec-plan`, `/aw-spec-build`.
3
+ > Pure technology (domain-agnostic). NON-NEGOTIABLE. Commands: `/aw-spec-plan-backend`, `/aw-spec-build`.
4
4
 
5
5
  ## Dependency direction
6
6