@aperant/framework 0.8.1 → 0.8.6

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 (308) hide show
  1. package/CHANGELOG.md +443 -1
  2. package/agents/apt-planner.md +39 -7
  3. package/dist/cli/commands/adr.mjs +1 -1
  4. package/dist/cli/commands/audit-branch-current.d.mts +25 -0
  5. package/dist/cli/commands/audit-branch-current.d.mts.map +1 -0
  6. package/dist/cli/commands/audit-branch-current.mjs +252 -0
  7. package/dist/cli/commands/audit-branch-current.mjs.map +1 -0
  8. package/dist/cli/commands/audit.d.mts.map +1 -1
  9. package/dist/cli/commands/audit.mjs +13 -2
  10. package/dist/cli/commands/audit.mjs.map +1 -1
  11. package/dist/cli/commands/check-version.d.mts.map +1 -1
  12. package/dist/cli/commands/check-version.mjs +19 -1
  13. package/dist/cli/commands/check-version.mjs.map +1 -1
  14. package/dist/cli/commands/context.mjs +3 -3
  15. package/dist/cli/commands/context.mjs.map +1 -1
  16. package/dist/cli/commands/coverage-check.d.mts.map +1 -1
  17. package/dist/cli/commands/coverage-check.mjs +74 -7
  18. package/dist/cli/commands/coverage-check.mjs.map +1 -1
  19. package/dist/cli/commands/detect-runtime.d.mts +6 -0
  20. package/dist/cli/commands/detect-runtime.d.mts.map +1 -0
  21. package/dist/cli/commands/detect-runtime.mjs +142 -0
  22. package/dist/cli/commands/detect-runtime.mjs.map +1 -0
  23. package/dist/cli/commands/driver-doctor.d.mts +29 -0
  24. package/dist/cli/commands/driver-doctor.d.mts.map +1 -0
  25. package/dist/cli/commands/driver-doctor.mjs +291 -0
  26. package/dist/cli/commands/driver-doctor.mjs.map +1 -0
  27. package/dist/cli/commands/gate.mjs +14 -0
  28. package/dist/cli/commands/gate.mjs.map +1 -1
  29. package/dist/cli/commands/init.d.mts.map +1 -1
  30. package/dist/cli/commands/init.mjs +9 -6
  31. package/dist/cli/commands/init.mjs.map +1 -1
  32. package/dist/cli/commands/install-from-source.d.mts +2 -0
  33. package/dist/cli/commands/install-from-source.d.mts.map +1 -0
  34. package/dist/cli/commands/install-from-source.mjs +2 -0
  35. package/dist/cli/commands/install-from-source.mjs.map +1 -0
  36. package/dist/cli/commands/modes.mjs +1 -1
  37. package/dist/cli/commands/route.d.mts.map +1 -1
  38. package/dist/cli/commands/route.mjs +38 -1
  39. package/dist/cli/commands/route.mjs.map +1 -1
  40. package/dist/cli/commands/triage.mjs +1 -1
  41. package/dist/cli/config/load.d.mts.map +1 -1
  42. package/dist/cli/config/load.mjs +9 -3
  43. package/dist/cli/config/load.mjs.map +1 -1
  44. package/dist/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
  45. package/dist/cli/coordination/event-schema.d.mts.map +1 -1
  46. package/dist/cli/coordination/event-schema.mjs +18 -0
  47. package/dist/cli/coordination/event-schema.mjs.map +1 -1
  48. package/dist/cli/coverage-check/user-outcomes.d.mts +84 -0
  49. package/dist/cli/coverage-check/user-outcomes.d.mts.map +1 -0
  50. package/dist/cli/coverage-check/user-outcomes.mjs +265 -0
  51. package/dist/cli/coverage-check/user-outcomes.mjs.map +1 -0
  52. package/dist/cli/dispatch.d.mts.map +1 -1
  53. package/dist/cli/dispatch.mjs +18 -1
  54. package/dist/cli/dispatch.mjs.map +1 -1
  55. package/dist/cli/gate/context.d.mts +1 -0
  56. package/dist/cli/gate/context.d.mts.map +1 -1
  57. package/dist/cli/gate/context.mjs +14 -1
  58. package/dist/cli/gate/context.mjs.map +1 -1
  59. package/dist/cli/gate/gates/consistency-check.d.mts +1 -0
  60. package/dist/cli/gate/gates/consistency-check.d.mts.map +1 -1
  61. package/dist/cli/gate/gates/consistency-check.mjs +1 -0
  62. package/dist/cli/gate/gates/consistency-check.mjs.map +1 -1
  63. package/dist/cli/gate/gates/review-clean.d.mts +1 -0
  64. package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
  65. package/dist/cli/gate/gates/review-clean.mjs +1 -0
  66. package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
  67. package/dist/cli/gate/gates/verify-approved.d.mts +1 -0
  68. package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
  69. package/dist/cli/gate/gates/verify-approved.mjs +1 -0
  70. package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
  71. package/dist/cli/gate/registry.d.mts.map +1 -1
  72. package/dist/cli/gate/registry.mjs +9 -1
  73. package/dist/cli/gate/registry.mjs.map +1 -1
  74. package/dist/cli/host/detect.mjs +1 -1
  75. package/dist/cli/host/detect.mjs.map +1 -1
  76. package/dist/cli/install/find-workspace-framework-version.d.mts +16 -0
  77. package/dist/cli/install/find-workspace-framework-version.d.mts.map +1 -0
  78. package/dist/cli/install/find-workspace-framework-version.mjs +85 -0
  79. package/dist/cli/install/find-workspace-framework-version.mjs.map +1 -0
  80. package/dist/cli/install/install-from-source.d.mts +10 -0
  81. package/dist/cli/install/install-from-source.d.mts.map +1 -0
  82. package/dist/cli/install/install-from-source.mjs +271 -0
  83. package/dist/cli/install/install-from-source.mjs.map +1 -0
  84. package/dist/cli/install/install-kernel.d.mts.map +1 -1
  85. package/dist/cli/install/install-kernel.mjs +24 -0
  86. package/dist/cli/install/install-kernel.mjs.map +1 -1
  87. package/dist/cli/install/legacy-paths.d.mts +33 -11
  88. package/dist/cli/install/legacy-paths.d.mts.map +1 -1
  89. package/dist/cli/install/legacy-paths.mjs +163 -39
  90. package/dist/cli/install/legacy-paths.mjs.map +1 -1
  91. package/dist/cli/install/runtime-detect.mjs +1 -1
  92. package/dist/cli/install/runtime-detect.mjs.map +1 -1
  93. package/dist/cli/install/runtime-migrate.d.mts +34 -14
  94. package/dist/cli/install/runtime-migrate.d.mts.map +1 -1
  95. package/dist/cli/install/runtime-migrate.mjs +63 -30
  96. package/dist/cli/install/runtime-migrate.mjs.map +1 -1
  97. package/dist/cli/install/transforms/codex.d.mts.map +1 -1
  98. package/dist/cli/install/transforms/codex.mjs +28 -17
  99. package/dist/cli/install/transforms/codex.mjs.map +1 -1
  100. package/dist/cli/skill-author/contract.mjs +2 -2
  101. package/dist/cli/skill-author/contract.mjs.map +1 -1
  102. package/dist/cli/verify-proof/audit.d.mts +34 -0
  103. package/dist/cli/verify-proof/audit.d.mts.map +1 -0
  104. package/dist/cli/verify-proof/audit.mjs +53 -0
  105. package/dist/cli/verify-proof/audit.mjs.map +1 -0
  106. package/dist/cli/verify-proof/exec.d.mts +20 -0
  107. package/dist/cli/verify-proof/exec.d.mts.map +1 -0
  108. package/dist/cli/verify-proof/exec.mjs +74 -0
  109. package/dist/cli/verify-proof/exec.mjs.map +1 -0
  110. package/dist/cli/verify-proof/idl/index.d.mts +2 -0
  111. package/dist/cli/verify-proof/idl/index.d.mts.map +1 -0
  112. package/dist/cli/verify-proof/idl/index.mjs +13 -0
  113. package/dist/cli/verify-proof/idl/index.mjs.map +1 -0
  114. package/dist/cli/verify-proof/idl/types.d.ts +10 -0
  115. package/dist/cli/verify-proof/idl/types.d.ts.map +1 -0
  116. package/dist/cli/verify-proof/idl/types.js +10 -0
  117. package/dist/cli/verify-proof/idl/types.js.map +1 -0
  118. package/dist/cli/verify-proof/manifest-validator.d.mts +19 -0
  119. package/dist/cli/verify-proof/manifest-validator.d.mts.map +1 -0
  120. package/dist/cli/verify-proof/manifest-validator.mjs +182 -0
  121. package/dist/cli/verify-proof/manifest-validator.mjs.map +1 -0
  122. package/dist/cli/verify-proof/resolver.d.mts +105 -0
  123. package/dist/cli/verify-proof/resolver.d.mts.map +1 -0
  124. package/dist/cli/verify-proof/resolver.mjs +320 -0
  125. package/dist/cli/verify-proof/resolver.mjs.map +1 -0
  126. package/dist/cli/verify-proof/runtime-detect.d.mts +30 -0
  127. package/dist/cli/verify-proof/runtime-detect.d.mts.map +1 -0
  128. package/dist/cli/verify-proof/runtime-detect.mjs +209 -0
  129. package/dist/cli/verify-proof/runtime-detect.mjs.map +1 -0
  130. package/dist/cli/verify-proof/trust.d.mts +70 -0
  131. package/dist/cli/verify-proof/trust.d.mts.map +1 -0
  132. package/dist/cli/verify-proof/trust.mjs +174 -0
  133. package/dist/cli/verify-proof/trust.mjs.map +1 -0
  134. package/dist/driver-sdk/conformance.d.ts +41 -0
  135. package/dist/driver-sdk/conformance.d.ts.map +1 -0
  136. package/dist/driver-sdk/conformance.js +123 -0
  137. package/dist/driver-sdk/conformance.js.map +1 -0
  138. package/dist/driver-sdk/errors.d.ts +75 -0
  139. package/dist/driver-sdk/errors.d.ts.map +1 -0
  140. package/dist/driver-sdk/errors.js +80 -0
  141. package/dist/driver-sdk/errors.js.map +1 -0
  142. package/dist/driver-sdk/idl.d.ts +221 -0
  143. package/dist/driver-sdk/idl.d.ts.map +1 -0
  144. package/dist/driver-sdk/idl.js +140 -0
  145. package/dist/driver-sdk/idl.js.map +1 -0
  146. package/dist/driver-sdk/index.d.ts +28 -0
  147. package/dist/driver-sdk/index.d.ts.map +1 -0
  148. package/dist/driver-sdk/index.js +28 -0
  149. package/dist/driver-sdk/index.js.map +1 -0
  150. package/dist/driver-sdk/manifest.d.ts +93 -0
  151. package/dist/driver-sdk/manifest.d.ts.map +1 -0
  152. package/dist/driver-sdk/manifest.js +12 -0
  153. package/dist/driver-sdk/manifest.js.map +1 -0
  154. package/dist/driver-sdk/retry.d.ts +33 -0
  155. package/dist/driver-sdk/retry.d.ts.map +1 -0
  156. package/dist/driver-sdk/retry.js +50 -0
  157. package/dist/driver-sdk/retry.js.map +1 -0
  158. package/dist/plugin/.claude-plugin/plugin.json +4 -1
  159. package/dist/plugin/agents/apt-planner.md +39 -7
  160. package/dist/plugin/skills/apt/SKILL.md +75 -6
  161. package/dist/plugin/skills/apt-caveman/SKILL.md +64 -0
  162. package/dist/plugin/skills/apt-debug/SKILL.md +36 -4
  163. package/dist/plugin/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
  164. package/dist/plugin/skills/apt-discuss/SKILL.md +4 -4
  165. package/dist/plugin/skills/apt-discuss/appendices/grill-discipline.md +2 -11
  166. package/dist/plugin/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
  167. package/dist/plugin/skills/apt-execute/SKILL.md +27 -4
  168. package/dist/plugin/skills/apt-execute/appendices/tdd-mode.md +2 -10
  169. package/dist/plugin/skills/apt-fan-out/SKILL.md +36 -1
  170. package/dist/plugin/skills/apt-handoff/SKILL.md +228 -0
  171. package/dist/plugin/skills/apt-improve/DEEPENING.md +0 -8
  172. package/dist/plugin/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
  173. package/dist/plugin/skills/apt-improve/LANGUAGE.md +0 -8
  174. package/dist/plugin/skills/apt-improve/SKILL.md +4 -4
  175. package/dist/plugin/skills/apt-plan/SKILL.md +73 -5
  176. package/dist/plugin/skills/apt-plan/adapters/conductor.md +1 -1
  177. package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -1
  178. package/dist/plugin/skills/apt-prototype/LOGIC.md +0 -8
  179. package/dist/plugin/skills/apt-prototype/SKILL.md +4 -4
  180. package/dist/plugin/skills/apt-prototype/UI.md +0 -8
  181. package/dist/plugin/skills/apt-quick/SKILL.md +31 -1
  182. package/dist/plugin/skills/apt-research/SKILL.md +526 -0
  183. package/dist/plugin/skills/apt-research/appendices/budget-loop.md +397 -0
  184. package/dist/plugin/skills/apt-research/appendices/claim-graph-schema.md +206 -0
  185. package/dist/plugin/skills/apt-research/appendices/domain-tools.md +236 -0
  186. package/dist/plugin/skills/apt-resume/SKILL.md +54 -31
  187. package/dist/plugin/skills/apt-run/SKILL.md +114 -16
  188. package/dist/plugin/skills/apt-setup/SKILL.md +97 -8
  189. package/dist/plugin/skills/apt-ship/SKILL.md +165 -9
  190. package/dist/plugin/skills/apt-spar/SKILL.md +84 -23
  191. package/dist/plugin/skills/apt-triage/AGENT-BRIEF.md +0 -8
  192. package/dist/plugin/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
  193. package/dist/plugin/skills/apt-triage/SKILL.md +2 -2
  194. package/dist/plugin/skills/apt-update/SKILL.md +74 -17
  195. package/dist/plugin/skills/apt-verify-proof/SKILL.md +87 -1
  196. package/dist/plugin/skills/apt-zoom-out/SKILL.md +3 -3
  197. package/dist/schemas/quick-task.d.ts +17 -17
  198. package/dist/schemas/quick-task.d.ts.map +1 -1
  199. package/dist/schemas/quick-task.js +2 -2
  200. package/dist/schemas/quick-task.js.map +1 -1
  201. package/dist/types/config.d.ts +33 -0
  202. package/dist/types/config.d.ts.map +1 -1
  203. package/dist/types/state.d.ts +1 -1
  204. package/dist/types/state.d.ts.map +1 -1
  205. package/dist/types/task-record.d.ts +1 -1
  206. package/dist/types/task-record.d.ts.map +1 -1
  207. package/drivers/.gitkeep +0 -0
  208. package/drivers/api/README.md +40 -0
  209. package/drivers/api/driver.mjs +59 -0
  210. package/drivers/api/manifest.json +26 -0
  211. package/drivers/browser/README.md +105 -0
  212. package/drivers/browser/driver.mjs +134 -0
  213. package/drivers/browser/manifest.json +35 -0
  214. package/drivers/cli/README.md +44 -0
  215. package/drivers/cli/driver.mjs +62 -0
  216. package/drivers/cli/manifest.json +28 -0
  217. package/drivers/electron/README.md +64 -0
  218. package/drivers/electron/driver.mjs +87 -0
  219. package/drivers/electron/manifest.json +37 -0
  220. package/package.json +138 -133
  221. package/prompts/planner.md +1 -1
  222. package/prompts/spec_writer.md +1 -1
  223. package/skills/apt/SKILL.md +75 -6
  224. package/skills/apt-caveman/SKILL.md +64 -0
  225. package/skills/apt-debug/SKILL.md +36 -4
  226. package/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
  227. package/skills/apt-discuss/SKILL.md +4 -4
  228. package/skills/apt-discuss/appendices/grill-discipline.md +2 -11
  229. package/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
  230. package/skills/apt-execute/SKILL.md +27 -4
  231. package/skills/apt-execute/appendices/tdd-mode.md +2 -10
  232. package/skills/apt-fan-out/SKILL.md +36 -1
  233. package/skills/apt-handoff/SKILL.md +228 -0
  234. package/skills/apt-improve/DEEPENING.md +0 -8
  235. package/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
  236. package/skills/apt-improve/LANGUAGE.md +0 -8
  237. package/skills/apt-improve/SKILL.md +4 -4
  238. package/skills/apt-plan/SKILL.md +73 -5
  239. package/skills/apt-plan/adapters/conductor.md +1 -1
  240. package/skills/apt-planner.md +17 -1
  241. package/skills/apt-pr-review/SKILL.md +1 -1
  242. package/skills/apt-prototype/LOGIC.md +0 -8
  243. package/skills/apt-prototype/SKILL.md +4 -4
  244. package/skills/apt-prototype/UI.md +0 -8
  245. package/skills/apt-quick/SKILL.md +31 -1
  246. package/skills/apt-research/SKILL.md +526 -0
  247. package/skills/apt-research/appendices/budget-loop.md +397 -0
  248. package/skills/apt-research/appendices/claim-graph-schema.md +206 -0
  249. package/skills/apt-research/appendices/domain-tools.md +236 -0
  250. package/skills/apt-resume/SKILL.md +54 -31
  251. package/skills/apt-run/SKILL.md +114 -16
  252. package/skills/apt-setup/SKILL.md +97 -8
  253. package/skills/apt-ship/SKILL.md +165 -9
  254. package/skills/apt-spar/SKILL.md +84 -23
  255. package/skills/apt-triage/AGENT-BRIEF.md +0 -8
  256. package/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
  257. package/skills/apt-triage/SKILL.md +2 -2
  258. package/skills/apt-update/SKILL.md +74 -17
  259. package/skills/apt-verify-proof/SKILL.md +87 -1
  260. package/skills/apt-zoom-out/SKILL.md +3 -3
  261. package/src/cli/commands/adr.mjs +1 -1
  262. package/src/cli/commands/audit-branch-current.mjs +250 -0
  263. package/src/cli/commands/audit.mjs +13 -2
  264. package/src/cli/commands/check-version.mjs +20 -1
  265. package/src/cli/commands/context.mjs +3 -3
  266. package/src/cli/commands/coverage-check.mjs +126 -44
  267. package/src/cli/commands/detect-runtime.mjs +143 -0
  268. package/src/cli/commands/driver-doctor.mjs +294 -0
  269. package/src/cli/commands/gate.mjs +15 -0
  270. package/src/cli/commands/init.mjs +9 -6
  271. package/src/cli/commands/install-from-source.mjs +1 -0
  272. package/src/cli/commands/modes.mjs +1 -1
  273. package/src/cli/commands/route.mjs +42 -1
  274. package/src/cli/commands/triage.mjs +1 -1
  275. package/src/cli/config/load.mjs +9 -3
  276. package/src/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
  277. package/src/cli/coordination/event-schema.mjs +19 -0
  278. package/src/cli/coverage-check/user-outcomes.mjs +273 -0
  279. package/src/cli/dispatch.mjs +17 -1
  280. package/src/cli/gate/context.mjs +20 -1
  281. package/src/cli/gate/gates/consistency-check.mjs +1 -0
  282. package/src/cli/gate/gates/review-clean.mjs +1 -0
  283. package/src/cli/gate/gates/verify-approved.mjs +1 -0
  284. package/src/cli/gate/registry.mjs +11 -1
  285. package/src/cli/host/detect.mjs +1 -1
  286. package/src/cli/install/find-workspace-framework-version.mjs +88 -0
  287. package/src/cli/install/install-from-source.mjs +276 -0
  288. package/src/cli/install/install-kernel.mjs +24 -0
  289. package/src/cli/install/legacy-paths.mjs +164 -39
  290. package/src/cli/install/runtime-detect.mjs +1 -1
  291. package/src/cli/install/runtime-migrate.mjs +63 -30
  292. package/src/cli/install/transforms/codex.mjs +26 -17
  293. package/src/cli/skill-author/contract.mjs +2 -2
  294. package/src/cli/verify-proof/.gitkeep +0 -0
  295. package/src/cli/verify-proof/audit.mjs +55 -0
  296. package/src/cli/verify-proof/exec.mjs +74 -0
  297. package/src/cli/verify-proof/idl/index.mjs +23 -0
  298. package/src/cli/verify-proof/idl/types.ts +42 -0
  299. package/src/cli/verify-proof/manifest-schema.json +212 -0
  300. package/src/cli/verify-proof/manifest-validator.mjs +184 -0
  301. package/src/cli/verify-proof/resolver.mjs +330 -0
  302. package/src/cli/verify-proof/runtime-detect.mjs +211 -0
  303. package/src/cli/verify-proof/trust.mjs +187 -0
  304. package/templates/adr-format.md +0 -8
  305. package/templates/aperant-claude-md-appendix.md +1 -1
  306. package/templates/context-format.md +1 -9
  307. package/templates/proof-verification.md +51 -8
  308. package/workflows/verify-proof.md +130 -19
