← Back tolarr; Back to Changelog โ†’

Changelog

August 2026

๐Ÿงพ

Hire an agent, not a SaaS

commis shipped this month: a config-row spec (commis/v1), a roam execution bridge, peage metering (hold โ†’ capture โ†’ refund), hart delivery (the deliverable is the receipt), notify, cron scheduling with a reaper, and an approval channel you can answer from your phone โ€” email, webhook, ntfy, Telegram, or cuzz. No hosted rail has a default host: nothing you install talks to anyone else's machine until you point it at one.

โœ…

Fully agent-first: 5 for 5

commis now conforms to all five cli-specs.intrane.fr conventions โ€” output, guide, feedback, update, and telemetry. commis feedback reaches the operator even when the relay is down; commis update verifies a content hash, smoke-tests the download, and swaps atomically before ever touching the running binary.

๐Ÿ”

Dogfooding found what tests couldn't

Every one of these was found by running a real agent, not by writing a unit test: a weekly cron that silently never fired because the systemd timer never landed on the right minute; a PATH-based tool grant that a curious model bypassed on its own, twice, on two different rows; a delivery bug that shipped the wrong report the same day a fix landed. All four were found, fixed, and reshipped live the same day.

๐Ÿ›ก๏ธ

The PATH grant does not hold โ€” and now says so

A live run discovered, unprompted, that PATH=/usr/bin:$PATH curl ... reaches any binary the host has, granted or not. commis never shipped a fix that half-solves this โ€” the plan, README, and schema docs now say plainly that PATH raises the bar against an accident, not a boundary against a model actively trying to get out. Honest disclosure over a false sense of safety.

๐Ÿ‘ค

Unprivileged by default, when you ask for it

COMMIS_RUN_AS=<user> drops the worker process to a named unprivileged system user, narrowing what a misbehaving run can touch โ€” no other user's files, no sudo. Unset by default; a misconfigured drop fails loudly instead of silently running as root. Found live: it doesn't compose with a row that genuinely needs root (a system-prune row), and that gap is now documented rather than discovered the hard way twice.

๐Ÿ’ถ

Real cost, not just an estimate

Settlement now prefers the provider's own observed cost (OpenRouter reports it) over the token-rate guess used everywhere else. Every settled receipt discloses which one happened โ€” cost_basis: "observed" or "estimated" โ€” so an operator billing a stranger's wallet is never quietly relying on a rate-table guess when the truth was available for free.

๐Ÿ—‘๏ธ

Firing an agent now actually fires it

commis fire used to remove only the roster row โ€” the hart delivery key, run receipts, and a persistent (paid) relais approval inbox all stayed behind forever. It now releases everything, including the one item with an ongoing bill, and reports exactly what it cleaned.

๐Ÿงน

The destructive-approval gate, proven live

The last unverified claim in commis's whole design: does the approval gate actually stop a destructive command? Run for real on a production box, narrowly scoped to three apt cache files. Every rm was shown verbatim and approved individually before it ran; the deletions were confirmed against the real filesystem, and apt-get update regenerated everything cleanly afterward โ€” proving the "lossless" claim rather than just asserting it.

๐Ÿš€ Features

  • [10/08]feat: three real steps toward "stable" โ€” unprivileged runs, observed cost, and a fire that actually cleans up

๐Ÿ› Bug Fixes

  • [10/08]fix: deliverable path used this process's own HOME, not brg_home()
  • [10/08]fix: the PATH grant does not hold under --allow-shell, and say so
  • [10/08]fix(cron): anchor the generated systemd timer to the clock, not to boot
  • [07/08]fix(test): stop the update-server subshell from leaking across runs
  • [06/08]fix: the roam install instruction we ship 404s
  • [06/08]fix: stop telling agents to run 'du guide'
  • [06/08]fix: roster state patches failed silently on a reformatted row
  • [06/08]fix: price the cheap model tier
  • [06/08]fix: ask for the deliverable EARLY, not 'before finishing'
  • [06/08]fix: guide claimed three shipped features were not_yet
  • [06/08]fix: the messages a human reads follow the row's locale
  • [06/08]fix: hart's public repo is javimosch/machin-hart

๐Ÿ“š Documentation

  • [10/08]docs: document COMMIS_RUN_AS does not compose with rows needing root
  • [06/08]docs: a GitHub Pages site and the August changelog
  • [05/08]docs: binary size
  • [05/08]docs: binary size

๐Ÿงช Testing

  • [07/08]test: prove the halted-run salvage, and stop the page overstating too

๐Ÿ’ผ Other

  • [10/08]release: v0.14.2 โ€” guide/README document the COMMIS_RUN_AS composition gap
  • [07/08]M11: feedback + update โ€” commis is 5/5 on the cli-specs
  • [07/08]M10: tell the truth about the sandbox, salvage halted runs, ship a starter row
  • [06/08]M9: approvals that need no sending domain โ€” ntfy and telegram channels
  • [06/08]M8: no rail has a default host
  • [06/08]M7: three bugs only a live run could find
  • [06/08]M6: the approval channel โ€” a gate you can answer from your phone
  • [06/08]M5: schedule.cron โ€” hired agents run on their cadence, unattended
  • [05/08]M4: output.notify โ€” a finished run tells someone where the link is
  • [05/08]M3: hart delivery โ€” the deliverable is the receipt
  • [05/08]M2: peage metering โ€” a run holds, a settlement captures, the rest refunds
  • [05/08]M1: the roam bridge โ€” a row becomes a running, budgeted, gated job
  • [05/08]M0: the commis/v1 config-row schema and the plan compiler