[AVAILABLE].
packages/shared/src/domain/execution-trust-record.ts,
BusinessTrustRecordBuilder (@parmana/runtime). CLAIMS.md 2.5.The record contains the execution result, so it can only be built after
the action is released. Since 2026-09-21 a separate signed record, the
Execution Intent, is stored before release,
so a released action always has signed evidence behind it even if this record
cannot be produced. A missing record can then be rebuilt without calling the
connector.
What it is
Every Business Transaction that is approved and executed produces exactly one Execution Trust Record (a refused one produces a Refusal Record instead): the aggregate of everything Parmana knows about it, built from a chain of immutable artifacts, each referencing the one before it by ID:BusinessTransactionValidator enforces structural consistency across the chain before
anything is evaluated, for example, authorization.authorityId must match
authority.authorityId, and intent.authorizationId must match
authorization.authorizationId (packages/runtime/src/validators/BusinessTransactionValidator.ts).
A Business Transaction that doesn’t hang together structurally never reaches
policy evaluation.
Why it exists
Every earlier concept on this site, policy, authorization, gateway verification, credential isolation, produces something. The trust record is where all of it lands: one artifact you, or anyone, can verify independently, without running Parmana at all. It’s the answer to “what actually happened,” not “what was supposed to happen.”Shape
What’s immutable, and what’s append-only
businessTransactionId, metadata, policy, signals, and decision never change after
creation. overrides, executions, verifications, and receipts may only grow, nothing
is ever edited or removed from them. For overrides and executions, this append-only
invariant is what lets a trustRecordHash mean anything: they are inside the signed
content, so growing them changes the hash in a verifiable way. verifications and
receipts are append-only too, but for a different reason: they are outside the signed
content entirely (see below), so their append-only guarantee comes from repository API
convention rather than from the signature.
What the hash and signature actually cover
canonicalExecutionTrustRecord() (packages/crypto/src/ExecutionTrustRecordCanonicalView.ts)
builds the exact object that gets hashed and signed, and both VerificationCrypto and the
offline verifier use it. It includes seven fields: trustRecordId, businessTransactionId,
transaction, authorization, overrides, executions, and createdAt. hash() and
sign() both call it, so the trustRecordHash and signature cover precisely this content,
no more and no less. A record without an authorization (older records) hashes exactly as
before, because the canonical serializer leaves out undefined keys.
execution.metadata.authorizationId is inside the canonically-hashed content, because
it lives under executions. Tampering with it changes the recomputed trustRecordHash and
fails verification (CLAIMS.md 2.11, execution-authorization-wiring.test.ts, “trust record
references the authorization”).
Minimal example: getting one back
snake_case (Python SDK decode); the wire format from the API is
camelCase. Source: python/examples/quickstart/.
Connector evidence extends evidence.attributes, it does not add a new field
ExecutionEvidence.attributes (packages/shared/src/domain/execution-evidence.ts) has
always been an open Record<string, unknown> bag, and ExecutionEvidenceBuilder has
always forwarded ExecutionResult.metadata into it verbatim, neither changed for this
milestone. @parmana/connector-sdk’s SdkConnectorExecutor populates
ExecutionResult.metadata.connector with a ConnectorEvidence object (connector ID,
version, capability, sanitized endpoint, redacted request/response summaries, a
connectorEvidenceHash computed by the existing TrustRecordHasher, no alternative hash),
so it lands at execution.evidence.attributes.connector through this same, unmodified
path. Records created before connector-sdk existed were serialized, and hashed, without
this key; that stored content and hash are never recomputed or migrated, so old and new
records verify identically against their own stored hash.
Next
Verify a trust record independently
The third-party verification story, no Parmana runtime required.
Detect tampering
Mutate a record, verify, watch it fail: the negative path.