approver is powerful despite its name. agents:admin lets it reveal
captured raw traces, and sod:override lets it authorize same-person
steps where policy allows. It cannot decide human-review items: that
needs audit:write, held by member, developer and admin.
List the templates, with descriptions, as an admin:
Several actions are four-eyes controls. Erasure and governed transitions always need
two different people. An intake needs two only when your organization sets it:
Action
Who proposes
Who approves
Register a new agent (an intake), two people only when configured
intake:submit: developer, member, admin
intake:approve: approver, cro, admin. One approver is enough until an operator sets more per risk tier.
Erase a data subject’s content
audit:erase: cro, admin
erasure:approve: approver, admin
Governed lifecycle transitions (separation of duties)
guard:approve: approver, admin. Never the author or proposer of that version.
An agent must have an approved intake before it can be registered. Until
then, the Agents page stays empty even while the agent writes evidence:
Agents lists the registry, not evidence. Unregistered agents do not appear.
A developer submits an intake at Govern → Intakes → New. An approver
approves it from the intake’s page. Out of the box one approver is enough, and
that can be the person who submitted it. An operator can require more people
or a different person per risk tier (Set who approves
intakes). The fields
are described in the AI developer journey:
A new intake. The agent id stays reserved while the intake is submitted and after it is approved or rejected. Only a withdrawn or expired intake releases it.
Certifying an agent, promoting a judge, activating an obligation, and
confirming, revising or approving an agent intake need an interactive
sign-in: SSO, a password login, or sengol login --device approved in the
Console. An sk_ API token or a CI credential is refused.To require MFA for the most sensitive steps, set
SENGOL_SOD_REQUIRE_STEP_UP=true. It applies to objects at the CRITICAL
risk tier. For MFA everywhere, enforce it at your IdP.
Signed records cover evaluations, certifications, gold scores and erasure
tombstones. Account administration is not signed: creating users,
assigning roles, SCIM changes and break-glass sign-ins leave logs, not
records an auditor can verify offline. Keep your IdP’s own audit log for
those.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Sengol","colors":{"primary":"#1A56DB","light":"#4A90D9","dark":"#1A3A8F"},"favicon":"https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/favicon.svg?fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=6f4b4794d6371d3e181edf7a6170f4a4","navbar":{"primary":{"type":"button","label":"Request a pilot","href":"https://sengol.io/signup.html"}},"footer":{"socials":{"github":"https://github.com/sengol-io"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sengol","hasAudioNarration":false,"actualSubdomain":"sengol","customDomains":["docs.sengol.io"],"gitSource":{"type":"github","owner":"sengol-io","repo":"sengol-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"e4b9bb53-d3ce-4561-af4a-1a0e88741b63","liveDeploymentHistoryId":"6ad6e81cd7b175403f1c1b9a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad6e81cd7b175403f1c1b9a"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ad6e81cd7b175403f1c1b9a","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Guides","count":5},{"language":"default","tag":"Journeys","count":5},{"language":"default","tag":"Reference","count":4},{"language":"default","tag":"Concepts","count":2},{"language":"default","tag":"Get started","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/access-governance","slug":"/guides/access-governance","pageMetadata":{"title":"Access governance","description":"Roles, permissions, and the four-eyes controls built into Sengol.","href":"/guides/access-governance"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Roles, permissions, and the four-eyes controls built into Sengol.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,Frame,Heading,OptimizedImage,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Sengol ships twelve role templates. Each grants a fixed set of permissions.\nMap your IdP groups to them, or assign them to local users.`}),`\n`,_jsx(Heading,{level:`2`,id:`roles`,children:`Roles`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Role`}),_jsx(_components.th,{children:`For`}),_jsx(_components.th,{children:`Permissions`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`admin`})}),_jsx(_components.td,{children:`Platform administrators`}),_jsxs(_components.td,{children:[`everything except `,_jsx(_components.code,{children:`keys:admin`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`access-admin`})}),_jsx(_components.td,{children:`Identity team`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`users:admin`}),` only. Cannot read evidence, so Console pages stay empty.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`developer`})}),_jsx(_components.td,{children:`Agent builders`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:write`}),`, `,_jsx(_components.code,{children:`audit:read`}),`, `,_jsx(_components.code,{children:`intake:submit`}),`, `,_jsx(_components.code,{children:`dataset_rows:write`}),`, `,_jsx(_components.code,{children:`dataset_rows:read`}),`, `,_jsx(_components.code,{children:`guard:write`}),`, `,_jsx(_components.code,{children:`guard:replay`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`member`})}),_jsx(_components.td,{children:`Standard users, human reviewers`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:write`}),`, `,_jsx(_components.code,{children:`audit:read`}),`, `,_jsx(_components.code,{children:`intake:submit`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cro`})}),_jsx(_components.td,{children:`Risk and compliance leads`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:read`}),`, `,_jsx(_components.code,{children:`reports:generate`}),`, `,_jsx(_components.code,{children:`controlbook:write`}),`, `,_jsx(_components.code,{children:`sod:override`}),`, `,_jsx(_components.code,{children:`judge:challenge`}),`, `,_jsx(_components.code,{children:`audit:erase`}),`, `,_jsx(_components.code,{children:`authority:manage`}),`, `,_jsx(_components.code,{children:`legal_hold:manage`}),`, `,_jsx(_components.code,{children:`retention:approve`}),`, `,_jsx(_components.code,{children:`regression:review`}),`, `,_jsx(_components.code,{children:`sod:approve`}),`, `,_jsx(_components.code,{children:`intake:approve`}),`, `,_jsx(_components.code,{children:`review:configure`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`approver`})}),_jsx(_components.td,{children:`Second approver for four-eyes steps`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:read`}),`, `,_jsx(_components.code,{children:`reports:generate`}),`, `,_jsx(_components.code,{children:`agents:admin`}),`, `,_jsx(_components.code,{children:`sod:override`}),`, `,_jsx(_components.code,{children:`retention:approve`}),`, `,_jsx(_components.code,{children:`erasure:approve`}),`, `,_jsx(_components.code,{children:`regression:review`}),`, `,_jsx(_components.code,{children:`sod:approve`}),`, `,_jsx(_components.code,{children:`intake:approve`}),`, `,_jsx(_components.code,{children:`review:publish`}),`, `,_jsx(_components.code,{children:`guard:approve`}),`, `,_jsx(_components.code,{children:`guard:replay`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`validator`})}),_jsx(_components.td,{children:`Independent model validation`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:read`}),`, `,_jsx(_components.code,{children:`reports:generate`}),`, `,_jsx(_components.code,{children:`judge:challenge`}),`, `,_jsx(_components.code,{children:`regression:review`}),`, `,_jsx(_components.code,{children:`sod:approve`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`auditor`})}),_jsx(_components.td,{children:`Internal or external audit`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`audit:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`viewer`})}),_jsx(_components.td,{children:`Read-only stakeholders`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`audit:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`gateway`})}),_jsx(_components.td,{children:`A gateway service, not a person`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`gateway:mint`}),`, `,_jsx(_components.code,{children:`audit:write`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`eval-worker`})}),_jsx(_components.td,{children:`The eval worker for public jobs, not a person`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`eval-queue:work`}),`, `,_jsx(_components.code,{children:`audit:write`}),`, `,_jsx(_components.code,{children:`audit:read`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`online-eval-worker`})}),_jsx(_components.td,{children:`The online-scoring worker, not a person`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`eval-queue:work`}),`, `,_jsx(_components.code,{children:`eval-queue:online`}),`, `,_jsx(_components.code,{children:`audit:write`})]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`approver`}),` is powerful despite its name. `,_jsx(_components.code,{children:`agents:admin`}),` lets it reveal\ncaptured raw traces, and `,_jsx(_components.code,{children:`sod:override`}),` lets it authorize same-person\nsteps where policy allows. It `,_jsx(_components.strong,{children:`cannot`}),` decide human-review items: that\nneeds `,_jsx(_components.code,{children:`audit:write`}),`, held by `,_jsx(_components.code,{children:`member`}),`, `,_jsx(_components.code,{children:`developer`}),` and `,_jsx(_components.code,{children:`admin`}),`.`]})}),`\n`,_jsx(_components.p,{children:`List the templates, with descriptions, as an admin:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ADMIN_JWT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`$(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SENGOL_API_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/v1/auth/token\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"{`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`grant_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`console_admin`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`,`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`secret`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SENGOL_CONSOLE_ADMIN_SECRET`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`}\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` python`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'import sys, json; print(json.load(sys.stdin)[\"access_token\"])'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SENGOL_API_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/v1/roles\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ADMIN_JWT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` python`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'import sys, json; [print(r[\"role_id\"], \"-\", \", \".join(r[\"permissions\"])) for r in json.load(sys.stdin)]'`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`You can also create organization roles. A caller can never grant a\npermission it does not hold itself.`}),`\n`,_jsx(Heading,{level:`2`,id:`four-eyes-controls`,children:`Four-eyes controls`}),`\n`,_jsx(_components.p,{children:`Several actions are four-eyes controls. Erasure and governed transitions always need\ntwo different people. An intake needs two only when your organization sets it:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action`}),_jsx(_components.th,{children:`Who proposes`}),_jsx(_components.th,{children:`Who approves`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Register a new agent (an `,_jsx(_components.strong,{children:`intake`}),`), two people only when configured`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`intake:submit`}),`: developer, member, admin`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`intake:approve`}),`: approver, cro, admin. One approver is enough until an operator sets more per risk tier.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Erase a data subject’s content`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audit:erase`}),`: cro, admin`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`erasure:approve`}),`: approver, admin`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Governed lifecycle transitions (separation of duties)`}),_jsx(_components.td,{children:`the actor`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sod:approve`}),` ballots: approver, cro, validator, admin`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Approve a guard configuration version`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`guard:write`}),`: developer, admin`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`guard:approve`}),`: approver, admin. Never the author or proposer of that version.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`An agent must have an approved intake before it can be registered. Until\nthen, the `,_jsx(_components.strong,{children:`Agents`}),` page stays empty even while the agent writes evidence:`]}),`\n`,_jsx(Frame,{caption:`Agents lists the registry, not evidence. Unregistered agents do not appear.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=e1b6c00d7ddadd0944a0f72b4fd4e3e1`,alt:`Agents page reading No agents to show, with a Submit an intake link`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`images/console-agents.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=280\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=51a5625ce3b4f5aaabfff06ff6f97047 280w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=560\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=d694df2263ac574ef8665518291c0e05 560w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=840\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=9c4318a51e5bbd9b031b4a57ee288a34 840w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=1100\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=a2eeb9538ee1b56ba663cc1bf88415af 1100w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=1650\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=4e2482a109dc2acf3c0b41fafa2b5650 1650w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-agents.png?w=2500\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=d8cdb8f18ec62a4d41eb98dc6bffce2e 2500w`})}),`\n`,_jsxs(_components.p,{children:[`A developer submits an intake at `,_jsx(_components.strong,{children:`Govern → Intakes → New`}),`. An approver\napproves it from the intake’s page. Out of the box one approver is enough, and\nthat can be the person who submitted it. An operator can require more people\nor a different person per risk tier (`,_jsx(_components.a,{href:`/journeys/platform-operator#7-set-who-approves-intakes`,children:`Set who approves\nintakes`}),`). The fields\nare described in the `,_jsx(_components.a,{href:`/journeys/ai-developer#7-register-the-agent`,children:`AI developer journey`}),`:`]}),`\n`,_jsx(Frame,{caption:`A new intake. The agent id stays reserved while the intake is submitted and after it is approved or rejected. Only a withdrawn or expired intake releases it.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=dd7b4c5ed0db88c724b4198dd5690f26`,alt:`New intake form with agent id, use case, owner, risk tier and policies`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`images/console-intake-new.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=280\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=c8c7afaaff37882a86e9a4894aa57448 280w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=560\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=01eca67d3cc03a7843fedd45ef57df42 560w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=840\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=5402330e06a6d824d83ecd4e83c2e630 840w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=1100\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=579ca9a5e50a4e85411c5b980c89c4cc 1100w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=1650\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=222c589236844248a025e503d69044b8 1650w, https://mintcdn.com/sengol/WAzD6pTFOjHwDiMz/images/console-intake-new.png?w=2500\u0026fit=max\u0026auto=format\u0026n=WAzD6pTFOjHwDiMz\u0026q=85\u0026s=56d2164bbdb2c128ea2a88d7fbdf9038 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`interactive-sign-in`,children:`Interactive sign-in`}),`\n`,_jsxs(_components.p,{children:[`Certifying an agent, promoting a judge, activating an obligation, and\nconfirming, revising or approving an agent intake need an `,_jsx(_components.strong,{children:`interactive`}),`\nsign-in: SSO, a password login, or `,_jsx(_components.code,{children:`sengol login --device`}),` approved in the\nConsole. An `,_jsx(_components.code,{children:`sk_`}),` API token or a CI credential is refused.`]}),`\n`,_jsxs(_components.p,{children:[`To require MFA for the most sensitive steps, set\n`,_jsx(_components.code,{children:`SENGOL_SOD_REQUIRE_STEP_UP=true`}),`. It applies to objects at the `,_jsx(_components.code,{children:`CRITICAL`}),`\nrisk tier. For MFA everywhere, enforce it at your IdP.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-is-and-is-not-signed-evidence`,children:`What is and is not signed evidence`}),`\n`,_jsxs(_components.p,{children:[`Signed records cover evaluations, certifications, gold scores and erasure\ntombstones. `,_jsx(_components.strong,{children:`Account administration is not signed`}),`: creating users,\nassigning roles, SCIM changes and break-glass sign-ins leave logs, not\nrecords an auditor can verify offline. Keep your IdP’s own audit log for\nthose.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Access governance","description":"Roles, permissions, and the four-eyes controls built into Sengol.","href":"/guides/access-governance"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Roles","slug":"roles","depth":2,"children":[]},{"title":"Four-eyes controls","slug":"four-eyes-controls","depth":2,"children":[]},{"title":"Interactive sign-in","slug":"interactive-sign-in","depth":2,"children":[]},{"title":"What is and is not signed evidence","slug":"what-is-and-is-not-signed-evidence","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"sengol","siteName":"Sengol","title":"Access governance - Sengol","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-18T02:07:53.220Z","originalFileLocation":"guides/access-governance.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Roles, permissions, and the four-eyes controls built into Sengol.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sengol\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Access governance - Sengol\">\u003cmeta data-mint-head property=\"og:description\" content=\"Roles, permissions, and the four-eyes controls built into Sengol.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sengol\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sengol.io/guides/access-governance\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sengol.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Access+governance\u0026amp;description=Roles%2C+permissions%2C+and+the+four-eyes+controls+built+into+Sengol.\u0026amp;theme=63c05ba16e9a1b9a94743d12\u0026amp;signature=5dd4786d4221c3cb19e8becd1a2fcedfe3f5acddeb7ae8418ad0a482844ea3c6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Access governance - Sengol\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Roles, permissions, and the four-eyes controls built into Sengol.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sengol.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Access+governance\u0026amp;description=Roles%2C+permissions%2C+and+the+four-eyes+controls+built+into+Sengol.\u0026amp;theme=63c05ba16e9a1b9a94743d12\u0026amp;signature=5dd4786d4221c3cb19e8becd1a2fcedfe3f5acddeb7ae8418ad0a482844ea3c6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/sengol/VZURZVuft2jdUHoc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sengol\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1A56DB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sengol.io/guides/access-governance\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/access-governance.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sengol.io/#organization\",\"name\":\"Sengol\",\"url\":\"https://docs.sengol.io\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sengol.io#website\",\"name\":\"Sengol\",\"url\":\"https://docs.sengol.io\",\"publisher\":{\"@id\":\"https://docs.sengol.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sengol.io/guides/access-governance#webpage\",\"url\":\"https://docs.sengol.io/guides/access-governance\",\"name\":\"Access governance\",\"description\":\"Roles, permissions, and the four-eyes controls built into Sengol.\",\"dateModified\":\"2026-10-18T02:07:53.220Z\",\"isPartOf\":{\"@id\":\"https://docs.sengol.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sengol.io/guides/access-governance#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sengol.io/guides/access-governance#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.sengol.io/guides/guardrails\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access governance\",\"item\":\"https://docs.sengol.io/guides/access-governance\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sengol.io/guides/access-governance#article\",\"headline\":\"Access governance\",\"name\":\"Access governance\",\"description\":\"Roles, permissions, and the four-eyes controls built into Sengol.\",\"url\":\"https://docs.sengol.io/guides/access-governance\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sengol.io/guides/access-governance#webpage\"},\"dateModified\":\"2026-10-18T02:07:53.220Z\",\"publisher\":{\"@id\":\"https://docs.sengol.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sengol.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Sengol\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Sengol","nav":{"global":null,"groups":[{"group":"Get started","pages":[{"title":"Sengol","href":"/index"},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Journeys","pages":[{"title":"Platform operator","href":"/journeys/platform-operator"},{"title":"AI developer","href":"/journeys/ai-developer"},{"title":"Compliance and risk","href":"/journeys/compliance-officer"},{"title":"Human reviewer","href":"/journeys/reviewer"},{"title":"Auditor or examiner","href":"/journeys/auditor"}]},{"group":"Concepts","pages":[{"title":"Audit records","href":"/concepts/audit-records"},{"title":"ControlBook","href":"/concepts/controlbook"}]},{"group":"Guides","pages":[{"title":"Guardrails","href":"/guides/guardrails"},{"title":"Gate releases in CI","description":"Run a golden dataset through the gate on every pull request and fail the build on a regression.","href":"/guides/ci-gate"},{"title":"Access governance","href":"/guides/access-governance"},{"title":"Review workflows","description":"Route agent intakes to the teams that must review them before approval.","href":"/guides/review-workflows"},{"title":"Credentials by journey","href":"/guides/credentials"}]},{"group":"Reference","pages":[{"title":"Evaluator library","href":"/reference/evaluator-library"},{"title":"CLI","href":"/reference/cli"},{"title":"Environment variables","href":"/reference/environment"},{"title":"Review policy reference","href":"/reference/review-policy"}]}]},"basePath":"","title":"Access governance - Sengol","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-PS-3COT9.js","DynamicMarkdown-BcnBltEQ.js","zoom-image-lightbox-B4-wUcHm.js","lightbox-handle-r17bVUz3.js"]}