Skip to content

    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 carriesPersonIdentity decides 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 /new or /branch re-resolves once, because session lookup now filters on the channel’s real name. A chat without /new re-resolves onto the same deterministic id and heals silently.
    • Deliberately unchanged: TurnRunnerConfig.Channel still 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 from doc), 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.
    • validate runs 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.go with gate.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

    • cronstore writes a schedule interval as a duration, not nanoseconds – a persisted 1m no longer round-trips as 60000000000.
    • 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.
    • /status serves 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-rules in 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 unused Registry type is deleted.
    • yaegiutil refuses 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.