Ratify policy version
Records that a human approved this exact draft version: the version becomes ratified. Ratification does not put the version in force — the version currently in force keeps governing evaluations until the ratified version is activated with POST /v1/policies//versions//activate. Returns a signed PolicyApprovalReceipt when a ratifier key is configured.
The review gate (OPD-130, MCP-020 R-A). Once any seal of this version, or of a draft it supersedes, was made under an authoring capability, ratification requires an ACCEPT review record as the newest record on THIS version’s own latest sealed submission, whoever sealed it; otherwise 409 RATIFY_NO_ACCEPT_RECORD with details.reason NO_SEAL_ON_HEAD, NO_ACCEPT_RECORD or LINEAGE_UNRESOLVED. The human who issued that capability and the human who recorded the ACCEPT may not ratify (403). An ACCEPT recorded against an earlier draft never carries.
The reviewed subject (B1-01). On every path, while the version is still ratifiable: if the newest record on this version’s latest sealed submission is an ACCEPT, the version’s current active rules must hash to the active_rules_hash that submission sealed; otherwise 409 REVIEWED_SUBJECT_STALE (details: submission_id, review_record_id, sealed_active_rules_hash, current_active_rules_hash, candidate_revision, draft_revision). Reseal and have the current rules reviewed, or restore the accepted rules. When no authoring capability is involved and that newest record is CORRECT_AND_RESUBMIT or STOP, 409 RATIFY_REVIEW_ADVERSE (details.reason is the disposition). A ratification that relied on an ACCEPT cites it in the policy_ratified audit row on both paths. Limit: only the hashed fields of the active rules (code, condition, severity, when) are compared; a rule’s name, description, source_ref, replaces_rule_code and rule_type, and inactive rules, are not.
expected_revision is required. The body accepts only expected_revision, approval_authority and ratifier_role: any other key is 400.
Authorizations
MeshQu API key passed as a bearer token: Authorization: Bearer mqu_…. Mint one in the console (Settings → API keys).
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.
Body
The draft_revision of the version the ratifier read. While the version can still be ratified, a value that is not its current draft_revision is refused 409 STALE_DRAFT_REVISION.
x >= 0Free-form string identifying the regulatory or governance framework under which this ratification is performed (e.g. "ifrs-9-credit-risk"). Stored in the PolicyApprovalReceipt. Defaults to "unspecified".
500Organizational role of the ratifier at approval time (e.g. "compliance", "risk-officer"). Stored in the PolicyApprovalReceipt. Defaults to the API key identity.
200Response
Default Response
x >= 0SHA-256 hex of projectActiveRules(rules) — the same projection and hash the review-submission seal's active_rules_hash and the ratification receipt's policy_rules_hash use. Compare against a sealed subject's active_rules_hash to tell whether the ACTIVE RULES' EVALUATED CONTENT (code/condition/severity/when, in stored order) is unchanged since that seal — not whether the rule objects as a whole (name, description, source_ref, an added inactive rule) are unchanged.
^[0-9a-f]{64}$Lifecycle status: draft → submitted → ratified → (activated, then) superseded (or back to draft on reject); discarded = soft-discarded draft (PWB-039). A pending version that ends without governing is closed: reopened (a ratified version whose content continues as a new draft), set_aside (put aside with a reason), replaced (a draft whose correction continues as a new draft) — PAL-004/005.
draft APR-005: Signed approval receipt produced at ratification time. Null when the ratifier key is not configured.
Present only on a version created by draft supersession: the id of the replaced draft this version continues. Written when the version is created and never changed. Absent on every other version, including one started after a set-aside or a reopen.
What the codification that produced this version accounted for. Unsigned and unhashed; NOT a sealed review package.