First full release of 0.1.0. It is v0.1.0-rc.2 plus the two entries below —
everything the two release-candidate sections describe is in it, and those sections
stay as the record of when each part arrived.
Published as ghcr.io/sageox/agent-base:0.1.0, and this is the first release to take
the floating tags a candidate is refused: :latest and :0.1. :0 is not published
at all — before 1.0.0 a minor bump may break you, so a major-only alias would promise
a stability that does not exist. Pin the digest recorded on the GitHub Release in
production; the tags are for humans.
Still pre-1.0: configuration format and CLI flags may move between minor versions.
The Helm chart is 0.9.0, unchanged since rc.2. Both entries below are code rather than
templates — jobs[].report.probe is a key an older binary refuses under .strict(),
and announce: reported is a value outside that binary's enum — so roll the image
before setting either, and no chart bump is needed to render an agent that does.
Added
-
A job body can post into its report channel, read the answers back, and mint its
verdict from what it read.jobs[].report.probe: trueopens a per-run channel the body
reaches over HTTP atJOB_CHANNEL_URLwithJOB_CHANNEL_TOKEN, carrying two verbs:
post_message, bounded to the one channel the job declared, andthread_read, bounded
to a root that same run posted. Until now a body's only channel output was the terminal
verdict the host mints — right for a job that observes, and unable to express a job
that probes, where the reply set is knowable from the channel and from nowhere else.
A fleet roll call is that job: a Deployment can beReadyand green while consuming no
events at all. The listener is opened before the body is spawned and closed when it
exits, its token is minted per run, and there is no field for a destination — the brain
is not offered any of it, and a job body is still not an MCP client of the gateway. A
surface with no thread model refuses the read rather than answering with an empty thread,
because "nobody replied" and "this surface cannot tell you" are different findings.
SurfaceAdaptergains an optionalreadThread, implemented on Buzz as one REQ on the
socket it already holds; a job that declares noprobeis spawned into exactly the
envelope it had before. -
A job that is both scheduled and reporting can be heard only when it has something to
say.jobs[].report.announcegains a third mode,reported, which posts a run whose
body wrote adetailon some gate, whatever the verdict, and behaves asunproven
otherwise. Neither existing mode fits a job that ticks every half hour and finds something
twice a month:alwaysmakes it a half-hourly "nothing to report" in a channel, and
unprovenis structurally silent on the runs that did the work, since a run whose gates
all passed has nothing unproven to announce. Keying ondetailis the distinction — gates
without prose are outcomes the verdict already speaks for, while adetailis a sentence
the body composed for a human. It buys no pass, because the status word in front of that
sentence is still minted from the verdict, and it lowers no floor: a body that wrote no
gates is still UNKNOWN and still posts.unprovenandalwaysare unchanged.
Runtime image
ghcr.io/sageox/agent-base@sha256:e84c494f743d2d2fb3f7d1ec025bec271dccae73c26866748085ed3a57b5fe73
Pullable anonymously, linux/amd64,linux/arm64. Pin the digest in production: the 0.1.0 tag is immutable and is never republished.