aw-spec-cli 0.1.26 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/assets/.agents/skills/appweaver/SKILL.md +7 -47
  2. package/assets/.appweaver/ORCH-DIALECT.md +13 -9
  3. package/assets/.appweaver/RULE-PARTITION.md +11 -12
  4. package/assets/.appweaver/STACK-PROFILES.md +260 -108
  5. package/assets/.appweaver/domain.json +1 -1
  6. package/assets/.appweaver/interpreter/run-skill.py +28 -7
  7. package/assets/.appweaver/orchestrator/AGENT-PROFILE.md +38 -10
  8. package/assets/.appweaver/orchestrator/LAUNCHER.md +88 -0
  9. package/assets/.appweaver/orchestrator/README.md +120 -53
  10. package/assets/.appweaver/orchestrator/adapters/claude_agent_sdk.py +1 -1
  11. package/assets/.appweaver/orchestrator/modules/delta-plan.orch.yaml +17 -7
  12. package/assets/.appweaver/orchestrator/modules/domain-select.orch.yaml +6 -4
  13. package/assets/.appweaver/orchestrator/modules/foundation-lane.orch.yaml +237 -0
  14. package/assets/.appweaver/orchestrator/modules/foundation-pack.orch.yaml +392 -0
  15. package/assets/.appweaver/orchestrator/modules/foundation-spec.orch.yaml +548 -0
  16. package/assets/.appweaver/orchestrator/modules/lane-gate.orch.yaml +4 -4
  17. package/assets/.appweaver/orchestrator/modules/tech-select.orch.yaml +3 -3
  18. package/assets/.appweaver/orchestrator/orchestrator.py +162 -63
  19. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +5 -4
  20. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +3 -1
  21. package/assets/.appweaver/orchestrator/rev-templates/domain-constitution.skeleton.md +2 -2
  22. package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +2 -2
  23. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +21 -13
  24. package/assets/.appweaver/orchestrator/rev-templates/frontend-rule-file.skeleton.md +1 -1
  25. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +28 -31
  26. package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +2 -2
  27. package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +1 -1
  28. package/assets/.appweaver/orchestrator/rev-templates/ui-constitution.skeleton.md +3 -3
  29. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +4 -1
  30. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +6 -4
  31. package/assets/.appweaver/orchestrator/workflows/_smoke.orch.yaml +41 -3
  32. package/assets/.appweaver/orchestrator/workflows/aw-spec-add-component.orch.yaml +1 -1
  33. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +17 -16
  34. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +7 -1
  35. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +7 -1
  36. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +3 -3
  37. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice.orch.yaml +3 -3
  38. package/assets/.appweaver/orchestrator/workflows/aw-spec-build.orch.yaml +4 -4
  39. package/assets/.appweaver/orchestrator/workflows/aw-spec-characterize.orch.yaml +2 -2
  40. package/assets/.appweaver/orchestrator/workflows/aw-spec-constitution.orch.yaml +61 -12
  41. package/assets/.appweaver/orchestrator/workflows/aw-spec-deploy.orch.yaml +1 -1
  42. package/assets/.appweaver/orchestrator/workflows/aw-spec-foundation.orch.yaml +172 -293
  43. package/assets/.appweaver/orchestrator/workflows/aw-spec-implement.orch.yaml +253 -44
  44. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +72 -71
  45. package/assets/.appweaver/orchestrator/workflows/aw-spec-parity.orch.yaml +2 -2
  46. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +38 -14
  47. package/assets/.appweaver/orchestrator/workflows/aw-spec-run.orch.yaml +4 -4
  48. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-bounded-context.orch.yaml +26 -2
  49. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-domain.orch.yaml +21 -15
  50. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +14 -14
  51. package/assets/.appweaver/orchestrator/workflows/aw-spec-specify.orch.yaml +3 -3
  52. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-model.orch.yaml +3 -3
  53. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-prototype.orch.yaml +6 -6
  54. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +371 -131
  55. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +293 -76
  56. package/assets/.appweaver/scripts/python/aw-foundation.py +885 -20
  57. package/assets/.appweaver/scripts/python/aw-inventory.py +28 -21
  58. package/assets/.appweaver/scripts/python/aw-plan-coverage.py +2 -2
  59. package/assets/.appweaver/scripts/python/aw-rev-constitution.py +6 -6
  60. package/assets/.appweaver/scripts/python/aw-stack.py +676 -99
  61. package/assets/.appweaver/stack-profiles/angular.json +2 -1
  62. package/assets/.appweaver/stack-profiles/blazor-wasm.json +2 -1
  63. package/assets/.appweaver/stack-profiles/dotnet-webapi.json +18 -3
  64. package/assets/.appweaver/stack-profiles/go-chi.json +6 -1
  65. package/assets/.appweaver/stack-profiles/java-spring.json +14 -5
  66. package/assets/.appweaver/stack-profiles/nextjs.json +2 -1
  67. package/assets/.appweaver/stack-profiles/node-express.json +8 -2
  68. package/assets/.appweaver/stack-profiles/python-fastapi.json +9 -2
  69. package/assets/.appweaver/stack-profiles/react-vite.json +2 -1
  70. package/assets/.appweaver/stack-profiles/sveltekit.json +2 -1
  71. package/assets/.appweaver/stack-profiles/vue-vite.json +2 -1
  72. package/assets/.appweaver/stacks.json +40 -1
  73. package/assets/.appweaver/templates/constitution-ui-template.md +2 -2
  74. package/assets/.appweaver/templates/delta-design-template.md +7 -5
  75. package/assets/.appweaver/templates/design-template.md +3 -0
  76. package/assets/.appweaver/templates/ui-delta-design-template.md +1 -1
  77. package/assets/.appweaver/templates/ui-design-template.md +6 -4
  78. package/assets/.claude/skills/appweaver/SKILL.md +7 -46
  79. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.Reference.rules.json +31 -0
  80. package/assets/foundations/dotnet/ModularMonolith/ModularMonolith.lane.json +6 -0
  81. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.Reference.rules.json +16 -0
  82. package/assets/foundations/dotnet/VerticalSlice/VerticalSlice.lane.json +6 -0
  83. package/assets/foundations/foundation.spec.template.txt +98 -0
  84. package/assets/foundations/java/Hexagonal/Hexagonal.lane.json +6 -0
  85. package/assets/foundations/java/Hexagonal/Hexagonal.pack.txt +8 -1
  86. package/assets/foundations/java/Hexagonal/unpack-foundation.sh +4 -5
  87. package/assets/foundations/node/NextAppRouter/NextAppRouter.spec.txt +68 -0
  88. package/assets/guardrails/README.md +31 -17
  89. package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain-rule-bindings.md +25 -13
  90. package/assets/guardrails/project-specific/tech-rule-bindings.md +296 -0
  91. package/assets/guardrails/technology/dotnet-webapi/PACKAGING.md +58 -4
  92. package/assets/guardrails/technology/dotnet-webapi/api-versioning.md +1 -1
  93. package/assets/guardrails/technology/dotnet-webapi/auditing.md +1 -1
  94. package/assets/guardrails/technology/dotnet-webapi/authorization.md +1 -1
  95. package/assets/guardrails/technology/dotnet-webapi/clean-architecture.md +1 -1
  96. package/assets/guardrails/technology/dotnet-webapi/coding-standards.md +1 -1
  97. package/assets/guardrails/technology/dotnet-webapi/cqrs.md +1 -1
  98. package/assets/guardrails/technology/dotnet-webapi/data-classification.md +1 -1
  99. package/assets/guardrails/technology/dotnet-webapi/dependency-policy.md +1 -1
  100. package/assets/guardrails/technology/dotnet-webapi/eventing.md +1 -1
  101. package/assets/guardrails/technology/dotnet-webapi/folder-structure.md +1 -1
  102. package/assets/guardrails/technology/dotnet-webapi/framework-api-map.md +1 -1
  103. package/assets/guardrails/technology/dotnet-webapi/modular-monolith.md +1 -1
  104. package/assets/guardrails/technology/dotnet-webapi/persistence.md +1 -1
  105. package/assets/guardrails/technology/dotnet-webapi/testing.md +1 -1
  106. package/assets/guardrails/technology/dotnet-webapi/vertical-slices.md +1 -1
  107. package/assets/guardrails/technology/dotnet-webapi/zero-trust.md +1 -1
  108. package/assets/guardrails/technology/nextjs/accessibility-implementation.md +1 -1
  109. package/assets/guardrails/technology/nextjs/api-client.md +1 -1
  110. package/assets/guardrails/technology/nextjs/api-integration.dotnet-webapi.md +1 -1
  111. package/assets/guardrails/technology/nextjs/api-integration.java-spring.md +1 -1
  112. package/assets/guardrails/technology/nextjs/auth-session.md +1 -1
  113. package/assets/guardrails/technology/nextjs/client-security.md +1 -1
  114. package/assets/guardrails/technology/nextjs/component-architecture.md +1 -1
  115. package/assets/guardrails/technology/nextjs/component-conventions.md +2 -2
  116. package/assets/guardrails/technology/nextjs/design-system.md +1 -1
  117. package/assets/guardrails/technology/nextjs/error-handling.md +1 -1
  118. package/assets/guardrails/technology/nextjs/forms-and-validation.md +1 -1
  119. package/assets/guardrails/technology/nextjs/frontend-testing.md +1 -1
  120. package/assets/guardrails/technology/nextjs/i18n.md +1 -1
  121. package/assets/guardrails/technology/nextjs/observability.md +1 -1
  122. package/assets/guardrails/technology/nextjs/performance-budgets.md +1 -1
  123. package/assets/guardrails/technology/nextjs/routing-navigation.md +1 -1
  124. package/assets/guardrails/technology/nextjs/state-management.md +1 -1
  125. package/assets/guardrails/technology/nextjs/ui-constitution.md +3 -3
  126. package/package.json +1 -1
  127. package/assets/.agents/skills/appweaver-demo/SKILL.md +0 -59
  128. package/assets/.appweaver/orchestrator/.smoke-out/smoke.md +0 -6
  129. package/assets/.appweaver/orchestrator/workflows/aw-spec-demo.orch.yaml +0 -100
  130. package/assets/.claude/skills/appweaver-demo/SKILL.md +0 -59
  131. package/assets/.kilocode/agent.json +0 -28
  132. package/assets/.kilocode/workflows/appweaver-demo.md +0 -59
  133. package/assets/.kilocode/workflows/appweaver.md +0 -55
  134. package/assets/guardrails/projects/dotnet-default-project/tech-rule-bindings.md +0 -271
  135. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/domain/domain-requirements.md +0 -0
  136. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/frontend/ui-requirements.md +0 -0
  137. /package/assets/guardrails/{projects/dotnet-default-project → project-specific}/service/technical-requirements.md +0 -0
