The governance entitlement matrix
Included from Basic tierpacks:change-governancepacks:security-governancepacks:agent-governance
One table for every governance RPC: which authorisation determination admits the caller, which pack entitlement the surface sits behind, which step-up floor the verb carries, and which audit event a successful call records. The table is rendered from, and pinned by, the server's own conformance tests: the rows must cover the procedure census exactly, agree with the authorisation registry and the audit contract, and match this page verbatim — so the table cannot drift from the code.
How to read the columns:
- Authorisation determination — the rule-path families
(
/metadata<node path>,/governance/<surface>,/governance/change<scope>,/governance/owners<node path>) are delegable path-RBAC grants on the user plane, never implied by node write authz or admin status;/adminupdatable is the function-level admin-plane determination. A denied rule-path caller answerspermission_denied; a denied node read answersnot_found(404-on-deny), and list rows the caller cannot read are silently filtered. - Pack entitlement — a missing pack answers the typed
ERROR_REASON_PACK_ENTITLEMENT_REQUIREDrefusal naming the pack and tier. Gating follows the funnel posture: controls stay ungated, admin/attest surfaces are gated, and a lapse is polite and non-destructive (seeopschain docs entitlements). - Step-up floor — the verb demands a live elevated session; without
one the call answers
ERROR_REASON_STEP_UP_REQUIRED(orERROR_REASON_MFA_ENROLMENT_REQUIREDfor a factor-less platform session). Seeopschain docs identityandopschain learn 7.4. - Audit event — the event a successful call records (see
opschain docs events).—on a mutating verb never occurs; a*-marked event is recorded by the run-release layer rather than the RPC handler itself.
| Surface | Authorisation determination | Pack entitlement | Step-up floor | Audit event |
|---|---|---|---|---|
MetadataService/ListMetadataProfiles | authenticated (the profile catalogue is vocabulary) | — | — | — |
MetadataService/GetMetadataProfile | authenticated (the profile catalogue is vocabulary) | — | — | — |
MetadataService/CreateMetadataProfile | metadata-writer: updatable on /metadata | — | — | api:metadata_profiles:create |
MetadataService/UpdateMetadataProfile | metadata-writer: updatable on /metadata | — | — | api:metadata_profiles:update |
MetadataService/GetNodeMetadata | node read, 404-on-deny | — | — | — |
MetadataService/SetNodeMetadata | metadata-writer: updatable on /metadata<node path> | — | metadata.protective_write (protective fields only) | api:node_metadata:set |
MetadataService/BulkAnnotate | metadata-writer: updatable on /metadata<selector prefix>; covered nodes outside the caller's read authz are not covered | — | metadata.protective_write (protective fields only) | api:node_metadata:bulk_annotate |
MetadataService/ApplyMetadataProfileMigration | metadata-writer: updatable on /metadata | — | metadata.protective_write (protective fields only) | api:node_metadata:migrate |
MetadataService/ListMetadataRegister | node read per row — unreadable nodes' values never appear | — | — | — |
MetadataService/ExportMetadataRegister | node read per row — unreadable nodes' values never appear | — | — | — |
GovernanceService/ListControls | readable on /governance/controls | — | — | — |
GovernanceService/GetControl | readable on /governance/controls | — | — | — |
GovernanceService/CreateControl | updatable on /admin | — | — | api:governance_controls:create |
GovernanceService/UpdateControl | updatable on /admin | — | — | api:governance_controls:update |
GovernanceService/ListEvidenceLedger | readable on /governance/evidence | packs:security-governance | — | — |
GovernanceService/VerifyEvidenceLedger | readable on /governance/evidence | packs:security-governance | — | — |
GovernanceService/ExportEvidenceLedger | readable on /governance/evidence | packs:security-governance | — | — |
GovernanceService/GetGovernancePostureReport | readable on /governance/evidence | packs:security-governance | — | — |
GovernanceService/AppendAttestation | updatable on /governance/evidence | packs:security-governance | governance.attest | api:attestations:create |
GovernanceService/ReAnchorEvidenceLedger | updatable on /governance/evidence | packs:security-governance | governance.ledger_re_anchor | warn:governance:ledger_re_anchored |
GovernanceService/SetEvidenceLegalHold | updatable on /admin | packs:security-governance | governance.legal_hold | api:evidence_ledger:legal_hold |
GovernanceService/CreateReviewCadence | updatable on /admin | — | — | api:review_cadences:create |
GovernanceService/ListReviewCadences | updatable on /admin | — | — | — |
GovernanceService/UpdateReviewCadence | updatable on /admin | — | — | api:review_cadences:update |
GovernanceService/OpenReviewCampaign | updatable on /admin | — | — | api:review_campaigns:create |
GovernanceService/OpenAccessReviewCampaign | updatable on /admin | packs:security-governance | — | api:review_campaigns:create |
GovernanceService/ListReviewCampaigns | readable on /governance/campaigns | — | — | — |
GovernanceService/GetReviewCampaign | readable on /governance/campaigns | — | — | — |
GovernanceService/RecordCampaignDecision | updatable on /governance/campaigns | — | governance.campaign_decision | audit:review_campaigns:approve |
GovernanceService/CloseReviewCampaign | updatable on /governance/campaigns | — | governance.campaign_close | api:review_campaigns:close |
GovernanceService/CreateWaiver | updatable on /admin | — | governance.waiver_grant | api:governance_waivers:create |
GovernanceService/ListWaivers | readable on /governance/waivers | — | — | — |
GovernanceService/ListGovernanceWorkItems | readable on /governance/work_items | — | — | — |
GovernanceService/CompleteGovernanceWorkItem | updatable on /governance/work_items | — | governance.work_item_complete | api:governance_work_items:complete |
ChangeGovernanceService/ListApprovalPolicies | authenticated (the funnel explains itself); authorisations reports the caller's authoring standing | packs:change-governance | — | — |
ChangeGovernanceService/GetApprovalPolicy | authenticated (the funnel explains itself) | packs:change-governance | — | — |
ChangeGovernanceService/CreateApprovalPolicy | updatable on /governance/change<scope> | packs:change-governance | change_governance.policy_write | api:approval_policies:create |
ChangeGovernanceService/UpdateApprovalPolicy | updatable on /governance/change<scope> | packs:change-governance | change_governance.policy_write | api:approval_policies:update |
ChangeGovernanceService/DeleteApprovalPolicy | updatable on /governance/change<scope> | packs:change-governance | change_governance.policy_write | api:approval_policies:destroy |
ChangeGovernanceService/ConvertSettingsApprovers | updatable on /governance/change (the root scope) | packs:change-governance | change_governance.policy_write | api:settings_approvers:converted |
ChangeGovernanceService/ConvertStepApprovalGates | updatable on /governance/change (the root scope) | packs:change-governance | change_governance.policy_write | api:step_approval_gates:converted |
ChangeGovernanceService/ListPendingApprovals | rows filtered by target read | packs:change-governance | — | — |
ChangeGovernanceService/ListApprovalChecklists | rows filtered by target read OR the caller's own decision OR oversight (readable on /governance/change, or updatable on /admin) | packs:change-governance | — | — |
ChangeGovernanceService/GetApprovalChecklist | target read, 404-on-deny | packs:change-governance | — | — |
ChangeGovernanceService/ApproveChecklist | target read + approver-list membership on a line (self-approval excluded) | packs:change-governance | — | audit:approvals:approve |
ChangeGovernanceService/RejectChecklist | target read + approver-list membership on a line (self-approval excluded) | packs:change-governance | — | audit:approvals:reject |
ChangeGovernanceService/StartApprovedRun | target read + executable on <target>/actions/<action> | packs:change-governance | — | audit:approvals:release * |
ChangeGovernanceService/BreakGlassRelease | target read + updatable on /governance/change<target>; mandatory reason (deliberately not on the step-up floor) | packs:change-governance | — | warn:approvals:break_glass * |
ChangeGovernanceService/GetGovernanceMetadata | target read, 404-on-deny | packs:change-governance | — | — |
ChangeGovernanceService/SetGovernanceMetadata | target read + requester, change owner or target updatable | packs:change-governance | — | api:governance_metadata:update |
ChangeGovernanceService/ExportSubmission | target read, 404-on-deny | packs:change-governance | — | — |
ChangeGovernanceService/ListAssetOwners | rows filtered by readable on /governance/owners<node path> | packs:change-governance | — | — |
ChangeGovernanceService/GetAssetOwner | readable on /governance/owners<node path>, 404-on-deny | packs:change-governance | — | — |
ChangeGovernanceService/CreateAssetOwner | updatable on /governance/owners<node path> | packs:change-governance | change_governance.owner_write | api:asset_owners:create |
ChangeGovernanceService/UpdateAssetOwner | updatable on /governance/owners<node path> | packs:change-governance | change_governance.owner_write | api:asset_owners:update |
ChangeGovernanceService/DeleteAssetOwner | updatable on /governance/owners<node path> | packs:change-governance | change_governance.owner_write | api:asset_owners:destroy |
ChangeGovernanceService/GetChangeGovernanceDashboard | readable on /governance/change (the root scope) | packs:change-governance | — | — |
AgentService/ListAgents | readable on /governance/agents or updatable on /admin | — | — | — |
AgentService/GetAgent | readable on /governance/agents or updatable on /admin; or a named approver / the requester of an open checklist naming this agent (the approver-scoped subject read) | — | — | — |
AgentService/SetAgentDraining | updatable on /admin | — | — | info:agent:drain_changed * |
AgentService/ForgetAgent | updatable on /admin | — | — | info:agent:forgotten * |
AgentService/RevokeAgent | updatable on /admin | — | — | info:agent:revoked * |
AgentService/HaltAgent | updatable on /admin | — | — | warn:agent:halted * |
AgentService/ResumeAgentHalt | updatable on /admin | — | — | info:agent:halt_resumed * |
AgentService/HaltAgentGroup | updatable on /admin | — | — | warn:agent:group_halted * |
AgentService/ResumeAgentGroupHalt | updatable on /admin | — | — | info:agent:group_halt_resumed * |
AgentService/GetAgentAssignments | readable on /governance/agents or updatable on /admin | — | — | — |
AgentService/GetAgentActivity | readable on /governance/agents or updatable on /admin | packs:agent-governance | — | — |
AgentService/GetAgentTrustReview | readable on /governance/agents or updatable on /admin; or a named approver / the requester of an open checklist naming this agent (the approver-scoped subject read) | packs:agent-governance | — | — |
AgentService/SetAgentOwner | updatable on /admin | — | — | info:agent:owner_changed * |
AgentService/GetAgentGovernanceDashboard | readable on /governance/agents or updatable on /admin | packs:agent-governance | — | — |
AgentService/ListAgentInstances | readable on /governance/agents or updatable on /admin | — | — | — |
AgentService/RolloverAgent | updatable on /admin | — | — | info:agent:rollover_started * |
AgentService/AdvanceAgentRollover | updatable on /admin | — | — | info:agent:rollover_continued / rollover_aborted / rollover_rolled_back / rollover_finished * |
AgentService/GetAgentRollover | readable on /governance/agents or updatable on /admin | — | — | — |
AgentReleaseService/RegisterAgentSigningKey | updatable on /admin | packs:agent-governance | — | info:agent_release:key_registered * |
AgentReleaseService/ListAgentSigningKeys | updatable on /admin | packs:agent-governance | — | — |
AgentReleaseService/SetAgentSigningKeyStatus | updatable on /admin | packs:agent-governance | — | info:agent_release:key_status_changed * |
AgentReleaseService/CreateAgentRelease | updatable on /admin | packs:agent-governance | — | info:agent_release:created * |
AgentReleaseService/ListAgentReleases | readable on /governance/agents or updatable on /admin | packs:agent-governance | — | — |
AgentReleaseService/GetAgentRelease | readable on /governance/agents or updatable on /admin; or a named approver / the requester of an open checklist naming this release (the approver-scoped subject read) | packs:agent-governance | — | — |
AgentReleaseService/PromoteAgentRelease | updatable on /admin | packs:agent-governance | — | info:agent_release:promoted * |
AgentReleaseService/GetAgentReleaseStages | readable on /governance/agents or updatable on /admin | packs:agent-governance | — | — |
AgentReleaseService/SetAgentReleaseStages | updatable on /admin | packs:agent-governance | — | info:agent_release:ladder_changed * |
AgentReleaseService/RenameAgentReleaseStage | updatable on /admin | packs:agent-governance | — | info:agent_release:ladder_changed * |
AgentReleaseService/RetireAgentRelease | updatable on /admin | packs:agent-governance | — | info:agent_release:retired * |
AgentReleaseService/RevokeAgentRelease | updatable on /admin | packs:agent-governance | — | info:agent_release:revoked * |
NotificationAdminService/ListNotificationMandates | updatable on /admin | packs:security-governance | — | — |
NotificationAdminService/CreateNotificationMandate | updatable on /admin | packs:security-governance | — | api:notification_mandates:create |
NotificationAdminService/UpdateNotificationMandate | updatable on /admin | packs:security-governance | — | api:notification_mandates:update |
NotificationAdminService/DeleteNotificationMandate | updatable on /admin | packs:security-governance | — | api:notification_mandates:destroy |
NotificationAdminService/QueryNotificationDeliveries | updatable on /admin | packs:security-governance | — | — |
NotificationAdminService/GetNotificationRetention | updatable on /admin | packs:security-governance | — | — |
NotificationAdminService/UpdateNotificationRetention | updatable on /admin | packs:security-governance | — | api:notification_retention:update |
Notes:
RecordCampaignDecisionrecords the decision in the shared approval grammar:audit:review_campaigns:approve,rejectorflagper the decision recorded (retain/revoke/flag).- An approval policy carrying
require_step_upadditionally puts the matched run create on the floor (change_governance.execute) — a policy column, not a per-RPC one.BreakGlassReleaseis deliberately not on the step-up floor (break-glass is the exemption). - The campaign-closure attestation appends to the evidence ledger without the security-governance pack: ledger recording is base posture; the auditor read/verify/attest/hold surfaces are the pack.
- Metadata writes touching a protective field (
core.criticality,core.data_sensitivity,core.external_exposure) carry the conditionalmetadata.protective_writefloor; non-protective writes skip it.
Every row is backed by behavioural proofs in the server's test suite: the step-up floors, the pack refusals and the deny behaviour are each asserted against the live procedure census, so a surface cannot ship with a weaker gate than the row above states.