Supported versions
The latest published 0.x line is supported. After 1.0, the supported-versions policy is
the stability contract's (upgrading.md § The 1.0 stability contract).
Wire compatibility is governed by the protocol package's contract-major discipline — this
library's releases track it.
Security invariants (what a report is measured against)
Restated from the charter's boundary invariants, for reporting:
- The library never solicits, processes, or retains private key material — custody lives entirely behind the caller's key-handle callbacks (the contract; a handle that embeds key bytes in its term has chosen that posture itself — see security.md § Trust boundaries).
- Every signature is verified against the handle-resolved public key before success — a
wrong-key sign is
:signing_failed, never a false success. - Errors are closed atoms and telemetry metadata is value-free: neither channel can carry key material, message bytes, or report content. A defect that leaks values into either channel is a security defect, not a cosmetic one.
- Key identity (
key_id+public_key) is resolved from ONE atomic handle snapshot on anchors and transitions; caller-supplied key ids are ignored. - The library depends only on the public protocol package — never the authority runtime, never a transport, never an HTTP client/server (enforced by the dependency-direction wall).
Reporting a vulnerability
Use GitHub's private vulnerability-reporting / security-advisory flow for
baselabs/bounded_authority_report_adapter. Do not open a public issue containing an
exploit, credential, private key, or unreleased vulnerability detail.
A report should include:
- the affected version or commit;
- the violated property (the invariant above, in your own words);
- a minimal, VALUE-FREE reproduction (no real keys, no production report content);
- the expected security outcome.
Verifying a release (supply-chain provenance)
Every v* tag push runs the supply-chain workflow: it builds the exact Hex
archive through the full gate battery, records its SHA-256 in SHA256SUMS, and
attests build provenance (SLSA) plus a CycloneDX SBOM via GitHub attestations.
To verify a published release against that evidence:
# 1. Download the release evidence artifact (the workflow run for the tag)
# and the tarball, then compare checksums:
sha256sum -c SHA256SUMS
# 2. Verify the attestations against the subject digest (requires the
# gh CLI and the workflow run's artifact):
gh attestation verify <tarball> --repo baselabs/bounded_authority_report_adapter
# 3. Cross-check against hex.pm's published checksum for the release
# (hex.pm shows the archive checksum on the version page — it must
# equal the SHA-256 in SHA256SUMS for the same bytes).
Locally, before any release, mix ci runs the same reproducibility gate the
workflow uses: two cache-isolated builds of the exact archive must agree byte
for byte.
Acknowledgment
We will acknowledge reports within 7 days and send status updates at least weekly until resolution, coordinating disclosure through the private advisory. This is a best-effort cadence from a small maintainer team, not a contractual SLA — urgent disclosures are handled faster when marked as such.