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.
- package/CHANGELOG.md +1926 -0
- package/README.md +246 -26
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +175 -5
- package/dist/server.js.map +1 -1
- package/dist/src/claude/adapters/multi-llm-adapter.d.ts +72 -0
- package/dist/src/claude/adapters/multi-llm-adapter.d.ts.map +1 -0
- package/dist/src/claude/adapters/multi-llm-adapter.js +423 -0
- package/dist/src/claude/adapters/multi-llm-adapter.js.map +1 -0
- package/dist/src/claude/adapters/multi-llm-types.d.ts +246 -0
- package/dist/src/claude/adapters/multi-llm-types.d.ts.map +1 -0
- package/dist/src/claude/adapters/multi-llm-types.js +262 -0
- package/dist/src/claude/adapters/multi-llm-types.js.map +1 -0
- package/dist/src/claude/adapters/openai-compatible-adapter.d.ts +99 -0
- package/dist/src/claude/adapters/openai-compatible-adapter.d.ts.map +1 -0
- package/dist/src/claude/adapters/openai-compatible-adapter.js +424 -0
- package/dist/src/claude/adapters/openai-compatible-adapter.js.map +1 -0
- package/dist/src/claude/index.d.ts +6 -0
- package/dist/src/claude/index.d.ts.map +1 -1
- package/dist/src/claude/index.js +4 -0
- package/dist/src/claude/index.js.map +1 -1
- package/dist/src/config/providers.d.ts +61 -0
- package/dist/src/config/providers.d.ts.map +1 -0
- package/dist/src/config/providers.js +57 -0
- package/dist/src/config/providers.js.map +1 -0
- package/dist/src/control/compiler.d.ts.map +1 -1
- package/dist/src/control/compiler.js +53 -4
- package/dist/src/control/compiler.js.map +1 -1
- package/dist/src/control/discover-boundary.d.ts +88 -0
- package/dist/src/control/discover-boundary.d.ts.map +1 -0
- package/dist/src/control/discover-boundary.js +172 -0
- package/dist/src/control/discover-boundary.js.map +1 -0
- package/dist/src/control/verify-and-resolve.d.ts +82 -0
- package/dist/src/control/verify-and-resolve.d.ts.map +1 -0
- package/dist/src/control/verify-and-resolve.js +207 -0
- package/dist/src/control/verify-and-resolve.js.map +1 -0
- package/dist/src/cursor/adapters/inprocess-adapter.d.ts +71 -2
- package/dist/src/cursor/adapters/inprocess-adapter.d.ts.map +1 -1
- package/dist/src/cursor/adapters/inprocess-adapter.js +545 -23
- package/dist/src/cursor/adapters/inprocess-adapter.js.map +1 -1
- package/dist/src/cursor/artifact-mapper.js +1 -0
- package/dist/src/cursor/artifact-mapper.js.map +1 -1
- package/dist/src/cursor/ocd-evaluator.d.ts.map +1 -1
- package/dist/src/cursor/ocd-evaluator.js +64 -3
- package/dist/src/cursor/ocd-evaluator.js.map +1 -1
- package/dist/src/cursor/types.d.ts +1 -1
- package/dist/src/cursor/types.d.ts.map +1 -1
- package/dist/src/execution/cursor/cursor-execution-coordinator.js +2 -0
- package/dist/src/execution/cursor/cursor-execution-coordinator.js.map +1 -1
- package/dist/src/execution/unresolved-classification.d.ts +5 -0
- package/dist/src/execution/unresolved-classification.d.ts.map +1 -0
- package/dist/src/execution/unresolved-classification.js +26 -0
- package/dist/src/execution/unresolved-classification.js.map +1 -0
- package/dist/src/friction/activation.d.ts +34 -0
- package/dist/src/friction/activation.d.ts.map +1 -0
- package/dist/src/friction/activation.js +96 -0
- package/dist/src/friction/activation.js.map +1 -0
- package/dist/src/friction/github-issues.d.ts +6 -0
- package/dist/src/friction/github-issues.d.ts.map +1 -1
- package/dist/src/friction/github-issues.js +9 -0
- package/dist/src/friction/github-issues.js.map +1 -1
- package/dist/src/friction/posthog.d.ts +33 -0
- package/dist/src/friction/posthog.d.ts.map +1 -0
- package/dist/src/friction/posthog.js +106 -0
- package/dist/src/friction/posthog.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/input/cli-error.d.ts +177 -0
- package/dist/src/input/cli-error.d.ts.map +1 -0
- package/dist/src/input/cli-error.js +57 -0
- package/dist/src/input/cli-error.js.map +1 -0
- package/dist/src/input/feasibility-validator.d.ts +136 -0
- package/dist/src/input/feasibility-validator.d.ts.map +1 -0
- package/dist/src/input/feasibility-validator.js +788 -0
- package/dist/src/input/feasibility-validator.js.map +1 -0
- package/dist/src/input/index.d.ts +22 -0
- package/dist/src/input/index.d.ts.map +1 -0
- package/dist/src/input/index.js +26 -0
- package/dist/src/input/index.js.map +1 -0
- package/dist/src/input/ir-to-draft.d.ts +58 -0
- package/dist/src/input/ir-to-draft.d.ts.map +1 -0
- package/dist/src/input/ir-to-draft.js +132 -0
- package/dist/src/input/ir-to-draft.js.map +1 -0
- package/dist/src/input/ir.d.ts +120 -0
- package/dist/src/input/ir.d.ts.map +1 -0
- package/dist/src/input/ir.js +37 -0
- package/dist/src/input/ir.js.map +1 -0
- package/dist/src/input/json-to-ir.d.ts +113 -0
- package/dist/src/input/json-to-ir.d.ts.map +1 -0
- package/dist/src/input/json-to-ir.js +229 -0
- package/dist/src/input/json-to-ir.js.map +1 -0
- package/dist/src/input/nl-to-ir.d.ts +132 -0
- package/dist/src/input/nl-to-ir.d.ts.map +1 -0
- package/dist/src/input/nl-to-ir.js +669 -0
- package/dist/src/input/nl-to-ir.js.map +1 -0
- package/dist/src/input/op-registry.d.ts +118 -0
- package/dist/src/input/op-registry.d.ts.map +1 -0
- package/dist/src/input/op-registry.js +160 -0
- package/dist/src/input/op-registry.js.map +1 -0
- package/dist/src/intake/intake-service.d.ts +26 -0
- package/dist/src/intake/intake-service.d.ts.map +1 -1
- package/dist/src/intake/intake-service.js +46 -0
- package/dist/src/intake/intake-service.js.map +1 -1
- package/dist/src/intake/intent-families.d.ts +85 -0
- package/dist/src/intake/intent-families.d.ts.map +1 -0
- package/dist/src/intake/intent-families.js +69 -0
- package/dist/src/intake/intent-families.js.map +1 -0
- package/dist/src/intake/llm-classifier.d.ts +46 -0
- package/dist/src/intake/llm-classifier.d.ts.map +1 -0
- package/dist/src/intake/llm-classifier.js +177 -0
- package/dist/src/intake/llm-classifier.js.map +1 -0
- package/dist/src/interaction/guidance-order.js +3 -3
- package/dist/src/interaction/guidance-order.js.map +1 -1
- package/dist/src/kernel/artifact.d.ts +32 -0
- package/dist/src/kernel/artifact.d.ts.map +1 -0
- package/dist/src/kernel/artifact.js +55 -0
- package/dist/src/kernel/artifact.js.map +1 -0
- package/dist/src/kernel/classifier.d.ts +63 -0
- package/dist/src/kernel/classifier.d.ts.map +1 -0
- package/dist/src/kernel/classifier.js +174 -0
- package/dist/src/kernel/classifier.js.map +1 -0
- package/dist/src/kernel/command-classifier.d.ts +74 -0
- package/dist/src/kernel/command-classifier.d.ts.map +1 -0
- package/dist/src/kernel/command-classifier.js +101 -0
- package/dist/src/kernel/command-classifier.js.map +1 -0
- package/dist/src/kernel/error-codes.d.ts +252 -0
- package/dist/src/kernel/error-codes.d.ts.map +1 -0
- package/dist/src/kernel/error-codes.js +278 -0
- package/dist/src/kernel/error-codes.js.map +1 -0
- package/dist/src/kernel/execution-replay.d.ts +73 -0
- package/dist/src/kernel/execution-replay.d.ts.map +1 -0
- package/dist/src/kernel/execution-replay.js +393 -0
- package/dist/src/kernel/execution-replay.js.map +1 -0
- package/dist/src/kernel/persist.d.ts +24 -0
- package/dist/src/kernel/persist.d.ts.map +1 -0
- package/dist/src/kernel/persist.js +32 -0
- package/dist/src/kernel/persist.js.map +1 -0
- package/dist/src/kernel/replay.d.ts +27 -0
- package/dist/src/kernel/replay.d.ts.map +1 -0
- package/dist/src/kernel/replay.js +59 -0
- package/dist/src/kernel/replay.js.map +1 -0
- package/dist/src/kernel/result-equality.d.ts +19 -0
- package/dist/src/kernel/result-equality.d.ts.map +1 -0
- package/dist/src/kernel/result-equality.js +24 -0
- package/dist/src/kernel/result-equality.js.map +1 -0
- package/dist/src/kernel/sandbox.d.ts +35 -0
- package/dist/src/kernel/sandbox.d.ts.map +1 -0
- package/dist/src/kernel/sandbox.js +47 -0
- package/dist/src/kernel/sandbox.js.map +1 -0
- package/dist/src/kernel/types.d.ts +55 -0
- package/dist/src/kernel/types.d.ts.map +1 -0
- package/dist/src/kernel/types.js +15 -0
- package/dist/src/kernel/types.js.map +1 -0
- package/dist/src/observe/drl-ledger-writer.d.ts +13 -0
- package/dist/src/observe/drl-ledger-writer.d.ts.map +1 -0
- package/dist/src/observe/drl-ledger-writer.js +8 -0
- package/dist/src/observe/drl-ledger-writer.js.map +1 -0
- package/dist/src/product/claude-product-session.d.ts +2 -1
- package/dist/src/product/claude-product-session.d.ts.map +1 -1
- package/dist/src/product/claude-product-session.js +2 -2
- package/dist/src/product/claude-product-session.js.map +1 -1
- package/dist/src/product/cursor-product-session.d.ts +16 -1
- package/dist/src/product/cursor-product-session.d.ts.map +1 -1
- package/dist/src/product/cursor-product-session.js +212 -5
- package/dist/src/product/cursor-product-session.js.map +1 -1
- package/dist/src/prv/patterns.d.ts.map +1 -1
- package/dist/src/prv/patterns.js +10 -1
- package/dist/src/prv/patterns.js.map +1 -1
- package/dist/src/safety/canonicalize.d.ts +65 -0
- package/dist/src/safety/canonicalize.d.ts.map +1 -0
- package/dist/src/safety/canonicalize.js +126 -0
- package/dist/src/safety/canonicalize.js.map +1 -0
- package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts.map +1 -1
- package/dist/src/safety/detectors/arbitrary-exec.detector.js +21 -4
- package/dist/src/safety/detectors/arbitrary-exec.detector.js.map +1 -1
- package/dist/src/safety/detectors/destructive.detector.d.ts.map +1 -1
- package/dist/src/safety/detectors/destructive.detector.js +14 -1
- package/dist/src/safety/detectors/destructive.detector.js.map +1 -1
- package/dist/src/safety/filename-safety.d.ts +287 -0
- package/dist/src/safety/filename-safety.d.ts.map +1 -0
- package/dist/src/safety/filename-safety.js +801 -0
- package/dist/src/safety/filename-safety.js.map +1 -0
- package/dist/src/safety/safety-gate.d.ts +7 -0
- package/dist/src/safety/safety-gate.d.ts.map +1 -1
- package/dist/src/safety/safety-gate.js +24 -2
- package/dist/src/safety/safety-gate.js.map +1 -1
- package/dist/src/session/controller.d.ts +259 -0
- package/dist/src/session/controller.d.ts.map +1 -0
- package/dist/src/session/controller.js +286 -0
- package/dist/src/session/controller.js.map +1 -0
- package/dist/src/session/index.d.ts +12 -0
- package/dist/src/session/index.d.ts.map +1 -0
- package/dist/src/session/index.js +12 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/shell/cli/capabilities.d.ts +76 -0
- package/dist/src/shell/cli/capabilities.d.ts.map +1 -0
- package/dist/src/shell/cli/capabilities.js +111 -0
- package/dist/src/shell/cli/capabilities.js.map +1 -0
- package/dist/src/shell/cli/claude-setup.d.ts +43 -0
- package/dist/src/shell/cli/claude-setup.d.ts.map +1 -0
- package/dist/src/shell/cli/claude-setup.js +218 -0
- package/dist/src/shell/cli/claude-setup.js.map +1 -0
- package/dist/src/shell/cli/config-hydration.d.ts +37 -0
- package/dist/src/shell/cli/config-hydration.d.ts.map +1 -0
- package/dist/src/shell/cli/config-hydration.js +68 -0
- package/dist/src/shell/cli/config-hydration.js.map +1 -0
- package/dist/src/shell/cli/draft/intent-to-tasks.d.ts +68 -0
- package/dist/src/shell/cli/draft/intent-to-tasks.d.ts.map +1 -0
- package/dist/src/shell/cli/draft/intent-to-tasks.js +355 -0
- package/dist/src/shell/cli/draft/intent-to-tasks.js.map +1 -0
- package/dist/src/shell/cli/examples.d.ts +94 -0
- package/dist/src/shell/cli/examples.d.ts.map +1 -0
- package/dist/src/shell/cli/examples.js +173 -0
- package/dist/src/shell/cli/examples.js.map +1 -0
- package/dist/src/shell/cli/execution-policy.d.ts +67 -0
- package/dist/src/shell/cli/execution-policy.d.ts.map +1 -0
- package/dist/src/shell/cli/execution-policy.js +73 -0
- package/dist/src/shell/cli/execution-policy.js.map +1 -0
- package/dist/src/shell/cli/execution-summary.d.ts +115 -0
- package/dist/src/shell/cli/execution-summary.d.ts.map +1 -0
- package/dist/src/shell/cli/execution-summary.js +166 -0
- package/dist/src/shell/cli/execution-summary.js.map +1 -0
- package/dist/src/shell/cli/friction-report.d.ts.map +1 -1
- package/dist/src/shell/cli/friction-report.js +16 -8
- package/dist/src/shell/cli/friction-report.js.map +1 -1
- package/dist/src/shell/cli/ir-to-spec-fields.d.ts +47 -0
- package/dist/src/shell/cli/ir-to-spec-fields.d.ts.map +1 -0
- package/dist/src/shell/cli/ir-to-spec-fields.js +138 -0
- package/dist/src/shell/cli/ir-to-spec-fields.js.map +1 -0
- package/dist/src/shell/cli/main.d.ts +42 -20
- package/dist/src/shell/cli/main.d.ts.map +1 -1
- package/dist/src/shell/cli/main.js +1247 -107
- package/dist/src/shell/cli/main.js.map +1 -1
- package/dist/src/shell/cli/normalize-prompt-text.d.ts +67 -0
- package/dist/src/shell/cli/normalize-prompt-text.d.ts.map +1 -0
- package/dist/src/shell/cli/normalize-prompt-text.js +100 -0
- package/dist/src/shell/cli/normalize-prompt-text.js.map +1 -0
- package/dist/src/shell/cli/onboarding.d.ts +10 -3
- package/dist/src/shell/cli/onboarding.d.ts.map +1 -1
- package/dist/src/shell/cli/onboarding.js +105 -29
- package/dist/src/shell/cli/onboarding.js.map +1 -1
- package/dist/src/shell/cli/quickstart.d.ts +41 -0
- package/dist/src/shell/cli/quickstart.d.ts.map +1 -0
- package/dist/src/shell/cli/quickstart.js +159 -0
- package/dist/src/shell/cli/quickstart.js.map +1 -0
- package/dist/src/shell/cli/resolve-spec-path.d.ts +62 -0
- package/dist/src/shell/cli/resolve-spec-path.d.ts.map +1 -0
- package/dist/src/shell/cli/resolve-spec-path.js +56 -0
- package/dist/src/shell/cli/resolve-spec-path.js.map +1 -0
- package/dist/src/shell/cli/spec-nl-synth.d.ts +76 -0
- package/dist/src/shell/cli/spec-nl-synth.d.ts.map +1 -0
- package/dist/src/shell/cli/spec-nl-synth.js +89 -0
- package/dist/src/shell/cli/spec-nl-synth.js.map +1 -0
- package/dist/src/shell/cli/spec-task-builder.d.ts +97 -0
- package/dist/src/shell/cli/spec-task-builder.d.ts.map +1 -0
- package/dist/src/shell/cli/spec-task-builder.js +190 -0
- package/dist/src/shell/cli/spec-task-builder.js.map +1 -0
- package/dist/src/shell/cli/templates.d.ts +142 -0
- package/dist/src/shell/cli/templates.d.ts.map +1 -0
- package/dist/src/shell/cli/templates.js +449 -0
- package/dist/src/shell/cli/templates.js.map +1 -0
- package/dist/src/shell/cli/use-steady.d.ts +196 -17
- package/dist/src/shell/cli/use-steady.d.ts.map +1 -1
- package/dist/src/shell/cli/use-steady.js +2019 -81
- package/dist/src/shell/cli/use-steady.js.map +1 -1
- package/dist/src/shell/cli/workflow-outcome-file.d.ts +13 -0
- package/dist/src/shell/cli/workflow-outcome-file.d.ts.map +1 -0
- package/dist/src/shell/cli/workflow-outcome-file.js +43 -0
- package/dist/src/shell/cli/workflow-outcome-file.js.map +1 -0
- package/dist/src/shell/cli/workflow-terminal.d.ts +44 -0
- package/dist/src/shell/cli/workflow-terminal.d.ts.map +1 -0
- package/dist/src/shell/cli/workflow-terminal.js +69 -0
- package/dist/src/shell/cli/workflow-terminal.js.map +1 -0
- package/dist/src/shell/render-escape.d.ts +81 -0
- package/dist/src/shell/render-escape.d.ts.map +1 -0
- package/dist/src/shell/render-escape.js +104 -0
- package/dist/src/shell/render-escape.js.map +1 -0
- package/dist/src/shell/render.d.ts.map +1 -1
- package/dist/src/shell/render.js +3 -1
- package/dist/src/shell/render.js.map +1 -1
- package/dist/src/shell/tui/app.d.ts +8 -0
- package/dist/src/shell/tui/app.d.ts.map +1 -0
- package/dist/src/shell/tui/app.js +5 -0
- package/dist/src/shell/tui/app.js.map +1 -0
- package/dist/src/shell/tui/components/BlockedReasonPanel.d.ts +21 -0
- package/dist/src/shell/tui/components/BlockedReasonPanel.d.ts.map +1 -0
- package/dist/src/shell/tui/components/BlockedReasonPanel.js +9 -0
- package/dist/src/shell/tui/components/BlockedReasonPanel.js.map +1 -0
- package/dist/src/shell/tui/components/ConsensusPanel.d.ts +27 -0
- package/dist/src/shell/tui/components/ConsensusPanel.d.ts.map +1 -0
- package/dist/src/shell/tui/components/ConsensusPanel.js +14 -0
- package/dist/src/shell/tui/components/ConsensusPanel.js.map +1 -0
- package/dist/src/shell/tui/components/StepList.d.ts +14 -0
- package/dist/src/shell/tui/components/StepList.d.ts.map +1 -0
- package/dist/src/shell/tui/components/StepList.js +34 -0
- package/dist/src/shell/tui/components/StepList.js.map +1 -0
- package/dist/src/shell/tui/components/SystemWillPanel.d.ts +12 -0
- package/dist/src/shell/tui/components/SystemWillPanel.d.ts.map +1 -0
- package/dist/src/shell/tui/components/SystemWillPanel.js +9 -0
- package/dist/src/shell/tui/components/SystemWillPanel.js.map +1 -0
- package/dist/src/shell/tui/components/WorkflowView.d.ts +11 -0
- package/dist/src/shell/tui/components/WorkflowView.d.ts.map +1 -0
- package/dist/src/shell/tui/components/WorkflowView.js +21 -0
- package/dist/src/shell/tui/components/WorkflowView.js.map +1 -0
- package/dist/src/shell/tui/hooks/useWorkflowState.d.ts +10 -0
- package/dist/src/shell/tui/hooks/useWorkflowState.d.ts.map +1 -0
- package/dist/src/shell/tui/hooks/useWorkflowState.js +28 -0
- package/dist/src/shell/tui/hooks/useWorkflowState.js.map +1 -0
- package/dist/src/shell/tui/index.d.ts +8 -0
- package/dist/src/shell/tui/index.d.ts.map +1 -0
- package/dist/src/shell/tui/index.js +10 -0
- package/dist/src/shell/tui/index.js.map +1 -0
- package/dist/src/shell/tui/state-bridge.d.ts +37 -0
- package/dist/src/shell/tui/state-bridge.d.ts.map +1 -0
- package/dist/src/shell/tui/state-bridge.js +137 -0
- package/dist/src/shell/tui/state-bridge.js.map +1 -0
- package/dist/src/shell/tui/types.d.ts +56 -0
- package/dist/src/shell/tui/types.d.ts.map +1 -0
- package/dist/src/shell/tui/types.js +9 -0
- package/dist/src/shell/tui/types.js.map +1 -0
- package/dist/src/shell/workflow-render.d.ts +26 -1
- package/dist/src/shell/workflow-render.d.ts.map +1 -1
- package/dist/src/shell/workflow-render.js +430 -8
- package/dist/src/shell/workflow-render.js.map +1 -1
- package/dist/src/ucp/envelope.d.ts +13 -1
- package/dist/src/ucp/envelope.d.ts.map +1 -1
- package/dist/src/ucp/envelope.js +16 -0
- package/dist/src/ucp/envelope.js.map +1 -1
- package/dist/src/ucp/mappers/map-json-op-command.d.ts +15 -0
- package/dist/src/ucp/mappers/map-json-op-command.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-json-op-command.js +16 -0
- package/dist/src/ucp/mappers/map-json-op-command.js.map +1 -0
- package/dist/src/ucp/mappers/map-workflow-execution-result.d.ts +16 -0
- package/dist/src/ucp/mappers/map-workflow-execution-result.d.ts.map +1 -0
- package/dist/src/ucp/mappers/map-workflow-execution-result.js +17 -0
- package/dist/src/ucp/mappers/map-workflow-execution-result.js.map +1 -0
- package/dist/src/ucp/types.d.ts +28 -1
- package/dist/src/ucp/types.d.ts.map +1 -1
- package/dist/src/understand/completion/completion.d.ts.map +1 -1
- package/dist/src/understand/completion/completion.js +19 -8
- package/dist/src/understand/completion/completion.js.map +1 -1
- package/dist/src/understand/completion/rules.d.ts +74 -2
- package/dist/src/understand/completion/rules.d.ts.map +1 -1
- package/dist/src/understand/completion/rules.js +341 -11
- package/dist/src/understand/completion/rules.js.map +1 -1
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts.map +1 -1
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.js +10 -8
- package/dist/src/understand/disambiguation/detectors/missing-context.detector.js.map +1 -1
- package/dist/src/understand/intent-interpretation/intent-interpretation.js +6 -6
- package/dist/src/understand/intent-interpretation/intent-interpretation.js.map +1 -1
- package/dist/src/understand/intent-interpretation/types.d.ts +20 -0
- package/dist/src/understand/intent-interpretation/types.d.ts.map +1 -1
- package/dist/src/understand/interpretation/parser.d.ts +1 -1
- package/dist/src/understand/interpretation/parser.d.ts.map +1 -1
- package/dist/src/understand/interpretation/parser.js +93 -15
- package/dist/src/understand/interpretation/parser.js.map +1 -1
- package/dist/src/understand/interpretation/types.d.ts +11 -0
- package/dist/src/understand/interpretation/types.d.ts.map +1 -1
- package/dist/src/understand/interpretation/types.js.map +1 -1
- package/dist/src/understand/silent-guidance/selector.d.ts +4 -3
- package/dist/src/understand/silent-guidance/selector.d.ts.map +1 -1
- package/dist/src/understand/silent-guidance/selector.js +18 -3
- package/dist/src/understand/silent-guidance/selector.js.map +1 -1
- package/dist/src/understand/silent-guidance/templates.d.ts.map +1 -1
- package/dist/src/understand/silent-guidance/templates.js +35 -7
- package/dist/src/understand/silent-guidance/templates.js.map +1 -1
- package/dist/src/understand/silent-guidance/types.d.ts +2 -1
- package/dist/src/understand/silent-guidance/types.d.ts.map +1 -1
- package/dist/src/utils/credentials.d.ts +70 -0
- package/dist/src/utils/credentials.d.ts.map +1 -0
- package/dist/src/utils/credentials.js +101 -0
- package/dist/src/utils/credentials.js.map +1 -0
- package/dist/src/workflow/coordinator.d.ts.map +1 -1
- package/dist/src/workflow/coordinator.js +282 -20
- package/dist/src/workflow/coordinator.js.map +1 -1
- package/dist/src/workflow/index.d.ts +2 -0
- package/dist/src/workflow/index.d.ts.map +1 -1
- package/dist/src/workflow/index.js +2 -0
- package/dist/src/workflow/index.js.map +1 -1
- package/dist/src/workflow/spec-hash.d.ts +76 -0
- package/dist/src/workflow/spec-hash.d.ts.map +1 -0
- package/dist/src/workflow/spec-hash.js +116 -0
- package/dist/src/workflow/spec-hash.js.map +1 -0
- package/dist/src/workflow/types.d.ts +88 -3
- package/dist/src/workflow/types.d.ts.map +1 -1
- package/package.json +48 -7
- package/dist/server-admin.d.ts +0 -11
- package/dist/server-admin.d.ts.map +0 -1
- package/dist/server-admin.js +0 -188
- package/dist/server-admin.js.map +0 -1
- package/dist/src/shell/cli/friction-admin.d.ts +0 -14
- package/dist/src/shell/cli/friction-admin.d.ts.map +0 -1
- package/dist/src/shell/cli/friction-admin.js +0 -276
- package/dist/src/shell/cli/friction-admin.js.map +0 -1
- package/ui/README.md +0 -73
- package/ui/dist/ai.txt +0 -14
- package/ui/dist/apple-icon.png +0 -0
- package/ui/dist/assets/index-C_i9832M.js +0 -268
- package/ui/dist/assets/index-D_rglT6E.css +0 -2
- package/ui/dist/favicon-16.png +0 -0
- package/ui/dist/favicon-32.png +0 -0
- package/ui/dist/favicon.svg +0 -22
- package/ui/dist/icon-192.png +0 -0
- package/ui/dist/icon-512.png +0 -0
- package/ui/dist/icon.png +0 -0
- package/ui/dist/icons.svg +0 -24
- package/ui/dist/index.html +0 -19
- 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.
|