usesteady 0.1.0-alpha.6 → 0.1.0-alpha.60

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