aw-spec-cli 0.1.8 → 0.1.9

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 (257) hide show
  1. package/assets/.appweaver/DESIGN-FORMAT.md +200 -0
  2. package/assets/.appweaver/ORCH-DIALECT.md +156 -0
  3. package/assets/.appweaver/RULE-PARTITION.md +175 -0
  4. package/assets/.appweaver/STACK-PROFILES.md +461 -0
  5. package/assets/.appweaver/ai-rules.md +180 -0
  6. package/assets/.appweaver/domain.json +1 -0
  7. package/assets/.appweaver/extensions/.registry +19 -0
  8. package/assets/.appweaver/extensions/agent-context/README.md +57 -0
  9. package/assets/.appweaver/extensions/agent-context/agent-context-config.yml +4 -0
  10. package/assets/.appweaver/extensions/agent-context/commands/aw-spec.agent-context.update.md +26 -0
  11. package/assets/.appweaver/extensions/agent-context/extension.yml +37 -0
  12. package/assets/.appweaver/extensions/agent-context/scripts/bash/update-agent-context.sh +201 -0
  13. package/assets/.appweaver/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +237 -0
  14. package/assets/.appweaver/extensions.yml +16 -0
  15. package/assets/.appweaver/feature.json +3 -0
  16. package/assets/.appweaver/init-options.json +9 -0
  17. package/assets/.appweaver/integration.json +15 -0
  18. package/assets/.appweaver/integrations/aw-spec.manifest.json +9 -0
  19. package/assets/.appweaver/interpreter/run-skill.py +1176 -0
  20. package/assets/.appweaver/memory/constitution.md +50 -0
  21. package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +6 -0
  22. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +94 -0
  23. package/assets/.appweaver/orchestrator/README.md +300 -0
  24. package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +74 -0
  25. package/assets/.appweaver/orchestrator/adapters/google_antigravity.py +74 -0
  26. package/assets/.appweaver/orchestrator/modules/delta-design.orch.yaml +105 -0
  27. package/assets/.appweaver/orchestrator/modules/delta-spec.orch.yaml +101 -0
  28. package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +90 -0
  29. package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +126 -0
  30. package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +123 -0
  31. package/assets/.appweaver/orchestrator/orchestrator.py +1721 -0
  32. package/assets/.appweaver/orchestrator/rev-templates/ai-rules.reference.md +40 -0
  33. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +101 -0
  34. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +245 -0
  35. package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +63 -0
  36. package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +48 -0
  37. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +59 -0
  38. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-file.skeleton.md +39 -0
  39. package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +63 -0
  40. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +116 -0
  41. package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +106 -0
  42. package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +54 -0
  43. package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +125 -0
  44. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +123 -0
  45. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +294 -0
  46. package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +160 -0
  47. package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +270 -0
  48. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +934 -0
  49. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-delta-design.orch.yaml +251 -0
  50. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-design.orch.yaml +265 -0
  51. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +437 -0
  52. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +197 -0
  53. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +475 -0
  54. package/assets/.appweaver/orchestrator/workflows/aw-spec-close-delta.orch.yaml +181 -0
  55. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +727 -0
  56. package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +100 -0
  57. package/assets/.appweaver/orchestrator/workflows/aw-spec-dependency-tree.orch.yaml +69 -0
  58. package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +85 -0
  59. package/assets/.appweaver/orchestrator/workflows/aw-spec-design-ui.orch.yaml +386 -0
  60. package/assets/.appweaver/orchestrator/workflows/aw-spec-design.orch.yaml +382 -0
  61. package/assets/.appweaver/orchestrator/workflows/aw-spec-finalize-delta.orch.yaml +462 -0
  62. package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +265 -0
  63. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-delta.orch.yaml +253 -0
  64. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement-ui.orch.yaml +267 -0
  65. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +287 -0
  66. package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +238 -0
  67. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +1822 -0
  68. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +293 -0
  69. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +194 -0
  70. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +83 -0
  71. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +128 -0
  72. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +296 -0
  73. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +439 -0
  74. package/assets/.appweaver/scripts/bash/aw-inventory.sh +17 -0
  75. package/assets/.appweaver/scripts/bash/aw-parity.sh +13 -0
  76. package/assets/.appweaver/scripts/bash/aw-rev-constitution.sh +13 -0
  77. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +2626 -0
  78. package/assets/.appweaver/scripts/bash/aw-xref.sh +15 -0
  79. package/assets/.appweaver/scripts/bash/common.sh +533 -0
  80. package/assets/.appweaver/scripts/powershell/aw-inventory.ps1 +17 -0
  81. package/assets/.appweaver/scripts/powershell/aw-parity.ps1 +13 -0
  82. package/assets/.appweaver/scripts/powershell/aw-rev-constitution.ps1 +13 -0
  83. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +2232 -0
  84. package/assets/.appweaver/scripts/powershell/aw-xref.ps1 +15 -0
  85. package/assets/.appweaver/scripts/python/aw-component-catalog.py +121 -0
  86. package/assets/.appweaver/scripts/python/aw-inventory.py +1180 -0
  87. package/assets/.appweaver/scripts/python/aw-parity.py +380 -0
  88. package/assets/.appweaver/scripts/python/aw-rev-constitution.py +329 -0
  89. package/assets/.appweaver/scripts/python/aw-stack.py +1251 -0
  90. package/assets/.appweaver/scripts/python/aw-xref.py +1330 -0
  91. package/assets/.appweaver/scripts/python/validate_okf.py +352 -0
  92. package/assets/.appweaver/stack-profiles/angular.json +16 -0
  93. package/assets/.appweaver/stack-profiles/blazor-wasm.json +17 -0
  94. package/assets/.appweaver/stack-profiles/dotnet-webapi.json +15 -0
  95. package/assets/.appweaver/stack-profiles/go-chi.json +14 -0
  96. package/assets/.appweaver/stack-profiles/java-spring.json +16 -0
  97. package/assets/.appweaver/stack-profiles/nextjs.json +16 -0
  98. package/assets/.appweaver/stack-profiles/node-express.json +15 -0
  99. package/assets/.appweaver/stack-profiles/python-fastapi.json +16 -0
  100. package/assets/.appweaver/stack-profiles/react-vite.json +17 -0
  101. package/assets/.appweaver/stack-profiles/sveltekit.json +16 -0
  102. package/assets/.appweaver/stack-profiles/vue-vite.json +17 -0
  103. package/assets/.appweaver/stacks.json +3 -0
  104. package/assets/.appweaver/templates/constitution-domain-template.md +116 -0
  105. package/assets/.appweaver/templates/constitution-technical-template.md +108 -0
  106. package/assets/.appweaver/templates/constitution-ui-template.md +116 -0
  107. package/assets/.appweaver/templates/delta-design-template.md +69 -0
  108. package/assets/.appweaver/templates/delta-spec-template.md +63 -0
  109. package/assets/.appweaver/templates/design-template.md +383 -0
  110. package/assets/.appweaver/templates/okf-concept-template.md +114 -0
  111. package/assets/.appweaver/templates/parity-manifest-template.json +49 -0
  112. package/assets/.appweaver/templates/source-map-template.md +85 -0
  113. package/assets/.appweaver/templates/spec-template.md +309 -0
  114. package/assets/.appweaver/templates/ui-design-template.md +273 -0
  115. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.pack.txt +25248 -0
  116. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.pack.txt +5726 -0
  117. package/assets/foundations/dotnet/ModularMonolith/pack-foundation.ps1 +145 -0
  118. package/assets/foundations/dotnet/ModularMonolith/pack-foundation.sh +196 -0
  119. package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.ps1 +157 -0
  120. package/assets/foundations/dotnet/ModularMonolith/pack-reference-foundation.sh +209 -0
  121. package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.ps1 +126 -0
  122. package/assets/foundations/dotnet/ModularMonolith/unpack-foundation.sh +217 -0
  123. package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.ps1 +129 -0
  124. package/assets/foundations/dotnet/ModularMonolith/unpack-reference-foundation.sh +218 -0
  125. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.pack.txt +19318 -0
  126. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.pack.txt +2833 -0
  127. package/assets/foundations/dotnet/VerticalSlice/pack-foundation.ps1 +145 -0
  128. package/assets/foundations/dotnet/VerticalSlice/pack-foundation.sh +196 -0
  129. package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.ps1 +157 -0
  130. package/assets/foundations/dotnet/VerticalSlice/pack-reference-foundation.sh +209 -0
  131. package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.ps1 +126 -0
  132. package/assets/foundations/dotnet/VerticalSlice/unpack-foundation.sh +217 -0
  133. package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.ps1 +129 -0
  134. package/assets/foundations/dotnet/VerticalSlice/unpack-reference-foundation.sh +218 -0
  135. package/assets/foundations/dotnet/components/Email/README.md +119 -0
  136. package/assets/foundations/dotnet/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +84 -0
  137. package/assets/foundations/dotnet/components/Email/integration.md +300 -0
  138. package/assets/foundations/dotnet/components/Jobs/README.md +113 -0
  139. package/assets/foundations/dotnet/components/Jobs/integration.md +259 -0
  140. package/assets/foundations/dotnet/components/QrGenerator/README.md +85 -0
  141. package/assets/foundations/dotnet/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +57 -0
  142. package/assets/foundations/dotnet/components/QrGenerator/integration.md +230 -0
  143. package/assets/foundations/dotnet/components/README.md +74 -0
  144. package/assets/guardrails/README.md +222 -0
  145. package/assets/guardrails/domain/healthcare/ai-rules.domain.md +34 -0
  146. package/assets/guardrails/domain/healthcare/api-versioning.domain.md +17 -0
  147. package/assets/guardrails/domain/healthcare/auditing.domain.md +97 -0
  148. package/assets/guardrails/domain/healthcare/authorization.domain.md +26 -0
  149. package/assets/guardrails/domain/healthcare/clinical-terms.md +20 -0
  150. package/assets/guardrails/domain/healthcare/coding-standards.domain.md +26 -0
  151. package/assets/guardrails/domain/healthcare/consent.md +19 -0
  152. package/assets/guardrails/domain/healthcare/cqrs.domain.md +12 -0
  153. package/assets/guardrails/domain/healthcare/data-classification.domain.md +28 -0
  154. package/assets/guardrails/domain/healthcare/dependency-policy.domain.md +11 -0
  155. package/assets/guardrails/domain/healthcare/dicom.md +15 -0
  156. package/assets/guardrails/domain/healthcare/domain-constitution.md +119 -0
  157. package/assets/guardrails/domain/healthcare/domain-driven-design.domain.md +28 -0
  158. package/assets/guardrails/domain/healthcare/eventing.domain.md +18 -0
  159. package/assets/guardrails/domain/healthcare/fhir.md +36 -0
  160. package/assets/guardrails/domain/healthcare/folder-structure.domain.md +25 -0
  161. package/assets/guardrails/domain/healthcare/hipaa.md +34 -0
  162. package/assets/guardrails/domain/healthcare/hl7.md +15 -0
  163. package/assets/guardrails/domain/healthcare/ihe-conformance.md +31 -0
  164. package/assets/guardrails/domain/healthcare/integration-terms.md +21 -0
  165. package/assets/guardrails/domain/healthcare/persistence.domain.md +20 -0
  166. package/assets/guardrails/domain/healthcare/terminology.md +30 -0
  167. package/assets/guardrails/domain/healthcare/testing.domain.md +15 -0
  168. package/assets/guardrails/domain/healthcare/ux/accessibility-standards.md +36 -0
  169. package/assets/guardrails/domain/healthcare/ux/content-design.md +32 -0
  170. package/assets/guardrails/domain/healthcare/ux/interaction-states.md +44 -0
  171. package/assets/guardrails/domain/healthcare/ux/journey-mapping.md +40 -0
  172. package/assets/guardrails/domain/healthcare/vertical-slices.domain.md +18 -0
  173. package/assets/guardrails/domain/healthcare/zero-trust.domain.md +12 -0
  174. package/assets/guardrails/domain/pharma/ai-rules.domain.md +32 -0
  175. package/assets/guardrails/domain/pharma/api-versioning.domain.md +20 -0
  176. package/assets/guardrails/domain/pharma/atc.md +22 -0
  177. package/assets/guardrails/domain/pharma/auditing.domain.md +90 -0
  178. package/assets/guardrails/domain/pharma/authorization.domain.md +25 -0
  179. package/assets/guardrails/domain/pharma/coding-standards.domain.md +28 -0
  180. package/assets/guardrails/domain/pharma/cqrs.domain.md +16 -0
  181. package/assets/guardrails/domain/pharma/data-classification.domain.md +24 -0
  182. package/assets/guardrails/domain/pharma/data-provenance.md +21 -0
  183. package/assets/guardrails/domain/pharma/dependency-policy.domain.md +11 -0
  184. package/assets/guardrails/domain/pharma/domain-constitution.md +113 -0
  185. package/assets/guardrails/domain/pharma/domain-driven-design.domain.md +36 -0
  186. package/assets/guardrails/domain/pharma/domain-requirements.sample.md +103 -0
  187. package/assets/guardrails/domain/pharma/eventing.domain.md +18 -0
  188. package/assets/guardrails/domain/pharma/fhir.md +31 -0
  189. package/assets/guardrails/domain/pharma/folder-structure.domain.md +26 -0
  190. package/assets/guardrails/domain/pharma/hl7.md +17 -0
  191. package/assets/guardrails/domain/pharma/idmp.md +26 -0
  192. package/assets/guardrails/domain/pharma/integration-terms.md +21 -0
  193. package/assets/guardrails/domain/pharma/ndc.md +28 -0
  194. package/assets/guardrails/domain/pharma/persistence.domain.md +23 -0
  195. package/assets/guardrails/domain/pharma/pharma-terms.md +27 -0
  196. package/assets/guardrails/domain/pharma/product-lifecycle.domain.md +30 -0
  197. package/assets/guardrails/domain/pharma/regulatory-compliance.md +19 -0
  198. package/assets/guardrails/domain/pharma/terminology.md +32 -0
  199. package/assets/guardrails/domain/pharma/testing.domain.md +19 -0
  200. package/assets/guardrails/domain/pharma/vertical-slices.domain.md +17 -0
  201. package/assets/guardrails/domain/pharma/zero-trust.domain.md +12 -0
  202. package/assets/guardrails/projects/dotnet-default-project/domain/domain-requirements.md +58 -0
  203. package/assets/guardrails/projects/dotnet-default-project/domain-rule-bindings.md +113 -0
  204. package/assets/guardrails/projects/dotnet-default-project/frontend/ui-requirements.md +43 -0
  205. package/assets/guardrails/projects/dotnet-default-project/service/technical-requirements.md +40 -0
  206. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +263 -0
  207. package/assets/guardrails/requirement-spec.txt +27 -0
  208. package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +184 -0
  209. package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +44 -0
  210. package/assets/guardrails/technology/dotnet-webapi/auditing.md +96 -0
  211. package/assets/guardrails/technology/dotnet-webapi/authorization-matrix.md +14 -0
  212. package/assets/guardrails/technology/dotnet-webapi/authorization.md +39 -0
  213. package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +54 -0
  214. package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +87 -0
  215. package/assets/guardrails/technology/dotnet-webapi/cqrs.md +63 -0
  216. package/assets/guardrails/technology/dotnet-webapi/data-classification.md +38 -0
  217. package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +40 -0
  218. package/assets/guardrails/technology/dotnet-webapi/domain-driven-design.md +91 -0
  219. package/assets/guardrails/technology/dotnet-webapi/eventing.md +57 -0
  220. package/assets/guardrails/technology/dotnet-webapi/examples/api-versioning.md +75 -0
  221. package/assets/guardrails/technology/dotnet-webapi/examples/auditing.md +84 -0
  222. package/assets/guardrails/technology/dotnet-webapi/examples/authorization.md +68 -0
  223. package/assets/guardrails/technology/dotnet-webapi/examples/clean-architecture.md +37 -0
  224. package/assets/guardrails/technology/dotnet-webapi/examples/cqrs.md +97 -0
  225. package/assets/guardrails/technology/dotnet-webapi/examples/domain-driven-design.md +141 -0
  226. package/assets/guardrails/technology/dotnet-webapi/examples/eventing.md +46 -0
  227. package/assets/guardrails/technology/dotnet-webapi/examples/persistence.md +207 -0
  228. package/assets/guardrails/technology/dotnet-webapi/examples/vertical-slices.md +151 -0
  229. package/assets/guardrails/technology/dotnet-webapi/examples/zero-trust.md +48 -0
  230. package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +61 -0
  231. package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +47 -0
  232. package/assets/guardrails/technology/dotnet-webapi/persistence.md +82 -0
  233. package/assets/guardrails/technology/dotnet-webapi/technology-constitution.md +162 -0
  234. package/assets/guardrails/technology/dotnet-webapi/testing.md +55 -0
  235. package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +70 -0
  236. package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +48 -0
  237. package/assets/guardrails/technology/java-spring/README.md +62 -0
  238. package/assets/guardrails/technology/nextjs/accessibility-implementation.md +56 -0
  239. package/assets/guardrails/technology/nextjs/api-client.md +56 -0
  240. package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +174 -0
  241. package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +203 -0
  242. package/assets/guardrails/technology/nextjs/auth-session.md +68 -0
  243. package/assets/guardrails/technology/nextjs/client-security.md +69 -0
  244. package/assets/guardrails/technology/nextjs/component-architecture.md +60 -0
  245. package/assets/guardrails/technology/nextjs/component-conventions.md +58 -0
  246. package/assets/guardrails/technology/nextjs/design-system.md +60 -0
  247. package/assets/guardrails/technology/nextjs/error-handling.md +72 -0
  248. package/assets/guardrails/technology/nextjs/forms-and-validation.md +75 -0
  249. package/assets/guardrails/technology/nextjs/frontend-testing.md +94 -0
  250. package/assets/guardrails/technology/nextjs/i18n.md +57 -0
  251. package/assets/guardrails/technology/nextjs/observability.md +67 -0
  252. package/assets/guardrails/technology/nextjs/performance-budgets.md +66 -0
  253. package/assets/guardrails/technology/nextjs/routing-navigation.md +52 -0
  254. package/assets/guardrails/technology/nextjs/state-management.md +70 -0
  255. package/assets/guardrails/technology/nextjs/ui-constitution.md +166 -0
  256. package/package.json +1 -1
  257. package/assets/docs/pharma-constitution.my-ref.md +0 -86
