usesteady 0.1.0-alpha.6 → 0.1.0-alpha.61

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 (410) hide show
  1. package/CHANGELOG.md +2012 -0
  2. package/README.md +246 -26
  3. package/dist/server.d.ts.map +1 -1
  4. package/dist/server.js +175 -5
  5. package/dist/server.js.map +1 -1
  6. package/dist/src/claude/adapters/multi-llm-adapter.d.ts +72 -0
  7. package/dist/src/claude/adapters/multi-llm-adapter.d.ts.map +1 -0
  8. package/dist/src/claude/adapters/multi-llm-adapter.js +423 -0
  9. package/dist/src/claude/adapters/multi-llm-adapter.js.map +1 -0
  10. package/dist/src/claude/adapters/multi-llm-types.d.ts +246 -0
  11. package/dist/src/claude/adapters/multi-llm-types.d.ts.map +1 -0
  12. package/dist/src/claude/adapters/multi-llm-types.js +262 -0
  13. package/dist/src/claude/adapters/multi-llm-types.js.map +1 -0
  14. package/dist/src/claude/adapters/openai-compatible-adapter.d.ts +99 -0
  15. package/dist/src/claude/adapters/openai-compatible-adapter.d.ts.map +1 -0
  16. package/dist/src/claude/adapters/openai-compatible-adapter.js +424 -0
  17. package/dist/src/claude/adapters/openai-compatible-adapter.js.map +1 -0
  18. package/dist/src/claude/index.d.ts +6 -0
  19. package/dist/src/claude/index.d.ts.map +1 -1
  20. package/dist/src/claude/index.js +4 -0
  21. package/dist/src/claude/index.js.map +1 -1
  22. package/dist/src/config/providers.d.ts +61 -0
  23. package/dist/src/config/providers.d.ts.map +1 -0
  24. package/dist/src/config/providers.js +57 -0
  25. package/dist/src/config/providers.js.map +1 -0
  26. package/dist/src/control/compiler.d.ts.map +1 -1
  27. package/dist/src/control/compiler.js +53 -4
  28. package/dist/src/control/compiler.js.map +1 -1
  29. package/dist/src/control/discover-boundary.d.ts +88 -0
  30. package/dist/src/control/discover-boundary.d.ts.map +1 -0
  31. package/dist/src/control/discover-boundary.js +172 -0
  32. package/dist/src/control/discover-boundary.js.map +1 -0
  33. package/dist/src/control/verify-and-resolve.d.ts +82 -0
  34. package/dist/src/control/verify-and-resolve.d.ts.map +1 -0
  35. package/dist/src/control/verify-and-resolve.js +207 -0
  36. package/dist/src/control/verify-and-resolve.js.map +1 -0
  37. package/dist/src/cursor/adapters/inprocess-adapter.d.ts +71 -2
  38. package/dist/src/cursor/adapters/inprocess-adapter.d.ts.map +1 -1
  39. package/dist/src/cursor/adapters/inprocess-adapter.js +559 -23
  40. package/dist/src/cursor/adapters/inprocess-adapter.js.map +1 -1
  41. package/dist/src/cursor/artifact-mapper.js +1 -0
  42. package/dist/src/cursor/artifact-mapper.js.map +1 -1
  43. package/dist/src/cursor/ocd-evaluator.d.ts.map +1 -1
  44. package/dist/src/cursor/ocd-evaluator.js +64 -3
  45. package/dist/src/cursor/ocd-evaluator.js.map +1 -1
  46. package/dist/src/cursor/types.d.ts +1 -1
  47. package/dist/src/cursor/types.d.ts.map +1 -1
  48. package/dist/src/execution/cursor/cursor-execution-coordinator.js +2 -0
  49. package/dist/src/execution/cursor/cursor-execution-coordinator.js.map +1 -1
  50. package/dist/src/execution/unresolved-classification.d.ts +5 -0
  51. package/dist/src/execution/unresolved-classification.d.ts.map +1 -0
  52. package/dist/src/execution/unresolved-classification.js +26 -0
  53. package/dist/src/execution/unresolved-classification.js.map +1 -0
  54. package/dist/src/friction/activation.d.ts +34 -0
  55. package/dist/src/friction/activation.d.ts.map +1 -0
  56. package/dist/src/friction/activation.js +96 -0
  57. package/dist/src/friction/activation.js.map +1 -0
  58. package/dist/src/friction/github-issues.d.ts +6 -0
  59. package/dist/src/friction/github-issues.d.ts.map +1 -1
  60. package/dist/src/friction/github-issues.js +9 -0
  61. package/dist/src/friction/github-issues.js.map +1 -1
  62. package/dist/src/friction/posthog.d.ts +33 -0
  63. package/dist/src/friction/posthog.d.ts.map +1 -0
  64. package/dist/src/friction/posthog.js +106 -0
  65. package/dist/src/friction/posthog.js.map +1 -0
  66. package/dist/src/index.d.ts +4 -2
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/index.js +3 -1
  69. package/dist/src/index.js.map +1 -1
  70. package/dist/src/input/cli-error.d.ts +177 -0
  71. package/dist/src/input/cli-error.d.ts.map +1 -0
  72. package/dist/src/input/cli-error.js +57 -0
  73. package/dist/src/input/cli-error.js.map +1 -0
  74. package/dist/src/input/feasibility-validator.d.ts +136 -0
  75. package/dist/src/input/feasibility-validator.d.ts.map +1 -0
  76. package/dist/src/input/feasibility-validator.js +807 -0
  77. package/dist/src/input/feasibility-validator.js.map +1 -0
  78. package/dist/src/input/index.d.ts +22 -0
  79. package/dist/src/input/index.d.ts.map +1 -0
  80. package/dist/src/input/index.js +26 -0
  81. package/dist/src/input/index.js.map +1 -0
  82. package/dist/src/input/ir-to-draft.d.ts +58 -0
  83. package/dist/src/input/ir-to-draft.d.ts.map +1 -0
  84. package/dist/src/input/ir-to-draft.js +132 -0
  85. package/dist/src/input/ir-to-draft.js.map +1 -0
  86. package/dist/src/input/ir.d.ts +120 -0
  87. package/dist/src/input/ir.d.ts.map +1 -0
  88. package/dist/src/input/ir.js +37 -0
  89. package/dist/src/input/ir.js.map +1 -0
  90. package/dist/src/input/json-to-ir.d.ts +113 -0
  91. package/dist/src/input/json-to-ir.d.ts.map +1 -0
  92. package/dist/src/input/json-to-ir.js +229 -0
  93. package/dist/src/input/json-to-ir.js.map +1 -0
  94. package/dist/src/input/nl-to-ir.d.ts +132 -0
  95. package/dist/src/input/nl-to-ir.d.ts.map +1 -0
  96. package/dist/src/input/nl-to-ir.js +669 -0
  97. package/dist/src/input/nl-to-ir.js.map +1 -0
  98. package/dist/src/input/op-registry.d.ts +118 -0
  99. package/dist/src/input/op-registry.d.ts.map +1 -0
  100. package/dist/src/input/op-registry.js +160 -0
  101. package/dist/src/input/op-registry.js.map +1 -0
  102. package/dist/src/intake/intake-service.d.ts +26 -0
  103. package/dist/src/intake/intake-service.d.ts.map +1 -1
  104. package/dist/src/intake/intake-service.js +46 -0
  105. package/dist/src/intake/intake-service.js.map +1 -1
  106. package/dist/src/intake/intent-families.d.ts +85 -0
  107. package/dist/src/intake/intent-families.d.ts.map +1 -0
  108. package/dist/src/intake/intent-families.js +69 -0
  109. package/dist/src/intake/intent-families.js.map +1 -0
  110. package/dist/src/intake/llm-classifier.d.ts +46 -0
  111. package/dist/src/intake/llm-classifier.d.ts.map +1 -0
  112. package/dist/src/intake/llm-classifier.js +177 -0
  113. package/dist/src/intake/llm-classifier.js.map +1 -0
  114. package/dist/src/interaction/guidance-order.js +3 -3
  115. package/dist/src/interaction/guidance-order.js.map +1 -1
  116. package/dist/src/kernel/artifact.d.ts +32 -0
  117. package/dist/src/kernel/artifact.d.ts.map +1 -0
  118. package/dist/src/kernel/artifact.js +55 -0
  119. package/dist/src/kernel/artifact.js.map +1 -0
  120. package/dist/src/kernel/classifier.d.ts +63 -0
  121. package/dist/src/kernel/classifier.d.ts.map +1 -0
  122. package/dist/src/kernel/classifier.js +174 -0
  123. package/dist/src/kernel/classifier.js.map +1 -0
  124. package/dist/src/kernel/command-classifier.d.ts +74 -0
  125. package/dist/src/kernel/command-classifier.d.ts.map +1 -0
  126. package/dist/src/kernel/command-classifier.js +101 -0
  127. package/dist/src/kernel/command-classifier.js.map +1 -0
  128. package/dist/src/kernel/error-codes.d.ts +252 -0
  129. package/dist/src/kernel/error-codes.d.ts.map +1 -0
  130. package/dist/src/kernel/error-codes.js +278 -0
  131. package/dist/src/kernel/error-codes.js.map +1 -0
  132. package/dist/src/kernel/execution-replay.d.ts +73 -0
  133. package/dist/src/kernel/execution-replay.d.ts.map +1 -0
  134. package/dist/src/kernel/execution-replay.js +393 -0
  135. package/dist/src/kernel/execution-replay.js.map +1 -0
  136. package/dist/src/kernel/persist.d.ts +24 -0
  137. package/dist/src/kernel/persist.d.ts.map +1 -0
  138. package/dist/src/kernel/persist.js +32 -0
  139. package/dist/src/kernel/persist.js.map +1 -0
  140. package/dist/src/kernel/replay.d.ts +27 -0
  141. package/dist/src/kernel/replay.d.ts.map +1 -0
  142. package/dist/src/kernel/replay.js +59 -0
  143. package/dist/src/kernel/replay.js.map +1 -0
  144. package/dist/src/kernel/result-equality.d.ts +19 -0
  145. package/dist/src/kernel/result-equality.d.ts.map +1 -0
  146. package/dist/src/kernel/result-equality.js +24 -0
  147. package/dist/src/kernel/result-equality.js.map +1 -0
  148. package/dist/src/kernel/sandbox.d.ts +35 -0
  149. package/dist/src/kernel/sandbox.d.ts.map +1 -0
  150. package/dist/src/kernel/sandbox.js +47 -0
  151. package/dist/src/kernel/sandbox.js.map +1 -0
  152. package/dist/src/kernel/types.d.ts +55 -0
  153. package/dist/src/kernel/types.d.ts.map +1 -0
  154. package/dist/src/kernel/types.js +15 -0
  155. package/dist/src/kernel/types.js.map +1 -0
  156. package/dist/src/observe/drl-ledger-writer.d.ts +13 -0
  157. package/dist/src/observe/drl-ledger-writer.d.ts.map +1 -0
  158. package/dist/src/observe/drl-ledger-writer.js +8 -0
  159. package/dist/src/observe/drl-ledger-writer.js.map +1 -0
  160. package/dist/src/product/claude-product-session.d.ts +2 -1
  161. package/dist/src/product/claude-product-session.d.ts.map +1 -1
  162. package/dist/src/product/claude-product-session.js +2 -2
  163. package/dist/src/product/claude-product-session.js.map +1 -1
  164. package/dist/src/product/cursor-product-session.d.ts +16 -1
  165. package/dist/src/product/cursor-product-session.d.ts.map +1 -1
  166. package/dist/src/product/cursor-product-session.js +212 -5
  167. package/dist/src/product/cursor-product-session.js.map +1 -1
  168. package/dist/src/prv/patterns.d.ts.map +1 -1
  169. package/dist/src/prv/patterns.js +10 -1
  170. package/dist/src/prv/patterns.js.map +1 -1
  171. package/dist/src/safety/canonicalize.d.ts +65 -0
  172. package/dist/src/safety/canonicalize.d.ts.map +1 -0
  173. package/dist/src/safety/canonicalize.js +126 -0
  174. package/dist/src/safety/canonicalize.js.map +1 -0
  175. package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts.map +1 -1
  176. package/dist/src/safety/detectors/arbitrary-exec.detector.js +21 -4
  177. package/dist/src/safety/detectors/arbitrary-exec.detector.js.map +1 -1
  178. package/dist/src/safety/detectors/destructive.detector.d.ts.map +1 -1
  179. package/dist/src/safety/detectors/destructive.detector.js +14 -1
  180. package/dist/src/safety/detectors/destructive.detector.js.map +1 -1
  181. package/dist/src/safety/filename-safety.d.ts +287 -0
  182. package/dist/src/safety/filename-safety.d.ts.map +1 -0
  183. package/dist/src/safety/filename-safety.js +801 -0
  184. package/dist/src/safety/filename-safety.js.map +1 -0
  185. package/dist/src/safety/safety-gate.d.ts +7 -0
  186. package/dist/src/safety/safety-gate.d.ts.map +1 -1
  187. package/dist/src/safety/safety-gate.js +24 -2
  188. package/dist/src/safety/safety-gate.js.map +1 -1
  189. package/dist/src/session/controller.d.ts +259 -0
  190. package/dist/src/session/controller.d.ts.map +1 -0
  191. package/dist/src/session/controller.js +286 -0
  192. package/dist/src/session/controller.js.map +1 -0
  193. package/dist/src/session/index.d.ts +12 -0
  194. package/dist/src/session/index.d.ts.map +1 -0
  195. package/dist/src/session/index.js +12 -0
  196. package/dist/src/session/index.js.map +1 -0
  197. package/dist/src/shell/cli/capabilities.d.ts +76 -0
  198. package/dist/src/shell/cli/capabilities.d.ts.map +1 -0
  199. package/dist/src/shell/cli/capabilities.js +111 -0
  200. package/dist/src/shell/cli/capabilities.js.map +1 -0
  201. package/dist/src/shell/cli/claude-setup.d.ts +43 -0
  202. package/dist/src/shell/cli/claude-setup.d.ts.map +1 -0
  203. package/dist/src/shell/cli/claude-setup.js +218 -0
  204. package/dist/src/shell/cli/claude-setup.js.map +1 -0
  205. package/dist/src/shell/cli/config-hydration.d.ts +37 -0
  206. package/dist/src/shell/cli/config-hydration.d.ts.map +1 -0
  207. package/dist/src/shell/cli/config-hydration.js +68 -0
  208. package/dist/src/shell/cli/config-hydration.js.map +1 -0
  209. package/dist/src/shell/cli/draft/intent-to-tasks.d.ts +68 -0
  210. package/dist/src/shell/cli/draft/intent-to-tasks.d.ts.map +1 -0
  211. package/dist/src/shell/cli/draft/intent-to-tasks.js +355 -0
  212. package/dist/src/shell/cli/draft/intent-to-tasks.js.map +1 -0
  213. package/dist/src/shell/cli/examples.d.ts +94 -0
  214. package/dist/src/shell/cli/examples.d.ts.map +1 -0
  215. package/dist/src/shell/cli/examples.js +173 -0
  216. package/dist/src/shell/cli/examples.js.map +1 -0
  217. package/dist/src/shell/cli/execution-policy.d.ts +67 -0
  218. package/dist/src/shell/cli/execution-policy.d.ts.map +1 -0
  219. package/dist/src/shell/cli/execution-policy.js +73 -0
  220. package/dist/src/shell/cli/execution-policy.js.map +1 -0
  221. package/dist/src/shell/cli/execution-summary.d.ts +115 -0
  222. package/dist/src/shell/cli/execution-summary.d.ts.map +1 -0
  223. package/dist/src/shell/cli/execution-summary.js +166 -0
  224. package/dist/src/shell/cli/execution-summary.js.map +1 -0
  225. package/dist/src/shell/cli/friction-report.d.ts.map +1 -1
  226. package/dist/src/shell/cli/friction-report.js +16 -8
  227. package/dist/src/shell/cli/friction-report.js.map +1 -1
  228. package/dist/src/shell/cli/ir-to-spec-fields.d.ts +47 -0
  229. package/dist/src/shell/cli/ir-to-spec-fields.d.ts.map +1 -0
  230. package/dist/src/shell/cli/ir-to-spec-fields.js +138 -0
  231. package/dist/src/shell/cli/ir-to-spec-fields.js.map +1 -0
  232. package/dist/src/shell/cli/main.d.ts +42 -20
  233. package/dist/src/shell/cli/main.d.ts.map +1 -1
  234. package/dist/src/shell/cli/main.js +1247 -107
  235. package/dist/src/shell/cli/main.js.map +1 -1
  236. package/dist/src/shell/cli/normalize-prompt-text.d.ts +67 -0
  237. package/dist/src/shell/cli/normalize-prompt-text.d.ts.map +1 -0
  238. package/dist/src/shell/cli/normalize-prompt-text.js +100 -0
  239. package/dist/src/shell/cli/normalize-prompt-text.js.map +1 -0
  240. package/dist/src/shell/cli/onboarding.d.ts +10 -3
  241. package/dist/src/shell/cli/onboarding.d.ts.map +1 -1
  242. package/dist/src/shell/cli/onboarding.js +105 -29
  243. package/dist/src/shell/cli/onboarding.js.map +1 -1
  244. package/dist/src/shell/cli/quickstart.d.ts +41 -0
  245. package/dist/src/shell/cli/quickstart.d.ts.map +1 -0
  246. package/dist/src/shell/cli/quickstart.js +159 -0
  247. package/dist/src/shell/cli/quickstart.js.map +1 -0
  248. package/dist/src/shell/cli/resolve-spec-path.d.ts +62 -0
  249. package/dist/src/shell/cli/resolve-spec-path.d.ts.map +1 -0
  250. package/dist/src/shell/cli/resolve-spec-path.js +56 -0
  251. package/dist/src/shell/cli/resolve-spec-path.js.map +1 -0
  252. package/dist/src/shell/cli/spec-nl-synth.d.ts +76 -0
  253. package/dist/src/shell/cli/spec-nl-synth.d.ts.map +1 -0
  254. package/dist/src/shell/cli/spec-nl-synth.js +89 -0
  255. package/dist/src/shell/cli/spec-nl-synth.js.map +1 -0
  256. package/dist/src/shell/cli/spec-task-builder.d.ts +97 -0
  257. package/dist/src/shell/cli/spec-task-builder.d.ts.map +1 -0
  258. package/dist/src/shell/cli/spec-task-builder.js +190 -0
  259. package/dist/src/shell/cli/spec-task-builder.js.map +1 -0
  260. package/dist/src/shell/cli/templates.d.ts +142 -0
  261. package/dist/src/shell/cli/templates.d.ts.map +1 -0
  262. package/dist/src/shell/cli/templates.js +449 -0
  263. package/dist/src/shell/cli/templates.js.map +1 -0
  264. package/dist/src/shell/cli/use-steady.d.ts +196 -17
  265. package/dist/src/shell/cli/use-steady.d.ts.map +1 -1
  266. package/dist/src/shell/cli/use-steady.js +2019 -81
  267. package/dist/src/shell/cli/use-steady.js.map +1 -1
  268. package/dist/src/shell/cli/workflow-outcome-file.d.ts +13 -0
  269. package/dist/src/shell/cli/workflow-outcome-file.d.ts.map +1 -0
  270. package/dist/src/shell/cli/workflow-outcome-file.js +43 -0
  271. package/dist/src/shell/cli/workflow-outcome-file.js.map +1 -0
  272. package/dist/src/shell/cli/workflow-terminal.d.ts +44 -0
  273. package/dist/src/shell/cli/workflow-terminal.d.ts.map +1 -0
  274. package/dist/src/shell/cli/workflow-terminal.js +69 -0
  275. package/dist/src/shell/cli/workflow-terminal.js.map +1 -0
  276. package/dist/src/shell/render-escape.d.ts +81 -0
  277. package/dist/src/shell/render-escape.d.ts.map +1 -0
  278. package/dist/src/shell/render-escape.js +104 -0
  279. package/dist/src/shell/render-escape.js.map +1 -0
  280. package/dist/src/shell/render.d.ts.map +1 -1
  281. package/dist/src/shell/render.js +3 -1
  282. package/dist/src/shell/render.js.map +1 -1
  283. package/dist/src/shell/tui/app.d.ts +8 -0
  284. package/dist/src/shell/tui/app.d.ts.map +1 -0
  285. package/dist/src/shell/tui/app.js +5 -0
  286. package/dist/src/shell/tui/app.js.map +1 -0
  287. package/dist/src/shell/tui/components/BlockedReasonPanel.d.ts +21 -0
  288. package/dist/src/shell/tui/components/BlockedReasonPanel.d.ts.map +1 -0
  289. package/dist/src/shell/tui/components/BlockedReasonPanel.js +9 -0
  290. package/dist/src/shell/tui/components/BlockedReasonPanel.js.map +1 -0
  291. package/dist/src/shell/tui/components/ConsensusPanel.d.ts +27 -0
  292. package/dist/src/shell/tui/components/ConsensusPanel.d.ts.map +1 -0
  293. package/dist/src/shell/tui/components/ConsensusPanel.js +14 -0
  294. package/dist/src/shell/tui/components/ConsensusPanel.js.map +1 -0
  295. package/dist/src/shell/tui/components/StepList.d.ts +14 -0
  296. package/dist/src/shell/tui/components/StepList.d.ts.map +1 -0
  297. package/dist/src/shell/tui/components/StepList.js +34 -0
  298. package/dist/src/shell/tui/components/StepList.js.map +1 -0
  299. package/dist/src/shell/tui/components/SystemWillPanel.d.ts +12 -0
  300. package/dist/src/shell/tui/components/SystemWillPanel.d.ts.map +1 -0
  301. package/dist/src/shell/tui/components/SystemWillPanel.js +9 -0
  302. package/dist/src/shell/tui/components/SystemWillPanel.js.map +1 -0
  303. package/dist/src/shell/tui/components/WorkflowView.d.ts +11 -0
  304. package/dist/src/shell/tui/components/WorkflowView.d.ts.map +1 -0
  305. package/dist/src/shell/tui/components/WorkflowView.js +21 -0
  306. package/dist/src/shell/tui/components/WorkflowView.js.map +1 -0
  307. package/dist/src/shell/tui/hooks/useWorkflowState.d.ts +10 -0
  308. package/dist/src/shell/tui/hooks/useWorkflowState.d.ts.map +1 -0
  309. package/dist/src/shell/tui/hooks/useWorkflowState.js +28 -0
  310. package/dist/src/shell/tui/hooks/useWorkflowState.js.map +1 -0
  311. package/dist/src/shell/tui/index.d.ts +8 -0
  312. package/dist/src/shell/tui/index.d.ts.map +1 -0
  313. package/dist/src/shell/tui/index.js +10 -0
  314. package/dist/src/shell/tui/index.js.map +1 -0
  315. package/dist/src/shell/tui/state-bridge.d.ts +37 -0
  316. package/dist/src/shell/tui/state-bridge.d.ts.map +1 -0
  317. package/dist/src/shell/tui/state-bridge.js +137 -0
  318. package/dist/src/shell/tui/state-bridge.js.map +1 -0
  319. package/dist/src/shell/tui/types.d.ts +56 -0
  320. package/dist/src/shell/tui/types.d.ts.map +1 -0
  321. package/dist/src/shell/tui/types.js +9 -0
  322. package/dist/src/shell/tui/types.js.map +1 -0
  323. package/dist/src/shell/workflow-render.d.ts +26 -1
  324. package/dist/src/shell/workflow-render.d.ts.map +1 -1
  325. package/dist/src/shell/workflow-render.js +430 -8
  326. package/dist/src/shell/workflow-render.js.map +1 -1
  327. package/dist/src/ucp/envelope.d.ts +13 -1
  328. package/dist/src/ucp/envelope.d.ts.map +1 -1
  329. package/dist/src/ucp/envelope.js +16 -0
  330. package/dist/src/ucp/envelope.js.map +1 -1
  331. package/dist/src/ucp/mappers/map-json-op-command.d.ts +15 -0
  332. package/dist/src/ucp/mappers/map-json-op-command.d.ts.map +1 -0
  333. package/dist/src/ucp/mappers/map-json-op-command.js +16 -0
  334. package/dist/src/ucp/mappers/map-json-op-command.js.map +1 -0
  335. package/dist/src/ucp/mappers/map-workflow-execution-result.d.ts +16 -0
  336. package/dist/src/ucp/mappers/map-workflow-execution-result.d.ts.map +1 -0
  337. package/dist/src/ucp/mappers/map-workflow-execution-result.js +17 -0
  338. package/dist/src/ucp/mappers/map-workflow-execution-result.js.map +1 -0
  339. package/dist/src/ucp/types.d.ts +28 -1
  340. package/dist/src/ucp/types.d.ts.map +1 -1
  341. package/dist/src/understand/completion/completion.d.ts.map +1 -1
  342. package/dist/src/understand/completion/completion.js +19 -8
  343. package/dist/src/understand/completion/completion.js.map +1 -1
  344. package/dist/src/understand/completion/rules.d.ts +74 -2
  345. package/dist/src/understand/completion/rules.d.ts.map +1 -1
  346. package/dist/src/understand/completion/rules.js +341 -11
  347. package/dist/src/understand/completion/rules.js.map +1 -1
  348. package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts.map +1 -1
  349. package/dist/src/understand/disambiguation/detectors/missing-context.detector.js +10 -8
  350. package/dist/src/understand/disambiguation/detectors/missing-context.detector.js.map +1 -1
  351. package/dist/src/understand/intent-interpretation/intent-interpretation.js +6 -6
  352. package/dist/src/understand/intent-interpretation/intent-interpretation.js.map +1 -1
  353. package/dist/src/understand/intent-interpretation/types.d.ts +20 -0
  354. package/dist/src/understand/intent-interpretation/types.d.ts.map +1 -1
  355. package/dist/src/understand/interpretation/parser.d.ts +1 -1
  356. package/dist/src/understand/interpretation/parser.d.ts.map +1 -1
  357. package/dist/src/understand/interpretation/parser.js +93 -15
  358. package/dist/src/understand/interpretation/parser.js.map +1 -1
  359. package/dist/src/understand/interpretation/types.d.ts +11 -0
  360. package/dist/src/understand/interpretation/types.d.ts.map +1 -1
  361. package/dist/src/understand/interpretation/types.js.map +1 -1
  362. package/dist/src/understand/silent-guidance/selector.d.ts +4 -3
  363. package/dist/src/understand/silent-guidance/selector.d.ts.map +1 -1
  364. package/dist/src/understand/silent-guidance/selector.js +18 -3
  365. package/dist/src/understand/silent-guidance/selector.js.map +1 -1
  366. package/dist/src/understand/silent-guidance/templates.d.ts.map +1 -1
  367. package/dist/src/understand/silent-guidance/templates.js +35 -7
  368. package/dist/src/understand/silent-guidance/templates.js.map +1 -1
  369. package/dist/src/understand/silent-guidance/types.d.ts +2 -1
  370. package/dist/src/understand/silent-guidance/types.d.ts.map +1 -1
  371. package/dist/src/utils/credentials.d.ts +70 -0
  372. package/dist/src/utils/credentials.d.ts.map +1 -0
  373. package/dist/src/utils/credentials.js +101 -0
  374. package/dist/src/utils/credentials.js.map +1 -0
  375. package/dist/src/workflow/coordinator.d.ts.map +1 -1
  376. package/dist/src/workflow/coordinator.js +282 -20
  377. package/dist/src/workflow/coordinator.js.map +1 -1
  378. package/dist/src/workflow/index.d.ts +2 -0
  379. package/dist/src/workflow/index.d.ts.map +1 -1
  380. package/dist/src/workflow/index.js +2 -0
  381. package/dist/src/workflow/index.js.map +1 -1
  382. package/dist/src/workflow/spec-hash.d.ts +76 -0
  383. package/dist/src/workflow/spec-hash.d.ts.map +1 -0
  384. package/dist/src/workflow/spec-hash.js +116 -0
  385. package/dist/src/workflow/spec-hash.js.map +1 -0
  386. package/dist/src/workflow/types.d.ts +88 -3
  387. package/dist/src/workflow/types.d.ts.map +1 -1
  388. package/package.json +48 -7
  389. package/dist/server-admin.d.ts +0 -11
  390. package/dist/server-admin.d.ts.map +0 -1
  391. package/dist/server-admin.js +0 -188
  392. package/dist/server-admin.js.map +0 -1
  393. package/dist/src/shell/cli/friction-admin.d.ts +0 -14
  394. package/dist/src/shell/cli/friction-admin.d.ts.map +0 -1
  395. package/dist/src/shell/cli/friction-admin.js +0 -276
  396. package/dist/src/shell/cli/friction-admin.js.map +0 -1
  397. package/ui/README.md +0 -73
  398. package/ui/dist/ai.txt +0 -14
  399. package/ui/dist/apple-icon.png +0 -0
  400. package/ui/dist/assets/index-C_i9832M.js +0 -268
  401. package/ui/dist/assets/index-D_rglT6E.css +0 -2
  402. package/ui/dist/favicon-16.png +0 -0
  403. package/ui/dist/favicon-32.png +0 -0
  404. package/ui/dist/favicon.svg +0 -22
  405. package/ui/dist/icon-192.png +0 -0
  406. package/ui/dist/icon-512.png +0 -0
  407. package/ui/dist/icon.png +0 -0
  408. package/ui/dist/icons.svg +0 -24
  409. package/ui/dist/index.html +0 -19
  410. package/ui/dist/robots.txt +0 -71
