Skip to main content
POST
Record a human review of a sealed review submission

Authorizations

Authorization
string
header
required

MeshQu API key passed as a bearer token: Authorization: Bearer mqu_…. Mint one in the console (Settings → API keys).

X-MeshQu-Tenant-Id
string
header
required

Tenant UUID for multi-tenant isolation. Required on all authenticated routes — validated before authentication (middleware/tenant.ts), so a missing or non-UUID header returns 400 (MISSING_TENANT_ID / INVALID_TENANT_ID) before the API key is checked.

Path Parameters

id
string<uuid>
required

Policy id. The submission must belong to it, or the request is a 404.

submissionId
string<uuid>
required

The sealed submission the judgment is recorded against. This is the review IDENTITY — not the policy version, which is a mutable container that yields many sealed subjects over time.

Body

application/json

One named human's judgment of one exact sealed subject. The two expected_* fields are the reviewer's assertion of WHICH subject they read; the server compares them against the sealed row and refuses a disagreement rather than recording the judgment against whatever is current.

One named human's judgment of one exact sealed subject. The two expected_* fields are the reviewer's assertion of WHICH subject they read; the server compares them against the sealed row and refuses a disagreement rather than recording the judgment against whatever is current.

expected_candidate_revision
integer
required

The candidate revision the reviewer believes they judged. Compared against the sealed subject; a disagreement is 409 CANDIDATE_REVISION_MISMATCH, never a silently corrected value.

Required range: x >= 1
expected_review_package_digest
string
required

The package digest the reviewer believes they judged. A disagreement is 409 REVIEW_PACKAGE_DIGEST_MISMATCH.

Pattern: ^[0-9a-f]{64}$
findings
object[]
required

What the reviewer found. May be empty — "I found nothing" is a real result and the protocol scores it, so an empty array is recorded rather than refused.

Maximum array length: 500
corrections
object[]
required

What the reviewer would change, each with a proposal or explicit uncertainty.

Maximum array length: 500
package_disposition
required

The reviewer's ONE package-level judgment, spelled as the preregistered protocol spells it: ACCEPT, CORRECT_AND_RESUBMIT, STOP.

None of the three is an approval. ACCEPT is the protocol's word for "one reviewer found no material defect in this package" — a statement about a reading, not about the candidate's authority. Ruling B5 keeps this beta review-only, which is why no value here names ratification.

STOP does not call the reject route. POST /v1/policies/{id}/versions/{version}/reject is a separate human governance act (ruling D3a) that transitions a version's status. Recording STOP records a judgment and moves nothing.

Available options:
ACCEPT

Response

A persisted human review record. RECORDS one named human's findings, corrections and package-level disposition against one exact sealed subject. PROVES that the record names that subject — and nothing further. Research evidence, not approval.

A persisted human review record. RECORDS one named human's findings, corrections and package-level disposition against one exact sealed subject. PROVES that the record names that subject — and nothing further. Research evidence, not approval.

id
string<uuid>
required
tenant_id
string<uuid>
required
submission_id
string<uuid>
required

Leg one of the three that identify the sealed subject this record names.

candidate_revision
integer
required

Leg two.

Required range: x >= 1
review_package_digest
string
required

Leg three, under meshqu-review-package/v1.

Pattern: ^[0-9a-f]{64}$
reviewer_principal
string
required

The STABLE identity of the reviewer (user:<uuid> for a verified human session). Records attribution; proves nothing about competence, independence or that the person read anything. Compare on this, never on the display name.

reviewer_display_name
string
required

The reviewer's attribution as it stood when the record was written. MUTABLE by nature — legible, never an identity.

findings
object[]
required
corrections
object[]
required
package_disposition
required

The reviewer's ONE package-level judgment, spelled as the preregistered protocol spells it: ACCEPT, CORRECT_AND_RESUBMIT, STOP.

None of the three is an approval. ACCEPT is the protocol's word for "one reviewer found no material defect in this package" — a statement about a reading, not about the candidate's authority. Ruling B5 keeps this beta review-only, which is why no value here names ratification.

STOP does not call the reject route. POST /v1/policies/{id}/versions/{version}/reject is a separate human governance act (ruling D3a) that transitions a version's status. Recording STOP records a judgment and moves nothing.

Available options:
ACCEPT
created_at
string<date-time>
required