PoQ Report spec

This is the field-by-field reference for the PoQ Report payload — the canonical JSON that every PoQ Report is a render of. For the conceptual overview (what a report is, how to read it, and how to verify one), see the PoQ Report guide.

Every PoQ Report is one canonical JSON payload (schema poq.attestation/v1), signed once. The readable formats — text, HTML — are deterministic renders of that payload, so this reference is also the source of truth for every value shown on a report page.

The payload is a single object. Its top-level keys map one-to-one onto the report's sections:

KeyTypeRequiredReport section
schemastring (const)yesHeader
report_idstringyesHeader
issuerstringyesHeader
issued_attimestampyesHeader
scopeobjectyesScope
resultobjectyesResult
scorecardarrayyesScorecard
distributionobjectyesDistribution
poq_recordobjectyesPoQ Record excerpt
quorum_routingobjectyesQuorum routing
configurationobjectyesConfiguration
poolobjectyesPool & provenance
stakeobjectnoPool & provenance (Collateral mode only)
custodyobjectyesChain of custody
attestationobjectyesAttestation
assertionstringyesWhat this asserts

The payload is strict: additionalProperties is false at every level, so any key not listed here is rejected. Every required field must be present.

Value types

Several fields reuse the same primitive types. They are defined once here and referenced throughout.

TypeJSONFormatExample
scoreinteger0100. A quality or consensus score.82
weightstring"advisory" or a non-negative decimal ("0", "1", "2.5", "0.5"). A rubric weight."1.5"
weistringA non-negative decimal integer, in wei. Used only in Collateral mode."1000000000000000000"
hashstringsha256: followed by 64 lowercase hex characters."sha256:9f2b…c1"
timestampstringRFC 3339 UTC, second precision, Z suffix: YYYY-MM-DDThh:mm:ssZ."2026-07-21T14:03:00Z"
bandsobjectMap of score-band label → count. Band labels are 0-9, NN-NN (e.g. 40-49), or 90-100.{ "40-49": 3, "90-100": 12 }

No floats in the signed bytes. Every numeric value is carried either as a bounded integer (scores, counts) or as a string (weights, wei). The signed payload contains no floating-point numbers, so the canonical bytes are deterministic.

Identity

The four top-level scalars that identify the report. They render in the report header.

FieldTypeRequiredDescription
schemastring (const)yesAlways "poq.attestation/v1". Pins the payload to this schema version.
report_idstringyesStable report identifier, pattern PR-YYYY-NNNN-<ALNUM>-NNNN (e.g. PR-2026-0042-AB12-0007).
issuerstringyesThe issuing deployment / organization. Non-empty.
issued_attimestampyesWhen the report was issued.

scope

Which project the report covers and how much of it was reviewed. Renders as the Scope section.

FieldTypeRequiredDescription
projectstringyesProject name. Non-empty.
datapoints_coveredintegeryesNumber of datapoints the report certifies (≥ 1).
reviewedintegeryesNumber of datapoints reviewed (≥ 1). At M1 this equals datapoints_covered — there is no sampling.
manifest_hashhashyesHash of the covered-datapoint manifest.

result

The headline result. Renders as the Result section.

FieldTypeRequiredDescription
quality_ratingscoreyesThe overall Quality Rating (0100).
consensus_strengthscoreyesThe overall Consensus Strength (0100).
labelobjectnoThe headline label, when the rubric produces one.

label object:

FieldTypeRequiredDescription
valuestringyesThe label text (e.g. the winning category). Non-empty.
sourcestringyesWhere the label came from (e.g. the rubric dimension that produced it). Non-empty.

scorecard

Per-dimension quality and consensus, with rubric weights. A non-empty array; renders as the Scorecard section. Each element:

FieldTypeRequiredDescription
dimensionstringyesRubric dimension name (no whitespace).
weightweightyesThe dimension's weight — "advisory" or a non-negative decimal.
quality_ratingscoreyesQuality Rating for this dimension.
consensus_strengthscoreyesConsensus Strength for this dimension.

distribution

How scores were spread across datapoints. Renders as the Distribution section (histograms).