package/CHANGELOG.md ADDED
@@ -0,0 +1,2012 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0-alpha.61 - create_dir execution-truthfulness alignment
4
+
5
+ **Released:** May 2026
6
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
7
+
8
+ Post-alpha.60 delta. Closes 1 accepted friction across 1 trust surface:
9
+ execution truthfulness (#49). No new public `CliErrorCode`, no new
10
+ approval semantics, no new operation type, no exit-code change.
11
+
12
+ Included PR: [#322](https://github.com/shortgigs/usesteady-core/pull/322).
13
+ No other deltas since alpha.60 (`a6c1264`) other than the release-
14
+ process documentation merged via [#321](https://github.com/shortgigs/usesteady-core/pull/321)
15
+ (`docs/RELEASE.md` -- process hygiene, no product surface impact).
16
+
17
+ This is also the first release under the
18
+ [`docs/RELEASE.md`](./docs/RELEASE.md) runbook merged after the
19
+ alpha.41-alpha.60 release-hygiene postmortem. The V1-V5 post-publish
20
+ verification block in the release PR exists to prove
21
+ publish-success-implies-release-success, addressing the silent
22
+ alpha-dist-tag and git-tag drift identified in that postmortem.
23
+
24
+ ### Execution truthfulness: `create_dir` aligns with `create` on `target_exists`
25
+
26
+ Closes [shortgigs/usesteady-public#49](https://github.com/shortgigs/usesteady-public/issues/49)
27
+ (P2, `status/accepted` since alpha.58).
28
+
29
+ **Pre-fix behavior (alpha.59 and earlier).** `create_dir` against an
30
+ existing directory was not refused at the feasibility validator, and the
31
+ in-process adapter called `mkdirSync(..., { recursive: true })`, which
32
+ silently succeeds on `EEXIST`. The run then reported
33
+ `{"success":true,"error":null,...}` on `--output json` (and "Completed
34
+ successfully" on the text path) for a no-op. Files inside the existing
35
+ directory were untouched -- there was no destructive side effect -- but
36
+ the success banner lied about what happened, breaking the
37
+ execution-truthfulness contract that `create` (write_file) has held since
38
+ M3.
39
+
40
+ **Post-fix behavior.** Both the feasibility validator (primary
41
+ enforcement) and the in-process adapter (defense-in-depth, mirroring the
42
+ S2/#36 and Cluster B Iter 4 / #60-#67 posture) refuse `create_dir`
43
+ against an existing path with the existing public `target_exists`
44
+ `CliErrorCode` -- the same code `create` (write_file) already used for
45
+ the analogous shape. `--output json` now emits
46
+ `{"success":false,"error":"target_exists",...}` and the text path
47
+ prints "Refusing to create directory: target already exists at <abs>"
48
+ before the executor is reached.
49
+
50
+ **Scope discipline (mirrors PR review-posture).**
51
+
52
+ - No new public `CliErrorCode`: `target_exists` already covered `create`
53
+ and `rename`; this fix extends it to `create_dir` without inventing
54
+ new vocabulary.
55
+ - No new approval-bypass affordance, no new exit code, no execution-
56
+ summary widening, no new operation type.
57
+ - No new symlink check on `create_dir` (would be a new refusal class).
58
+ `existsSync` follows symlinks, so a symlink that resolves to an
59
+ existing path is caught via the same code path; a symlink to a
60
+ non-existent target still passes this check (pre-existing behavior,
61
+ unchanged).
62
+ - Nested-directory behavior preserved: only the leaf is probed. For a
63
+ new leaf whose parents do not yet exist, the executor's
64
+ `mkdirSync(..., { recursive: true })` still creates parents in one
65
+ shot. Only the case where the leaf path itself already exists is
66
+ refused.
67
+ - No work on [#45](https://github.com/shortgigs/usesteady-public/issues/45)
68
+ (occurrence-directive divergence on replace ops, P1) -- that is a
69
+ separate PR with a different shape.
70
+
71
+ **Tests.** Validator-stage refusal of `create_dir` on existing empty
72
+ directory, existing populated directory (with files preserved), happy
73
+ path of fresh leaf, happy path of fresh nested leaf, happy path of
74
+ fresh leaf with existing parents; ordering against `prohibited_path`
75
+ and `invalid_filename_chars` (more-specific refusals still win);
76
+ public-code parity with `create`. Adapter-stage defense-in-depth
77
+ covering all of the above plus the file-at-target case (existing file
78
+ occupies the target path -- no clobber, refused with `target_exists`).
79
+ End-to-end CLI test on `--json --output json` confirms exit code 1,
80
+ `success:false`, `error:"target_exists"`, and that files inside the
81
+ pre-existing directory are preserved verbatim.
82
+
83
+ **Truthfulness invariant added by this fix.** For every path-bearing
84
+ creation op (`create`, `create_dir`, `rename`'s `newPath`), a
85
+ public-surface success result now implies the executor performed the
86
+ creation. Previously this held for `create` and `rename` but failed
87
+ silently for `create_dir`.
88
+
89
+ ## 0.1.0-alpha.60 - Protected paths + filename hygiene + OCD warning truthfulness
90
+
91
+ **Released:** May 2026
92
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
93
+
94
+ Post-alpha.59 delta. Closes 4 accepted frictions across 2 trust surfaces:
95
+ filesystem location safety (Cluster B Iter 4: #60, #67, #68) and
96
+ execution truthfulness (#42). One new public `CliErrorCode`
97
+ (`prohibited_path`); no new approval semantics, no new operation types,
98
+ no exit-code change, OCD remains non-blocking.
99
+
100
+ Included PRs: #318 (Cluster B Iter 4) and #319 (#42 OCD warning
101
+ alignment). No other deltas since alpha.59 (`4cbac6c`).
102
+
103
+ ### Cluster B Iteration 4 - Protected Paths Registry + whitespace-bounded filenames
104
+
105
+ Design rationale: [`docs/adr/ADR-cluster-b-iteration-4-protected-paths.md`](./docs/adr/ADR-cluster-b-iteration-4-protected-paths.md).
106
+
107
+ Closes three accepted frictions in one coherent feature, following
108
+ the flat pure-function style of Iter 2 / Iter 3 / Iter 3.5 / Iter 3.6.
109
+
110
+ - **shortgigs/usesteady-public#60** (`create_dir` into `.git/hooks`):
111
+ refused at the validate stage with the new public `prohibited_path`
112
+ code; defense-in-depth re-check at the cursor adapter mirrors the
113
+ S2/#36 posture (every fs-op site).
114
+ - **shortgigs/usesteady-public#67** (silent `delete` of `.git/HEAD`):
115
+ same refusal class, applied symmetrically to delete / rename
116
+ (both from and to) / append / prepend / replace. Unlike filename-
117
+ hygiene checks (Iter 2/3), the protected-path check runs on
118
+ `delete` -- the friction shape is symmetric.
119
+ - **shortgigs/usesteady-public#68** (leading/trailing whitespace in
120
+ filenames): refused at validate/executor; folds under the existing
121
+ `invalid_filename_chars` public code (internal discriminant
122
+ `invalid_filename_whitespace`). Per-segment check catches
123
+ intermediate-directory whitespace too, not just basenames.
124
+
125
+ #### Authority surface
126
+
127
+ - One new public `CliErrorCode`: `prohibited_path`. Strongly justified
128
+ (distinct semantic from `invalid_filename_chars`: path is well-
129
+ formed and inside the workspace; the LOCATION is off-limits;
130
+ remediation is "use git directly," not "rename").
131
+ - No new operation types, no new approval semantics, no new
132
+ approval-bypass affordances.
133
+ - V1 protected set: any segment exactly equal to `.git` (case-
134
+ insensitive). Regular workspace files like `.gitignore`,
135
+ `.gitattributes`, and `.gitkeep` are NOT protected.
136
+
137
+ #### Invariants preserved
138
+
139
+ - All Iter 1-3.6 invariants hold (1097 passing tests across
140
+ `tests/input`, `tests/safety`, `tests/cursor`).
141
+ - Ordering: codepoint check -> reserved-name check -> whitespace
142
+ check -> canonicalization check -> protected-path check, so the
143
+ most actionable diagnostic wins (e.g. `"CON "` surfaces as
144
+ reserved-name with rename suggestion, not as whitespace).
145
+ - Pure functions, no fs / time / global state. Same input, same
146
+ output on every host.
147
+
148
+ #### Out of scope
149
+
150
+ - Other VCS internals (`.svn/`, `.hg/`), secrets directories
151
+ (`.env*`), `node_modules/`. No friction signal yet -- extension
152
+ requires a real reporter case (AGENTS.md "no new authority without
153
+ a current user flow").
154
+ - Protected-path receive-side defense-in-depth at the replace gate.
155
+ The validator catches it pre-receive; the adapter's `receive()`
156
+ path defers to that (consistent with how filename-safety is wired).
157
+
158
+ #### Friction -> fix mapping
159
+
160
+ | Friction (usesteady-public) | Fix surface |
161
+ |----------------------------------------------|---------------------------------------------------|
162
+ | #60 - create_dir into .git/hooks | `validateProtectedPath` + per-op wiring |
163
+ | #67 - silent delete of .git/HEAD | `validateProtectedPath` covers delete (new scope) |
164
+ | #68 - leading/trailing whitespace in name | `validateFilenameSafety` whitespace extension |
165
+
166
+ ### Issue #42 - OCD warning vs success reporting alignment
167
+
168
+ Closes shortgigs/usesteady-public#42. The OCD evaluator already
169
+ surfaces the conflict frame as `WARNING - OCD conflict detected
170
+ (non-blocking)` with "System will execute on approval." text (S4
171
+ fix, alpha.5x). The remaining trust gap was the END-OF-RUN summary:
172
+ a run that printed a WARNING frame and then executed under `--yes`
173
+ announced "Completed successfully" with no acknowledgement that a
174
+ warning had been accepted.
175
+
176
+ #### Change
177
+
178
+ - `WorkflowTask` gains an optional `conflictsAccepted?: number`
179
+ counter, incremented inside `acceptWorkflowConflict` whenever the
180
+ user (or `--yes`) accepts an OCD conflict warning for that task.
181
+ - `ExecutionSummary` gains a required `warnings_accepted: number`
182
+ field, summed only across tasks that actually ran (`outcome ===
183
+ "accepted"`).
184
+ - `renderExecutionSummaryLines` reports `! Completed with N
185
+ warning(s) accepted` instead of `Completed successfully` when
186
+ `summary.success && summary.warnings_accepted > 0`. Plural/singular
187
+ agreement preserved. Failure / neutral forms unchanged.
188
+ - `--output json` surface gains `warnings_accepted: <number>` so
189
+ machine consumers (CI scripts, agent integrations) can surface the
190
+ same trust signal the human banner now shows. Strictly additive --
191
+ pre-#42 consumers reading `success` / `error` / `failed_at_step` /
192
+ `executed_steps` / `total_steps` are unaffected. The field is
193
+ always emitted on post-#42 runs (zero when no warning was
194
+ accepted); pre-#42 result-file fixtures are tolerated via guarded
195
+ projection (field omitted when the upstream result does not carry
196
+ it -- no invented data).
197
+
198
+ #### Invariants preserved
199
+
200
+ - OCD evaluator behavior unchanged (still non-blocking).
201
+ - Conflict-frame text unchanged.
202
+ - Exit code unchanged (0 on success, warnings or not).
203
+ - JSON `success` key unchanged (the run still succeeded).
204
+ - Public CliErrorCode surface unchanged.
205
+ - Pre-#42 runs with zero warnings still see the verbatim
206
+ `Completed successfully` banner (regression-guarded).
207
+ - Pre-#42 result-file fixtures (without `warnings_accepted`) still
208
+ produce a valid `--output json` payload -- the field is simply
209
+ absent rather than invented.
210
+
211
+ ## 0.1.0-alpha.59 - Bundled stabilization (E2E baseline, Cluster B Iter 2+3+3.5+3.6, K2 cleanup, K5 run_command replay, CLI well-formedness guardrail)
212
+
213
+ **Released:** May 2026
214
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
215
+
216
+ **Bundled-stabilization release. Multiple stabilized sprint surfaces
217
+ converge into a single trustworthy alpha. No new authority. No new
218
+ operation types. No new approval semantics. No generalized shell
219
+ execution. No autonomous execution. No semantic replay. No AI
220
+ runtime orchestration.**
221
+
222
+ This release is the result of seven sprint surfaces that were
223
+ implemented, regression-tested, and operationally observed prior
224
+ to packaging. Each surface stayed inside an existing authority
225
+ boundary; this release commit assembles them.
226
+
227
+ ### What shipped
228
+
229
+ #### E2E baseline + UI-W1 invariant restoration (Sprint 1)
230
+
231
+ The alpha.53-alpha.58 intake + UI drift left the Playwright E2E
232
+ suite at 20 / 27 red. One failure was a real product regression:
233
+ `server.ts /api/workflow/start` did not run NL synthesis on
234
+ web-UI tasks, so tasks the CLI would have classified as
235
+ `skipped_by_intake` were emitted as `task_failed` from the web
236
+ UI. The UI-W1 invariant (intake refusal is the same outcome on
237
+ every entrypoint) was broken silently.
238
+
239
+ - `server.ts`: `synthesizeStructuredFieldsFromNL` is now called
240
+ idempotently per task.
241
+ - `src/workflow/coordinator.ts`: routes `!isDeterministicTaskSpec`
242
+ to `skipped_by_intake`.
243
+ - E2E selectors updated to current alpha.55-alpha.58 UI labels.
244
+
245
+ #### Cluster B Iteration 2 wiring + Iteration 3 OS-reserved names + Iteration 3.6 message polish (Sprints 2 + 4)
246
+
247
+ Cluster B continues to harden the filesystem layer. Three
248
+ sub-classes of the same friction (filename that looks valid in
249
+ the developer's editor but breaks elsewhere) are now refused at
250
+ the safety adjacency, before preview / before approval:
251
+
252
+ 1. **Invisible / canonical-divergence filenames** (`#50`, `#51`,
253
+ from a prior public reproducer) -- already partially handled
254
+ in alpha.52; this release ships the unified adjacency.
255
+ 2. **BIDI / zero-width / control codepoints in `replace.newValue`**
256
+ (`#52`) -- new refusal at the executor with the new error
257
+ code `invalid_replacement_chars`.
258
+ 3. **OS-reserved device names on Windows** (CON, NUL, AUX,
259
+ COM1-9, LPT1-9) -- new refusal with the new error code
260
+ `invalid_filename_reserved_name`. Cross-platform: a Linux
261
+ developer creating `CON.tsx` no longer corrupts a Windows
262
+ teammate's clone on pull.
263
+
264
+ Implementation:
265
+ - New flat-adjacency module `src/safety/filename-safety.ts`
266
+ exporting `validateFilenameSafety`,
267
+ `validateReplacementTextSafety`, and the canonical-divergence
268
+ classifier. No new policy class. No new abstraction layer.
269
+ - Wired at three call sites: `FeasibilityValidator`,
270
+ `CursorInProcessAdapter.executeFsOp`, and the
271
+ `CursorInProcessAdapter` replacement-text gate.
272
+ - Two new `CliErrorCode` discriminants:
273
+ `invalid_replacement_chars`, `invalid_filename_reserved_name`.
274
+ - One new `CursorExecutionErrorCode` discriminant:
275
+ `invalid_replacement_chars` (matching `formatErrorHeadline`
276
+ case added so the exhaustive switch stays exhaustive --
277
+ this was a Sprint 2 type-union gap caught and closed during
278
+ alpha.59 `tsc -p tsconfig.build.json`).
279
+ - Bug fix: the adapter and validator were previously collapsing
280
+ all specific codes to `invalid_filename_chars`. Specific
281
+ codes now propagate so reserved-name refusals are visible.
282
+
283
+ Message polish (Iter 3.6):
284
+ - `NAMED_CODEPOINTS`, `formatCodepoint`, `buildOffenderDetail`,
285
+ `describeClasses`, `suggestReservedNameRename` added to
286
+ `filename-safety.ts`. No new `CliErrorCode` from polish.
287
+ - Reserved-name suggestion preserves file extensions
288
+ (bug caught and fixed by test in this release).
289
+ - Per-discriminant summary phrases in `feasibility-validator.ts`
290
+ sharpened.
291
+
292
+ #### Cluster B Iteration 3.5 NL delete safety gate + Iter 3.6 vague-delete message polish (Sprints 3 + 4)
293
+
294
+ Sprint 1's E2E baseline pass surfaced a real safety regression:
295
+ NL synthesis was converting vague delete targets ("delete
296
+ everything", "remove all") into concrete `delete_file`
297
+ operations. The IR layer accepted the synthesized op; only
298
+ approval-stage vigilance stood between intent and execution.
299
+
300
+ This release refuses vague delete targets at the NL parse stage
301
+ so they never become concrete `delete_file` operations:
302
+
303
+ - `VAGUE_DELETE_TARGETS` set + `isVagueDeleteTarget` guard
304
+ added to `src/input/nl-to-ir.ts`.
305
+ - `matchDelete` returns `parse_error` for vague targets, which
306
+ routes through `skipped_by_intake` ("Could not understand").
307
+ - Polished `parse_error` message wording.
308
+
309
+ No new `CliErrorCode`. The refusal surfaces through the
310
+ existing intake-failure path -- vague intent is an intake
311
+ failure, not a safety detector hit.
312
+
313
+ #### K2 parse_error precedence cleanup + structuredReplace drift guard + K5 design lock (Sprint 6)
314
+
315
+ Three kernel maintenance items from the Sprint 5 read-only
316
+ Kernel Audit:
317
+
318
+ - **K2 parse_error precedence**: extracted private
319
+ `synthesizeRawErrorCode` helper. New invariant **INV-K2-PE-1**
320
+ documents the three origins of `parse_error` and the
321
+ precedence rule. Subtle empty-string-falsy regression
322
+ caught and fixed. Behavior preserved byte-for-byte against
323
+ the prior K2 test suite.
324
+ - **structuredReplace drift guard**: new
325
+ `tests/kernel/structuredReplace-drift.test.ts` -- 13 fixtures
326
+ across `accepted`, `file_not_found`, `old_value_not_found`,
327
+ `ambiguous_match`. Asserts byte-identical normalized
328
+ outcomes between the K4 inline path and the production
329
+ adapter path. Self-verified by injected-bug exercise.
330
+ `executeStructuredReplace` and `TaskReplayOutcome` exposed as
331
+ `@internal` test seams only.
332
+ - **K5 design doc** locked at v1.0 (drafted v0.1 here, the
333
+ v1.0 update lands in the Sprint 7 commit). Eight new
334
+ invariants **K5-I11..I18**. Section 11 open questions
335
+ resolved: `node -e` deferred to K6, K2 parse_error split
336
+ deferred to a parallel PR, `mkdir -p` / `rm -rf` dropped
337
+ from the allow-list as redundant with existing operation
338
+ types, `true` / `false` short-circuit in pure Node.
339
+
340
+ #### K5 run_command deterministic replay (Sprint 7)
341
+
342
+ The Kernel Audit's #1 priority surface. Adds deterministic
343
+ replay support for a strictly-bounded `run_command` allow-list.
344
+ **The allow-list is `echo <args>`, `true`, `false` and nothing
345
+ else.** No shell escape. No environment widening. No new
346
+ authority. No new approval semantics. Operator approval is still
347
+ required for every `run_command` op.
348
+
349
+ - New `src/kernel/command-classifier.ts` -- two-gate
350
+ `isReplayableCommandShape`: denylist first
351
+ (defense-in-depth), then allow-list regex. Classifier never
352
+ executes; only classifies.
353
+ - `src/kernel/types.ts` widened additively only:
354
+ `ClassifierResult.reason?` and
355
+ `ExecutionReplayVerdict.refused.reason` become
356
+ discriminated unions. Existing consumers unchanged.
357
+ - `src/kernel/classifier.ts` consults the classifier for
358
+ `run_command`. `classifyForReplay` emits the K5 `reason`
359
+ discriminant so downstream surfaces can name the precise
360
+ refusal class.
361
+ - `src/kernel/execution-replay.ts` adds `executeRunCommand`:
362
+ `echo` via `spawnSync(shell: true)` inside the sandbox;
363
+ `true` / `false` short-circuit in pure Node (no spawn).
364
+ - HELP_TEXT in `src/shell/cli/use-steady.ts` documents the
365
+ K5 allow-list.
366
+
367
+ #### CLI entrypoint well-formedness guardrail (Sprint 8)
368
+
369
+ Converts Sprint 7's HELP_TEXT lesson into a cheap pre-merge
370
+ guardrail. An early Sprint 7 HELP_TEXT edit used backticks
371
+ INSIDE the existing HELP_TEXT template literal, breaking
372
+ esbuild transform for the entire CLI. The kernel-suite did not
373
+ catch this -- it was only visible to full-vitest, via 36
374
+ downstream CLI-subprocess test failures with confusing surface
375
+ symptoms.
376
+
377
+ - New `tests/shell/cli-entrypoint-wellformed.test.ts` -- one
378
+ test, ~200 ms, spawns `usesteady --help` and asserts exit 0
379
+ + non-empty stdout. Inlines the esbuild error
380
+ (`file:line:col`) into the failure message so a future
381
+ reader sees the bug on the first failed assertion.
382
+ - No new dependencies. No runtime change.
383
+
384
+ ### What remains intentionally refused
385
+
386
+ These surfaces were considered and deliberately left out of
387
+ alpha.59. Each has an explicit reason in scope discipline.
388
+
389
+ - **`run_command` outside `echo` / `true` / `false`** -- shells
390
+ out beyond the K5 allow-list. K6 territory; not authorized.
391
+ - **`node -e` arbitrary script execution** -- K6 territory;
392
+ deferred (alpha.59 is not a generalized-shell-execution
393
+ release).
394
+ - **`mkdir -p` / `rm -rf` as `run_command` shapes** -- redundant
395
+ with `operationType: "create_dir"` / `"delete_file"`, and
396
+ `cmd.exe` semantics for `mkdir -p` differ from POSIX. Adding
397
+ them would widen the allow-list without operator benefit.
398
+ - **K2 `parse_error` discriminant split** -- a separate parallel
399
+ PR after alpha.59 review. Not a regression; the existing
400
+ ladder is documented (INV-K2-PE-1) and preserved.
401
+ - **Execution timeline implementation** -- PR #315 is design-only
402
+ and remains design-only. No runtime in alpha.59.
403
+ - **Workflow doctor surface** -- not in scope. No design lock.
404
+ - **Reactive fix for public#50 U+202E bare-create coverage gap**
405
+ -- classified as uncovered Cluster B sub-class; explicitly
406
+ not addressed in alpha.59. Future work must be separately
407
+ scoped, bounded, reviewed, released.
408
+ - **Clarifying fix for public#51 NFD/NFC behavior** -- the
409
+ `ambiguous_match` refusal is the intended fail-closed
410
+ canonicalization gate; no runtime change. A wording
411
+ clarification may follow in a future cycle if operator
412
+ misreading repeats.
413
+ - **AI command generation / autonomous execution** -- not in
414
+ scope. Out of every track UseSteady is building.
415
+
416
+ ### Preserved invariants
417
+
418
+ - **Replay hermeticity**: identical inputs yield identical
419
+ replay bytes. K5 widens the replayable shape set; it does
420
+ not weaken determinism.
421
+ - **Approval-before-execution**: every `run_command`, every
422
+ `replace`, every fs op still requires operator approval at
423
+ the SYSTEM WILL surface. K5 changes WHICH commands can be
424
+ classified, not WHEN approval is required.
425
+ - **Safety-gate runs before approval**: the credential /
426
+ secret detector, the canonicalization gate, the filename
427
+ adjacency, and the new vague-delete intake refusal all
428
+ fire pre-preview.
429
+ - **UI-W1 entrypoint parity**: CLI `--prompt`, `run <spec.json>`,
430
+ `--json`, `batch <file>`, and web UI all route intake
431
+ refusal to `skipped_by_intake`. No entrypoint silently
432
+ promotes to `task_failed`.
433
+ - **Additive widening only**: `ClassifierResult` and
434
+ `ExecutionReplayVerdict` unions widened; no breaking
435
+ removal. Existing consumers unchanged.
436
+ - **One-source-of-truth**: every operation type in every
437
+ template still maps to `ALL_OPERATION_TYPES`. HELP_TEXT
438
+ still documents every public op. The IR-shape-validity test
439
+ still passes against every template.
440
+
441
+ ### Stabilization hardening added
442
+
443
+ - **TS2322 closure** in `CursorExecutionErrorCode` -- the
444
+ Sprint 2 type-union gap is closed. `npm run build` is clean.
445
+ - **structuredReplace drift guard** -- behavioral divergence
446
+ between the K4 inline path and the production adapter path
447
+ is now a localised assertion failure with a precise hint,
448
+ not a downstream mystery.
449
+ - **K2 parse_error precedence is documented and tested** --
450
+ INV-K2-PE-1 names the three origins and the precedence
451
+ ladder. Future edits to error-codes.ts can be reviewed
452
+ against the invariant.
453
+ - **CLI entrypoint smoke test** -- `usesteady --help` cannot
454
+ silently fail to load. A future HELP_TEXT edit that breaks
455
+ esbuild transform will be caught in ~200 ms, not via 36
456
+ downstream test failures.
457
+ - **Specific filename-safety error codes propagate** -- the
458
+ adapter and validator no longer collapse all sub-classes
459
+ to `invalid_filename_chars`. Operators see the exact
460
+ refusal class.
461
+
462
+ ### Known intentionally-deferred scope
463
+
464
+ - K6 `node -e` replayability (separate authorization required).
465
+ - K2 `parse_error` discriminant split (separate PR after
466
+ alpha.59 review).
467
+ - Public#50 U+202E bare-`create` coverage gap (uncovered
468
+ Cluster B sub-class; not a regression).
469
+ - Execution timeline implementation (PR #315 stays
470
+ design-only).
471
+ - Cross-platform CI runners.
472
+ - Workflow doctor surface.
473
+ - New ergonomics capability candidates.
474
+
475
+ ### Friction -> fix -> guardrail
476
+
477
+ | Friction class | Refused as / fixed where | Guardrail |
478
+ |---|---|---|
479
+ | `public#50` -- path-traversal canonical divergence | `validateFilenameSafety` + path adjacency at validator + executor + replace-match gate | filename-safety.test.ts (Iter 2 cases) |
480
+ | `public#52` -- BIDI / zero-width / control in `replace.newValue` | Executor refuses with `invalid_replacement_chars` before write | canonicalize-adjacent-surfaces.test.ts + filename-safety.test.ts |
481
+ | OS-reserved names on Windows (`CON.tsx`, `COM1.ts`, etc.) | Validator + executor refuse with `invalid_filename_reserved_name` cross-platform | feasibility-validator.invalid-filename-chars.test.ts |
482
+ | Vague NL delete intent ("delete everything") | `nl-to-ir.matchDelete` returns `parse_error` -> `skipped_by_intake` | +37 tests in nl-to-ir.test.ts |
483
+ | UI-W1 intake parity broken on web UI | `server.ts` runs NL synthesis; coordinator routes non-deterministic specs to `skipped_by_intake` | E2E specs assert parity |
484
+ | K4 inline vs production-adapter `replace` divergence (would be silent) | Drift matrix in structuredReplace-drift.test.ts | 13 deterministic fixtures across 4 outcome classes |
485
+ | K2 `parse_error` precedence ambiguous in source | Helper extracted; INV-K2-PE-1 documents the ladder | K2 suite preserved byte-for-byte; new invariant in source |
486
+ | HELP_TEXT esbuild break (Sprint 7 incident) | One ~200 ms test asserts `usesteady --help` loads | cli-entrypoint-wellformed.test.ts |
487
+
488
+ ### Verification
489
+
490
+ - `npm run build`: clean.
491
+ - `npm run release:gate`: green -- **142 test files, 5256
492
+ passed, 4 skipped, 0 failed**.
493
+ - Kernel suite: 301 / 301 green.
494
+ - Playwright E2E suite green against this delta.
495
+ - No dependency drift.
496
+ - Changelog reflects only the committed delta in this PR.
497
+
498
+ ### Versioning posture
499
+
500
+ This is `0.1.0-alpha.59`. Alpha only. Not beta. Not
501
+ "production-ready." The replay scope is widened to three
502
+ allow-list commands (`echo`, `true`, `false`); it is not
503
+ generalized shell execution.
504
+
505
+ `npm publish` is **not** authorized by this PR. Publish
506
+ happens after explicit approval following merge.
507
+
508
+ ## 0.1.0-alpha.58 - Domain-specific recipe templates
509
+
510
+ **Released:** May 2026
511
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
512
+
513
+ **Ergonomics continuation release. Capability-track section 3.2
514
+ extension. No new template engine, no parameter DSL, no dynamic
515
+ generation, no new operation types, no runtime semantic changes,
516
+ no dependency additions.**
517
+
518
+ ### What this release fixes
519
+
520
+ The alpha.57 walkthrough confirmed users could now reliably pick
521
+ the right command for the right JSON shape (`--json` / `batch` /
522
+ `run`). The next-highest authoring friction was "how do I safely
523
+ do X?" -- a first-time operator who knew the invocation surface
524
+ still had no concrete worked example for common dev tasks
525
+ (version bump, adding an import, updating a dotenv key).
526
+
527
+ The alpha.54 starter templates covered append, rename,
528
+ multi-file-replace, create-dir-then-rename, and create-then-append,
529
+ but did not cover three high-volume real-world patterns:
530
+
531
+ - **F-A57-AUTH-1** -- no template demonstrated a coordinated
532
+ cross-file edit (e.g. version bump in package.json + matching
533
+ CHANGELOG entry). Operators authored these by hand, repeatedly,
534
+ with no canonical safe example to copy.
535
+ - **F-A57-AUTH-2** -- no template demonstrated `prepend`. The
536
+ operation type was reachable via `usesteady capabilities` but
537
+ had no worked example, so first-time operators defaulted to
538
+ `append` for "add an import" tasks where `prepend` is actually
539
+ correct -- producing imports at the end of files.
540
+ - **F-A57-AUTH-3** -- no template demonstrated a `replace` against
541
+ a non-JSON line-based format (dotenv, ini-style). Operators had
542
+ to infer that exact-line `replace` works for `KEY=value` lines,
543
+ including the runtime difference that `replace` refuses
544
+ `file_not_found` on missing files (unlike append/prepend, which
545
+ create them).
546
+
547
+ ### What ships
548
+
549
+ #### Three new recipe templates
550
+
551
+ All three reuse the existing `TEMPLATE_REGISTRY` shape verbatim.
552
+ No template engine, no parameter DSL, no dynamic generation. Each
553
+ is a static JSON asset like the alpha.54 starter templates.
554
+
555
+ - **`bump-version`** -- `replace` `"version"` in package.json +
556
+ `append` matching CHANGELOG.md entry (2 ops across 2 files).
557
+ Demonstrates coordinated cross-file edits. Safety notes are
558
+ explicit that the recipe does NOT run `git`, `git tag`, `npm
559
+ version`, `npm publish`, or any command, and does NOT update
560
+ lock files. Names all three `replace` failure classes
561
+ (`file_not_found`, `old_value_not_found`, `ambiguous_match`).
562
+ Documents the prepend-instead-of-append alternative for
563
+ newest-at-top CHANGELOGs.
564
+
565
+ - **`add-import`** -- `prepend` an import statement to the top of
566
+ a source file (1 op). First template to demonstrate `prepend`.
567
+ Safety notes are explicit that prepend lands BEFORE any license
568
+ header, shebang, or `"use strict";`, and that the recipe does
569
+ NOT sort, group, or de-duplicate imports. Tells the operator
570
+ to terminate the imported line with `\n` so it lands on its own
571
+ line.
572
+
573
+ - **`safe-env-update`** -- `replace` one `KEY=value` line in a
574
+ dotenv-style file (1 op). First template to target a non-JSON
575
+ line-based format. Safety notes are explicit that `replace`
576
+ refuses `file_not_found` on missing files (does NOT auto-create
577
+ unlike append/prepend), that quoting/whitespace/inline comments
578
+ change the match, that dotenv files often hold secrets (use the
579
+ SYSTEM WILL preview), and that gitignored .env files should be
580
+ paired with a tracked `.env.example`.
581
+
582
+ Every safety note is verified against runtime behavior in
583
+ `src/cursor/adapters/inprocess-adapter.ts`. The test suite
584
+ asserts the exact runtime-class strings appear in the relevant
585
+ notes so a future edit cannot regress wording silently.
586
+
587
+ ### Hard constraints honored
588
+
589
+ - No new template engine, parameter DSL, or dynamic generation
590
+ - No new operation types (every op uses `replace`, `append`, or
591
+ `prepend` -- all already in `ALL_OPERATION_TYPES`)
592
+ - No recipe-specific authority or runtime semantic changes
593
+ - No semantic-review layer
594
+ - No autonomous workflow generation
595
+ - No parser expansion
596
+ - No dependency additions
597
+ - No multi-surface capability wave (templates surface only)
598
+ - No hidden execution semantics
599
+ - Runtime-truthful wording (every safety claim asserted against
600
+ runtime behavior in tests)
601
+ - Byte-deterministic output (existing template determinism
602
+ contract extended to the three new entries)
603
+
604
+ ### Test coverage
605
+
606
+ 17 new tests in `tests/shell/templates.test.ts`:
607
+
608
+ - **T10b**: the 3 alpha.58 recipes are present in `TEMPLATE_NAMES`
609
+ - **IR-shape-validity**: every operation in every template parses
610
+ cleanly through `jsonOpToIROperation` -- locks down the wire-
611
+ shape contract so a future template addition cannot ship a shape
612
+ that the `--json` / `batch` adapter rejects
613
+ - Per-recipe content + safety-note vs runtime alignment for each
614
+ of `bump-version`, `add-import`, `safe-env-update`
615
+
616
+ Full suite: **4889 passed** (was 4870; +19), 4 pre-existing skips.
617
+ 137 test files. `npm run release:gate` -- PASS.
618
+
619
+ ### Friction-to-usability mapping
620
+
621
+ | Friction (alpha.57 walkthrough) | Recipe (alpha.58) |
622
+ | --- | --- |
623
+ | F-A57-AUTH-1 (no cross-file safe example) | `bump-version` |
624
+ | F-A57-AUTH-2 (no `prepend` worked example) | `add-import` |
625
+ | F-A57-AUTH-3 (no dotenv replace example) | `safe-env-update` |
626
+
627
+ ---
628
+
629
+ ## 0.1.0-alpha.57 - Workflow invocation shape ergonomics
630
+
631
+ **Released:** May 2026
632
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
633
+
634
+ **Ergonomics/clarity release. No new capability surface beyond the
635
+ read-only `examples` catalog. No execution-model, planner, approval-
636
+ model, schema, operation-set, or dependency changes.**
637
+
638
+ ### What this release fixes
639
+
640
+ The alpha.56 walkthrough surfaced the highest-leverage onboarding
641
+ friction: operational confusion across the four workflow-invocation
642
+ surfaces.
643
+
644
+ - **F-A56-OPS-1** -- a first-time operator could not predict which
645
+ command (`--json`, `batch <file>`, `run <file>`) accepted which
646
+ JSON envelope shape (single op vs. op array vs. WorkflowSpec).
647
+ Help text covered each individually; no single surface explained
648
+ the mapping shape -> command.
649
+ - **F-A56-OPS-2** -- shape-mismatch error messages named only the
650
+ generic contract ("not valid JSON", "unknown or invalid
651
+ operation", "Workflow spec was not recognized"). They did not
652
+ point the operator at the matching command form OR at a copyable
653
+ example. Recovery required reading the help text and guessing.
654
+ - **F-A56-OPS-3** -- documenting "use this command for this shape"
655
+ required reading three separate help-text blocks and inferring
656
+ the mapping. There was no canonical reference for the mapping.
657
+
658
+ ### What ships
659
+
660
+ #### `usesteady examples` (new read-only subcommand)
661
+
662
+ Pure module `src/shell/cli/examples.ts`. Renders the three accepted
663
+ invocation shapes with their command form, when-to-use guidance,
664
+ and a minimal copyable JSON example each:
665
+
666
+ | id | command | shape |
667
+ | --- | --- | --- |
668
+ | `json` | `usesteady --json '<inline op>' --yes` | single JSON op object |
669
+ | `batch` | `usesteady batch <file> --yes` | JSON array of op objects |
670
+ | `run` | `usesteady run <file>` | WorkflowSpec object (also auto-wraps single op + array) |
671
+
672
+ Each pattern carries an identical canonical content shape (append-
673
+ to-`NOTES.md`) so the operator sees the same body in every form,
674
+ making the "what changed across shapes" question trivially
675
+ inspectable. Quick rule-of-thumb block reinforces shape -> command.
676
+ Sibling cross-references to `quickstart` / `capabilities` /
677
+ `templates` / `help` so the operator can navigate from one place.
678
+
679
+ Authority pattern matches `capabilities` / `quickstart` /
680
+ `templates`:
681
+
682
+ - in `PURE_SUBCOMMANDS` (never reads stdin, never executes);
683
+ - exempt from the `--output json` requires `--yes` rule (catalog
684
+ is informational, no execution to gate);
685
+ - deterministic byte-identical output across runs for a given
686
+ build;
687
+ - single-line stable-key JSON shape;
688
+ - never imports the planner, safety gate, executor, or approval
689
+ surface.
690
+
691
+ #### Shape-aware error guidance (three surfaces)
692
+
693
+ | Surface | Pre-alpha.57 first line (unchanged) | Alpha.57 addition |
694
+ | --- | --- | --- |
695
+ | `--json <bad>` invalid JSON | `Error: input is not valid JSON` | Names the `--json` contract ("single inline JSON op object (or an array)"); pointer to `usesteady examples`. |
696
+ | `batch <bad-json>` invalid JSON | same first line | Names the `batch` contract ("JSON array of op objects"); pointer to `usesteady examples`. |
697
+ | `--json` / `batch` invalid op | `Error: unknown or invalid operation: <op>` | Pointers to `usesteady capabilities` (per-op schema) and `usesteady examples`. |
698
+ | `run <file>` shape mismatch (`RUN_SPEC_ACCEPTED_SHAPES_MESSAGE`) | `Workflow spec was not recognized. Accepted shapes: ...` | New `Command form per shape:` block mapping each shape to its matching command; pointers to `usesteady examples`, `usesteady capabilities`, `usesteady --help`. |
699
+
700
+ Error classes (`invalid_json`, `invalid_op`), exit codes (2 / 1),
701
+ and the `--output json` machine-readable body are byte-identical.
702
+ Only human prose extended.
703
+
704
+ #### Pre-existing contract preserved
705
+
706
+ The `Accepted shapes` / `WorkflowSpec` / `JSON op` tokens that the
707
+ governance and shell shape-error regex suites assert against are
708
+ preserved verbatim:
709
+
710
+ - `tests/governance/input-surface-integrity.test.ts`
711
+ - `tests/shell/shell-workflow-spec.test.ts`
712
+
713
+ No machine consumer of these messages breaks.
714
+
715
+ #### README minimal addition
716
+
717
+ One new "Workflow Shapes" section between "Discover what UseSteady
718
+ can do" and "Core idea". Three-row table mapping shape -> command
719
+ -> when-to-use, plus the `usesteady examples` pointer. No other
720
+ README changes.
721
+
722
+ #### Help text
723
+
724
+ `HELP_TEXT` advertises `usesteady examples` and `usesteady examples
725
+ --output json` alongside the existing pure-subcommand block.
726
+
727
+ ### Friction -> Fix mapping (alpha.56-walkthrough-grounded)
728
+
729
+ | Friction observed | Fix in alpha.57 |
730
+ | --- | --- |
731
+ | Operator could not predict command-per-shape | `usesteady examples` catalog with explicit mapping |
732
+ | `--json` invalid JSON did not name the expected shape | Surface-aware addendum ("single inline JSON op object") + pointer |
733
+ | `batch` invalid JSON did not name the expected shape | Surface-aware addendum ("JSON array of op objects") + pointer |
734
+ | `--json` / `batch` invalid op forced help-text guessing | Pointer to `usesteady capabilities` for the per-op schema |
735
+ | `run <file>` shape mismatch did not name the matching command | `Command form per shape:` block + pointer to `usesteady examples` |
736
+ | Three help-text blocks required to derive shape -> command mapping | README "Workflow Shapes" table + canonical `examples` catalog |
737
+
738
+ ### Authority story
739
+
740
+ Pure module. Reuses `capabilities` / `quickstart` / `templates`
741
+ infrastructure (PURE_SUBCOMMANDS gate, `--yes` exemption,
742
+ deterministic-output contract). The new error-message hints are
743
+ strings only -- no new error classes, no new exit codes, no parser
744
+ changes, no envelope coercion. `loadWorkflowSpecFromFile` auto-wrap
745
+ behavior is byte-identical. The catalog reuses the same op-shape
746
+ conventions `jsonOpToIROperation` already accepts so no second
747
+ source of truth is introduced.
748
+
749
+ ### What does NOT change
750
+
751
+ - Execution engine: byte-identical to alpha.56.
752
+ - Planner: byte-identical.
753
+ - Approval model: byte-identical.
754
+ - Operation set: same 8 operation types.
755
+ - Parser: byte-identical -- no hidden coercion between formats,
756
+ no automatic envelope conversion, no AI generation.
757
+ - Dependencies: zero additions.
758
+ - Spec hash semantics, replay, audit envelope: byte-identical.
759
+ - Pre-alpha.57 valid `--json '<op>' --yes` and `run <WorkflowSpec
760
+ -file>` calls behave byte-identically.
761
+
762
+ ### Tests
763
+
764
+ `tests/shell/examples.test.ts` -- 26 new tests:
765
+
766
+ - Pure formatter unit tests: catalog order (json, batch, run),
767
+ command form per id, minimal-example JSON round-trip, frozen
768
+ catalog, determinism (I1, I6, I7).
769
+ - JSON render: single-line + trailing newline, valid JSON shape,
770
+ byte-determinism (I2).
771
+ - Text render: byte-determinism, sibling cross-references
772
+ (quickstart / capabilities / templates / help), explicit
773
+ read-only language (I3, I8).
774
+ - CLI integration: no `--yes` needed, `--output json` exempt from
775
+ `--yes`, `--help` form, global `HELP_TEXT` advertises the
776
+ subcommand, deterministic across invocations (I4, I5).
777
+ - Invocation-shape error guidance: `--json <bad>`, `batch <bad>`,
778
+ `--json <unknown op>`, `run <bad-spec>` -- each error keeps its
779
+ canonical first line AND adds the matching command-form hint
780
+ AND the pointer to `usesteady examples` (I9).
781
+ - Backward compatibility: a valid `--json` op and a valid `run
782
+ <WorkflowSpec>` do NOT regress to exit code 2.
783
+
784
+ Existing governance + shell shape-error suites pass unchanged.
785
+
786
+ Full suite: 4870 passed (was 4844; +26 from this suite), 4
787
+ pre-existing skips. No regressions in `governance`, `shell`,
788
+ `capabilities`, `templates`, `quickstart`, `phase-11d`,
789
+ `workflow-coordinator`, `shell-workflow-render`,
790
+ `system-will-preview`, or `adjacent-surface-consistency` suites.
791
+
792
+ ### Release engineering
793
+
794
+ - `npm run release:gate` continues to use `test:release` with
795
+ `--retry=2` for pre-existing test-order-dependent shell-spawn
796
+ flakes documented in alpha.52 release engineering notes.
797
+ - `check-stdin-ownership` continues to scan git-tracked files
798
+ only.
799
+
800
+ Implementation PR:
801
+
802
+ - `shortgigs/usesteady-core#311` -- workflow invocation shapes
803
+ (`examples` + shape-aware error guidance).
804
+
805
+ ### Posture after alpha.57
806
+
807
+ This is an **ergonomics stabilization release** -- not a capability
808
+ expansion. The two-track rhythm continues:
809
+
810
+ - **Integrity track** -- alpha.55 SYSTEM WILL Preview monitoring
811
+ window and alpha.56 adjacent-surface escape parity monitoring
812
+ window both remain open.
813
+ - **Capability track** -- alpha.57 monitoring window opens for the
814
+ `examples` catalog and the four shape-aware error messages.
815
+
816
+ Watch for:
817
+
818
+ - Operators still arriving at a shape-mismatch error without
819
+ reaching `usesteady examples` (could indicate the error-message
820
+ pointer is being missed; would be a wording iteration, not a
821
+ parser change).
822
+ - Confusion about the auto-wrap behavior of `run <file>` (it
823
+ accepts all three shapes; `--json` and `batch` only accept
824
+ their own). Surfaced by the `examples` catalog explicitly.
825
+ - Operators trying invocation shapes that aren't on the list
826
+ (e.g. `--json @file.json`, `run <ops-array-stdin>`); these
827
+ remain unsupported by design and should produce the existing
828
+ error paths.
829
+ - Any new render surface bypassing the four error-message
830
+ addendums.
831
+
832
+ When this monitoring window resolves without signal, the next
833
+ capability NOW pick remains section 3.11 workflow health
834
+ diagnostics or section 3.6 execution timeline per the prior
835
+ preference order, selected against observed signal.
836
+
837
+ ---
838
+
839
+ ## 0.1.0-alpha.56 - Adjacent-surface trust-language consistency
840
+
841
+ **Released:** May 2026
842
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
843
+
844
+ **Trust-consistency refinement release. No new capability surface.
845
+ No authority-model change.** This is the final trust-clarity
846
+ stabilization pass before opening another capability surface.
847
+
848
+ ### What this release fixes
849
+
850
+ The alpha.55 walkthrough closed the SYSTEM WILL trust gap for the
851
+ `Preview:` block, but the real fresh-install pass exposed three
852
+ remaining gaps at adjacent pre-approval surfaces:
853
+
854
+ - **F-A55-1** -- pre-approval intake echo (`[ok] Step N: Append
855
+ "<value>" to <file>`) forged a second visual line whenever
856
+ `<value>` contained a newline. The Preview block immediately
857
+ below rendered the same content correctly. A user reading both
858
+ saw two different representations of the same string.
859
+ - **F-A55-2** -- `You asked:` line inside `task_ready` and
860
+ `task_conflict` had the same root cause: the canonical input
861
+ string carries user content verbatim, including embedded
862
+ newlines, and was rendered without inline escaping.
863
+ - **F-A55-3** -- pre-approval glyph was `[ok]`, which read as
864
+ "completed successfully" -- the same semantic shape the
865
+ COMPLETED frame's `[done]` glyph already owns. A first-time
866
+ user could conclude a step had already run before any approval
867
+ prompt.
868
+ - **F-A55-4** -- `templates append-to-file` safety note told the
869
+ operator to verify the target file exists, while runtime
870
+ creates the file if missing. Pre-existing wording misalignment;
871
+ not introduced by alpha.55 but visible at the new Preview
872
+ surface.
873
+
874
+ ### What ships
875
+
876
+ Render-only changes. No execution-engine, planner, approval-model,
877
+ operation-set, dependency, spec-hash, replay, or audit-envelope
878
+ changes.
879
+
880
+ #### One shared primitive
881
+
882
+ New module `src/shell/render-escape.ts`. Single source of truth for
883
+ the escape rule and for the lifecycle-stage glyphs every adjacent
884
+ surface uses.
885
+
886
+ - `escapeControlForInline(raw)` -- escapes `\t` / `\r` / `\n` as
887
+ C-style escape sequences. Leaves `\` and `"` alone so
888
+ canonical-form bytes are preserved (the intake parser depends
889
+ on those characters retaining grammar meaning).
890
+ - `LIFECYCLE_PARSED = "[parsed]"`, `LIFECYCLE_NEEDS_CONFIRMATION
891
+ = "[ ? ]"`, `LIFECYCLE_DONE = "[done]"` -- glyph constants for
892
+ the lifecycle stages.
893
+
894
+ Pure, deterministic, zero deps. The Preview block's `previewInline`
895
+ now delegates control-char escaping to this primitive so all
896
+ adjacent surfaces share one byte-level escape contract.
897
+
898
+ #### F-A55-1 -- intake echo escapes user content
899
+
900
+ `formatDraftTask` (`src/shell/cli/draft/intent-to-tasks.ts`)
901
+ routes every user value (`task.from` / `task.to` / `task.file` /
902
+ `task.rawText`) through `escapeControlForInline`. Multi-line
903
+ content can no longer forge a second visual line in the
904
+ pre-approval echo.
905
+
906
+ #### F-A55-2 -- You asked: anchor escapes user content
907
+
908
+ `truthfulInputDisplay` (`src/shell/workflow-render.ts`) escapes
909
+ the raw NL input via the shared primitive. The `structuredReplace`
910
+ path additionally escapes `\` and `"` first (existing behavior),
911
+ then control chars. `You asked:` is now single-line for any user
912
+ content while remaining truthful (the line still contains the
913
+ exact bytes the operator typed, only made inline-safe).
914
+
915
+ #### F-A55-3 -- lifecycle glyph clarification
916
+
917
+ Three intake-echo sites in `src/shell/cli/use-steady.ts`:
918
+
919
+ - `[ok] Step N: ...` -> `[parsed] Step N: ...`
920
+ - Section header changes from "I translated your request into
921
+ safe steps:" to "Parsed your request into safe steps (not yet
922
+ executed):"
923
+ - The `needs_confirmation` case becomes `[ ? ]` to stay visually
924
+ separated from parsed steps.
925
+
926
+ No state-machine change, no execution path change -- only the
927
+ visible tag and the section header.
928
+
929
+ #### F-A55-4 -- template / runtime wording alignment (PR #306)
930
+
931
+ Two `usesteady templates` safety-note misalignments closed:
932
+
933
+ - `append-to-file` safety note now says "If the target file does
934
+ not exist, it will be created" instead of "verify the target
935
+ file path exists before approving".
936
+ - `git-safe-review-flow` safety note now says `create` on an
937
+ existing file is refused with `target_exists` instead of
938
+ ambiguous "is treated as ambiguous".
939
+
940
+ Both notes now match runtime behavior in
941
+ `src/cursor/adapters/inprocess-adapter.ts`.
942
+
943
+ ### Lifecycle vocabulary after this release
944
+
945
+ | Stage | Glyph | Surface |
946
+ | --- | --- | --- |
947
+ | parsed/prepared | `[parsed]` | pre-approval intake echo |
948
+ | needs-confirm | `[ ? ]` | unparseable clause |
949
+ | review | numbered, no glyph | REVIEW frame |
950
+ | approve | `->` | SYSTEM WILL anchor |
951
+ | completed | `[done]` | terminal COMPLETED frame |
952
+
953
+ No two stages share a glyph. `parsed != approved != completed` is
954
+ now visually guaranteed.
955
+
956
+ ### Friction -> Fix mapping (walkthrough-grounded)
957
+
958
+ | Friction observed in alpha.55 walkthrough | Fix in alpha.56 |
959
+ | --- | --- |
960
+ | Intake echo forged visual lines for multi-line content | `formatDraftTask` routes through `escapeControlForInline` |
961
+ | `You asked:` line forged visual lines for multi-line content | `truthfulInputDisplay` routes through `escapeControlForInline` |
962
+ | `[ok]` glyph readable as "completed" before approval | `[parsed]` glyph + "(not yet executed)" header |
963
+ | Template safety notes contradicted runtime behavior | PR #306 wording alignment |
964
+ | Adjacent surfaces rendered same content differently | Shared escape primitive used by all three surfaces |
965
+
966
+ ### Authority story
967
+
968
+ The renderer remains pure. The shared escape primitive is a
969
+ 5-line pure function. The Preview block, the `You asked:` anchor,
970
+ and the intake echo all consume the same primitive so a single
971
+ byte-level escape contract governs every pre-approval render
972
+ surface. The workflow spec hash (Row 2) continues to cover the
973
+ spec end-to-end; the preview cannot drift from execution without
974
+ the hash mismatching and the run aborting before any filesystem
975
+ effect.
976
+
977
+ No new authority surface. No new operation type. No new approval
978
+ mode. No semantic interpretation, no AI summarization, no
979
+ autonomous decision-making.
980
+
981
+ ### What does NOT change
982
+
983
+ - Execution engine: byte-identical to alpha.55.
984
+ - Planner: byte-identical.
985
+ - Approval model: `task_ready` still produces a `confirm` prompt;
986
+ nothing is auto-approved.
987
+ - Operation set: same 8 operation types.
988
+ - Dependencies: zero additions.
989
+ - Spec hash semantics, replay, audit envelope: byte-identical.
990
+ - Pre-alpha.56 fixtures (no control chars in user content) render
991
+ byte-identically.
992
+
993
+ ### Tests
994
+
995
+ `tests/shell/adjacent-surface-consistency.test.ts` -- 46 new
996
+ tests:
997
+
998
+ - `escapeControlForInline` primitive: newline / CR / tab / CRLF /
999
+ multi-control / idempotence / determinism / single-line
1000
+ guarantee / empty-string identity / backslash and quote
1001
+ preservation.
1002
+ - F-A55-1: `formatDraftTask` escapes every value for every op
1003
+ type (append / prepend / replace / rename / create / delete /
1004
+ run_command / needs_confirmation).
1005
+ - F-A55-2: `task_ready` and `task_conflict` `You asked:` anchors
1006
+ never include literal newlines; `structuredReplace` path
1007
+ escapes from/to control chars.
1008
+ - Backward compat: non-control input renders byte-identically to
1009
+ pre-alpha.56 (phase-11d fixture regression guard).
1010
+ - Cross-surface parity: 9 representative content samples; inline-
1011
+ escaped bytes match across intake echo, `You asked:`, and
1012
+ Preview content.
1013
+ - Block vs inline: multi-line content uses Preview block mode AND
1014
+ single-line escaped `You asked:` simultaneously.
1015
+ - F-A55-3: glyph constants correct and pairwise distinct.
1016
+ - Approval-semantics regression guard: `task_ready` still
1017
+ produces a `confirm` prompt; render is pure.
1018
+
1019
+ PR #306 also added 4 wording-alignment tests on
1020
+ `tests/shell/templates.test.ts`.
1021
+
1022
+ Full suite: 4844 passed, 4 pre-existing skips. No regressions in
1023
+ `phase-11d` / `workflow-coordinator` / `shell-workflow-render` /
1024
+ `system-will-preview` / `templates` / `quickstart` /
1025
+ `capabilities` suites.
1026
+
1027
+ ### Release engineering
1028
+
1029
+ - `npm run release:gate` continues to use `test:release` with
1030
+ `--retry=2` for pre-existing test-order-dependent shell-spawn
1031
+ flakes documented in alpha.52 release engineering notes.
1032
+ - `check-stdin-ownership` continues to scan git-tracked files
1033
+ only.
1034
+
1035
+ Implementation PRs:
1036
+
1037
+ - `shortgigs/usesteady-core#306` -- template / runtime wording
1038
+ alignment.
1039
+ - `shortgigs/usesteady-core#309` -- adjacent-surface render
1040
+ consistency (F-A55-1 / F-A55-2 / F-A55-3).
1041
+
1042
+ ### Posture after alpha.56
1043
+
1044
+ This is the **final trust-clarity stabilization pass** before
1045
+ opening another capability surface. The two-track rhythm
1046
+ continues:
1047
+
1048
+ - **Integrity track** -- monitoring window for the alpha.55
1049
+ Preview block remains open; alpha.56 monitoring window opens
1050
+ for the adjacent-surface escape parity and lifecycle glyph
1051
+ vocabulary.
1052
+ - **Capability track** -- when the alpha.56 monitoring window
1053
+ resolves, the next bounded NOW pick remains section 3.11
1054
+ workflow health diagnostics or section 3.6 execution timeline,
1055
+ selected against observed signal.
1056
+
1057
+ Watch for:
1058
+
1059
+ - Confusion at the lifecycle vocabulary (parsed vs done vs review
1060
+ vs approve).
1061
+ - Operator running into the escape rule unexpectedly (e.g.
1062
+ literal `\n` in a string they wanted to be a real newline).
1063
+ - Adjacent-surface parity at large N (>5 tasks) review frames.
1064
+ - Any new render surface added in the next capability work that
1065
+ bypasses the shared primitive.
1066
+
1067
+ No proactive next capability surface this cycle. Trust-language
1068
+ coherence is the deliverable.
1069
+
1070
+ ---
1071
+
1072
+ ## 0.1.0-alpha.55 - SYSTEM WILL preview block (trust-clarity refinement)
1073
+
1074
+ **Released:** May 2026
1075
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
1076
+
1077
+ **Not a new capability release.** A focused usability and explain-
1078
+ before-execute trust refinement. Renderer-only change. The
1079
+ execution engine, planner, approval model, operation set, and
1080
+ dependency set are byte-identical to alpha.54.
1081
+
1082
+ ### What this release fixes
1083
+
1084
+ The alpha.54 fresh-install walkthrough exposed a real onboarding-
1085
+ tail gap: at the `APPROVE?` frame for an `append` operation,
1086
+ `SYSTEM WILL` showed only the headline ("Append to NOTES.md") and
1087
+ the raw user input. The literal text being appended, the target
1088
+ file, and the file-creation behavior were all absent at the exact
1089
+ moment the operator was being asked to approve. Trust clarity
1090
+ collapsed at the highest-leverage approval surface.
1091
+
1092
+ ### What ships
1093
+
1094
+ A deterministic `Preview:` block embedded in the `task_ready` and
1095
+ `task_conflict` frames, plus a per-task summary in the `reviewing`
1096
+ phase. All preview content is sourced from the same
1097
+ `WorkflowTaskSpec` structured fields the executor consumes.
1098
+
1099
+ For an append op the operator now sees, before approving:
1100
+
1101
+ ```
1102
+ SYSTEM WILL
1103
+ -> Append to NOTES.md
1104
+ You asked: append "hello from usesteady" to NOTES.md
1105
+ Preview:
1106
+ Operation: append (text added to end of file)
1107
+ Target: NOTES.md
1108
+ Content: "hello from usesteady"
1109
+ File note: If NOTES.md does not exist, it will be created.
1110
+ ```
1111
+
1112
+ Per op type, the preview answers four questions: what kind of
1113
+ change, where, what literal text (verbatim, never paraphrased),
1114
+ and whether a missing/existing file changes runtime behavior.
1115
+
1116
+ | Op | Shape | File note (mirrors runtime) |
1117
+ | --- | --- | --- |
1118
+ | `append_file` | Operation / Target / Content | "If <file> does not exist, it will be created." |
1119
+ | `prepend_file` | Operation / Target / Content | same |
1120
+ | `write_file` | Operation / Target / Content | "If <file> already exists, the operation will fail (target_exists)." |
1121
+ | `replace` | Operation / Target / From / To | (no file note) |
1122
+ | `rename` | Operation / From / To | "If <newPath> already exists, the operation will fail (target_exists)." |
1123
+ | `delete_file` | Operation / Target | "Deletion is permanent within this workspace; verify the path." |
1124
+ | `create_dir` | Operation / Path | (no file note) |
1125
+ | `run_command` | Operation / Command | (no file note) |
1126
+
1127
+ The `reviewing` phase keeps the existing ` N. [runtime] label`
1128
+ header byte-for-byte (phase-11d tests assert on the numbering
1129
+ format), adds an indented compact summary beneath each task, and
1130
+ inserts a thin ` -----` separator between adjacent tasks.
1131
+ Single-task workflows render no separator. Unstructured (raw NL)
1132
+ tasks render the header only.
1133
+
1134
+ ### Deterministic truncation
1135
+
1136
+ - Inline content > 72 chars: visible head + `(truncated; N chars total)`.
1137
+ - Multi-line content: `Content (L lines, M chars):` header, body lines
1138
+ prefixed `| `, capped at 6 lines and 76 chars per line, tail
1139
+ `K more lines truncated` with singular/plural agreement.
1140
+ - C-style escapes (`\t`, `\r`, `\n`, `\"`, `\\`) so multi-line
1141
+ values cannot forge new visual lines inside an inline preview.
1142
+
1143
+ ### Friction -> Fix -> Invariant mapping
1144
+
1145
+ The walkthrough-recorded friction items closed by alpha.55:
1146
+
1147
+ | Friction (walkthrough) | Coverage | Invariant improved |
1148
+ | --- | --- | --- |
1149
+ | Append content invisible at approval | Full | Preview block sourced from spec, not from intake interpretation. |
1150
+ | File-create behavior implicit | Full | Each preview includes the runtime statement (`will be created` / `target_exists` / `permanent`). |
1151
+ | Batch workflows blurred together at review | Full | `reviewing` phase per-task block + N-1 separator. |
1152
+ | Long content risked terminal flood | Full | Deterministic truncation rules with explicit char/line counts. |
1153
+ | Multi-line content could forge visual lines | Full | C-style escape for tab/CR/newline/quote in inline previews. |
1154
+
1155
+ ### Authority story
1156
+
1157
+ The renderer remains pure (WS1). The preview is read from the same
1158
+ `WorkflowTaskSpec` fields the executor consumes. The workflow spec
1159
+ hash (Row 2) covers that spec end-to-end, so the preview cannot
1160
+ drift from the executed change without the hash mismatching and
1161
+ the run aborting before any filesystem effect.
1162
+
1163
+ The preview never paraphrases content; the operation-kind label is
1164
+ a fixed factual constant per type. No semantic interpretation, no
1165
+ AI summarization, no autonomous decision-making.
1166
+
1167
+ ### What does NOT change
1168
+
1169
+ - Execution engine: byte-identical.
1170
+ - Planner: byte-identical.
1171
+ - Approval model: `task_ready` still produces a `confirm` prompt;
1172
+ nothing is auto-approved.
1173
+ - Operation set: same 8 operation types as alpha.54.
1174
+ - Dependencies: zero additions.
1175
+ - Hidden execution: still zero.
1176
+ - Autonomy: still zero.
1177
+ - Spec hash semantics, replay, audit envelope: byte-identical.
1178
+
1179
+ ### Tests
1180
+
1181
+ `tests/shell/system-will-preview.test.ts` - 41 new tests covering:
1182
+
1183
+ - Per-op preview rendering (all 8 op types).
1184
+ - File-create messaging assertions per type.
1185
+ - Inline truncation at 72 chars; multi-line block at 6 lines / 76
1186
+ chars; singular/plural wording.
1187
+ - Escape rules for `\t`, `\r`, `\n`, `\"`, `\\`.
1188
+ - Fallback to `[]` for raw NL / missing fields.
1189
+ - `task_ready` ordering invariant (SYSTEM WILL -> headline ->
1190
+ You asked -> Preview).
1191
+ - `task_conflict` parity (same preview before
1192
+ `System will execute on approval.`).
1193
+ - `reviewing` phase: 1-based numbering preserved (regression
1194
+ guard), `[cursor]` / `[claude]` tags preserved, N-1 separators
1195
+ for N tasks, single-task no separator, mixed structured /
1196
+ unstructured tasks.
1197
+ - Byte-determinism across calls.
1198
+ - Renderer purity (no run mutation).
1199
+ - Confirm prompt still required.
1200
+
1201
+ Full suite: 4794 passed, 4 pre-existing skips. No regressions in
1202
+ `phase-11d` / `workflow-coordinator` / `shell-workflow-render`.
1203
+
1204
+ ### Release engineering
1205
+
1206
+ - `npm run release:gate` continues to use `test:release` with
1207
+ `--retry=2` for the pre-existing test-order-dependent shell-
1208
+ spawn flakes documented in alpha.52 release engineering notes.
1209
+ - `check-stdin-ownership` continues to scan git-tracked files only.
1210
+
1211
+ Implementation PR: `shortgigs/usesteady-core#307`.
1212
+ Implementation module: `src/shell/workflow-render.ts`
1213
+ (`operationPreviewLines`, `operationReviewSummaryLines`, plus
1214
+ `previewInline` / `previewBlock` helpers).
1215
+
1216
+ ### Posture after alpha.55
1217
+
1218
+ Trust-clarity refinement releases complete a friction -> fix -> release
1219
+ cycle from a real walkthrough. The next cycle starts with another
1220
+ real walkthrough on alpha.55. Hold for one operational cycle:
1221
+
1222
+ - Watch for confusion at the new Preview surface (off-spec
1223
+ expectations, line-cap surprises, escape misreads).
1224
+ - Watch for `reviewing` phase readability issues at large N (>5
1225
+ tasks).
1226
+ - Watch for truncation complaints (does a real user need a way to
1227
+ see the full content before approval, or do they need to abort
1228
+ and re-author the spec).
1229
+
1230
+ No proactive next capability surface this cycle. Trust-clarity
1231
+ refinements compose with onboarding; the next bounded NOW pick
1232
+ remains 3.11 workflow health diagnostics or 3.6 execution timeline,
1233
+ selected when the alpha.55 monitoring window resolves.
1234
+
1235
+ ---
1236
+
1237
+ ## 0.1.0-alpha.54 - Onboarding quickstart and starter templates
1238
+
1239
+ **Released:** May 2026
1240
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
1241
+
1242
+ Second ship from the **Product Capability Track**. Goal: a brand-new
1243
+ user can go from install to a successful, reviewed workflow in under
1244
+ five minutes, without reading internal docs. Bounded scope: two new
1245
+ read-only subcommands and a README walkthrough. Zero authority impact.
1246
+
1247
+ ### What ships
1248
+
1249
+ Three onboarding surfaces, all read-only:
1250
+
1251
+ - `usesteady quickstart` - one-screen orientation. What UseSteady is,
1252
+ how to discover capabilities, how to pick a template, how to
1253
+ customize and run, plain-language approval explanation, where
1254
+ workflows execute, and how to stop safely. Pure text renderer;
1255
+ byte-for-byte deterministic.
1256
+ - `usesteady templates` - prints a list of safe starter workflows
1257
+ with one-line purposes.
1258
+ - `usesteady templates <name>` - prints one template in detail
1259
+ (purpose, required/optional fields, example values, safety notes,
1260
+ runnable JSON operations). `--output json` for machine-readable.
1261
+
1262
+ Five initial templates:
1263
+
1264
+ | Template | Operations |
1265
+ |---|---|
1266
+ | `append-to-file` | `append` |
1267
+ | `safe-rename` | `rename` |
1268
+ | `multi-file-replace` | `replace` (x3) |
1269
+ | `non-destructive-cleanup` | `create_dir` + `rename` (x2) |
1270
+ | `git-safe-review-flow` | `create` + `append` |
1271
+
1272
+ **No starter template uses `delete` or `run`.** Tests enforce this:
1273
+ starter templates are deliberately non-destructive and command-free.
1274
+ Every operation in every template is a member of `ALL_OPERATION_TYPES`
1275
+ (`src/input/op-registry.ts`); the registry is the single source of
1276
+ truth and tests assert there is no second op list to drift against.
1277
+
1278
+ README adds a "First 5 Minutes with UseSteady" section that walks
1279
+ the exact happy path: `quickstart` -> `capabilities` -> `templates` ->
1280
+ customize -> `batch` run -> approval / stop. No internal-doc
1281
+ references required.
1282
+
1283
+ Implementation PR: `shortgigs/usesteady-core#304`.
1284
+ Implementation modules: `src/shell/cli/quickstart.ts` and
1285
+ `src/shell/cli/templates.ts` (pure functions only; no I/O, no
1286
+ `process.exit`, no execution).
1287
+
1288
+ ### Friction -> Fix -> Invariant mapping
1289
+
1290
+ The Product Capability Track frictions are internally referenced as
1291
+ F-1..F-9 in the design doc. This release closes:
1292
+
1293
+ | Friction (track ref) | Coverage | Invariant improved |
1294
+ |---|---|---|
1295
+ | F-1 Manual batch JSON loading | full | Operators can copy a complete runnable JSON operation set from any template; no hand-crafting from registry summaries. |
1296
+ | F-7 Unclear first-run path | full | `usesteady quickstart` is the documented first command. README "First 5 Minutes" walks the full path without internal-doc references. |
1297
+ | F-8 Command authoring friction | full | Templates surface required/optional fields, example values, and safety notes for each starter workflow before invocation. |
1298
+ | F-2 Workflow scaffolding gap | partial | Five non-destructive templates cover the most common safe starting patterns. Custom workflows still require hand-authoring; that gap is deliberate. |
1299
+ | F-5 Approval surprise / opaque flow | partial | Quickstart explains the approval gate, `--yes` semantics, and how to stop safely in plain language; the runtime approval surface itself is unchanged. |
1300
+
1301
+ ### Authority story
1302
+
1303
+ - Deterministic approval model: unchanged.
1304
+ - No hidden execution: both new subcommands only print. Quickstart
1305
+ renders static text. Templates renders static catalog data. Neither
1306
+ module imports the planner, the safety gate, the executor, or any
1307
+ approval surface.
1308
+ - No autonomous authority expansion: no new authority granted. The
1309
+ set of executable operations did NOT grow. Only inspection
1310
+ surfaces grew.
1311
+ - Explain-before-execute: strengthened. Operators now see a
1312
+ pre-formatted, safety-noted recipe before authoring a workflow.
1313
+ - Bounded execution semantics: unchanged. Templates are static data;
1314
+ printing a template is not running one.
1315
+ - `--yes` semantics: unchanged. `quickstart` and `templates` join
1316
+ `capabilities` in the documented `--yes`-exempt list because they
1317
+ never execute. Every other path still requires `--yes` for
1318
+ `--output json` execution.
1319
+
1320
+ ### What does NOT change
1321
+
1322
+ - No `src/input/` change. No registry change. No IR change.
1323
+ - No safety detector, drift detector, sanitizer, or canonicalizer
1324
+ change. PRs #293 / #294 / #297 surfaces are untouched.
1325
+ - No execution engine change. Planner, executor, and approval
1326
+ surfaces are byte-identical to alpha.53.
1327
+ - No new operation types. Templates compose only operations from the
1328
+ existing `ALL_OPERATION_TYPES`.
1329
+ - No new runtime dependencies.
1330
+ - No model-insertion path change. No new prompt surfaces. No AI
1331
+ workflow generation. Templates are hand-authored static data.
1332
+ - No edits to ShortGigs, YODHA, StructureGuard, or SteadyHealth.
1333
+
1334
+ ### Tests
1335
+
1336
+ 73 of 73 tests pass across the three onboarding-adjacent surfaces:
1337
+
1338
+ - `tests/shell/capabilities.test.ts` (17, regression)
1339
+ - `tests/shell/templates.test.ts` (41 new)
1340
+ - `tests/shell/quickstart.test.ts` (15 new)
1341
+
1342
+ Key invariants enforced by tests:
1343
+
1344
+ - Every operation in every template uses a registered op type.
1345
+ - No starter template uses `delete` or `run`.
1346
+ - Quickstart text and template output are byte-for-byte deterministic.
1347
+ - `--output json` works without `--yes` on all three read-only paths.
1348
+ - Unknown template names exit non-zero with a helpful stderr line.
1349
+ - Negative-content guarantees on quickstart: no "autonomous", no
1350
+ "ai will fix", no "agent will" language anywhere in the orientation.
1351
+
1352
+ ### Release engineering
1353
+
1354
+ No changes to the release gate. `test:release` retains the `--retry=2`
1355
+ flake mitigation from alpha.52. `check-stdin-ownership` runs the same
1356
+ git-tracked-only scan.
1357
+
1358
+ ### Surface-specific monitoring
1359
+
1360
+ Stabilization window for the onboarding surface opens with this
1361
+ release. Watch for:
1362
+
1363
+ - Confusion in the quickstart text (specific lines that mislead a
1364
+ first-time user).
1365
+ - Template copy/paste failures (JSON that doesn't parse cleanly
1366
+ when pasted, escape-sequence misreads).
1367
+ - Approval-flow surprises after following the quickstart (anything
1368
+ the operator sees at run time that the quickstart did not prepare
1369
+ them for).
1370
+ - Trust/perception issues (any place where the operator cannot tell
1371
+ whether something is "just printing" or "about to run").
1372
+
1373
+ If real friction surfaces in this window, one bounded follow-up PR
1374
+ ships. No multi-candidate expansion.
1375
+
1376
+ ---
1377
+
1378
+ ## 0.1.0-alpha.53 - Capability explorer (first Product Capability Track ship)
1379
+
1380
+ **Released:** May 2026
1381
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
1382
+
1383
+ First implementation candidate from the **Product Capability Track**
1384
+ (`docs/product/useability-and-guided-execution-track.md` section 3.1,
1385
+ merged in shortgigs/usesteady-core#299). Bounded scope: one new
1386
+ read-only subcommand. Zero authority impact.
1387
+
1388
+ ### What ships
1389
+
1390
+ `usesteady capabilities` - prints a structured catalog of every IR
1391
+ operation this build supports. Reads directly from
1392
+ `src/input/op-registry.ts` (`ALL_OPERATION_TYPES` +
1393
+ `OPERATION_REGISTRY`); no second source of truth.
1394
+
1395
+ - Default output: human-readable text.
1396
+ - `--output json`: deterministic single-line JSON catalog. Exempt
1397
+ from the global `--output json` + `--yes` rule because the
1398
+ catalog has no execution path; `--yes` is meaningless for it.
1399
+ - `--help` on the subcommand: subcommand-specific usage.
1400
+ - Listed in `PURE_SUBCOMMANDS` (no stdin sampling).
1401
+ - Listed in `HELP_TEXT` for global discoverability.
1402
+
1403
+ Implementation PR: `shortgigs/usesteady-core#300`.
1404
+ Implementation module: `src/shell/cli/capabilities.ts` (pure
1405
+ functions only; no I/O, no `process.exit`, no execution).
1406
+
1407
+ ### Friction -> Fix -> Invariant mapping
1408
+
1409
+ The Product Capability Track frictions are internally referenced
1410
+ as F-1..F-9 in the design doc (not public issue numbers, since
1411
+ they were proactively identified rather than reported). This
1412
+ release closes:
1413
+
1414
+ | Friction (track ref) | Coverage | Invariant improved |
1415
+ |---|---|---|
1416
+ | F-9 Weak discoverability of supported operations | full | Every operation the build supports is enumerable from inside the product itself. No external doc lookup required. |
1417
+ | F-1 Manual batch JSON loading | partial | Operators can copy a public-JSON shape from the catalog instead of hand-crafting from source. Curated workflow templates (track section 3.2) remain queued. |
1418
+ | F-8 Command authoring friction | partial | Required and optional fields per op surface before invocation. Authoring errors are now visible at catalog read time, not at safety-gate-rejection time. |
1419
+
1420
+ ### Authority story (preserved verbatim from track section 6)
1421
+
1422
+ - Deterministic approval model: unchanged. Catalog never approves.
1423
+ - No hidden execution: catalog cannot mutate state. No side effects
1424
+ on import or invocation.
1425
+ - No autonomous authority expansion: no new authority granted.
1426
+ - Explain-before-execute: unchanged.
1427
+ - Replayability: unchanged.
1428
+ - Bounded execution semantics: the set of executable operations did
1429
+ NOT grow. Only the surface to **inspect** them grew. This
1430
+ distinction is load-bearing (track section 6.6).
1431
+
1432
+ ### What does NOT change
1433
+
1434
+ - No `src/input/` change. No registry change. No IR change.
1435
+ - No safety detector, drift detector, sanitizer, or canonicalizer
1436
+ touch.
1437
+ - No approval state machine change.
1438
+ - No UCP envelope schema change.
1439
+ - No K5 boundary change. No `MODEL_INSERTION_POLICY` touch.
1440
+ - No new doctrine, ADR, or governance document.
1441
+ - No NL-intake involvement. The catalog is built from the static
1442
+ registry, not from any model.
1443
+
1444
+ ### Tests
1445
+
1446
+ - `tests/shell/capabilities.test.ts` (new): 17 tests covering
1447
+ invariants I1..I7 (catalog coverage of `ALL_OPERATION_TYPES`,
1448
+ deterministic byte-for-byte output, `--yes` not required,
1449
+ `--output json` works without `--yes`, every op has a parseable
1450
+ JSON example, catalog is frozen, registry fields surface
1451
+ verbatim).
1452
+ - No existing test modified. Governance test
1453
+ (`tests/governance/input-surface-integrity.test.ts`) and registry
1454
+ test (`tests/input/op-registry.test.ts`) unchanged: 141/141 pass.
1455
+
1456
+ Full suite: 4697 passed, 4 skipped (132 files).
1457
+
1458
+ ### Public demonstration
1459
+
1460
+ `README.md` updated with a "Discover what UseSteady can do"
1461
+ section under Install, showing the command, its output, and the
1462
+ `--output json` variant. The README explicitly notes the catalog
1463
+ shares the same registry the executor uses (no doc drift).
1464
+
1465
+ ### Sequencing posture
1466
+
1467
+ - Product Capability Track NOW queue: section 3.1 SHIPPED in this release.
1468
+ Remaining NOW: section 3.2 (curated templates), section 3.6 (execution
1469
+ timeline view), section 3.11 (workflow health diagnostics). Per track
1470
+ section 7, one PR per candidate; the next NOW candidate opens only
1471
+ after this surface stabilizes through one monitoring window.
1472
+ - Cluster B (alpha.52) monitoring window: still active through
1473
+ 2026-05-18 unless triggers fire. This release does not touch
1474
+ any Cluster B surface; window unaffected.
1475
+ - `capabilities` opens its own observation window on landing.
1476
+ Read-only surface; thresholds calibrated narrow:
1477
+ - regression trigger: any deterministic-output drift, any
1478
+ catalog coverage gap (op missing or extra), any exit-code
1479
+ change.
1480
+ - volume trigger: 3+ reports of operator confusion mapped to
1481
+ F-9 / F-1 / F-8 within 14 days indicating the catalog is
1482
+ surfacing the wrong information.
1483
+
1484
+ ### Release engineering
1485
+
1486
+ No changes to `scripts/check-stdin-ownership.mjs` or
1487
+ `release:gate`. The alpha.52 release-engineering deltas (scanner
1488
+ gitignore-respect; `vitest run --retry=2` in `release:gate`)
1489
+ remain in place.
1490
+
1491
+ ---
1492
+
1493
+ ## 0.1.0-alpha.52 - Canonicalization, Workflow Integrity, Process Lifecycle Anchor
1494
+
1495
+ **Released:** May 2026
1496
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
1497
+
1498
+ Three implementation-level fixes plus one definitional anchor. All three
1499
+ fixes share a common invariant theme - surface-spanning consistency -
1500
+ applied across distinct axes:
1501
+
1502
+ - Row 1 (PR shortgigs/usesteady-core#293): input canonicalization in
1503
+ front of every safety detector.
1504
+ - Row 2 (PR shortgigs/usesteady-core#294): deterministic workflow spec
1505
+ hash with revalidation before every advancement.
1506
+ - Cluster B (PR shortgigs/usesteady-core#297): extends the Row 1
1507
+ canonical view to four adjacent surfaces where two views of the same
1508
+ string could otherwise diverge.
1509
+ - Cluster A anchor (PR shortgigs/usesteady-core#296): docs-only
1510
+ definitional anchor for CLI process lifecycle authority. No runtime
1511
+ code in this release. Implementation gated on this design.
1512
+
1513
+ ### Friction -> Fix -> Invariant mapping (Cluster B)
1514
+
1515
+ This release closes the implementation-ready portion of Cluster B from
1516
+ the May 2026 friction wave. The cluster map for the wave lives at
1517
+ `shortgigs/usesteady-public#75`.
1518
+
1519
+ | Friction | Issue | Severity | Fix surface | Invariant improved |
1520
+ |---|---|---|---|---|
1521
+ | U+202E in filename accepted without validation | shortgigs/usesteady-public#50 | P0 | `pathEscapesWorkspace` (filename validation) + OCD path comparison + adapter `allowedFiles` check | A path that escapes the workspace in canonical form is refused even when the original-form regex would have let it through. Adjacent surfaces (validator, OCD, adapter) see the same canonical interpretation. |
1522
+ | Literal string matching ignores Unicode normalization (NFC vs NFD) | shortgigs/usesteady-public#51 | P2 | `inprocess-adapter.receive` replace-match: canonical/original occurrence-count gate | Original-form and canonical-form occurrence counts must agree before a replace is allowed. NFC vs NFD divergence is detected and refused rather than silently mis-matching. |
1523
+ | U+202E in replacement text accepted | shortgigs/usesteady-public#52 | P0 | `inprocess-adapter.receive` replace-match gate; `searchForOldValue` cross-file gate | Replace `oldValue` must canonicalize to itself; a `oldValue` whose canonical form differs is refused (`ambiguous_match`, "match-count mismatch"). Same gate applies to multi-file search. |
1524
+ | Mixed-script homograph filenames (Cyrillic vs Latin) | shortgigs/usesteady-public#53 | P2 | Partial - Cluster B catches mixed-script when combined with other obfuscation (canonical-form path comparison divergence); pure NFKC does NOT fold scripts | This release does NOT fully resolve pure-script homograph spoofing. NFKC normalization is the wrong tool for script-level confusion. The issue remains `status/accepted` pending a separate script-detection track. |
1525
+
1526
+ ### Row 1 - Input canonicalization (foundation)
1527
+
1528
+ Source: SafeHarness research finding (`docs/architecture/usesteady-safeharness-hardening-map.md`, Row 1). No specific friction issue.
1529
+
1530
+ What changes:
1531
+ - New module `src/safety/canonicalize.ts` exporting
1532
+ `canonicalizeForSafety` and `CanonicalizationError`.
1533
+ - Transform (fixed order): NFKC normalize -> strip zero-width
1534
+ codepoints (U+200B, U+200C, U+200D, U+2060, U+FEFF) -> strip
1535
+ bidirectional controls (U+200E, U+200F, U+202A-U+202E,
1536
+ U+2066-U+2069).
1537
+ - Hooked at: `src/safety/safety-gate.ts` (canonicalize before every
1538
+ detector), `src/control/compiler.ts` (canonicalize `rawRequest`,
1539
+ `plannedChanges.summary[]`, `plannedChanges.files[]` before the
1540
+ drift detector).
1541
+ - Fail-closed: `CanonicalizationError` produces a blocked verdict
1542
+ with reason `evasion_or_rule_bypass` (safety gate) or
1543
+ `canonicalization_failed` (control compiler).
1544
+ - Original (raw) strings are preserved on audit fields verbatim.
1545
+
1546
+ Invariant: detectors see the canonical form; audit retains the raw
1547
+ form. Replay determinism unchanged.
1548
+
1549
+ ### Row 2 - Workflow spec deterministic hash + revalidation
1550
+
1551
+ Source: SafeHarness research finding (hardening map Row 2). No
1552
+ specific friction issue.
1553
+
1554
+ What changes:
1555
+ - New module `src/workflow/spec-hash.ts` exporting
1556
+ `computeWorkflowSpecHash` and `verifyWorkflowSpecHash`.
1557
+ - `WorkflowRun` carries `workflowSpecHash: string` (set at
1558
+ `createWorkflowRun`, never mutated).
1559
+ - `advanceWorkflow` and `deliverWorkflowTask` revalidate the hash
1560
+ before every transition. Mismatch aborts the run.
1561
+ - Hash stays in execution/session metadata only. No signing system,
1562
+ no distributed trust, no network dependency.
1563
+
1564
+ Invariant: the executing run is bit-for-bit the run that was
1565
+ approved. Spec drift between approval and execution aborts rather
1566
+ than executing silently.
1567
+
1568
+ ### Cluster A - CLI process lifecycle authority boundary (anchor only)
1569
+
1570
+ Source: friction wave issues shortgigs/usesteady-public#70-#74.
1571
+
1572
+ What changes:
1573
+ - New design document `docs/architecture/cli-process-lifecycle-authority-boundary.md` (390 lines).
1574
+ - Defines the load-bearing invariant: a CLI invocation's authority
1575
+ over OS processes is limited to the invocation interval; every
1576
+ spawned process must terminate within the interval or be
1577
+ explicitly enumerated as an authorized outlive-exception.
1578
+ - Names two violation classes (unauthorized outliving, unauthorized
1579
+ invocation replacement via `exec`); defines a closed-class
1580
+ outlive-exception mechanism shape; sketches the containment
1581
+ surface (per-invocation process registry + syscall refusal list
1582
+ + teardown protocol).
1583
+ - NOT implemented in this release. Implementation is gated on the
1584
+ decisions in section 11 of the design document.
1585
+
1586
+ Invariant established (not yet enforced): no process whose
1587
+ existence cannot be accounted for by the operator at invocation-end
1588
+ is authorized.
1589
+
1590
+ ### What does NOT change
1591
+
1592
+ - No new approval state, UCP envelope schema, or ControlEnvelope
1593
+ schema.
1594
+ - No SafetyResult schema change. No detector logic change.
1595
+ - No K5 boundary change. No MODEL_INSERTION_POLICY change.
1596
+ - No replay determinism change.
1597
+ - No new doctrine file. No new ADR.
1598
+ - No autonomous-execution surface. No semantic-review surface.
1599
+ - No NL grammar change.
1600
+
1601
+ ### Tests
1602
+
1603
+ - `tests/safety/canonicalize.test.ts` (new with Row 1): 28 tests.
1604
+ - `tests/safety/safety-gate.test.ts`: +8 tests for canonicalization
1605
+ bypass attempts (clean inputs unchanged).
1606
+ - `tests/control/control-envelope.test.ts`: +6 tests for canonical
1607
+ control compilation.
1608
+ - `tests/workflow/spec-hash.test.ts` (new with Row 2): 14 tests.
1609
+ - `tests/workflow/workflow-coordinator.test.ts`: +existing
1610
+ revalidation coverage.
1611
+ - `tests/safety/canonicalize-adjacent-surfaces.test.ts` (new with
1612
+ Cluster B): 44 tests across all five required categories (U+202E,
1613
+ NFC/NFD equivalence, BIDI controls, replacement-text matching,
1614
+ filename/path denylist).
1615
+
1616
+ Full suite: 4680 passed, 4 skipped.
1617
+
1618
+ ### Release engineering
1619
+
1620
+ - `scripts/check-stdin-ownership.mjs` now scans only git-tracked files
1621
+ via `git ls-files src`. Locally-added or `.gitignore`'d tools (e.g.
1622
+ the proprietary `friction-admin.ts` that ships in a separate repo)
1623
+ no longer trip the public single-stdin-owner invariant guard. Falls
1624
+ back to scanning everything when `git` is unavailable.
1625
+ - `npm run release:gate` now runs `vitest run --retry=2` instead of
1626
+ `vitest run`. Local `npm test` is unchanged. The retry is bounded
1627
+ and only papers over stochastic process-spawn races in tests that
1628
+ shell out to the CLI; a test failing three times in a row is still
1629
+ a real failure.
1630
+
1631
+ ### Issue label transitions
1632
+
1633
+ After publish, the following issues transition from
1634
+ `status/accepted` to `status/shipped` in
1635
+ `shortgigs/usesteady-public`:
1636
+
1637
+ - #50, #51, #52 (Cluster B fixes shipped here)
1638
+
1639
+ The following remain `status/accepted` pending further work:
1640
+
1641
+ - #53 (Cluster B partial; pure-script homograph spoofing requires
1642
+ a separate detection track)
1643
+ - #70-#74 (Cluster A; anchor landed, implementation deferred)
1644
+ - All other May 2026 wave issues (clusters C-H and lower-priority
1645
+ distinct items)
1646
+
1647
+ ---
1648
+
1649
+ ## 0.1.0-alpha.51 - S4: Trust & Surface Integrity Completion
1650
+
1651
+ **Released:** April 2026
1652
+ **npm tag:** `alpha` - `npm install -g usesteady@alpha`
1653
+
1654
+ Stabilization Pass 4 (S4). Closes friction reports #44 (P1, Input
1655
+ Surface Integrity), #42 (P2, Trust frame), #43 (P3, Trust display).
1656
+ Issue #41 (batch rollback) remains parked.
1657
+
1658
+ ### Breaking change - R4 uniform (Option alpha)
1659
+
1660
+ Pre-S4 the WorkflowSpec input surface accepted bare-NL `replace` forms
1661
+ without an explicit occurrence clause:
1662
+
1663
+ ```jsonc
1664
+ { "tasks": [{ "input": "replace \"X\" with \"Y\" in file.ts" }] }
1665
+ ```
1666
+
1667
+ The legacy coordinator NL fallback (`parseChange`) silently treated
1668
+ this as "first occurrence." The same NL string typed at `--prompt` was
1669
+ already rejected with R4 ("explicit occurrence required") - so
1670
+ identical NL input behaved differently across surfaces, breaking the
1671
+ alpha.49 contract: *same NL string -> same behavior everywhere*.
1672
+
1673
+ S4 closes the gap. `normalizeNLToIR` is now the single NL parser;
1674
+ `tasks[].input` is normalized at spec-load time; R4 is enforced
1675
+ uniformly across `--prompt`, `WorkflowSpec`, and any future NL
1676
+ surface. No coordinator fallback. No spec-load shortcut. No hidden
1677
+ public surface.
1678
+
1679
+ **Migration.** Any `replace` task in a `WorkflowSpec` MUST now include
1680
+ an explicit occurrence clause:
1681
+
1682
+ | Before (now fails with `invalid_op`) | After |
1683
+ |------------------------------------------|-----------------------------------------------------------------|
1684
+ | `replace "X" with "Y" in file.ts` | `replace "X" with "Y" in file.ts first occurrence` |
1685
+ | | `replace "X" with "Y" in file.ts all occurrences` |
1686
+ | | `replace "X" with "Y" in file.ts <Nth> occurrence` |
1687
+
1688
+ Programmatic alternatives are unchanged: pass `structuredReplace`
1689
+ (`{oldValue, newValue, filePath}`) directly, or use a JSON op shape
1690
+ (`{ "type": "replace", "file": ..., "from": ..., "to": ... }`) - both
1691
+ already mean "first occurrence" by construction.
1692
+
1693
+ This is a controlled breaking fix in favor of trust consistency.
1694
+
1695
+ ### What changed
1696
+
1697
+ **#44 - WorkflowSpec NL parity (P1, Input Surface Integrity)**
1698
+
1699
+ - New `src/shell/cli/spec-nl-synth.ts`. `loadWorkflowSpecFromFile`
1700
+ routes `tasks[].input` through `normalizeNLToIR` and synthesizes
1701
+ structured fields (`operationType`, `content`, `targetFiles`,
1702
+ `structuredReplace`, ...) at the input boundary.
1703
+ - New shared `src/shell/cli/ir-to-spec-fields.ts` - single canonical
1704
+ `Operation -> WorkflowTaskSpec structured-fields` mapper, used by
1705
+ both the NL synthesizer and `buildSpecTasksFromIROps` so the JSON-op
1706
+ and NL paths cannot drift again.
1707
+ - `src/workflow/coordinator.ts` no longer imports `parseChange` and
1708
+ no longer defines `hasDeterministicReplaceInput`. The runtime NL
1709
+ fallback inside `advanceWorkflow` is gone. `isDeterministicTaskSpec`
1710
+ only inspects structured fields.
1711
+ - User-supplied `targetFiles` continue to win over synthesizer-
1712
+ produced ones; only synthesizer-derived fields fill gaps.
1713
+
1714
+ **#43 - `replace` placeholder lie (P3, Trust display)**
1715
+
1716
+ `src/shell/workflow-render.ts` adds `truthfulInputDisplay`. When a
1717
+ task carries `structuredReplace`, the `You asked:` line is derived
1718
+ from `oldValue`/`newValue`/`filePath` - the executor's actual inputs
1719
+ - instead of the parser-stable placeholder produced by
1720
+ `buildSpecTasksFromIROps`. NL surfaces (where `input` is the literal
1721
+ user text) are unchanged. Render-only transform; `taskSpec.input`
1722
+ stays parser-stable so intake classification is unaffected.
1723
+
1724
+ **#42 - OCD `CONFLICT` frame (P2, Trust frame)**
1725
+
1726
+ `task_conflict` header renamed: `CONFLICT` ->
1727
+ `WARNING - OCD conflict detected (non-blocking)`. Frame body now ends
1728
+ with `System will execute on approval.` so the rendered severity
1729
+ matches the actual gate (the system never blocks; H gates). Confirm
1730
+ prompt updated to `Accept warning and approve task? (y/n)`. Pure
1731
+ renderer change. State machine, OCD evaluator, and policy untouched.
1732
+
1733
+ ### Governance lock extension
1734
+
1735
+ `tests/governance/input-surface-integrity.test.ts` adds:
1736
+
1737
+ - WorkflowSpec NL parity assertions ("same NL string -> same
1738
+ behavior everywhere"): every form `--prompt` rejects is also
1739
+ rejected via `loadWorkflowSpecFromFile`; every form it accepts
1740
+ synthesizes the same `operationType`.
1741
+ - Structural invariants: `src/workflow/coordinator.ts` no longer
1742
+ imports `parseChange` and no longer defines
1743
+ `hasDeterministicReplaceInput`. Future regressions caught at
1744
+ test time, not at runtime.
1745
+
1746
+ ### Real proof (workflow-04)
1747
+
1748
+ `tests/governance/nl-real-workflow-replay.test.ts` adds workflow-04:
1749
+ write a `WorkflowSpec` with a single NL `append` task, run
1750
+ `usesteady run spec.json --yes`, verify file mutation, verify the
1751
+ persisted artifact carries `operationType: "append_file"` (the smoking
1752
+ gun for #44 - pre-S4 the artifact lacked this), and verify replay
1753
+ match.
1754
+
1755
+ `labs/shortgigs-workflow-03/README.md` extends the locked runbook
1756
+ with Spec D (`WorkflowSpec NL parity / S4 / #44`), pinning the same
1757
+ proof against published binaries.
1758
+
1759
+ ### Out of scope (locked)
1760
+
1761
+ #41 (batch rollback), executor changes, kernel changes, safety changes,
1762
+ feasibility validator changes, NL grammar additions, K5, ShortGigs
1763
+ integration, error code names, exit codes.
1764
+
1765
+ ### Pre-publish gates
1766
+
1767
+ - `npm run build` -> ok
1768
+ - `npm test` -> 4535 / 4539 pass, 4 skipped
1769
+ - `npm run verify:pack-clean` -> ok (933 files, 0 private artifacts)
1770
+ - Lab proof workflow-04 (post-merge on master) -> exit 0, file
1771
+ mutated, artifact `f97322b40320d473a7ad150a27ab38cc2d06735fc48a0c7cf3adad0c569a49c1`
1772
+ carries `operationType: "append_file"`, replay -> `match`
1773
+ - Lab proof workflow-03 A/B/C/D (post-merge) -> all four specs
1774
+ succeed
1775
+ - R4 negative path -> a WorkflowSpec replace without occurrence exits
1776
+ 1 with `invalid_op` and the canonical migration message
1777
+
1778
+ ## 0.1.0-alpha.43 - Kernel v1
1779
+
1780
+ **Released:** April 2026
1781
+ **npm tag:** `alpha` - opt in with `npm install -g usesteady@alpha`
1782
+ **Latest stable tag:** `0.1.0-alpha.4` (unchanged)
1783
+
1784
+ First alpha cut of the Kernel v1 trust surface. Nothing in the workflow
1785
+ coordinator, approval model, safety gate, or policy engine changed. What
1786
+ changed is the determinism surface the CLI now emits, how errors are
1787
+ classified before they reach that surface, and how human output is
1788
+ shaped at the end of a run. Landed as three kernel PRs plus one
1789
+ release-gate hotfix.
1790
+
1791
+ ### What changed
1792
+
1793
+ **Deterministic replay artifact (PR-K1, #239)**
1794
+
1795
+ Every successful CLI run now persists a content-addressed artifact at
1796
+ `<storeDir>/replay/<checksum>.artifact.json` containing:
1797
+
1798
+ ```
1799
+ { version, ir, result, checksum }
1800
+ ```
1801
+
1802
+ `ir` is the existing `WorkflowSpec` (reused, not reinvented). `result`
1803
+ is a strictly deterministic summary (`success`, `error`,
1804
+ `executed_steps`, `failed_at_step`, `total_steps`) - no timestamps, no
1805
+ paths, no stdout, no randomness. `checksum` is `sha256` over the
1806
+ canonical JSON of `{ ir, result }` with stable key ordering. Identical
1807
+ runs produce identical filenames.
1808
+
1809
+ New subcommand `usesteady replay <artifact-file>` performs integrity
1810
+ verification only:
1811
+
1812
+ ```
1813
+ { "replay": "match" | "mismatch", "original_checksum": "...", "new_checksum": "..." }
1814
+ ```
1815
+
1816
+ No workflow re-execution, no `process.argv` mutation, no side effect
1817
+ beyond reading the artifact file. Full execution replay is deferred.
1818
+
1819
+ **Canonical CLI error-code taxonomy (PR-K2, #240)**
1820
+
1821
+ A single closed `CanonicalErrorCode` enum now backs every error string
1822
+ that reaches the final CLI summary, the kernel result, or the artifact
1823
+ result. A central `finalizeErrorCode` choke point normalizes codes
1824
+ before `_errorCode` materialization. Consensus-layer capture was widened
1825
+ beyond `runtime === "cursor"` so Claude consensus codes survive to the
1826
+ final surface.
1827
+
1828
+ No public shape change. `KernelResult.error` and the CLI JSON `error`
1829
+ field stay `string | null`; the enum is internal. What changes is that
1830
+ different failures no longer collapse into a generic `execution_error`.
1831
+
1832
+ **Single-voice human output (PR-K3, #241)**
1833
+
1834
+ Pre-PR-K3 every terminal run printed three different vocabularies to
1835
+ stdout: a workflow-render frame, a `Terminal outcome:` classifier line,
1836
+ and the PR-2 summary block. K3 keeps only the PR-2 summary block as the
1837
+ user-facing final result. The `Terminal outcome:`,
1838
+ `COMPLETED:`/`STOPPED_BY_USER:`/`FAILED_EXPLICIT:` lines no longer reach
1839
+ stdout. `persistWorkflowTerminalOutcome` writes the record to disk
1840
+ unchanged; classifier message strings in that record are identical;
1841
+ exit codes propagate as before.
1842
+
1843
+ `loadWorkflowSpecFromFile` now throws `WorkflowSpecLoadError` with a
1844
+ canonical K2 code and a single-sentence message (no Node-errno dialect,
1845
+ no duplicated path). The interactive workflow/history banner is
1846
+ suppressed under `--yes`; the `UseSteady ? Workflow` separator
1847
+ (mojibake-to-`?`) is now clean ASCII `UseSteady - Workflow`.
1848
+
1849
+ One narrow JSON parity fix: `usesteady run <missing>.json --yes
1850
+ --output json` now emits a canonical JSON error to stdout instead of
1851
+ exiting silently with human stderr only. Other JSON parity gaps
1852
+ (`batch`, `replay`, unknown-subcommand, `--output json` without
1853
+ `--yes`) remain deferred.
1854
+
1855
+ **Release-gate hotfix (#242)**
1856
+
1857
+ K1 shipped two kernel files using `import fs from "node:fs"` default
1858
+ imports, which the repo's `"esModuleInterop": false` tsconfig rejects.
1859
+ On master `npm run build` exited 2 and silently broke `prepublishOnly`.
1860
+ Switched to named imports (`mkdirSync`, `writeFileSync`, `join`,
1861
+ `readFileSync`) - the style used elsewhere in `src/shell/cli/`. No
1862
+ behavior change.
1863
+
1864
+ ### What was not changed
1865
+
1866
+ - The workflow coordinator, approval model, and execution path
1867
+ - The safety gate, detectors, and category routing
1868
+ - The consensus policy and `ConsensusAuditRecord` type
1869
+ - The public CLI summary shape (`success`, `error`, `failed_at_step`, `executed_steps`, `total_steps`)
1870
+ - All INV-ML-, INV-CE- invariants
1871
+ - The on-disk `WorkflowTerminalRecord` or its classifier strings
1872
+ - Exit codes for any path
1873
+ - The `SYSTEM WILL` format or any marketing surface
1874
+
1875
+ ### Deferred to later kernel PRs
1876
+
1877
+ - Full execution replay (PR-K1 is artifact-integrity replay only)
1878
+ - JSON parity for `batch`, `replay`, unknown-subcommand, and `--output json` without `--yes`
1879
+ - Widening the canonical error taxonomy through the shadow envelope and terminal record (K2 D5)
1880
+ - Conflict-frame retuning, REVIEW-frame dedupe, friction-footer coalescing, consensus-block output work (K3 non-goals)
1881
+ - `ci(release): run npm run build in Repo validation` and `chore(release): wire release:gate into prepublishOnly` (governance follow-ups)
1882
+
1883
+ ---
1884
+
1885
+ ## 0.1.0-alpha.10 - UX Clarity Layer
1886
+
1887
+ **Released:** April 2026
1888
+ **npm tag:** `alpha` - opt in with `npm install -g usesteady@alpha`
1889
+ **Latest stable tag:** `0.1.0-alpha.4` (unchanged)
1890
+
1891
+ This release adds a clarity layer on top of the existing execution core. Nothing
1892
+ in the coordinator, policy engine, or consensus system was changed. What changed
1893
+ is everything the user sees before and after execution runs.
1894
+
1895
+ ### What changed
1896
+
1897
+ **Draft Mode** (`usesteady "plain English instruction"`)
1898
+
1899
+ The CLI now accepts free-text input directly. It translates the intent into
1900
+ structured steps, shows them with `OK` / `?` indicators, and asks for
1901
+ confirmation before routing to the existing execution pipeline. Unrecognised
1902
+ clauses are marked `needs_confirmation: true` and pass through with the original
1903
+ text preserved - nothing is silently dropped.
1904
+
1905
+ **`usesteady help` command**
1906
+
1907
+ New `help` subcommand shows supported actions, exact formats, and an honest
1908
+ description of plain-English input. Distinct from `--help`, which shows
1909
+ command-line options.
1910
+
1911
+ **Consensus explanation in CLI**
1912
+
1913
+ After a workflow completes, the CLI prints a human-readable consensus result
1914
+ when multi-model mode was active. Uses file-offset correlation so the output
1915
+ matches this run only. Shows "Passed (N rounds)" on success, or the specific
1916
+ disagreement reason (capability / scope / semantic) on block. No hashes or
1917
+ internal enum names exposed.
1918
+
1919
+ **Intake failure guidance**
1920
+
1921
+ When one or more workflow steps are skipped by the intake parser
1922
+ (`skipped_by_intake`), the completed/stopped CLI frame now appends the
1923
+ supported format examples - matching the guidance already shown in the web UI.
1924
+
1925
+ **UI copy updates**
1926
+
1927
+ - Consensus indicator: `"multi | OK Unanimous 2r"` -> `"Multi-model check: OK Passed (2 rounds)"`
1928
+ - Policy block label: `"Blocked by policy"` -> `"Blocked - models did not agree on execution"`
1929
+
1930
+ **Marketing site - story shift**
1931
+
1932
+ Landing page: new `FlowSection` with the four-step Describe -> Preview -> Approve
1933
+ -> Execute flow. CLI demo updated to show Draft Mode. Consensus section updated
1934
+ to show concrete pass/block examples instead of abstract architecture copy.
1935
+
1936
+ Docs page: restructured to be usable-first. New sections: Supported Actions,
1937
+ Examples (six real commands), When Blocked (three reasons with fixes). No
1938
+ internal terms, no invariant documentation, no architecture theory in the
1939
+ user-facing path.
1940
+
1941
+ ### What was not changed
1942
+
1943
+ - The coordinator, Forge execution loop, and all advance functions
1944
+ - The multi-LLM consensus policy and `ConsensusAuditRecord` type
1945
+ - All INV-ML-, INV-CE- invariants
1946
+ - The `SYSTEM WILL` format
1947
+ - The approval authority model - human approval required before every step
1948
+
1949
+ ---
1950
+
1951
+ ## 0.1.0-alpha.9 - Deterministic Execution Runtime
1952
+
1953
+ **Released:** April 2026
1954
+ **npm tag:** `alpha` - opt in with `npm install -g usesteady@alpha`
1955
+ **Latest stable tag:** `0.1.0-alpha.4` (unchanged)
1956
+
1957
+ This release formalises the execution layer that has been running in controlled
1958
+ environments since the public alpha. The core guarantee - nothing runs without
1959
+ explicit human approval - is unchanged. What is new is the architectural depth
1960
+ behind that guarantee.
1961
+
1962
+ ### What changed
1963
+
1964
+ **Deterministic workflow execution**
1965
+
1966
+ The workflow coordinator sequences approved tasks through a fixed state machine:
1967
+ `approve -> execute -> observe -> resolve`. Every transition is explicit. No step
1968
+ is inferred, skipped, or reordered. The same input produces the same approval
1969
+ request every time.
1970
+
1971
+ **Optional multi-model policy enforcement**
1972
+
1973
+ When `USESTEADY_LLM_MODE=multi` is set, execution requests require agreement
1974
+ across models before proceeding. Agreement is defined as matching normalised
1975
+ decision hashes - not just multiple "accepted" responses. If models disagree,
1976
+ execution is blocked. This is disabled by default.
1977
+
1978
+ **Fail-closed behaviour**
1979
+
1980
+ Policy disagreement is a hard stop, not a fallback. The system does not proceed
1981
+ on partial agreement, does not fall back to a single model's verdict, and does
1982
+ not silently degrade. When the policy layer blocks execution, the failure note
1983
+ says why.
1984
+
1985
+ **Full audit trail**
1986
+
1987
+ Every execution decision is logged with its outcome, reason, and - in
1988
+ multi-model mode - the consensus record for that request. The log is
1989
+ append-only. Nothing that ran is absent from the record.
1990
+
1991
+ ### Notes
1992
+
1993
+ - Multi-model mode is optional and inactive by default. Enable it with
1994
+ `USESTEADY_LLM_MODE=multi` and the appropriate API keys.
1995
+ - No UI code is included in this package. The runtime is fully standalone.
1996
+ - The approval authority model is unchanged. Human approval is required before
1997
+ any step executes, regardless of what the policy layer returns.
1998
+ - Consensus verdicts are input signals to the coordinator. They do not override
1999
+ human approval authority.
2000
+
2001
+ ### What was not changed
2002
+
2003
+ - The approval flow visible to users
2004
+ - The `SYSTEM WILL` format
2005
+ - The CLI interface
2006
+ - Any existing workflow spec format
2007
+
2008
+ ---
2009
+
2010
+ ## 0.1.0-alpha.9 and earlier
2011
+
2012
+ See git history for the public alpha changelog.