Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 operate token for a whole Discord, so prosperod's actor read ariel for 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's X-Prospero-On-Behalf-Of header (prospero#251), and the live message gains a started by field. 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

  • arield watches one fleet-wide event stream instead of polling the fleet and holding a connection open per agent (#55). It now reads prospero v0.9's GET /api/fleet/stream, whose SSE id: 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_auth gained an automations argument in v0.9 (prospero#220), which the test passes None.

  • The Rust toolchain is pinned to 1.99.0 in rust-toolchain.toml, and the builder image moves from rust:1.95-bookworm to rust: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, because crates/e2e builds 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

  • arield can reach an https prosperod (#60 — #65). Its HTTP client was built without TLS, so an https URL 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 channel shows a channel's configuration, /ariel configure changes it, and /ariel invite mints a one-time link token (#58 — #64) — so adding a channel or onboarding someone no longer needs access to gonzalod. Both changing commands need admin and 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

  • arield now 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 every ARIEL_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 status summarizes 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

  • arield now writes its log to stderr, so it shows up in kubectl 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_LOG sets the level and ARIEL_LOG_FORMAT=json switches to JSON lines.
  • arield checks its prosperod token at startup whenever ARIEL_PROSPERO_URL is 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-neutral Message, capabilities with limits and a send budget, and an in-memory ConsoleProvider for tests, plus a shared contract suite every backend must pass (#11, #2 — #33, #28).
  • A Discord backend on twilight: /ariel commands, 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 new mints 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 show and ariel 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/ariel for linux/amd64 and linux/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-core pulls in no chat SDK, and an 85% line-coverage floor (#10 — #25).