FieldTypeRequiredDescription
quality_ratingbandsyesDistribution of per-datapoint Quality Ratings, as a band → count map.
consensus_strengthbandsyesDistribution of per-datapoint Consensus Strengths, as a band → count map.

Each bands map has at least one entry; band labels are 0-9, a two-digit range like 40-49, or 90-100, and each count is ≥ 1.

poq_record

A commitment to the full per-datapoint PoQ Record, plus an optional one-datapoint excerpt signed inline. Renders as the PoQ Record excerpt section.

FieldTypeRequiredDescription
results_hashhashyesHash committing to the complete per-datapoint results record.
excerptobjectnoOne datapoint's full detail, carried inline and signed with the payload.

excerpt object:

FieldTypeRequiredDescription
schemastring (const)yesAlways "poq.record/v1".
shownintegeryesWhich datapoint index is shown (≥ 1).
datapointobjectyesThe excerpted datapoint (see below).

excerpt.datapoint object:

FieldTypeRequiredDescription
idstringyesDatapoint identifier. Non-empty.
canonical_hashhashyesHash of the datapoint's canonical content.
quality_ratingscoreyesThis datapoint's Quality Rating.
consensus_strengthscoreyesThis datapoint's Consensus Strength.
settled_roundintegeryesThe round in which this datapoint settled (≥ 1).
escalatedbooleanyesWhether the datapoint was escalated beyond its first round.
quorumarrayyesThe rounds and votes that decided it (see below). Non-empty.
dimensionsarrayyesPer-dimension detail for this datapoint (see below). Non-empty.

excerpt.datapoint.quorum[] — one entry per round:

FieldTypeRequiredDescription
roundintegeryesRound number (≥ 1).
votesarrayyesThe votes cast this round (see below). Non-empty.

excerpt.datapoint.quorum[].votes[] — one entry per validator:

FieldTypeRequiredDescription
idstringyesValidator identifier (pseudonymous). Non-empty.
typeenumyes"human" or "agentic".
modelstringnoModel identifier, for agentic validators.
credentialstringnoCredential held, for human validators.
weightstringyesThe vote's consensus weight — a non-negative decimal. Unlike a rubric weight, "advisory" is not accepted here.

excerpt.datapoint.dimensions[] — per-dimension breakdown:

FieldTypeRequiredDescription
dimensionstringyesRubric dimension name. Non-empty.
qualityscoreyesQuality score for this dimension on this datapoint.
strengthscoreyesConsensus strength for this dimension on this datapoint.
weightweightyesThe dimension's weight.

quorum_routing

How validators were assigned across rounds, and where datapoints settled. Renders as the Quorum routing section.

FieldTypeRequiredDescription
roundsarrayyesThe routing rounds (see below). Non-empty.
executionobjectyesWhere datapoints settled (see below).

quorum_routing.rounds[]:

FieldTypeRequiredDescription
roundintegeryesRound number (≥ 1).
quorumintegernoQuorum size targeted this round (≥ 1).
escalation_targetscorenoThe consensus-strength threshold below which a datapoint escalates.
slotsarrayyesThe validator slots offered this round (see below). Non-empty.

