Publish and verify log evidence
Glass Ocean 0.4.0 lets you add an independently recorded point of reference to a delivery. Publish a commitment to the signed receipt's causal root, retain the log's inclusion proof and deliver it with the software. The recipient checks that proof offline using a log key they approved independently.
Choose a log before publishing
You choose and provision the operator. Attest does not operate a public logging service. The first adapter supports a Tessera-compatible raw-entry writer, C2SP tlog-tiles reads and Ed25519 signed-note checkpoints.
Obtain endpoints, checkpoint origin and verifier key through your trusted provisioning channel. Producer configuration:
{
"format": "attest-log/v1",
"origin": "<OPERATOR_CHECKPOINT_ORIGIN>",
"verifier_key": "<NAME+KEY_ID+BASE64_NOTE_VERIFIER_KEY>",
"read_url": "https://<LOG_READ_ENDPOINT>/",
"submit_url": "https://<LOG_WRITE_ENDPOINT>/add"
}HTTPS is mandatory and redirects are refused. An optional tls_ca file adds
your internal CA; relative paths resolve beside the configuration file. This
profile supports no log API credentials: keep tokens out of URLs and repositories.
Recipients need only format, origin and verifier_key, supplied independently
of the delivery's sender.
Review what publication discloses
Publication is irreversible. The entry contains a fresh randomized commitment, without the causal root, source, artifacts or build logs. The operator still sees connection address, timing and request headers; observers see entries, order and retries. The evidence package retains the opening that lets its recipient associate the entry with the receipt. Review the versioned disclosure contract before enabling this feature.
Produce, publish and deliver
Running a build alone never publishes a log entry. Create a signed receipt, then pass its exact path to publication and packaging:
attest run --wrap --name build --input src/ --output dist/ --sign -- make dist
attest causal publish --receipt <EXACT_RECEIPT_PATH> \
--log-config producer-log.json --output publication.json \
--publication-policy required --timeout-secs 30 --format json
attest evidence pack <EXACT_RECEIPT_PATH> --workspace . \
--publication publication.json --output release.attest.tar.zstProvision a signing key first as shown in the CLI reference. Publication requires a trusted, signed receipt with a causal root. Existing receipts without one require a new build. Supply referenced capsule manifests when packing if the build uses capsules.
Keep publication.json. Attest records its intent durably before submitting;
repeating the command with the same output resumes the same entry. A confirmed
record is checked again without resubmission. At most three submission attempts
are retained per record. Do not run concurrent publishers against one record.
Only inclusion verified under an authenticated checkpoint yields confirmed.
A returned index alone does not. With required, missing confirmation exits 3;
with optional, it exits 0 and retains an unconfirmed record and reason. Local
errors exit 2. A timeout may mean acceptance without confirmation. The explicit
deadline is 1–120 seconds, with bounded requests and retries.
Verify at the recipient without network
Deliver the archive through a channel appropriate for its contents. Provide receipt trust and log trust independently:
attest evidence verify release.attest.tar.zst \
--trust-store recipient-trust/ --log-trust recipient-log.json \
--require signature,success,artifacts,capsule,linkage,log-inclusion --format jsonAn unconfirmed record cannot satisfy log-inclusion. Missing log trust yields
a skipped check, never trust derived from the archive. Invalid signatures,
altered entries and invalid paths fail. A recipient may require publication
even if the producer treated it as optional.
Compare independently obtained observations
Retain a signed checkpoint obtained independently of this delivery. Fetching the comparison proof is an explicit online operation; transfer the signed checkpoints and proof to the offline recipient:
attest causal fetch-consistency --first-checkpoint observed.note \
--second-checkpoint publication.note --log-config producer-log.json \
--output comparison.json
attest evidence verify release.attest.tar.zst \
--trust-store recipient-trust/ --log-trust recipient-log.json \
--log-checkpoint observed.note --log-consistency comparison.json \
--require log-inclusion,log-consistency --format jsonThe delivery's exact signed note is retained in the confirmed publication
record at outcome.checkpoint. Authenticated, unequal roots at the same size
prove a conflict. Different nonempty sizes need a valid consistency path.
A missing comparison is skipped and cannot satisfy log-consistency. A passed
comparison covers those observations, without guaranteeing every observer's
view, correct build execution or authenticated build time.
Opt in from GitHub or GitLab CI
Use the 0.4 integration and binary, following the
versioned CI adoption guide.
log-publication-policy defaults to off. Set it explicitly to required or
optional with log-config; log-timeout-secs sets the deadline. An endpoint
without an explicit policy is refused before the build.
After a successful signed build, log publication happens before evidence
packaging. A failed build retains its exit code and publishes no log entry.
log-publication-status, log-publication-reason and log-publication-record
describe this operation separately from publication-status, which describes
CI artifact upload. Required log publication fails with exit 3 even if evidence
upload is optional; optional unconfirmed publication keeps its reason in the
evidence package and status report.
Upgrade recipients to 0.4 before sending packages with log proofs. These use
attest-evidence/v3; packages without a publication record remain v2. Existing
v1/v2 packages and earlier receipt signatures remain verifiable.