Intelligence that doesn't wait for instructions.
Unbidden is an engineering agent you install like a CLI. It enters a repository it has never seen, runs the team's own checks in an offline sandbox, decides what is worth improving, makes the change, and measures whether the system actually got better. Then it says so at the level of evidence it reached, and not one level higher.
The loop, with no one steering
Each step is a job in a local queue. Each decision is recorded with its reason, and every byte that leaves the machine is kept.
Meta models, each where it belongs
Muse Spark 1.3 · remote
Heavy work on content allowed to leave: property tests, fixes, workloads, adapters. Private code reaches it only after the privacy bridge renames every non-public word.
Muse Glimmer · local
The only model that sees secrets, logs or production data. Chosen to fit the machine, from 30B 8-bit down to Llama 3.2 3B. Falling back to it is recorded, and a mandate can forbid it.
Guardian, deny by default
Pure Python; no model is its own control. Each payload is labeled, scanned and capped at 20 KB, then recorded byte for byte before it leaves.
A spend gate that cannot overrun
One ledger for the machine. Each call's worst cost is reserved before sending against a balance a person verified, with 20 % held back. US$0.96 spent so far, reconciled to the cent.
What it has shown
L4 is validated in the lab with the team's own checks. L5 is a measured effect in a running system, between deploys whose code is known. Negative results stay on the record.
| System | What Unbidden did on its own | Level |
|---|---|---|
| full-stack-fastapi-template | Found an unindexed foreign key nobody had reported; GET /items 13.0 → 4.1 ms (p = 3.4e-08); merged and deployed it | L4 |
| same, live | 10.5 → 1.7 ms after deploy, below the floor its criteria had fixed beforehand, so no L5 is claimed | L4, not L5 |
| same, outage drill | Outage called in 11 s, rolled back in 15 s with the team's steps, hold set for a person | rollback |
| Rich | Searched blind: two crashes in split_text, one matching an issue it was never shown; fix measured | L4 |
| mealie | Index found and measured: 14.5 s → 7 ms on SQLite, but the test suite never ran at the base, so it is a lab result, not a validated one. Deployed on Postgres: no change, baseline inferred | L3 · L5 invalid |
Across repositories it had never seen
Ten development and ten held-out repositories, chosen by written criteria and pinned before any run. They include languages Unbidden does not analyze yet, which stay in the denominator.
type: ignore comments its mypy called
unused. The team's CI was green, under Python versions Unbidden had not used, where those comments are needed. The patch
would have broken their build. Now the Director reads the CI's verdict in every cycle, and every candidate is
re-checked under the CI's newest interpreter. On the real patch, mypy reports 2 new errors, and the patch is rejected.
On the frozen holdout it found no validated improvement in ten mature libraries, and it claimed none.Install
One line puts unbidden in its own environment with its own Python 3.12, through
uv. The wheel is verified against the release's SHA256SUMS before
anything is installed; nothing runs with sudo. macOS on Apple Silicon and Linux x86-64.
curl -fsSL https://unbidden.cl/install.sh | sh cd your-repo unbidden # first time: a guided setup, no YAML; afterwards, the status screen unbidden start --ui # the agent in the background, serving its own dashboard unbidden status # found, decided, checked, asked, proved, spent unbidden stop # the process ends; nothing is frozen, nothing is lost
The machine provides git; Docker for the sandbox; Ollama for the local model option; a Meta API key for
the remote one. unbidden doctor says which of them your chosen option requires. Versions, exit codes,
update and the uninstall that keeps your data:
docs/INSTALL.md. Until the first
release is published, the installer stops with "no published release found".