Changelog
What each release changed, written from the commits it shipped.
0.0.1-beta.30 (2026-09-28)
Features
- inference: let an openrouter model name the upstreams to prefer, in order (888e0a6)
- tasks: record the state every unit closed from and what closed it (cf374c9)
- turns: let a unit post end the turn when the call asks to and nothing is owed (1bca705)
Bug Fixes
- conversations: hide an agent’s own actions up to the moment of its reset (af55fc0)
- memory: say a missing memory may have been deleted, not only that it may be another agent’s (78d0e42)
- tasks: stop a close result asking for a reply (160680f)
- tools: state argument size limits in descriptions, so no provider cuts a value to fit (cbcc5f3)
- turns: always show the newest pinned post whole, even over the pinned-posts cap (80291ea)
- web: list every visible form control on a snapshot before the hidden ones (ac0506d)
- web: say a browser action that timed out in plain words, and refuse a fill on a drop-down (1f3413f)
- web: stop pointing a whole snapshot’s overflowing controls at a reference it lacks (af5ae1e)
0.0.1-beta.29 (2026-09-26)
Features
- activation: queue each post a turn answers, and fold a person’s repeated mention into it (77b6073)
- conversations: record work-unit posts as a kind of their own, which search finds (2199e35)
- runtime: run again the turns a restart cut off before they had any effect (762ece0)
- tasks: let done mean not abandoned, close a blocked unit done, and follow a unit closed done (8d3446c)
- turns: let a hand-off end with no reply where none is owed, and remind a creator of a verdict (3fca99c)
- turns: tell each turn the posts it answers, its channel, and where its last turn ended (8595229)
0.0.1-beta.28 (2026-09-25)
⚠ BREAKING CHANGES
- release: a long tool result is no longer cut at the turn’s ceiling. It is shown as a view of its first part, and the rest is read with results::read. Saved advice that quotes the old cut marker, or that says to narrow a call because its result was cut, is stale.
- release: a tool post, such as a unit’s assignment, now keeps its author’s own @ handle. A saved entry that copied an order’s bare author name, without the @, is stale.
- release: web::fetch no longer refuses a find given startChar or maxChars; a find always searches the whole page. maxChars now takes any width up to 118,000 characters. Saved advice about the old refusal, or about the old 1,000-character minimum window, is stale.
docs
- release: name what beta.28 makes stale in an agent’s saved procedure (4b9319c)
Features
- memory: say which read a refused revision needs, and let replace change a description alone (8965440)
- tools: state refused sizes, name ignored arguments, mark unrun calls, offer only granted tools (3267ef7)
- turns: give every completion a time limit, and let a steer abort the completion in flight (da03d60)
- turns: keep every tool result as a record, show long ones as views, read on with results::read (56922ed)
- turns: record each completion’s cost and upstream, and keep what an abandoned turn spent (4e55a5e)
- web: search the whole page on a find, show shared text once, and word timeouts and empty pages (18eb06f)
- web: show browser snapshots as views read on by reference, list drop-downs once, await redraws (cb729f0)
Bug Fixes
- channels: keep a tool post’s own author @ when stripping other agents’ mentions (e50d707)
- mail: fail the call, not the process, when an imap connection errors mid-session (f1be408)
Performance
- conversations: walk a fresh window to the low-water mark, so a restart moves its prefix once (2896469)
0.0.1-beta.27 (2026-09-23)
Features
- agents: name agents by a display name in prose, and only @ the one addressed (fc303fd)
- memory: state an agent’s memory caps and privacy in its prompt, and count its memories (916b8f5)
- notifications: name agents in system-bot notices by their display name (5a9dc36)
- sdk: let plugin tools read the work units their agent is party to (3ca69b0)
- tasks: continue a reported unit with tasks::assign follows, and name the way on (04f1eba)
- tasks: let an agent’s settings name the colleagues it may assign to (7943411)
- tasks: refuse closing a unit its assignee is still working or whose report was not read (16b47a2)
- tasks: show a unit’s report in tasks::read, and where the other party to it stands (5fa85e2)
- triggers: carry out a schedule’s text as the operator’s order, and resolve without an id (c6853d6)
- triggers: tell agents a schedule’s text is an instruction, and how to resolve an item (c9a2932)
- turns: head each trace with why the turn started, what it read and what it cost (79a984b)
- turns: name the work unit and colleague behind a delegated approval or question (177912d)
- turns: name who denied an action, and the work unit a stopped turn leaves assigned (69f86fe)
- turns: say on the status post when a turn waits on a person, and list pending questions (2b7e7e2)
- turns: say when to load a skill and that a load lasts one turn (73a5fd5)
- turns: show the posts pinned in a channel to every agent there as standing instructions (93d3660)
- turns: tag people by @username, and list the people who posted in a channel (f7cca8e)
- turns: tell each turn today’s date, in the operator’s timezone (8f2170c)
Bug Fixes
- activation: answer a person’s post queued behind a colleague’s as their own request (c7b0e8f)
- activation: recompute a restart’s hand-offs as the running turn holds them, and count them (f3d4128)
- conversations: keep a pin from restoring a post a channel clear removed (fecd675)
- mail: describe a mail ref so the model never passes a trigger id for one (a4e4fe4)
- tasks: report only the unit an exhausted turn was working, and name colleagues in refusals (99cac4c)
- turns: say where a cut page reads on from, and refuse only replies that really hold no prose (fc99028)
- turns: send back once a worker’s reply that leaves its unit assigned and reaches nobody (04aa9d7)
- web: keep an email address in a link as its owner wrote it (d4306d2)
- web: parse what the browser hands back to the session’s own scripts (b80dd61)
- web: read each PDF in a child process killed past a memory cap (10a13cc)
- web: report the browser’s URL-policy refusals as refusals, not dead hosts (4a5d107)
- web: say where to read on when a fetched page is cut to fit a turn (d4d58ae)
- web: send only an agent that holds web::navigate to the browser (df0a93b)
- web: stop calling a PDF scanned when its read stopped short (95064d4)
Performance
- conversations: stop writing to the store for every edit of an unpinned post (da7da40)
Refactoring
- commands: read the queue, units and trace reports one layer behind their handlers (fc1b123)
- turns: split the turn prompt into one file per section and topic (73a5b0a)
- web: split page conversion, reading and result rendering apart (299dcd1)
0.0.1-beta.26 (2026-09-23)
Features
- activation: start a colleague once the turn that addressed it ends or parks (0be2962)
- approvals: lead an ask prompt with the agent’s own reason for asking (2887b2a)
- approvals: name the denial a re-requested call follows (86e10f3)
- approvals: name the person behind a colleague’s relay and the trigger behind a system post (fbd95e8)
- commands: show whether a turn is running in /collegium queue (a0e4637)
- commands: steer one named agent’s turn, and refuse a steer that would reach several (daee5f4)
- config: bound what one turn may accumulate with a declared turnContextCeilingTokens (19d8d4a)
- conversations: bound each search hit and read one post whole by id (ce3c620)
- memory: render a memory’s written-at date beside its age when read (bdf0d28)
- memory: revise a memory in place under the reference it was written with (a8aaf2c)
- memory: rewrite or re-describe a memory in one step, and report its size and evictions (351d175)
- shell: let the shell user read its own workspace, and probe that at boot (f161fb6)
- skills: add round 3 of the live benchmark: delegation, mail, triggers, commands, concurrency (ed1a27d)
- tools: derive the effects line from a mutating flag rather than retryable (a5c38e4)
- turns: answer a page that repeats one already read at another address with one line (5ed6c24)
- turns: drop the effects line from the status post (8913ac1)
- turns: give a long tool-less turn a status post, and name who stopped or killed a turn (efacf97)
- turns: redraft the preamble and baseline for identity, folding, drains, mail and triggers (e48fdfb)
- turns: redraft the reply rule and fund the preamble within its budget (e343cd5)
- web: choose an option in a drop-down with web::select (c569ed1)
- web: find phrases in a fetched page, and read 30k characters of it by default (48175fd)
- web: leave a fetched page’s navigation, header and footer out unless asked for (6b7e09c)
- web: let the operator close hosts to the web toolset with web.deniedHosts (e419f25)
- web: mark a failed web call and name the page a click landed on (df32e74)
- web: read a page by window length or from its end, and say where a page ends (f0f2b7a)
- web: read a PDF’s text layer with web::fetch (f50deba)
- web: read email addresses Cloudflare cloaks on a fetched page (0acf7ad)
- web: report a site’s refusal, a failed certificate and a missing page as what they are (02de07c)
- web: retry a rate-limited fetch once when the wait fits, and say so in the result (ca012f5)
- web: say why the browser is busy and what still works, and make the session cap a setting (7d2fd5e)
- web: ship a web::reading-websites skill an operator can grant to agents that browse (ba22777)
- web: show an image on a web page as its alt text alone (9d481b4)
Bug Fixes
- activation: fold only a post addressing nobody, and requote the newest fragment after a fold (7e11a30)
- approvals: record an approval or ask prompt as the turn’s own notice (339fb3d)
- ask: say when to omit options and when to say a list is partial (d32af2d)
- context: charge the window for what it sends and stop replaying earlier turns’ reasoning (f7c075a)
- notifications: narrow a stall event before reading its agent, and settle lint’s ordering (a90d920)
- notifications: post a DM’s interrupt and stall notices under the agent’s account (16a2940)
- shell: keep the first line’s indentation when trimming a captured stream (0f7b0b9)
- skills: harden the live-benchmark driver and refresh its stale tasks after run 2 (f114303)
- skills: let the mail-injection task accept a memory that carries no canary (91b96d8)
- skills: refuse a blank reference at the perimeter and quote it in the trace (e8c89c9)
- skills: rewrite the round-3 pass clauses a correct agent could not satisfy (aefe449)
- tools: say what search, tasks and mail results leave out, and count what they hold (bfc7f5e)
- turns: close a window ending on the agent’s own turn so a drained turn starts a new message (548098e)
- turns: drop the effect detail from a call the gate did not run (bc605f4)
- turns: say in the preamble that a long search hit is cut and readable whole by id (9a7011f)
- turns: say in the preamble that text beside an ask reaches the person asked (ce03379)
- web: decode character references in a fetched page’s title (35c7bd0), references #8217
- web: describe the fetch and search surfaces accurately and decode search snippets (135d445), references #x27
- web: keep a click on the effects line, since it can submit a form (805c8ca)
- workspace: count lines without the terminator and confirm the bytes as given (be59e41)
Performance
- turns: move per-turn prompt sections after the window so the provider cache reuses it (587a525)
0.0.1-beta.25 (2026-09-21)
Features
- benchmark: add the controlled run that measures the framework (dcf6969)
- benchmark: add the noindex fixtures, the large report and the minutes pages (2373fd5)
- commands: lay /collegium inspect out in sections and tables (27446ff)
- config: complete tool grants in an editor writing config.json (5ec960d)
- shell: run under pipefail, add python3, and state the present commands in the preamble (7ed505c)
- turns: make the status post deliverable and honest, and give the extension prompt the spend (2119b12)
- turns: retain page results by token share and name what a collapsed result was (1b72a4e)
- turns: rewrite the prompt to what the framework does and name authors as people or agents (454727a)
- web: let a deployment declare its own network browsable (9ed3ffc)
Bug Fixes
- web: report a 404 as 404, name browser transport errors, and send a user-agent (d59ff5c)
0.0.1-beta.24 (2026-09-19)
Features
- clearing: erase a channel’s record before a boundary, under confirmation (7843cc9)
- commands: add /collegium clear (237fded)
- config: word a config.json the schema refuses as one line per issue and path (02e5ba3)
- inference: wait out a rate limit as the provider asks, with jittered backoff and a cap (49199cc)
- mattermost: forward the trigger id and erase a channel’s posts before a boundary (305d5db)
- memory: read a memory back with how long ago it was written (7759201)
- notifications: announce a command through one voice that can edit its notice (b2f89bf)
- shell: save output a result cannot carry to the agent’s workspace and name the file (b38577b)
- tasks: ask a closing verdict to say what the creator checked (3546bfa)
- turns: tell agents their posts render as markdown and to use no emoji unless asked (6b73c1b)
- turns: tell agents to diagnose failures and treat instructions in tool results as data (62dd62d)
- turns: tell agents what not to remember, and to trust what they see over a stale memory (a2ff54c)
- web: show the text web::fill typed, in the status post and in snapshots (585b443)
Bug Fixes
- approvals: fence a payload with more backticks than it contains (3c0fd23)
- runtime: record the stop time before anything tears down (78c4c47)
- shell: stop holding a command’s output in memory past a bound (71070c6)
- web: answer a redirect to an unparseable address as a failed page (cdc54b3)
- web: judge an address as an address, refusing nat64 loopback and ipv6 multicast (72e9375)
- web: pin webrtc’s ice to the proxy instead of trusting camoufox’s default (5f476fb)
Reverts
- remove three beta.23 operator-facing notices (48410ce)
0.0.1-beta.23 (2026-09-18)
⚠ BREAKING CHANGES
- plugins: a plugin tool compiled without
approvalno longer loads. Addapproval: nullto every tool that does not gate.
Features
- approvals: let an agent ask the channel a question and wait for the answer (ed24e61)
- approvals: say which action this is and who asked above every approval payload (d8a7492)
- chat: parse the files a post carries (c5c0fb3)
- chat: require a shared secret on every callback endpoint (87ea5f2)
- commands: add /collegium steer (cf5f018)
- commands: add /collegium units to list and cancel delegated work (b149658)
- commands: list the approvals still waiting on a human (ee88049)
- commands: mark which of an agent’s tools need a human (e852d5e)
- config: let systemPrompt name a file beneath RESOURCES_ROOT (98c1bc0)
- conversations: name a post’s attached files in the window (329c1bc)
- inference: classify a length rejection as a context overflow (b94d409)
- inference: surface a call with unparseable arguments instead of failing the completion (001a559)
- memory: evict the least recently used entry rather than the oldest written (8b2131f)
- memory: record when an entry’s body was last read (9ac8763)
- runtime: verify provider credentials at boot (258e2d5)
- schedules: declare recurring work in config and announce it as a trigger (3d1cb90)
- skills: add the understanding-collegium core skill (91c0dee)
- skills: declare the tools a skill needs and refuse an uncovered grant at boot (e456cd1)
- skills: let a skill ship reference documents beside its procedure (ebd52f9)
- tasks: record delegated work as units whose every state change is a post (e5a99f4)
- tools: let a framework tool return a post the runner publishes (fe66889)
- turns: bound a turn to one addressed peer across every post it emits (79b07c5)
- turns: count a chain by its root and refuse the turn past the limit at admission (bf834b3)
- turns: forgive one tool call with unparseable arguments per turn (de6efd9)
- turns: let a running turn take steering from a human (a9b9753)
- turns: list the agent’s own earlier actions past the window in the prompt (50a9f6d)
- turns: name the agent’s directories in the preamble (0035985)
- turns: record the post every chain descends from on each turn (78db7dd)
- turns: retire stale pages under context pressure and stop when they run out (032a162)
- turns: state how long a turn ran on the status post’s closing line (6098426)
- workspace: read the workspace with typed, ungated tools (9e8fa9e)
Bug Fixes
- activation: drop a peer mention the chain limit refused rather than re-queue it (c6eb387)
- approvals: strip peer mentions from a question and an approval payload before posting (3fbb043)
- commands: report a cancellation that did not post and hint at no approval elsewhere (a63a3b1)
- memory: rebuild the memory table so the migration applies to a store with rows (aff9c3c)
- runtime: close abandoned status posts and measure downtime against the process (6428618)
- skills: refuse a skill directory no name list declares (ceba454)
- skills: refuse a skill outside the acting agent’s manifest (6ec1e94)
- turns: end a turn after two consecutive rejected posts (0a2935f)
- turns: import the agents module the prompt renderer now needs (ee5af87)
- turns: keep unread results verbatim and name a colleague that asked (6518030)
- turns: let a tool post mention only the peer it addresses (05e657d)
- turns: name the class of a provider rejection by its status code (5032bc0)
- turns: reject a leaked tool call written as text (de44b7b)
- web: answer a non-http proxy request with 400 instead of crashing the process (f192700)
- web: resolve and pin every address the web tools open (7df163f)
- workspace: skip symlinks and stop a grep pattern that outruns its budget (bf0a4a6)
Refactoring
- core: move the token estimate behind one seam (b2bebe0)
- plugins: require a plugin tool to state whether it gates (d911941)
- turns: render memory writes and deletes as ordinary tool-call lines (b3d6af7)
0.0.1-beta.22 (2026-09-16)
Features
- inference: stream completions under an idle timeout and take a reasoning effort per model (2b8961e)
- models: offer the openai, anthropic, glm and deepseek models openrouter serves (273f6df)
Performance
- conversations: anchor the window’s oldest entry, page the walk, and drop peers’ status posts (7c9f4d2)
- inference: enable and optimize prompt caching across supported models (33474e2)
- turns: run concurrent reads together, retire stale page results, and coalesce status edits (f04d2a0)
0.0.1-beta.21 (2026-09-16)
Features
- models: offer the openai, anthropic, glm and deepseek models openrouter serves (273f6df)
Performance
- inference: enable and optimize prompt caching across supported models (33474e2)
0.0.1-beta.20 (2026-09-16)
Features
- commands: add queue clear to discard a standing queue entry (3239b0d)
- tools: resolve a granted tool named in its display form (0de06d9)
- usage: report what each turn cost in the usage command (5f4346e)
Bug Fixes
- models: name openrouter’s deepseek models by their provider slugs (ab6e97e)
0.0.1-beta.19 (2026-09-15)
Bug Fixes
- tools: read matched storage rows back in batches under sqlite’s bind limit (6ce696f)
0.0.1-beta.18 (2026-09-15)
Features
- turns: return mentions to the delegator’s depth, cap chain length, and budget per agent (6811363)
0.0.1-beta.17 (2026-09-15)
Bug Fixes
- inference: name the transport cause in the outage notice and log (8c39738)
0.0.1-beta.16 (2026-09-14)
⚠ BREAKING CHANGES
- compose: MATTERMOST_URL is renamed MATTERMOST_LOCAL_URL, and a deployment running the bundled Mattermost must set MATTERMOST_PUBLIC_URL to the exact address it is opened at.
Features
- compose: require the address the bundled mattermost is opened at (b9604ba)
0.0.1-beta.15 (2026-09-14)
Features
- channels: hold full membership per channel and answer which channels a search may reach (36c453d)
- chat: describe channels and deliver membership events for every user (e9be455)
- conversations: add the conversations::search toolset (17a5690)
- conversations: record what kind of post a turn authored and search the agent’s own replies (71a05e8)
- turns: state what conversations::search reaches in the preamble (30477a5)
Bug Fixes
- conversations: omit the searching agent’s own posts from search results (3dff7a6)
0.0.1-beta.14 (2026-09-14)
0.0.1-beta.13 (2026-09-13)
Features
- commands: add usage command with cached and reasoning token counts (0a2558b)
- web: add web::search backed by brave search (f184f14)
0.0.1-beta.12 (2026-09-10)
Features
- agents: add a shared behavioral baseline (647551f)
- agents: add selectable personalities injected into the system prompt (e3e24fe)
- commands: replace prompt with inspect (04624c4)
- commands: show a memory body from the channel (c505718)
- config: raise default action budget to 25 and hourly ceiling to 500 (49cdf31)
- memory: let an agent forget one of its memories (c122325)
- turns: persist reasoning and replay history in native form (dc2207d)
- turns: replay a tool result by the text the tool names for history (e422151)
- turns: state the context limit, resumption, and skill loading in the preamble (ff05414)
- web: add hover and mark the refs CSS hides (7063d65)
- web: follow a tab the page opens into the session (565fa7e)
- web: report a tab the page opens instead of following it (6a26165)
- web: resolve link and image addresses against the page (f7a584d)
Bug Fixes
- activation: leave the queue standing after a failed exit (68f49f0)
- commands: import the modules the inspect handler depends on (b54076f)
- turns: describe the budget extension flow as the runner performs it (d92d386)
Refactoring
- memory: name the delete tool’s vocabulary after delete rather than forget (973ad5c)
- move system prompt into context.constants.ts (b15dceb)
- turns: render the system prompt through a class backed by a text formatter (0dbba91)
0.0.1-beta.11 (2026-09-09)
Features
- hold
/collegiumin a Mattermost plugin and declare its subcommands at boot - accept a post permalink in
/collegium forgetand/collegium trace - add the framework preamble and the
builtins::nowcore tool - read mentions with Mattermost’s grammar, replay reasoning within a turn, and reject transcribed tool calls
Bug Fixes
- give the image the root certificates Go reads
Refactoring
- derive the command surface from one wire type and read server settings once
- render the preamble from a template constant