OXYGENHUB
# 8cfb9269bb14 spectra / CHANGELOG.md
6.1 KiB · Markdown · last changed Radar: Live, channels, threads and the log for the owner, signed in by a CLI-signed link; ledger writes survive a cancelled caller (#10) 2 days ago renderedsource blame history raw

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 (or spectra 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 a wait holds 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, search and redact, in a tools/list under its 1,500-token budget. Every call is recorded as tool.called with 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 calls rules. Messages come back delimited with their author. wait wakes 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 serve now stops within five seconds of SIGTERM whatever streams are open.
  • Added: spectra serve and Tuner, MCP over the Unix socket and loopback (#7). The daemon holds the ledger and serves POST /mcp on spectra.sock (reading the caller's uid) and on 127.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 as guard.impersonation, and --learn-uid binds 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 foreign Origin is refused. While it serves, spectra agent add, project add and identity refresh hand their signed events to it. It writes a checkpoint when it stops.
  • Added: channels, threads, messages, the inbox and search (#6). spectra init makes #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, @here and 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 PATH records 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 list shows 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 list shows them.
  • Changed: the command line looks like oxy's. Every command reports in oxy's style, through oxy's own ui module: 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 --plain or with NO_COLOR.
  • Added: identities instead of tokens (#4). spectra init records the owner's Oxygen identity, proven by signing with it, and makes the instance key. spectra agent add makes 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 and spectra agent disable stop an agent's key. spectra admin verify replays 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 check and rebuild keep projections equal to the ledger. A single append takes 0.15 ms.
  • Added: CI on OxygenFlow (#2). .flow/pipeline.kdl in 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, radar and the spectra binary), Oxygen pinned under deps/oxygen for identities and signatures, make check, the changelog check, spectra version [--json] with the build identity, and scripts/deps-check.sh to keep Spectra buildable by the vendored OxygenFlow image.