API: Proofs and receipts
Capability state: shape-only. Receipts are present and structurally enforced but not yet cryptographically verifiable end-to-end. Proof issuance is in
closed_runtime_boundary(see 022 gap report items 5, 17).
The receipt and proof operations let a relying party verify the shape of a receipt and request entitlement-scoped proof bundles. See concepts: receipts and proofs.
receipt.verify
Section titled “receipt.verify”Verify a receipt’s shape (locally or via cloud).
POST /v1/receipts/verifystate: shape-onlyruntime_owner: verifiersdk_role: local or cloud verificationrequest_record: CloudReceiptVerifyRequestresponses: verification_resultRequest
Section titled “Request”interface ReceiptVerifyRequest { receipt: MembraneReceipt;}Response
Section titled “Response”{ "operation": "receipt.verify", "outcome": "verified", "body": { "verified": true, "fixture": true }}Today this checks the receipt shape (ref present, outcome in known enum). It does not verify a cryptographic signature against a runtime signer. That capability is roadmapped.
SDK example
Section titled “SDK example”const result = await client.verifyReceipt(receipt);The TS SDK also exports a standalone shape verifier:
import { verifyFixtureReceipt } from "@gestalt/sdk";const result = verifyFixtureReceipt(receipt);// { verified: true, fixture: true, reasons: ["receipt shape accepted"] }proof.request
Section titled “proof.request”Request scoped disclosure.
POST /v1/proofs/requeststate: shape-onlysdk_role: request scoped disclosurerequest_record: CloudProofRequestresponses: proof_bundle | refusal | receiptRequest
Section titled “Request”interface ProofRequest { tenant: GestaltRef; subjectCompany: GestaltRef; scope: "self_audit" | "advisor_review" | "external_counterparty"; fields: string[]; purpose: string; fixture?: boolean;}Response
Section titled “Response”Refused (no entitlement):
{ "operation": "proof.request", "outcome": "refused", "body": { "failedGate": "missing_entitlement" }, "receipt": {...}}This refusal is deliberate. There is no path to a “give me everything” proof. Disclosure is always entitlement-scoped.
SDK example
Section titled “SDK example”const proof = await client.requestProof({ tenant: "tenant_node:rheinwerk_calibration", subjectCompany: "company_geist:rheinwerk_calibration", scope: "advisor_review", fields: ["invoice", "payment_observation", "advisor_opinion"], purpose: "Q1 2026 Steuerberater review of receivable settlement",});proof.bundle
Section titled “proof.bundle”Request entitled M6 proof bundle.
POST /v1/proofs/bundlestate: staging-durablesdk_role: request entitled M6 proof bundle with independent-verifier canonical bytesrequest_record: CloudProofBundleRequestresponses: proof_bundle | independent_verifier | refusal | receiptRequest
Section titled “Request”interface ProofBundleRequest { tenant?: GestaltRef; entitlement?: GestaltRef;}Response
Section titled “Response”{ "operation": "proof.bundle", "outcome": "verified", "body": { "bundle": { "id": "proof_bundle:m6_cross_domain_cloud_authority_worldline", "productionAdmission": false } }, "receipt": {...}}Today returns a staging-durable fixture manifest. The manifest includes an
audit-kernel canonical state commitment, receipt graph, signature graph, and
redaction flags that can be verified locally with gestalt-proof or SDK
helpers. Production issuance remains gated.
SDK example
Section titled “SDK example”const bundle = await client.requestProofBundle({ tenant: "tenant_node:rheinwerk_calibration", entitlement: "entitlement:fixture_proof_bundle",});proof.verify
Section titled “proof.verify”Verify a durable proof bundle manifest commitment through the membrane.
POST /v1/proofs/verifystate: staging-durable, local-verifier-compatiblesdk_role: verify durable proof bundle manifest without raw database accessrequest_record: CloudProofBundleVerifyRequestresponses: verification_result | independent_verifier_compatibility | refusal | receiptThe same exported JSON can be checked without Gestalt database credentials:
cargo run -q -p gestalt-proof -- verify \ --proof-json proof.json \ --manifest-commitment sha256:...The TypeScript SDK exposes verifyExportedProofBundle(exported, expected);
the Rust SDK exposes verify_exported_proof_bundle(exported, expected).
What a real proof bundle will contain
Section titled “What a real proof bundle will contain”When proof issuance lands, a bundle will carry:
- the receipts for the relevant atoms,
- the capability atoms they cited (with authority sources),
- the authority package versions in force at admission time,
- the evidence bundles referenced,
- the signer provenance chain (which runtime signer produced the receipts, which key version),
- the lens / entitlement under which the bundle was disclosed,
- the disclosure scope (what fields the relying party may display, retain, forward),
- the validity window,
- the revocation path.
Relying parties will be able to verify a bundle entirely offline against the published runtime signer key and the published authority package hashes. No need to call back to Gestalt.
Disclosure discipline
Section titled “Disclosure discipline”The forbidden surface explicitly includes
unscoped_proof_bundle_disclosure. There is no path through any
SDK or any tool to a “give me everything” bundle. By design.
Refusal codes
Section titled “Refusal codes”missing_entitlementproof_entitlement_missingproof_disclosure_scope_unauthorizedWhere to read next
Section titled “Where to read next”- Concepts: receipts and proofs
- Concepts: advisor lenses — lenses vs proofs
- API: human auth — presence receipts as a kind of verifiable artifact
- Reference: outcomes