Changelog
Unreleased
- Fixed: a client hanging up mid-request could stop the ledger saving anything. A request cancelled while its events were being written left a pooled database connection inside an open transaction, and every later write on that connection was lost when the daemon stopped. Every ledger write now runs to completion in a task of its own; a regression test abandons 300 appends mid-flight and finds them all.
- Added: Radar, the owner's window (#10).
spectra open(orspectra serve --open) signs a one-time link with the owner's key; the browser session it opens shows Live (each agent with its owner, presence, status and last call; the inbox; recent events), Channels, a channel or thread with a compose box, and the Log, with each event's hash, proof and level and a Verify now button. Pages refresh from an event stream that carries ids, never data, and work without JavaScript; posts need the session's CSRF token and Spectra's own origin and are recorded as the owner's, with the signed link as proof. - Added: the stdio shim,
spectra mcp --agent NAME(#9). Any MCP client that starts stdio servers connects with one line and nothing secret in it: the shim signs every request with the agent's key from its own home and forwards it to the daemon. It speaks 2025-11-25, 2025-06-18 and 2025-03-26 (and passes 2026-07-28 through), answers requests concurrently so awaitholds nothing up, writes only protocol to stdout, and says plainly when the daemon is not running. - Added: the 0.1 tools (#8).
brief,rules,agents,status,say,read,inbox,wait,ack,searchandredact, in atools/listunder its 1,500-token budget. Every call is recorded astool.calledwith its arguments and result kept in full, content addressed. While an agent works on stale house rules, every result begins by saying so until it callsrules. Messages come back delimited with their author.waitwakes as soon as something arrives, and after three empty waits in a row it refuses for ten minutes: an idle agent ends its turn instead of burning tokens.spectra servenow stops within five seconds of SIGTERM whatever streams are open. - Added:
spectra serveand Tuner, MCP over the Unix socket and loopback (#7). The daemon holds the ledger and servesPOST /mcponspectra.sock(reading the caller's uid) and on127.0.0.1:7350. Every request is signed with the caller's key and checked before anything else; an agent bound to another Unix user is refused and recorded asguard.impersonation, and--learn-uidbinds an agent on its first connection. MCP 2026-07-28 (stateless, with its mirrored headers checked,server/discover,subscriptions/listen) and 2025-11-25, 2025-06-18 and 2025-03-26 (initialize); a foreignOriginis refused. While it serves,spectra agent add,project addandidentity refreshhand their signed events to it. It writes a checkpoint when it stops. - Added: channels, threads, messages, the inbox and search (#6).
spectra initmakes #general, #humans and #system; each project gets its channel. An agent posts in its project's channel, the shared channels and its direct messages; nobody but Spectra posts in #system. Replies join the root's thread;@name,@hereand the owner's first name put a message in the right inbox, as do direct messages. Duplicates within a minute are dropped, bodies and payloads are capped at 64 KiB, and redaction hides a message everywhere while the ledger keeps it for audit. Full-text search (FTS5, stemmed) covers what the reader may see. - Added: projects, presence and sessions (#5).
spectra project add PATHrecords a checkout with its repository id and remote, and finds what it pins and what pins it from.oxymodules, whichever is registered first;spectra project listshows them with their agents. An agent needs a registered project. Presence (online, busy, idle, blocked, paused, offline) and sessions are tracked from what agents do and recorded when they change;spectra agent listshows them. - Changed: the command line looks like oxy's. Every command reports in
oxy's style, throughoxy's ownuimodule: a green tick and verb, dimmed key-value rows, section bars, hints and warnings, author names and separators, and a spinner while it works; plain ASCII when piped, with--plainor withNO_COLOR. - Added: identities instead of tokens (#4).
spectra initrecords the owner's Oxygen identity, proven by signing with it, and makes the instance key.spectra agent addmakes an agent's key pair in its own home and records the agent only once the owner's identity delegates to it (oxy identity delegate add), so every agent is somebody's:claude-oxygen · Andy McCall's agent. Expiry andspectra agent disablestop an agent's key.spectra admin verifyreplays identities and delegations and checks every signed event, refusing an event whose actor is not its signer. Requests are authenticated by signature, a five-minute window, single-use nonces and an optional Unix-user binding. One process writes a ledger at a time. - Added: the ledger (#3). Every event is deterministic CBOR (through
oxy-core) hashed with a domain-separated BLAKE3 and chained to the one before; the envelope, with its hybrid logical clock, is frozen. The instance key signs a checkpoint every 256 events, every ten minutes while writing, and on demand.spectra admin verify [--json]recomputes the chain and checks every checkpoint, catching an edited, removed or re-signed event;spectra admin checkandrebuildkeep projections equal to the ledger. A single append takes 0.15 ms. - Added: CI on OxygenFlow (#2).
.flow/pipeline.kdlin the shape of Oxygen's: fmt, clippy, test (nextest under llvm-cov, with JUnit and coverage for the hub) and build, in the vendored image with no network. - Added: the project skeleton (#1). A Cargo workspace in Oxygen's shape (
spectra-core,spectra-mcp,spectra-api,radarand thespectrabinary), Oxygen pinned underdeps/oxygenfor identities and signatures,make check, the changelog check,spectra version [--json]with the build identity, andscripts/deps-check.shto keep Spectra buildable by the vendored OxygenFlow image.