Status & Roadmap
Ariel is pre-1.0. The current release is v0.3.0, published as
ghcr.io/caliban-ai/ariel:0.3.0 for linux/amd64 and linux/arm64; see the
changelog. This page lists what the code does today, what is
next, and what is deferred. The MVP walking skeleton,
caliban-ai/ariel#22, is
complete; remaining work is tracked on the
caliban-ai board.
Capability layers
Ariel is designed as one bridge at four depths, each shippable on its own.
| Layer | Direction | What it does | State |
|---|---|---|---|
| Notifications | out | Agent started, changed status, finished | Built. arield watches the fleet and posts a live message per agent to every channel configured to follow its workspace, naming the person who asked for it. |
| ChatOps | both | Slash commands to list, spawn, kill, and restart agents | Built. Eight commands: link, status, spawn, kill, respawn, channel, configure, invite (Chat Commands). |
| Approvals | both, narrow | Approve or deny a risky action with buttons | Designed, deferred (#6). Waiting on a permission-request event from caliban and prospero. |
| Conversational | both, full | A chat thread is an agent session | Designed, deferred (#7). |
Commands are authorized on two keys: a person's role and a ceiling set on the
channel, the lower of the two winning (ADR 0009).
The authorization and its audit trail are built
(ADR 0012), and every command
but /ariel link goes through them.
Built
ariel-core
ChatProvidertrait, addressing types (ChannelRef,UserRef,ThreadRef,MessageRef), the provider-neutralMessage,CommandSpecandRole,CapabilitieswithLimitsandSendBudget, andProviderError(ADR 0006).ConsoleProvider: an in-memory provider that records every outbound call and accepts injected commands, with configurable capabilities.- The shared provider contract suite, behind the
contract-testsfeature, run against bothConsoleProviderand the Discord backend. ProsperoClientfor prosperod's fleet, spawn, kill, respawn, input, end-input and stream routes; an incremental SSE decoder with gap handling; andFleetWatcher, which holds prospero v0.9's fleet-wide stream (GET /api/fleet/stream) open and forwards every agent's events from it, resuming after the last fleet cursor when a connection drops (#55).- Mirrored prospero wire types pinned by golden fixtures from prospero v0.8.1,
plus v0.9's
on_behalf_ofon the event envelope, pinned by its own wire tests (ADR 0005). Bearer-token authentication to prosperod, sent on every request including the event stream (ADR 0013). Bothhttpandhttpswork, TLS through rustls against the platform's trust store. ProsperoClient::on_behalf_of, which names the person a request acts for in prospero v0.9'sX-Prospero-On-Behalf-Ofheader. A value prosperod would answer400to — blank, over 128 characters, or carrying control characters — is dropped rather than failing the request it rode on.- The renderer:
AgentView,render_agent,render_summary. An agent's message carries astarted byfield when the spawning client named a person (Who started an agent); one started outside Ariel renders exactly as it did before. - The notifier: one live message per agent, edited in place; burst summaries; routing by what a channel follows and its notify preset; and sends paced against the provider's own budget, with rate limits, lost access and deleted messages handled (ADR 0007, ADR 0009). It also resolves the person id an event carries to that person's display name, reading gonzalo once per person and not caching a miss, so someone created later still resolves.
Records, the gonzalo client for access-control records: typed create, read, update, delete and list for people, identity bindings, role grants, channel configuration and link tokens, and append-only audit entries, over gonzalod (ServerStore) or a localFsStore. A lost write race is an ordinaryWrite::Conflictcarrying the winning record (gonzalo compatibility).
ariel-discord (ADR 0010)
- Registers one guild
/arielcommand with a subcommand perCommandSpec(string options). - Posts messages as embeds colored by severity; edits them; opens direct messages; starts threads from a message.
- Reads the Gateway with no privileged intents and turns
/arielinteractions intoInbound::Commands. - Answers interactions, auto-deferring after 2 seconds to meet Discord's 3-second deadline, and supports ephemeral (private) replies.
- Advertises every capability except buttons and reading thread replies.
- Verified by the contract suite against a stub of Discord's REST API, plus a manual smoke test against a real guild.
arield
- Reads its configuration from the environment, failing at startup on an unreadable or empty credential file, a bad address, a non-URL dashboard or a non-numeric Discord ID (Configuration).
- Connects to prosperod, gonzalod and Discord, reads the channel configuration records belonging to the running provider, and notifies each channel that follows an event's workspace. Without those settings it serves health only.
- Re-reads the channel records while running
(
ARIEL_CHANNEL_RELOAD_SECS, 60s by default), so a channel added, retired or re-scoped takes effect without a restart. A failed read keeps the channels already served rather than dropping them. - Registers every
/arielcommand:link,status,spawn,kill,respawn,channel,configureandinvite. Link answers privately, linking the account and granting the token's role; the rest are authorized on two keys, and every command that changes something is audited (Chat Commands).spawn,killandrespawntell prosperod which person they act for, so the events they cause name that person and not only Ariel's token. - Does not replay what it missed across a restart (ADR 0011).
- Writes its log to stderr, so
kubectl logsshows a refused token or a throttled bot:RUST_LOGsets the level andARIEL_LOG_FORMAT=jsonswitches to one JSON object per line. Logging is installed before anything else can fail, and the startup line names the version and the chat providers compiled into the build. - Checks its prosperod token as soon as
ARIEL_PROSPERO_URLis set, in the background so a slow prosperod never holds up the health endpoint. - Serves
GET /healthzand shuts down cleanly on Ctrl-C or SIGTERM.
ariel (CLI)
ariel channel showandariel channel setmanage a channel's configuration record: what it follows, how much it hears and its command ceiling (ThearielCLI). Changes are audited, and a concurrent edit is reported as a conflict instead of overwriting what is stored.ariel link newmints a one-time link token that grants a role when redeemed in chat with/ariel link; only its hash is stored, and it works once (ThearielCLI).- Acts on gonzalod, or on a local gonzalo store with
--store.
Build and release
- CI:
cargo fmt --check, clippy with-D warnings, build, test, a--no-default-featuresbuild ofariel-daemon, a check thatariel-corepulls in no chat SDK, and an 85% line-coverage floor (scripts/coverage.sh). A docs-only change skips the Rust jobs. - A headless end-to-end smoke test (
crates/e2e), run in its own CI job: the bridge against prosperod's (v0.9.0) and gonzalod's own server code, both with token authentication on, and prospero's fake caliban standing in for agents. A person links, spawns an agent from chat, sees its notification through to the finish — including thestarted byfield resolved to the display name linking gave their account — and asks for the fleet status; the audit trail is checked in gonzalo. No network beyond loopback and no model API keys. Dockerfileand a release workflow that buildsghcr.io/caliban-ai/arielforlinux/amd64andlinux/arm64on native runners (no QEMU), validating on pull requests and pushing a multi-arch manifest onv*tags, tagged by version, bysha-<commit>, andlatest.- Deployment: the
arielchart in caliban-ai/helm-charts, tracking the published image.
Next
The MVP walking skeleton (#22) is complete: the path from link through spawn, notification and status 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 at v0.2.0. What is open is refinement rather than foundation:
- Require the end-to-end smoke job as a status check (#61).
- Housekeeping: pin the Rust toolchain
(#68) and remove the tracked
.profrawfiles (#69).
Not yet decided or built, and not scheduled: the Slack and Teams backends, and core message fallbacks (truncation, dropping actions when a platform has no buttons).
Deferred by design
- Approvals (#6): designed,
and waiting on a permission-request event from caliban and prospero. Until one
exists there is nothing for Ariel to ask about. Discord's buttons are the one
provider capability
ariel-discorddoes not yet advertise. - Conversational threads (#7): designed — a chat thread as an agent session — and deliberately after the first three layers. Reading thread replies is the other capability the Discord backend does not advertise yet.
Operating requirements
Not blockers in Ariel, but things the deployment has to supply:
- gonzalod 0.7.0 or newer, with authentication on. The access-control record kinds ship from 0.7.0 (gonzalo ADR 0022 and 0023); 0.6.0 and earlier cannot decode them. Linking writes identity records, so a gonzalod with auth off would let any pod grant itself a role (ADR 0008, gonzalo compatibility).
- A prosperod API token once prospero v0.8 or newer runs with API
authentication on, with the
operatescope for the commands that act (ADR 0013). - prosperod v0.9 or newer to see who started an agent. The attribution
rides on a header v0.9 introduced; an older daemon ignores it and the
started byfield simply does not appear. Nothing else degrades (Who started an agent).
The gonzalo work Ariel's identity layer waited on — gonzalo#277 and #278 — landed in gonzalo v0.7.0, and Ariel depends on the published crate.