Install commission
You will be able to get a working commission command on your machine today, know
exactly which of the four distribution paths exist yet and which do not, and
verify the install with one command that tells you the truth rather than a
version string.
No release has been published
Read this before you copy anything.
The repository has carried the placeholder version 0.1.0 since its first
commit and no tag has ever been cut. The ## Unreleased section of
CHANGELOG.md CHANGELOG.md is therefore the entire history to date; it
closes as 1.0.0-rc.1 when the release candidate is cut, following
the release checklist.
The practical consequence: of the four ways Commission will be delivered, exactly one works right now, and it is building from source. The other three are written up below so you can see how Commission will arrive, and every one of them is marked as not yet publishing artifacts. None of those commands resolves today, and a page that pretended otherwise would waste your afternoon.
Build from source — the path that works
Requires Bun 1.1 or newer, and access to the repository, which is private while the open- versus closed-source decision is still open.
git clone https://github.com/Row-Labs/commission.git
cd commission
bun install
bun linkbun link puts commission on your PATH from the bin entry in package.json.
Nothing is compiled and nothing is installed globally beyond that symlink, so
git pull && bun install is the whole upgrade procedure.
To produce a standalone binary instead — no Bun on the target machine, one file to copy:
bun run buildThat writes dist/commission. It is the same code the release workflow will
eventually publish; building it yourself is not a downgrade.
Verify the install
commission --version
commission doctorcommission --version prints the semver the binary reports on every surface — the
CLI, GET /v1/version, the MCP server, and package.json are checked against
each other by tests/version.test.ts, so the number cannot disagree with
itself. Until a release is cut it will say 0.1.0.
commission doctor is the real check. It opens the database, runs the migration
guard, validates any .commission.json it can find, and reports on the dependency
graph, claims, bindings, and the search index. It exits 0 when everything it
looked at is fine and 2 when something needs your attention — a refusal, in
commission’s own vocabulary, with the fixing command attached. See
exit codes.
The licence
Commission is licensed from the first command. A licence is a signed statement the machine verifies by itself — no network call, ever — so an air-gapped box, a container with no egress, or a laptop on a plane runs the entire product.
commission login stores it in the OS keyring. A file would be readable by
every process running as you, which on a machine with agents on it means every
agent — including ones you never meant to hand a credential to.
Four sources, in this order:
| 1 | COMMISSION_LICENCE=<token> | the licence itself — containers and CI, where there is no keyring |
| 2 | COMMISSION_LICENCE_HELPER=<command> | a command that prints the licence — Vault, 1Password, your own secret manager |
| 3 | the OS keyring | where login puts it; the default for a person |
| 4 | ~/.commission/licence (COMMISSION_LICENCE_FILE to move it) | the fallback where no keyring exists |
COMMISSION_STRICT_AUTH=1 stops after (2), so a CI job cannot silently inherit a
developer’s stored credential.
A failing helper is a refusal, never a fall-through to the next source — falling back would leave a machine quietly running on a credential the operator believed they had replaced.
Keyring visibility follows HOME, because the platform keeps keychains under
the user’s home directory. A process running with a different one — sudo, some
CI images — will not see an entry written by the logged-in user; it falls through
to the file, and then to a refusal naming COMMISSION_LICENCE, which is the
right answer in those environments.
| survives upgrade | yes — replacing the binary touches neither the keyring nor the file |
| inspect it | commission licence — holder, entitlement, expiry, and which source it came from |
| remove it | commission logout — clears both the keyring and the file |
What an agent sees when there is no licence
A refusal, never a prompt. An agent cannot sign up, accept terms, or reason about a quota, and blocking on input nobody will type is a hang rather than a gate:
Commission is licensed, and this machine is not
missing: no licence on this machine
hint: a person installs a licence on this machine — set COMMISSION_LICENCE to
the licence token, or write it to ~/.commission/licence. An agent cannot
do this part.Exit code 2, like every other refusal. The hint names the human’s command and says outright that the agent is not the one who can act on it — otherwise an agent reads a refusal as a task and goes looking for a way to authenticate itself.
When it lapses
commission licence warns for the last thirty days, on stderr, so a renewal is
never a surprise on a Monday morning. A lapsed licence stops the software; it
never touches your data. Export stays unconditional — commission dump works on
a lapsed licence, because a licence governs use of the program and never access
to what you recorded with it.
Where the database lives
Commission is a binary and a SQLite file. There is no server to run and nothing to host. It is licensed: a person signs in once per machine, and every agent on that machine inherits it.
| default path | ~/.commission/commission.db |
| override | COMMISSION_DB=/path/to/commission.db |
| created | on first use, with the current schema — there is no init step for the database |
| journal mode | WAL, so readers never block the writer |
Point COMMISSION_DB at a scratch file whenever you want to try something without
touching your real work:
COMMISSION_DB=/tmp/scratch.db commission init sandbox
COMMISSION_DB=/tmp/scratch.db commission boardBoth commands read the same override, so the sandbox and your real database never see each other.
The four paths, when RC1 is cut
| path | command |
|---|---|
| install script | curl -fsSL commission.sh/install | sh |
| Homebrew | brew install Row-Labs/commission/commission |
| npm | npm i -g @rowlabs/commission (also pnpm and bun) |
| by hand | anything under https://commission.sh/download/latest/ |
All four verify a SHA-256 checksum before installing anything, and all four
fetch from commission.sh rather than from GitHub. That is not a preference:
the repository is private, so release assets are 404 for anyone without access
to it — including every customer.
Distributing the binary openly gives nothing away. It does not run without a licence, which is checked on the machine at runtime. That is what the licence gate is for, and it is why installation can be this ordinary.
The install script picks a directory already on your PATH and already
writable, so it needs no sudo; set COMMISSION_BIN_DIR to override it, or
COMMISSION_VERSION to pin a release. Running it twice replaces the binary and
tells you what changed, rather than failing.
Set your actor name
Every claim, note, transition, and approval is attributed. Commission reads the actor
from COMMISSION_ACTOR:
export COMMISSION_ACTOR=blazeAgents get their own names — claude:api, claude:docs — and that is what makes
parallel work legible afterwards.
Setting COMMISSION_ACTOR names you, but it does not tell commission you are a person.
Nothing can: a process can set an environment variable as easily as you can, and
Commission will not guess, because an actor wrongly taken for a human could approve
its own work. So declare yourself once, in the repo:
commission actors add blaze --humanThat writes you into .commission.json as an owner and approver. Without it,
commission approve, commission verify, and commission answer all refuse — correctly, but
it is the kind of correct that reads like a bug when it happens to you. Commission
says so at commission init for the same reason.
Declaring actors is also what turns “who may approve this” into a checkable fact rather than a convention; see Guides → execution policies.
Next
- Your first task — a project, a graph, a claim, a refusal, a close.
- Your first agent — hand the loop to a coding agent.
- Reference → config — every
.commission.jsonkey.
Part of Start here.
This page is docs/start/install.md in the Commission
repository, rendered in place — the site keeps no copy of it. The repository is private, so there is no edit link to follow.