The boundary artifact
BoundaryArtifact (contracts.py) is the only value that crosses the trust boundary. Every model
in the contract is strict (extra="forbid"), so no extra field can ride along, and there is no
field that can hold a transcript, a name, a date, or your case identifier.
Fields
Audit entry types
entries[] is a discriminated union on type:
The provenance block names the Stage-0 backend, the extractor model, the judge model (recorded as
ensemble), and the resolved endpoint host, so a DPO can confirm after the fact that the model
stayed in-boundary.
The integrity digest
seal_artifact is the only way the SDK builds an artifact. It validates the body, then computes
SHA-256 over the RFC 8785 canonical JSON of every field except integrity. Python and TypeScript
canonicalize independently and share test fixtures, so a tampered or corrupted artifact is
refused on both sides: the SDK refuses to parse it, and Tacit refuses to store it.
verify_artifact_integrity(artifact) re-checks one you already hold.
Validating on the receiving side
export_json_schema() returns the JSON Schema of the contract, and the same schema is committed
at schema/boundary-artifact.schema.json. Tacit validates incoming artifacts against a mirror of
it, so neither side imports the other’s code. tacit-deid schema prints it.