@@ -55,7 +55,8 @@ adds the lockfile as the fourth changed path in the full-build checkout.
5555Native Rust1.95.0 builds the login library tests and actual CLI with ` --locked `
5656and the upstream ` dev-small ` profile, two compile jobs and a90-minute job limit.
5757This is a development validation build, not a release or reproducibility claim.
58- No binary is uploaded or deployed. CI records source/patch/toolchain/binary
58+ Push builds upload no binary; explicit retention is described below. Nothing is
59+ deployed. CI records source/patch/toolchain/binary
5960digests; these bind the observed build, not an independently signed attestation.
6061
6162An isolation-only preflight precedes compilation, creates/verifies the private
@@ -109,7 +110,8 @@ An independent host-side kernel namespace-reference check follows Bubblewrap's
109110PID-namespace teardown. Passing runs print only count/status receipts. Failure
110111diagnostics bound synthetic-only stderr/syscall tails and selected process
111112status; never reuse this reporter with real credentials/profiles. Generated peer
112- keys are removed by the wrapper; no binary or test-state artifact is uploaded.
113+ keys are removed by the wrapper; no test-state artifact is uploaded. Binary
114+ retention is a separate explicit opt-in below.
113115
114116Actual native protocol results remain pending until the exact-source workflow
115117finishes. Synthetic codes are not credentials, successful cancellation is not
@@ -180,9 +182,48 @@ pinned app-server starts a model-catalog refresh worker when auth already exists
180182Do not broaden this test to real model/provider routes or disable TLS as fallback.
181183Trace/private-state/process/namespace checks apply to both native processes;
182184receipts print only counts and booleans, not session contents. The same disposable
183- tmpfs is destroyed afterward. No persistent credential/binary artifact is uploaded.
185+ tmpfs is destroyed afterward. No credential/test-state artifact is uploaded.
184186Actual exchange results require the exact-source native workflow to finish.
185187
188+ ## Retained Runtime Candidate
189+
190+ ` runtime_bundle.py create ` first rechecks the locked native source receipt and
191+ packages the actual Linux ELF as ` bin/client ` , that receipt, the integration
192+ patch, upstream/patch licenses and a resolved Cargo dependency notice inventory.
193+ No profile, authorization, build cache, diagnostic log or database is included.
194+ The same packaged bytes run the offline version and all ten synthetic protocol/
195+ exchange cases. A final directory verification precedes any upload.
196+
197+ Normal push builds retain nothing. An owner-approved manual workflow dispatch
198+ with ` retain_candidate=true ` uploads only the allowlisted candidate for seven
199+ days. It is not a GitHub Release, deployment or production-runtime admission.
200+ The public repository's artifact can be downloaded by signed-in GitHub users.
201+ The manifest SHA256 and separate count/hash receipt are in the CI job summary;
202+ retain the trusted exact-run receipt separately from any downloaded archive.
203+
204+ ` runtime_bundle.py verify --zip candidate.zip --manifest-sha256 <trusted-digest> `
205+ checks the archive without extraction or execution. ` --root ` checks a directory.
206+ Both require the external manifest digest, exact closed file set, streamed content
207+ hashes, canonical paths, fixed ELF architecture/interpreter and bounded JSON,
208+ member counts and bytes. Links, duplicates, extra files/directories, traversal,
209+ special/encrypted members and unbounded expansion are refused. Legacy single-disk
210+ ZIP only; ZIP64/multipart archives are outside this narrow verifier's contract.
211+ The directory verifier pins a root descriptor and traverses with no-follow opens;
212+ it does not isolate a hostile same-UID/root process that can modify regular bytes.
213+ Archive permissions are not installation permissions or executable admission.
214+
215+ Dependency metadata comes from locked Cargo resolution, filtered for Linux, not
216+ from a user profile. Only regular public-source-root license targets are read;
217+ source notice links may resolve within those public roots, never outside them,
218+ and are copied as regular bytes, not retained as links. Candidate links are refused;
219+ local build paths are omitted from the index. Workspace crates inherit the pinned
220+ upstream license. Packages without a discoverable top-level/explicit notice are
221+ reported as ` declared-only ` , not certified complete. This inventory is not a legal
222+ compliance audit, a minimal linked-dependency set, a signed attestation or proof
223+ against malicious build inputs. Host ABI/library closure, licensing review,
224+ immutable installation/rollback, launcher containment and profile-controller
225+ integration remain separate gates before real authorization or model use.
226+
186227## Limits
187228
188229- Tests execute the actual Rust helper on synthetic files, including controlled
0 commit comments