channel.vexa.ai — the
live registry, not a test rig. Station: our own rehearsal station, not a
customer’s. Cluster: the rung-4 rig from
2026-09-06, unchanged. Container
work ran on an internal build host, never on a laptop.
Two sentences, so a reader skimming does not take the wrong one away. A
contract that admits a candidate entry was written, recorded in the state
ledger by pull request, and rendered ELIGIBLE against entry seq 5 by kit
v0.1.6 — that half works and is durable. The install did not run,
because the channel carries no chart for that release, so nothing here proves
that the cluster runs the entry’s bytes and this receipt does not claim it.
The subscriber is not named. Their registry hostnames, project names and estate
details are not in this document. The channel is written as
<pilot-channel>
and the rig’s pull-through registry as <harbor-host>.The rung, unchanged
Rung 4 of 4, and it is NOT OpenShift — akind cluster with PSA
restricted and Kyverno emulating restricted-v2. No oc, no SCC objects, no
OLM, no Routes, no internal registry, no GitOps operator. PROFILE_TESTED on
the openshift profile stays no, and nothing below changes that.
Why a candidate lane exists at all
Entry seq 5 is publishedcandidate. Three things follow from that, and every
existing contract on the channel refuses it for at least one of them:
Those refusals are correct. A candidate lane is the shape that consumes such
an entry without weakening the published lane, which is untouched — a second
contract for a second station, not an edit to the first.
The contract
contract_id: bbb-rehearsal-candidate-2026-09-07, sha256
da5d15d4a2e63c062741a2a7fcf33727ecde7269cfadffa27f56ccd9571ce533. JSON in the
2026-09 carriage{} shape, in the state ledger, moved there by pull request
as contracts must be.
report_scope.allowed_sections is the current spelling, and this matters
beyond our own file. kit/validate refuses a contract carrying the older
allowed_files rather than ignoring it — “a bound we cannot read is not a bound
we will guess at”. The pilot’s own contract in the ledger still carries
allowed_files, so its next submit will be refused locally until that clause
is renamed. That is a one-line edit, and it is a pull request against their
contract, not something we can do on their behalf.
Proof 1 — the kit came from the channel, verified before it was unpacked
channel.pub,
sha256:f6aac70ec20248f977403f256594ef50a5ea14b2b42e4d4ca1e456742db8fab9 —
byte-identical to the copy on the build host and to the one the rig’s admission
policy pins. The pull used a pull-only station credential, supplied through
the environment as bootstrap.sh reads it, never on a command line.
Proof 2 — ELIGIBLE
Where it stopped, at the exact line
The channel carries no chart for this release. The entry says so itself, in its ownevidence_absent block:
- The installer would render the wrong release.
install.shrenders the delivered set withhelm template … oci://…/charts/<chart>and no--version, so it resolves the newest chart —0.12.35, the previous entry’s. Installing under an entry-5 lane would put the previous entry’s bytes on the cluster. - The digest sets are disjoint. Of the entry’s 11 candidate-map image
digests, 0 appear in chart
0.12.35, which pins six application images at the previous release’s digests. The intersection is empty — not narrow, empty. - The in-cluster gate would ask for the wrong entry. The PreSync verify
hook derives its
--entry-reffromChart.AppVersion, so chart0.12.35asks the verifier for thepublishedentry — which this candidate contract correctly refuses. The lane and the chart disagree by construction.
chart step, and publishing it is a
signing act on the channel key — neither is a station’s act, and neither was
attempted.
Nothing was relaxed to get past this. The contract was not widened, the
admission policies were not touched, --skip-preflight was not used, and
install.sh was run only with --dry-run. The rig is byte-for-byte as the
previous run left it.
The one-line fix, named
Publish a digest-pinned chart for this release to the channel, withappVersion equal to the release version, and the same run becomes an install.
Until then the channel’s installable state is still the previous entry, and
a candidate lane can verify but not deliver.
The claim this run was for, answered honestly
“The cluster runs exactly the entry’s bytes.” It cannot be answered here, because none of the entry’s bytes were delivered. The station report’s ownrelease block is the evidence:
An empty answer, said out loud, rather than a green one assembled from a
different release’s pods.
What the kit did right — four defects closed
Measured against the seven recorded on 2026-09-06, with v0.1.6 pulled from the channel:
Defect 6’s closure is the one worth stating twice. The previous receipt
called it the sharpest thing that run found: the path that breaks is the
failure-reporting path, so a subscriber whose install goes wrong cannot file
the receipt that would represent them. This run drove a failing estate all
the way through:
vexa_validate.py then wrote a 402-line station-report.yaml carrying a
smoke_receipt section — exit 1, redaction verified, three values removed,
zero leaks — and the ingest gate that refused at S2 on 2026-09-06 accepted
it, wrote the station’s first state.yaml, and derived the
contract-breach flag from the non-PASS verdict. A failure is now
representable end to end.
Phase verdicts, for the record: preflight FAIL (exit 1 — P4 alone, on the
dynamic bot pod that carries no securityContext; seven of eight PASS with an
admin snapshot, and the live cluster contradicts P4 because a mutating webhook
runs before PSA validation) · install skipped · smoke FAIL (exit 1) ·
validate exit 1 · ingest accepted, verdict REFUSED.
Three new findings
1 · A kit bootstrapped from the channel reports no version.vexa_validate.py fills its kit: block from git describe / git rev-parse,
and a bootstrapped tree is not a git checkout — so kit.commit,
kit.describe and the state ledger’s kit_version are all null, while the
tree itself knows: VERSION beside install.sh reads version=v0.1.6. The
ledger row for a station that used a git clone carries a revision; the row
for a station that followed the documented onboarding path does not. That
is backwards, and it means we cannot currently say which kit produced any real
subscriber’s report. Suggested shape: read VERSION first and fall back to
git, rather than the reverse.
2 · --entry-seq and --entry-digest are cross-checked against nothing. A
first pass of this run passed both flags, and the report recorded the entry
sequence and digest as fact while listing six running image digests, none of
which belong to that entry. The report was discarded and regenerated without
the flags, so the one filed asserts no position — but a mistyped number would
have been ingested as an observation. The tool already has both sides in hand:
the asserted digest and the observed image list. Suggested shape: refuse, or
mark the position asserted rather than observed, when the entry’s images are
not the ones running.
3 · A station’s write path is its account name, and a station whose ledger
name differs cannot submit. The channel edge confines a station credential to
/v2/vexa/stations/<account>/** and compares the authenticated user against the
path segment, while --submit pushes to …/vexa/stations/<station-name>/…. A
station whose directory name in the ledger is not its account name gets a 403 at
the moment it tries to file its report — which is, again, the failure-reporting
path. Not exercised in this run (no write was attempted); recorded from the
edge’s own scope matrix and the submit path composition.
The pull path, since it is a standing question
The rig’s pull-through registry proxies the public image host anonymously — its upstream endpoint carries no credential — and the cluster node has a mirror entry only for the rig registry, so the delivered workloads’ own image pulls go directly to the public host from the build host’s address. Neither path spends the publishing account’s budget. Measured at the time of this run: anonymous, from the build host,limit 100/h · remaining 100; the publishing
account, limit 200/h · remaining 11. Budget was not a constraint on this
run and did not cause the stop.
What this receipt does NOT claim
- No OpenShift or OKD was involved. Unchanged from 2026-09-06.
- The cluster does not run the entry. Nothing was installed, nothing was synced, no application pod of this release exists.
- Nothing is said about the release’s quality. This is a delivery-path run.
- Defects 4, 5 and 7 from 2026-09-06 were not re-tested — they live past the install, and the install did not run. They are neither closed nor reopened.
- Revocation fail-closed remains unverified, exactly as it was.
Final state
The rig is left running, deliberately: it is the environment the install runs
against on the day a chart for this release exists.