@aperant/framework 0.17.0 → 0.20.0

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 (242) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/agents/apt-executor.md +6 -0
  3. package/agents/apt-planner.md +3 -2
  4. package/bin/features-reconcile-check.mjs +77 -0
  5. package/dist/cli/artifacts/self-stage.d.mts.map +1 -1
  6. package/dist/cli/artifacts/self-stage.mjs +2 -1
  7. package/dist/cli/artifacts/self-stage.mjs.map +1 -1
  8. package/dist/cli/cli-wrappers/features-reconcile.d.mts +2 -0
  9. package/dist/cli/cli-wrappers/features-reconcile.d.mts.map +1 -0
  10. package/dist/cli/cli-wrappers/features-reconcile.mjs +9 -0
  11. package/dist/cli/cli-wrappers/features-reconcile.mjs.map +1 -0
  12. package/dist/cli/commands/ci-watch.mjs +49 -2
  13. package/dist/cli/commands/ci-watch.mjs.map +1 -1
  14. package/dist/cli/commands/commit.mjs +3 -3
  15. package/dist/cli/commands/commit.mjs.map +1 -1
  16. package/dist/cli/commands/event.mjs +16 -16
  17. package/dist/cli/commands/event.mjs.map +1 -1
  18. package/dist/cli/commands/features-reconcile.d.mts +2 -0
  19. package/dist/cli/commands/features-reconcile.d.mts.map +1 -0
  20. package/dist/cli/commands/features-reconcile.mjs +143 -0
  21. package/dist/cli/commands/features-reconcile.mjs.map +1 -0
  22. package/dist/cli/commands/health-check.d.mts +2 -2
  23. package/dist/cli/commands/health-check.mjs +2 -2
  24. package/dist/cli/commands/merge-integrate.mjs +3 -3
  25. package/dist/cli/commands/merge-integrate.mjs.map +1 -1
  26. package/dist/cli/commands/produce.d.mts +9 -0
  27. package/dist/cli/commands/produce.d.mts.map +1 -0
  28. package/dist/cli/commands/produce.mjs +1345 -0
  29. package/dist/cli/commands/produce.mjs.map +1 -0
  30. package/dist/cli/commands/task.d.mts +16 -1
  31. package/dist/cli/commands/task.d.mts.map +1 -1
  32. package/dist/cli/commands/task.mjs +434 -266
  33. package/dist/cli/commands/task.mjs.map +1 -1
  34. package/dist/cli/coordination/auto-emit-artifact-ready.mjs +5 -5
  35. package/dist/cli/coordination/auto-emit-artifact-ready.mjs.map +1 -1
  36. package/dist/cli/coordination/event-schema.d.mts +5 -3
  37. package/dist/cli/coordination/event-schema.d.mts.map +1 -1
  38. package/dist/cli/coordination/event-schema.mjs +245 -21
  39. package/dist/cli/coordination/event-schema.mjs.map +1 -1
  40. package/dist/cli/coordination/store.d.mts +2 -2
  41. package/dist/cli/coordination/store.mjs +4 -4
  42. package/dist/cli/coordination/store.mjs.map +1 -1
  43. package/dist/cli/dispatch.d.mts.map +1 -1
  44. package/dist/cli/dispatch.mjs +4 -2
  45. package/dist/cli/dispatch.mjs.map +1 -1
  46. package/dist/cli/features/area-shape.d.mts +11 -0
  47. package/dist/cli/features/area-shape.d.mts.map +1 -0
  48. package/dist/cli/features/area-shape.mjs +141 -0
  49. package/dist/cli/features/area-shape.mjs.map +1 -0
  50. package/dist/cli/features/delta.d.mts +78 -0
  51. package/dist/cli/features/delta.d.mts.map +1 -0
  52. package/dist/cli/features/delta.mjs +591 -0
  53. package/dist/cli/features/delta.mjs.map +1 -0
  54. package/dist/cli/features/reconcile.d.mts +236 -0
  55. package/dist/cli/features/reconcile.d.mts.map +1 -0
  56. package/dist/cli/features/reconcile.mjs +1126 -0
  57. package/dist/cli/features/reconcile.mjs.map +1 -0
  58. package/dist/cli/features/surface-map.d.mts +63 -0
  59. package/dist/cli/features/surface-map.d.mts.map +1 -0
  60. package/dist/cli/features/surface-map.mjs +191 -0
  61. package/dist/cli/features/surface-map.mjs.map +1 -0
  62. package/dist/cli/{commands/features-audit.d.mts → features/write-root.d.mts} +4 -3
  63. package/dist/cli/features/write-root.d.mts.map +1 -0
  64. package/dist/cli/features/write-root.mjs +137 -0
  65. package/dist/cli/features/write-root.mjs.map +1 -0
  66. package/dist/cli/gate/gates/features-reconciled.d.mts +36 -0
  67. package/dist/cli/gate/gates/features-reconciled.d.mts.map +1 -0
  68. package/dist/cli/gate/gates/features-reconciled.mjs +67 -0
  69. package/dist/cli/gate/gates/features-reconciled.mjs.map +1 -0
  70. package/dist/cli/gate/gates/index.mjs +1 -0
  71. package/dist/cli/gate/gates/index.mjs.map +1 -1
  72. package/dist/cli/help.d.mts.map +1 -1
  73. package/dist/cli/help.mjs +31 -1
  74. package/dist/cli/help.mjs.map +1 -1
  75. package/dist/cli/install/legacy-paths.d.mts.map +1 -1
  76. package/dist/cli/install/legacy-paths.mjs +2 -0
  77. package/dist/cli/install/legacy-paths.mjs.map +1 -1
  78. package/dist/cli/produce/blind-probe.d.mts +85 -0
  79. package/dist/cli/produce/blind-probe.d.mts.map +1 -0
  80. package/dist/cli/produce/blind-probe.mjs +217 -0
  81. package/dist/cli/produce/blind-probe.mjs.map +1 -0
  82. package/dist/cli/produce/claim.d.mts +188 -0
  83. package/dist/cli/produce/claim.d.mts.map +1 -0
  84. package/dist/cli/produce/claim.mjs +518 -0
  85. package/dist/cli/produce/claim.mjs.map +1 -0
  86. package/dist/cli/produce/done-gate.d.mts +87 -0
  87. package/dist/cli/produce/done-gate.d.mts.map +1 -0
  88. package/dist/cli/produce/done-gate.mjs +200 -0
  89. package/dist/cli/produce/done-gate.mjs.map +1 -0
  90. package/dist/cli/produce/events.d.mts +77 -0
  91. package/dist/cli/produce/events.d.mts.map +1 -0
  92. package/dist/cli/produce/events.mjs +126 -0
  93. package/dist/cli/produce/events.mjs.map +1 -0
  94. package/dist/cli/produce/evidence-oracle.d.mts +63 -0
  95. package/dist/cli/produce/evidence-oracle.d.mts.map +1 -0
  96. package/dist/cli/produce/evidence-oracle.mjs +122 -0
  97. package/dist/cli/produce/evidence-oracle.mjs.map +1 -0
  98. package/dist/cli/produce/ledger.d.mts +140 -0
  99. package/dist/cli/produce/ledger.d.mts.map +1 -0
  100. package/dist/cli/produce/ledger.mjs +272 -0
  101. package/dist/cli/produce/ledger.mjs.map +1 -0
  102. package/dist/cli/produce/probe-family.d.mts +53 -0
  103. package/dist/cli/produce/probe-family.d.mts.map +1 -0
  104. package/dist/cli/produce/probe-family.mjs +160 -0
  105. package/dist/cli/produce/probe-family.mjs.map +1 -0
  106. package/dist/cli/produce/projection.d.mts +55 -0
  107. package/dist/cli/produce/projection.d.mts.map +1 -0
  108. package/dist/cli/produce/projection.mjs +97 -0
  109. package/dist/cli/produce/projection.mjs.map +1 -0
  110. package/dist/cli/produce/run-id.d.mts +42 -0
  111. package/dist/cli/produce/run-id.d.mts.map +1 -0
  112. package/dist/cli/produce/run-id.mjs +79 -0
  113. package/dist/cli/produce/run-id.mjs.map +1 -0
  114. package/dist/cli/produce/saga.d.mts +180 -0
  115. package/dist/cli/produce/saga.d.mts.map +1 -0
  116. package/dist/cli/produce/saga.mjs +290 -0
  117. package/dist/cli/produce/saga.mjs.map +1 -0
  118. package/dist/cli/produce/scheduler.d.mts +165 -0
  119. package/dist/cli/produce/scheduler.d.mts.map +1 -0
  120. package/dist/cli/produce/scheduler.mjs +399 -0
  121. package/dist/cli/produce/scheduler.mjs.map +1 -0
  122. package/dist/cli/produce/setpoint.d.mts +52 -0
  123. package/dist/cli/produce/setpoint.d.mts.map +1 -0
  124. package/dist/cli/produce/setpoint.mjs +113 -0
  125. package/dist/cli/produce/setpoint.mjs.map +1 -0
  126. package/dist/cli/produce/verification-ttl.d.mts +75 -0
  127. package/dist/cli/produce/verification-ttl.d.mts.map +1 -0
  128. package/dist/cli/produce/verification-ttl.mjs +169 -0
  129. package/dist/cli/produce/verification-ttl.mjs.map +1 -0
  130. package/dist/cli/release-notes/ship-autodraft.mjs +2 -2
  131. package/dist/cli/roadmap/{conductor-view.d.mts → showrunner-view.d.mts} +3 -3
  132. package/dist/cli/roadmap/showrunner-view.d.mts.map +1 -0
  133. package/dist/cli/roadmap/{conductor-view.mjs → showrunner-view.mjs} +7 -7
  134. package/dist/cli/roadmap/showrunner-view.mjs.map +1 -0
  135. package/dist/cli/variant/gallery.d.mts.map +1 -1
  136. package/dist/cli/variant/gallery.mjs +7 -3
  137. package/dist/cli/variant/gallery.mjs.map +1 -1
  138. package/dist/plugin/.claude-plugin/plugin.json +2 -1
  139. package/dist/plugin/agents/apt-executor.md +6 -0
  140. package/dist/plugin/agents/apt-planner.md +3 -2
  141. package/dist/plugin/skills/apt/SKILL.md +112 -38
  142. package/dist/plugin/skills/apt-close-task/SKILL.md +2 -2
  143. package/dist/plugin/skills/apt-debug/SKILL.md +22 -24
  144. package/dist/plugin/skills/apt-execute/SKILL.md +35 -26
  145. package/dist/plugin/skills/apt-fan-out/SKILL.md +4 -4
  146. package/dist/plugin/skills/apt-handoff/SKILL.md +1 -1
  147. package/dist/plugin/skills/apt-mockup/SKILL.md +1 -1
  148. package/dist/plugin/skills/apt-plan/SKILL.md +5 -5
  149. package/dist/plugin/skills/apt-plan/adapters/{conductor.md → showrunner.md} +16 -16
  150. package/dist/plugin/skills/apt-produce/SKILL.md +606 -0
  151. package/dist/plugin/skills/apt-quick/SKILL.md +27 -33
  152. package/dist/plugin/skills/apt-review/SKILL.md +14 -11
  153. package/dist/plugin/skills/apt-run/SKILL.md +132 -3
  154. package/dist/plugin/skills/apt-ship/SKILL.md +29 -5
  155. package/dist/plugin/skills/apt-spar/SKILL.md +5 -3
  156. package/dist/plugin/skills/apt-watch-ci/SKILL.md +6 -4
  157. package/dist/schemas/feature-registry.d.ts.map +1 -1
  158. package/dist/schemas/feature-registry.js +34 -3
  159. package/dist/schemas/feature-registry.js.map +1 -1
  160. package/dist/types/config.d.ts +8 -5
  161. package/dist/types/config.d.ts.map +1 -1
  162. package/package.json +4 -4
  163. package/prompts/{conductor-framework-context.md → showrunner-framework-context.md} +1 -1
  164. package/prompts/{conductor-status-check.md → showrunner-status-check.md} +1 -1
  165. package/prompts/{conductor-sub-agent.md → showrunner-sub-agent.md} +6 -6
  166. package/prompts/{conductor-system.md → showrunner-system.md} +8 -8
  167. package/skills/apt/SKILL.md +112 -38
  168. package/skills/apt-close-task/SKILL.md +2 -2
  169. package/skills/apt-debug/SKILL.md +22 -24
  170. package/skills/apt-execute/SKILL.md +35 -26
  171. package/skills/apt-fan-out/SKILL.md +4 -4
  172. package/skills/apt-handoff/SKILL.md +1 -1
  173. package/skills/apt-mockup/SKILL.md +1 -1
  174. package/skills/apt-plan/SKILL.md +5 -5
  175. package/skills/apt-plan/adapters/{conductor.md → showrunner.md} +16 -16
  176. package/skills/apt-produce/SKILL.md +606 -0
  177. package/skills/apt-quick/SKILL.md +27 -33
  178. package/skills/apt-review/SKILL.md +14 -11
  179. package/skills/apt-run/SKILL.md +132 -3
  180. package/skills/apt-ship/SKILL.md +29 -5
  181. package/skills/apt-spar/SKILL.md +5 -3
  182. package/skills/apt-watch-ci/SKILL.md +6 -4
  183. package/src/cli/artifacts/self-stage.mjs +2 -1
  184. package/src/cli/cli-wrappers/features-reconcile.mjs +9 -0
  185. package/src/cli/commands/ci-watch.mjs +51 -2
  186. package/src/cli/commands/commit.mjs +3 -3
  187. package/src/cli/commands/event.mjs +16 -16
  188. package/src/cli/commands/features-reconcile.mjs +157 -0
  189. package/src/cli/commands/health-check.mjs +2 -2
  190. package/src/cli/commands/merge-integrate.mjs +3 -3
  191. package/src/cli/commands/produce.mjs +1466 -0
  192. package/src/cli/commands/task.mjs +482 -285
  193. package/src/cli/coordination/auto-emit-artifact-ready.mjs +5 -5
  194. package/src/cli/coordination/event-schema.d.ts +4 -2
  195. package/src/cli/coordination/event-schema.mjs +276 -21
  196. package/src/cli/coordination/store.mjs +4 -4
  197. package/src/cli/dispatch.mjs +4 -2
  198. package/src/cli/features/area-shape.mjs +140 -0
  199. package/src/cli/features/delta.mjs +625 -0
  200. package/src/cli/features/reconcile.mjs +1169 -0
  201. package/src/cli/features/surface-map.mjs +192 -0
  202. package/src/cli/features/write-root.mjs +140 -0
  203. package/src/cli/gate/gates/features-reconciled.mjs +70 -0
  204. package/src/cli/gate/gates/index.mjs +1 -0
  205. package/src/cli/help.mjs +31 -1
  206. package/src/cli/install/legacy-paths.mjs +2 -0
  207. package/src/cli/produce/blind-probe.mjs +245 -0
  208. package/src/cli/produce/claim.mjs +543 -0
  209. package/src/cli/produce/done-gate.mjs +238 -0
  210. package/src/cli/produce/events.mjs +131 -0
  211. package/src/cli/produce/evidence-oracle.mjs +133 -0
  212. package/src/cli/produce/ledger.mjs +284 -0
  213. package/src/cli/produce/probe-family.mjs +168 -0
  214. package/src/cli/produce/projection.mjs +105 -0
  215. package/src/cli/produce/run-id.mjs +84 -0
  216. package/src/cli/produce/saga.mjs +303 -0
  217. package/src/cli/produce/scheduler.mjs +423 -0
  218. package/src/cli/produce/setpoint.mjs +122 -0
  219. package/src/cli/produce/verification-ttl.mjs +191 -0
  220. package/src/cli/release-notes/ship-autodraft.mjs +2 -2
  221. package/src/cli/roadmap/showrunner-view.d.ts +10 -0
  222. package/src/cli/roadmap/{conductor-view.mjs → showrunner-view.mjs} +6 -6
  223. package/src/cli/variant/gallery.mjs +7 -3
  224. package/templates/aperant-claude-md-appendix.md +2 -2
  225. package/workflows/scan-features.md +17 -11
  226. package/dist/cli/cli-wrappers/features-audit.d.mts +0 -2
  227. package/dist/cli/cli-wrappers/features-audit.d.mts.map +0 -1
  228. package/dist/cli/cli-wrappers/features-audit.mjs +0 -8
  229. package/dist/cli/cli-wrappers/features-audit.mjs.map +0 -1
  230. package/dist/cli/commands/features-audit.d.mts.map +0 -1
  231. package/dist/cli/commands/features-audit.mjs +0 -293
  232. package/dist/cli/commands/features-audit.mjs.map +0 -1
  233. package/dist/cli/features/registry-audit.d.mts +0 -56
  234. package/dist/cli/features/registry-audit.d.mts.map +0 -1
  235. package/dist/cli/features/registry-audit.mjs +0 -264
  236. package/dist/cli/features/registry-audit.mjs.map +0 -1
  237. package/dist/cli/roadmap/conductor-view.d.mts.map +0 -1
  238. package/dist/cli/roadmap/conductor-view.mjs.map +0 -1
  239. package/src/cli/cli-wrappers/features-audit.mjs +0 -8
  240. package/src/cli/commands/features-audit.mjs +0 -302
  241. package/src/cli/features/registry-audit.mjs +0 -254
  242. package/src/cli/roadmap/conductor-view.d.ts +0 -10