@@ -0,0 +1,265 @@
1
+ # =============================================================================
2
+ # aw-spec-foundation (orchestrator) — scaffold a project from a foundation bundle
3
+ #
4
+ # Almost entirely deterministic script orchestration (unpack the verified
5
+ # byte-for-byte bundle, rename the sentinel); the model is used ONLY for the
6
+ # optional DbContext merge when the reference sample is included. That merge
7
+ # is an `agent_author` (decl `llm_generate` port): generation is READ-ONLY
8
+ # under every strategy and the ENGINE writes the merged file, so sdk-apply
9
+ # degrades to sdk. No standards/domain/hooks — pure scaffolding, so the merge
10
+ # runs with include_standards: false and a narrow two-file context.
11
+ #
12
+ # Interactive confirmations (proceed / overwrite / reference sample) ride the
13
+ # checkpoint channel under EVERY strategy.
14
+ #
15
+ # Launch via the parametric skill: /appweaver foundation [strategy]
16
+ # Interactive (no args): LISTS the available foundations to pick from, then ASKS
17
+ # for the app (project) name — both deterministic, no LLM. Fast path still works:
18
+ # /appweaver foundation agent VerticalSlice AppWeaver.Health
19
+ #
20
+ # Headless:
21
+ # python3 .appweaver/orchestrator/orchestrator.py \
22
+ # .appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml \
23
+ # --checkpoint .appweaver/orchestrator/.state/foundation.state.json \
24
+ # --input "VerticalSlice AppWeaver.Health" --json
25
+ # =============================================================================
26
+
27
+ name: aw-spec-foundation
28
+ description: Scaffold a complete, compiling project — pick from the available foundation bundles and enter the app name, then unpack the verified bundle and rename its sentinel to your app name. Selection is zero-LLM (list + pick + ask).
29
+ version: 1.1.0
30
+ agent_agnostic: true
31
+ dialect: aw-spec.orchestrator/v1
32
+
33
+ inputs:
34
+ user_input:
35
+ description: "Optional fast path: FoundationName [AppName] [OutputDirectory]. Omit to pick a foundation from the list and be asked for the app name."
36
+ required: false
37
+ bind: USER_INPUT
38
+
39
+ scripts:
40
+ actions:
41
+ sh: .appweaver/scripts/bash/aw-spec-actions.sh
42
+ ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
43
+
44
+ standards:
45
+ - { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
46
+
47
+ vars:
48
+ overwrite: "no" # flipped by ask_overwrite only when the dry run finds collisions
49
+ ref_written: "0" # stays 0 when the reference sample is declined
50
+ stash_found: "false" # true only when the reference flow stashed a DbContext
51
+ app: "" # resolved app name: fast-path 2nd token, else the ask below
52
+ app_typed: "" # app name entered interactively (empty on the fast path)
53
+
54
+ workflow:
55
+
56
+ # 1a. LIST the available foundations (deterministic foundations/<ecosystem>/<Name>/<Name>.pack.txt
57
+ # scan — no LLM), narrowed to the ecosystems the declared lanes belong to. A
58
+ # bundle is a whole compiling project in one ecosystem's build system, so the
59
+ # list a Spring repo is shown and the list a .NET repo is shown are different
60
+ # lists; `all_foundations` keeps the unfiltered set for the gate message below.
61
+ # A direct "Foundation App [out]" argument is parsed here too as an optional
62
+ # fast path (preselect_name / preselect_app / out_dir).
63
+ - id: list_foundations
64
+ action: execute_script
65
+ script: { ref: actions }
66
+ subcommand: foundation-list
67
+ args: ["--args", "{{USER_INPUT}}"]
68
+ outputs:
69
+ - { name: foundations, from: "$.foundations" }
70
+ - { name: foundation_count, from: "$.count" }
71
+ - { name: all_foundations, from: "$.all_foundations" }
72
+ - { name: lane_ecosystems, from: "$.lane_ecosystems" }
73
+ - { name: preselect_name, from: "$.preselect_name" }
74
+ - { name: preselect_app, from: "$.preselect_app" }
75
+ - { name: out_dir, from: "$.out_dir" }
76
+
77
+ - id: have_foundations
78
+ action: verify_context
79
+ require_non_empty: foundations
80
+ on_empty: stop
81
+ on_empty_message: >
82
+ No foundation bundle is available for this repository. Bundles present:
83
+ {{all_foundations}}; the ecosystem(s) this repository declares in
84
+ .appweaver/stacks.json: {{lane_ecosystems}}. A foundation is a complete project in
85
+ one ecosystem's languages and build system, so one from another ecosystem is not a
86
+ scaffold for this repo — it is a second, foreign project beside it. Either add a
87
+ bundle under foundations/<ecosystem>/<Name>/<Name>.pack.txt for your stack (see the
88
+ pack scripts in that directory), or scaffold with the stack's own tooling (Spring
89
+ Initializr, `npm create`, `cargo new`, …) and declare the result with
90
+ /appweaver select-stack — implement generates INTO a project tree and does not
91
+ require that the kit be the thing that created it.
92
+
93
+ # 1b. PICK the foundation. A matching fast-path arg auto-selects; a lone
94
+ # foundation auto-confirms; otherwise the user chooses from the list.
95
+ - id: pick_foundation
96
+ action: user_select
97
+ prompt: "Select a foundation to scaffold from:"
98
+ options_from_variable: foundations
99
+ preselect_from: preselect_name
100
+ single_option_confirm: true
101
+ outputs:
102
+ - { name: fname, from: selection }
103
+
104
+ # 1c. ASK for the app (project) name — deterministic free-text, no LLM. Skipped
105
+ # when the fast-path arg already supplied it (preselect_app non-empty).
106
+ - id: ask_app
107
+ action: ask
108
+ condition: "{{preselect_app}} == "
109
+ prompt: >
110
+ Enter the project (application) name — it replaces the foundation's sentinel
111
+ across the generated tree (dotted / underscored / hyphen / lower forms),
112
+ e.g. AppWeaver.Health:
113
+ answer_var: app_typed
114
+
115
+ # 1d. Coalesce the app name (engine has no compound conditions → two ordered
116
+ # sets): default to the typed answer, then override with the fast-path token.
117
+ - id: app_from_typed
118
+ action: set
119
+ vars: { app: "{{app_typed}}" }
120
+ - id: app_from_arg
121
+ action: set
122
+ condition: "{{preselect_app}} != "
123
+ vars: { app: "{{preselect_app}}" }
124
+
125
+ # 1e. Locate the bundle/unpacker for the CHOSEN foundation + read the (bounded)
126
+ # pack header (sentinel + file_count shown in the confirm below).
127
+ - id: locate
128
+ action: execute_script
129
+ script: { ref: actions }
130
+ subcommand: foundation-locate
131
+ args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}"]
132
+ outputs:
133
+ - { name: locate_ok, from: "$.ok" }
134
+ - { name: locate_msg, from: "$.reason" }
135
+ - { name: available, from: "$.available" }
136
+ - { name: fname, from: "$.name" }
137
+ - { name: app, from: "$.app" }
138
+ - { name: out_dir, from: "$.out_dir" }
139
+ - { name: sentinel, from: "$.sentinel" }
140
+ - { name: file_count, from: "$.file_count" }
141
+
142
+ - id: locate_gate
143
+ action: verify_context
144
+ require_true: locate_ok
145
+ on_false: stop
146
+ on_false_message: "{{locate_msg}} (available foundations: {{available}})"
147
+
148
+ # 2. Confirm the scaffold plan (checkpoint kind 'ask' under every strategy).
149
+ - id: confirm
150
+ action: ask
151
+ prompt: |
152
+ Foundation: {{fname}} (sentinel {{sentinel}}, {{file_count}} files)
153
+ App Name: {{app}}
154
+ Output: {{out_dir}}
155
+ Rename {{sentinel}} -> {{app}} (dotted/underscored/hyphen/lower forms).
156
+ Unchanged: 'Projects' sample domain + AppWeaver.* framework packages. Proceed?
157
+ options: ["yes", "no"]
158
+ answer_var: proceed
159
+
160
+ - id: confirm_gate
161
+ action: verify_context
162
+ require_value: proceed
163
+ equals: "yes"
164
+ on_mismatch: stop
165
+ on_mismatch_message: "Cancelled by user."
166
+
167
+ # 3. Dry-run to surface collisions, then confirm overwrite if needed.
168
+ - id: dry_run
169
+ action: execute_script
170
+ script: { ref: actions }
171
+ subcommand: foundation-unpack
172
+ args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--dry-run"]
173
+ outputs:
174
+ - { name: has_collisions, from: "$.has_collisions" }
175
+
176
+ - id: ask_overwrite
177
+ action: ask
178
+ condition: "{{has_collisions}} == true"
179
+ prompt: "Output files already exist. Overwrite them?"
180
+ options: ["yes", "no"]
181
+ answer_var: overwrite
182
+
183
+ - id: overwrite_gate
184
+ action: verify_context
185
+ condition: "{{has_collisions}} == true"
186
+ require_value: overwrite
187
+ equals: "yes"
188
+ on_mismatch: stop
189
+ on_mismatch_message: "Aborted — output files exist and overwrite was declined."
190
+
191
+ # 4. Unpack for real.
192
+ - id: unpack
193
+ action: execute_script
194
+ script: { ref: actions }
195
+ subcommand: foundation-unpack
196
+ args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--force", "{{overwrite}}"]
197
+ outputs:
198
+ - { name: written, from: "$.written" }
199
+
200
+ # 5. Optional reference sample.
201
+ - id: ask_reference
202
+ action: ask
203
+ prompt: "Include the reference sample project (Projects, Users, Reports slices)?"
204
+ options: ["yes", "no"]
205
+ answer_var: want_reference
206
+
207
+ - id: stash_dbcontext
208
+ action: execute_script
209
+ condition: "{{want_reference}} == yes"
210
+ script: { ref: actions }
211
+ subcommand: foundation-stash-dbcontext
212
+ args: ["--out", "{{out_dir}}"]
213
+ outputs:
214
+ - { name: stash_found, from: "$.found" }
215
+ - { name: db_context, from: "$.dbcontext" }
216
+ - { name: db_backup, from: "$.backup" }
217
+
218
+ - id: reference_unpack
219
+ action: execute_script
220
+ condition: "{{want_reference}} == yes"
221
+ script: { ref: actions }
222
+ subcommand: foundation-unpack
223
+ args: ["--name", "{{fname}}", "--app", "{{app}}", "--out", "{{out_dir}}", "--reference"]
224
+ outputs:
225
+ - { name: ref_written, from: "$.written" }
226
+
227
+ # 6. Merge the foundation DbContext (usings + DbSet<>) back over the reference
228
+ # one. agent_author: read-only generation, the ENGINE writes the target.
229
+ - id: merge_dbcontext
230
+ action: agent_author
231
+ condition: "{{stash_found}} == true"
232
+ context: ["{{db_backup}}", "{{db_context}}"]
233
+ include_standards: false
234
+ task: |
235
+ The target file ({{db_context}}) currently holds the REFERENCE DbContext
236
+ (sample DbSet<> properties, no OnModelCreating). The backup ({{db_backup}})
237
+ holds the FOUNDATION DbContext (full OnModelCreating, no DbSet<>). Produce a
238
+ single merged ApplicationDbContext:
239
+ - Base = the FOUNDATION file (backup).
240
+ - Add any `using` directives from the reference that are missing.
241
+ - Insert every reference `public DbSet<…>` line as a block right after the
242
+ class opening brace (before OnModelCreating), preserving any comment above them.
243
+ - Keep everything else in the foundation file unchanged.
244
+ output_target: { type: file, path: "{{db_context}}" }
245
+
246
+ # 7. Verify (sentinel residue must be zero in the generated tree).
247
+ - id: verify
248
+ action: execute_script
249
+ script: { ref: actions }
250
+ subcommand: foundation-verify
251
+ args: ["--out", "{{out_dir}}", "--sentinel", "{{sentinel}}"]
252
+ outputs:
253
+ - { name: clean, from: "$.clean" }
254
+ - { name: residue, from: "$.residue" }
255
+
256
+ outputs:
257
+ foundation: "{{fname}}"
258
+ app: "{{app}}"
259
+ output_dir: "{{out_dir}}"
260
+ files_written: "{{written}}"
261
+ reference_files: "{{ref_written}}"
262
+ sentinel_clean: "{{clean}}"
263
+ sentinel_residue: "{{residue}}"
264
+ note: "Foundation scaffolded into {{out_dir}} ({{written}} file(s), sentinel renamed to {{app}}). Configure your AppWeaver.* NuGet feed and run the AppHost to confirm the scaffold starts before building on it."
265
+ next: "/appweaver select-feature (pick the feature to build; every stage from specify onward reads that active feature and stops without it. If this workspace has governed projects under guardrails/projects/, run /appweaver select-domain first — it is one-time and optional.)"
@@ -0,0 +1,253 @@
1
+ # =============================================================================
2
+ # aw-spec-implement-delta (orchestrator) — generate the DELTA's code from the design
3
+ #
4
+ # The CR analog of implement, SCOPED to the open change. GENERATE / edit exactly the
5
+ # source files + paired tests that delta-design.md marks ADDED or MODIFIED, into the
6
+ # existing project tree, using the master design.md as the base context. The delta
7
+ # design is the authoritative source for WHAT the change is — analyze-delta-design already
8
+ # conformed it to the delta spec. The target STACK is bound from the constitution.
9
+ # implement-delta does NOT touch spec.md / design.md and does NOT close the change —
10
+ # finalize-delta merges the delta into the master docs afterward, and close-delta bumps
11
+ # the version at the very end.
12
+ #
13
+ # specify → design → ⟨review⟩ → analyze-delta-design → implement-delta ← you are here
14
+ # → build → finalize-delta → analyze-slice → close-delta
15
+ #
16
+ # Prereqs: run /appweaver analyze-delta-design first (the delta design is conformed),
17
+ # and the project must already be scaffolded (/appweaver foundation) — implement-delta
18
+ # GENERATES into that tree.
19
+ #
20
+ # Launch: /appweaver implement-delta [strategy] [guidance]
21
+ # =============================================================================
22
+
23
+ name: aw-spec-implement-delta
24
+ description: Generate only the source files + paired tests the open change's delta-design.md marks ADDED/MODIFIED, into the existing project tree, bound to the project's stack. Model-driven, delta-design-scoped; does not touch the master docs or close the change.
25
+ version: 1.0.0
26
+ agent_agnostic: true
27
+ dialect: aw-spec.orchestrator/v1
28
+
29
+ inputs:
30
+ user_input:
31
+ description: Optional implementation guidance (stack hints, focus area).
32
+ required: false
33
+ bind: USER_INPUT
34
+
35
+ scripts:
36
+ actions:
37
+ sh: .appweaver/scripts/bash/aw-spec-actions.sh
38
+ ps1: .appweaver/scripts/powershell/aw-spec-actions.ps1
39
+ xref:
40
+ sh: .appweaver/scripts/bash/aw-xref.sh
41
+ ps1: .appweaver/scripts/powershell/aw-xref.ps1
42
+
43
+ # Sticky standards seed = the UNIVERSAL always-on rule only (ai-rules). Same FRAMEWORK /
44
+ # code-generation set as the forward implement — HOW to build — but no longer hardcoded:
45
+ # it is CONFIGURATION, loaded per-command from guardrails/projects/<project>/tech-rule-bindings.md
46
+ # by the tech-select module (see the tech_select step below). No domain rule files:
47
+ # everything domain reached the delta via delta-spec → delta-design; the tech map lists
48
+ # only technical files. The architecture principles come via constitution.technical.md
49
+ # (referred to directly, as-is — NOT mapped); the structure via design.md. (missing skipped)
50
+ standards:
51
+ - { path: .appweaver/ai-rules.md } # kit-resident: the universal operating rules, every flow
52
+
53
+ workflow:
54
+
55
+ # 0. TECHNICAL rule files → sticky standards (configuration, not hardcoded).
56
+ # tech-select reads guardrails/projects/<project>/tech-rule-bindings.md under
57
+ # "## /aw-spec-implement-delta" and loads that set into the sticky standards the
58
+ # agent_generate step ALWAYS prepends. No domain rule file is loaded here — the tech
59
+ # map lists only technical files (rule-partition intact). No blocking gate: an
60
+ # unconfigured project soft-continues (constitution.technical.md still carries the
61
+ # tech base, referred to directly below).
62
+ - id: tech_select
63
+ action: include
64
+ module: .appweaver/orchestrator/modules/tech-select.orch.yaml
65
+ with: { command: aw-spec-implement-delta }
66
+
67
+ # 1. Resolve the current feature + its master design (the base context).
68
+ - id: feature_paths
69
+ action: execute_script
70
+ on_error: continue # never crash raw on 'no feature set' — the gate below explains it
71
+ script: { ref: actions }
72
+ subcommand: feature-paths
73
+ outputs:
74
+ - { name: feature_dir, from: "$.feature_dir" }
75
+ - { name: design_doc, from: "$.design_file" }
76
+ - { name: design_exists, from: "$.design_exists" }
77
+
78
+ - id: require_feature
79
+ action: verify_context
80
+ require_non_empty: feature_dir
81
+ on_empty: stop
82
+ on_empty_message: "No active feature. Run /appweaver select-feature first (pick or create the aggregate, e.g. Order), then re-run implement-delta."
83
+
84
+ - id: verify_design
85
+ action: verify_context
86
+ require_true: design_exists
87
+ on_false: stop
88
+ on_false_message: "No design.md for the current feature. Run /appweaver design (and, for a change, /appweaver specify + design + analyze-delta-design) first."
89
+
90
+ # 1b. Read the OPEN change (opened by cr). implement-delta needs a change to implement.
91
+ # Require the SERVICE LANE and its source path — implement-delta writes into the
92
+ # subtree the lane owns, exactly as implement does.
93
+ - id: lane_gate
94
+ action: include
95
+ module: .appweaver/orchestrator/modules/lane-gate.orch.yaml
96
+ with: { require: backend, command: "/appweaver implement-delta" }
97
+
98
+ - id: read_change
99
+ action: execute_script
100
+ script: { ref: actions }
101
+ subcommand: version-read
102
+ args: ["--feature-dir", "{{feature_dir}}"]
103
+ outputs:
104
+ - { name: active_change, from: "$.active_change" }
105
+ - { name: has_change, from: "$.has_change" }
106
+
107
+ - id: require_change
108
+ action: verify_context
109
+ require_true: has_change
110
+ on_false: stop
111
+ on_false_message: "No open change on this feature. Run /appweaver specify <change> then /appweaver design, review the delta docs, and /appweaver analyze-delta-design before implement-delta."
112
+
113
+ # 1c. Require the PROJECT — a scaffolded, compiling tree — to be present. implement-delta
114
+ # GENERATES the delta's code INTO it; with no project there is nowhere to place the
115
+ # files. Searches the LANE'S OWN subtree for any ecosystem manifest before falling
116
+ # back to the whole repo, so a stack that ships no foundation bundle passes on the
117
+ # project its team scaffolded.
118
+ - id: detect_foundation
119
+ action: execute_script
120
+ script: { ref: actions }
121
+ subcommand: detect-project
122
+ args: ["--root", "{{lane_source_path}}"]
123
+ outputs:
124
+ - { name: foundation_present, from: "$.scaffolded" }
125
+ - { name: project_markers, from: "$.markers" }
126
+ - { name: project_scope, from: "$.scope" }
127
+
128
+ - id: foundation_gate
129
+ action: verify_context
130
+ require_true: foundation_present
131
+ on_false: stop
132
+ on_false_message: "No project found under the {{lane_id}} lane's source path `{{lane_source_path}}`, nor anywhere else in this repository. implement-delta GENERATES the delta's code into an existing project tree, so one has to be scaffolded first: run /appweaver foundation <FoundationName> <AppName> where a foundation bundle ships for this stack, or create the project with the stack's own tooling under that path. Any ecosystem manifest marks it — .sln/.csproj, pom.xml, build.gradle(.kts), package.json, go.mod, Cargo.toml or pyproject.toml."
133
+
134
+ # 2. Pre-execution hooks.
135
+ - id: resolve_pre_hooks
136
+ action: execute_script
137
+ script: { ref: actions }
138
+ subcommand: resolve-hooks
139
+ args: ["--phase", "before_implement_cr"]
140
+ outputs:
141
+ - { name: before_hooks, from: "$.hooks" }
142
+ - id: dispatch_pre_hooks
143
+ action: dispatch_hooks
144
+ hooks_from_variable: before_hooks
145
+
146
+ # 3. Model-driven generation SCOPED to the delta: delta-design.md → the ADDED/MODIFIED
147
+ # source files + paired tests. The master design.md is the base (unchanged elements
148
+ # the delta depends on); the constitution/stack profile fixes HOW. The delta spec is
149
+ # in context ONLY to cite traceability ids on the paired tests.
150
+ # Context is fed via build_context — agent_generate reads the ENVELOPE, not a
151
+ # step-level context: key (unlike agent_author/agent_query which read both).
152
+ - id: ctx_generate
153
+ action: build_context
154
+ context:
155
+ - { path: "{{feature_dir}}/changes/{{active_change}}/delta-design.md" }
156
+ - { path: "{{feature_dir}}/changes/{{active_change}}/delta-spec.md" }
157
+ - { path: "{{design_doc}}" }
158
+ - { path: .appweaver/memory/constitution.technical.md, optional: true } # technology base ONLY — no domain
159
+ - id: generate
160
+ action: agent_generate
161
+ tools: "Read,Write,Edit"
162
+ permission_mode: acceptEdits
163
+ task: |
164
+ Implement ONLY this change into the existing project tree, STRICTLY from its
165
+ delta-design.md (in context). The delta design is the authoritative source of
166
+ WHAT changed — analyze-delta-design already conformed it to the delta spec. The
167
+ master design.md (in context) is the BASE: the unchanged elements the delta
168
+ depends on; do NOT regenerate them. Guidance: {{USER_INPUT}}
169
+ Rules:
170
+ - SCOPE = THE DELTA ONLY. Realise exactly the elements delta-design.md marks
171
+ ADDED (create the new file) or MODIFIED (edit the existing file in place).
172
+ Touch NOTHING the delta does not list, except the regression re-tests below.
173
+ - THE DELTA DESIGN IS THE ONLY DOMAIN INPUT. You have the delta design + master
174
+ design.md + framework/code standards, and NO domain rule files. Introduce NO
175
+ domain rule, identifier, terminology, or behaviour the delta design does not
176
+ state. If something domain seems missing, STOP and surface it (fix it in cr /
177
+ analyze-delta-design); never invent it from memory.
178
+ - BIND THE STACK: this lane is `{{lane_id}}` — {{lane_title}}, language
179
+ {{lane_language}} ({{lane_ecosystem}}), declared in .appweaver/stacks.json and
180
+ compiled with `{{lane_build}}`, tested with `{{lane_test}}`. Generate in THAT
181
+ language and framework and no other, using its idioms, its project layout and
182
+ its test framework. Take persistence, messaging and the remaining technology
183
+ choices from the constitution's technology base + the loaded standards; the
184
+ design is technology-agnostic, so do not re-decide anything already fixed there.
185
+ If the loaded standards describe a DIFFERENT stack than the one above, the lane
186
+ wins on language and layout — the standards' stack-specific mechanics do not
187
+ apply, so follow their INTENT and STOP to surface the mismatch in your summary.
188
+ - WRITE ONLY UNDER `{{lane_source_path}}` — the source path the `{{lane_id}}`
189
+ lane declares in .appweaver/stacks.json. That subtree is this lane's, and a file
190
+ outside it belongs to another lane or to no lane at all.
191
+ - Follow the project's existing folder/layer convention + the loaded
192
+ coding-standards, dependency-policy and testing standards for HOW to structure,
193
+ name, and place files WITHIN that subtree. Match the surrounding code already
194
+ in the tree.
195
+ - Realise EVERY ADDED/MODIFIED delta element as code: one file per Domain type /
196
+ Application use-case / API endpoint / Infrastructure adapter, placed by layer.
197
+ Preserve the ubiquitous-language names verbatim. Enforce each new/changed
198
+ Domain invariant, handler orchestration, API error contract, the Cross-Cutting
199
+ Concerns realisations (audit / retention / data-exposure — CN-/DC-) and the
200
+ External Integrations table's contracts (IC-) exactly as the delta design states.
201
+ - COMPONENTS: if a delta element depends on a framework component, code against
202
+ its ABSTRACTION / port as the delta design declares — do NOT hand-roll it.
203
+ Installing the component (packages, wiring, config) is /appweaver
204
+ add-component <Component>; if the port isn't present, code to it and note that
205
+ as the prerequisite.
206
+ - Author a paired test for every ADDED/MODIFIED behaviour / use-case / endpoint;
207
+ derive the cases from the delta design's pre/post/invariant contracts and cite
208
+ the delta-spec id (FR / BR / CN / DC / IC / US).
209
+ - REGRESSION: for each element in the delta design's "Regression targets", verify
210
+ (add/adjust a test where needed) that the existing behaviour still holds after
211
+ a shared element changed — but do NOT rewrite that existing behaviour.
212
+ - Where generated code depends on a delta Assumption (DA-n) / Workaround (WA-n),
213
+ mark it with a comment citing that id.
214
+ outputs:
215
+ - { name: files, from: "$.files" }
216
+
217
+ - id: verify_generated
218
+ action: verify_context
219
+ require_non_empty: files
220
+ on_empty: stop
221
+ on_empty_message: "No files generated. Ensure /appweaver design produced a filled delta-design.md (not the empty template) and it passed /appweaver analyze-delta-design, then re-run."
222
+
223
+ # 3b. Refresh THIS slice's OKF concept source_files with the delta's changed files —
224
+ # UNION, never replace (the delta is scoped; {{files}} is only the ADDED/MODIFIED
225
+ # files). The cross-slice EDGES are refreshed later in finalize-delta, AFTER the delta
226
+ # merges into the master design.md (here the master still holds the pre-change deps,
227
+ # so recording edges now would read stale references). Best-effort enrichment.
228
+ - id: xref_concept_merge
229
+ action: execute_script
230
+ on_error: continue
231
+ script: { ref: xref }
232
+ subcommand: concept-upsert
233
+ args: ["--feature-dir", "{{feature_dir}}", "--source-files", "{{files}}", "--merge"]
234
+ outputs:
235
+ - { name: okf_concept, from: "$.concept" }
236
+
237
+ # 4. Post-execution hooks.
238
+ - id: resolve_post_hooks
239
+ action: execute_script
240
+ script: { ref: actions }
241
+ subcommand: resolve-hooks
242
+ args: ["--phase", "after_implement_cr"]
243
+ outputs:
244
+ - { name: after_hooks, from: "$.hooks" }
245
+ - id: dispatch_post_hooks
246
+ action: dispatch_hooks
247
+ hooks_from_variable: after_hooks
248
+
249
+ outputs:
250
+ feature_dir: "{{feature_dir}}"
251
+ cr_id: "{{active_change}}"
252
+ files: "{{files}}"
253
+ next: "/appweaver build → finalize-delta → analyze-slice → close-delta. COMPILE FIRST (build), then finalize-delta runs the downstream fence and merges the delta into spec.md + design.md — but leaves the change OPEN. analyze-slice then verifies the slice against that now-merged master (tests, domain conformance, referrer blast radius) while a red result is still recoverable. close-delta LAST archives the change and bumps the version."