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