Key points
- AAA owns authorization decisions, policy checks, ACL expansion, filtering, and decision audit records.
- Every interface — UI, CLI, REST, hosted MCP, runners — passes through the same authorization boundary.
- AAA authorizes the original caller for every referenced resource, not only the entry point.
/v1/resources/...routes are handler-authorized: middleware defers, then the handler resolves the concrete resource and checks owner-level manage access.GET /v1/access/effective-permissionsanswers "what may I do here", including for a team path with no resource row yet.- IdP sync owns only
source: idpgrants for its provider; local UI, API, and GitOps grants stay editable.
How it works
Resource access has two questions: may the caller manage this resource, and may the caller use it inside a run. POST /v1/authz/resource-use/check and its batch form answer the second, which is what pipeline validation relies on when a run names a profile or knowledge document.
System Access is presented as a compact settings workspace with Basic and Advanced modes over the existing AAA, GitOps, identity-provider, and service-account token APIs. The page introduces no separate policy mutation path.
Authorization outcomes are auditable through GET /v1/audit and surface in monitoring under the security view.
Examples
# the effective answer, after roles and grants are resolved
curl -s -H "Authorization: Bearer $NOPSAI_TOKEN" "$NOPSAI_URL/v1/access/effective-permissions" | jq
# the grants that produced it
curl -s -H "Authorization: Bearer $NOPSAI_TOKEN" "$NOPSAI_URL/v1/access/grants" | jqImplementation evidence
doc/access-control.mdAAA service, product roles, access grants, route authorization, and audit behavior.
services/nopsai/resource_authz.goHandler-level resource authorization.

