colonizer
install
docs Changelog

#Changelog

What changed in each release of Colonizer, in the order it would matter to someone running it.

Releases are vX.Y.Z tags on main, installed with curl -fsSL https://colonizer.dev/install.sh | sh. Each entry links the pull request, so the reasoning behind a line is one click away. Dates are the day the release was published.

Colonizer is 0.x: the shape of things still moves, and a minor version can change behaviour. Anything that would cost work (a colony, a worktree, a setting) is called out under Take care rather than left for you to find.

#Unreleased

Entries for the next release are not written here. Each pull request adds its own file under changelog.d/, and cutting a release folds them in with node scripts/changelog.mjs assemble, so parallel pull requests never collide in this file.

#v0.2.14 - 2026-10-08

#Added

Settings → Skillsets now lists understand-anything (MIT, by Egonex) beside graft. It builds a knowledge graph of a colony's repository and answers from it: what a change would affect, a domain and business-flow view, and onboarding tours. It is off by default and downloading it does not switch it on — the operator flips the switch, like any other skillset. crates/colonizer/understand-anything.lock pins one upstream release by commit and sha256, the mothership checks the checksum fail-closed before it unpacks anything, and scripts/update-runtime-pins.mjs checks the latest release in the daily pin workflow and proposes a bump as a pull request.

