Release 1.31.0
News ·
archied — Dashboard replaced: Preact -> Vue 3 + shadcn-vue
The dashboard is now a Vue 3 application built on shadcn-vue. This is the large piece of this release; it touches every page.
- History routing, a grouped topbar built from components, the violet palette with self-hosted Geist, and a command palette with live tasks.
- Chat is a FAB-opened panel that behaves like a chat window and scrolls its
transcript with
MessageScroller. - Task actions and dangerous approvals are deliberate; the task detail page is a single head strip with honest states; the run page settles its head around an attempts pager, which is hidden for zero or one attempt.
- Appearance and System navigation were refined, with a four-column appearance grid on wide screens.
- A copy pass removed redundant tails and restating descriptions, empty states derive their own titles, and a stuck log read surfaces as an error rather than eternal loading.
- The capture pane is bound to the list it sits beside and reads beside it, not over it.
archied — Events is one page with three tabs
- Inspector, Bindings and Mappings are now tabs of a single Events page.
- The nav entry is always live, the tabs prune by capability, and the three old paths survive as bookmarks that redirect to their tab.
- Tab selection lives in one module (
ui/src/events/tab-selection.ts) that the page uses, rather than a copy of it. feat(tools): a capture-intake sender exists for exercising the Events surfaces.
archied — The channel travels with the message
SessionSource.Platform – the first component of the session natural key, and
the column GetByChannel filters on – was a constant "web", because one
Router serves every channel and named itself after its own. Two things followed:
the per-user identity policy was real code that no production call site reached
with a real channel name, and a curator pass’s write to agent-user memory could
not be read back by the turn that wrote it, because that turn resolved no
UserID.
- The frontends now name the channel they carry (
telegram,email,webhook,web), the channel rides the message, and the Gateway stamps the session from it – falling back to its own name when a sender names none, which is what every existing row holds. - Identity resolution reads the platform off the inbound, so
carriesPersonIdentitydecides something in production: telegram and email resolve a person, the dashboard and a webhook resolve nothing, and an unknown platform fails closed. - Behaviour change: a chat whose active session came from
/newor/branchre-resolves once, because session lookup now filters on the channel’s real name. A chat without/newre-resolves onto the same deterministic id and heals silently. - Deliberately unchanged:
TurnRunnerConfig.Channelstill keys tool availability, so no channel gains or loses a tool in this release.
archied — Control plane: runtime administration, history, and derived schemas
- The State Store’s gRPC server now carries runtime administration, and each process reports which settings version it is running; the dashboard shows it.
- Resource history is exposed so edits can be reviewed and rolled back, and
resource schemas are derived from the documents they describe – the document
editor reads the derived schema (labels from
title,format: duration->1m0s, hints fromdoc), and the abandoned schema-driven card is deleted. - A live settings replacement is checked before it is switched to, the daemon’s state surfaces are folded into one boot step, and a SIGHUP reload re-applies database-owned settings.
- Forge intake settings that nothing reads are now rejected at load.
archied — Configuration: judged where it is owned
- The runtime config overlay is deleted; database-owned settings are judged at the layer that owns them rather than on the file load path.
- A file overlay no longer drops the fields it omits inside a map entry, and a kind with no stored value leaves the file’s value in force.
- The default config path is resolved in one place, and the channel document has its own shape.
archied — State Store: offline backup, restore, validate and rollback
- New offline backup / restore / validate / rollback path.
validateruns boot’s own gate; it no longer replaces the database, reads a kind the store does not hold as its seed, or touches the daemon’s log.- The recovery control-plane server is built on the shared step vocabulary.
archied — Workflow: one step vocabulary and a gate.diff-rules replacement
- The step vocabulary is owned by a family manager registered at each
composition root, replacing
.archie/gate.gowithgate.diff-rules, which fails closed on a change it never read. - Workflow roots are pinned and the dead vocabulary is removed; the workflow pin crosses the wire.
- The schedules resource skips the legacy cron jobs it cannot hold, and the scheduling policy carries the label its trigger pairs with.
archied — EDA: the playbook coordinator reaches production selection
- The playbook coordinator is wired into production workflow selection, so a
matching playbook decides a real task’s workflow at the daemon’s definition
pin, inheriting idempotency from
TaskEnvelope.
archied — Reliability and operations
cronstorewrites a schedule interval as a duration, not nanoseconds – a persisted1mno longer round-trips as60000000000.- Worktrees are cut from the mapped base branch, and the Gateway’s worktree
manager is built so it serves
review_pr. - A late max-uptime callback no longer resurrects teardown state.
- The state store dial installs client keepalive, and its server policy accepts the dialer’s pings; control-plane watch streams re-establish themselves after they end.
/statusserves only the health facts a reply can carry; the daemon reports systemd readiness and loop-driven watchdog heartbeats.- A webhook route path no longer becomes a sender identity.
- A chat session compresses when a turn crosses its context budget.
- The MCP client supports per-server
parallel_tool_calls, carried through the tool-settings projection. - Resource request-ID idempotency keys are scoped to their kind.
- The session curator addresses memory by the deployment’s bot user.
archie-agent
The sandboxed runtime links the same shared packages as archied, so this release carries the control-plane and workflow changes alongside it:
- Runtime administration over the State Store’s gRPC server, resource history, and control-plane apply status on the store contract.
- The shared step vocabulary, owned by a family manager registered at each
composition root, and
gate.diff-rulesin place of.archie/gate.go(fails closed on a change it never read). - The workflow pin crosses the wire.
Runtime-specific changes:
refactor(plugin): the unusedRegistrytype is deleted.yaegiutilrefuses incomplete Yaegi interface wrappers at load rather than running them.- The runtime config overlay is deleted.
- The state store dial installs client keepalive, and the server policy accepts the dialer’s pings.
- The MCP client supports per-server
parallel_tool_calls. - A late max-uptime callback no longer resurrects teardown state.
- A webhook route path no longer becomes a sender identity.
Note: the archie-agent image is rebuilt by this tag through CI
(.github/workflows/deploy.yml); a gateway-only release would not have rebuilt
it. docker compose pull agent is required to pick it up.