Repository navigation
Colonizer v0.2.18
Colonizer v0.2.18
What's new
- **Observability: a
fileprovider that writes the export stream to disk, a disk guard, a status - Models served by several providers are ranked by price, and a colony can start on the cheapest host.
GET /api/model-hostslists every canonical model two or more connections serve, each host with its input/output $/1M and when the price feed last verified the price, ranked cheapest first by a blended rate (three parts input to one output, cache-aware when a cache-read rate is known); the cockpit's model picker and the routing settings show the same table. A newprefer_cheapest_hostmodule setting (off by default) re-pins a colony's open-weight models to the cheapest healthy connected host at boot: it skips degraded, out-of-quota or tools-disabled hosts, never moves closed models, and never moves a model the operator marked host-sensitive viahost_sensitive_modelson a provider connection — the model itself is kept, only the host serving it changes. (#1039) - Releases now ship the observability add-on.
colonizer-observability-linux-x86_64.tar.gzand - Stacked colonies no longer cascade into failure when their parent fails; they now wait for recovery. Colonies stacked on a parent that entered a failed state used to immediately fail themselves, killing entire dependency chains with a single failed parent. Now, when a parent enters a failed state, its children transition to a waiting state instead, pausing their work until the parent recovers. When the parent recovers, waiting children automatically resume from where they left off, allowing the full stack to continue working together. This prevents the loss of work in multi-level colony stacks and enables recovery scenarios where a transient parent failure can be resolved without restarting all dependent colonies. (#1066)
- A provider outage no longer ends a colony. A turn that dies on a model gateway error is retried
- Retry a colony that failed before it had a worktree. A colony that dies at boot or sync has
- Claude's exhausted quota no longer holds colonies that never spend it. The Claude account's
- Colonies park when the Claude account and its fallback's provider are both out of quota. Where before a running colony kept its microVM and had its agent re-ask every minute, each request coming back
quota_exhausted, the queue's 5 s tick now parks a colony whose whole provider chain — the Claude account and every provider itsallowed_providerslist can reach — is out, releases the slot and, under the usualdiscard_vm, removes the microVM. The park names the exhausted provider and the earliest reset in the chain, so the colony rejoins the queue on its own when either plan refills. The account fallback's route answer matches: a fallback whose own provider is out is nowparkedwith a reason rather than "go ask Claude", which could only produce another 429. (#1160) - Skill pack MCP hosts join the egress allowlist. A skill pack's
mcp.jsondeclares remote tool servers and the hosts they live on. Inallowlistmode, those hosts now join the colony's allow list, recorded inegress.jsonas each pack's contribution alongside the module's, so the agent reaches the tool servers the packs' skills call without the operator restating them. The hosts are clamped by the fleet floor like module hosts. Inopenmode they are not a fence (thepublicprofile covers them); a per-pack fence in open mode is future work. (#1165) - secret-paths exec policy now detects secrets in git refs and flag-value pairs. The
words()tokenizer was modified to split on:and=characters in addition to whitespace, enabling proper detection of secret paths in contexts like git object refs (e.g.,HEAD:.env) and command-line flag-value pairs (e.g.,--flag=.env). (#1174) - Setup flow now optional for Claude login when other model providers are configured. The "GitHub & Claude" page has been renamed to "GitHub & models" to reflect the broader scope of model providers. The Setup checklist now displays "A model colonies can use" instead of requiring a Claude login, making the Claude login step optional when other model providers (like Anthropic API keys, OpenAI, or other LLM services) are already configured. The needs-you indicator clears as soon as any working model provider is available, reducing setup friction for users who bring their own models. (#1211)
- Resumed colonies keep their place in queue: When a stopped colony is resumed, it now gets a
- Cross-member launch references consolidated to issue #1252. The closed outposts design gate
- Autonomy judge model test call now accepts extended thinking. The test call's token budget
- Autopilot no longer publishes, or releases the issue as "no changes", while the agent's background subagents are still running. When a lead agent launches background subagents with the Agent or Task tools, autopilot waits for them to settle before publishing the PR, even if the PR description is already written. This prevents premature releases while the subagents are still making changes. Errors are not blocked by subagents: a turn that ends with an error is held or retried immediately. An empty branch whose PR description names changed files is now held as contradicted, rather than published as "no changes" (#1268).
- context-mode, an opt-in third-party module, with the exec policy enforced on its tools. Organisation settings take a
context_modeofoff(the default),shadoworon, passed to the colony asCOLONIZER_CONTEXT_MODE. Inon, the Claude Code runner registers the context-mode MCP server only from an operator-installed copy whosepackage.jsonmatches the pin inmodules/agents/claude-code/context-mode.json(1.0.169, sha256 and npm integrity, ELv2 — never bundled), with its data kept in the colony guest's~/.colonizer/context-moderather than the shared~/.claude.shadowis accepted but does nothing yet. Whatever the mode, the exec-policy hook now also coversctx_execute,ctx_execute_fileandctx_batch_execute: shell code is judged exactly as the same Bash command, other languages as an inline script, every batch command separately with the strictest decision winning, and malformed input,..paths andctx_upgradeare refused. (#1273) - Org dashboard: Cost per merged PR now reads the same window as the Spend tile, not the all-time session rollup. When the live-session rollup was close to zero but the spend history showed measured activity, the Cost per merged PR tile could contradict the Spend tile or round to "$0.00". The tile now divides the period spend (from
/api/spend/history, the same value the Spend tile shows) by the number of PRs merged in that same date range (not all-time), so the two tiles always cover the same window and can never contradict each other. The sub-line now says "N merged in range" instead of "N merged", and the tile shows "—" with an explanatory note when nothing merged in the period but spend was measured (or when spend is unmeasured). (#1275) - Input screening detects hidden text in GitHub issues and comments at launch. The
promptdecodeorg setting (offby default) runs a local scanner for zero-width characters, tag runs, bidi controls, HTML comments, and base64 payloads:offskips scanning;shadowrecords findings in the session log and ledger without mutating the issue;onremoves hidden text and appends a visible note. The screening runs before the prompt is built, using a local decoder until the promptdecode CLI ships; PR comments, fetched pages, diffs, and the cockpit card are future slices. (#1277) - Red-team: detects repository artifacts that would change the colony's PATH (executable shims, direnv, version managers, Makefiles). The colony ledger now flags repositories with committed
bin/cargo,.envrc,Makefilewith PATH assignments, and similar artifacts that hostile repos use to fool agents. Verification gates are unaffected: they trust the VM's reported exit code, not fabricated output. PATH stays pinned by the image. (#1278) - Provider catalog adds quota probe presets for DeepSeek and Z.AI, with clearer UI messaging for providers without balance APIs. The provider catalog now includes quota probe presets for DeepSeek and Zhipu GLM (Z.AI), so colonies connecting to these models can set up quota monitoring out of the box. The providers page UI now clearly distinguishes providers without quota probe support by showing "no balance API" instead of the generic "balance unknown", making it easier for operators to understand which providers support balance queries and which do not. (#1281)
- Placement verdict is no longer shown on running colonies. A placement verdict — a message like "archlinux: no free slot; no member has room" — appeared on every colony's detail page, whether it was queued, blocked, or actively running. This made operators think running colonies couldn't actually run because they seemed to be blocked on placement. The verdict now only shows on colonies that are queued or blocked waiting for a slot; running and working colonies no longer display a placement message. (#1282)
- Fixed: Guest Claude Code auto-memory writes to
/root/.claude/projects/— disabling session-resume in the claude-code module prevents the directory from being mounted, eliminating exec-policy prompts and control-defeat holds from denied writes. Agents also get clearer guidance about not accessing.git/internals when testing commit capability (#1283) - The orgs list no longer shows case-duplicate orgs such as
cratefieldnext toCratefield. A launch now stores the repository under GitHub's own casing (thefull_namefrom the repository lookup the push-access check already makes, falling back to the casing of existing colonies or a saved org), and a one-off migration at startup moves existing colonies onto one casing per org and repository. The orgs list, the per-org and per-repo colony limits, duplicate-claim checks and API-token scopes now compare owner and repository names case-insensitively. (#1284) - Remote claims now auto-clear when stale (no branch or PR for 24h), and the cockpit offers a take-over action. A label-only claim (no branch or open/merged pull request) on an issue from another mothership is now marked as potentially stale. Launches automatically clear claims older than 24 hours and proceed. For younger label-only claims, the cockpit shows a "No branch or pull request" notice with the claimant's GitHub account and claim age, alongside a "Take over" button to proceed with the launch. The refusal now names the claimant GitHub account and when the claim was created, so operators can tell whose work is blocking the issue (#1286)
- An operator note to a colony that isn't running now waits for it instead of being lost.
POST /api/sessions/{id}/messagesused to answer a bare 409 for aqueued,stopped,parked,blockedorfailedcolony and the note was gone; it now keeps the note on the session (once per client id) and hands it to the agent with the first turn when the colony (re)starts, and the cockpit shows "1 note waiting" above the composer until then. Apr_opened,merged,closedorno_changescolony still answers 409, now saying why ("colony finished (merged): the note would go nowhere"), and the cockpit shows that reason instead of its generic text. (#1287) - Colonies on security hold no longer waste microVM slots. When a control-defeat signature is flagged on a colony (issue #609), the colony is now immediately parked with its microVM slot freed, keeping its worktree and transcript intact. The operator can see the colony in the holds list with its evidence and resume it once they have investigated. The park does not auto-resume: only an explicit operator resume brings the colony back into the queue at front priority (#1288).
- Settings → Secrets keeps the settings sidebar. Secrets is a settings page at
/settings/connections/secrets, shown inside the settings layout with its item highlighted, instead of a cockpit page of its own that dropped the sidebar./secretsand/settings/secretsopen it there, as do the header's Secrets button and the "Set key" links. It leaves the rail and the phone's More sheet; settings search still finds it. (#1290) - Verify retries with larger resources when the guest disk or memory fills. On large Rust
- Prevent infinite retries on corrupted git repository mirrors; automatically repair with reclone and set attention on unrecoverable corruption. When a git mirror became corrupted due to disk errors mid-write, every colony booting against it would retry infinitely, burning through the retry budget without progress. Now,
sync_repoclimbs a three-rung repair ladder: first, corrupt loose objects are cleaned locally and a fetch is retried; second, if still failing, the entire mirror is re-cloned from GitHub and the fetch retried; finally, if the re-clone's fetch fails, the operator is notified viamirror_needs_attentionand the colony enters an attention state to free its microVM slot. The corruption detection now covers additional git error messages (did not send all necessary objects,nonexistent object,missing object,broken ref) to catch corrupted refs in addition to corrupted objects. When mirror corruption is unrecoverable, the session'sattentionfield is set with reasonrepo_cache_corruption_unrecoverableso it doesn't silently hold a slot. (#1319) - The agent prompt explains why a nested clone's
.git/configand hooks are read-only, and how to clone without defeating the mount. Agit cloneinto the workspace (e.g. a build cloning a data repo into a gitignored dir) failed on the path policy's read-only binds; an agent that didn't know why tried toumountthem and was held ascontrol_defeat. The prompt now says why these binds exist, names the supported route (git clone --separate-git-dir=/tmp/<name>.gitto keep the git dir outside the workspace, or clone outside it entirely), and forbids trying to unmount. The hold itself is unchanged — a protection mount is real and trying to defeat it is realcontrol_defeat— and nested clones in gitignored dirs stay protected. (#1320)
Prebuilt Colonizer for Linux x86_64 (with KVM) and Apple Silicon Macs, built from f4c9b80.
curl -fsSL https://colonizer.dev/install.sh | shThe installer checks the archive against SHA256SUMS. It fetches the Claude Agent SDK from the npm registry, and on a Mac the Linux build of Claude Code, from Anthropic's own channels: neither is in the release. Guide: https://colonizer.dev/docs/install
Each artifact, SHA256SUMS included, also carries a build-provenance attestation recording the commit that built it. Verify one with:
gh attestation verify colonizer-<platform>.tar.gz --repo Colonizer-dev/harnessHere is linux-x86_64 or darwin-arm64.
The observability add-on rides along as colonizer-observability-.tar.gz for the same platforms; the installer puts it beside the colonizer binary, and the checksums and the attestation above cover it too.
Apple Silicon Macs can also use Colonizer-arm64.dmg: an unsigned app, so macOS asks you to approve it once (System Settings > Privacy & Security > Open Anyway). The curl installer above is the recommended path.
b2c3215c53b471f3b5651eb9de7c4b3c63f7504416211029195ffd72b82b8296 colonizer-darwin-arm64.tar.gz
37488c2e28fcf036296588e6c18b89740376c64e6f0bb44538cbc152a479e14c colonizer-linux-x86_64.tar.gz
0e5dc98700f3044345d38b68b85c226d98389c27f536d739a3263e776e015844 colonizer-observability-darwin-arm64.tar.gz
50625100559a77f6e0818d5c90cd102b37e6844f9152b5a9d2a9783fdad8d315 colonizer-observability-linux-x86_64.tar.gz
c82a03be3a727e10b22e8c0e3ae804be7ed5cb24403d8697b47beedef1c3ff86 Colonizer-arm64.dmg
a65be2043bbd94aa8d5e1e122113ae3d3945120bf4b2771fc300298a06e60f4e install.sh