Example receipt · test key · sanitized data

Anatomy of a SASKI receipt

Every decision SASKI makes produces a signed receipt like this one. It records who acted, what was attempted, which rules applied, and what SASKI decided, without storing any private content.

SASKI Agentic · decision receipt
receipt_version 1.3
2026-01-15 00:00:00 UTC
1

Who acted

The agent, session, and workflow this decision belongs to.

agent_idagent-vector session_idsession-vector workflow_idwf-vector
2

What it tried to do

The tool requested. Its arguments are kept only as a fingerprint, never as plain text.

tool_nameexample__noop parameters_digest85415bab93be16f1…b1860cbae
3

Which rules applied

The policy version and a fingerprint of the exact rulebook in force at that moment.

policy_versionvector-policy-1 rulebook_digestcdcdcdcdcdcdcdcd…cdcdcdcdcd
4

The decision

Allow, deny, or hold for a human, with a reason code an auditor can look up.

verdictdeny reason_codesVECTOR_DENY
5

Which software decided

A fingerprint of the exact gateway build, plus the instance that ran it.

gateway_code_digestffffffffffffffff…fffffff gateway_instance_idgateway-instance-vector product_version1.7.2
6

When

A timestamp to the nanosecond, bound to a five minute time window.

timestamp2026-01-15T00:00:00+00:00 timestamp_ns1768435200000000000 time_window_id5894784 (300 seconds)
7

Its place in the chain

Each receipt points to the one before it. Removing or reordering a receipt breaks the chain.

receipt_idreceipt-vector-1 hop_index0 prev_receipt_id(first in this workflow)
8

The signature

An Ed25519 signature over every field above. Change one character and verification fails.

algEd25519 kidvector-1 signaturepFOl1Fa11zVGQcZm…bEvBA==

What happens if someone edits it

verdict: deny→signaturevalid
verdict: allow→signatureinvalid

Verify it yourself

No SASKI account or software needed. Save the receipt below as receipt-sample.json and run this with Python and the cryptography package.

import json, base64
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey

# TEST ONLY public key published with the sample receipt
PUBLIC_KEY = "uAKiced9sck1tT/LJ82Vw9ouImOqVNYHYn1+STp6MzM="

receipt = json.load(open("receipt-sample.json"))
signature = base64.b64decode(receipt.pop("signature"))
canonical = json.dumps(receipt, sort_keys=True, separators=(",", ":"),
                       ensure_ascii=False).encode("utf-8")

key = Ed25519PublicKey.from_public_bytes(base64.b64decode(PUBLIC_KEY))
key.verify(signature, canonical)  # raises InvalidSignature if anything changed
print("valid")
Full receipt (JSON)
{
  "agent_id": "agent-vector",
  "alg": "Ed25519",
  "commitment_key_id": "bc6b8486eec43af36dc0b8e4f70b743f",
  "commitment_mode": "hkdf",
  "config_provenance": {
    "gate": "vector",
    "source": "test-only"
  },
  "emitted_profiles": [
    "saski-native@1"
  ],
  "encoder_id": "2bde471589d3c6c18d625ea56f2d436568f871de01334b3050f55014674adce6",
  "gateway_code_digest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  "gateway_instance_id": "gateway-instance-vector",
  "hold_id": "",
  "hop_index": 0,
  "human_decision": null,
  "kid": "vector-1",
  "origin_event_id": "",
  "parameters_digest": "85415bab93be16f131b0e9d6ba8543596694641b8fcff8773f2e4f7b1860cbae",
  "policy_version": "vector-policy-1",
  "prev_receipt_id": "",
  "product": "agentic",
  "product_version": "1.7.2",
  "reason_codes": [
    "VECTOR_DENY"
  ],
  "receipt_id": "receipt-vector-1",
  "receipt_version": "1.3",
  "record_flags": [
    "contemporaneous"
  ],
  "record_type": "decision",
  "resource": "",
  "rulebook_digest": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
  "session_id": "session-vector",
  "signature": "pFOl1Fa11zVGQcZmfKjho73PmTb3PdNewF8XZf5dpTixe+Cwbue4BV1UHmXEKIHyA4jiIDx2qojMaOpj1bEvBA==",
  "time_window_id": 5894784,
  "time_window_seconds": 300,
  "timestamp": "2026-01-15T00:00:00+00:00",
  "timestamp_ns": 1768435200000000000,
  "tool_name": "example__noop",
  "verdict": "deny",
  "workflow_id": "wf-vector"
}

This sample was produced by SASKI Agentic with a published test key and sanitized values. Test keys are for verification practice only and are never used in production.