> ## Documentation Index
> Fetch the complete documentation index at: https://smithers.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# 0.28.0

> Our biggest release ever: a Monitor you can operate a fleet from, workflow packs you can install from GitHub or npm, provenance-bound approvals, memory that outlives a run, Node.js and browser support, and 424 fix commits of engine hardening.

**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.

<Frame caption="Smithers 0.28.0: a Monitor operations console, installable workflow packs, provenance-bound tasks, memory notes, and a portable workflow runtime.">
  <img src="https://mintcdn.com/smithers/KGrNWwyQJs3Q0YLA/images/0.28.0/hero.svg?fit=max&auto=format&n=KGrNWwyQJs3Q0YLA&q=85&s=eeed225049ef32d4e7fe257e0e12ae3a" alt="Smithers 0.28.0 release card listing the headline features" width="1600" height="900" data-path="images/0.28.0/hero.svg" />
</Frame>

## Upgrading

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
bunx smithers-orchestrator update        # upgrade the CLI
bunx smithers-orchestrator upgrade       # agent-assisted: reads the changelogs and applies what your project needs
bunx smithers-orchestrator packs update  # refresh installed workflow packs
```

Behavior changes are collected in the [upgrade notes](#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.

<Frame caption="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.">
  <img src="https://mintcdn.com/smithers/5K3ynXXRBtWCRTfg/images/0.28.0/monitor-live.gif?s=78f14a1dddd73b18f9c7e66336024ab4" alt="The Monitor following a live release-canary run from running to completed" width="1200" height="750" data-path="images/0.28.0/monitor-live.gif" />
</Frame>

* **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.

<Frame caption="Inspecting a finished run: the execution tree, the XML and Frames views, and the filtered event feed.">
  <img src="https://mintcdn.com/smithers/5K3ynXXRBtWCRTfg/images/0.28.0/monitor-tour.gif?s=673d77618af9efe272bdad3ea4ca3f91" alt="Navigating the Monitor into a finished run and switching between XML, Frames, and event views" width="1200" height="750" data-path="images/0.28.0/monitor-tour.gif" />
</Frame>

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](/guides/monitor).

## 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:

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
bunx smithers-orchestrator add acme/review-pack --yes   # from a GitHub repo
bunx smithers-orchestrator add npm:@acme/review-pack    # from npm
bunx smithers-orchestrator packs update                 # refresh every locked pack
bunx smithers-orchestrator eject review-pack:review     # make a local, editable copy
bunx smithers-orchestrator share --dry-run              # publish your own pack
bunx smithers-orchestrator remove review-pack           # uninstall
```

* 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](/reference/packs), [`add`](/workflows/add), and
[`share-pack`](/workflows/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:

```tsx theme={"theme":{"light":"github-light","dark":"github-dark"}}
const approval = ctx.prove("review", { nodeId: "lane:review" });

<Task id="lane:publish" bind={approval} agent={publisher}>
  Publish the reviewed artifact.
</Task>
```

`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](/concepts/provenance).

## 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:

```js theme={"theme":{"light":"github-light","dark":"github-dark"}}
import { runBrowserWorkflow } from "smithers-orchestrator/browser";
```

* 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>`](/components/delegation-chain)** 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>`](/components/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.

```js theme={"theme":{"light":"github-light","dark":"github-dark"}}
await store.saveNote({
  namespace: OPS,
  body: "Deploys that touch the schema need a warm replica first.",
  kind: "lesson",
  tags: ["deploys"],
  provenance, // the run, node, and iteration that learned it
});
```

* 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](/reference/memory).

## 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:

```tsx theme={"theme":{"light":"github-light","dark":"github-dark"}}
<Workflow name="release">
  <UI entry="../ui/release.tsx" title="Release" />
  {/* ...tasks... */}
</Workflow>
```

* `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](/guides/workflow-owned-ui-migration).

## Ask the CLI what happened

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
bunx smithers-orchestrator status RUN_ID   # health verdict, blockers, throughput
bunx smithers-orchestrator what RUN_ID     # an agent narrates the recorded facts
bunx smithers-orchestrator why RUN_ID      # why the run is blocked or paused
bunx smithers-orchestrator pause RUN_ID    # finish in-flight work, park resumably
bunx smithers-orchestrator worktree prune  # reclaim completed-run worktrees
bunx smithers-orchestrator review          # code review + HTML walkthrough
```

`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](https://github.com/smithersai/smithers/blob/main/CHANGELOG.md).

If you hit anything rough, `bunx smithers-orchestrator bug` files a report
with scrubbed run context straight to us. Happy shipping.