package/CHANGELOG.md CHANGED
@@ -3,7 +3,449 @@
3
3
  All notable changes to `@aperant/framework` are documented here. See
4
4
  [`VERSIONING.md`](VERSIONING.md) for the per-tier contract.
5
5
 
6
- ## [Unreleased]
6
+ ## 0.8.6 — 2026-05-24 — Outcome-first verify-proof contract + driver-sdk inline (recovery from 0.8.4 npm 404)
7
+
8
+ > **Migration window.** This release introduces a new `## User Outcomes`
9
+ > section that becomes the verify-proof input contract. Specs WITHOUT
10
+ > the section emit a `coverage-check` **warning** on v0.8.x and a
11
+ > **HARD BLOCK** starting v0.9.0. Refactor-only specs SHOULD use the
12
+ > empty-with-note escape (`_No user-observable changes — pure
13
+ > refactor._`) to declare absence-of-outcomes deliberately. See spec
14
+ > §ID-07 of `verify-proof-monorepo-contract` for the gate table.
15
+
16
+ > **Recovery.** 0.8.4 shipped with `@aperant/driver-sdk: 0.1.0` as a
17
+ > direct dep, but the driver-sdk package was never published — every
18
+ > `npm install @aperant/framework@0.8.4` since 2026-05-22 failed with
19
+ > a 404 on the transitive dep. 0.8.6 inlines the 875-LOC zero-dep SDK
20
+ > into the framework tarball, removing the broken dep. Users on 0.8.4
21
+ > MUST upgrade to 0.8.6 to install successfully.
22
+
23
+ ### Fixed
24
+
25
+ - **`@aperant/driver-sdk` inlined into framework src** (recovery from
26
+ the 0.8.4 npm 404). The SDK lived at `packages/framework-driver-sdk/`
27
+ with the contract that third-party driver authors would `pnpm add
28
+ @aperant/driver-sdk` and avoid pulling all of framework. The SDK
29
+ was never published; pnpm's `workspace:*` rewrite baked an
30
+ unresolvable `0.1.0` spec into framework's published `package.json`.
31
+ Fix: 875 LOC of zero-runtime-dep SDK moved to
32
+ `packages/framework/src/driver-sdk/`, framework imports rewritten to
33
+ relative paths, the `import-direction.test.ts` invariant repurposed
34
+ from a package boundary to a subdirectory boundary so re-extraction
35
+ stays mechanical if a real third-party driver author ever asks for a
36
+ standalone install. The `@aperant/driver-sdk` npm package remains
37
+ unpublished — no consumers existed to migrate.
38
+
39
+ ### Added
40
+
41
+ - **`## User Outcomes` PRD section** — verify-proof's input contract.
42
+ STANDARD/DEEP specs ship a section between `## Solution` and
43
+ `## Implementation Decisions` carrying one `**Epic:**` headline + N
44
+ atomic outcomes tagged by surface (`electron | web | cli | api |
45
+ electron+web`). Authors write the literal `**ON**` token; IDs are
46
+ POSITIONAL and synthesized by the parser (O1, O2, …). Optional
47
+ cross-refs via `*(requires ON N)*`. Empty-with-note refactor escape
48
+ for non-UX tasks. QUICK track is hard-exempt per the Fast Path
49
+ Guarantee (ID-05).
50
+ - **`drivers/browser/manifest.json:transport.skill_id = "agent-browser"`**
51
+ — second transport option alongside `mcp_server_id: "puppeteer"`.
52
+ On Claude Code / OpenCode hosts the workflow runner dispatches via
53
+ `Skill({skill: "agent-browser", args: ...})` (one fewer external
54
+ dep — no Puppeteer MCP install needed); on legacy hosts the MCP
55
+ path is preserved. `chooseTransport({has_skill_tool})` helper.
56
+ - **`resolveDriversForOutcomes(opts)`** — new resolver entrypoint that
57
+ returns one entry per (outcome, surface) pair. For `[electron+web]`
58
+ outcomes emits TWO entries with the same `outcome_id` and different
59
+ drivers. Delegates to existing `resolveDriver()` for scoring.
60
+ - **`verification.monorepo_globs: string[]`** config key (default
61
+ `["apps/*"]`) — `loadRuntimeCapabilities` walks each glob match's
62
+ `package.json` and OR-merges its capabilities with the root.
63
+ Disable the walk entirely with `monorepo_globs: []`.
64
+ - **`transport` field on `verification.json:tests[]`** — `skill | mcp
65
+ | binary | http`. Populated by the workflow runner from the
66
+ dispatcher's directive (Step 7a). Documented in
67
+ `templates/proof-verification.md`.
68
+ - **`surface` field on `verification.json:tests[]`** — `electron | web
69
+ | cli | api`. Drives the per-surface screenshot path and the
70
+ `coverage.by_surface` rollup. Cross-surface outcomes produce TWO
71
+ test entries sharing the same `outcome_id`.
72
+
73
+ ### Changed
74
+
75
+ - **`apt-tools detect-runtime`** — now walks `apps/*/package.json` by
76
+ default. Fixes the canonical Aperant monorepo defect (root
77
+ package.json with no Electron dep + `apps/desktop/package.json`
78
+ carrying Electron previously returned `is_electron: false` because
79
+ the detector only read the root). No user-visible config change
80
+ needed; opt out via `verification.monorepo_globs: []`.
81
+ - **`apt-tools coverage-check validate`** — payload gains a
82
+ `user_outcomes` block when the plan is STANDARD/DEEP. Block carries
83
+ `header_present`, `body_kind` (`empty | empty-with-note | outcomes
84
+ | absent`), `outcomes_count`, `validation_warnings?`, and
85
+ `gate_result` (`pass | warn | block`). QUICK plans omit the block
86
+ entirely per Fast Path Guarantee.
87
+ - **`workflows/verify-proof.md` Step 7** — dispatches per outcome via
88
+ `resolveDriversForOutcomes()` instead of a single per-run
89
+ `resolveDriver()` call. Writes screenshots under
90
+ `${PROOF_DIR}/${surface}/screenshots/${outcome-id}.png` (per-surface
91
+ split tree). Step 7a gains the MUST-invoke Skill directive
92
+ (TD-08 grep guard pins the language).
93
+
94
+ ### Deprecated
95
+
96
+ - **Specs without `## User Outcomes` (STANDARD/DEEP only).** v0.8.x
97
+ emits a `coverage-check` **warning** with a `migration_deadline`
98
+ string referencing v0.9.0. v0.9.0 will **HARD BLOCK** specs that
99
+ lack the section. Refactor-only specs SHOULD use the
100
+ empty-with-note escape (`_No user-observable changes — pure
101
+ refactor._`, italic underscores + em dash + period required) to
102
+ declare absence-of-outcomes deliberately. QUICK-track plans are
103
+ hard-exempt at every version.
104
+
105
+ ### v0.9.0 telegraph (one-minor window)
106
+
107
+ The v0.9.0 cutover lands the hard-block on missing `## User Outcomes`
108
+ in STANDARD/DEEP specs. Adopters should retrofit specs in the v0.8.x
109
+ window OR adopt the empty-with-note escape for refactor specs. No
110
+ silent migration of existing specs is provided — the migration is
111
+ deliberate per author.
112
+
113
+ ### Out-of-scope (deferred follow-ups)
114
+
115
+ - **`verify-proof-executable-runner`** — the v1 verify-proof runner is
116
+ the host LLM (Claude Code / Codex / OpenCode / Gemini) following
117
+ `workflows/verify-proof.md` as a prose recipe. The framework does
118
+ NOT ship an executable `apt-tools verify-proof` command in 0.8.6.
119
+ The `transport` field, per-outcome dispatch, and MUST-invoke
120
+ directive are LLM-honored conventions enforced via grep guards on
121
+ workflow text (TD-08) and schema assertions on `verification.json`
122
+ shape (AC23). Follow-up `verify-proof-executable-runner` task is
123
+ deferred per spec §Out of Scope; the triggers that would promote
124
+ Path B → Path A are documented there.
125
+ - **`apt-tools outcomes lint`** — sentence-shape lint for User
126
+ Outcomes (catches squishy outcomes, validates surface tags).
127
+ Deferred to a follow-up framework task.
128
+
129
+ ## 0.8.5 — 2026-05-22 — `/apt:verify-proof` driver layer fixes (bundled drivers + hard override precedence)
130
+
131
+ ### Fixed
132
+
133
+ - **`drivers/` missing from published tarball.** `packages/framework/package.json:files`
134
+ did not include `drivers/`, so the four bundled IDL drivers (`browser`,
135
+ `electron`, `cli`, `api` — each with `manifest.json` + `driver.mjs` +
136
+ `README.md`) were stripped at `pnpm pack` / `npm publish` time. Downstream
137
+ effect: `apt-tools detect-runtime` returned `discovered_drivers: []` and
138
+ `selected_driver_id: null` for every installed kernel, which made the
139
+ strict `/apt:verify-proof` IDL path unusable (resolver throws
140
+ `unsatisfied_required_capability`). Fix is a one-line `files` entry —
141
+ re-pack now ships 4 manifests + 4 driver modules. Self-host installs
142
+ fix automatically on the next `/apt:update --from-source`; npm-install
143
+ consumers fix on the next published version bump.
144
+
145
+ - **`verification.runtimes[]` override was decorative.** The resolver
146
+ in `packages/framework/src/cli/verify-proof/resolver.mjs` placed
147
+ override-listed drivers first in the candidate list but then sorted
148
+ the list by score, wiping the override order. With a Next.js root
149
+ `package.json` (e.g. a monorepo where Electron lives at `apps/desktop`),
150
+ forcing `verification.runtimes: ["electron"]` still selected `browser`
151
+ because the latter had higher `priority` (100 vs 90). The override
152
+ docstring promised "explicit driverId precedence" but delivered a
153
+ tie-breaker. Fix: override is now **hard precedence** — listed
154
+ drivers are tried in override order, first one satisfying every
155
+ required capability wins regardless of score; non-matching override
156
+ entries are recorded in `fallback_attempts` with reason
157
+ `override-listed but missing required capabilities: ...` and the
158
+ resolver then falls through to the score-based pick on remaining
159
+ drivers. Two test cases in `verify-proof-resolver.test.ts` lock the
160
+ new contract (force-pick + fall-through).
161
+
162
+ ## 0.8.4 — 2026-05-22 — `/apt:update` polish + `apt:handoff`, `apt:caveman` skills + `apt:resume` HANDOFF discovery
163
+
164
+ Bundled release: five `/apt:update` fix bundles (converged from a 3-round
165
+ Codex sparring session at `.aperant/spar/apt-update-fixes-20260522-083919.md`,
166
+ resolving 9 reported issues + 2 hidden defects) plus two new skills and one
167
+ extended skill.
168
+
169
+ > **VERSIONING.md note.** New skills normally trigger MINOR per the
170
+ > contract. Operator opted for PATCH here because the surface area is
171
+ > small (2 skills, 1 extension) and the apt:update polish is the load-
172
+ > bearing change. Future MINOR bumps remain reserved for transform /
173
+ > manifest / CLI flag additions.
174
+
175
+ ### Added
176
+
177
+ - **`/apt:handoff`** (new skill at `packages/framework/skills/apt-handoff/SKILL.md`).
178
+ Agent-to-agent handoff — compacts the current conversation into a
179
+ `HANDOFF.md` artifact under `.aperant/handoffs/{id}/` (or
180
+ `{task_dir}/handoffs/{id}/` when inside a routed task), indexed via a
181
+ new `.aperant/HANDOFFS_INDEX.md`. Distinct from `/apt:pause` along
182
+ four axes: trigger (agent vs human), audience (different agent vs
183
+ future-self), uncommitted-work handling (does NOT stash), and index
184
+ file. `stage: pause`, `intent: capture`, `task_context: none`.
185
+ - **`/apt:caveman`** (new skill at `packages/framework/skills/apt-caveman/SKILL.md`).
186
+ Ultra-compressed terse output mode — toggles a persistent "smart
187
+ caveman" style that cuts conversational token usage while keeping
188
+ full technical accuracy. `stage: ops`, `intent: configure`,
189
+ `allowed-tools: ""`.
190
+
191
+ ### Changed
192
+
193
+ - **`/apt:resume`** now discovers HANDOFF artifacts in addition to
194
+ CONTINUE artifacts. New step `1b` reads `.aperant/HANDOFFS_INDEX.md`;
195
+ step `1d` scans `.aperant/{tasks/*/handoffs,handoffs}/*/HANDOFF.md` as
196
+ fallback. The Present Sessions list tags each row `[pause]` or
197
+ `[handoff]` (handoffs render first — higher urgency). Step 3 splits
198
+ into `3a` (pause: read CONTINUE.md, pop stash) vs `3b` (handoff: read
199
+ Focus, verify external state, do NOT pop stash). Cleanup removes the
200
+ matching index row regardless of type.
201
+
202
+ ### Fixed
203
+
204
+ - **Bundle A — Workspace-aware version detection.** New helper
205
+ `findWorkspaceFrameworkVersion(targetDir)` walks up to a sibling
206
+ `packages/framework/package.json` (max 6 frames, mirroring
207
+ `route/drift-detect.mjs:32`). The SessionStart worker cache + the
208
+ `apt-tools check-version --json` envelope now carry an additive
209
+ `framework.workspace_version: string | null` field. When the
210
+ workspace is ahead of the running kernel, `update_available` flips
211
+ true regardless of npm cache state — the workspace is the source of
212
+ truth on self-host. `--from-source` flag preserved as explicit
213
+ override per ID-03. Resolves issues 1, 7, 9.
214
+ - **Bundle B — Idempotent kernel install.** `installKernel` short-
215
+ circuits when the kernel package.json already reports the target
216
+ version AND the kernel binary exists. Returns the same
217
+ `status: 'installed'` envelope with `reason: 'already at target
218
+ version'` + `durationMs: 0` so the three downstream consumers
219
+ (init.mjs:1441, init.mjs:1735, SKILL.md Scenario D) keep their
220
+ existing branching. No new enum value (D-02). Resolves issues 5, 6.
221
+ - **Bundle C — SKILL.md doc gaps.** Adds the `pnpm install --filter
222
+ @aperant/framework... --frozen-lockfile=false` precondition before
223
+ the `pnpm pack` recipe (AC6); adds a hard warning against
224
+ substituting `npm pack` — names the `workspace:*` literal +
225
+ `EUNSUPPORTEDPROTOCOL` keyword (AC7); adds a `Migrated:` line slot
226
+ to all three Scenario A/B/C templates, conditional on
227
+ `legacy_cleanup?.ran === true && rmdirs.some(p => p.includes('.codex'))`
228
+ (AC8). Resolves issues 2, 4, 8.
229
+ - **Bundle D — Workspace-dep chain.** New CLI subcommand
230
+ `apt-tools install-from-source <project-dir>` walks workspace
231
+ `dependencies` + `peerDependencies` for `workspace:*` entries
232
+ (matching by package `name`, not directory name —
233
+ `@aperant/driver-sdk` lives at `packages/framework-driver-sdk/`),
234
+ pnpm-packs each, then invokes a single `npm install --prefix
235
+ .aperant/deps <tarball-list>...` with the existing kernel-install
236
+ flag set (`--no-save`, `--no-package-lock`, `--no-audit`,
237
+ `--no-fund`). Handles the same-PR unpublished-pair case
238
+ (`framework@X` + `driver-sdk@Y` both at `workspace:*`, both
239
+ unpublished) without `EUNSUPPORTEDPROTOCOL`. SKILL.md §1.7
240
+ simplified to a single apt-tools invocation; the manual recipe
241
+ preserved as a debugging-aid footnote. Resolves issue 3.
242
+ - **Bundle E — Init comment inversion + Scenario A null-latest.**
243
+ Fixed `init.mjs:1253-1268` comment + stderr direction (LEGACY =
244
+ `.codex/`, CURRENT = `.agents/skills/<folder>/SKILL.md`; was
245
+ reversed; the v0.8.2 inversion is documented in
246
+ `runtime-migrate.mjs:7-12`). Scenario A now requires
247
+ `latest_version != null` to avoid false "version bump" chips when
248
+ npm-latest is unknown (cache stale, not published, network down).
249
+ New Scenario E ("no version info available") branch handles that
250
+ case explicitly — refreshes runtime files for safety, tells the
251
+ user the bump is deferred. Resolves 2 hidden defects.
252
+
253
+ ### Schema status
254
+
255
+ Envelope changes are strictly additive — the new
256
+ `framework.workspace_version` field is nullable, existing callers
257
+ ignore unknown fields. **No `schema_version` bump** (cache stays at
258
+ `1`, locked by `update-chips.mjs:97-98` + the
259
+ `check-version-cache-merge.test.ts:137-148` schema-2 rejection
260
+ regression test).
261
+
262
+ ### Decision source
263
+
264
+ Codex sparring session 2026-05-22 (3 rounds, CONVERGED).
265
+
266
+ ### Tests
267
+
268
+ - **New:** `find-workspace-framework-version.test.ts`,
269
+ `install-kernel-idempotent.test.ts`,
270
+ `apt-update-skill-doc-gaps.test.ts`, `install-from-source.test.ts`,
271
+ `init-legacy-cleanup-direction.test.ts` (5 files / 23 new cases).
272
+ - **Augmented:** `check-version-cache-merge.test.ts` (+2 cases for
273
+ the workspace_version envelope field).
274
+ - **Regression-locked:** `apt-update-from-source-skill-structure.test.ts`,
275
+ `route-source-drift-detection.test.ts`, `legacy-cleanup-codex.test.ts`,
276
+ `check-version-cache-merge.test.ts` (existing schema_version=2
277
+ rejection at `:137-148`). All still pass.
278
+
279
+ ## 0.8.3 — 2026-05-21 — FRAMEWORK-RFC-001 — `/apt:spar` pipeline integration with install-time consent
280
+
281
+ Minor patch release. Flips `/apt:spar` from manual-only (SPAR-07 v1) to
282
+ pipeline-integrated under explicit install-time consent. Adds a per-device
283
+ opt-in question to `/apt:setup` Batch 2 Pipeline; wires `/apt:run` and the
284
+ `/apt` router to honor it with track-aware gates (QUICK rejects, STANDARD
285
+ = `plan` gate, DEEP = `plan,execute` gates); updates SPAR-07 wording.
286
+ Per-invocation `--spar-gates` flag remains as the manual override path;
287
+ rounds always defer to the skill default to avoid reintroducing
288
+ FRAMEWORK-BUG-038.
289
+
290
+ ### What
291
+
292
+ - **`SparConfig` schema delta** — three per-device fields land in
293
+ `.aperant/config.local.json` per AUDIT-001: `spar.enabled: boolean`,
294
+ `spar.partner: 'codex' | 'claude' | 'gemini' | null`, `spar.hint?: boolean`.
295
+ Added to `packages/framework/src/types/config.ts` as
296
+ `AperantConfig.spar?: SparConfig`. No migration path needed — spar lands
297
+ in `config.local.json` from day one with no shared-config legacy.
298
+
299
+ - **`apt-setup` Sparring Auto-Fire (Batch 2)** — 3-phase question block
300
+ inserted after PR Review Auto-Suggest:
301
+ - Phase 1 (Yes/No): master switch.
302
+ - Phase 2 (partner picker, only if Yes): reads
303
+ `host.partner_transports.{codex,claude,gemini}` from
304
+ `apt-tools host-detect` to filter by availability, AND excludes
305
+ `host.cli` (Open Q1 same-host filter). Graceful skip with
306
+ `spar.enabled: true, spar.partner: null` when zero partners detected.
307
+ - Phase 3 (hint sub-picker, only if No): opt-in to per-stage reminder
308
+ `[apt] {stage} complete. /apt:spar available before next stage.`
309
+ All three fields route through `writeLocalConfigField` per AUDIT-001.
310
+
311
+ - **`apt-run` flag + gate handlers** —
312
+ - `--spar-gates <plan|execute|plan,execute>` flag (per-invocation
313
+ override of merged-config consent). QUICK hard-rejects with verbatim
314
+ `[apt:run] --spar-gates ignored for QUICK track (Fast Path Guarantee)`.
315
+ - §3b "Stage 1.5 — Spar Gate (plan)": resolves effective gates, composes
316
+ topic frame from spec.md §Scope (task description fallback per
317
+ Open Q4), dispatches `/apt:spar --timeout-ms 120000 [--with <partner>]`
318
+ with NO `--rounds` flag (FRAMEWORK-BUG-038 regression guard).
319
+ - §4b "Stage 2.5 — Spar Gate (execute)": same logic, gate name
320
+ `"execute"`, topic frame from `build-progress.json`.
321
+ - Pipeline-mode `--timeout-ms 120000` (2-min Bash-rung fast-fail) is
322
+ asymmetric with manual mode (5min/15min defaults). Worst-case DEEP
323
+ wall budget: 2 gates × 3 rounds × 2 min = 12 min (vs ~90 min before
324
+ this clamp under MCP-rung partner degradation).
325
+ - §5 Verify spawn context: verifier reads Layer 2 spar findings
326
+ (`.aperant/spar/<slug>-<ts>.md`) before scoring.
327
+ - Per-stage `spar.hint` nudge at each of plan/execute/verify/review
328
+ Output: anchors (4 conditional prints, gated on
329
+ `spar.hint === true && spar.enabled === false`).
330
+
331
+ - **`apt` router envelope contract (load-bearing AC11)** — `route.mjs`
332
+ emits two deterministic consent fields:
333
+ - `envelope.spar_inject_gates` (flag-override path): pre-computed gate
334
+ string `"plan"` (STANDARD) or `"plan,execute"` (DEEP) when consent on
335
+ AND user did NOT pass explicit `--spar-gates`. Absent for QUICK/DEBUG.
336
+ - `envelope.spar_consent` (host-LLM path): block
337
+ `{ enabled, partner, user_passed_explicit_gates }` when consent on.
338
+ Host model composes `--spar-gates` from spar_consent + chosen track.
339
+ Both fields ABSENT when consent off — envelope byte-equivalent to
340
+ pre-RFC shape for users who never opted in. `apt/SKILL.md` MODE: classify
341
+ Step 4 reads ONLY the envelope (never re-reads merged config from
342
+ prompt-space) — structural test grep-locks this invariant.
343
+
344
+ - **`apt-plan` + `apt-execute` `--spar` flags** — end-of-process dispatch
345
+ to `/apt:spar` against local artifacts (spec.md / build-progress.json).
346
+ Same `--timeout-ms 120000` + no-rounds discipline. Per-skill manual
347
+ surface for users who don't use `/apt:run` end-to-end.
348
+
349
+ - **`apt-spar/SKILL.md` SPAR-07 wording** — updated from v1
350
+ "manually invoked only" to v2 "honors install-time consent". §1-§9
351
+ process body is byte-equivalent to pre-edit baseline (sha256
352
+ 9c2852ce…7da7b3 preserved by `apt-spar-pipeline-manual-path-preserved.test.ts`
353
+ hash guard). Manual `/apt:spar` invocation path UNCHANGED.
354
+
355
+ ### Why
356
+
357
+ Founder usage data confirmed that cross-provider sparring surfaces
358
+ blind-spot defects that single-provider review misses. SPAR-07's v1
359
+ escape hatch was always deferred-pending-data; the data is in. Pipeline
360
+ integration removes the per-task `--spar-gates` flag drudgery while
361
+ preserving QUICK Fast Path Guarantee + manual override surfaces.
362
+
363
+ ### Compatibility
364
+
365
+ - Backward-compatible. Users who never opt in to `spar.enabled: true`
366
+ see identical behavior to 0.8.2 — envelope shape byte-equivalent,
367
+ apt-run pipeline unchanged.
368
+ - Manual `/apt:spar` invocation path BYTE-EQUIVALENT (process body
369
+ hash-locked).
370
+ - `--spar-gates` flag is opt-in per-invocation. QUICK hard-rejects.
371
+ - Migration: no path needed. Spar lands in `config.local.json` from day
372
+ one; no shared-config legacy.
373
+
374
+ ### Out of scope (follow-up RFC-001-b candidates)
375
+
376
+ - Verify-stage spar gate (deferred — verify already iterates fix-and-retry).
377
+ - Pre-ship spar gate (likely redundant with `/apt:pr-review`).
378
+ - Multi-partner concurrent spar (use `/apt:roundtable` for 10-agent).
379
+ - Re-plan-on-spar-cede behavioral feedback loop.
380
+ - `--mcp-timeout-ms` per-invocation flag on `apt-spar` (Open Q5 —
381
+ MCP-rung pipeline tightening). Today MCP rung is config-only at
382
+ `apt-spar.mcp_timeout_ms`; pipeline mode accepts the asymmetry.
383
+
384
+ ### Version
385
+
386
+ - `packages/framework/package.json`: 0.8.2 → 0.8.3
387
+
388
+ ### Commits
389
+
390
+ - `4d67ca1d` feat(framework): add SparConfig schema for RFC-001 pipeline consent
391
+ - `e301b776` feat(framework): apt-setup Sparring Auto-Fire prompt (RFC-001 install-time consent)
392
+ - `20dea366` feat(framework): update SPAR-07 wording to v2 install-time consent contract
393
+ - `3f9ef384` feat(framework): apt-run --spar-gates flag parsing + QUICK hard-reject
394
+ - `be06429a` feat(framework): apt-run §3b + §4b spar-gate handlers
395
+ - `36c7702d` feat(framework): emit spar_inject_gates + spar_consent envelope fields
396
+ - `d803f8c5` feat(framework): apt router consent-driven --spar-gates auto-inject
397
+ - `726ae3f5` feat(framework): apt-plan + apt-execute --spar per-skill flag
398
+ - `e796580e` feat(framework): apt-run spar.hint nudge at stage success-ends
399
+
400
+ ## 0.8.2 — 2026-05-21 — Codex skill-discovery regression fix
401
+
402
+ Codex skill-discovery regression fix — install now writes to the
403
+ documented `.agents/skills/<folder>/SKILL.md` surface.
404
+
405
+ ### Fixed
406
+
407
+ - Codex `installRoot` re-targeted from `.codex` to `.agents` so SKILL.md
408
+ lands at `<targetDir>/.agents/skills/<folder>/SKILL.md` per
409
+ https://developers.openai.com/codex/skills. The previous v0.7/v0.8
410
+ `.codex/agents/` + `.codex/commands/` topology was a dead surface
411
+ (Codex CLI 0.132.0 doesn't discover skills there) and a fresh
412
+ `apt-tools init . --codex` reported 95 files installed while
413
+ `codex debug prompt-input` listed zero apt-* skills.
414
+ - Codex frontmatter strip switched from a 2-key blacklist
415
+ (`['tools', 'color']`) to an allowed_properties whitelist
416
+ (`KEEP = ['name', 'description']`), matching
417
+ `~/.codex/skills/.system/skill-creator/scripts/quick_validate.py:40`
418
+ and the working third-party skill examples. Drift-proof: any new
419
+ framework frontmatter key is dropped from Codex output without
420
+ breaking the validator.
421
+ - Codex transform now emits a single output (`skills/<folder>/SKILL.md`)
422
+ per canonical skill. The previous two-output emission
423
+ (`agents/<folder>.md` + `commands/<folder>.md`) is dropped along with
424
+ the `fileType === 'agent'` branch (markdown agents are not a Codex
425
+ surface; Codex custom-agents are TOML under `.codex/agents/`).
426
+ - `runLegacyCleanup` now GCs the v0.7/v0.8 `.codex/agents/apt-*.md` +
427
+ `.codex/commands/apt-*.md` + `.codex/apt-file-manifest.json` misdirect
428
+ on the next `apt-tools init . --codex`. `.codex/config.toml` and any
429
+ user-added `.codex/` content is preserved.
430
+
431
+ ### Changed
432
+
433
+ - `getTrustedSkillSources` now skips the Codex install root in the
434
+ per-cli filter (`cli !== 'codex'` guard). Keeps
435
+ `.aperant/logs/route-dropped.jsonl` clean for router invocations on
436
+ Codex hosts — Codex's stripped frontmatter would otherwise fail
437
+ `SkillFrontmatterSchema`. Canonical + kernel roots still serve
438
+ routing.
439
+ - `LEGACY_INSTALL_PATHS` schema gains a `honor_manifest?: boolean`
440
+ field (default `true`). When `false`, a present
441
+ `apt-file-manifest.json` at the legacy root does NOT trigger the
442
+ managed-no-op — used for known-dead surfaces like the v0.7/v0.8
443
+ codex misdirect. Existing legacy entries are unaffected (default true
444
+ preserves the managed-install safety).
445
+
446
+ ### Version
447
+
448
+ - `packages/framework/package.json`: 0.8.1 → 0.8.2
7
449
 
8
450
  ## 0.8.1 — 2026-05-20 — Pi runtime + idempotent re-init repair
9
451
 
@@ -32,7 +32,8 @@ Before planning, discover project context:
32
32
  <environment>
33
33
  - **Working directory:** The project root
34
34
  - **apt-tools:** Always invoke as `node packages/framework/bin/apt-tools.mjs`
35
- - **Task directory:** Provided in the spawn prompt as `task_dir`. ALL artifacts (spec.md, implementation_plan.json) are written here, NOT to project root.
35
+ - **Task directory:** Provided in the spawn prompt as `task_dir`. It MUST be an absolute path under the main repo's `.aperant/tasks/{task-id}/`. ALL artifacts (spec.md, implementation_plan.json) are written here, NOT to project root and NOT to a worktree-local `.aperant/tasks/` directory.
36
+ - **Worktree path:** If provided, use it only for code investigation/editing context. Do not derive artifact paths from it.
36
37
  - **Config:** `.aperant/config.json` — project preferences
37
38
  - **State:** `.aperant/state.json` — execution state
38
39
  </environment>
@@ -43,7 +44,7 @@ Before planning, discover project context:
43
44
 
44
45
  1. Read `CLAUDE.md` and `AGENTS.md` if they exist — extract conventions, stack, constraints
45
46
  2. Run `node packages/framework/bin/apt-tools.mjs state .` to understand current project state
46
- 3. Parse the task description and task_dir from the spawn prompt
47
+ 3. Parse the task description and task_dir from the spawn prompt. If task_dir is relative, resolve the real main repo path first instead of writing under the current worktree.
47
48
 
48
49
  ## 2. Assess Complexity
49
50
 
@@ -211,7 +212,7 @@ If unable to enumerate (network unavailable, action docs unclear), flag it expli
211
212
 
212
213
  ## 4. Write Specification
213
214
 
214
- The spec.md content format **branches on track** (Pocock adoption ID-05,
215
+ The spec.md content format **branches on track** (ID-05,
215
216
  Fast Path Guarantee). QUICK-routed tasks keep the existing 4-section
216
217
  shape; STANDARD/DEEP/COMPLEX tasks get a PRD-shaped artifact that
217
218
  survives the task as a second-consumer document.
@@ -239,6 +240,11 @@ survives the task as a second-consumer document.
239
240
 
240
241
  ### 4.B. STANDARD / DEEP / COMPLEX — PRD-shaped spec.md
241
242
 
243
+ **Three orthogonal user-facing sections — keep them distinct.** User
244
+ Stories (motivation prose), User Outcomes (verify-proof input contract),
245
+ and Acceptance Criteria (code-level invariants) serve distinct
246
+ purposes. Do NOT collapse them — STANDARD/DEEP specs carry all three.
247
+
242
248
  ```markdown
243
249
  # Spec: {task title}
244
250
 
@@ -256,6 +262,22 @@ survives the task as a second-consumer document.
256
262
  {One **US-NN (persona).** story per user-value slice. Stories map 1:1
257
263
  onto subtasks in implementation_plan.json.}
258
264
 
265
+ ## User Outcomes
266
+ {Verify-proof input contract. One bolded `**Epic:**` headline + N
267
+ atomic outcomes. Authors write the LITERAL string `**ON**` — IDs are
268
+ POSITIONAL and synthesized by the parser (first row becomes O1, second
269
+ O2, ...). Closed surface set: `electron | web | cli | api | electron+web`.
270
+ Optional cross-refs via `*(requires ON N)*`. Refactor-only specs MAY
271
+ use the empty-with-note escape (verbatim string,
272
+ italic underscores + em dash + period required):}
273
+
274
+ `_No user-observable changes — pure refactor._`
275
+
276
+ **Epic:** {one-sentence user-facing capability headline}
277
+
278
+ - **ON** [surface]: {user does X; system shows/does Y}
279
+ - **ON** [surface]: {user does X; system shows/does Y} *(requires ON 1)*
280
+
259
281
  ## Implementation Decisions
260
282
  {Load-bearing principles carried into every subtask. Format:
261
283
  "### ID-NN: {title}" + rationale + practical consequence.}
@@ -278,9 +300,19 @@ reference these IDs via the per-subtask `acceptance_criteria` field.}
278
300
  ```
279
301
 
280
302
  **PRD section ordering is load-bearing.** `apt-tools coverage-check
281
- validate` greps `## Acceptance Criteria`; `apt-tools consistency check`
282
- greps `## Solution` and `## User Stories`. Renaming or reordering these
283
- sections breaks downstream tooling and the C15 consistency rules.
303
+ validate` greps `## Acceptance Criteria` AND `## User Outcomes`;
304
+ `apt-tools consistency check` greps `## Solution` and `## User Stories`.
305
+ Renaming or reordering these sections breaks downstream tooling and the
306
+ C15 consistency rules.
307
+
308
+ **`## User Outcomes` synthesis directive.** Outcomes are
309
+ user-observable (a user does X; the system shows/does Y); Acceptance
310
+ Criteria are code-level invariants (a function returns X; a config key
311
+ exists). Do NOT collapse them — they parse through different gates and
312
+ serve different consumers. STANDARD/DEEP specs carry both sections in
313
+ parallel. IDs are POSITIONAL: the parser counts outcome rows in
314
+ document order and synthesizes `O1`, `O2`, ... — authors MUST write
315
+ the literal `**ON**` token, never `**O1**`/`**O2**`.
284
316
 
285
317
  **Do NOT interview the user.** The PRD is synthesized from the task
286
318
  description + codebase investigation + AGENTS.md, not from a clarifying
@@ -344,7 +376,7 @@ fix it now, not later.
344
376
 
345
377
  ## 5. Create Implementation Plan
346
378
 
347
- Subtask schema branches on track (Pocock adoption ID-05 — Fast Path Guarantee).
379
+ Subtask schema branches on track.
348
380
 
349
381
  ### 5.A. QUICK track / SIMPLE complexity — legacy flat subtask schema
350
382
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * commands/adr.mjs — `apt-tools adr write` (Pocock adoption ST-6, AC5).
2
+ * commands/adr.mjs — `apt-tools adr write`.
3
3
  *
4
4
  * Writes an ADR under `docs/adr/NNNN-slug.md` ONLY when all three Nygard
5
5
  * gates pass: hard-to-reverse AND surprising-without-context AND
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @param {string} projectDir
3
+ * @param {string[]} extraArgs
4
+ */
5
+ export function auditBranchCurrent(projectDir: string, extraArgs?: string[]): import("../util/result.mjs").CommandResult;
6
+ export { parseConflictPaths as __parseConflictPathsForTests };
7
+ /**
8
+ * Parse `git merge-tree --write-tree --no-messages HEAD origin/<base>` output
9
+ * for conflict file paths. Modern (git ≥ 2.38) merge-tree emits, on conflict:
10
+ *
11
+ * <tree-OID>
12
+ * <conflict report lines, each "<mode> <stage> <oid>\t<path>" for stage > 0>
13
+ * (NUL separator)
14
+ * <textual conflict messages>
15
+ *
16
+ * Older variants emit a `+<<<<<<< ... +======= ... +>>>>>>>` diff per file.
17
+ * For correctness we use the stable form: extract file paths from the conflict
18
+ * report. The report includes the SAME path multiple times (once per non-zero
19
+ * stage), so we de-dupe.
20
+ *
21
+ * @param {string} stdout
22
+ * @returns {string[]}
23
+ */
24
+ declare function parseConflictPaths(stdout: string): string[];
25
+ //# sourceMappingURL=audit-branch-current.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-branch-current.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/audit-branch-current.mjs"],"names":[],"mappings":"AAmIA;;;GAGG;AACH,+CAHW,MAAM,cACN,MAAM,EAAE,8CAgHlB;;AAtKD;;;;;;;;;;;;;;;;GAgBG;AACH,4CAHW,MAAM,GACJ,MAAM,EAAE,CAsBpB"}