Skip to main content
CID222 Docs

Roles, capabilities and pages

The five fixed roles, the capability matrix in shadow mode, and which dashboard pages each role may open.

  • Type: reference

The five fixed roles, the 60-capability model, and the dashboard pages each role may open. Regenerate with make docs-generate.

Shadow mode. The capability model is computed and compared on every request but enforces nothing yet (GET /admin/rbac/shadow-report). What is enforced today is @Roles on the controller plus the page baselines below. Read the capability matrix as the design the decorators are being reconciled against, not as live policy.

superadmin and viewer are supersets: superadmin holds every capability, and viewer reaches every read but is refused every mutation globally with READ_ONLY_ROLE.

Roles

RoleWhat it isData scopeRead-onlyAssignable
superadminThe appliance owner. Holds every capability by superset, cannot be denied anything, and is the only role that may edit the access matrices or manage accounts.globalnoyes
admin_userThe day-to-day administrator: security policy, detections, compliance, governance, channels and platform operations. Reads its own tenant and the members of groups it owns. Account management stays with superadmin.owned_groupsnoyes
normal_userAn end user of the gateway. Holds no administrative capability; reads only its own data.selfnoyes
viewerA read-only demo account. Satisfies any role requirement on a safe HTTP method and is refused every mutating request globally, by property of the request rather than by which endpoints it may call.globalyesyes
auditorAn external reviewer. Reads compliance and governance evidence across every tenant, verifies frozen snapshots, and reads the audit trail. Cannot change anything, cannot read message content, and does not use the browser extension. Two recorded choices come with the role. (a) Its global read deliberately includes system rows (tenant_id IS NULL — unattributed SWG inspection traffic and org-wide governance assets) and the rows of users who have since left, because evidence an auditor cannot see is evidence they cannot sign off. (b) With no capability layer, endpoints that carry no @Roles at all stay reachable by any authenticated account, auditor included. That is an accepted property of a decorator-based model, not an oversight: closing it in general needs a rule that applies to undecorated handlers, which is what the cancelled capability phase was for. The one place it was not acceptable is chat: an auditor holding a session spends the customer's tokens and writes rows into the evidence it is signing off, so ChatRoleGuard refuses that role on ChatController and on the two SessionsController handlers that create, with 403 ROLE_NOT_FOR_CHAT (design §4.7, decided 2026-09-06). Session reads are untouched.globalnoyes

Capabilities (72)

= the API admits the role. = refused.

security policy (11)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
filters.manageChange what the gateway blocks: input filter groups, filters, regex patterns, and the import/export of a filter bundle.25
filters.overrides.managePer-tenant and per-family overrides of the shipped filter set, and the detection-count escalation that refuses bulk sensitive data.8
output_filters.manageResponse-side filter groups and filters.11
filter_testing.runThe filter-testing lab: test cases, groups, runs, and the DeepTeam red-team benchmarks.31
ml_engine.manageDetection-engine status and the side-by-side engine comparison.2
ml_tuning.manageDetection thresholds. Restarts ML services, so it stays with superadmin.3
ocr_settings.configureWhich one OCR engine image analysis runs, and its right-edge rescan.2
document_redaction.configureHow documents are redacted before they leave the gateway.2
code_safety.configureModel-redaction settings for the code-safety auditor.2
prompt_compression.configureInput-token reduction before the provider call.2
attack_knowledge.manageThe attack-knowledge entries the analyst reasons with: create, change, enable or disable, import, and promote a review into one.8

detection evidence (15)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
detections.viewThe detection query API: list, statistics, and one detection.3
all_detections.viewThe unified detection feed across chat, proxy, ICAP and extension — without message content.4
all_detections.view_contentRead the message body of a detection. The one capability in this inventory with no endpoint of its own, and the single line standing between an external auditor and customer conversation content.no endpoint
risk_analysis.viewRead asynchronous risk analyses and their statistics.5
risk_analysis.decideApprove, reject or reopen a risk analysis — the review decision itself.2
risk_analysis.runStart an on-demand risk analysis of a session, or cancel one that is queued.2
llm_review.viewRead LLM review verdicts, statistics, current locks, pending unlock requests, notifications and the review configuration.7
llm_review.manageUnlock a locked account, approve or deny an unlock request, and change the review configuration.4
analyst.chatTalk to the risk analyst, and list, read or delete your analyst chats.5
threat_knowledge.viewBrowse the shipped MITRE ATLAS and OWASP reference tables.8
threat_knowledge.reloadReload the ATLAS and OWASP tables from the shipped snapshot.2
event_logs.viewThe audit trail: event logs, request traces, per-object audit history, and the Claude Code activity views.14
retention.viewRead how long evidence is kept, and what is already past the window. The survey only — changing a window or running the sweep is retention.manage.1
retention.manageChange how long evidence is kept, and run the retention sweep. Withheld from auditor — shortening a window or sweeping deletes the evidence being audited. Split from retention.view in the CID-33 rework: refusing the READ as well denied the role its own headline question.2
logs.purgeDelete log rows outright. The sharpest separation-of-duties line in the product: an auditor must never be able to delete the evidence they are auditing.1