quorum_routing.rounds[].slots[] — a validator slot. Each slot is either a human slot or an agentic slot (enforced by the schema's oneOf):

FieldTypeRequiredDescription
typeenumyes"human" or "agentic".
countintegeryesNumber of validators in this slot (≥ 1).
vote_weightstringyesPer-vote weight — a non-negative decimal.
credentialstringhuman slotRequired credential. Human slots only.
instructions_hashhashhuman slotHash of the instructions shown. Human slots only.
modelstringagentic slotModel identifier (no whitespace). Agentic slots only.
prompt_hashhashagentic slotHash of the agent prompt. Agentic slots only.

A human slot must carry credential + instructions_hash and must not carry model/prompt_hash; an agentic slot is the mirror image. Mixing the two is rejected.

quorum_routing.execution:

FieldTypeRequiredDescription
settled_round_1integeryesHow many datapoints settled in round 1 (≥ 0).
escalatedintegeryesHow many datapoints escalated past round 1 (≥ 0).

configuration

The rubric and the locked config. Renders as the Configuration section.

FieldTypeRequiredDescription
rubricstringyesRubric identifier (no whitespace).
config_hashhashyesHash of the locked poq.toml configuration.

pool

Validator pool size, churn, participation, and independence. Renders as the Pool & provenance section.

FieldTypeRequiredDescription
sizeintegeryesFinal pool size — every validator class eligible for the work, including agentic (≥ 0).
size_at_startintegeryesPool size when the review window opened (≥ 0).
addedintegeryesValidators added during the window (≥ 0).
removedintegeryesValidators removed during the window (≥ 0).
participated_humanintegeryesHuman validators who cast at least one vote (≥ 0).
participated_agenticintegeryesAgentic (AI) validators who cast at least one vote (≥ 0).
credentialsstringyesSummary of the credentials represented in the pool. Non-empty.
blind_reviewbooleanyesWhether reviews were blind (validators could not see each other's inputs).
coi_declaredintegernoConflict-of-interest declarations collected (≥ 0). Present iff COI declarations were collected; 0 means collected, none declared.

stake

Collateral mode only. Present only for events that put stake at risk; omitted otherwise. Renders under Pool & provenance.

FieldTypeRequiredDescription
stake_at_risk_weiweiyesTotal stake at risk, in wei.
slashed_weiweiyesStake slashed, in wei.
rewards_weiweiyesRewards paid, in wei.

custody

The chain-of-custody timestamps. Renders as the Chain of custody section. All five are required timestamps.

FieldTypeRequiredDescription
config_lockedtimestampyesWhen the poq.toml config was locked.
manifest_confirmedtimestampyesWhen the datapoint manifest was confirmed.
review_openedtimestampyesWhen the review window opened.
review_closedtimestampyesWhen the review window closed.
issuedtimestampyesWhen the report was issued.

attestation

The cryptographic roots and signing key. Renders as the Attestation section.

FieldTypeRequiredDescription
roothashyesThe attestation root committing to the report.
score_roothashyesThe root committing to the per-datapoint scores.
signing_key_idstringyesKey id (kid) of the signing key (no whitespace).
registrystringnoValidator/revocation registry reference. Absent until the registry exists (M4).

assertion

FieldTypeRequiredDescription
assertionstringyesThe fixed plain-language statement of what the report certifies. A constant of the schema version; renders as the What this asserts section.

The signed payload

The object above is signed exactly once and delivered in whichever format you request. The signature and canonicalization are fixed properties of poq.attestation/v1:

PropertyDetail
SignatureA single Ed25519 signature, delivered as a compact JWS.
CanonicalizationThe payload is canonicalized with JCS (RFC 8785) before signing — deterministic bytes.
NumericsAll non-integer numeric values are carried as strings; there are no floats in the signed bytes.
Key idThe JWS header carries a kid matching attestation.signing_key_id.

Any change to a covered value — in the JSON, the readable text, or the HTML — breaks verification.

Formats

The one signed payload is delivered in any of four formats:

FormatExtensionWhat you getBest for
Text.txtA readable render followed by the fenced signatureThe default — human-readable, verifiable
HTML.htmlThe designed, styled report pageSharing / reading in a browser or PDF
JSON.jsonThe canonical signed payload (this schema)Machine consumption
JWS.jwsThe bare compact signatureVerifying against your own payload copy

Envelopes

The two readable formats declare an envelope version so a verifier knows how to interpret the carrier before applying any grammar:

EnvelopeCarrier
poq.envelope/text-v1The two-layer text artefact: a readable render followed by the fenced compact JWS.
poq.envelope/html-v1The designed HTML page, which embeds the text artefact and tags every payload-derived value with data-poq.

In the text artefact the JWS sits between -----BEGIN POQ SIGNED PAYLOAD----- / -----END POQ SIGNED PAYLOAD----- fences. In the HTML the same text artefact is embedded in a <script type="application/poq-attestation+text"> element. For how to verify either offline, see Verifying a report.

See also

PageDescription
PoQ ReportThe conceptual guide: what a report is, how to get one, how to verify it
poq.toml specField reference for the project spec that produces the report
How consensus worksThe mechanics behind the Quality Rating and Consensus Strength