Reject a pending policy change (checker)
Rejects a policy change.
Authorizations
A human key (credentialHolderType: USER) issued by the operator. Sent as Authorization: Bearer . The public sandbox and its demo key are refused on these routes, so no key is prefilled here.
Path Parameters
The pendingPolicyChangeId from the proposal.
Body
Request body for POST /policies/pending-changes/{id}/reject.
Free-text reason. Required, non-empty.
Signed envelope proving a checker's explicit, fresh intent to approve or reject one specific Pending Policy Change (Policy Governance, Layer 4). Produced by PolicyChangeStepUpAuthorizationSigner (@parmana/crypto) using the checker's own step-up private key, never the bearer API key. Verified server-side against: the checker's registered stepUpPublicKey, payload.pendingPolicyChangeId matching the URL's {id}, payload.action matching the endpoint (approve vs reject), payload.expiresAt not yet passed, and payload.nonce not previously seen (single-use, replay-rejected on a second attempt with the same envelope).
Response
Rejected. The policy in effect did not change.
Response returned by POST /policies/{name}/{version}/pending-changes (201), POST /policies/pending-changes/{id}/approve (200), and POST /policies/pending-changes/{id}/reject (200). A bare Pending Policy Change, no wrapper.
Unique Pending Policy Change identifier.
The policy this proposal targets, same identifier as Policy.policyId.
The existing version this proposal is a change against ("the version being replaced"). Not necessarily equal to proposedContent's own declared version: an in-place patch and a version bump are both legitimate.
The full proposed policy.json content, in its entirety, not a diff or patch.
Identity of the proposer (maker). Always a human-authenticated (credentialHolderType USER) caller.
PENDING_APPROVAL, APPROVED, REJECTED Free-text justification from the proposer, required at creation.
Identity of the resolver (checker). Absent while PENDING_APPROVAL. Never equal to proposedBy.
Absent while PENDING_APPROVAL.
Present only when status is REJECTED.
Present only when non-empty: uncovered-fact warnings from PolicyValidator.findUncoveredFacts against proposedContent.
Present only when non-empty: advisory rule-conflict warnings from PolicyValidator.findRuleConflicts against proposedContent, never blocking.