Skip to main content
Version: v5.7.0

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>, /git/content<node path>/<repository path> — the repository-content reads content() / list() make by expression, opschain docs expressions) are delegable path-RBAC grants on the user plane, never implied by node write authz or admin status; /admin updatable is the function-level admin-plane determination. A denied rule-path caller answers permission_denied; a denied node read answers not_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_REQUIRED refusal 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 (see opschain docs entitlements).
  • Step-up floor — the verb demands a live elevated session; without one the call answers ERROR_REASON_STEP_UP_REQUIRED (or ERROR_REASON_MFA_ENROLMENT_REQUIRED for a factor-less platform session). See opschain docs identity and opschain 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.
SurfaceAuthorisation determinationPack entitlementStep-up floorAudit event
MetadataService/ListMetadataProfilesauthenticated (the profile catalogue is vocabulary)———
MetadataService/GetMetadataProfileauthenticated (the profile catalogue is vocabulary)———
MetadataService/CreateMetadataProfilemetadata-writer: updatable on /metadata——api:metadata_profiles:create
MetadataService/UpdateMetadataProfilemetadata-writer: updatable on /metadata——api:metadata_profiles:update
MetadataService/GetNodeMetadatanode read, 404-on-deny———
MetadataService/SetNodeMetadatametadata-writer: updatable on /metadata<node path>—metadata.protective_write (protective fields only)api:node_metadata:set
MetadataService/BulkAnnotatemetadata-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/ApplyMetadataProfileMigrationmetadata-writer: updatable on /metadata—metadata.protective_write (protective fields only)api:node_metadata:migrate
MetadataService/ListMetadataRegisternode read per row — unreadable nodes' values never appear———
MetadataService/ExportMetadataRegisternode read per row — unreadable nodes' values never appear———
GovernanceService/ListControlsreadable on /governance/controls———
GovernanceService/GetControlreadable on /governance/controls———
GovernanceService/CreateControlupdatable on /admin——api:governance_controls:create
GovernanceService/UpdateControlupdatable on /admin——api:governance_controls:update
GovernanceService/ListEvidenceLedgerreadable on /governance/evidencepacks:security-governance——
GovernanceService/VerifyEvidenceLedgerreadable on /governance/evidencepacks:security-governance——
GovernanceService/ExportEvidenceLedgerreadable on /governance/evidencepacks:security-governance——
GovernanceService/GetGovernancePostureReportreadable on /governance/evidencepacks:security-governance——
GovernanceService/AppendAttestationupdatable on /governance/evidencepacks:security-governancegovernance.attestapi:attestations:create
GovernanceService/ReAnchorEvidenceLedgerupdatable on /governance/evidencepacks:security-governancegovernance.ledger_re_anchorwarn:governance:ledger_re_anchored
GovernanceService/SetEvidenceLegalHoldupdatable on /adminpacks:security-governancegovernance.legal_holdapi:evidence_ledger:legal_hold
GovernanceService/CreateReviewCadenceupdatable on /admin——api:review_cadences:create
GovernanceService/ListReviewCadencesupdatable on /admin———
GovernanceService/UpdateReviewCadenceupdatable on /admin——api:review_cadences:update
GovernanceService/OpenReviewCampaignupdatable on /admin——api:review_campaigns:create
GovernanceService/OpenAccessReviewCampaignupdatable on /adminpacks:security-governance—api:review_campaigns:create
GovernanceService/ListReviewCampaignsreadable on /governance/campaigns———
GovernanceService/GetReviewCampaignreadable on /governance/campaigns———
GovernanceService/RecordCampaignDecisionupdatable on /governance/campaigns—governance.campaign_decisionaudit:review_campaigns:approve
GovernanceService/CloseReviewCampaignupdatable on /governance/campaigns—governance.campaign_closeapi:review_campaigns:close
GovernanceService/CreateWaiverupdatable on /admin—governance.waiver_grantapi:governance_waivers:create
GovernanceService/ListWaiversreadable on /governance/waivers———
GovernanceService/ListGovernanceWorkItemsreadable on /governance/work_items———
GovernanceService/CompleteGovernanceWorkItemupdatable on /governance/work_items—governance.work_item_completeapi:governance_work_items:complete
ChangeGovernanceService/ListApprovalPoliciesauthenticated (the funnel explains itself); authorisations reports the caller's authoring standingpacks:change-governance——
ChangeGovernanceService/GetApprovalPolicyauthenticated (the funnel explains itself)packs:change-governance——
ChangeGovernanceService/CreateApprovalPolicyupdatable on /governance/change<scope>packs:change-governancechange_governance.policy_writeapi:approval_policies:create
ChangeGovernanceService/UpdateApprovalPolicyupdatable on /governance/change<scope>packs:change-governancechange_governance.policy_writeapi:approval_policies:update
ChangeGovernanceService/DeleteApprovalPolicyupdatable on /governance/change<scope>packs:change-governancechange_governance.policy_writeapi:approval_policies:destroy
ChangeGovernanceService/ConvertSettingsApproversupdatable on /governance/change (the root scope)packs:change-governancechange_governance.policy_writeapi:settings_approvers:converted
ChangeGovernanceService/ConvertStepApprovalGatesupdatable on /governance/change (the root scope)packs:change-governancechange_governance.policy_writeapi:step_approval_gates:converted
ChangeGovernanceService/ListPendingApprovalsrows filtered by target readpacks:change-governance——
ChangeGovernanceService/ListApprovalChecklistsrows filtered by target read OR the caller's own decision OR oversight (readable on /governance/change, or updatable on /admin)packs:change-governance——
ChangeGovernanceService/GetApprovalChecklisttarget read, 404-on-denypacks:change-governance——
ChangeGovernanceService/ApproveChecklisttarget read + approver-list membership on a line (self-approval excluded)packs:change-governance—audit:approvals:approve
ChangeGovernanceService/RejectChecklisttarget read + approver-list membership on a line (self-approval excluded)packs:change-governance—audit:approvals:reject
ChangeGovernanceService/StartApprovedRuntarget read + executable on <target>/actions/<action>packs:change-governance—audit:approvals:release *
ChangeGovernanceService/BreakGlassReleasetarget read + updatable on /governance/change<target>; mandatory reason (deliberately not on the step-up floor)packs:change-governance—warn:approvals:break_glass *
ChangeGovernanceService/GetGovernanceMetadatatarget read, 404-on-denypacks:change-governance——
ChangeGovernanceService/SetGovernanceMetadatatarget read + requester, change owner or target updatablepacks:change-governance—api:governance_metadata:update
ChangeGovernanceService/ExportSubmissiontarget read, 404-on-denypacks:change-governance——
ChangeGovernanceService/ListAssetOwnersrows filtered by readable on /governance/owners<node path>packs:change-governance——
ChangeGovernanceService/GetAssetOwnerreadable on /governance/owners<node path>, 404-on-denypacks:change-governance——
ChangeGovernanceService/CreateAssetOwnerupdatable on /governance/owners<node path>packs:change-governancechange_governance.owner_writeapi:asset_owners:create
ChangeGovernanceService/UpdateAssetOwnerupdatable on /governance/owners<node path>packs:change-governancechange_governance.owner_writeapi:asset_owners:update
ChangeGovernanceService/DeleteAssetOwnerupdatable on /governance/owners<node path>packs:change-governancechange_governance.owner_writeapi:asset_owners:destroy
ChangeGovernanceService/GetChangeGovernanceDashboardreadable on /governance/change (the root scope)packs:change-governance——
AgentService/ListAgentsreadable on /governance/agents or updatable on /admin———
AgentService/GetAgentreadable 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/SetAgentDrainingupdatable on /admin——info:agent:drain_changed *
AgentService/ForgetAgentupdatable on /admin——info:agent:forgotten *
AgentService/RevokeAgentupdatable on /admin——info:agent:revoked *
AgentService/HaltAgentupdatable on /admin——warn:agent:halted *
AgentService/ResumeAgentHaltupdatable on /admin——info:agent:halt_resumed *
AgentService/HaltAgentGroupupdatable on /admin——warn:agent:group_halted *
AgentService/ResumeAgentGroupHaltupdatable on /admin——info:agent:group_halt_resumed *
AgentService/GetAgentAssignmentsreadable on /governance/agents or updatable on /admin———
AgentService/GetAgentActivityreadable on /governance/agents or updatable on /adminpacks:agent-governance——
AgentService/GetAgentTrustReviewreadable 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/SetAgentOwnerupdatable on /admin——info:agent:owner_changed *
AgentService/GetAgentGovernanceDashboardreadable on /governance/agents or updatable on /adminpacks:agent-governance——
AgentService/ListAgentInstancesreadable on /governance/agents or updatable on /admin———
AgentService/RolloverAgentupdatable on /admin——info:agent:rollover_started *
AgentService/AdvanceAgentRolloverupdatable on /admin——info:agent:rollover_continued / rollover_aborted / rollover_rolled_back / rollover_finished *
AgentService/GetAgentRolloverreadable on /governance/agents or updatable on /admin———
AgentReleaseService/RegisterAgentSigningKeyupdatable on /adminpacks:agent-governance—info:agent_release:key_registered *
AgentReleaseService/ListAgentSigningKeysupdatable on /adminpacks:agent-governance——
AgentReleaseService/SetAgentSigningKeyStatusupdatable on /adminpacks:agent-governance—info:agent_release:key_status_changed *
AgentReleaseService/CreateAgentReleaseupdatable on /adminpacks:agent-governance—info:agent_release:created *
AgentReleaseService/ListAgentReleasesreadable on /governance/agents or updatable on /adminpacks:agent-governance——
AgentReleaseService/GetAgentReleasereadable 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/PromoteAgentReleaseupdatable on /adminpacks:agent-governance—info:agent_release:promoted *
AgentReleaseService/GetAgentReleaseStagesreadable on /governance/agents or updatable on /adminpacks:agent-governance——
AgentReleaseService/SetAgentReleaseStagesupdatable on /adminpacks:agent-governance—info:agent_release:ladder_changed *
AgentReleaseService/RenameAgentReleaseStageupdatable on /adminpacks:agent-governance—info:agent_release:ladder_changed *
AgentReleaseService/RetireAgentReleaseupdatable on /adminpacks:agent-governance—info:agent_release:retired *
AgentReleaseService/RevokeAgentReleaseupdatable on /adminpacks:agent-governance—info:agent_release:revoked *
NotificationAdminService/ListNotificationMandatesupdatable on /adminpacks:security-governance——
NotificationAdminService/CreateNotificationMandateupdatable on /adminpacks:security-governance—api:notification_mandates:create
NotificationAdminService/UpdateNotificationMandateupdatable on /adminpacks:security-governance—api:notification_mandates:update
NotificationAdminService/DeleteNotificationMandateupdatable on /adminpacks:security-governance—api:notification_mandates:destroy
NotificationAdminService/QueryNotificationDeliveriesupdatable on /adminpacks:security-governance——
NotificationAdminService/GetNotificationRetentionupdatable on /adminpacks:security-governance——
NotificationAdminService/UpdateNotificationRetentionupdatable on /adminpacks:security-governance—api:notification_retention:update

Notes:

  • RecordCampaignDecision records the decision in the shared approval grammar: audit:review_campaigns:approve, reject or flag per the decision recorded (retain/revoke/flag).
  • An approval policy carrying require_step_up additionally puts the matched run create on the floor (change_governance.execute) — a policy column, not a per-RPC one. BreakGlassRelease is 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, core.image_provenance) carry the conditional metadata.protective_write floor; 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.