compliance (10)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
compliance.viewThe substance of a compliance review: statistics, regulations, mapped detections, financial impact, entity mappings, the mapping version ledger those mappings are pinned to, and the FX rates every cross-currency total is computed from.9
compliance.configureCHANGING the FX rates, the entity→regulation mappings and the per-regulation fine structures. Deliberately withheld from auditor: these change the fine figures in the report the auditor is signing off. Reading the rate table is compliance.view — the split is the whole point, and collapsing it back would either blind the auditor or let it author the numbers it verifies.4
compliance.exportDownload the four compliance PDFs: impact, regulations, detections, executive summary.4
compliance.reports.viewThe graded per-subject scorecard and the leaderboard.3
compliance.snapshots.viewThe auditor's core: list frozen periods, open one, read its per-regulation dossier, verify it without trusting us, download the artefact and its evidence pack, and see the snapshot schedule.9
compliance.snapshots.manageFreeze a period and change the schedule. Withheld from auditor by design: verifying evidence and producing it are the two halves separation of duties exists to keep apart.3
compliance.findings.viewList and read recorded compliance findings.2
compliance.findings.manageRecord a finding and change its state.2
grc.viewRead the GRC/CRQ simulation: policy impact, baseline, controls, coverage, history and thresholds — plus the two POSTs that compute and persist nothing (the what-if and the PDF).9
grc.manageRun a simulation, record control observations, and set control thresholds. The customer's act, not the auditor's.4

governance (4)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
governance.viewThe AI asset inventory: overview, assets, one asset and its consumers, findings, and the governance policy as read.6
governance.registerRegister a discovered AI asset into the sanctioned inventory.1
governance.decommissionRetire an AI asset from the inventory.1
governance.policy.manageChange the governance policy and run asset discovery.2

identity access (9)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
tenants.viewList accounts and read one.2
tenants.manageCreate, change and delete accounts, and generate a password-reset link. The method-level superadmin override on a class decorated admin_user — the case a class-decorator reading gets wrong.4
tenant_groups.manageTenant groups and their membership.8
capability_access.manageEdit the capability matrix. Superadmin-locked and undeniable: a role that can edit the matrix can grant itself anything, and a table that can hide the page holding the table can lock out the last administrator.3
page_access.manageEdit the page-visibility matrix.2
credentials.manageProvider API keys and the LLM readiness ledger.10
api_keys.manageGateway API keys (cid_key_*).8
ldap.configureAD/LDAP connection, directory browsing, and the sync scopes that place accounts.11
password_delivery.configureHow password-reset links reach a user (admin link, SMTP, EmailJS).3

platform ops (11)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
deployment.connectivity.setDeclare whether this appliance is internet-connected or air-gapped. One key, deployment-wide, and it changes the guidance on every LLM surface.1
license.viewThis appliance's license status, its activation request, and uploading a license file.3
licenses.issueThe owner console: issue, renew and revoke licenses for customers.9
system.updateInstall a new appliance version: upload, verify, install, roll back.12
system.certificatesThe appliance's own HTTPS certificate: names, CSR, upload, switch to the appliance CA, and the outbound site CA. Every change is a host reconcile; no private key is readable here.7
setup.runThe first-boot setup wizard, after an admin exists. Deliberately excludes GET /setup/status and POST /setup/admin, the pre-admin bootstrap that must work before any account does.10
models.manageThe model inventory: models, their statistics, providers and aggregated usage.4
model_routing.viewRead the routing policy and refresh it.2
model_routing.manageChoose the judge model and run a routing measurement.3
help.configureThe in-product assistant's settings, and uploading a policy document for analysis.3
diagnostics.viewThe appliance self-diagnostics snapshot and support bundle: host sizing, container health, service reachability, licence and TLS state, egress tests and the derived findings. Read-only; the bundle redacts every secret.3

channels endpoints (8)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
inspection.configureThe inline-proxy/ICAP inspection policy, its event and coverage views, and the proxy's status and CA material.9
attribution.manageWorkstation→user attribution records for proxy traffic.5
extension.manageBrowser-extension deployment, enrolled devices, and the filter/threshold policies pushed to them.6
extension.events.viewThe extension event feed and its statistics.2
edl_tokens.manageTokens the firewall uses to fetch the external dynamic list.3
endpoint_agent.manageThe OS-level endpoint agent fleet: policy, rollout, kill switch, devices, installers. Superadmin-only for writes; viewer retains global read-only visibility, as everywhere.11
repo_connector.manageRepository tracking for the code-safety auditor: connectors, assignments, analyses and reports.21
ai_usage.viewThe Shadow-AI usage report: apps, people, riskiest activity, timeline and its PDF.6

