Project Assurance Manifest v1
September 13, 2026 ยท View on GitHub
Status: versioned additive contract; implementation and executable completion evidence are owned by the #214 batch and the completion matrix. Audience: compiler contributors and project assurance integrators.
Project Assurance Manifest v1 is the project-level companion to Assurance Manifest v1. It authenticates one retained Project snapshot and reports obligations across the project's declared sources. It is read-only evidence: it grants no execution, publication, signing, review, or other authority.
Envelope and subject
The schema is semaprax.project-assurance-manifest.v1. Its canonical envelope
has exactly the following top-level shape:
{"payload":{},"payload_digest":"sha256:<64 lowercase hex>","schema":"semaprax.project-assurance-manifest.v1"}
payload_digest binds the canonical payload bytes with SHA-256 over domain
semaprax.project-assurance-manifest.payload.v1\0, the byte length as a
little-endian u64, and those exact bytes. It is an integrity digest, not a
signature or source authority. Both the payload
and envelope use recursively sorted JSON and one trailing newline. Unknown
fields, duplicate keys, non-canonical JSON, digest mismatch, and output that
would exceed the selected byte bound are refused. The producer never
truncates or repairs output.
The payload binds project_revision, workspace_revision, and
program_root. It also contains an ordered source inventory; every declared
source is represented by its path, source_revision, and source_digest.
Inventory order is ascending source path. A verifier
must bind every inventory entry to the retained snapshot and reject omission,
insertion, substitution, path drift, or digest drift.
The obligations array is sorted by unique obligation ID. Each record carries
the source path, obligation identity, assurance classification, and the
evidence needed to replay its derivation. An obligation ID is unique across
the whole project. Identical obligations encountered in the entry, public-API,
and test HIR views are emitted once; coverage.selected_source_functions
records each source function's declaration_id, source_path, and selecting
hir_views. This deduplication happens before canonical
ordering and is never delegated to a consumer.
Derivation coverage
For each source, ordinary functions (including authored class methods) selected in the admitted entry, public-API, and test views use one shared checked AST/HIR derivation path. The producer does not invoke the single-file producer once per view, which could duplicate or disagree on facts. Generic and synthetic functions are represented by explicit coverage metadata and their function IDs are listed when they are unselected. Coverage records say which functions and views were selected; they do not assert that any function or test executed.
All source inventory entries remain bound even when a source contributes no
selected obligation. coverage.unselected_source_function_ids and
coverage.synthetic_function_ids_without_source_owner identify functions that
receive no assurance record. Exact replay detects modified or omitted coverage.
Coverage is provenance, not runtime evidence.
Architecture claims
ArchitectureClaimSet is evaluated against the exact retained
ProjectRevision used to produce the manifest. In v1 the admitted operator is
forbid_reaches <id> <from> <to>. A claim contributes an architecture_law
obligation with class compiler_proved only when the held result proves the
forbidden reachability absent. A violated or unevaluable claim refuses
generation. The existing checker proves absence of a static reachable path;
the producer never promotes a caller assertion or an unevaluable frontier.
The exact canonical claim-result JSON is included in the payload and bound to the same retained Project revision. It is replayed and checked as evidence; it is never treated as authority and cannot be replaced by caller-authored edges or a caller-asserted proof. Claims are bounded to 256 entries, and each claim ID and target uses the bounds owned by Architecture Claims v1.
API and freshness protocol
The public options type is bounded and deterministic:
pub struct ProjectAssuranceOptions { /* public validated limits; private claims */ }
impl ProjectAssuranceOptions {
pub fn new(max_bytes: usize, max_obligations: usize) -> Result<Self, Diagnostic>;
pub fn default() -> Self;
pub fn with_claims(self, claims: ArchitectureClaimSet) -> Self;
}
The authenticated generation path acquires the Project snapshot, derives the
canonical workspace revision and ProgramRoot from that retained revision,
derives obligations and claims, then rechecks all held inputs before returning
the envelope. generate_from_snapshot performs the same before-and-after
recheck when the caller supplies a retained snapshot. A stale or substituted
source, manifest, Project revision, workspace revision, ProgramRoot, or claim
result fails closed.
verify_against_revision regenerates the exact manifest from independently
trusted revision and source inputs, compares canonical bytes, and rejects both
tamper and drift. Verification does not accept the envelope's own paths,
revisions, digests, coverage claims, or architecture result as authority.
The bounds reuse the Assurance defaults: max_bytes is at least 2048 and at
most 16 MiB; max_obligations is between 1 and 65536 inclusive. Every bound
failure is a refusal. The existing semaprax.assurance-manifest.v1 envelope
and its bytes remain unchanged.
CLI
semaprax project-assurance-manifest <manifest> \
[--max-bytes N] [--max-obligations N] \
[--forbid-reaches <id> <from> <to>]
--forbid-reaches may be repeated up to 256 times. CLI output is exactly the
library envelope, including its final newline, and uses the same fail-closed
bounds and freshness checks. No command option changes the authenticated
Project subject or grants an architecture claim authority.
Non-claims
This profile does not execute source functions or tests, infer that a listed function ran, merge unrelated Projects, or certify native/Wasm physical finalizers. It does not change single-file Assurance Manifest v1 semantics, source files, Git state, or workspace publication behavior. Completion is established only by the executable gate recorded in the completion matrix.
Focused executable gates
cargo test --locked -p semaprax --test workspace project_assurance_manifest
exercises the authenticated Project producer, provider coverage, held and
refused claims, independent replay and drift/capacity refusal.
cargo test --locked -p semaprax --test projections assurance_manifest::project_cli
executes the actual binary for exact library output and claim/option handling.
These are local report gates, not evidence of native/Wasm execution or hosted support.