Propose a policy change (maker)
Proposes a change to a policy’s content (Policy Governance, maker-checker). is the existing version this proposal is a change against (“the version being replaced”); proposedContent’s own policyVersion may equal it (an in-place content patch) or differ (a version bump). Requires a human-authenticated caller (credentialHolderType USER); a SERVICE-credentialed or unverified caller is denied with 403 NON_HUMAN_CALLER_DENIED, and a signed caller.non_human_denied audit event is recorded. proposedContent is validated with the same rules POST /policies/validate checks, plus: proposedContent.policyId must equal , and proposedContent.policyVersion must match ^[A-Za-z0-9._-]+$.
Authorizations
Caller API key issued by scripts/generate-api-key.ts. Sent as Authorization: Bearer . Verified against a stored SHA-256 hash in constant time by packages/api/src/auth/StaticKeyAuthenticator.ts. Required on every route not listed as exempt in this document's top-level description. See /api-reference/authentication.
Path Parameters
^[A-Za-z0-9._-]+$^[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._-]+$. Validated against the same rules POST /policies/validate checks.
Free-text justification. Required, non-empty.
Response
Pending Policy Change created.
A proposed change to a policy's content, held in a durable pending state until a second, distinct human explicitly approves or rejects it (Policy Governance, maker-checker). Only ever moves from PENDING_APPROVAL to APPROVED or REJECTED, exactly once.
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.