analytics cost (4)

CapabilityWhat it governssuperadminadmin_usernormal_userviewerauditorHandlers
analytics.viewTenant usage statistics and their PDF.2
cost_report.viewToken cost and savings. Admin-only (CID-133, decided 2026-09-06 by the product owner): these seven handlers previously sat under a class-level RolesGuard with no @Roles, admitting every signed-in account — data was already scoped per actor inside the service, so it was not a leak, but the access policy is now tightened to match cost_report.teams.view below.7
cost_report.teams.viewPer-team cost breakdown — the one cost handler that does carry a role requirement.1
integrations.manageOutbound SIEM and ITSM destinations. One row rather than two: the destination type lives in the request body, so splitting needs a body-level check — a different mechanism from a decorator. Split when a customer asks to separate their SIEM team from their ITSM team (design §8.4).8

Pages by role (38)

A page whose Licence key the installed licence lacks is subtracted for every role, superadmin included — /license itself is the deliberate exception.

Page idPathSectionsuperadminadmin_usernormal_userviewerauditorLicence keyAPI
dashboard/overviewtenant-analytics.controller.ts
ai-chat/playgroundoverviewchat.controller.ts (CombinedAuthGuard)
my-team/my-teamoverviewrisk.llm_reviewteam/team.controller.ts
models/ai-inventory/modelsinventorymodels.controller.ts
mcp-servers/ai-inventory/mcp-serversinventorymodels.controller.ts
filters/filtersdetectionfilters.controller.ts
all-detections/all-detectionsdetectioninline-proxy-inspect/all-detections
ai-usage/ai-usagedetectionext.browserbrowser-extension/admin-events.controller.ts
claude-code/claude-codedetectionevent-logging.controller.ts
inspection/inspectiondetectionicapinline-proxy-inspect/inspection-admin
file-redaction/file-redactiondetectioninline-proxy-inspect/file-redaction.controller.ts
llm-review/llm-reviewdetectionrisk.llm_reviewllm-review/admin-llm-review.controller.ts
analyst/analystdetectionrisk.llm_reviewllm-review/admin-llm-review.controller.ts
compliance/compliancecompliancecompliancecompliance.controller.ts
compliance-reports/compliance-reportscompliancecompliancecompliance/reports/compliance-report.controller.ts
event-logs/event-logscomplianceevent-logging.controller.ts
governance/governancegovernancegovernancegovernance/governance.controller.ts
governance-inventory/governance/inventorygovernancegovernancegovernance/governance.controller.ts
governance-risk/governance/riskgovernancegovernancegovernance/governance.controller.ts
governance-ownership/governance/ownershipgovernancegovernancegovernance/governance.controller.ts
tenants/tenantsaccesstenants.controller.ts (method-level superadmin overrides)
access-control/access-controlaccessrbac/rbac.controller.ts
tenant-groups/tenant-groupsaccesstenant-groups.controller.ts
credentials/credentialsaccesscredentials.controller.ts
access-keys/access-keysaccessapi-keys.controller.ts
endpoint-agent/endpoint-agentendpointsendpoint.agentendpoint-agent/endpoint-agent-admin.controller.ts
browser-extension/browser-extensionendpointsext.browserbrowser-extension/browser-extension-management.controller.ts
repo-connector/repo-connectorendpointscodesafetyrepo-connector admin controllers
tenant-analytics/tenant-analyticsreportingtenant-analytics.controller.ts
cost-savings/cost-savingsreportingcost.calculatorcost-report.controller.ts
filter-testing/filter-testinglabfilter-testing.controller.ts
ocr-benchmark/ocr-benchmarklabfilter-testing / ocr benchmark
key-testing/key-testinglabcredentials.controller.ts
ml-engine/ml-enginelabguardrails admin
settings/settingssystemconfiguration.controller.ts + per-pane controllers
license/licensesystemlicense.controller.ts
system-update/system-updatesystemsystem-update.controller.ts
license-admin/license-adminsystemlicense-admin.controller.ts

Edge cases

  • Held by everyone (0): — — the governed handlers carry no @Roles at all, so every signed-in account reaches them. Recorded, not silently promoted.
  • No endpoint (1): all_detections.view_content — service-level gates with no route.
  • Planned handlers (1): capability_access.manage — declared before the endpoints exist; the boot assertion skips them.

On this page

Download PDF