Propose a policy change (maker)
Proposes new content for a policy, the maker’s step in maker checker governance.
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 policy name, for example customer-refund. Not . or ... Prefilled with the sandbox's policy.
^[A-Za-z0-9._-]+$The version this proposal changes, for example 1.2.0. Not . or ... Prefilled with the sandbox's version.
^[A-Za-z0-9._-]+$Body
Request body for POST /policies/{name}/{version}/pending-changes.
The full proposed policy.json content, in its entirety. Its policyId must equal the {name} path parameter, and its policyVersion must match ^[A-Za-z0-9._-]+$ and not be "." or "..". Validated against the same rules POST /policies/validate checks.
Free-text justification. Required, non-empty.
Response
Proposed and waiting for a checker. Keep the pendingPolicyChangeId.
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.