@@ -42,7 +42,7 @@ reproduction, so loading this appendix is non-trivial.
42
42
  - **apt-tools path:** `node packages/framework/bin/apt-tools.mjs` or the locally installed `apt-tools` binary
43
43
  - **Constitution:** Read `AGENTS.md` in the project root if it exists
44
44
  - **Debug sessions:** `.aperant/debug/{session-id}/DEBUG.md`
45
- - **Task-level worktree isolation:** A worktree is provisioned at session start by `task create` (track-agnostic — DEBUG gets one too; parsed + banner-announced in §1a) when `task_isolation.worktree_per_task` is enabled. Read-only investigation (Sections 2-3 Observe / Hypothesize — `git log`, `git diff`, Grep, Read) may run from EITHER cwd; they only read. But once code changes begin — Section 4 (Checkpoint), Section 5b (Execute Test — the minimal change), Section 6b (Implement Fix + commit) — run those Bash commands with `cd {worktree_path} &&` so the fix + checkpoint commits land on the worktree's task branch. Use the `worktree_path` the router passed in skill context or that §1a parsed from `task create`'s envelope. `apt-tools` calls always take the project root as `<project-dir>`. If no `worktree` block was returned, proceed in the project root as before.
45
+ - **Task-level worktree isolation:** A worktree is provisioned at session start by `task ensure` (track-agnostic — DEBUG gets one too; parsed + banner-announced in §1a) when `task_isolation.worktree_per_task` is enabled. Read-only investigation (Sections 2-3 Observe / Hypothesize — `git log`, `git diff`, Grep, Read) may run from EITHER cwd; they only read. But once code changes begin — Section 4 (Checkpoint), Section 5b (Execute Test — the minimal change), Section 6b (Implement Fix + commit) — run those Bash commands with `cd {worktree_path} &&` so the fix + checkpoint commits land on the worktree's task branch. Use the `worktree_path` the router passed in skill context or that §1a parsed from `task ensure`'s envelope. `apt-tools` calls always take the project root as `<project-dir>`. If no `worktree` block was returned, proceed in the project root as before.
46
46
  </your_environment>