@@ -1,56 +1,16 @@
1
1
  ---
2
2
  name: "appweaver"
3
- description: "Parametric launcher (Antigravity): run ANY converted aw-spec skill on the aw-orchestrator under one of the 4 strategies (agent [default], spawn, sdk, sdk-apply)."
4
- argument-hint: "<skill> [strategy] [input…] — e.g. 'select-domain', 'specify spawn Build an order API', 'analyze-slice'"
5
- compatibility: "Requires .appweaver/orchestrator/ and the agy CLI on PATH"
3
+ description: "Parametric launcher: run ANY converted aw-spec skill on the aw-orchestrator under one of the 4 strategies (agent [default], spawn, sdk, sdk-apply)."
4
+ argument-hint: "<skill> [strategy] [input…] — e.g. 'select-stack', 'specify spawn Build an order API', 'analyze-slice'"
5
+ compatibility: "Requires .appweaver/orchestrator/ and python3"
6
6
  user-invocable: true
7
7
  disable-model-invocation: false
8
8
  ---
9
9
 
10
- # Orchestrator Skill Launcher
10
+ # AppWeaver launcher
11
11
 
12
- Runs one converted `aw-spec-*` workflow on the shared, agent-agnostic engine. All orchestration and **all context management live in the workflow YAML + engine** (`.appweaver/orchestrator/orchestrator.py`): the interpreter assembles the COMPLETE payload (system + user) for every request; you never author generation context yourself. Execution follows the chosen strategy; the checkpoint channel carries every human-facing interaction regardless of strategy.
12
+ Read `.appweaver/orchestrator/LAUNCHER.md` and follow it exactly.
13
13
 
