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.
- package/assets/.agents/skills/appweaver/SKILL.md +7 -47
- package/assets/.appweaver/ORCH-DIALECT.md +13 -9
- package/assets/.appweaver/RULE-PARTITION.md +11 -12
- package/assets/.appweaver/STACK-PROFILES.md +260 -108
- package/assets/.appweaver/domain.json +1 -1
- package/assets/.appweaver/interpreter/run-skill.py +28 -7
- package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +38 -10
- package/assets/.appweaver/orchestrator/LAUNCHER.md +88 -0
- package/assets/.appweaver/orchestrator/README.md +120 -53
- package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +1 -1
- package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +17 -7
- package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +6 -4
- package/assets/.appweaver/orchestrator/modules/foundation-lane.orch.yaml +237 -0
- package/assets/.appweaver/orchestrator/modules/foundation-pack.orch.yaml +392 -0
- package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +548 -0
- package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/orchestrator.py +162 -63
- package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +5 -4
- package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +3 -1
- package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +21 -13
- package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +28 -31
- package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +2 -2
- package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +1 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +3 -3
- package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +4 -1
- package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +6 -4
- package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +41 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +17 -16
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +7 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +7 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +61 -12
- package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +1 -1
- package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +172 -293
- package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +253 -44
- package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +72 -71
- package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +38 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +4 -4
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +26 -2
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +21 -15
- package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +14 -14
- package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-model.orch.yaml +3 -3
- package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-prototype.orch.yaml +6 -6
- package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +371 -131
- package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +293 -76
- package/assets/.appweaver/scripts/python/aw-foundation.py +885 -20
- package/assets/.appweaver/scripts/python/aw-inventory.py +28 -21
- package/assets/.appweaver/scripts/python/aw-plan-coverage.py +2 -2
- package/assets/.appweaver/scripts/python/aw-rev-constitution.py +6 -6
- package/assets/.appweaver/scripts/python/aw-stack.py +676 -99
- package/assets/.appweaver/stack-profiles/angular.json +2 -1
- package/assets/.appweaver/stack-profiles/blazor-wasm.json +2 -1
- package/assets/.appweaver/stack-profiles/dotnet-webapi.json +18 -3
- package/assets/.appweaver/stack-profiles/go-chi.json +6 -1
- package/assets/.appweaver/stack-profiles/java-spring.json +14 -5
- package/assets/.appweaver/stack-profiles/nextjs.json +2 -1
- package/assets/.appweaver/stack-profiles/node-express.json +8 -2
- package/assets/.appweaver/stack-profiles/python-fastapi.json +9 -2
- package/assets/.appweaver/stack-profiles/react-vite.json +2 -1
- package/assets/.appweaver/stack-profiles/sveltekit.json +2 -1
- package/assets/.appweaver/stack-profiles/vue-vite.json +2 -1
- package/assets/.appweaver/stacks.json +40 -1
- package/assets/.appweaver/templates/constitution-ui-template.md +2 -2
- package/assets/.appweaver/templates/delta-design-template.md +7 -5
- package/assets/.appweaver/templates/design-template.md +3 -0
- package/assets/.appweaver/templates/ui-delta-design-template.md +1 -1
- package/assets/.appweaver/templates/ui-design-template.md +6 -4
- package/assets/.claude/skills/appweaver/SKILL.md +7 -46
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.rules.json +31 -0
- package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.lane.json +6 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.rules.json +16 -0
- package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.lane.json +6 -0
- package/assets/foundations/foundation.spec.template.txt +98 -0
- package/assets/foundations/java/Hexagonal/Hexagonal.lane.json +6 -0
- package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +8 -1
- package/assets/foundations/java/Hexagonal/unpack-foundation.sh +4 -5
- package/assets/foundations/node/NextAppRouter/NextAppRouter.spec.txt +68 -0
- package/assets/guardrails/README.md +31 -17
- package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain-rule-bindings.md +25 -13
- package/assets/guardrails/project-specific/tech-rule-bindings.md +296 -0
- package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +58 -4
- package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/auditing.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/authorization.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/cqrs.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/data-classification.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/eventing.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/framework-api-map.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/persistence.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +1 -1
- package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +1 -1
- package/assets/guardrails/technology/nextjs/accessibility-implementation.md +1 -1
- package/assets/guardrails/technology/nextjs/api-client.md +1 -1
- package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +1 -1
- package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +1 -1
- package/assets/guardrails/technology/nextjs/auth-session.md +1 -1
- package/assets/guardrails/technology/nextjs/client-security.md +1 -1
- package/assets/guardrails/technology/nextjs/component-architecture.md +1 -1
- package/assets/guardrails/technology/nextjs/component-conventions.md +2 -2
- package/assets/guardrails/technology/nextjs/design-system.md +1 -1
- package/assets/guardrails/technology/nextjs/error-handling.md +1 -1
- package/assets/guardrails/technology/nextjs/forms-and-validation.md +1 -1
- package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
- package/assets/guardrails/technology/nextjs/i18n.md +1 -1
- package/assets/guardrails/technology/nextjs/observability.md +1 -1
- package/assets/guardrails/technology/nextjs/performance-budgets.md +1 -1
- package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
- package/assets/guardrails/technology/nextjs/state-management.md +1 -1
- package/assets/guardrails/technology/nextjs/ui-constitution.md +3 -3
- package/package.json +1 -1
- package/assets/.agents/skills/appweaver-demo/SKILL.md +0 -59
- package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +0 -6
- package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +0 -100
- package/assets/.claude/skills/appweaver-demo/SKILL.md +0 -59
- package/assets/.kilocode/agent.json +0 -28
- package/assets/.kilocode/workflows/appweaver-demo.md +0 -59
- package/assets/.kilocode/workflows/appweaver.md +0 -55
- package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +0 -271
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain/domain-requirements.md +0 -0
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/frontend/ui-requirements.md +0 -0
- /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/service/technical-requirements.md +0 -0
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
placeholder for a service/ file the author actually generated from THIS
|
|
8
8
|
project's CODE.
|
|
9
9
|
|
|
10
|
-
Wire ONLY files you generated (all under guardrails/
|
|
10
|
+
Wire ONLY files you generated (all under guardrails/[project]/service/).
|
|
11
11
|
Never list a file you did not write. Never list a path belonging to another
|
|
12
|
-
project (guardrails/
|
|
12
|
+
project (any other project folder under guardrails/, e.g. guardrails/project-specific/**) — that one is another project's
|
|
13
13
|
rules, not this one's.
|
|
14
14
|
-->
|
|
15
15
|
# [PROJECT_NAME] — Command → Technical-Rule-File Map (as-built)
|
|
@@ -21,12 +21,16 @@ files), and the CODE-DERIVED replacement for the greenfield technical map.
|
|
|
21
21
|
|
|
22
22
|
**The model:** the technical rule files (this project's own architecture / persistence /
|
|
23
23
|
concurrency / testing / security-posture set, reverse-engineered from the code into
|
|
24
|
-
`guardrails/
|
|
24
|
+
`guardrails/[project]/service/`) are CONFIGURATION — tune this map, not the workflows. The
|
|
25
25
|
technology base itself (`constitution.technical.md`) is NOT listed here — every consumer still
|
|
26
26
|
refers to it directly, as-is.
|
|
27
27
|
|
|
28
|
-
- All paths are workspace-relative and live in `guardrails/
|
|
28
|
+
- All paths are workspace-relative and live in `guardrails/[project]/service/`.
|
|
29
29
|
- `resolve-tech --command <name>` collects the `- ` bullets under `## /<name>`.
|
|
30
|
+
- `plan`, `implement` and `adopt` are keyed per lane, not per command: the service lane's set
|
|
31
|
+
sits under `## /aw-spec-<command>-backend`, the frontend lane's under
|
|
32
|
+
`## /aw-spec-<command>-frontend` (adopt reverses a frontend plan under
|
|
33
|
+
`## /aw-spec-plan-frontend`, so it has no frontend heading of its own).
|
|
30
34
|
- **`## /aw-spec-specify` is the MODELLING-METHODOLOGY slot** — exactly one file,
|
|
31
35
|
`service/domain-modelling.md`: HOW this code expresses a domain model. Never an architecture /
|
|
32
36
|
persistence / codegen / security file; those would break specify's domain purity. Every other
|
|
@@ -41,39 +45,33 @@ refers to it directly, as-is.
|
|
|
41
45
|
(what marks an aggregate root, entity vs value object, where invariants live, the context
|
|
42
46
|
boundary), NOT what the model is (that is the domain set's domain-model.domain.md, wired
|
|
43
47
|
via domain-rule-bindings). No technology rule may appear under this heading. -->
|
|
44
|
-
- guardrails/
|
|
48
|
+
- guardrails/[project]/service/domain-modelling.md
|
|
45
49
|
|
|
46
|
-
## /aw-spec-plan
|
|
50
|
+
## /aw-spec-plan-backend
|
|
47
51
|
<!-- The as-built architecture / cross-cutting technical rules the SERVICE lane's plan author
|
|
48
52
|
mediates the spec against. NO domain file here — domain reaches plan only as spec ids and
|
|
49
53
|
the context's domain-model.md. -->
|
|
50
|
-
- guardrails/
|
|
51
|
-
- guardrails/
|
|
54
|
+
- guardrails/[project]/service/[as-built-architecture].md
|
|
55
|
+
- guardrails/[project]/service/[each generated architecture/cross-cutting rule].md
|
|
52
56
|
|
|
53
|
-
## /aw-spec-implement
|
|
57
|
+
## /aw-spec-implement-backend
|
|
54
58
|
<!-- The framework / code-generation rule set the SERVICE lane's generator builds against
|
|
55
|
-
(from backend-plan.md). -->
|
|
56
|
-
- guardrails/
|
|
57
|
-
|
|
58
|
-
## /aw-spec-implement-delta
|
|
59
|
-
<!-- The same set for the service lane on the DELTA path. `implement` is one command: it keys
|
|
60
|
-
this heading when it is generating a change's delta plan and the one above when it is
|
|
61
|
-
generating the master, so repeat the bullets here to keep both paths identical. -->
|
|
62
|
-
- guardrails/projects/[project]/service/[each generated codegen/convention rule].md
|
|
59
|
+
(from backend-plan.md), on both the master and the delta path. -->
|
|
60
|
+
- guardrails/[project]/service/[each generated codegen/convention rule].md
|
|
63
61
|
|
|
64
62
|
## /aw-spec-build
|
|
65
63
|
<!-- The layering + convention rules the compile-fixer respects. -->
|
|
66
|
-
- guardrails/
|
|
64
|
+
- guardrails/[project]/service/[as-built-architecture].md
|
|
67
65
|
|
|
68
66
|
## /aw-spec-analyze-slice
|
|
69
67
|
<!-- The plan↔code conformance gate's TECHNICAL checklist (validate, don't author). -->
|
|
70
|
-
- guardrails/
|
|
68
|
+
- guardrails/[project]/service/[testing/convention rule to validate against].md
|
|
71
69
|
|
|
72
|
-
## /aw-spec-adopt
|
|
70
|
+
## /aw-spec-adopt-backend
|
|
73
71
|
<!-- Brownfield reverse-engineering: the technical REFERENCE set the reversed BACKEND plan
|
|
74
72
|
mediates the reversed spec ↔ existing code against — the CODE wins, these are reference
|
|
75
|
-
only. A slice's reversed frontend-plan.md is authored under `## /aw-spec-plan-
|
|
76
|
-
- guardrails/
|
|
73
|
+
only. A slice's reversed frontend-plan.md is authored under `## /aw-spec-plan-frontend`. -->
|
|
74
|
+
- guardrails/[project]/service/[architecture/cross-cutting reference rule].md
|
|
77
75
|
|
|
78
76
|
## /aw-spec-constitution
|
|
79
77
|
<!-- The set the TECHNICAL half of the split constitution is RE-ratified from when /appweaver
|
|
@@ -84,25 +82,25 @@ refers to it directly, as-is.
|
|
|
84
82
|
service/ files that carry a ratifiable standard, NOT every generated file, and NO worked examples/
|
|
85
83
|
sample (the ratified half is one declarative line per principle). NO domain file — the domain
|
|
86
84
|
half's sources are the DOMAIN map's ## /aw-spec-constitution. -->
|
|
87
|
-
- guardrails/
|
|
85
|
+
- guardrails/[project]/service/[ratifiable technical standard].md
|
|
88
86
|
|
|
89
87
|
## /aw-spec-run
|
|
90
88
|
<!-- The runtime / execution conventions the app-run step honors — add ONLY if the code evidences
|
|
91
89
|
a runtime/hosting concern file. NOT data-migration (migration is the deferred later phase). -->
|
|
92
|
-
- guardrails/
|
|
90
|
+
- guardrails/[project]/service/[runtime/hosting rule].md
|
|
93
91
|
|
|
94
92
|
<!-- THE FRONTEND LANE'S THREE HEADINGS. They are NOT written by the step that authors this
|
|
95
93
|
map; onboard's frontend rule-set step APPENDS them here, after the technical headings and
|
|
96
94
|
before the quick-reference table, and only where a UI lane is declared. A backend-only
|
|
97
95
|
repo never gets them.
|
|
98
|
-
## /aw-spec-ui-constitution
|
|
96
|
+
## /aw-spec-ui-constitution — the ratifiable lane standards (frontend/ui-constitution.md
|
|
99
97
|
first). Also the authoritative signal that this project HAS a frontend lane: a later
|
|
100
98
|
/appweaver constitution reads it to decide whether to author constitution.ui.md.
|
|
101
|
-
## /aw-spec-plan-
|
|
99
|
+
## /aw-spec-plan-frontend — the lane rules the FRONTEND lane of `plan` authors
|
|
102
100
|
frontend-plan.md against: composition, navigation, client state, interaction states,
|
|
103
101
|
forms, accessibility, the published-surface binding. `adopt` reverses a slice's
|
|
104
102
|
frontend-plan.md under the same set.
|
|
105
|
-
## /aw-spec-implement-
|
|
103
|
+
## /aw-spec-implement-frontend — the lane rules the FRONTEND lane of `implement` generates
|
|
106
104
|
code against, on both the master and the delta path: component conventions, state and
|
|
107
105
|
data fetching, styling, forms, testing.
|
|
108
106
|
A file carrying both a planning half and a generating half is listed under both; the lane
|
|
@@ -120,11 +118,10 @@ refers to it directly, as-is.
|
|
|
120
118
|
| Command | Technical rule files | Role |
|
|
121
119
|
|---|---|---|
|
|
122
120
|
| /aw-spec-specify | 1 | the as-built modelling methodology the domain model is expressed in — no technology |
|
|
123
|
-
| /aw-spec-plan | [n] | as-built architecture the service lane's plan author mediates the spec against |
|
|
124
|
-
| /aw-spec-implement | [n] | code-generation set the service lane builds against (from backend-plan.md) |
|
|
125
|
-
| /aw-spec-implement-delta | [n] | the same set for the service lane when implement is generating a change's delta plan |
|
|
121
|
+
| /aw-spec-plan-backend | [n] | as-built architecture the service lane's plan author mediates the spec against |
|
|
122
|
+
| /aw-spec-implement-backend | [n] | code-generation set the service lane builds against (from backend-plan.md), both paths |
|
|
126
123
|
| /aw-spec-build | [n] | layering + convention rules the compile-fixer respects |
|
|
127
124
|
| /aw-spec-analyze-slice | [n] | conformance rules the plan↔code gate validates against |
|
|
128
|
-
| /aw-spec-adopt | [n] | technical reference set for the reversed backend plan (brownfield) |
|
|
125
|
+
| /aw-spec-adopt-backend | [n] | technical reference set for the reversed backend plan (brownfield) |
|
|
129
126
|
| /aw-spec-constitution | [n] | the standards the technical constitution half is re-ratified from |
|
|
130
127
|
| /aw-spec-run | [n] | runtime/execution conventions the app-run step honors (only if evidenced) |
|
|
@@ -46,8 +46,8 @@ Sync Impact Report
|
|
|
46
46
|
- …
|
|
47
47
|
- Dependent artifacts:
|
|
48
48
|
- constitution.domain.md — ⚠ authored next; continues at [N+1]
|
|
49
|
-
- guardrails/
|
|
50
|
-
- guardrails/
|
|
49
|
+
- guardrails/[project]/domain/domain-constitution.md — [✅/⚠] domain charter source
|
|
50
|
+
- guardrails/[project]/service/ — [✅/⚠] technical rule set
|
|
51
51
|
- TODOs: [none mechanical | …]
|
|
52
52
|
-->
|
|
53
53
|
# [PROJECT_NAME] Constitution — Technical Base
|
|
@@ -6,7 +6,7 @@ concern: "[concern-slug]"
|
|
|
6
6
|
<!--
|
|
7
7
|
rev-templates/technical-rule-file.skeleton.md — SHAPE-ONLY reference for ONE
|
|
8
8
|
generated technical rule file in the project's service/ folder
|
|
9
|
-
(guardrails/
|
|
9
|
+
(guardrails/[project]/service/<concern>.md). It is the TECHNICAL twin of
|
|
10
10
|
domain-rule-file.skeleton.md. Write one such file per TECHNOLOGY concern the
|
|
11
11
|
CODE ACTUALLY exhibits (evidenced-only, lean) — e.g. as-built-architecture,
|
|
12
12
|
persistence, concurrency, testing, security-posture, api-surface, eventing,
|
|
@@ -59,8 +59,8 @@ Sync Impact Report
|
|
|
59
59
|
- Experience concerns DELIBERATELY OMITTED (lack of as-built evidence):
|
|
60
60
|
- [CONCERN] — [what the code shows instead, or that it shows nothing]
|
|
61
61
|
- Dependent artifacts:
|
|
62
|
-
- guardrails/
|
|
63
|
-
- guardrails/
|
|
62
|
+
- guardrails/[project]/frontend/ — [✅/⚠] generated lane rule set
|
|
63
|
+
- guardrails/[project]/tech-rule-bindings.md — [✅/⚠] `## /aw-spec-ui-constitution`
|
|
64
64
|
- TODOs: [none mechanical | …]
|
|
65
65
|
-->
|
|
66
66
|
# [PROJECT_NAME] Constitution — User Experience Base
|
|
@@ -103,7 +103,7 @@ Sync Impact Report
|
|
|
103
103
|
<!-- Form: the lane's AS-BUILT layout under its own root — where components, screens/pages,
|
|
104
104
|
routing, client state, styling and assets actually live, named as THIS code names them.
|
|
105
105
|
Do not impose a folder taxonomy the code does not use. This layout sits entirely under
|
|
106
|
-
the lane
|
|
106
|
+
the lane root folder and never adds to the service lane's structure. -->
|
|
107
107
|
|
|
108
108
|
## [UI_CONVENTIONS_SECTION_NAME]
|
|
109
109
|
|
|
@@ -80,11 +80,14 @@ it serves.]
|
|
|
80
80
|
|
|
81
81
|
<!-- New screens, components, state, interactions or contract bindings.
|
|
82
82
|
"Section" names a section of THIS project's master frontend plan — the same
|
|
83
|
-
section titles the generated frontend plan template carries.
|
|
83
|
+
section titles the generated frontend plan template carries. A binding row's
|
|
84
|
+
element LEADS with the operation id the service names the endpoint by — implement
|
|
85
|
+
checks it against the exported API document. -->
|
|
84
86
|
|
|
85
87
|
| Section (§ in frontend-plan.md) | Element | Kind | Serves |
|
|
86
88
|
|---|---|---|---|
|
|
87
89
|
| [§ of the master's own structure] | `[element]` | [screen / component / state / binding] | US-[n] · FR-[nnn] |
|
|
90
|
+
| Contract Binding (§5) | `[OperationId]` · `[VERB] [/route]` | binding | IC-[nnn] |
|
|
88
91
|
|
|
89
92
|
## MODIFIED — existing UI elements
|
|
90
93
|
|
|
@@ -222,11 +222,13 @@ does none.]
|
|
|
222
222
|
the API contracts backend-plan.md states — never its internals: no table,
|
|
223
223
|
handler or persistence assumption crosses this line. Where the surface does
|
|
224
224
|
not name an operation yet, bind against the spec's own IC-/FR- surface and
|
|
225
|
-
record that as a §8 assumption.
|
|
225
|
+
record that as a §8 assumption. The OPERATION ID is the endpoint's name in the
|
|
226
|
+
service's published API document (as backend-plan.md records it) — implement
|
|
227
|
+
finds the endpoint by it; `—` where none is named yet. -->
|
|
226
228
|
|
|
227
|
-
| Screen / component | Operation (from the contract) | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
|
|
228
|
-
|
|
229
|
-
| `[Screen]` | `[operation]` | [field: type, …] | [field: type, …] | [§4 state] | FR-00X · IC-00X |
|
|
229
|
+
| Screen / component | Operation id | Operation (from the contract) | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
|
|
230
|
+
|---|---|---|---|---|---|---|
|
|
231
|
+
| `[Screen]` | `[OperationId]` | `[operation]` | [field: type, …] | [field: type, …] | [§4 state] | FR-00X · IC-00X |
|
|
230
232
|
|
|
231
233
|
**Contract deltas needed**: [anything the experience requires that the contract
|
|
232
234
|
does not offer — raised back to the service lane, never worked around in the
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
# Exercises every extended construct in one run: inputs, set (raw object),
|
|
6
6
|
# execute_script (read-only subcommand), verify_context gates, ask
|
|
7
7
|
# (non-interactive default), foreach + while loops + break, agent_query
|
|
8
|
-
# (mock:), agent_author (mock content), build_context,
|
|
9
|
-
#
|
|
8
|
+
# (mock:), agent_author (mock content), build_context, agent_generate (the
|
|
9
|
+
# mock writes SmokeGenerated.cs), agent_review (mock: pass when the files
|
|
10
|
+
# exist), include (domain-select module), dispatch_hooks (empty).
|
|
10
11
|
#
|
|
11
12
|
# Run:
|
|
12
13
|
# python3 .appweaver/orchestrator/orchestrator.py \
|
|
13
14
|
# .appweaver/orchestrator/workflows/_smoke.orch.yaml --non-interactive --json
|
|
14
|
-
# Expected: status ok, echo=hello, sum of foreach passes, smoke.md
|
|
15
|
+
# Expected: status ok, echo=hello, sum of foreach passes, smoke.md and
|
|
16
|
+
# SmokeGenerated.cs written, review_pass=true.
|
|
15
17
|
# =============================================================================
|
|
16
18
|
|
|
17
19
|
name: orch-smoke
|
|
@@ -138,6 +140,40 @@ workflow:
|
|
|
138
140
|
action: verify_context
|
|
139
141
|
required_files: ["{{out_dir}}/smoke.md"]
|
|
140
142
|
|
|
143
|
+
# agent_generate — the edit step: the agent writes the file itself and reports
|
|
144
|
+
# files[]. The mock names the file after the task's first `backtick` word and
|
|
145
|
+
# writes it under out_dir; a reported path not on disk is dropped before binding,
|
|
146
|
+
# so the non-empty gate proves the file was written.
|
|
147
|
+
- id: gen_file
|
|
148
|
+
action: agent_generate
|
|
149
|
+
tools: "Read,Write,Edit"
|
|
150
|
+
permission_mode: acceptEdits
|
|
151
|
+
task: |
|
|
152
|
+
Write exactly one file, {{out_dir}}/SmokeGenerated.cs, holding the single
|
|
153
|
+
line `SmokeGenerated` and nothing else. Write nothing outside {{out_dir}}.
|
|
154
|
+
outputs:
|
|
155
|
+
- { name: gen_files, from: "$.files" }
|
|
156
|
+
- id: gate_gen
|
|
157
|
+
action: verify_context
|
|
158
|
+
require_non_empty: gen_files
|
|
159
|
+
on_empty: stop
|
|
160
|
+
on_empty_message: "agent_generate wrote nothing, or files[] binding is broken"
|
|
161
|
+
|
|
162
|
+
# agent_review — read-only review of the files the generation reported; the
|
|
163
|
+
# mock passes when every reviewed file exists
|
|
164
|
+
- id: review_file
|
|
165
|
+
action: agent_review
|
|
166
|
+
review_of_var: gen_files
|
|
167
|
+
task: Check that the file holds the single line SmokeGenerated. Decide pass/fail.
|
|
168
|
+
outputs:
|
|
169
|
+
- { name: review_pass, from: "$.pass" }
|
|
170
|
+
- { name: review_issues, from: "$.issues" }
|
|
171
|
+
- id: gate_review
|
|
172
|
+
action: verify_context
|
|
173
|
+
require_true: review_pass
|
|
174
|
+
on_false: stop
|
|
175
|
+
on_false_message: "agent_review result binding is broken"
|
|
176
|
+
|
|
141
177
|
# F9: include — the shared domain-select module (read-only script + asks;
|
|
142
178
|
# non-interactive: gate→continue, mode→all)
|
|
143
179
|
- id: domain
|
|
@@ -156,5 +192,7 @@ outputs:
|
|
|
156
192
|
mode: "{{mode}}"
|
|
157
193
|
seen: "{{seen}}"
|
|
158
194
|
q_items: "{{q_items}}"
|
|
195
|
+
generated: "{{gen_files}}"
|
|
196
|
+
review_pass: "{{review_pass}}"
|
|
159
197
|
domain: "{{domain}}"
|
|
160
198
|
note: "all engine constructs exercised"
|
|
@@ -141,7 +141,7 @@ workflow:
|
|
|
141
141
|
on_false: stop
|
|
142
142
|
on_false_message: >
|
|
143
143
|
No .NET host/startup project found — nothing named Program.cs under `{{host_search}}`,
|
|
144
|
-
the
|
|
144
|
+
the lane root folder the backend lane declares, nor elsewhere in this repository. Wiring a
|
|
145
145
|
component means editing a host project's startup registration, so there has to be one
|
|
146
146
|
to edit. If this is a .NET repository, scaffold it first with /appweaver foundation.
|
|
147
147
|
If it is not — this lane's ecosystem is `{{host_eco}}` — then this catalogue's runbooks
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
# active_version.json (v1.0) so the CR loop works immediately after.
|
|
38
38
|
#
|
|
39
39
|
# GOVERNANCE RECONCILE (the JIT contract, gap-fix #1) — ⏸ HELD, OFF BY DEFAULT.
|
|
40
|
-
# onboard established the PROJECT constitution + guardrails
|
|
40
|
+
# onboard established the PROJECT constitution + guardrails/<project>/ rule set
|
|
41
41
|
# from the whole-repo SCAN, with per-feature specifics marked PROVISIONAL. The reconcile
|
|
42
42
|
# block below carries this feature's real evidence (BR-/CN-/DC-/IC- ids, code coordinates)
|
|
43
43
|
# INTO that scaffold — upgrading provisional → evidenced. It RECONCILES, never re-authors:
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
#
|
|
56
56
|
# Adopt does NOT generate code and does NOT modify source — writes land under
|
|
57
57
|
# specs/<Context>/<Feature>/, in the context's specs/<Context>/domain-model.md, and in the
|
|
58
|
-
# aggregate's OKF concept; the constitution halves and guardrails
|
|
58
|
+
# aggregate's OKF concept; the constitution halves and guardrails/<project>/ are
|
|
59
59
|
# written only when the reconcile block below is enabled.
|
|
60
60
|
# Fidelity checks spec/design ↔ CODE; the Adopt review is REPORTED for out-of-band
|
|
61
61
|
# closure — it blocks only on structural failures (unmapped code / fabricated spec/design).
|
|
@@ -111,7 +111,7 @@ scripts:
|
|
|
111
111
|
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The TECHNICAL/
|
|
112
112
|
# architecture set for the reversed DESIGN step (mirrors aw-spec-design) is no longer
|
|
113
113
|
# hardcoded here — it is now CONFIGURATION, loaded per-command from
|
|
114
|
-
# guardrails
|
|
114
|
+
# guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-adopt-backend" by the
|
|
115
115
|
# tech-select module (see the tech_select step below). The reversed SPEC step runs
|
|
116
116
|
# include_standards:false and takes its domain frame from constitution.domain.md via
|
|
117
117
|
# build_context — so design never sees a domain rule file (rule partition preserved); the
|
|
@@ -335,7 +335,7 @@ workflow:
|
|
|
335
335
|
on_false_message: "No concept for the aggregate '{{aggregate_primary}}' — the one feature '{{feature_name}}' acts on — in the onboard bundle under {{bundle_dir}}. If its bounded context has not been onboarded, run /appweaver onboard <Context> first; {{bundle_dir}}/aggregates/index.md lists each aggregate with the features that act on it. If '{{feature_name}}' is a NEW feature (no existing code), do NOT adopt it — author it through the forward pipeline (/appweaver specify → plan → implement), which onboard already made brownfield-ready."
|
|
336
336
|
|
|
337
337
|
# Governance prerequisite: the reverse steps below are authored AGAINST the project
|
|
338
|
-
# onboard established (the constitution halves + guardrails
|
|
338
|
+
# onboard established (the constitution halves + guardrails/<project>/ rule set).
|
|
339
339
|
# Resolve the active domain now and require its rule map to exist — without it there is
|
|
340
340
|
# no code-derived rule set for tech_select to load, no domain frame for the reversed
|
|
341
341
|
# spec, and nothing for the reconcile block to upgrade when it is enabled. Reconciling
|
|
@@ -363,10 +363,10 @@ workflow:
|
|
|
363
363
|
action: verify_context
|
|
364
364
|
require_true: rulemap_exists
|
|
365
365
|
on_false: stop
|
|
366
|
-
on_false_message: "No active governance for adopt to work against — run /appweaver onboard first. onboard establishes the PROJECT constitution + guardrails
|
|
366
|
+
on_false_message: "No active governance for adopt to work against — run /appweaver onboard first. onboard establishes the PROJECT constitution + guardrails/<project>/ rule set (provisional-from-scan) and activates it. Reversing '{{feature_name}}' without that scaffold would author the spec and design against no code-derived rules at all, and leave them with no governance home."
|
|
367
367
|
|
|
368
368
|
# TECHNICAL rule files → sticky standards (configuration, not hardcoded). tech-select
|
|
369
|
-
# reads guardrails
|
|
369
|
+
# reads guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-adopt-backend" and
|
|
370
370
|
# loads that reference set into the sticky standards for reverse_plan
|
|
371
371
|
# (include_standards:true) — the reversed SPEC and MODEL steps turn it off
|
|
372
372
|
# (include_standards:false), keeping them free of architecture (rule partition). No domain
|
|
@@ -377,7 +377,7 @@ workflow:
|
|
|
377
377
|
- id: tech_select
|
|
378
378
|
action: include
|
|
379
379
|
module: .appweaver/orchestrator/modules/tech-select.orch.yaml
|
|
380
|
-
with: { command: aw-spec-adopt }
|
|
380
|
+
with: { command: aw-spec-adopt-backend }
|
|
381
381
|
|
|
382
382
|
# 2. Scaffold the living docs. The SPEC reuses the forward spec-template (it is
|
|
383
383
|
# tech-agnostic WHAT/WHY — no architectural bias). The BACKEND PLAN scaffolds from the
|
|
@@ -821,13 +821,13 @@ workflow:
|
|
|
821
821
|
# THE FRONTEND'S RULES REPLACE THE BACKEND'S before the lane's plan is authored — the
|
|
822
822
|
# swap the forward `plan` makes at the same boundary. Sticky standards only accumulate,
|
|
823
823
|
# so without it the UI plan was authored under the service rule set and none of the
|
|
824
|
-
# lane's own. `## /aw-spec-plan-
|
|
824
|
+
# lane's own. `## /aw-spec-plan-frontend` is the set the forward plan authors this same
|
|
825
825
|
# document under, so a reversed frontend plan and a planned one answer to one rule set.
|
|
826
826
|
- id: tech_select_ui
|
|
827
827
|
condition: "{{ui_lane}} == true"
|
|
828
828
|
action: include
|
|
829
829
|
module: .appweaver/orchestrator/modules/tech-select.orch.yaml
|
|
830
|
-
with: { command: aw-spec-plan-
|
|
830
|
+
with: { command: aw-spec-plan-frontend, replace: "true" }
|
|
831
831
|
|
|
832
832
|
- id: ctx_reverse_ui_plan
|
|
833
833
|
condition: "{{ui_lane}} == true"
|
|
@@ -1058,6 +1058,7 @@ workflow:
|
|
|
1058
1058
|
action: agent_generate
|
|
1059
1059
|
tools: "Read,Write,Edit"
|
|
1060
1060
|
permission_mode: acceptEdits
|
|
1061
|
+
include_standards: false # the lane rule sets are for the plans; the concept is the aggregate's, in neither lane
|
|
1061
1062
|
task: |
|
|
1062
1063
|
COMPLETE the OKF concept of the aggregate '{{aggregate_primary}}' at {{concept_path}} —
|
|
1063
1064
|
the aggregate this run adopted the feature '{{feature_name}}' over. onboard wrote it
|
|
@@ -1119,7 +1120,7 @@ workflow:
|
|
|
1119
1120
|
# ═══════════ GOVERNANCE RECONCILE — upgrade onboard's PROVISIONAL scaffold ═══
|
|
1120
1121
|
# ⏸ HELD 2026-07-29: every step in this block is gated on `reconcile_governance`
|
|
1121
1122
|
# (default "false"), so adopt currently does NOT touch the constitution halves
|
|
1122
|
-
# or the guardrails
|
|
1123
|
+
# or the guardrails/<project>/ rule set — onboard's provisional scaffold
|
|
1123
1124
|
# is left as-is. Flip the var to "true" (workflow vars) to restore the behaviour.
|
|
1124
1125
|
# Now that this feature is reversed to a TRUSTWORTHY spec (real BR-/CN-/DC-/IC- ids)
|
|
1125
1126
|
# + design (real code coordinates), reconcile that evidence INTO the governance
|
|
@@ -1145,7 +1146,7 @@ workflow:
|
|
|
1145
1146
|
- { path: "{{spec_file}}" } # the feature's real BR-/CN-/DC-/IC-
|
|
1146
1147
|
- { path: "{{backend_plan}}" }
|
|
1147
1148
|
- { path: "{{feature_dir}}/source-map.md" }
|
|
1148
|
-
- { path: "guardrails/
|
|
1149
|
+
- { path: "guardrails/{{gov_domain}}/domain-rule-bindings.md", optional: true }
|
|
1149
1150
|
- { path: .appweaver/RULE-PARTITION.md } # the rule-partition authority (which command reads what)
|
|
1150
1151
|
- id: reconcile_pack
|
|
1151
1152
|
condition: "{{reconcile_governance}} == true" # HELD — governance reconcile paused (see vars)
|
|
@@ -1153,12 +1154,12 @@ workflow:
|
|
|
1153
1154
|
tools: "Read,Write,Edit"
|
|
1154
1155
|
permission_mode: acceptEdits
|
|
1155
1156
|
task: |
|
|
1156
|
-
RECONCILE the domain rule-file set in guardrails/
|
|
1157
|
+
RECONCILE the domain rule-file set in guardrails/{{gov_domain}}/domain/ with the
|
|
1157
1158
|
newly-adopted feature '{{feature_name}}'. onboard authored these rule files from the
|
|
1158
1159
|
whole-repo scan with per-feature specifics marked `PROVISIONAL — reconciled at
|
|
1159
1160
|
adopt`. READ this feature's reversed spec.md + backend-plan.md + source-map.md (in
|
|
1160
1161
|
context — the real evidence) and the EXISTING rule files under
|
|
1161
|
-
guardrails/
|
|
1162
|
+
guardrails/{{gov_domain}}/.
|
|
1162
1163
|
|
|
1163
1164
|
RECONCILE, do NOT re-author:
|
|
1164
1165
|
- UPGRADE the provisional entries this feature now evidences: replace a
|
|
@@ -1174,7 +1175,7 @@ workflow:
|
|
|
1174
1175
|
- Preserve the RULE PARTITION in domain-rule-bindings.md (constitution / specify / gate get
|
|
1175
1176
|
the domain files; design / implement get None). Keep each file's frontmatter and
|
|
1176
1177
|
note in `generated_by` that adopt reconciled '{{feature_name}}'.
|
|
1177
|
-
Write ONLY inside guardrails/
|
|
1178
|
+
Write ONLY inside guardrails/{{gov_domain}}/. Report the files changed/added.
|
|
1178
1179
|
outputs:
|
|
1179
1180
|
- { name: pack_reconciled, from: "$.files" }
|
|
1180
1181
|
|
|
@@ -1250,7 +1251,7 @@ workflow:
|
|
|
1250
1251
|
- { path: "{{constitution_domain_file}}" }
|
|
1251
1252
|
- { path: "{{constitution_technical_file}}" }
|
|
1252
1253
|
- { path: "{{spec_file}}" }
|
|
1253
|
-
- { path: "guardrails/
|
|
1254
|
+
- { path: "guardrails/{{gov_domain}}/domain-rule-bindings.md", optional: true }
|
|
1254
1255
|
- id: reconcile_domain
|
|
1255
1256
|
condition: "{{reconcile_governance}} == true" # HELD — governance reconcile paused (see vars)
|
|
1256
1257
|
action: agent_author
|
|
@@ -1351,4 +1352,4 @@ outputs:
|
|
|
1351
1352
|
composed_file: "{{composed_file}}"
|
|
1352
1353
|
technical_reconcile_ok: "{{technical_ok}}"
|
|
1353
1354
|
domain_reconcile_ok: "{{domain_ok}}"
|
|
1354
|
-
next: "Adopted {{feature_name}} (spec.md + backend-plan.md + source-map.md, v1.0) and wrote {{aggregate_sections}} — the model section(s) for the aggregate(s) it acts on, resolved from the {{aggregate_source}} — in the bounded context `{{context}}`'s shared {{domain_model}}. The spec cites BR-nnn by id, the model carries their text, so this slice is checkable by the same gates as a greenfield one and analyze-plan's check 4 now has a model to check against. A section another feature over the same aggregate wrote first was EXTENDED, never duplicated; every other section is untouched. COMPLETED the OKF concept of {{aggregate_primary}} (deepened + linked the deep artifacts; {{xref_edge_count}} cross-slice edge(s) recorded). UI HALF: ui_lane={{ui_lane}} — where it is true this slice also has frontend-plan.md, reversed from the {{ui_count}} UI file(s) the feature map attributes to it; where it is false the repo declared no frontend lane, or this aggregate owns no part of its surface, and a service-only adoption is the correct outcome rather than a gap. In the second case, where a frontend lane IS declared, the feature records lanes=[backend] in its active_version.json (feature_lanes shows it), so plan and the analyze gates treat the frontend lane as absent for THIS feature; run `aw-spec-actions feature-lanes --clear` if it later gains a UI. The SHARED UI surface (app shell, layout, design system) belongs to no slice and stays in {{bundle_dir}}/architecture/frontend.md. NOTE — governance reconcile is currently HELD (reconcile_governance=false): this run did NOT modify the constitution halves or the guardrails/
|
|
1355
|
+
next: "Adopted {{feature_name}} (spec.md + backend-plan.md + source-map.md, v1.0) and wrote {{aggregate_sections}} — the model section(s) for the aggregate(s) it acts on, resolved from the {{aggregate_source}} — in the bounded context `{{context}}`'s shared {{domain_model}}. The spec cites BR-nnn by id, the model carries their text, so this slice is checkable by the same gates as a greenfield one and analyze-plan's check 4 now has a model to check against. A section another feature over the same aggregate wrote first was EXTENDED, never duplicated; every other section is untouched. COMPLETED the OKF concept of {{aggregate_primary}} (deepened + linked the deep artifacts; {{xref_edge_count}} cross-slice edge(s) recorded). UI HALF: ui_lane={{ui_lane}} — where it is true this slice also has frontend-plan.md, reversed from the {{ui_count}} UI file(s) the feature map attributes to it; where it is false the repo declared no frontend lane, or this aggregate owns no part of its surface, and a service-only adoption is the correct outcome rather than a gap. In the second case, where a frontend lane IS declared, the feature records lanes=[backend] in its active_version.json (feature_lanes shows it), so plan and the analyze gates treat the frontend lane as absent for THIS feature; run `aw-spec-actions feature-lanes --clear` if it later gains a UI. The SHARED UI surface (app shell, layout, design system) belongs to no slice and stays in {{bundle_dir}}/architecture/frontend.md. NOTE — governance reconcile is currently HELD (reconcile_governance=false): this run did NOT modify the constitution halves or the guardrails/{{gov_domain}}/ rule set, so they keep onboard's provisional scaffold. Close any items in {{feature_dir}}/adopt-review-report.md out of band. The slice is now a NORMAL feature: refine via /appweaver analyze-plan, 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). If a change edits untested legacy behaviour with blast radius, characterize just that surface first (optional on-touch fence). To restore governance reconcile, set reconcile_governance to 'true' in the workflow vars."
|
|
@@ -458,7 +458,13 @@ workflow:
|
|
|
458
458
|
UNRESOLVED by definition: report it so it is closed here rather than at
|
|
459
459
|
integration;
|
|
460
460
|
(d) a contract the service delta REMOVES or narrows that the master frontend plan
|
|
461
|
-
still uses is a HIGH gap — the experience delta has to carry the matching change
|
|
461
|
+
still uses is a HIGH gap — the experience delta has to carry the matching change;
|
|
462
|
+
(e) OPERATION IDS MATCH. Every binding row the experience delta adds or changes
|
|
463
|
+
leads with an operation id, and that id is the one the service delta's table or
|
|
464
|
+
the master backend plan gives the endpoint, spelled exactly. A binding with no id,
|
|
465
|
+
or with an id neither names, is a HIGH `contract` gap on lane `frontend`; a
|
|
466
|
+
service-delta row with no operation id is one on lane `backend`. Implement finds
|
|
467
|
+
each endpoint by this id in the service's exported API document.
|
|
462
468
|
|
|
463
469
|
CHECK 4 — THE EFFECTIVE MODEL. It is domain-model.md PLUS this change's model
|
|
464
470
|
delta PLUS the model deltas of every LOWER-WAVE change in context (its
|
|
@@ -470,7 +470,13 @@ workflow:
|
|
|
470
470
|
discovered at integration;
|
|
471
471
|
(d) the frontend plan cites the service's published surface and does NOT restate,
|
|
472
472
|
re-derive or contradict it, and states no server-side behaviour or persistence
|
|
473
|
-
assumption
|
|
473
|
+
assumption;
|
|
474
|
+
(e) OPERATION IDS MATCH. Every §5 row's Operation id is the one the backend plan's
|
|
475
|
+
§3 gives that endpoint, spelled exactly, and every §3 endpoint has one, unique
|
|
476
|
+
across the plan. A §5 row with no id (`—` without a DA-n) or with an id §3 does not
|
|
477
|
+
name is a HIGH `contract` gap on lane `frontend`; a §3 endpoint with no id, or two
|
|
478
|
+
endpoints sharing one, is one on lane `backend`. Implement finds each endpoint by
|
|
479
|
+
this id in the service's exported API document.
|
|
474
480
|
|
|
475
481
|
CHECK 4 — the plans → domain-model.md (when the model is in context; skip if it
|
|
476
482
|
is not):
|
|
@@ -158,7 +158,7 @@ workflow:
|
|
|
158
158
|
with: { command: aw-spec-analyze-slice }
|
|
159
159
|
|
|
160
160
|
# 1. WHICH LANES EXIST. Declaration only — this gate reads code, it does not write it, so
|
|
161
|
-
# it has no reason to require a
|
|
161
|
+
# it has no reason to require a lane root folder on disk.
|
|
162
162
|
- id: lane_resolve
|
|
163
163
|
action: execute_script
|
|
164
164
|
on_error: continue
|
|
@@ -448,7 +448,7 @@ workflow:
|
|
|
448
448
|
the pre-existing slice.
|
|
449
449
|
|
|
450
450
|
CHECK 7 — PLACEMENT. Every file this change added or edited sits under the lane that
|
|
451
|
-
owns it: this lane's production code under its
|
|
451
|
+
owns it: this lane's production code under its lane root folder `{{be_source_path}}`, its
|
|
452
452
|
tests under its test path `{{be_test_path}}`. A service-lane element written into the
|
|
453
453
|
frontend lane's subtree — or outside every lane's paths — is a HIGH `placement` gap.
|
|
454
454
|
One edit outside them is allowed: registering a test project this change created in
|
|
@@ -542,7 +542,7 @@ workflow:
|
|
|
542
542
|
gap. Judge it only over what this change touched.
|
|
543
543
|
|
|
544
544
|
CHECK 7 — PLACEMENT. Every file this change added or edited sits under this lane's
|
|
545
|
-
|
|
545
|
+
lane root folder, `{{fe_source_path}}`, or — for a test — its test path, `{{fe_test_path}}`.
|
|
546
546
|
A file written into the service lane's subtree is a HIGH `placement` gap — a gap in the
|
|
547
547
|
service surface is a contract delta raised back to that lane, never a client-side edit
|
|
548
548
|
to it. The one edit allowed outside them is the test setup this change had to create,
|
|
@@ -85,7 +85,7 @@ scripts:
|
|
|
85
85
|
|
|
86
86
|
# No hardcoded technical standards seed. The technical rule files the code/conformance
|
|
87
87
|
# passes check against (testing + coding-standards) are now CONFIGURATION, loaded per-
|
|
88
|
-
# command from guardrails
|
|
88
|
+
# command from guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-analyze-slice"
|
|
89
89
|
# by the tech-select module (see the tech_select step below). The DOMAIN gate overlays are
|
|
90
90
|
# still loaded separately, as before (resolve_gate_overlays → load_gate_overlays). This gate
|
|
91
91
|
# does not reference constitution.technical.md. The seed below is behaviour-only — the kit's
|
|
@@ -149,7 +149,7 @@ vars:
|
|
|
149
149
|
workflow:
|
|
150
150
|
|
|
151
151
|
# 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded).
|
|
152
|
-
# tech-select reads guardrails
|
|
152
|
+
# tech-select reads guardrails/<project>/tech-rule-bindings.md under
|
|
153
153
|
# "## /aw-spec-analyze-slice" and loads that set (testing + coding-standards) into
|
|
154
154
|
# the sticky standards the conformance query reads (include_standards: true). The
|
|
155
155
|
# DOMAIN gate overlays are loaded separately below. No blocking gate: an unconfigured
|
|
@@ -559,7 +559,7 @@ workflow:
|
|
|
559
559
|
mock: { ok: true, unbound: [], notes: [] }
|
|
560
560
|
task: |
|
|
561
561
|
WOULD THIS SLICE RUN? Check the service lane's composition against its code.
|
|
562
|
-
The lane is `{{be_lane_id}}` and its
|
|
562
|
+
The lane is `{{be_lane_id}}` and its lane root folder is `{{be_source_path}}`; the
|
|
563
563
|
backend plan is in context, and its §2.1 Ports, §4.1 Persistence and §4.3 Wiring
|
|
564
564
|
say what has to be bound.
|
|
565
565
|
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
# compiled by its own build command, so what this stage needs is a declaration to compile
|
|
27
27
|
# from, not a particular kind of one; requiring the service lane blocked a frontend-only
|
|
28
28
|
# project that `plan` and `implement` both accept. The rest of the gate is unchanged: no
|
|
29
|
-
# lane declared, a lane with no
|
|
29
|
+
# lane declared, a lane with no lane root folder, a lane root folder that is not on disk, and two
|
|
30
30
|
# lanes claiming overlapping subtrees all still stop the run.
|
|
31
31
|
#
|
|
32
32
|
# Launch: /appweaver build [strategy]
|
|
@@ -48,7 +48,7 @@ scripts:
|
|
|
48
48
|
|
|
49
49
|
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The technical
|
|
50
50
|
# rule files (the compile/fix reference set) are CONFIGURATION, loaded per-command from
|
|
51
|
-
# guardrails
|
|
51
|
+
# guardrails/<project>/tech-rule-bindings.md by the tech-select module (see the
|
|
52
52
|
# tech_select step below). Technical rules ONLY — build loads no domain rules and does
|
|
53
53
|
# not reference constitution.technical.md. A required file that is missing is reported
|
|
54
54
|
# at assembly time (`[system] MISSING (required)`), an `optional:` one is skipped.
|
|
@@ -61,7 +61,7 @@ vars:
|
|
|
61
61
|
workflow:
|
|
62
62
|
|
|
63
63
|
# Rule files → sticky standards: TECHNICAL only, via tech-select, read from
|
|
64
|
-
# guardrails
|
|
64
|
+
# guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-build".
|
|
65
65
|
# NO domain-select here — see the header: build repairs compile errors, a purely
|
|
66
66
|
# technical job, and the domain never reaches this stage anyway (specify is its sole
|
|
67
67
|
# carrier; build reads code and design intent, not spec).
|
|
@@ -90,7 +90,7 @@ workflow:
|
|
|
90
90
|
# project compiles the one it has, whichever kind that is. A frontend-only project is a
|
|
91
91
|
# legal project: `plan` and `implement` both accept one, so refusing it here stopped it
|
|
92
92
|
# at the first stage that had no reason to care. Passing no required kind leaves every
|
|
93
|
-
# other check armed — no lane declared at all, a lane with no
|
|
93
|
+
# other check armed — no lane declared at all, a lane with no lane root folder, a lane root folder
|
|
94
94
|
# that is not on disk, and two lanes claiming overlapping subtrees.
|
|
95
95
|
- id: lane_gate
|
|
96
96
|
action: include
|
|
@@ -58,7 +58,7 @@ scripts:
|
|
|
58
58
|
# Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). The FRAMEWORK /
|
|
59
59
|
# test-generation set (same as implement/analyze-slice — HOW to write + place tests) is no
|
|
60
60
|
# longer hardcoded here — it is now CONFIGURATION, loaded per-command from
|
|
61
|
-
# guardrails
|
|
61
|
+
# guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-characterize" by the
|
|
62
62
|
# tech-select module (see the tech_select step below). No domain files: the behaviour to
|
|
63
63
|
# fence comes from the CODE + the adopted spec/design/source-map (constitution.technical.md
|
|
64
64
|
# is referred to directly as context), not from domain rules — the tech map lists only
|
|
@@ -79,7 +79,7 @@ vars:
|
|
|
79
79
|
workflow:
|
|
80
80
|
|
|
81
81
|
# 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded). tech-select
|
|
82
|
-
# reads guardrails
|
|
82
|
+
# reads guardrails/<project>/tech-rule-bindings.md under "## /aw-spec-characterize"
|
|
83
83
|
# and loads that test-generation set into the sticky standards the agent_generate steps
|
|
84
84
|
# ALWAYS prepend. No domain rule file is loaded here — the tech map lists only technical
|
|
85
85
|
# files. No blocking gate: an unconfigured project soft-continues (the golden-master is
|