Skip to main content
Smithers 0.28.0 is here! It is by far our biggest release: 1,188 commits since 0.27.0, touching 4,232 files. Most of that work went where you cannot see it, into hardening the durable engine until runs survive whatever you throw at them. The features that landed alongside are the kind you feel every day: a Monitor you can operate a fleet from, workflow packs you can install from GitHub or npm, approvals that stay bound to the exact artifact they approved, memory that outlives a run, and a workflow core that now runs in Node.js and the browser.
Smithers 0.28.0 release card listing the headline features

Smithers 0.28.0: a Monitor operations console, installable workflow packs, provenance-bound tasks, memory notes, and a portable workflow runtime.

Upgrading

Behavior changes are collected in the upgrade notes at the bottom.

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.
The Monitor following a live release-canary run from running to completed

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=1 serves chrome-less run pages with fail-closed host-origin messaging.
Navigating the Monitor into a finished run and switching between XML, Frames, and event views

Inspecting a finished run: the execution tree, the XML and Frames views, and the filtered event feed.

The CLI opens the Monitor when a run starts, and 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. eject copies 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.
This is the first release of packs, and we are shipping it as an MVP: the lifecycle commands are real, the registry is young, and you will find rough edges. 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 typed RuntimeAdapter, 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_UNAVAILABLE error.
  • 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 bounded agent | sequence | parallel program 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.
Agent tasks also gain 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, or rejected. 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 enableNoteSearch and searchNotes.
The 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/ui is a new shared component library (shadcn anatomy, theme tokens) behind every seeded workflow UI.
  • The Monitor’s Create UI button runs the create-ui system workflow: one agent writes and verifies a custom UI for any workflow you point it at.
  • init was 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 under examples/.
See the workflow-owned UI migration guide.

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/testing ships 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: pause stops scheduling new work, lets in-flight tasks finish, and parks the run resumably.
  • Demand-driven concurrency: the scheduler raises maxConcurrency when runnable work would starve, and numeric priority orders 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.input on 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/compare and React bindings.
  • A SOTA model registry publishes a canonical model table with benchmark results, a daily research cron, and a drift check.
  • The npm next channel: every fully green main commit now publishes to next automatically, so you can ride main without waiting for a tag.

Upgrade notes

  • Completed-run worktrees are now reaped by default. Set RunOptions.keepWorktrees or SMITHERS_KEEP_WORKTREES=1 to opt out. Dirty or unpushed worktrees are always preserved.
  • Zod input defaults now apply before validation and are visible through ctx.input on a new run.
  • Unsupported nested-loop lanes fail at graph extraction with both loop IDs in the NESTED_LOOP error. Per-item correction loops behind a Parallel or Worktree fork keep working.
  • Installed pack workflows are read-only. Use eject for an editable local copy.
  • up --dry-run prints the graph instead of partially starting a run.
  • supervise requires 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’s pool CLI) 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.