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.