47
47
 
48
48
  <state_files>
@@ -71,35 +71,25 @@ If resuming, read DEBUG.md and skip to the current phase (observe/hypothesize/te
71
71
 
72
72
  ### 1a. Resolve canonical task id (idempotent — new sessions only)
73
73
 
74
- DEBUG now produces a canonical state.active_tasks record so `/apt:ship` can find the task via the lite ship profile once the fix is committed. The body owns idempotency because `apt-tools task create` does NOT guard against existing ids (see spec §3 R8).
74
+ DEBUG now produces a canonical state.active_tasks record so `/apt:ship` can find the task via the lite ship profile once the fix is committed. Idempotency is owned by the deterministic allocator `apt-tools task ensure --intent create-new` (NOT raw `task create`) re-running returns the SAME task + worktree (`reused: true`), so the old `task get` guard dance is gone.
75
75
 
76
76
  Two invocation paths converge here:
77
77
 
78
- - **Router path** (`/apt` → `/apt:debug`): the router has already called `task create` and injected `task_id` into your skill context.
79
- - **Direct path** (`/apt:debug foo`): no `task_id` in context — you create one now.
78
+ - **Router path** (`/apt` → `/apt:debug`): the router has already run `task ensure --intent create-new` and injected `task_id` (+ `worktree_path`) into your skill context. Re-affirm idempotently with the same id and adopt `task_id` as `{session-id}`:
79
+ ```bash
80
+ apt-tools task ensure . --description "$ARGUMENTS" --intent create-new --track DEBUG --id {task_id}
81
+ ```
82
+ The `--id {task_id}` makes ensure resolve to the EXACT record the router just provisioned (`reused: true`) — no second task, no second worktree.
80
83
 
81
- Sequence:
84
+ - **Direct path** (`/apt:debug foo`): no `task_id` in context — allocate now:
85
+ ```bash
86
+ apt-tools task ensure . --description "$ARGUMENTS" --intent create-new --track DEBUG
87
+ ```
88
+ Parse the generated `task_id` from the envelope and adopt it as `{session-id}`. ensure is keyed on the normalized description + scope, so a retry returns the SAME canonical id (replacing the legacy `debug-YYYYMMDD-HHmm` form).
82
89
 
83
- 1. **If `task_id` is present in skill context** (router path):
84
- ```bash
85
- apt-tools task get . --id {task_id}
86
- ```
87
- - If exit 0 AND the returned record has `track === "DEBUG"` → reuse, skip the create call. Adopt `task_id` as `{session-id}`.
88
- - Else (record missing OR wrong track) → call:
89
- ```bash
90
- apt-tools task create . --description "$ARGUMENTS" --track DEBUG --id {task_id}
91
- ```
92
- Adopt the id as `{session-id}`.
93
-
94
- 2. **If no `task_id` in skill context** (direct path):
95
- ```bash
96
- apt-tools task create . --description "$ARGUMENTS" --track DEBUG
97
- ```
98
- Parse the generated `task_id` from the envelope and adopt it as `{session-id}`. The canonical id replaces the legacy `debug-YYYYMMDD-HHmm` form.
90
+ The debug working dir at `.aperant/debug/{session-id}/` stays — that working artifact is preserved (per spec §3 R7). The canonical task record at `.aperant/tasks/{task-id}/` is created in parallel by `task ensure`, and both share the same id.
99
91
 
100
- The debug working dir at `.aperant/debug/{session-id}/` stays that working artifact is preserved (per spec §3 R7). The canonical task record at `.aperant/tasks/{task-id}/` is created in parallel by `task create`, and both share the same id.
101
-
102
- **Worktree isolation (both paths).** `task create` provisions a worktree when `task_isolation.worktree_per_task` is enabled (track-agnostic — DEBUG gets one too). Parse `worktree.worktree_path`, `worktree.branch`, and `worktree.base_branch` from the `task create` envelope (direct path); on the router path the orchestrator already passed `worktree_path` into your skill context — use that. When a `worktree` block is present, print the banner:
92
+ **Worktree isolation (both paths).** `task ensure --intent create-new` provisions a worktree when `task_isolation.worktree_per_task` is enabled (track-agnostic DEBUG gets one too). Parse `worktree.worktree_path`, `worktree.branch`, and `worktree.base_branch` from the `task ensure` envelope (direct path); on the router path the orchestrator already passed `worktree_path` into your skill context use that. When a `worktree` block is present, print the banner:
103
93
 
104
94
  ```
105
95
  [APT] Working in isolated worktree: {worktree_path}
@@ -301,6 +291,14 @@ Document the root cause clearly:
301
291
  cd {worktree_path} && node packages/framework/bin/apt-tools.mjs commit "fix: {concise description of fix}" --files {changed-files}
302
292
  ```
303
293
 
294
+ After the commit, emit the registry delta (one non-blocking command):
295
+
296
+ ```bash
297
+ node packages/framework/bin/apt-tools.mjs features-reconcile . --draft --task-id {task-id} || true
298
+ ```
299
+
300
+ Stage `.aperant/features/deltas/` with the commit; fill any `needs-disposition` field (usually `no-semantic-change` + a one-line reason).
301
+
304
302
  ### 6c. Update Status
305
303
 
306
304
  ```markdown
@@ -373,38 +373,47 @@ node packages/framework/bin/apt-tools.mjs audit pending-artifacts . --stage
373
373
  - **`unknown[]` non-empty** → HARD STOP. A path under `.aperant/` is not classified. Treat as a planner gap — the subtask touched state that the contract does not know about. Write the decision to `{task_dir}/execution-decisions.md` (decision class: `classification-gap`), then either extend `packages/framework/src/cli/artifacts/classification.mjs` inline (if the subtask already modifies framework code) or open a follow-up task (if the drift is orthogonal). Do NOT proceed to the next subtask until the envelope returns `clean`.
374
374
  - **Envelope status == `clean`** → proceed to 3e-features.
375
375
 
376
- ### 3e-features. Features Registry Post-Step (C33)
376
+ ### 3e-features. Feature-Registry Delta Emit
377
377
 
378
- After the subtask commits, run `features-audit --apply-stubs` so any
379
- newly-added UI/core/hook/IPC file in the diff lands in
380
- `.aperant/features/<area>.json` automatically. The reviewer Pass 6 covers
381
- whatever the post-step missed; running it here closes the gap where
382
- executor commits introduce a new feature surface without registering it.
378
+ After the subtask commits, emit this subtask's registry DELTA — semantic
379
+ capture happens HERE, while the build context is still in your window.
380
+ `/apt:ship` §0.0 materializes all pending deltas into the area JSONs +
381
+ a receipt later; you only record what changed and what it means.
383
382
 
384
383
  ```bash
385
- node packages/framework/bin/apt-tools.mjs features-audit . \
386
- --task-id "$TASK_ID" \
387
- --diff-files "$(git diff --name-only HEAD^ HEAD | tr '\n' ',')" \
388
- --apply-stubs
384
+ node packages/framework/bin/apt-tools.mjs features-reconcile . \
385
+ --draft --task-id "$TASK_ID" --subtask-id "{subtask.id}"
389
386
  ```
390
387
 
388
+ Then ENRICH the scaffold at `.aperant/features/deltas/{task-id}-{subtask.id}.json`:
389
+
390
+ - Fill every `needs-disposition` files[] entry with a real disposition
391
+ (`upsert` | `remove` | `wiring-transition` | `no-semantic-change` — the
392
+ last REQUIRES a one-line `reason`). Added qualifying files MUST register
393
+ (added + no-semantic-change is a validation error).
394
+ - Assign any `area: null` (the hooks/ipc/services junk drawers no longer
395
+ exist — pick the owning product area).
396
+ - Replace draft upsert stubs with real feature groups: `sub_features[]`
397
+ entries carrying `wired` / `handler` / `test_hint` per
398
+ `FeatureRegistrySchema`.
399
+ - A wired-state change is `disposition: "wiring-transition"` plus a
400
+ `patch-sub-feature` operation carrying `expected_from` (the prior
401
+ `wired` value).
402
+
403
+ Stage the delta with the commit:
404
+ `git add .aperant/features/deltas/ && git commit --amend --no-edit`.
405
+
391
406
  Notes:
392
- - `--task-id $TASK_ID` (BUG-025b) is mandatory when the executor runs
393
- from the main-repo cwd instead of inside the worktree (the
394
- orchestrator's common path). features-audit resolves the worktree's
395
- `.aperant/features/` from the active task record and writes there,
396
- preventing generated `*.json` from leaking into main. When invoked
397
- from the worktree cwd directly, `--task-id` is a no-op (layer 1
398
- detection short-circuits). Pass `--no-worktree-redirect` only when
399
- you intentionally want to write to the invoking cwd.
400
- - `--apply-stubs` only runs when the matched surface's policy is
401
- `auto-update` (the default for `.aperant/features/*.json`). Users who
402
- opted out via `/apt:setup` Batch 7 get a no-op — the command still
403
- succeeds.
404
- - Pre-existing flag-drift findings are never emitted here — they're the
405
- reviewer's job. The post-step is append-only on internal state.
406
- - If the audit fails (exit code != 0), log the failure and continue; don't
407
- block subtask completion on a features-registry glitch.
407
+ - `--task-id "$TASK_ID"` (BUG-025b) redirects the delta write to the active
408
+ task's worktree `.aperant/features/deltas/` when you run from the
409
+ main-repo cwd; it is ALSO the per-writer delta filename, so it is always
410
+ required.
411
+ - The write is skipped (`policy-opt-out`) when the user opted
412
+ `.aperant/features/*.json` out of `auto-update` via `/apt:setup` Batch 7.
413
+ - Non-blocking: if the reconcile scaffold fails (exit code != 0), log the
414
+ failure and continue; don't block subtask completion on a registry
415
+ glitch. The ship-time `features-reconciled` gate + the always-on CI
416
+ check catch real gaps.
408
417
 
409
418
  ### 3e-gate. Per-Task Review Gate (R7)
410
419
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: apt:fan-out
3
- description: "Cross-task fan-out — spawn N apt-executor workers from one conductor terminal, each in its own worktree"
3
+ description: "Cross-task fan-out — spawn N apt-executor workers from one Showrunner terminal, each in its own worktree"
4
4
  apt-skill-version: {{APT_VERSION}}
5
5
  stage: execute
6
6
  intent: x-fan-out
@@ -19,7 +19,7 @@ argument-hint: "apt:fan-out --tasks <id,id,id> [--phases <m/p,m/p>] [--unblocked
19
19
  gates: []
20
20
  ---
21
21
  <objective>
22
- Run N pre-planned Aperant tasks concurrently from one conductor terminal. This skill is a thin orchestrator over the generalized wave engine (`unit_kind: "task"` path, see ADR-0003) and the existing primitives: `apt-tools worktree create --task`, `apt-tools lock claim`, `apt-tools event append`, and the `parallelization.max_tasks` quota. No daemon, no job queue, no in-skill scheduling. The host CLI's main thread is the conductor (ADR-0001); each spawned apt-executor subagent runs in its own worktree (ADR-0002).
22
+ Run N pre-planned Aperant tasks concurrently from one Showrunner terminal. This skill is a thin orchestrator over the generalized wave engine (`unit_kind: "task"` path, see ADR-0003) and the existing primitives: `apt-tools worktree create --task`, `apt-tools lock claim`, `apt-tools event append`, and the `parallelization.max_tasks` quota. No daemon, no job queue, no in-skill scheduling. The host CLI's main thread is the Showrunner (ADR-0001); each spawned apt-executor subagent runs in its own worktree (ADR-0002).
23
23
 
24
24
  This is the "I have 16 unblocked tasks in this phase, run them all" surface. It replaces the old workaround of opening 16 sibling terminals manually.
25
25
  </objective>
@@ -160,7 +160,7 @@ call `integrate` with the batch's task list (or `--batch ${batch_id}` to recover
160
160
  it from the worker rows):
161
161
 
162
162
  ```bash
163
- git -C "$conductor_root" fetch origin "$base_branch"
163
+ git -C "$showrunner_root" fetch origin "$base_branch"
164
164
  node packages/framework/bin/apt-tools.mjs merge integrate . --tasks ${task_ids_csv}
165
165
  # OR recover the task list from the batch's worker rows:
166
166
  node packages/framework/bin/apt-tools.mjs merge integrate . --batch ${batch_id}
@@ -213,7 +213,7 @@ Mix SHIPPED / BLOCKED / in-flight variants in the same rail. Below the panel, em
213
213
 
214
214
  ## Design references
215
215
 
216
- - **ADR-0001** — Host CLI main thread is the conductor; no daemon, no in-skill queue.
216
+ - **ADR-0001** — Host CLI main thread is the Showrunner; no daemon, no in-skill queue.
217
217
  - **ADR-0002** — One worktree per task; workers run independent feature branches.
218
218
  - **ADR-0003** — Wave engine accepts `unit_kind: "task"` so cross-task fan-out reuses the same primitives as intra-task subtask waves.
219
219
 
@@ -23,7 +23,7 @@ Compact the current conversation into a HANDOFF document so a different agent
23
23
 
24
24
  Writes the handoff to `.aperant/handoffs/{id}/HANDOFF.md` (or `{task_dir}/handoffs/{id}/HANDOFF.md` when inside a routed task) so the artifact lives with the repo, survives across machines, and is discoverable by `/apt:resume` and team-status tooling.
25
25
 
26
- **Use when:** an agent decides to transfer the work mid-flight. Examples — sender hit context-budget cap, the next phase needs a different model (e.g. Codex for a heavy refactor), a fan-out conductor is sharding scope to peers, or a planning agent is handing a locked plan to an executor.
26
+ **Use when:** an agent decides to transfer the work mid-flight. Examples — sender hit context-budget cap, the next phase needs a different model (e.g. Codex for a heavy refactor), a fan-out Showrunner is sharding scope to peers, or a planning agent is handing a locked plan to an executor.
27
27
 
28
28
  **Do NOT use when:**
29
29
  - The human operator wants to stop — use `/apt:pause` (it stashes uncommitted work and updates `CONTINUE_INDEX.md`).
@@ -58,7 +58,7 @@ Text-first design stays in `apt:design`. This skill never edits `DESIGN.md` or `
58
58
  **Writes:**
59
59
  - `{task_dir}/mockups/iteration-NNN.html` — One file per iteration, zero-padded 3-digit (`iteration-001.html`, `iteration-002.html`, ...). Promoted from a picked variant when the first render used `--variants`.
60
60
  - `{task_dir}/mockups/iteration-NNN-variant-<letter>.html` — One per variant in a `--variants` run (letters `a..e` for `N=2..5`)
61
- - `{task_dir}/mockups/iteration-NNN-gallery.html` — Generated by `apt-tools variant-gallery`; iframes the N variants side-by-side with the pick command spelled out.
61
+ - `{task_dir}/mockups/iteration-NNN-gallery.html` — Generated by `apt-tools variant-gallery`; iframes the N variants side-by-side with the pick command spelled out, and each variant card links to its full HTML file (opens in a new tab).
62
62
  - `{task_dir}/mockups/iteration-NNN-archive/` — After `--pick <letter>`, the losing variants and the gallery move here (preserved, not deleted, so the user can review what was rejected).
63
63
  - `{task_dir}/mockups/mockup_final.html` — On `--accept`, a byte-identical copy of the latest `iteration-NNN.html` so iteration history is preserved.
64
64
  - `{task_dir}/mockups/mockup_log.md` — Append-only log: one entry per turn with iteration number, mode, user prompt, and (when relevant) variant style seeds.
@@ -504,13 +504,13 @@ node packages/framework/bin/apt-tools.mjs commit "plan: create implementation pl
504
504
  ## 8a. Runtime-context adapters
505
505
 
506
506
  If `APERANT_TERMINAL_ID` is set (you are running under the Aperant
507
- Conductor — a master-orchestrator agent inside the Aperant app), see
508
- `adapters/conductor.md` for the plan-review handshake convention
509
- (`proceed` / `abort` / `[Conductor realignment]` stdin strings) the
510
- Conductor's drawer uses post-commit. The `artifact.ready{kind:'plan'}`
507
+ Showrunner — a master-orchestrator agent inside the Aperant app), see
508
+ `adapters/showrunner.md` for the plan-review handshake convention
509
+ (`proceed` / `abort` / `[Showrunner realignment]` stdin strings) the
510
+ Showrunner's drawer uses post-commit. The `artifact.ready{kind:'plan'}`
511
511
  signal itself is now emitted automatically by the `apt-tools commit`
512
512
  postcondition — no manual emit step required. Native invocations
513
- (Claude Code, Gemini, OpenCode, Codex with no Conductor context) can
513
+ (Claude Code, Gemini, OpenCode, Codex with no Showrunner context) can
514
514
  skip the adapter entirely and proceed to Section 9.
515
515
 
516
516
  ## 9. Report
@@ -1,23 +1,23 @@
1
- # apt-plan adapter — Aperant Conductor
1
+ # apt-plan adapter — Aperant Showrunner
2
2
 
3
3
  This adapter is **only loaded** when the planner runs under the Aperant
4
- Conductor (a master-orchestrator agent inside the Aperant desktop / web
4
+ Showrunner (a master-orchestrator agent inside the Aperant desktop / web
5
5
  app). Native invocations of `/apt:plan` (from plain Claude Code, Gemini
6
6
  CLI, OpenCode, or Codex) IGNORE this file entirely — the framework
7
7
  behavior in `SKILL.md` is the source of truth for them.
8
8
 
9
9
  ## When to load this adapter
10
10
 
11
- Detect Conductor context by env var:
11
+ Detect Showrunner context by env var:
12
12
 
13
13
  ```bash
14
14
  [ -n "$APERANT_TERMINAL_ID" ]
15
15
  ```
16
16
 
17
- The Conductor injects `APERANT_TERMINAL_ID` into every PTY it spawns.
18
- If the var is unset, you are NOT under the Conductor — stop reading.
17
+ The Showrunner injects `APERANT_TERMINAL_ID` into every PTY it spawns.
18
+ If the var is unset, you are NOT under the Showrunner — stop reading.
19
19
 
20
- ## What changes under the Conductor
20
+ ## What changes under the Showrunner
21
21
 
22
22
  The planner's filesystem outputs (`spec.md`, `implementation_plan.json`)
23
23
  are unchanged. The ADDITION is one extra step after Section 8 (Persist
@@ -34,7 +34,7 @@ node packages/framework/bin/apt-tools.mjs commit "plan: ..." \
34
34
  --files spec.md implementation_plan.json
35
35
  ```
36
36
 
37
- …and the process is running under a Conductor PTY (env
37
+ …and the process is running under a Showrunner PTY (env
38
38
  `APERANT_TERMINAL_ID` is set), `apt-tools commit` auto-emits a fully-
39
39
  formed `artifact.ready` envelope to `.aperant/events/{today}.jsonl`.
40
40
  The envelope carries the `task_id`, plan path, sha256 hash, and the
@@ -47,35 +47,35 @@ framework postcondition makes it work uniformly across QUICK, STANDARD,
47
47
  DEEP, and COMPLEX without violating the Fast Path Guarantee.
48
48
 
49
49
  **Planner authors don't need to do anything.** As long as you call
50
- `apt-tools commit` to land your plan artifacts, the Conductor will
50
+ `apt-tools commit` to land your plan artifacts, the Showrunner will
51
51
  see `artifact.ready` and the drawer's PlanReadyCard will auto-promote.
52
52
 
53
53
  If the planner does NOT use `apt-tools commit` (it lands the plan via
54
54
  raw `git commit` or `git add`), the auto-emit will not fire. In that
55
- case the Conductor falls back to filesystem polling of the task dir
55
+ case the Showrunner falls back to filesystem polling of the task dir
56
56
  (slightly higher latency, same outcome).
57
57
 
58
- ### Plan-review handshake (Step 6 + 7 of Conductor v2)
58
+ ### Plan-review handshake (Step 6 + 7 of Showrunner v2)
59
59
 
60
60
  After emitting `artifact.ready{kind:'plan'}` the planner SHOULD pause at
61
- an idle prompt and listen for ONE of three Conductor-driven inputs:
61
+ an idle prompt and listen for ONE of three Showrunner-driven inputs:
62
62
 
63
63
  - `proceed\r` — the human (via the PlanReadyCard's **Approve** button)
64
64
  approves the plan. Continue to `/apt:execute` as you would in the
65
65
  normal flow.
66
66
  - `abort\r` — the human rejected. Abandon this plan; do not start
67
67
  execution. Optionally exit the session cleanly.
68
- - `[Conductor realignment] <note>\r` — the human pressed **Realign**.
68
+ - `[Showrunner realignment] <note>\r` — the human pressed **Realign**.
69
69
  Treat the `<note>` as additional planning context: re-open spec.md /
70
70
  implementation_plan.json, address the note's gaps, commit a new
71
71
  revision, and emit a fresh `artifact.ready{kind:'plan'}` (with the
72
72
  same task_id but a NEW request_id — the drawer keys cards on
73
73
  request_id, so re-using it would suppress the new card). The
74
- realignment loop can repeat; after attempt_n >= 3 the Conductor may
74
+ realignment loop can repeat; after attempt_n >= 3 the Showrunner may
75
75
  decide to respawn the terminal entirely.
76
76
 
77
- These exact strings are pinned by the Conductor's `ConductorContextHost`
78
- handlers (`packages/ui/src/sections/conductor/ConductorContextHost.tsx`).
77
+ These exact strings are pinned by the Showrunner's `ShowrunnerContextHost`
78
+ handlers (`packages/ui/src/sections/showrunner/ShowrunnerContextHost.tsx`).
79
79
  Native CLI invocations of `/apt:plan` (no `APERANT_TERMINAL_ID`) skip
80
80
  this handshake and follow the normal report → `/apt:execute` flow.
81
81
 
@@ -84,7 +84,7 @@ this handshake and follow the normal report → `/apt:execute` flow.
84
84
  The Aperant Framework is consumed by multiple CLIs (Claude Code, Gemini,
85
85
  OpenCode, Codex) and by the Aperant app itself. The vast majority of
86
86
  `/apt:plan` invocations come from native CLIs — those should not see
87
- or execute Conductor-specific machinery. By isolating the Conductor's
87
+ or execute Showrunner-specific machinery. By isolating the Showrunner's
88
88
  event-emit obligations to this adapter, the public skill stays minimal
89
89
  and the framework remains CLI-agnostic. The pattern mirrors
90
90
  `appendices/` (reasoning-stance loaders) but with a different semantic: