aw-spec-cli 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/assets/.appweaver/RULE-PARTITION.md +8 -9
  2. package/assets/.appweaver/STACK-PROFILES.md +74 -9
  3. package/assets/.appweaver/interpreter/run-skill.py +28 -7
  4. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +17 -7
  5. package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +1 -1
  6. package/assets/.appweaver/orchestrator/modules/foundation-pack.orch.yaml +44 -1
  7. package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +172 -5
  8. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +5 -4
  9. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +3 -1
  10. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +16 -8
  11. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +15 -18
  12. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +4 -1
  13. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +6 -4
  14. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +7 -6
  15. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +7 -1
  16. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +7 -1
  17. package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +1 -1
  18. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +224 -16
  19. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +20 -19
  20. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +35 -11
  21. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +1 -1
  22. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +1 -1
  23. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +91 -7
  24. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +70 -7
  25. package/assets/.appweaver/scripts/python/aw-foundation.py +88 -12
  26. package/assets/.appweaver/scripts/python/aw-stack.py +481 -10
  27. package/assets/.appweaver/stack-profiles/dotnet-webapi.json +2 -0
  28. package/assets/.appweaver/stack-profiles/java-spring.json +2 -0
  29. package/assets/.appweaver/stacks.json +5 -2
  30. package/assets/.appweaver/templates/delta-design-template.md +7 -5
  31. package/assets/.appweaver/templates/design-template.md +3 -0
  32. package/assets/.appweaver/templates/ui-delta-design-template.md +1 -1
  33. package/assets/.appweaver/templates/ui-design-template.md +6 -4
  34. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.lane.json +6 -0
  35. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.lane.json +6 -0
  36. package/assets/foundations/foundation.spec.template.txt +26 -1
  37. package/assets/foundations/java/Hexagonal/Hexagonal.lane.json +6 -0
  38. package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +7 -0
  39. package/assets/guardrails/project-specific/domain-rule-bindings.md +20 -8
  40. package/assets/guardrails/project-specific/tech-rule-bindings.md +25 -37
  41. package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +1 -1
  42. package/assets/guardrails/technology/dotnet-webapi/auditing.md +1 -1
  43. package/assets/guardrails/technology/dotnet-webapi/authorization.md +1 -1
  44. package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +1 -1
  45. package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
  46. package/assets/guardrails/technology/dotnet-webapi/cqrs.md +1 -1
  47. package/assets/guardrails/technology/dotnet-webapi/data-classification.md +1 -1
  48. package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
  49. package/assets/guardrails/technology/dotnet-webapi/eventing.md +1 -1
  50. package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +1 -1
  51. package/assets/guardrails/technology/dotnet-webapi/framework-api-map.md +1 -1
  52. package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +1 -1
  53. package/assets/guardrails/technology/dotnet-webapi/persistence.md +1 -1
  54. package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
  55. package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +1 -1
  56. package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +1 -1
  57. package/assets/guardrails/technology/nextjs/accessibility-implementation.md +1 -1
  58. package/assets/guardrails/technology/nextjs/api-client.md +1 -1
  59. package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +1 -1
  60. package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +1 -1
  61. package/assets/guardrails/technology/nextjs/auth-session.md +1 -1
  62. package/assets/guardrails/technology/nextjs/client-security.md +1 -1
  63. package/assets/guardrails/technology/nextjs/component-architecture.md +1 -1
  64. package/assets/guardrails/technology/nextjs/component-conventions.md +1 -1
  65. package/assets/guardrails/technology/nextjs/design-system.md +1 -1
  66. package/assets/guardrails/technology/nextjs/error-handling.md +1 -1
  67. package/assets/guardrails/technology/nextjs/forms-and-validation.md +1 -1
  68. package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
  69. package/assets/guardrails/technology/nextjs/i18n.md +1 -1
  70. package/assets/guardrails/technology/nextjs/observability.md +1 -1
  71. package/assets/guardrails/technology/nextjs/performance-budgets.md +1 -1
  72. package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
  73. package/assets/guardrails/technology/nextjs/state-management.md +1 -1
  74. package/package.json +1 -1
@@ -129,11 +129,12 @@ migration is needed (yes/no); any contract change other systems couple to.]
129
129
  <!-- What this change adds to or alters in the service's PUBLISHED surface — the
130
130
  only part of this document the frontend lane may bind against. `None` when
131
131
  the surface is unchanged. Omit the section entirely where the code has no
132
- frontend lane. -->
132
+ frontend lane. The operation id is the endpoint's name in the published API
133
+ document; an endpoint that already has one keeps it. -->
133
134
 
134
- | Contract | Change | Shape | Serves |
135
- |---|---|---|---|
136
- | `[contract]` | [added / changed] | [request → response field shapes] | IC-[nnn] |
135
+ | Operation id | Contract | Change | Shape | Serves |
136
+ |---|---|---|---|---|
137
+ | `[OperationId]` | `[contract]` | [added / changed] | [request → response field shapes] | IC-[nnn] |
137
138
 
138
139
  ## Other open deltas
139
140
 
@@ -169,7 +169,9 @@
169
169
  the titles are the code's answer — the slots below are illustrative
170
170
  positions, not a required set. In each: the components that live there,
171
171
  their behaviour in signature form, and the contracts they expose or
172
- require. -->
172
+ require. A component that PUBLISHES an endpoint names it with its route, verb
173
+ and operation id — the endpoint's name in the published API document, which
174
+ the frontend plan cites and implement looks the endpoint up by. -->
173
175
 
174
176
  ### 2.1 [PROJECT_STRUCTURAL_AXIS_NAME]
