Smithers 0.28.0: a Monitor operations console, installable workflow packs, provenance-bound tasks, memory notes, and a portable workflow runtime.
Upgrading
Watch a run happen
Long-running agent work is only as good as your ability to see it and step in. Until now the Monitor mostly answered one question: is it done yet? In 0.28.0 it became the place you operate runs.
A real run streaming into the Monitor: the health verdict, the execution tree, and the event feed all update live as tasks start and finish.
- Run health names the problem. Stalled, stale, orphaned, quota-parked, and terminal runs are diagnosed continuously, and recoverable ones get a one-click Resume.
- Hijack a live agent session in the browser. Every node exposes its real agent session over a PTY websocket. You can take over mid-run without a terminal.
- Transcripts stream live and stay pinned to the newest output while the run works.
- DevTools are built in: an interactive XML tree, frame scrubber, diff view, timeline, scores, quota state, and run and task controls.
- Embed it anywhere.
?embed=1serves chrome-less run pages with fail-closed host-origin messaging.

Inspecting a finished run: the execution tree, the XML and Frames views, and the filtered event feed.
bunx smithers-orchestrator monitor opens it for any existing run or
workspace. See the Monitor guide.
Install workflow packs from GitHub or npm
Workflows you write are files in your repo. Workflows other people write used to be copy and paste. In 0.28.0 they are installable:- Installed packs are read-only, so updates never clobber your edits.
ejectcopies a workflow plus its UI, prompts, styles, and assets into your local.smithers/tree, where it shadows the pack copy. - A pack workflow is addressed as
pack-name:workflow-name; an unqualified local name wins. - Installs and shares are staged and atomic. A failed install rolls back instead of leaving half a pack in your project.
bunx smithers-orchestrator bug tells us what broke. See
Workflow packs, add, and
share-pack.
The approval follows the artifact
A task acting on an approved artifact should stop if that artifact changes after approval. Provenance binding makes the engine enforce that rule:ctx.prove() captures a SHA-256 digest of the exact upstream row, and bind
re-checks it at schedule time. If the row changed, the task parks as
BOUND_STALE instead of acting on stale authority. Workflow code sees the
state through ctx.boundStale(), operators see it through
bunx smithers-orchestrator why, and a correction loop can approve a new
artifact without failing the run. See
Provenance binding.
Node.js, the browser, and everywhere else
Smithers has been a Bun-first project since day one. As of 0.28.0 the workflow core also loads under plain Node.js, and a new browser entry point runs the real driver in a page:- The
WorkflowDriver, renderer, and graph extraction now run behind a typedRuntimeAdapter, with conformance suites on Node, Bun, browsers, Cloudflare Workers, and Vercel. - Node-only operations (filesystem, subprocess, worktrees, sandboxes) fail
closed in the browser with a typed
RUNTIME_CAPABILITY_UNAVAILABLEerror. - Microsandbox, AWS, GCP, Daytona, and Vercel join Cloudflare as first-class sandbox providers, built on a shared provider kit with contract tests for adapter authors.
- The Microsandbox provider maps Smithers images, resources, networking, mounts, snapshots, and sticky workspaces onto local hardware-isolated microVMs, with abort-safe execution and host-enforced lifecycle limits.
<Subflow>can run a workflow module generated at runtime, and child runs carry persisted parent lineage.
Delegation, fixed or adaptive
Two ways to hand a goal to a fleet:<DelegationChain>is the fixed, inspectable pipeline: refine the goal, plan, preview cost, execute, review, score, and re-plan within a bounded budget. It ships in the pack with its own live UI.<Trellis>(experimental) lets a strong model author the plan itself. It writes a boundedagent | sequence | parallelprogram from settled evidence, and Smithers validates and compiles it into ordinary durable tasks in the same run, with immutable recursive fuel and strict output contracts.
maxSchemaRetries to budget or disable hidden
structured-output correction calls, and exhausted delegation leaves now fail
instead of passing as completed work.
Memory that survives the run
The memory package gains append-only notes: observations that outlive the run that learned them, with human review built in.- A note is
pending,accepted, orrejected. Readers get accepted notes that no newer accepted note supersedes. - Consolidation keeps history: a rule that supersedes ten lessons records the relationship without deleting anything.
- Full-text search is opt-in per namespace via
enableNoteSearchandsearchNotes.
incident-runbook-memory example in the repository runs the whole loop:
bank lessons during an incident, propose a consolidated rule, gate it on human
approval, and serve the accepted rule to the next incident. Notes require
SQLite in this release. See the memory reference.
Your workflows own their UI, and init gets out of your way
A workflow now declares its browser and terminal views inline, so the right view opens wherever the workflow runs:smithers-orchestrator/uiis a new shared component library (shadcn anatomy, theme tokens) behind every seeded workflow UI.- The Monitor’s Create UI button runs the
create-uisystem workflow: one agent writes and verifies a custom UI for any workflow you point it at. initwas redesigned around your agent. It asks one question (which agent you use) and then opens a hijacked tutorial session where that agent gets you started. The install is focused on authoring workflows; the old starter pile lives on underexamples/.
Ask the CLI what happened
worktree list shows which run owns each worktree, and prune never touches
dirty worktrees or branches with unpushed commits.
You can also forecast cost before you spend it: the repository <Estimate>
component has a cheap agent predict per-task tokens and iterations while
deterministic shared pricing computes the total, running beside the real work
without blocking it.
The hardening release
Here is the honest shape of 0.28.0: 424 of its 1,188 commits are fixes, and another 244 are tests, many of them written specifically to hunt bugs in the durable engine before you could hit them. Cancellation, quota parking, time travel, database migration, Gateway streams, resume, and the scheduler all came out of it stronger. If a run crashes, stalls, loses its owner process, or runs out of quota mid-flight, 0.28.0 recovers it more predictably than any release before it. Two pieces of that work are directly usable:@smithers-orchestrator/testingships a workflow simulator plus a deterministic scenario kernel with seeded scheduling, replay bundles, and real-database adapters, so you can test your own workflows the way we test the engine.- A security pass across the toolchain: credentials no longer follow cross-origin redirects, pack and token writes are staged and atomic, approval restrictions fail closed, Gateway websocket admission is bounded and authenticated, destructive time travel prompts for confirmation, and secrets are recursively redacted from observability output.
Other improvements
- Graceful pause:
pausestops scheduling new work, lets in-flight tasks finish, and parks the run resumably. - Demand-driven concurrency: the scheduler raises
maxConcurrencywhen runnable work would starve, and numericpriorityorders tasks competing for a slot. failurePolicy="quarantine"isolates a failed child without failing the whole run.- Quota parking got smarter: runs fail over to another agent before parking, auto-wake at the known reset time, and can now be cancelled.
- Zod defaults apply: defaults in the workflow input schema are finally
present in
ctx.inputon a new run. - Snapshots are cheaper: content-addressed payloads deduplicate identical states, and frame snapshots are incremental.
- Saved eval suites and cross-run score comparison land in the Gateway,
with
GET /v1/api/scores/compareand React bindings. - A SOTA model registry publishes a canonical model table with benchmark results, a daily research cron, and a drift check.
- The npm
nextchannel: every fully green main commit now publishes tonextautomatically, so you can ride main without waiting for a tag.
Upgrade notes
- Completed-run worktrees are now reaped by default. Set
RunOptions.keepWorktreesorSMITHERS_KEEP_WORKTREES=1to opt out. Dirty or unpushed worktrees are always preserved. - Zod input defaults now apply before validation and are visible through
ctx.inputon a new run. - Unsupported nested-loop lanes fail at graph extraction with both loop IDs
in the
NESTED_LOOPerror. Per-item correction loops behind aParallelorWorktreefork keep working. - Installed pack workflows are read-only. Use
ejectfor an editable local copy. up --dry-runprints the graph instead of partially starting a run.superviserequires an explicit scope and resumes only runs whose recorded owner process is verifiably dead.- Memory notes and note search require SQLite. Trellis is experimental and
outside the default init pack.
PoolAgent(Poolside’spoolCLI) is exported but never auto-configured.
The full changelog
This page is the tour. The complete, dry list of every change in 0.28.0 lives in CHANGELOG.md on GitHub. If you hit anything rough,bunx smithers-orchestrator bug files a report
with scrubbed run context straight to us. Happy shipping.