Deeds and the deed chain
A deed is the signed record of one action: who asked, what was decided, what ran, and the verdict.
What a deed holds
Section titled “What a deed holds”- The agent, on-behalf-of and session; the tool, connector and mode; digests of the request and the signed intent.
- The policy version, decision and rule; the approval, with who countersigned.
- The execution: status, timings, a digest of the result, the error code.
- The witness: level, verdict, method and a digest of the detail.
- The cost, and the previous deed’s hash.
Payloads never go inside a deed, only their SHA-256 digests. The body is canonical JSON (RFC 8785), and the seal is an Ed25519 signature over "deedglass/deed/v1\n" + body_hash.
Try one
Section titled “Try one”This is a real sample deed, sealed with a published test key. The check runs in your browser:
- Body hash
sha256:94a0…683f- Tool
postgres.execute- Check
L2 · VERIFIED
Deed body
{
"action": {
"connector": "con_01m3xxf0m1brgcvtgpf81k7skv",
"id": "act_01m3xxf0m1s0xcra979g0jfa5y",
"intent_hash": null,
"intent_signed": false,
"mode": "gateway",
"request_digest": "sha256:f9a265a627598090eda73f296064b1db59c7295a4367f7c9780808af2137b1d7",
"tool": "postgres.execute"
},
"admin": null,
"agent": {
"id": "agt_01m3xxf0m1v4emq98a0jp8qj9z",
"name": "billing-agent"
},
"amends": null,
"approval": null,
"cost": {
"amount": 120,
"currency": "usd"
},
"deed_id": "deed_01m3xxn3y1fb64s94xhgnkpem3",
"execution": {
"error_code": null,
"finished_at": "2026-10-02T08:59:59.841Z",
"latency_ms": 41,
"result_digest": "sha256:8b8808243de0b66ff885ef7902186fc4b37bfe2dbb62907e0301c5f7753434ba",
"started_at": "2026-10-02T08:59:59.800Z",
"status": "succeeded"
},
"issued_at": "2026-10-02T09:00:00.000Z",
"kind": "action",
"on_behalf_of": "usr_ref:priya",
"org": "org_01m3xxf0m2ekmm72j2vvks65q5",
"policy": {
"decision": "allow",
"id": "pol_01m3xxf0m13yc5js9w392rsx8r",
"mode": "enforce",
"rule_id": "allow-billing-updates",
"version_hash": "sha256:18b4687da8d05494dcc0adc5a8f18efe6900f6a5f8faa4b519accdd01e15b3b5",
"version_id": "pv_01m3xxf0m1e81mgsvsfcj3shx3"
},
"prev_hash": "sha256:936f436c12d714c554d0478e6130ef04918e4cb3c2aaa891335d9e60bd7d9fc5",
"seal_key_id": "sk_01m3xxf0m1crvjtd24mgqnmgah",
"seq": 1,
"session": "ses-7f3a",
"v": 1,
"witness": {
"detail_digest": "sha256:7254304143e36a4e106c525e35b74e30961135caf01c192641c9e6322a741d37",
"level": "L2",
"method": "postgres.pgoutput",
"verdict": "VERIFIED"
}
}Nothing checked yet. The check runs in your browser with the published test key.
The same deed with one digit changed in its body:
- Body hash
sha256:94a0…683f- Tool
postgres.execute- Check
L2 · VERIFIED
Deed body (one digit changed)
{
"action": {
"connector": "con_01m3xxf0m1brgcvtgpf81k7skv",
"id": "act_01m3xxf0m1s0xcra979g0jfa5y",
"intent_hash": null,
"intent_signed": false,
"mode": "gateway",
"request_digest": "sha256:f9a265a627598090eda73f296064b1db59c7295a4367f7c9780808af2137b1d7",
"tool": "postgres.execute"
},
"admin": null,
"agent": {
"id": "agt_01m3xxf0m1v4emq98a0jp8qj9z",
"name": "billing-agent"
},
"amends": null,
"approval": null,
"cost": {
"amount": 120,
"currency": "usd"
},
"deed_id": "deed_01m3xxn3y1fb64s94xhgnkpem3",
"execution": {
"error_code": null,
"finished_at": "2026-10-02T08:59:59.841Z",
"latency_ms": 42,
"result_digest": "sha256:8b8808243de0b66ff885ef7902186fc4b37bfe2dbb62907e0301c5f7753434ba",
"started_at": "2026-10-02T08:59:59.800Z",
"status": "succeeded"
},
"issued_at": "2026-10-02T09:00:00.000Z",
"kind": "action",
"on_behalf_of": "usr_ref:priya",
"org": "org_01m3xxf0m2ekmm72j2vvks65q5",
"policy": {
"decision": "allow",
"id": "pol_01m3xxf0m13yc5js9w392rsx8r",
"mode": "enforce",
"rule_id": "allow-billing-updates",
"version_hash": "sha256:18b4687da8d05494dcc0adc5a8f18efe6900f6a5f8faa4b519accdd01e15b3b5",
"version_id": "pv_01m3xxf0m1e81mgsvsfcj3shx3"
},
"prev_hash": "sha256:936f436c12d714c554d0478e6130ef04918e4cb3c2aaa891335d9e60bd7d9fc5",
"seal_key_id": "sk_01m3xxf0m1crvjtd24mgqnmgah",
"seq": 1,
"session": "ses-7f3a",
"v": 1,
"witness": {
"detail_digest": "sha256:7254304143e36a4e106c525e35b74e30961135caf01c192641c9e6322a741d37",
"level": "L2",
"method": "postgres.pgoutput",
"verdict": "VERIFIED"
}
}Nothing checked yet. The check runs in your browser with the published test key.
The chain
Section titled “The chain”Each org’s deeds are numbered from 1 with no gaps. Each deed carries the hash of the one before it, and the database refuses a second deed with the same predecessor, so the chain can’t fork. Seal keys are published at /.well-known/deedglass/keys.json.
$ deedglass ledger check✓ Chain intact · … deeds · seq 1 → … · …Check deeds offline
Section titled “Check deeds offline”Anyone with the public keys can check a chain without Deedglass running: deedglass verify, the TypeScript or Python verifier, or this page’s checker. See Verify deeds as an auditor.
What it doesn’t do
Section titled “What it doesn’t do”- A deed shows that a request with a given digest was handled. You need the original request to match it.
- Seal keys are per deployment: one set signs every org’s deeds. Per-org seal keys come later.
- A deed is signed by your Deedglass instance. It’s as trustworthy as that instance and its seal key.