
A release-canary run streaming through the Monitor: the health banner, execution tree, and event feed update live until the run lands on Completed with 4/4 tasks done.
Upgrading
Time travel that respects side effects
The danger was never the state Smithers owns; it was the state you touched along the way: the Slack message, the deploy, the charge. Mark a task whose callback changes the outside world, and register compensation:- Rewind, fork, replay, and
jumpToFramerun an effect-boundary guard. Crossing a marked effect triggers its revert handler; an effect with no way to compensate blocks the operation with a new error code,TIME_TRAVEL_SIDE_EFFECT_BLOCKED, instead of quietly re-firing it. - The diagnosis follows you everywhere.
rewindandtimetravelprint the effect-boundary report;why,status, and the MCP tools expose the same diagnosis; and the Gateway RPC surface acceptsforceandnoRevertand returns aneffectBoundaryreport so custom run UIs can render the guard. - The journal is observable. The
SmithersEventunion gains side-effect journal event types, so dashboards and OTLP exporters see effect transitions as they happen.

Inspecting a finished run in the Monitor: the execution tree, the node inspector with transcript and output, Debug power tools with the engine XML view, and frame-by-frame scrubbing with the Frames control.
authoring-side-effects eval suite (70
fixture workflows plus handwritten cases and a harness) and a
gradeSideEffectCompliance scorer statically grade whether a workflow
marks and reverts its side effects.
See the external side effects section of the
Task docs and the
time-travel quickstart.
Claude Opus 5 becomes the default implementer
If you use the shipped registry defaults rather than a customagents.ts, the model doing most of your work changed. SOTA registry v7
routes the implement and smart seats in CLI-generated agent pools to
Claude Opus 5; registry v6, also in this release, had already handed it
the orchestrator seat that Claude Opus 4.8 held. GPT-5.6 Sol and Terra
move to the review, validation, and checking seats.
- Cost scoring prices
claude-opus-5at 25 per million output tokens, the same as Opus 4.8. smithers oneshotfalls back in a new order: Claude Opus 5, then Codex Sol, then Kimi K3, then Claude Fable 5.
Point Opus 5 at your open issues
The newopus5-bug-sweep pack workflow applies the routing change:
Claude Opus 5 triages your open GitHub issues, fixes the straightforward
bugs in parallel jj worktrees, lands each fix through a serialized
compare-and-swap merge queue, gates the result with install, typecheck,
and lint in a scratch worktree, then pushes main and closes the issues.
It ships with a live UI.
Reliability and security
This release closes 82 fix commits out of 138 total, most of them triaged, fixed, and landed by theopus5-bug-sweep workflow above running against this
repo’s own issue tracker. The most noticeable, with a security pin first:
- CVE-2026-59892 is closed. The vulnerable
@opentelemetry/propagator-jaeger2.7.1 arrived transitively through@effect/opentelemetry; the workspace now forces 2.9.0 through its dependency overrides in both lockfiles. - Custom run UIs stop going silently stale. Provider-owned gateway clients are disposed when replaced or unmounted, so a React StrictMode replay or Activity hide/show can no longer leave a UI reading from a closed client (#906), and provider recreation now accounts for every behavior-affecting option (#904).
bunx smthrs uiand gateway autostart got honest. Autostart waits scale instead of racing,START_IN_PROGRESSreports what is actually happening, and workflow UIs mount lazily (#1362).bunx smthrs events --watchtails instead of replaying. It no longer dumps the run’s full history before following new events (#1355).- The bash tool stops over-blocking. With network access off, the denylist scanned every argument token and rejected benign local commands; it now matches actual network use (#691).
- Webhook deliveries no longer double-fire on Postgres. The dedupe contract
held on SQLite but the Postgres
ON CONFLICTloser still reported success (#682). bunx smthrs skills add/list/updatework headless. The commands own the curated skill and no longer gate on a TTY (#1377).bunx smthrs worktree prunereclaims landed lanes. Fully-landed jj lane workspaces were misread as unsaved work due to colocated git HEAD skew and held forever (#1379).- Retried agent attempts survive a busy runner. The engine clears a busy SingleRunner close before retrying instead of failing the attempt.
- Shared agent pools close cleanly. Lifecycle races when several tasks share one pool are fixed, and OMP agents gained RPC fallback parity.
- Long runs stay bounded in the Monitor. DevTools retains a bounded number of tool calls per task (#869), replaying a full event log no longer duplicates tool calls (#713), and finish invalidation stays correct when the event ring evicts (#864).
- Time travel got safer on the edges. A busy or rate-limited rewind
retries instead of writing a terminal failed audit (#680), a VCS revert that
fails mid-operation now flags the run instead of leaving it silently
half-reverted (#679), and
restorecan no longer hang the CLI on an unbounded jj restore (#684). - The TUI stops lying under churn. The hijack picker follows the node you chose rather than a row index (#726), and timeline scrubbing anchors to the frame, not a drifting ring position (#698).
- OpenAPI tools serialize like the spec says. Array and object params get
real form/explode serialization instead of
String()(#715), templated server URLs substitute their variables (#716), and digit-only string examples stay strings in generated YAML (#703). - Streams and saves hardened.
streamRunEventsResilientno longer hangs on a server backpressure disconnect (#702),mutate()stops leaking SSE change-streams (#731), and local UI file saves are atomic, mode-preserving, and protected against concurrent overwrites (#909, #910). - Prompt rendering and components. Ordered lists in agent prompts keep
their step numbers (#700), duplicate
Panelpanelist labels no longer collide into aDUPLICATE_IDcrash (#694), and Telegram message splitting stops breaking MarkdownV2 escapes and surrogate pairs (#739). - Account logins are detected authoritatively. Registration asks the provider instead of sniffing the config directory, so stale directories no longer read as logged-in seats.
- jj workspaces survive symlinked paths. The engine resolves symlinks when verifying workspace roots, fixing worktree verification on macOS /tmp-style paths.
- Sandboxes respect their limits. A GCP Cloud Run abort during setup
cancels the run (#724) and Vercel
extendTimeouttreats the plan cap as absolute (#741).
Docs for humans, docs for agents
The docs site now separates its two audiences. The Product API tab is for you: a Platform Capabilities catalog of what you can ask for in plain English, setup pages for each harness (Claude Code, Codex, Cursor, Copilot, Pi, Hermes, OpenClaw), and a Set Up Semantic Memory page covering Hindsight andHINDSIGHT_URL. The Technical API tab is the agent-facing
reference, and its entry pages now say so.
Other improvements
- Agent seats load-balance across an account fleet. Register several Claude or Codex accounts and Smithers picks the seat per attempt from usage-probe headroom instead of pinning one subscription, so big campaigns stop parking on a single exhausted window.
- System runs stay out of your way. Internal runs (autopsies, mirrors)
carry a fail-closed visibility stamp and are excluded from run listings
unless a caller opts in with
includeSystem. - Cursor joins the agent adapters.
CursorAgentdrives Cursor’s headless CLI inside workflow tasks, parsing tool calls from its real stream shape, and the agent docs scaffold it alongside Codex. Contributed by Ralf Boltshauser. - Postgres connections stay bounded. Workflows sharing a Postgres store now draw from one bounded pool (default 16) that fails saturation loudly instead of exhausting the server.
jjhub-issue-fleetpack workflow. Fans each open GitHub issue into its own jjhub sandbox VM with a Codex lane and returns PRs, with a live fleet UI.- Every
@smthrs/uicomponent has a browsable catalog: 47 stories at storybook.smithers.sh. - Launching Smithers from the Claude Code native Workflow tool no
longer crashes. That tool’s script sandbox defines no Node globals,
so the mirror script stopped referencing the bare
processglobal.
Community thanks
Thank you to the external contributors in this release:- Ralf Boltshauser (@ralfboltshauser)
contributed the whole
CursorAgentadapter: the CLI integration, its stream parsing, and the docs scaffolding alongside Codex. - Leonardo Cascianelli (@H3xept) kept the OMP engine moving: streaming runs now default to persistent RPC, and tool-call args survive start/update events.
- @mindfather made shared Postgres pools bounded, the fix behind the pool defaults above.
- orbisai0security reported and patched CVE-2026-59892, resolved via the dependency override above.
- @paolohajinz75 added the repo
.editorconfig.
bunx smthrs bug files a report
straight from your terminal.
Upgrade notes
-
Run listings no longer include system runs (post-failure autopsies and
other internal workflows). Pass
includeSystemtolistRunsor the CLI debug surfaces if you relied on seeing them. - DB migrations 0031 (the side-effect journal) and 0032 (tool-call tokens) run automatically through the existing schema-migrations runner the first time an upgraded CLI touches a workspace. No manual steps.
-
sideEffectis opt-in. A workflow that never sets it has no effect boundaries, so rewind, fork, and replay behave exactly as before. -
Shipped registry defaults now route the implement, smart, and
orchestrator seats to Claude Opus 5, and
oneshotprefers Opus 5 before Codex Sol, Kimi K3, and Claude Fable 5. A customagents.tsis unaffected.
The full changelog
The complete commit-level history for this release is in CHANGELOG.md. Found a bug? Runbunx smthrs bug to file it.