assist v0.234
A day of backlog polish
A grab-bag day, all of it sanding down rough edges on the backlog flow I’ve been living in. The command ergonomics got the most attention. backlog run and backlog next now default to auto permission mode — running an item almost always means I want Claude to edit, so -w/--write became the default and a --no-write opt-out was added rather than forcing the flag every time. I added a refine alias on the backlog command, and while I was in registerBacklog I pulled the long list of registerX(cmd) calls into a registrars array that gets iterated, so adding a command is one line instead of two. The other ergonomic win was pullIfConfigured — when commit.pull is set, backlog commands now run git pull --ff-only first and abort on failure, so I stop running an item against a stale tree.
The data layer got a targeted-writes pass. After the Drizzle move, per-item commands were still loading the entire backlog into memory, mutating one item, and saving everything back. I replaced loadAndFindItem with findOneItem, which does a single targeted read by id and hands back the resolved orm so the caller can follow up with a targeted write. The whole-backlog saveBacklog is still there for import/restore tooling that genuinely needs to reconcile everything, but the common path no longer round-trips the world to touch one row.
The web UI got some polish too: a loading spinner on the backlog list while a search is in flight (the body moved into its own ListBody component), backlog chips now derive their colours from the active theme’s contrast instead of hard-coded values, and a fix so the backlog tab navigates back to the list rather than getting stuck on whatever sub-view it last showed. Last, a fix to a phase-rewind edge case: if Claude appended a phase while sitting in the review slot — all authored phases done — the usual index shift kept currentPhase pointing at review, so the new phase got skipped on restart. insertPhaseAt now detects the review slot and rewinds currentPhase to the inserted phase so it actually runs before review.