---
title: "Smithers 0.25.1: Migration and CLI hardening from real dogfood"
slug: "smithers-0-25-1"
date: "2026-06-23"
excerpt: "Smithers 0.25.1 is a focused patch release for operators migrating 0.25 stores, with clearer migration failures, safer account loading, fixed negated CLI flags, Gateway JWT hardening, and provider-aware Pi diagnostics."
---

# Smithers 0.25.1: Migration and CLI hardening from real dogfood

Smithers 0.25.1 is a production-hardening patch for the 0.25 backend migration path. The user-visible shift is simple: migration and operator commands now fail closer to the real problem, with clearer guidance, instead of leaking lower-level errors or blocking on stale local configuration.

Smithers is the durable runtime layer for long-running coding agents: persisted state, retries, approvals, replay, sandboxes, evals, and observability. For that runtime to be dependable, upgrade paths and diagnostics need to be boring. This release focuses on exactly that.

## Migration fixes

The main work in 0.25.1 is around `bunx smithers-orchestrator migrate`.

Corrupt legacy SQLite source stores now produce actionable `DB_QUERY_FAILED` guidance instead of raw SQLite engine errors. The failure preserves the underlying cause, but the message points operators toward useful next steps such as checking integrity or restoring from a known-good backup. These failure paths leave the source store untouched.

Unopenable legacy SQLite stores are handled the same way. Locked files, permission failures, and incomplete copies that are missing SQLite sidecar files are now wrapped with Smithers migration guidance rather than exposed as raw `bun:sqlite` failures. That matters during backend migration because the command should tell you whether the store itself cannot be opened, not force you to reverse-engineer the storage layer from an engine exception.

PostgreSQL migrations also validate target configuration earlier. When running `bunx smithers-orchestrator migrate --to postgres`, Smithers now checks for `--url`, `SMITHERS_POSTGRES_URL`, or `DATABASE_URL` before opening the source store. Missing Postgres configuration is reported directly instead of being masked by a separate source-store problem.

## Accounts and CLI fixes

0.25.1 also tightens command startup behavior for existing local environments.

Older `accounts.json` files may contain provider entries that no longer exist, such as a legacy `gemini` subscription account. Smithers now skips unknown or legacy providers with a warning and continues loading the remaining valid accounts. That keeps commands such as `bunx smithers-orchestrator init` from failing the entire account file because of one stale entry. Users can still remove stale entries manually to silence the warning.

Documented negated CLI flags now parse correctly. `--no-vcs`, `--no-deps`, and `--no-mcp` are accepted instead of being rejected as unknown flags. This fixes the behavior for workflows and recovery commands that rely on those documented switches, including time-travel flows using flags such as `bunx smithers-orchestrator timetravel --no-vcs --no-deps`.

Gateway JWT auth also rejects non-canonical base64url signature encodings. That closes an edge case where a mutated compact JWT signature segment could decode to the same HMAC bytes on some runtimes because of unused trailing base64url bits. On top of that, the `allowedOrigins` Origin allow-list now applies to the `token` and `jwt` auth modes, not just `trusted-proxy`. Those are the modes a browser-facing `smithers ui` deployment actually uses, so operators can now restrict which web origins may connect, enforced at both the HTTP RPC path and the WebSocket upgrade.

## Agent and run fixes

`<Task>` preflight now honors Codex CLI subscription auth. When `OPENAI_API_KEY` is unset, Smithers reads `<CODEX_HOME>/auth.json` the same way the codex binary does, so ChatGPT subscription tokens pass while a stored but invalid key still fails preflight. Subscription-authed Task runs that previously tripped the `api_key_valid` diagnostic now work.

Finished runs also surface masked child failures. A fan-out can reach a `finished` terminal even when `continueOnFail` tasks or transient agent failures (rate limits, timeouts, aborts) failed underneath. Smithers now carries `failedChildren` and `failedChildKeys` on the result, the `RunFinished` event, and the run span, so a mostly-failed fan-out no longer reads as a clean success. `inspect` and `events` render the count.

## Pi diagnostics

Pi launch diagnostics are now provider-aware.

Before this patch, unknown providers could fall through to Google auth preflight checks. In 0.25.1, Smithers skips provider auth preflight when it cannot infer the provider and lets Pi handle its own authentication. For known providers or model hints, diagnostics now map to the matching API key environment variable for OpenAI, Anthropic, or Google.

That makes diagnostics more useful for long-running agent work because startup checks should identify missing known configuration without incorrectly blaming the wrong provider.

## Dogfood evidence

These fixes came out of migrating real Smithers stores. Internal dogfooding migrated 12 real stores and checked run-ID parity, inspect parity, fresh compute runs, Gateway reads, and time-travel behavior on the migrated PGlite backend.

The result is not a new feature launch. It is a patch release aimed at making the 0.25 migration path and related operator commands behave more predictably under real local state.

## Upgrade notes

There are no breaking changes identified in the 0.25.1 commit range.

If you are migrating a legacy SQLite store to PostgreSQL, provide `--url`, `SMITHERS_POSTGRES_URL`, or `DATABASE_URL`. 0.25.1 reports that requirement before trying to open the source database.

If migration reports `DB_QUERY_FAILED` for a corrupt or unopenable source store, follow the emitted guidance. The source SQLite store is left untouched by these failure paths.

If an old `accounts.json` contains a removed or unknown provider, Smithers now skips that entry and loads the remaining valid accounts. Remove stale entries manually if you want to silence the warning.

Read the full changelog at [smithers.sh/changelogs/0.25.1](https://smithers.sh/changelogs/0.25.1).