14
- - **Engine + workflows (common, shared by all agents):** `.appweaver/orchestrator/orchestrator.py`, `.appweaver/orchestrator/workflows/aw-spec-<skill>.orch.yaml`, shared modules in `.appweaver/orchestrator/modules/`, shared scripts in `.appweaver/scripts/`
15
- - **This agent's transport profile:** `.agents/agent.json`
14
+ Several agents read this folder, so this launcher names no agent: find the row for the agent you are in the profile table of `LAUNCHER.md` — that row is your transport profile. If you have no row, only the `agent` strategy is available.
16
15
 
17
- > Antigravity spawns via the `agy` CLI (Gemini-based; no `--system-prompt`,
18
- > so `system` is folded into the prompt — isolation is best-effort). Its
19
- > `sdk` block declares the SDK the `sdk`/`sdk-apply` strategies import
20
- > (`google-antigravity`) and the adapter
21
- > (`.appweaver/orchestrator/adapters/google_antigravity.py`, shared per-SDK)
22
- > that owns its calling convention.
23
-
24
- ## Execution Steps
25
-
26
- 1. **Parse Arguments** (`<skill> [strategy] [input…]`):
27
- - `skill` (required): the aw-spec skill name, e.g. `demo`, `select-domain`, `foundation`, `specify`, `design`, `implement`, `build`. Resolve the workflow file `.appweaver/orchestrator/workflows/aw-spec-<skill>.orch.yaml`. If it does not exist, list the available `aw-spec-*.orch.yaml` files in that folder and stop.
28
- - `strategy` (optional, one of `agent`, `spawn`, `sdk`, `sdk-apply`; default `agent` — YOU fulfill each generation through the checkpoint channel, no profile needed): who executes each generation. Always pass `--strategy <strategy>`.
29
- - Everything after the strategy is the user input: pass it as `--input "<text>"` (omit when empty).
30
- - `--agent-profile .agents/agent.json` is required for `spawn`, `sdk`, and `sdk-apply` (`agent` needs no profile). If the SDK package isn't installed, add `--sdk-install`.
31
- - **Always** pass `--checkpoint .appweaver/orchestrator/.state/<skill>.state.json` — for EVERY strategy. Converted skills contain interactive steps (questions, selections, hooks); the checkpoint is how they reach you and the user. Strategies only govern who generates.
32
- - `spawn` may also add `--isolation bare|fresh` and `--model <name>`; `sdk`/`sdk-apply` accept `--model <name>`.
33
-
34
- 2. **Run the Interpreter**:
35
- ```bash
36
- python3 .appweaver/orchestrator/orchestrator.py \
37
- .appweaver/orchestrator/workflows/aw-spec-<skill>.orch.yaml \
38
- --strategy <strategy> \
39
- --checkpoint .appweaver/orchestrator/.state/<skill>.state.json \
40
- [--agent-profile .agents/agent.json] # spawn, sdk, sdk-apply \
41
- [--input "<user input>"] \
42
- --json
43
- ```
44
-
45
- 3. **Handle the Suspend/Resume Loop** — whenever the command exits with code `2`, read the printed `pending` JSON and dispatch on `pending.kind`; fulfill it, write the response to `pending.response_path`, then re-run the SAME command. Repeat until exit `0` (done) or `1` (stopped by a gate).
46
- - **`ask`** — ask the USER the `prompt` with the listed `options` (use your question tool). Write the chosen answer as PLAIN TEXT to `response_path` (comma-separated values when `multi` is true).
47
- - **`select`** — ask the USER to pick ONE of `options`; write the chosen value as plain text to `response_path`.
48
- - **`hook`** — run each MANDATORY hook in `hooks` (each is a slash command of THIS agent) in this conversation; optional hooks at your discretion. Then write `done` to `response_path`.
49
- - **`author`** — read `system_path` + `user_path` and treat them as your ONLY standards and context. Author the COMPLETE content of the file named in `target` and write it — content ONLY, no commentary, no code fence — to `response_path`. Do NOT write the target file yourself; the interpreter does that.
50
- - **`agent_generate`** — read `system_path` + `user_path`; perform the task YOURSELF with the listed `tools` within `permission_mode`; write your full final reply — ending with the required ```json fence — to `response_path`.
51
- - **`agent_query` / `agent_review`** — same as above but READ-ONLY (do not modify files); the reply must end with the required ```json fence.
52
- - **`apply`** — an isolated generation already decided the changes: read `artifact_path` and write its file contents EXACTLY to the paths it names, then write the confirmation ```json fence to `response_path`.
53
- - If `pending.note` is present, your previous response was rejected — follow the note and rewrite `response_path`.
54
-
55
- 4. **Report**:
56
- Report the final JSON (`status`, `outputs`, and any `reason`) to the user. On `stopped`, relay the gate message verbatim — it tells the user what to fix or run first.
16
+ The arguments are the text the user typed after `/appweaver`.
@@ -8,8 +8,9 @@ step/`outputs:`/`condition:` conventions, but built for
8
8
  the **orchestrator model**: the interpreter assembles 100% of every model
9
9
  payload (system = standards/rules, user = artifacts + task) and a **fresh
10
10
  agent** executes it under one of the 4 strategies. Everything here is common
11
- across agent roots — `.claude`, `.agents`, `.kilocode` differ only in their
12
- transport profile (`agent.json`) and their thin `/appweaver` launcher.
11
+ across agent roots — each agent differs only in its transport profile
12
+ (`agent.json`) and a thin `/appweaver` launcher that points at the shared
13
+ `orchestrator/LAUNCHER.md`.
13
14
 
14
15
  ## Layout (the common folder)
15
16
 
@@ -19,6 +20,8 @@ transport profile (`agent.json`) and their thin `/appweaver` launcher.
19
20
  ORCH-DIALECT.md → this doc lives at .appweaver/ORCH-DIALECT.md
20
21
  README.md strategies, transports, checkpoint machinery
21
22
  AGENT-PROFILE.md profile (agent.json) reference
23
+ LAUNCHER.md the /appweaver instructions every agent's launcher points at,
24
+ with the profile table (which agent → which agent.json)
22
25
  adapters/ shared per-SDK adapters (claude_agent_sdk, google_antigravity)
23
26
  modules/ shared includable modules (*.orch.yaml): delta-design,
24
27
  delta-spec, domain-select, lane-gate, tech-select
@@ -33,7 +36,7 @@ transport profile (`agent.json`) and their thin `/appweaver` launcher.
33
36
 
34
37
  ## Execution model (strictly held)
35
38
 
36
- 1. **Context management is the orchestrator's** — as in `workflows/aw-spec-demo.orch.yaml`.
39
+ 1. **Context management is the orchestrator's** — as in `workflows/aw-spec-specify.orch.yaml`.
37
40
  `build_context` REPLACES the per-request envelope; `load_standards`
38
41
  maintains the sticky system prefix. Per-step `context:` is THIS request only
39
42
  and is never appended onto the envelope. No agent ever assembles its own context.
@@ -91,15 +94,15 @@ the raw object, not its JSON string.
91
94
  | `build_context` | engine | REPLACE the per-request envelope: `system:`/`context:` file lists (+ `context_from: <var>` — or a list of vars, appended in order — holding paths a prior step produced, + `vars:`) |
92
95
  | `load_standards` | engine | F4 — append to the **sticky standards set** prepended to every system block (dedup, `optional:`, `files:`/`files_from_variable`). This is the byte-stable, prompt-cacheable prefix |
93
96
  | `execute_script` | engine | F1 — run a `scripts:` ref (`subcommand:` + `args:`; sh/ps1 via `--os`); stdout's last line = JSON, bound via `outputs[]`; `on_error: continue` tolerates a script that ran and exited non-zero (a JSON object on its last stdout line is still bound, so a gate can show the script's own reason; with none, the outputs bind empty) — never an undeclared ref, which the pre-flight refuses before step 1; cached across resumes; runs for real even in mock transport |
94
- | `verify_context` | engine | F2 — gates: `required_files` (+`allow_missing`), `require_non_empty` (+`on_empty[_message]`), `require_true` (+`on_false[_message]`), `require_value`+`equals` (+`on_mismatch[_message]`). `stop` raises a terminal stop |
95
- | `agent_generate` | fresh agent | demo contract (code work): agent DECIDES file paths per the loaded standards, writes with its tools, reports `files[]` in the trailing ```json fence; a reported path not on disk is dropped from `files` (and listed in `files_not_written`) before outputs bind, so a `require_non_empty` gate on it proves something was written. `sdk-apply` = read-only generation + invoking agent applies |
96
- | `agent_review` | fresh agent | payload-only review of `review_of_var`/`review_of` files (inlined into THIS request, never sticky) → `{pass, issues}` |
97
+ | `verify_context` | engine | F2 — gates: `required_files` (+`allow_missing`), `require_non_empty` (+`on_empty[_message]`), `require_true` (+`on_false[_message]`), `require_value`+`equals` (+`on_mismatch[_message]`). Outcomes: `stop` raises a terminal stop; `return` ends the module being included and the caller carries on with the step after its `include` (at the top level it ends the run normally, outputs resolved); `continue` (or the outcome absent, for `on_empty`) carries on. `message_var: <name>` binds a failed gate's resolved message, so a caller that returns or continues can still report why. `--validate` rejects any other outcome |
98
+ | `agent_generate` | fresh agent | code work (`_smoke`'s `gen_file` is the minimal example): agent DECIDES file paths per the loaded standards, writes with its tools, reports `files[]` in the trailing ```json fence; a reported path not on disk is dropped from `files` (and listed in `files_not_written`) before outputs bind, so a `require_non_empty` gate on it proves something was written. `sdk-apply` = read-only generation + invoking agent applies |
99
+ | `agent_review` | fresh agent | payload-only review of `review_of_var`/`review_of` files (inlined into THIS request, never sticky) → `{pass, issues}`; `_smoke`'s `review_file` reviews what `gen_file` reported |
97
100
  | `agent_author` | fresh agent | F5 — **authored artifact** (decl `llm_generate`): the INTERPRETER owns `output_target: {type: file, path}`. Generation is payload-only under every strategy (mapped `context:` + sticky envelope + standards are the entire world) and never writes — the ENGINE writes the returned content (sdk-apply degrades to sdk). Optional `context:` (per-request extras), `include_standards: false` (narrow payload), `tools:` (read-only opt-in for a task that names files by path) |
98
101
  | `agent_query` | fresh agent | F6 — generic payload-only structured JSON (decl `llm_query`): `schema:` shapes the required fence, `outputs[]` binds it, `mock:` supplies the mock-transport result; one malformed-JSON retry on fresh strategies. Same tools contract as `agent_author` — none unless the step declares `tools:` |
99
102
  | `ask` | human (via launcher) | F7 — question: `prompt`, `options`/`options_from`/`options_from_variable`, `multi`, `answer_key`, `answer_var` (default `answer`). Sources in order: cache → `--answer k=v` → `--non-interactive` (first option; all when multi) → checkpoint suspend `ask` → stdin |
100
103
  | `user_select` | human (via launcher) | F7 — pick ONE from `options_from_variable`; `preselect_from` (direct-argument fast path), `single_option_confirm`; `--select stepid=v`; binds `selection` + `outputs[]` |
101
104
  | `dispatch_hooks` | invoking agent | F8 — suspend kind `hook` with the `hooks_from_variable` list (slash commands of the LAUNCHING agent); logged-only without a checkpoint; never re-fires across resumes |
102
- | `include` | engine | F9 — run a module `.orch.yaml` inline: shares vars/envelope/standards/scripts/replay-cache; a module's own `scripts:` EXTEND the caller's map by `setdefault`, so the caller's ref wins on a clash and every module can declare what it invokes and still validate standalone; `with:` seeds inputs; cache keys namespaced `inc:<id>/…`; module `Stop` stops the caller |
105
+ | `include` | engine | F9 — run a module `.orch.yaml` inline: shares vars/envelope/standards/scripts/replay-cache; a module's own `scripts:` EXTEND the caller's map by `setdefault`, so the caller's ref wins on a clash and every module can declare what it invokes and still validate standalone; `with:` seeds inputs; cache keys namespaced `inc:<id>/…`; module `Stop` stops the caller, a gate's `return` ends only the module. Vars are SHARED, not scoped: a module included twice (once per lane) resets its own vars first, or the second pass reads the first's answers |
103
106
  | `loop` | engine | `while: <cond>` + `max_iterations` (default 5), or F3 foreach `over: "{{list}}"` + `as: item` (binds `item`, `item_index`, `iteration`); `break` (+`condition:`) exits the innermost loop |
104
107
 
105
108
  Decl steps may keep their `parameters:` wrapper — every ported action reads
@@ -167,5 +170,6 @@ orchestrator.py <workflow.orch.yaml>
167
170
  reason, before any step runs and before a checkpoint response is ingested.
168
171
  Warnings never block.
169
172
  - `workflows/_smoke.orch.yaml` exercises every construct with no model and no
170
- writes outside `.smoke-out`: run it `--non-interactive` (CI) and with
171
- `--checkpoint` (protocol walk-through).
173
+ writes outside `.smoke-out` — including an `agent_generate` edit step (the
174
+ mock writes `SmokeGenerated.cs`) and an `agent_review` of what it reported:
175
+ run it `--non-interactive` (CI) and with `--checkpoint` (protocol walk-through).
@@ -78,8 +78,8 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
78
78
  - **Domain rule files: NEVER.** Domain reaches plan solely as spec ids and the context's
79
79
  `domain-model.md`.
80
80
  - **Technical rule files: yes** — the architecture and cross-cutting rules each lane's plan
81
- mediates the spec against: `## /aw-spec-plan` for the service lane, `## /aw-spec-plan-ui`
82
- for the frontend lane.
81
+ mediates the spec against: `## /aw-spec-plan-backend` for the service lane,
82
+ `## /aw-spec-plan-frontend` for the frontend lane.
83
83
  - Constitution: the **technical** half in the service lane, the **UI** half in the frontend one.
84
84
 
85
85
  ### `implement` — *code generation, both lanes, both paths*
@@ -91,10 +91,9 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
91
91
  `domain-model.<CR-id>.delta.md` joins it, since the master is not merged until
92
92
  finalize-delta. The model is READ, never mined for work: what it holds and no plan element
93
93
  realises is a planning gap, not code to invent.
94
- - **Technical rule files: yes** — the code-generation and convention set, keyed per lane and,
95
- for the service lane, per path: `## /aw-spec-implement` generating a master plan,
96
- `## /aw-spec-implement-delta` generating a change's delta plan, `## /aw-spec-implement-ui`
97
- for the frontend lane either way.
94
+ - **Technical rule files: yes** — the code-generation and convention set, keyed per lane, the
95
+ same on the master and the delta path: `## /aw-spec-implement-backend` for the service lane,
96
+ `## /aw-spec-implement-frontend` for the frontend lane.
98
97
  - Constitution: the **technical** half in the service lane, the **UI** half in the frontend one.
99
98
 
100
99
  ### `build` — *compile + repair*
@@ -126,15 +125,15 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
126
125
  - **Which lanes exist is the declaration's answer.** `select-stack` runs first and writes
127
126
  `.appweaver/stacks.json`; onboard refuses to start without it. A lane declared there gets its
128
127
  half and its rule set, a lane declared `(none)` gets neither, and the scan — pointed at the
129
- declared source path — decides what the governance SAYS, never whether the lane exists. A
128
+ declared lane root folder — decides what the governance SAYS, never whether the lane exists. A
130
129
  declared UI lane whose path holds no recognisable UI source is reported, and its governance is
131
130
  authored thin rather than skipped.
132
131
  - The **UI half** is authored from the lane's code, not from a map heading, because at onboard
133
132
  there is no map to read. The order is therefore inverted: the half is authored from the code,
134
133
  then the `frontend/` rule set is generated as its detail layer, then the lane's three headings
135
134
  are appended to the technical map — `## /aw-spec-ui-constitution` (what a LATER `constitution`
136
- run re-ratifies from, so it behaves like the greenfield case above), `## /aw-spec-plan-ui` and
137
- `## /aw-spec-implement-ui` (what the frontend lane of `plan` and `implement` load).
135
+ run re-ratifies from, so it behaves like the greenfield case above), `## /aw-spec-plan-frontend`
136
+ and `## /aw-spec-implement-frontend` (what the frontend lane of `plan` and `implement` load).
138
137
  - `onboard` **never writes** `.appweaver/stacks.json`. `lane-declare` is its sole writer and