In a colony the plugin is mounted read-only, writes only .ua/ (git-ignored by the colony, so never part of the pull request) and has no network beyond the model router. The full /understand pass is a multi-agent sweep of the whole repository that upstream itself warns about, and /understand-dashboard and /understand-figma need a network and a writable plugin root, so the runner refuses those three skills deterministically and tells the colony to use the file-scoped commands (/understand-explain <file>, /understand-diff, /understand-chat) instead. A shared graph is a planned follow-up. (#1014)

#Fixed

#Security

#v0.2.13 - 2026-10-07

#Changed

#Fixed

#v0.2.12 - 2026-10-07

#Added

#Changed

#Fixed

#v0.2.11 - 2026-10-07

#Changed

#Fixed

#v0.2.10 - 2026-10-07

#Added

#Fixed

#v0.2.9 - 2026-10-07

#Added

#Changed

#Fixed

#Security

#v0.2.8 - 2026-10-06

#Added

#Changed

#Fixed

It waits on the boot rather than on a shared stall timer, because a boot legitimately takes far longer than a stall: the queue stamps the colony's admission instant when it builds the runtime, before it even starts the boot, so a first colony pulling a cold multi-gigabyte image would otherwise be reported as a dead agent while it was still downloading. The session already records when a boot finished, so the watchdog adds that boot's own length to the admission instant instead — 15 minutes after the boot completed for a link that never came, whose log line is watchdog: its boot finished more than 15 min ago and its agent still has not linked; this colony needs you — nothing it is doing can be seen, and 45 minutes for a boot that never completed at all, which gets a different line saying so. A healthy boot, however slow its image pull, is left alone.

That boot clock is measured from the admission stamp and not from the last progress the watchdog saw, so it cannot be restarted by the colony's own traffic: an agent that is evidently working — it is what is making the requests — but never links its event stream is exactly the case this is for, and a gateway request in flight on every tick used to hold such a colony off indefinitely. A request through the gateway still counts as progress for a colony that has already got a turn, so a slow model is left alone as before.

It is never nudged: a nudge is a message to an agent that has not connected, so there is nobody to send it to. A colony parked on an exhausted provider keeps its quota reason and card instead — that flag is the more specific story. (#760)

#v0.2.7 - 2026-10-06

#Added

#Changed

#Fixed

#Security

#Take care

#v0.2.6 - 2026-10-05

#Added

#Changed

#Fixed

#v0.2.5 - 2026-10-04

#Added

#Changed

#Fixed

#Security

#v0.2.4 - 2026-10-04

#Added

#Changed

#Fixed

#v0.2.3 - 2026-10-04

v0.2.2 was tagged but never published: the tagged commit did not compile (below), so it has no GitHub release and never reached crates.io. v0.2.3 is v0.2.2 plus this fix; everything listed under v0.2.2 ships for the first time here.

#Fixed

#v0.2.2 - 2026-10-04

Tagged but never published; its changes ship in v0.2.3.

#Added

#Changed

A colony whose microVM fails to start for an infrastructure reason — a runtime or image hiccup, a timeout, a dropped connection, an HTTP 5xx — is retried with a backoff of 1, 5 and 15 minutes before it is marked failed, so a blip no longer costs the work. A permanent failure (bad configuration, missing credentials, a policy refusal, or a transient one whose budget is spent) fails immediately as before. The class of the failure is recorded on the colony.

A loop follows the same idea across runs: when a run ends failed for an infrastructure reason, the loop runs it once more within retry_failed_runs minutes of the run's start — 60 by default, 0 to switch the re-run off — without counting it as a run or moving the next one. And colonizer loop list now ends each row with the last run's outcome (failed (transient_infra), pr_opened, …), - when the loop has not run. (#881)

#Fixed

#v0.2.1 - 2026-10-03

v0.2.0 was tagged but never published: its release build failed on macOS (below), so it has no GitHub release and never reached crates.io. v0.2.1 is v0.2.0 plus this fix; everything listed under v0.2.0 ships for the first time here.

#Fixed

#v0.2.0 - 2026-10-03

Never published: the tag exists, but the release build failed and nothing reached GitHub releases or crates.io. These changes ship in v0.2.1.

#Added

#Changed

#Fixed

#v0.1.11 - 2026-10-02

#Added

#Changed

#Fixed

#Security

A connection's credential is sent wherever its base_url points — the gateway forwards it there and the health probe follows — so PUT /api/providers/{id} refuses a save that moves a keyed provider to a different origin (scheme, host or port) unless the API key is entered again or removed with the save; a path change on the same origin keeps the saved key. The quota probe is held to the same rule when the base URL moves out from under it. The cockpit's provider form says so before the save instead of after. (#681)

#Take care

#v0.1.10 - 2026-09-29

#Added

#Changed

#Fixed

#Security

The governance machinery from #98 is wired into the paths that act. Creating a pull request (a press or an autopilot confirmation) mints a grant bound to the tree the publish would commit plus the pr.md body, and the commit, push and pull request each re-check it as they run — a worktree that moved between the approval and the commit is refused, not published. The body that finally goes up is that approved pr.md with harness-composed footers added on top (verification notes, a staleness note, screen warnings); those exact leaving bytes are hashed into the audit trail. A finding is filed only under a FileIssue grant over the exact issue body, checked before any gh call, and every resume boot checks a fresh Resume grant; a colony found mid-publish after a restart is fenced because no grant survives the restart. Grants live in memory for fifteen minutes and are never persisted, so anything still unspent after that — or after a harness restart — needs approving again. The kill-switch (COLONIZER_NO_EXTERNAL_EFFECTS) still refuses everything it did. (#624)

The grok-build runner forces grok's folder-trust gate on with GROK_FOLDER_TRUST=1 in every child environment (env beats a [folder_trust] enabled kill-switch in any config, and an inherited host value can no longer pass through), alongside the fresh GROK_HOME it already assigned. A headless run against an empty trust store then resolves the workspace untrusted, and grok skips a colonized repo's project .grok/ MCP servers, plugins, hooks and skills, plus project LSP servers and instructions (AGENTS.md — brief the colony through the prompt instead). The runner never passes --trust, and a new GROK_WORKSPACE_UNTRUSTABLE preflight refuses to start at all when the workspace is the home directory or the filesystem root, the two paths folder trust auto-trusts because it could never record them. The gate exists in release-stamped binaries only, which the pinned install.sh build is. A live contract test (COLONIZER_GROK_LIVE_BIN=/path/to/grok npm test) drives the real binary and asserts it reports the workspace untrusted with none of a planted .grok/ loadable. Note the boundary: this fences project scope only; the user-scope ~/.claude/~/.cursor compat scanners are a separate issue. (#634)

The provider gateway used to authorize a request once — the bearer token had to belong to a live colony — and then forward whatever method, path and body it carried. The token's reach is now the routing boot derived it from, recorded on the session before the token file is written: a colony reaches only the providers and the <provider>/<model> pairs its model settings name, a colony with no recorded set reaches nothing, and only POST /v1/messages (plus /v1/messages/count_tokens on the anthropic wire) is served — any other path or method is refused before the upstream is touched, with the query string limited to path-safe characters. Two checks cover the time a request spends waiting for a provider slot: a colony has at most 16 requests queued at once (agents fan out through parallel subagents, so bursts are routine; past the cap a further request is refused 429 overloaded_error on arrival), and once a request holds its slot it re-checks that its token still belongs to that live colony and that the budget still admits it, refusing without sending anything upstream if not. Colonies started after the upgrade pick the set up from the settings boot already read; one whose machine survived the mothership upgrade keeps no record, so it needs a resume before its gateway calls are admitted again. (#681)

#Take care

#v0.1.9 - 2026-09-24

#Added

#Changed

#Fixed

#Security

#Take care

#v0.1.8 - 2026-09-23

#Added

#Fixed

#Security

#Take care

#v0.1.7 - 2026-09-22

#Added

#v0.1.6 - 2026-09-21

#Added

#Changed

#Fixed

#v0.1.5 - 2026-09-18

#Added

#Changed

#Fixed

#Take care

#v0.1.4 - 2026-09-17

#Changed

#v0.1.3 - 2026-09-17

#Added

#Changed

#v0.1.2 - 2026-09-17

#Changed

#v0.1.1 - 2026-09-17

#Added

#v0.1.0 - 2026-09-17

The first release: prebuilt for Linux x86_64 with KVM, and for Apple Silicon Macs. (#74)

#Colonies

#Credentials and the mesh

#Models

#The machine

#Beyond one colony

#Take care