175
177
 
@@ -1,8 +1,8 @@
1
1
  <!--
2
2
  rev-templates/domain-rule-bindings.skeleton.md — SHAPE-ONLY reference for the project's
3
3
  domain-rule-bindings.md (resolve-domain reads it by that exact name — the symmetric
4
- twin of tech-rule-bindings.md, which resolve-tech reads). It shows the five per-command headings, the RULE PARTITION (plan +
5
- implement get NO domain file), the bullet shape, and the quick-reference
4
+ twin of tech-rule-bindings.md, which resolve-tech reads). It shows the seven headings (plan and
5
+ implement keyed per lane), the RULE PARTITION (neither lane of plan or implement gets a domain file), the bullet shape, and the quick-reference
6
6
  table. It lists NO real rule files — every bullet is a placeholder for a file
7
7
  the author actually generated from THIS project's evidence.
8
8
 
@@ -35,11 +35,17 @@ domain-model.md. This is the rule partition; preserve it exactly.
35
35
  into the spec's CN-/DC-/IC- (plan/implement never see these files). -->
36
36
  - guardrails/[project]/domain/[each generated domain rule file].md
37
37
 
38
- ## /aw-spec-plan
39
- _None — plan loads no domain file. Domain reaches plan through the spec and the context's domain-model.md._
38
+ ## /aw-spec-plan-backend
39
+ _None — the service lane of plan loads no domain file. Domain reaches it through the spec and the context's domain-model.md._
40
40
 
41
- ## /aw-spec-implement
42
- _None — implement loads no domain file. Domain reaches implement through the lane plans and the context's domain-model.md._
41
+ ## /aw-spec-plan-frontend
42
+ _None — the frontend lane of plan loads no domain file. Domain reaches it through the spec and the context's domain-model.md._
43
+
44
+ ## /aw-spec-implement-backend
45
+ _None — the service lane of implement loads no domain file. Domain reaches it through backend-plan.md and the context's domain-model.md._
46
+
47
+ ## /aw-spec-implement-frontend
48
+ _None — the frontend lane of implement loads no domain file. Domain reaches it through frontend-plan.md and the context's domain-model.md._
43
49
 
44
50
  ## /aw-spec-gate
45
51
  <!-- Conformance checklist for the gates (analyze-plan · analyze-slice): the domain-derived
@@ -54,6 +60,8 @@ _None — implement loads no domain file. Domain reaches implement through the l
54
60
  |---|---|---|
55
61
  | /aw-spec-constitution | [n] | domain principles |
56
62
  | /aw-spec-specify | [n] | author into spec (lift → CN-/DC-/IC-) |
57
- | /aw-spec-plan | 0 | none — the spec and the domain model carry the domain |
58
- | /aw-spec-implement | 0 | none — the lane plans and the domain model carry the domain |
63
+ | /aw-spec-plan-backend | 0 | none — the spec and the domain model carry the domain |
64
+ | /aw-spec-plan-frontend | 0 | none — the spec and the domain model carry the domain |
65
+ | /aw-spec-implement-backend | 0 | none — backend-plan.md and the domain model carry the domain |
66
+ | /aw-spec-implement-frontend | 0 | none — frontend-plan.md and the domain model carry the domain |
59
67
  | /aw-spec-gate | [n] | conformance checklist (validate, don't author) |
@@ -27,6 +27,10 @@ refers to it directly, as-is.
27
27
 
28
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
@@ -43,22 +47,16 @@ refers to it directly, as-is.
43
47
  via domain-rule-bindings). No technology rule may appear under this heading. -->
44
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
54
  - guardrails/[project]/service/[as-built-architecture].md
51
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/[project]/service/[each generated codegen/convention rule].md
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. -->
59
+ (from backend-plan.md), on both the master and the delta path. -->
62
60
  - guardrails/[project]/service/[each generated codegen/convention rule].md
63
61
 
64
62
  ## /aw-spec-build
@@ -69,10 +67,10 @@ refers to it directly, as-is.
69
67
  <!-- The plan↔code conformance gate's TECHNICAL checklist (validate, don't author). -->
70
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-ui`. -->
73
+ only. A slice's reversed frontend-plan.md is authored under `## /aw-spec-plan-frontend`. -->
76
74
  - guardrails/[project]/service/[architecture/cross-cutting reference rule].md
77
75
 
78
76
  ## /aw-spec-constitution
@@ -95,14 +93,14 @@ refers to it directly, as-is.
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 — the ratifiable lane standards (frontend/ui-constitution.md
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-ui — the lane rules the FRONTEND lane of `plan` authors
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-ui — the lane rules the FRONTEND lane of `implement` generates
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) |
@@ -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
@@ -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/<project>/tech-rule-bindings.md under "## /aw-spec-adopt" by the
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
@@ -366,7 +366,7 @@ workflow:
366
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/<project>/tech-rule-bindings.md under "## /aw-spec-adopt" and
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-ui` is the set the forward plan authors this same
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-ui, replace: "true" }
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
@@ -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/{{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."
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):
@@ -81,5 +81,5 @@ workflow:
81
81
  outputs:
82
82
  feature_dir: "{{feature_dir}}"
83
83
  deployed: "{{configured}}"
84
- note: "Set .appweaver/deploy.json {\"command\": \"...\"} to enable an actual deploy; add smoke/rollback via before_deploy/after_deploy hooks."
84
+ note: 'Set .appweaver/deploy.json {"command": "..."} to enable an actual deploy; add smoke/rollback via before_deploy/after_deploy hooks.'
85
85
  next: "done"