T76 Verified Release Candidate and Publication Validation
T76 Verified Release Candidate and Publication Validation
Scope and revision binding
This report validates the merged T76 release-publication surface at exact
revision a49f3dd5aa3e639db87f8715077446ec075600e9, which is reachable from
origin/main (git merge-base --is-ancestor confirmed). The candidate that
was signed, published, and activated was built at that revision and no other;
gateRevision names the same commit because the five gate profiles ran there.
T76 is the first task in the chain whose evidence is not exhausted by deterministic tests. The publication reached a live endpoint, the release was activated on two real hosts, and the package was published to the public npm registry. Those steps are recorded below as live evidence with their run identifiers and digests, separately from the deterministic gates, because they are reproducible only by repeating the operator procedure, not by re-running a suite.
Authorship is stated plainly rather than claimed as independent. The
publication script, the sealed-launcher closure, the workflow, and the fixes
listed under “Defects found by live verification” were authored by an agent
session operating as the repository owner’s automation. The live operator
steps — provisioning storage custody, dispatching the publication workflow,
uploading the emitted tree, and npm publish under the owner’s 2FA — were
performed with the owner’s authorization on 2026-08-26. Human review and merge
authority were exercised by the owner (accd) on every pull request this
report cites. This report does not claim an independent verifier distinct from
the implementation author, because there was none; reviewedIn records where
the review actually happened, and the Protect main ruleset governs what
merged. Read the accountability from those, not from this file.
Deterministic gates
Candidate build run 32927839487 built the five-target fleet at exactly
a49f3dd5aa3e639db87f8715077446ec075600e9. Each of the five target legs ran
all five gate profiles before sealing its target, so every profile below is
evidenced on every supported platform at the bound revision.
| Profile | Legs | Result |
|---|---|---|
gate:quick |
5 | pass |
gate:full |
5 | pass |
gate:build |
5 | pass |
gate:security |
5 | pass |
gate:release |
5 | pass |
25 profile executions, zero failures, zero skipped, zero todo. Targets:
win32-x64, darwin-x64, darwin-arm64, linux-x64, linux-arm64.
Publication run 32929312169 consumed that sealed candidate and emitted the
signed publication: base URL
https://pub-0fa3e4c3f26540e793952fa2c187d536.r2.dev/, metadata_version 1,
expiry 2027-08-26T00:00:00.000Z, with the rollback proof drawn from the prior
sealed candidate af8bcf044cf8 (run 32916088873). The workflow’s own
verification build consumed the single emitted release-inputs/ directory,
which is what proves the emitted bytes are the launcher’s real input rather
than a shape that merely resembles one.
Acceptance criteria
The four criteria are quoted from .specs/features/t76-tuf-publication/spec.md.
| Criterion | Evidence |
|---|---|
1. A sealed five-target closure, a valid prior rollback index, and a valid base URL produce one signed TUF repository per target, exactly one release-inputs/ directory, and one upload manifest naming every asset’s digest and remote key |
tests/build/t76-release-publication.test.mjs (18 tests) asserts the per-target signed repositories, the single shared release-inputs/, and that every metadataBaseUrl/targetBaseUrl pair and every asset remoteKey mirrors the emitted publication/<targetKey>/{metadata,targets}/ tree byte for byte. Live: run 32929312169 emitted exactly that tree for all five targets, and its 990 manifest assets were uploaded against their declared remote keys. |
2. Any invalid base URL, closure, rollback, digest, or key input stops the run with the matching VES_T76_PUBLISH_* code before a publication byte is written, leaving no output directory behind |
Same suite: the base-URL rejection set (non-HTTPS scheme, userinfo, query, fragment, missing trailing slash, ${ marker, over-long value) each asserts VES_T76_PUBLISH_BASE_URL_INVALID and that no output directory exists afterwards; rollback rejections assert VES_T76_PUBLISH_ROLLBACK_INCOMPLETE and VES_T76_PUBLISH_CANDIDATE_INVALID; malformed key shapes fail with no cause chain. Sensor mutations 5 and 6 confirm these assertions are load-bearing. |
3. The emitted release-inputs/ directory is accepted unchanged by the launcher’s loadPinnedInputs and by build:vestra-launcher, for every supported target key at once |
Same suite round-trips the emitted bytes through the launcher’s real loadPinnedInputs and buildVestraLauncher — the production loader, not a fixture — with a schemaVersion-2 source map naming all five target keys. tests/security/vestra-launcher-package-security.test.mjs (14 tests) holds the loader’s fail-closed boundary; sensor mutation 8 confirms the exact-keys check is what rejects a non-conforming source. Live: the publication workflow’s verification build consumed the single emitted directory. |
4. From a staged release layout with no repository sources and no dependency store, the real NodeActivationHealthGate returns activation health evidence for both canonical launchers, and the same sealed binaries execute ordinary CLI argument vectors reporting the compiled-in sealed semantic version |
tests/build/sealed-launcher-closure.test.mjs (7 tests) drives the real NodeActivationHealthGate against a staged layout with no src/ and no node_modules/, asserts the honest observation contents, and holds a red case proving the development shims fail the same gate. tests/build/reproducible-target-build.test.mjs (3 tests) binds the launcher digest to the deterministic closure bundle and refuses a dirty build tree. Live: both bins printed Verchestra 0.0.0-qualification after real activation on win32-x64 and linux-x64, and --help rendered the activated CLI’s real command surface. |
Spec-anchored adequacy matrix
| Requirement | Happy-path assertion | Failure-path assertion |
|---|---|---|
| TP-01 | tests/build/tuf-publication.test.mjs (6) signed root, top-level targets, terminating component delegation, snapshot, timestamp, manifest and component targets |
unsafe target paths refused before any publication directory exists |
| TP-02 | Same suite resolves the published bundle through TufUpdateClient, including a realistic bundle with nested and runtime component paths; consistent-snapshot and non-consistent-snapshot layouts agree |
partial publication surfaces VES_TUF_PARTIAL_PUBLISH (sensor mutation 1) |
| TP-03 | tests/security/tuf-publication-security.test.mjs (3) threshold and expiry acceptance |
missing/unattainable signers, invalid expiry, incomplete and duplicate bytes, byte-digest mismatch all fail closed before publication |
| TP-04 | — | Same suite mutates published target bytes and asserts TUF verification fails and no activation-allowed staged release is produced |
| TP-05 | Upload-manifest test proves each metadataBaseUrl/targetBaseUrl pair and every remoteKey mirrors the emitted tree |
base-URL rejection set with no output directory created |
| TP-06 | Single release-inputs/ round-trips through the real loadPinnedInputs and buildVestraLauncher; TUF-client staging of the win32-x64 and linux-arm64 published repositories with full component coverage |
apps/vestra-launcher loader rejects any non-conforming source (tests/security/vestra-launcher-package-security.test.mjs) |
| TP-07 | Publication succeeds only with a sealed prior index covering every fleet key | rollback index missing a fleet key, re-serialized, sealing the published revision, or repeating the current release digest each rejected |
| TP-08 | CLI success run emits a summary containing no key material | malformed-key set, cause-free failure proof, and CLI failure run never echo key bytes; tests/agent-readiness/t76-publish-workflow.test.mjs (12) asserts exactly one secret name in exactly one step, env:-mediated |
| TP-09 | Workflow emits three fail-closed artifacts and builds the launcher from the single release-inputs/ |
ownership test forbids github.repository, storage CLI strings, and extra secrets; env-mediation test forbids run-block interpolation |
| TP-10 | tests/build/sealed-launcher-closure.test.mjs real health gate over the staged layout, honest observations, delegated --version/--help, byte-identical rebuilds, built-ins-only imports; tests/build/reproducible-target-build.test.mjs bundled-launcher digest and sealed closure sources |
dev-shim red case; VES_T76_BUILD_TREE_DIRTY on a drifted build tree; win32 sealed-runtime naming (sensor mutations 2, 3, 4, 7) |
Reverse mapping: every assertion in the T76 suites is claimed by a requirement above. No test is skipped, marked todo, or vacuous.
Recorded limitation: how the four source modes are actually evidenced
TP-02 requires the TUF client to resolve the same bundle in online, mirror, offline, and air-gapped source modes. What is proven at this revision is narrower than a four-mode cross-adapter equivalence, and is stated exactly:
- Offline, over the real emitted tree.
tests/build/t76-release-publication.test.mjsstages the actual publication output throughNodeFilesystemDistributionSource{ mode: "offline" }forwin32-x64andlinux-arm64, asserting the stagedreleaseDigestand the full component logical-path set equal the sealed bundle’s. - Online, live, over the same published tree. The activation runs recorded
below resolved that tree through
HttpsDistributionSource{ mode: "online" }from the R2 endpoint, resolving the pinned release identityrelease:verchestra:0.0.0-qualification:a49f3dd5aa3eon Windows and on Linux.
Two honest qualifications, recorded rather than omitted:
- The four-mode loops in
tests/build/tuf-publication.test.mjsandtests/build/materialized-tuf-publication.test.mjsuse theMapDistributionSourcetest double, whosemodeis a cosmetic constructor label: the same in-memory maps answer every read regardless of the label, so those loops prove mode propagation, not adapter equivalence. - The four view descriptors built by
viewsFor()inscripts/t76-publish-release.mjsare digest-bound into the release candidate, but they are not observable in the emittedpublication-manifest.json, whose schema carries noviewsarray.
A separate pull request landing in parallel (“PR A”) emits the views array
into the manifest and adds a real cross-adapter equivalence test — HTTPS-online
against filesystem-offline over the same emitted tree. That is post-revision
hardening; it is deliberately not counted as evidence for
a49f3dd5aa3e639db87f8715077446ec075600e9.
Discrimination sensors
Eight mutations were applied to the merged sources in a clean worktree at this
revision. Each was introduced, run against the smallest pinned suite, restored
with git checkout --, verified byte-identical with git diff --quiet, and
the suite re-run to green. Every one was killed.
| # | Defect introduced | Pinned suite | Killing assertion |
|---|---|---|---|
| 1 | Delegation paths reverted from the bundle-derived list to the four hardcoded globs components/*, runtime/*, native/*, bin/* |
tests/build/tuf-publication.test.mjs |
4 of 6 tests fail, each code: 'VES_TUF_PARTIAL_PUBLISH', including “a realistic bundle with nested and runtime component paths stages end to end” |
| 2 | launcher:vestra sealed from the development shim apps/vestra-cli/bin/vestra.mjs verbatim instead of the deterministic closure bundle |
tests/build/reproducible-target-build.test.mjs |
“the real target builder binds exact revision, host assets, and all supply-chain evidence” — AssertionError [ERR_ASSERTION] on launcher contentDigest: actual sha256:22aeb384…, expected sha256:196a2df3… (the bundled closure digest) |
| 3 | Win32 conditional removed, so the sealed runtime is always runtime/node |
tests/build/reproducible-target-build.test.mjs |
Same test — actual: 'runtime/node', expected: 'runtime/node.exe'. Discriminating for real: the suite ran on a win32 host, which is the platform whose process creation requires the extension |
| 4 | One check name (driver) omitted from the sealed launcher’s activation health report |
tests/build/sealed-launcher-closure.test.mjs |
“both sealed launchers pass the real activation health gate from the staged layout” — code: 'VES_LAUNCHER_HEALTH_REPORT_INVALID'; “the health report carries only honest observations of the staged closure” also fails |
| 5 | Per-target rollback completeness weakened to “at least one prior proof” | tests/build/t76-release-publication.test.mjs |
“refuses a rollback index that does not seal a prior release for every supported target” — expected VES_T76_PUBLISH_ROLLBACK_INCOMPLETE, actual VES_T76_PUBLISH_CANDIDATE_INVALID |
| 6 | Base-URL validator accepts http: alongside https: |
tests/build/t76-release-publication.test.mjs |
“refuses every invalid base URL before any output directory is created” — Missing expected rejection: http://releases.example.invalid/verchestra/ must be refused, expected VES_T76_PUBLISH_BASE_URL_INVALID |
| 7 | --untracked-files=no removed, restoring overbroad full-porcelain tree-dirty refusal |
tests/build/reproducible-target-build.test.mjs |
“the same exact inputs produce byte-identical target output” — code: 'VES_T76_BUILD_TREE_DIRTY' raised by a legitimate untracked byproduct |
| 8 | hasExactKeys weakened from exact-key equality to a subset check in the launcher’s pinned-input loader |
tests/security/vestra-launcher-package-security.test.mjs |
“release configuration with missing, unknown, or malformed fields is refused” — Missing expected rejection, expected VES_VESTRA_INPUTS_INVALID (an extra key in the release source is silently accepted) |
8 killed, 0 survived. Mutations 2, 3 and 7 touch the same file and were applied one at a time, each with its own restore-and-green cycle.
Non-shallow checks
- The launcher round-trip runs the production
loadPinnedInputsandbuildVestraLauncher, not a reimplementation, so a loader that drifts from the emitted bytes fails rather than being mirrored by the test. - The activation health evidence comes from the real
NodeActivationHealthGatespawning the sealed binaries from a staged layout stripped ofsrc/andnode_modules/, and the suite holds a red case proving the previous dev-shim launchers fail that same gate. That red case exists because a live install failed exactly that way; the earlier synthetic launcher fixtures never executed the real bins. - The reproducible-build suite operates on a sealed single-commit replica of
the working tree (
tests/helpers/sealed-repository-fixture.mjs), because the builder refuses a dirty tree — never by committing into a developer checkout. - Fixtures use ephemeral in-process signing keys and
mkdtemp(tmpdir())roots only. No repository secret, CI secret, credential, or machine-local path appears in any tracked file.
Live evidence (operator-authorized, 2026-08-26)
Every item below is from an executed command, not a projection.
Publication. Endpoint: Cloudflare R2 bucket behind the managed public base
https://pub-0fa3e4c3f26540e793952fa2c187d536.r2.dev/. Candidate
a49f3dd5aa3e639db87f8715077446ec075600e9 (run 32927839487), published by run
32929312169 with the rollback index from af8bcf044cf8 (run 32916088873).
Integrity. All 990 manifest assets were sha256-verified locally before upload. Each uploaded object’s stored bytes were then proven by comparing the store’s returned content hash against the local hash: 101 changed or new objects uploaded, 889 hash-named objects unchanged from the previous upload and reused — which is precisely the consistent-snapshot property, not an untested assumption.
Endpoint conformance, probed against the TUF client’s own requirements:
metadata answers 200 with an exact Content-Length and no
Content-Encoding even when the client offers gzip; a ranged target request
answers 206 with an exact Content-Range; no redirects on any path.
Live activation, win32-x64 (native Windows), from wiped managed state.
Cold run 93 s end to end — TUF resolution, download, staging, both sealed
launchers through the real activation health gate, promotion, and verified
handoff. Warm run 5 s. Both vestra and verchestra print
Verchestra 0.0.0-qualification; --help renders the activated CLI’s real
command surface.
Live activation, linux-x64 (Docker node:24, linux/amd64). Global
install of the packed tarball, cold run 2 m 27 s, warm run 5 s, both bins, same
help surface.
Reproducibility. The operator’s Windows build is byte-identical to the CI
verification artifact at the same revision (diff -r, zero differences),
packed as verchestra-0.0.0-qualification.tgz, shasum
c6a482d25b59ebae93c4094974b7de5b85ca467a.
Registry publication. verchestra@0.0.0-qualification is published on the
public npm registry with dist-tag latest, same shasum
c6a482d25b59ebae93c4094974b7de5b85ca467a, published by the owner under 2FA on
2026-08-26.
Clean-machine registry smoke.
docker run --rm --platform linux/amd64 node:24 npx -y verchestra --version
completed with exit code 0 in 1 m 46 s, printing
Verchestra 0.0.0-qualification (source build, no verified release artifact).
The parenthetical is the known cosmetic item recorded in the feature
validation: a sealed package’s manifest releaseDigest is protocol-null, so
--version renders the source-build suffix. The rendering decision is
deliberately unchanged at this revision.
Defects found by live verification and fixed
Live execution found four defects that no deterministic gate had caught, because no gate had previously executed the real sealed artifacts:
- Sealed dev-shim launchers and the missing
--activation-healthprotocol (#364). Earlier candidates staged a full release and then failedVES_ACTIVATION_HEALTH_FAILED, because the sealedbin/*.mjsimported../src/main.ts, which does not resolve in a staged layout. Fixed by bundling the tracked closure entries and implementing the health protocol. - Extensionless win32 runtime (#365). Windows resolves image names through
PATHEXT, so an extensionlessruntime/nodeisENOENTthere. - Overbroad tree-dirty refusal (#366). Full porcelain status refused legitimate untracked byproducts; only tracked drift may block a build.
- Delegation segment-count mismatch (#359, earlier).
tuf-jsmatches delegation patterns segment by segment, so wildcard globs could never match the nested component paths a real candidate carries.
Supporting merged pull requests for this task: #359, #360, #361, #362, #364, #365, #366, #367, together with the earlier candidate machinery.
What is not claimed
- No independent verifier distinct from the implementation author. See the authorship statement above.
- A four-mode cross-adapter equivalence test is not evidence at this revision; see “Recorded limitation”.
- Publication does not make Verchestra production-ready or 1.0. The version is
0.0.0-qualification, and T77 — independent acceptance and the 1.0 decision — remains the next product task.
Verdict
PASS. 4 of 4 acceptance criteria proven at
a49f3dd5aa3e639db87f8715077446ec075600e9: five gate profiles green on all
five targets in candidate run 32927839487; a signed five-target publication in
run 32929312169; 990 assets verified byte for byte at the endpoint; live
activation through the real health gate on two platforms; a byte-identical
reproducible package published to the public registry and re-verified from a
clean machine; 8 discrimination mutations killed with zero survivors; zero
skipped and zero todo.
