News
1.41.0
archied
- Archie now stores everything in PostgreSQL 18, and
database_urlis required. Tasks, events, captures, bindings, settings and chat conversations are served from the databasedatabase_urlnames; the State Store, archied and the Gateway refuse to start without it, and refuse a server older than PostgreSQL 18.docker compose up -d postgresstarts a matching local database with the default URL inconfig.example.toml. - Existing SQLite data is not carried over. This release reads no SQLite
file and ships no importer, so an upgraded install starts with empty task,
event and conversation history.
db_pathis gone;state_dir(default~/.local/share/archie) now holds the embedded NATS store and task logs. - Backups are whole-database snapshots.
archie-state-store backupandrestorework on the PostgreSQL database throughpg_dump/pg_restore, which must be onPATH. There is no automatic schema rollback: the way back from an upgrade is restoring the snapshot taken before it. - Events carry a type, and bindings pick one. Archie infers an event type from captured payloads; the Inspector shows proposed and unidentified events and lets you name them. Mappings are per event type and show how many captures they match, a source can feed several bindings, and a binding chooses an event type plus an optional filter. An unidentified event does not dispatch.
- Sources own webhook signing. Each source gets a UUIDv7 path and its own signing secret, or can be explicitly approved to accept unsigned events. A new binding starts pending approval.
- EDA playbooks can run module actions and take workflow inputs. Action
playbooks run at most once per event through the dispatch ledger, a binding
can pass inputs to its workflow, the repository is optional, and a workflow
can name an agent profile.
archie-playbooks lint -eda-dirchecks a directory, andarchie-playbooks servepublishes the same findings to your editor as a language server. - Config keys removed.
[agent],[oidc],[image],containers.enabled,db_path, and thetoken_envform of[forge],[artifacts]and[chat.telegram]no longer exist. Write each credential astoken = { engine = "env", key = "NAME" }. A leftover key is reported at startup as unrecognised rather than failing the load. - Dashboard. Old
#/pathlinks and the/captures,/mappingsand/bindingsaddresses no longer redirect; use the Events page tabs. The live stream moved to/api/stream, so reloading/eventsserves the page.
archie-agent
- The Postgres-backed wire formats, event types and workflow inputs are part
of this image; a host that runs the agent should
docker compose pull agentto pick it up.
1.40.0
archied
- Every park now says what kind of intervention it needs. A parked task
is classified as
needs you(a decision or fix only an operator can supply),transient(an environment problem – container pool, storage, transport – retry once it is fixed), orterminal(the repository or identity cannot act; retrying cannot succeed). The class shows beside the Parked badge on the dashboard, so “needs you” reads as a request rather than a failure. - Operator retries and review-remediation rounds now have separate budgets. An operator’s manual retries no longer draw down the rounds Archie may spend addressing review feedback on its pull requests, and a round-cap park no longer makes a later retry re-park immediately.
latestnow names the newest release. A push tomainthat is not a release publishesedgeandsha-<commit>instead. A host that was followingmainby pullinglateststops advancing at this release – switch it toedgeto keep trackingmain, or leave it onlatestto follow releases.
archie-agent
- The park-classification wire format is part of this image; a host that
runs the agent should
docker compose pull agentto pick it up.
1.39.0
archied
- Archie now acts on review comments left on its own pull requests. A
requested-changes review (or a standalone comment) on a PR Archie opened
dispatches a remediation run: the smallest change that satisfies the
feedback, committed to the same PR branch and answered in the review
thread. Approved reviews never remediate, each reaction is its own round,
and the exchange is bounded by the repo’s
max_retriesbefore Archie stops and says so on the PR. - The task run page is a master-detail view. The run’s stage rail and detail panels sit beside the run list, so one run’s timeline is visible without leaving the page.
- Live activity groups related updates instead of stacking them by event kind, so a burst of progress on one task reads as one story, and the stage filter resets when you switch attempts.
- Contrast fixes on the info and subtle text tokens clear WCAG AA.
archie-agent
- The review-reaction remediation path is part of this image; a host that
runs the agent should
docker compose pull agentto pick it up.
1.38.0
archied — Event capture, mappings and bindings are PocketBase records
- Captured events, field mappings and playbook bindings live in PocketBase collections instead of SQLite tables. They are ordinary records, which is what lets a binding be changed at runtime rather than by editing a database.
- A read-only operator surface over the task database ships with the State
Store (
archie-state-store -admin-addr). It serves view collections over tasks, transitions, events, identities and resources, and refuses/api/backupsandPOST /api/sql, so it cannot rewrite state or hand out the database file. - A binding cannot go live without approval. It moves draft → pending approval → armed; one binding per source is enforced on insert, on edit and on approval; and an edit always returns it to pending approval. A secret left blank on an edit keeps the stored one rather than disarming a live binding.
- The workspace code-search indexer is gone. No deployment configured it, and it was one more resident writer over the workspace.
archied — Editing a binding or a mapping shows on the activity stream
- A dashboard edit no longer needs a manual refresh. A successful binding or mapping write announces itself on the same activity path a captured event already uses. The announcement carries the record id and the action and the dashboard refetches the record, so the signal cannot go stale.
archied — Cron schedules fire
- A cron job computes its next run and fires. Until this release a cron
schedule was accepted at creation and then refused at run time with
ErrScheduleUnsupported, so a cron job never ran. - The dialect is PocketBase’s, and it differs from Vixie cron on one point.
Day-of-month and day-of-week are combined with AND rather than Vixie’s OR, so
0 0 1 * 1means Monday the 1st, not “the 1st, or any Monday”. The@daily-style macros behave as usual. An expression that can never match, such as0 0 30 2 *, is rejected instead of being left to run forever.
archied — Tool calls are queryable
- Every completed tool call is a row in the
tool_callscollection, not only a line in the on-disk task log. The row carries the task, the attempt, the tool, its result or its error, and when it ran. - A failed projection never fails the task. The event is the record and the collection is a transcript of it, so a copy that could not be written is logged and counted rather than propagated.
archied — A task whose identity no longer resolves parks instead of acting as root
- A task naming an identity archie no longer knows — renamed, retired or removed in the control plane — no longer falls back to the root forge’s credential. It parks with the reason recorded. A task arriving over NATS with such an identity is refused before it is enqueued. A task with no identity is the single-identity root path and is unchanged.
archied — The PR review is published as a readable artifact
- A completed review is rendered to markdown and published to the collaborative editor, so a person reads it and comments on it instead of reading a wall of text in a pull-request comment.
- Publishing never fails the review. With
[artifacts] base_urlunset the sender is not constructed and publishing is a log line; a publish that fails is logged with its status and the same review is republished the next time it completes. Set[artifacts] token(orWORKSPACE_INGEST_TOKEN) to enable it.
archied — The activity feed no longer depends on row ids being monotonic
- The feed’s resume cursor is opaque, and a malformed or pre-upgrade cursor degrades to “from the beginning” rather than failing the stream. One consequence on upgrade: a browser holding a cursor issued before this release replays the backlog once.
archie-agent
- The runtime image is rebuilt by this release, and a host must pull it
(
docker compose pull agent). The shared State Store contract changed shape in the sections above — task and event-capture id fields are strings now — and the two halves are versioned together, so an agent image built before this release does not speak to the new State Store. There are no agent behaviour changes of its own in this release.
1.37.1
archied — A recorded event names the actor in its own fields
- Event attribution survives the trip to the State Store. The acting identity, its kind, and the authorising principal are carried on the event itself, so an audit query finds the actor in its own fields rather than only in the event’s prose. An approval taken through the dashboard is the case that exposed the gap.
archied — A chat reply that contains code renders the way it was written
- A code fence closes only on a run of the same character that is at least as long as the one that opened it. A four-backtick fence, a tilde fence, or a reply that wraps its own code in a longer fence now arrives as code instead of as a broken language tag or paragraphs of leaked text.
archied — A tool call is one line with its own icon
- A tool call takes a single line instead of a label plus a fenced block. Telegram draws a fenced block as a full code widget — language header, copy button and panel — and the block parser inserts a spacer before it, so a handful of calls filled the screen to show a few word counts. Each call now shows the icon its own tool declares, and a tool that declares none renders without one.
- The status word prints only when the outcome is not success. Every tool line previously read “done”, including the ones that had not finished.
archied — Runtime dependencies updated
- Runtime dependencies updated, including the OpenID Connect and OAuth libraries.
1.37.0
archied — A request is attributed to the identity that made it
- A browser can sign in, and an action taken through it records the person. The dashboard validates a
provider-issued token, resolves it to an identity, and attaches it to the request; the task-action record
then names the actor.
Authenticateand the sign-in callback share one resolver, so a browser sign-in cannot be accepted on terms a presented token would be refused on. - archie issues no session. The callback stores the provider’s own token in an HttpOnly cookie and every later request re-verifies it, so nothing archie holds can outlive the provider’s decision and there is no session table to expire, revoke or get wrong.
- The event kind describes the actor. A person’s approval records
human_approvedas that person; an agent’s recordsagent_approved; an action with no authorising principal recordstask_approvedwith the attribution fields empty. Nothing is credited to an identity that did not act, and an unattributed action is recorded as unattributed rather than guessed. - The acting identity is derived from the presented credential and never from a request field: a body
carrying
actor,actor_id,identityand anX-Archie-Actorheader still cannot choose it.
archied — A host install now works, and an update refuses a host it cannot keep consistent
install.shwrites and enables all five host units; previously it seeded onlyarchied.service, so a fresh host ran one service of five and an operator applied the rest by hand from a runbook. The runbook is a description again: it names the units and points atsystemctl --user cat.- Every host binary reports its version, and the updater reads all of them before it can report “nothing to install”. A host whose binaries disagree is refused, naming each one: a newer messaging binary beside an older state store crash-loops against a service the older store does not serve, and that install previously looked healthy from the updater’s point of view.
- The packaged, installer and updater command lists are pinned by a test, so a service added to one and not the others fails the gate instead of shipping a partial install.
archied — A release image can be traced to a commit
- The publish step derives the commit by dereferencing the ref rather than reading
github.sha, because every release tag in this repository is annotated and a tag’s object id is not a commit. An immutablesha-<commit>tag is published alongside:latest, and a build with no release tag is stampeddev+<short sha>rather than a baredevthat identified nothing.
archied — Curator definitions are data, not a second registry
- Curator definitions may come from configuration or code and run through one engine into the existing registry — no parallel authority and no second config reader. A definition declares its tools, and an unknown tool name fails rather than widening the set silently.
1.36.0
archied — The dashboard declares tools an in-browser agent can call
- The dashboard registers seven WebMCP tools. Read-only:
list_tasks,get_task,recent_events,daemon_health. Recovery:retry_task,stop_task,cancel_task. An agent operating the dashboard now reads structured state and recovers stuck work instead of scraping the UI. - Every tool wraps the same
ui/src/lib/api.tsclient the dashboard itself calls, so an agent and a person exercise one path rather than two. archie-uicannot be attributed to the agent that called it: a page can invoke its own tools, so an agent’s call and a page script’s call reach the server identically. Tools therefore record the signed-in identity and a source, and never that an agent acted.
archied — Binaries built by the development build task can be updated
task buildpassed theinstalltypestamp for three of six commands, soarchie-messaging,archie-state-storeandarchie-uiwere built without it. An unstamped binary reportsunknownand the self-update path refuses rather than guesses, which is how an operator ends up unable to update withinstall type is unknownand no way forward. All six are stamped now, and a test reads the build task and fails naming any command line that omits it.
1.35.0
archied — The Messaging Service is severed from the store and workflow runtime
cmd/archie-messagingno longer linksmodernc.org/sqlite,internal/store,internal/domain/workfloworinternal/agentexec. All four arrived through a single import ofinternal/app/controlplane; the client half now lives ininternal/infrastructure/controlplanerpc, and the app package keeps the server, the registry, the seeds, the validators and the schema derivation.- The resource documents are type-aliased back into the app package, so there is one definition read under two names rather than a copy per side.
archied — Channel lifecycle reaches the dashboard
- The Messaging Service reports each channel’s state, recorded per channel: one channel’s failure
marks only itself, a channel that cannot start is marked failed with its reason rather than only
logged, and one that returns is marked stopped.
internal/channels/status.Managerreports each channel’s state. PutChannelStatus/ListChannelStatuscarry that to the dashboard, following the config-snapshot split. The store replaces the reported set, so a channel the reporter stops mentioning is deleted rather than left as a stalerunning; an empty report clears the table, because hosting no channels is a fact worth reporting; and an id-less row is refused, since it could never be replaced or removed by a later report.Service.ReloadChannelroutes to the channel’s own seam and refuses a channel that cannot reload with a reason rather than accepting and ignoring it.ReloadSupportedwas previously declared by name, so a channel could advertise reload with nothing behind it; one function now decides both.
archied — Action playbooks: a second playbook shape, with typed results
- A playbook is now one of two shapes: a workflow playbook (exactly one
workflowaction, unchanged) or an action playbook (one or moremoduleactions in order). A playbook does not mix them. argsandwhenshare one compilation path and one evaluation context, andactions.<id>is typed by the kind that action runs, so a misspelled result field, an unknown id, a map index,in, a comprehension, or a shape-foreign key (kindon aworkflowaction,workflowon amoduleaction) is a load failure rather than a dispatch failure.- Action playbooks load but do not run yet. Routing arrives with the first side-effecting position; the daemon warns at load rather than accepting them silently.
- The CEL environment is built per playbook, because result typing depends on the ids a playbook declares.
ModuleRegistry.DecodeResultturns a kind’s flat map result into its typedResultbefore a later expression reads it. Without it a typed read evaluated against a shape the run never produces, and so silently read null.
archie-agent
The sandboxed runtime links the same shared packages as archied, so this release carries the channel-lifecycle store contract and the stricter action-load errors with it:
- The channel-status store contract (
PutChannelStatus/ListChannelStatus) and its replace-the-set semantics. - Authoritative module ids and stricter action load errors: a misspelled result field, an unknown id,
or a dynamic
actionsread now fails the playbook load rather than the dispatch.
archied and archie-agent move together in this release.
1.34.0
archied — Dashboard: an actionable authentication failure state
- An unauthenticated document request now receives a self-contained HTML page with a
paste-the-token form, instead of plain text. Previously the whole dashboard –
index.html, the bundle and every asset – sat behind the token check, so a bookmarked bare URL returned atext/plain“unauthorised: open the dashboard URL archied logged at startup”, the SPA never ran, and none of the dashboard’s existing failure surfaces were reachable at all. - The response is still 401, with
Cache-Control: no-storeand a CSP. It is deliberately not a 200: a login page served as success would be cacheable, would read as healthy to anything that checks status alone, and a shared cache could hand it to the wrong person. - API and stream callers are unaffected.
application/json,*/*andtext/event-streamrequests keep the plain-text 401, with a test pinning that split so an XHR or anEventSourcereconnect can never start receiving a page. - The auth banner gains a Retry action that re-runs the dashboard’s bootstrap reads, so a recovered session is actionable without a browser-level reload. It deliberately does not re-drive the SSE stream, which already reports its own reconnect state.
- The page’s guidance stays generic: it points at the dashboard URL the daemon logs rather than naming where the token is stored, so the HTTP layer is not coupled to the token file’s location.
1.33.0
archied — EDA: playbook action arguments are compiled at load (J2)
- A playbook action may now declare
args, compiled as CEL expressions when the playbook loads.argsandwhenshare one compilation path and one evaluation context, so an expression written for one works in the other. - Behaviour change: an
argsexpression that does not compile is a load failure, not a runtime miss — the same reject-at-load rule already applied to a binding collision and to an unknownactions.<id>. In practice, a daemon loading a playbook with a malformedargsblock fails at startup rather than part-way through a dispatch. - Compiling several arguments now reports the first bad key deterministically (keys are sorted). Previously it ranged a map, so the reported bad key could differ between runs and the failure was not reproducible.
argsis deliberately inert for now: parsed, compiled and stored, but no shipped position consumes it yet. A consumer arrives with the first side-effecting position.
Not yet decided: how an args evaluation failure behaves at dispatch. The when predicate rule
(error, skip, log) does not obviously transfer, because args is data rather than a predicate, and
silently skipping an action whose arguments failed to evaluate would be a silent failure of exactly
the kind this release train has been removing. It currently propagates the error to the caller, and
that asymmetry is documented at the code. Ratifying it against a real consumer is tracked separately.
Page 4 of 10