Skip to content

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

FieldTypeMeaning
schema"prepared-board.decision-record.v1"Format id. A breaking change gets a new id; v1 stays as documented.
decisionIdstringThe decision's id in Prepared Board.
boardIdstringThe board's id. Each board's seals form one chain.
versioninteger ≥ 11 for the first seal of this decision; a later change to sealed facts adds a version and never edits the old one.
titlestringDecision title as recorded.
motionTextstring | nullThe 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.
closedAtISO 8601 UTC string | nullWhen it closed (or was decided, when there is no close time).
votes{ for, against, abstain, recused } integers | nullTally of the latest certified vote; null when there was no certified vote.
voteMethodstring | nullMethod of the certified vote (for example ROLL_CALL), UNANIMOUS_WRITTEN_CONSENT, or null.
meetingIdstring | nullMeeting the decision belongs to, if any.
evidence[{ documentId, sha256 }] sorted by documentIdHash 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.