Skip to content

Deeds and the deed chain

A deed is the signed record of one action: who asked, what was decided, what ran, and the verdict.

  • 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.

This is a real sample deed, sealed with a published test key. The check runs in your browser:

deed_01m3xxn3y1fb64s94xhgnkpem3seq 1 · 2026-10-02T09:00:00.000Z · seal key sk_01m3xxf0m1crvjtd24mgqnmgah
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:

deed_01m3xxn3y1fb64s94xhgnkpem3seq 1 · 2026-10-02T09:00:00.000Z · seal key sk_01m3xxf0m1crvjtd24mgqnmgah
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.

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.

Terminal
$ deedglass ledger check
✓ Chain intact · … deeds · seq 1 → … · …

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.

  • 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.