139
138
  `select-stack` its only caller, so every lane is one a person confirmed.
140
139
  - The **document templates** it derives obey the same partition as the halves that govern them:
@@ -160,7 +159,7 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
160
159
  - Same partition, reversed: the reversed **spec** is authored with domain rules in context; the
161
160
  reversed **plan** is authored with the technical set only, so the plan stays domain-free.
162
161
  - Each lane's reversed plan is authored under its own lane's rules, as in `plan`: the backend
163
- plan under `## /aw-spec-adopt`, and the frontend plan under `## /aw-spec-plan-ui`, which
162
+ plan under `## /aw-spec-adopt-backend`, and the frontend plan under `## /aw-spec-plan-frontend`, which
164
163
  REPLACES the backend set before that step rather than stacking on it.
165
164
  - Technical files here are **reference, not authority — the CODE wins.**
166
165
 
@@ -190,8 +189,8 @@ lane loads the technical base, the frontend lane loads the UI base. What they sh
190
189
 
191
190
  | Map | Reader | Class |
192
191
  |---|---|---|
193
- | `guardrails/projects/<project>/domain-rule-bindings.md` | `resolve-domain` | domain rule files |
194
- | `guardrails/projects/<project>/tech-rule-bindings.md` | `resolve-tech` | technical rule files |
192
+ | `guardrails/<project>/domain-rule-bindings.md` | `resolve-domain` | domain rule files |
193
+ | `guardrails/<project>/tech-rule-bindings.md` | `resolve-tech` | technical rule files |
195
194
 
196
195
  Each map keys on `## /aw-spec-<command>` headings whose `- ` bullets are workspace-relative
197
196
  file paths — pointing into the shared corpora at `guardrails/technology/<stack>/` and