orion v0.4.2
August 26, 2026
Six fixes from the first real unattended runs of FCIA-6 and FCIA-7. Each one shares a shape: something reported success while the thing it claimed to have done had not actually happened.
The sharpest of these was Slack delivery: orion slack test checked the
token, the channel, the post, and the approval scopes — all four passed —
while every message landed in a private channel with no human members.
Slack accepted them silently; nobody could read one, search for one, or
know it existed. A related bug meant the channel a run actually posted to
depended on where the command was invoked from, because two different code
paths resolved it two different ways — one read the workspace record, the
other re-derived it from orion.json by slugifying the repo's absolute
path. Standing in a checkout could produce a channel name built from your
own home directory. Both now go through one resolver, and orion slack test fails loudly when the audience is nobody.
The job-limit fix matters for anyone running --max-jobs: because a tick
reconciles before it starts new work, a tight cap could collect the ticket
it had just finished, push, open the PR, move it to ci-wait, and exit —
with no watcher left running to notice CI go green, ask for approval, merge,
or prune the worktree. The ticket would sit "done" in CI with nobody told.
The cap now only stops starting new work; it keeps draining until
everything already in flight finishes.
The rest are smaller but still change visible behavior: merge conflicts
between two in-flight branches used to be silently retried forever, because
gh was never asked whether a merge was actually possible, so an impossible
merge looked identical to any other transient failure. orion collect used
to ask for approval and immediately exit — correct for a watcher, but wrong
for the manual invocation people reach for specifically because no watcher
is running. And two numbers in Orion's own output were simply wrong: a
context-usage figure that claimed 991% of the window on a real run (true
occupancy: 16%), and a "nothing is waiting on you" message after a
develop merge that hid the still-outstanding develop → main merge.
Fixed
orion slack testpassed all four checks (token, channel, post, approval scopes) while posting into a channel with no human members — messages were delivered but unreadable and unsearchable by anyone; the test now checks channel membership and fails when the audience is nobody- Channel resolution differed depending on where
orion slack testwas run — with a workspace record it used that record, without one it re-derived the channel fromorion.jsonby slugifying the repository's absolute filesystem path, producing names likeusers-navjyotnishant-desktop-github-njai; both paths now share one resolver, and the output states when the workspace record overridesorion.json tell()discarded the specific reason a message wasn't sent, so an unconfigured project failed silently with no explanation surfaced anywhere--max-jobs 1(and any tight cap) could collect a ticket, push, open its PR, and exit with no watcher left running — CI going green afterward triggered no approval request, no merge, and no worktree cleanup; the cap now only blocks starting new work and keeps draining in-flight tickets until they finish- A merge conflict between two in-flight branches was indistinguishable from a transient failure, so Orion retried the same impossible merge every tick indefinitely without ever telling a human to rebase; conflicts are now reported once per HEAD (and again after a rebase that doesn't fix it), with the ticket held in ci-wait so no re-labelling is needed to resume
orion collectrequested approval and exited immediately, which is right for a watcher's next tick but wrong for the manual path — used specifically because no watcher is running; it now waits (30 minutes by default,--wait/--no-wait), and Ctrl-C confirms the request still stands- Context usage was reported as cumulative session throughput divided by
window size, which always exceeds 100% on a long run because
cache_readre-counts the whole cached prefix every turn — one real log showed 991% claimed against 16% true occupancy; it's now a peak measured over turns read off the stream, and the unfixablebudget.ContextPressuremetric has been removed rather than patched - The post-merge message said "Nothing is waiting on you" after landing on
develop, implying a release had happened, when a develop → main merge was
still outstanding; it now names that merge explicitly, using the
project's configured branch names instead of a hardcoded
develop - the same message reported "your checkout was fast-forwarded", which is git's word for it and left the reader to work out whether they still had to pull; it now answers that question directly — the merged changes are already in the local copy and there is nothing to do — and when the sync was refused it hands over the exact command to fix it