[0.4.1] - 2026-05-12
Partner-day-1 hardening release. Closes the SQLite-concurrency gap
that hung the warden-lite audit CLI against a running proxy,
sharpens the operator triage queue, and wires the end-to-end smoke
into CI so future changes can't silently break the day-1 surface.
Changed
- SQLite WAL + busy_timeout on ledger open. Lets the
warden-lite auditCLI read the ledger DB concurrently with a
running proxy (previously the second opener deadlocked on the
writer lock and hung indefinitely).busy_timeout=5000backstops
brief contention with a short wait instead ofSQLITE_BUSY. The
:memory:path silently falls back to a memory-mode journal.
Added
pending listsort + color UX. Triage-queue ergonomics: the
parkedfilter now defaults to oldest-first so the
longest-waiting request reads at the top;decidedandall
default to newest-first (history view). Both can be overridden via
?sort=oldest|neweston the server and--sorton the CLI. The
STATUS column emits ANSI color on a TTY (yellow=parked, green=allow,
red=deny) and stays plain text on pipes or whenNO_COLORis set
(https://no-color.org).scripts/smoke-e2e.sh— partner-day-1 quality gate. Boots
warden-lite from a freshly-built local image on a dedicated docker
network with a Python upstream stub, then exercises all three
verdicts, the yellow-tier park-poll-decide loop, second-decide
409, the decide-token gating (rejecting an agent bearer on the
operator endpoint), and a concurrentwarden-lite auditCLI read
against the same DB file (proves WAL works). 20 checks against
the live HTTP surface; cleans up on exit. Wired into CI so every
push proves the gate. Companion tosmoke-install.sh— this one
verifies they actually work.