Skip to content

Colonizer v0.2.12

Choose a tag to compare

@github-actions github-actions released this 07 Oct 18:21
Immutable release. Only release title and notes can be modified.
e67e4d7

Colonizer v0.2.12

What's new

  • Exec policy: tar and rsync --exclude patterns no longer count as touching a secret path, so copying a repository while excluding the placeholder dotfiles is no longer refused or flagged as a control bypass. --exclude-from and every other word still count.
  • The mothership can merge its own colonies' pull requests (merge steward). An org can set auto_merge to green or green+rebase in Settings → Workspaces, with a merge method (squash by default) and delete-branch. Every few minutes, one GraphQL read per org decides each colony pull request: a green, clean one is merged (GitHub's branch protection is never overridden); a behind or conflicting one gets GitHub's update-branch, then its colony is resumed to rebase; a real failing check resumes the colony with the job's log tail, twice at most; and a pull request whose jobs all failed in seconds with no steps, or that GitHub flagged for billing or a spending limit, is marked ci_blocked with one banner per org instead of burning colonies. The workspace page lists each pull request's state with a Merge now button. Off by default. (#1172)
  • A contradicted verification now sends the failure back to the agent instead of holding the colony: the failing check and command, the failing test names, the last 60 lines of the log (redacted), and the instruction to fix it, re-run the check and update pr.md. At most 2 automatic rounds per colony, then it holds with attention: verify_failed_repeatedly; when another check also fails on the base commit it holds at once with preexisting_failure and sends nothing. (#1186)
  • A question that closes without an answer is closed everywhere. A question whose tool call got its result without an answer (an exec-policy ask that timed out or was refused) no longer stays "open" for autopilot while the Nest shows nothing. It closes with a question_closed event (reason: tool_resolved, timeout or turn_end), a restart or resume repairs such ghosts from the event log, and autopilot only waits on a question the colony's record shows as waiting_for_answer, so a finished colony verifies and publishes instead of sitting until it is parked. (#1189)
  • The watchdog now fixes known stalls itself, and releases can install themselves. A remediation playbook (signature, action, bounded tries; defaults compiled in, playbook.toml in the config directory to add or replace rows) answers a placeholder-dotfile denial, a pr.md write refused outside the repo and a toolchain-installer denial with the exact fix message, switches a colony held on unrecognized_model or provider quota to a healthy fallback and resumes it, and publishes an idle colony whose verification is confirmed. The same denial after its tries stops the colony with attention looping. Each fix is logged as auto-fixed: <signature>, listed on the session as auto_fixes and shown in the colony header; security holds are never released. A new updates.auto_apply setting (off, when_idle, always) installs a newer release on the update-check cadence, with when_idle waiting until the spare app slot is free. (#1191)
  • Releases can be cut by a release train instead of by hand. scripts/release-prep.mjs does what the release pull requests did: it folds the changelog.d/ fragments into CHANGELOG.md, bumps the release crates to the next patch (a crate such as colonizer-redact that is already ahead is left alone), refreshes Cargo.lock and writes a release-notes stub, and does nothing when no fragment is pending. The new Release train workflow runs daily and by hand: while main has pending fragments and its latest CI runs are green it opens release: vX.Y.Z with auto-merge on, and after the merge it checks the tag gate, pushes the lightweight tag on the merge commit and dispatches Release on it (a tag pushed with GITHUB_TOKEN would not start it). release-train: skip in the head commit of main postpones a run, and only patch bumps are ever made. While a release pull request is open, the merge steward holds colony pull requests that add a fragment. See docs/release.md. (#1193)
  • The Loops page is one page, with one card for every loop. Built-in loops (Merge train, Dependencies & supply chain, TypeScript: remove any, Docs & README, Disk cleanup) and your own sit in two sections and wear the same card: name, switch, what it does, when it runs, what it covers, how the last run went, and a 7-day strip of runs coloured by outcome with a hairline for each day's spend. Details open in a drawer with 7, 30 and 90-day charts of runs and spend, the last run grouped by outcome (eleven pull requests blocked by the same billing error are one line with a link to fix it), the settings and every run. The mothership now keeps each loop's runs for 90 days — outcome, counts, dispatched colonies and what those colonies cost — and serves them at GET /api/loops/{id}/history?days=. (#1199)
  • Setup no longer asks for the Stack again after every restart. The image-pull status is held in memory, so it read idle after each restart and Setup showed "image is not cached" even with the image on disk. The mothership now checks the image cache at startup and before answering GET /api/sandbox/pull, reporting cached for an image that is already there. Setup shows "Checking the image…" while that state is unknown instead of asking, and the advisory rows (Stack, first launch, live map) no longer turn the Settings dot amber once the machine, GitHub and Claude rows are done. The Stack and live-map rows have a "Don't ask again", kept on the mothership in setup.json (GET/PUT /api/setup). (#1200)
  • The navbar model dropdown now sets the judge model too. A Judge row sits below the colony models, labelled "Answers colonies' questions for you", with a health dot (green answering, amber degraded, red failing). Picking a model saves only autonomy.settings.model, merged into the saved settings. The list is every provider/model from Model providers, plus fable and opus only when an api.anthropic.com provider with a key exists. While the judge is failing the pill shows a small warning and the dropdown suggests a healthy model. (#1201)
  • Add a provider starts from logo tiles. Anthropic API, OpenRouter, DeepSeek, MiniMax, Z.AI, Alibaba, OpenAI, Local and Custom are one tap away and open a short form (the key, with the models prefilled from the catalogue); "Search 83 more…" opens the rest of the catalogue, and the disclaimers are one muted line with a "Why?" for the full text. (#1204)
  • The Model providers page is a quiet list, with credits left and when they reset. Each provider is one row (logo, name, status dot, a gauge of the plan left, "resets in 3 h 12 min") that opens to a credits chart over the last 7 days with reset markers and a projected run-out, requests, failures and time per day as sparklines, the models ("3 enabled · +5 available"), which model settings use it and the connection details. The Mothership now keeps 30 days of per-day usage, plan-balance readings (read on Check and every half hour) and plan events, served by GET /api/providers/{id}/usage?days=; a plan balance reader can name a reset time with a new reset pointer. A provider with no balance reader says "balance unknown". (#1204)
  • A moved branch, a failed parent and a fixture key no longer fail a colony. A push rejected as non-fast-forward (something else, such as a merge of main or update-branch, moved the colony's branch on GitHub) now fetches the branch, rebases the colony's new commits onto it (a merge when the rebase cannot), and pushes again, twice at most; a conflict resumes the colony with a rebase note instead of failing it. A colony stacked on a parent is never failed when its boot finds the parent unable to lend a branch: it goes back to the queue (which walks it up the stack or re-bases it on the default branch), waits as blocked while the parent is paused, or re-bases on the default branch when the parent is gone for good. Before pushing, the colony's added lines are scanned with the log redactor, and a secret-shaped literal (a realistic test key) resumes the colony once with the path:line and kind, and never the value, asking it to build the fake key at runtime; a GH013 push-protection rejection is parsed for the same paths and handled the same way. (#1206)
  • A long colony opens on its latest messages and loads the older ones as you scroll up. The colony chat used to fetch and render a colony's whole history before anything showed, which was slow for colonies with thousands of events, on a phone or over remote access. Now the events socket takes limit and sends only the newest page of the current run (about 200 events, extended back to the start of the turn it would cut) with a history frame saying whether more is behind it, and GET /api/sessions/{id}/events?before=<seq>&limit= returns the page before, read from the end of events.jsonl and then the rotated events-N.jsonl so the cost does not grow with the history. Scrolling near the top loads the previous page and keeps your place, with a "Loading earlier…" row and a "Jump to start" for very long chats; live events stream at the bottom as before. The settler cards, their numbering, the cost and the brief come from a summary the mothership keeps instead of a replay of every event, and a socket without limit replays the whole run as before. For 5,000 events the first paint carries 75 KB instead of 1.85 MB. (#1210)
  • One repository multi-select everywhere a setting takes repositories. The Docs & README, merge train, dependencies and TypeScript loops, the org settings (close superseded PRs, colony merge requests) and a phone's repository filter now share a searchable dropdown: "All repositories", "All in " and each repository as a checkbox, shown as removable chips, with "Add owner/name…" for repositories not known yet. The server accepts owner and * in every one of those lists (never takes no wildcard), documented in the Mothership API. (#1212)
  • Hide a GitHub org from Colonizer. Settings → Workspaces → "Show or hide orgs" has a "Show in Colonizer" toggle per org, search, a "Hidden (n)" section and "Hide all without colonies"; the workspace switcher has "Manage orgs…". A hidden org leaves the switcher, the repository pickers, the backlog counts and the merge steward, and the * ("all repositories") choice of every loop and setting skips it, resolved when it is used. Nothing is deleted and running colonies keep running. (#1213)
  • The cockpit chat can now act, and every change waits for your approval. On Anthropic-wire models the chat is connected to the Colonizer tools: reads (colonies, questions, issues, loops, providers, model assignments, orgs, the activity log) run at once, and every write (stop, resume, publish, answer, launch, queue order, switch models, run a loop, apply an update) becomes an approval card showing the exact action in plain words, the dry-run diff where the API has one, and how many colonies, orgs and repos it reaches, with Approve, Edit and Reject. POST /api/chat/approvals/{id} settles each call exactly once and writes chat.approve or chat.reject to the activity log. Secret values, security-hold release and switched-off orgs are refused, and writes are rate-limited. (#1217)
  • Spotlight: one bar to ask, search and act from anywhere. ⌘K or /, the "Ask or search…" pill in the top bar, and the phone's floating button (or a pull down) open one frosted panel over the current page. One ranked list blends Go to (colonies, repositories, workspaces, Settings pages and fields, loops, chats), Do ("colonize #212", stop, resume, move to front, switch model, apply the update) and open Issues, ranked by what you seem to mean; an "Ask Colonizer" row is always last and streams its answer inline, then Expands into a full thread on the Chat page. Recents show when the box is empty and Up recalls the last question. The Colonize pane is now reached from Do (or its button). The Colonize issue list is friendlier: grouped by repository, a plain one-line summary and a state pill with a live dot per row, status, label and priority filters, Colonize, Move to front, Skip and GitHub on each row, and bulk actions. (#1218)
  • Trusted auto-colonize: new issues from people the org trusts start by themselves. Set auto_colonize to trusted per org (Settings → Workspaces → Colonies → Auto-colonize) or per repository (PUT /api/repos/{owner}/{name}/auto-colonize); it is off by default and only issues filed after you turn it on are taken. An author is trusted when GitHub says they are an org member or owner, a collaborator with write access, an allowlisted login (auto_colonize_allow) or the signed-in account itself, looked up through the API and cached for five minutes, never read from author_association. A stranger's issue, an issue a stranger edited, one labelled no-colonize or needs-human, and anything in a hidden org never starts by itself; the issues list (GET /api/repos/{owner}/{name}/issues) carries intake: {mode: auto|review, reason, label, author, trusted, …} on each issue, and POST …/issues/{number}/intake dismisses or restores one. A repository starts at most 5 auto colonies an hour (auto_colonize_rate), a colony that started this way is checked again at boot, and comments from outside the org are left out of its brief. Every trust decision is a line in the activity log. (#1219)
  • Overview and workspace dashboards: more room between the Colonize button and the range and Compare controls below it, so they no longer touch.
  • Release train: release-prep.mjs falls back to a networked cargo update -w when the offline one fails, so it works on a fresh CI runner with no registry cache.

Prebuilt Colonizer for Linux x86_64 (with KVM) and Apple Silicon Macs, built from e67e4d7.

curl -fsSL https://colonizer.dev/install.sh | sh

The 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/harness

Here is linux-x86_64 or darwin-arm64.

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.

84f9a7a62ac65fcfac98d28dacab71b65f7886bb2e4c0e322d9db4e3148ca6f8  colonizer-darwin-arm64.tar.gz
adbbce56b8a1a1e0299302215fa9d88848e00a6fc0d124d89de7c3ffd1050dab  colonizer-linux-x86_64.tar.gz
e791f03a233caaec1639411fcf0405f1ef0dc63e6eb99368f76270be4fc4e00f  Colonizer-arm64.dmg
4293bed20d991fb79164e457163a058fb362f10e480c0588e0edac4d3ffd7b4b  install.sh