Changelog
All notable changes to Ariel are recorded here, in the style of Keep a Changelog.
Ariel is pre-1.0: a release bumps the minor version for new features and the
patch version for fixes alone. The crates are not published to crates.io; a
release is the container image ghcr.io/caliban-ai/ariel, built for
linux/amd64 and linux/arm64 on every v* tag.
Unreleased
0.4.0 - 2026-10-06
Ariel says whose agent it is, and stops missing the quick ones.
A channel could see that an agent started but not whose it was: Ariel holds one
operate token for a whole Discord, so every spawn was attributed to ariel.
Agents now carry the person who asked for them, from the chat command through
prosperod to the live message. And the notifier no longer polls: it watches
prospero's fleet-wide stream, so an agent that starts and finishes between two
old five-second polls — previously invisible — is announced like any other.
This release needs prosperod v0.9 or later. The fleet stream is where every notification now comes from, and a v0.8 daemon does not serve it.
Added
-
An agent started from chat says who started it (#59). Ariel holds one
operatetoken for a whole Discord, so prosperod'sactorreadarielfor every spawn and a channel could not tell one person's agents from another's. Ariel now names the person on the requests a command makes, using prospero v0.9'sX-Prospero-On-Behalf-Ofheader (prospero#251), and the live message gains astarted byfield. The person id that comes back on the event is resolved to their display name; an id with no person behind it is shown as it came, and an agent started outside Ariel renders exactly as before.Prosperod does not verify the header — it is Ariel's assertion, recorded beside the token that is authenticated. Requires prosperod v0.9 or later; an older daemon ignores the header and the field simply does not appear.
Changed
-
arieldwatches one fleet-wide event stream instead of polling the fleet and holding a connection open per agent (#55). It now reads prospero v0.9'sGET /api/fleet/stream, whose SSEid:is a fleet cursor, and reconnects with?from=<cursor>so a dropped connection neither skips an event nor repeats one.This fixes a gap rather than only a cost: an agent that started and finished between two five-second polls was never seen, so the channel heard nothing about it at all. The first connection asks for
?from=now, which is ADR 0011's rule stated to prosperod rather than approximated by skipping agents that are already terminal.One behaviour changes with it. A restart used to replay each running agent's history, so every running agent got a fresh live message immediately; now one appears on that agent's next event. For a working agent that is milliseconds, but an agent sitting idle — waiting on a permission prompt, say — stays invisible until it does something. Requires prosperod v0.9 or later.
-
The end-to-end smoke test runs against prosperod v0.9.0, up from v0.8.1, and now asserts that an agent spawned from chat reaches the channel naming the person who ran the command — the whole loop through a real prosperod and a real gonzalod.
router_with_authgained an automations argument in v0.9 (prospero#220), which the test passesNone. -
The Rust toolchain is pinned to 1.99.0 in
rust-toolchain.toml, and the builder image moves fromrust:1.95-bookwormtorust:1.99-bookworm(#68). CI resolved its toolchain at run time, so a new stable release could break a build whose code had not changed — which is what happened to prospero when stable moved 1.97 → 1.99. ariel is more exposed than most, becausecrates/e2ebuilds prospero from a git tag and so compiles its source too. Upgrading is now a deliberate, reviewable commit.
Docs: the README and the guide were brought up to v0.3.0, which had drifted behind the commands and configuration that shipped in it (#67).
0.3.0 - 2026-09-20
Ariel runs the fleet from chat, and takes care of itself while running.
/ariel kill and /ariel respawn finish the command set, so a stray agent is
dealt with where it was noticed. /ariel channel, /ariel configure and
/ariel invite move channel administration and onboarding into chat, which
previously meant a port-forward to gonzalod and a locally built CLI. A channel
record written while arield runs is now picked up without a restart — the
first thing the in-cluster install got wrong. And arield speaks TLS, so it
can reach a prosperod through an ingress rather than only across a namespace.
Added
arieldcan reach anhttpsprosperod (#60 — #65). Its HTTP client was built without TLS, so anhttpsURL failed before opening a connection — reaching the fleet from outside the cluster needed a port-forward. TLS goes through rustls, verifying against the platform's trust store, which the runtime image already populates. In-cluster plain HTTP is unchanged./ariel channelshows a channel's configuration,/ariel configurechanges it, and/ariel invitemints a one-time link token (#58 — #64) — so adding a channel or onboarding someone no longer needs access to gonzalod. Both changing commands needadminand are audited. An invite's reply is always private, and on a platform that cannot answer privately it mints nothing; nobody can invite above the role they act with. The CLI and the chat command now share one parser, so they write the same record./ariel kill <agent>stops an agent and/ariel respawn <agent>restarts it from the prompt it was given, naming the restarted agent's new id (#57 — #63). Both need an operator in the agent's own workspace: the agent is looked up in the fleet first, and authorization is against the workspace it is in. A channel with no configuration is refused before the fleet is read, so it cannot be used to discover which agents exist.
Fixed
arieldnow picks up channel configuration changes while it runs (#56 — #62). A channel record written after startup was invisible until the process restarted — adding a chat channel meant restarting the daemon. It re-reads the records everyARIEL_CHANNEL_RELOAD_SECS(60 by default), starting, stopping and restarting notifiers as records appear, vanish or change. A failed read keeps the channels already served.
0.2.0 - 2026-09-19
Ariel answers for the fleet, not just about it.
/ariel status and /ariel spawn are the first commands that act on the fleet,
each authorized on the person's role and the channel's ceiling and audited in
gonzalo. arield also has a voice at last: it writes its log to stderr, so a
refused token or a throttled bot is visible instead of silently dropped. The
whole path — link, spawn, notify, status — now runs in CI against prosperod's
and gonzalod's own server code, and was confirmed by hand in a real Discord
guild against the home cluster.
Added
/ariel statussummarizes the workspaces a channel follows, and/ariel spawn <workspace> <prompt>starts an agent (#20 — #51). Both are authorized on the person's role and the channel's ceiling; every spawn is audited, and prosperod errors reach the person as plain sentences (Chat Commands).- A headless end-to-end smoke test in its own CI job (#21 — #52): the bridge against prosperod's and gonzalod's own server code, with token authentication on and prospero's fake caliban for agents, covering linking, a spawn from chat, its notification to the finish, and fleet status.
Fixed
arieldnow writes its log to stderr, so it shows up inkubectl logs. Before this, every warning and error was silently dropped, including prosperod refusing Ariel's token and the chat platform rate-limiting it (#49 — #50).RUST_LOGsets the level andARIEL_LOG_FORMAT=jsonswitches to JSON lines.arieldchecks its prosperod token at startup wheneverARIEL_PROSPERO_URLis set, even if gonzalod or the chat provider is not configured yet (#49 — #50).
0.1.0 - 2026-09-17
The first release: Ariel notifies chat about the fleet, and knows who is allowed to ask it for anything.
arield watches prosperod's fleet, keeps one live message per agent in every
chat channel configured to follow that agent's workspace, and answers
/ariel link so a person's chat account can be tied to their fleet identity. The
ariel CLI configures channels and mints link tokens. Everything Ariel
remembers — people, bindings, role grants, channel configuration, link tokens and
the audit trail — lives in gonzalo; Ariel stores nothing of its own.
Not in this release: the fleet commands themselves (/ariel status,
/ariel spawn), which land next (#20).
Added
- The chat provider boundary.
ChatProvider, addressing types, a provider-neutralMessage, capabilities with limits and a send budget, and an in-memoryConsoleProviderfor tests, plus a shared contract suite every backend must pass (#11, #2 — #33, #28). - A Discord backend on twilight:
/arielcommands, embeds coloured by severity, edits, private replies, and the three-second interaction deadline handled by auto-deferring (#14 — #36). - The prospero client: fleet polling, per-agent SSE fan-in with gap handling, and spawn, kill, respawn and input (#12 — #27).
- Notifications: one live message per agent, edited in place; a burst of five or more agents shares a summary; sends are paced against the provider's own budget, and rate limits, lost access and deleted messages are handled (#13, #19 — #34, #40).
arield, the daemon: reads its configuration from the environment, connects to prosperod, gonzalod and Discord, notifies every channel that follows an event's workspace, serves/healthz, and shuts down cleanly. A restart replays nothing (#19, #30 — #41, #35).- Access-control records in gonzalo: typed reads and optimistic writes for people, identity bindings, role grants, channel configuration and link tokens, with an append-only audit trail (#15 — #38).
- Account linking:
ariel link newmints a one-time token and/ariel link <token>redeems it in chat. Only a hash of the token is stored, it works once, and every attempt is audited (#16 — #45). - Two-key command authorization: a command runs at the lower of the person's role and the channel's ceiling; an unlinked account gets nothing, and every mutating command is audited, allowed or denied (#17 — #44).
- Channel configuration from the CLI:
ariel channel showandariel channel set, audited, with a concurrent edit reported as a conflict rather than overwritten (#18 — #42). - Authentication to prosperod: a bearer token from
ARIEL_PROSPERO_TOKEN_FILE, sent on every request including the event stream, for prosperod v0.8's API authentication (#46 — #47). - A container image
ghcr.io/caliban-ai/arielforlinux/amd64andlinux/arm64, a health endpoint, and file-based credentials (#30 — #35). - The ADR log (0001–0013) and an mdBook guide published to GitHub Pages (#9 — #24, #37).
- CI: format, lint, build, test, a build with no chat backend, a guard that
ariel-corepulls in no chat SDK, and an 85% line-coverage floor (#10 — #25).