Upgrading
Task-shaped oneshots and release review
smithers oneshot now chooses its first available model from the goal shape.
UI and frontend goals lead with Kimi K3, while general implementation goals
lead with Claude Opus 5. Explicit --agent and --model choices still win,
and smithers oneshot --status reports the resolved task type and chain.
The built-in pack also gains review-since-publish, a three-model review panel
that compares the working tree with the last published tag, merges verified
findings, partitions fixes into file-disjoint lanes, and repeats until clean.
Monitor workflows: a workflow that watches your workflow
Long runs fail in boring ways: a node wedges, an agent stalls, and nobody is watching at 3am. Now you can ship a monitor alongside any workflow. Drop a file at.smithers/monitor/<workflowId>.tsx and Smithers runs it against
every run of that workflow: it observes health, applies the healing actions
you define for stalled or wedged-node conditions, and escalates to a durable
HumanTask when it cannot fix things itself.
- Healing actions are ordinary workflow code, so a monitor can retry a node, resume a parked run, or gather diagnostics before waking you.
- Escalations are durable human requests, so the question survives restarts
and shows up in
bunx smithers-orchestrator humanand the Monitor UI. - This is a first release of the surface; expect the condition vocabulary to grow in coming versions.
Resume a run whose workflow you edited
Editing a workflow file while one of its runs was parked used to be a dead end: resuming failed withRESUME_METADATA_MISMATCH and your only option was
forking a fresh run. Now you decide:
- The run carries the edited workflow forward from the resume point.
- The mismatch error now names the flag, so the fix is in the message.
The CLI watcher speaks up sooner
smithers claude monitor used to alert only on discrete bad transitions, so a
run that was quietly retrying the same node forever, or emitting nothing at
all, never broke the silence. It now fires on retry churn (node-retrying)
and on long silence from a live run (run-progress), so a wedged detached run
pings you instead of wasting an afternoon.
Oneshots got the same attention: smithers monitor <runId> now serves a
dedicated live UI for built-in oneshots where you can watch the transcript and
steer the agent mid-run. The oneshot and hijack surfaces now share one
OneshotSurface component, so steering works the same everywhere.
Right-sized authoring and honest review verdicts
Two authoring-loop fixes reduce wasted runs:create-workflownow right-sizes the request before building anything. A trivial edit is routed directly, a well-scoped goal goes tosmithers oneshot, and only genuinely multi-stage work gets a full workflow scaffold.- Review verdicts now distinguish
blocked(the verification could not run for an environmental reason, such as a missing service) fromapproved: false(a real rejection). Harness faults no longer read as rejected work.
smithers oneshot also warns when the working copy is dirty and has the agent
triage the leftover changes before starting on your goal, instead of silently
building on top of them.
Durability hardening
This is where much of the release’s hardening work went.- Async
depscallbacks complete when they finish, not before. A<Task deps>async function child could be claimed complete while its work, including a launched child run, was still pending, so downstream tasks read an empty payload. The engine now awaits the callback before claiming completion (#1415). - Child runs behave like part of the run. A large batch of subflow fixes landed: cancel and pause now propagate to child runs, approvals keep the right owner, signals are preserved across child waits (#1405), snapshot lineage stays isolated, failed child branches all reset on retry (#1410), subflow rewind leases are hardened (#1411), and child runs keep gateway attribution (#1389) and appear in run lists.
- Time travel restores real bytes. jj attempt pointers recorded the
change id, and since jj resolves a change id to its current commit,
revertandtimetravelcould resolve to the very state you were trying to leave: a silent filesystem no-op. Pointers now pin the immutable commit id. - The network sandbox keeps loopback open.
allowNetwork: falsewas cutting off local dev servers, local Postgres, and unix sockets along with the internet. Loopback now stays reachable while remote egress is still denied, and denial errors name the--allow-networkescape hatch. - Evals stop blaming your workflow for harness deaths. A red case whose
failure matches a harness signature (network, DNS, OOM, rate limit) is now
graded INCONCLUSIVE instead of failed, and
bunx smithers-orchestrator evalexits with code 5 when every red case is inconclusive, so CI can retry instead of reverting good work. - Subflow timers wake durably. Parent subflows now persist their child timer deadline, close stale waiting attempts, and resume through the gateway timer sweep instead of parking forever.
- Event waits reject stale matches. A new wait cannot consume an older matching signal that predates the wait node.
Other improvements
- Gateway RPC, REST, SDK, and MCP surfaces gained typed queries for a run’s child-run descendants and direct children, with regenerated contracts and docs (#1391).
- New
packages/ui-coreandpackages/tui-uipackages extract the shared runs domain (run list, tree, event frames, health, and view models) used by both the TUI and the web UI. - The approval panel gained accessibility improvements, loading skeletons, and richer decision feedback.
- A new
eval-driven-developmentskill documents red-classify-first, green-ratchet, and circuit-breaker discipline for automated repair loops. - Dependency ranges widened for effect, zod, and pglite, and mermaid is now an optional peer dependency.
- New docs: capability pages, a monitor workflows guide, and a compatibility policy page.
- Whole Foods ordering webhooks must match the server-configured HTTPS endpoint and resolve only to public addresses, closing input-driven SSRF and redirect paths.
- The TUI run search now captures printable keys without triggering global shortcuts, and unknown backend statuses stay out of active-run counts.
Upgrade notes
- If a resumed run previously failed with
RESUME_METADATA_MISMATCHafter an in-flight workflow edit, re-run withretry-task --accept-workflow-change(orup --resume --accept-workflow-change) instead of forking a fresh run. - Workflows using
<Task deps>with async function children should confirm downstream consumers were not silently reading an empty{}payload before this release; the compute bridge now awaits the callback before claiming completion. - Sandboxed tasks with
allowNetwork: falsecan now reach loopback services. If you relied on loopback being blocked, that is no longer the case. bunx smithers-orchestrator evalcan now exit with code 5 (all red cases inconclusive). CI scripts that treat any nonzero exit as a regression should handle it as a retry signal.
The full changelog
This page is the tour, not the inventory. The complete commit-level list is in CHANGELOG.md on GitHub. Found a bug?bunx smithers-orchestrator bug files it with run context
attached.