Docs · for agents and tools
Decision record format
When a board closes a decision in Prepared Board, the decision is written as a small canonical JSON record and sealed with its SHA-256 hash. This page documents that record, prepared-board.decision-record.v1, so an agent, auditor or other tool can read, re-hash and verify it. JSON Schema: /decision-record.schema.json.
Fields
| Field | Type | Meaning |
|---|---|---|
| schema | "prepared-board.decision-record.v1" | Format id. A breaking change gets a new id; v1 stays as documented. |
| decisionId | string | The decision's id in Prepared Board. |
| boardId | string | The board's id. Each board's seals form one chain. |
| version | integer ≥ 1 | 1 for the first seal of this decision; a later change to sealed facts adds a version and never edits the old one. |
| title | string | Decision title as recorded. |
| motionText | string | null | The adopted motion text, or the decision's motion text when no adopted motion row exists. |
| outcome | "ADOPTED" | "RATIFIED" | "DEFEATED" | "WITHDRAWN" | "CLOSED" | "SUPERSEDED" | The status that wrote this seal. |
| closedAt | ISO 8601 UTC string | null | When it closed (or was decided, when there is no close time). |
| votes | { for, against, abstain, recused } integers | null | Tally of the latest certified vote; null when there was no certified vote. |
| voteMethod | string | null | Method of the certified vote (for example ROLL_CALL), UNANIMOUS_WRITTEN_CONSENT, or null. |
| meetingId | string | null | Meeting the decision belongs to, if any. |
| evidence | [{ documentId, sha256 }] sorted by documentId | Hash of every evidence document's bytes. A document without a hash blocks sealing. |
Canonical JSON, hash and chain
- Serialization: keys sorted recursively by UTF-16 code units, no whitespace (a subset of RFC 8785). Only strings, integers, booleans, null, arrays and plain objects; a float, NaN, Infinity or undefined is refused, so two machines can't disagree on the bytes.
- Hash: contentHash = "sha256:" + lowercase hex SHA-256 of the canonical JSON's UTF-8 bytes.
- Chain: each seal stores prevHash, the contentHash of the same board's previous seal (null for the first). Changing or removing an earlier seal breaks every later link.
- Sealed automatically when a decision enters ADOPTED, RATIFIED, DEFEATED, WITHDRAWN, CLOSED, SUPERSEDED.
- Not in the record: people's names, ballots by person, free-text rationale, document contents. Only document hashes.
Verify
- Human page: /verify/{sealId} (optional ?contentHash=sha256:… to compare). No account needed. Never shows record content.
- JSON: GET /api/public/v1/records/{sealId}/verify[?contentHash=sha256:…] → { sealId, contentHash, prevHash, sealedAt, version, chainValid, match? }. 60 requests per minute per IP.
- sealId "demo" is a fictional sample computed from the public sample decision; its response is labeled fictional and includes the record.
- Agents with board access: get_decision / get_decision_record return sealed, sealId, sealVersion, sealedAt, contentHash and verifyUrl; verify_decision_record gives the same answer as the public endpoint.
# re-hash a record file (its exact bytes) yourself printf 'sha256:%s\n' "$(shasum -a 256 record.json | cut -d' ' -f1)"
Example (fictional)
Sample record — fictional company, people, and figures. This demo seal is computed from the public sample record; it is not a real board's decision. Hash sha256:c1bfec831c6bc7da110ead36bab260fe8a656660b6163d3f248529c1070caeb6. Verify it.
{"boardId":"sample-halvorsen-board","closedAt":"2026-08-04T18:30:00.000Z","decisionId":"sample-hi-2026-07","evidence":[{"documentId":"sample-doc-1","sha256":"sha256:bf61578d7f742ade1b2bc2d8a9181ad9e7aa50b14528281d160d0f36f8121b85"},{"documentId":"sample-doc-2","sha256":"sha256:282c8102b212073c345deb060109b6ba31390120ecc8b39638572589729332c9"},{"documentId":"sample-doc-3","sha256":"sha256:2bc407216759c0f52e975d980911ef2c56f0c4432fbc606293431ee5f9eb14f2"},{"documentId":"sample-doc-4","sha256":"sha256:cfe8c70f9d1ecf973a32b542691ceb60a6077aabd81020bc1c8f23e316bd0626"}],"meetingId":"sample-meeting","motionText":"RESOLVED, that the Board approves the Company entering into a $6.0M senior secured term loan facility with Northgate Capital on substantially the terms in the term sheet dated June 30, 2026 (Pack item 4.1), and authorizes the CEO and CFO to execute the definitive loan agreement.","outcome":"CLOSED","schema":"prepared-board.decision-record.v1","title":"Approve $6.0M venture debt facility with Northgate Capital","version":1,"voteMethod":"ROLL_CALL","votes":{"abstain":0,"against":0,"for":7,"recused":1}}What a seal does not say
A seal shows the record was not changed after sealing. It does not certify that the decision was valid or properly taken, and it is not legal advice. Full board history is in the record export.