Skip to Content

Permissions

The API enforces 72 permissions of the form product.resource.action: 13 in organisation scope and 59 in program scope (program 13, evidence 13, plans 14, review 10, progress 9). The catalog is pinned in api/app/auth/permissions.py (EXPECTED_PERMISSION_COUNT = 72), mirrored in web/lib/auth/permissions.ts and in the table below; web/scripts/check-permissions-sync.mjs compares the three by key, scope, order and count. Every route has exactly one permission or a documented public or authenticated rule; a missing permission answers 403 as problem+json with the key in permission.

Shape

  • product is one of org, program, evidence, plans, review, progress.
  • action comes from the closed set read, create, update, delete, manage, approve, link, sync, use, read_own, manage_owners.
  • Scope kind is org when the product segment is org, otherwise program. Org-scope permissions apply everywhere in the organisation; program-scope permissions apply inside one program.
  • Effective permissions are the union of direct and group role assignments; there are no deny rules.
  • .manage covers create, update, delete and the transitions to every status other than approved; .approve covers the /approve and /decision routes; .use starts agent runs or tool invocations.

Catalog

Organisation scope (org, 13)

PermissionScopeDescription
org.settings.readorgRead organisation name, slug and settings
org.settings.updateorgUpdate organisation settings
org.programs.readorgList the organisation’s programs
org.programs.createorgCreate a program
org.programs.manageorgRename, pause, complete or archive a program
org.users.readorgList users of the organisation
org.users.manageorgInvite, deactivate or update users
org.groups.readorgList groups
org.groups.manageorgCreate, update or delete groups and their members
org.roles.readorgList organisation role assignments
org.roles.manageorgAssign or remove organisation roles other than owner
org.roles.manage_ownersorgGrant or revoke the organisation owner persona
org.audit.readorgRead the organisation audit log

Program scope (program, 13)

PermissionScopeDescription
program.settings.readprogramRead program name, description, stage and status
program.settings.updateprogramUpdate program settings and current stage
program.members.readprogramList members of the program
program.members.manageprogramAdd or remove program members
program.roles.readprogramList program role assignments
program.roles.manageprogramAssign or remove program roles other than owner
program.roles.manage_ownersprogramGrant or revoke the program owner persona
program.connections.readprogramList connections to external systems and their sync runs
program.connections.manageprogramCreate, update or remove connections
program.connections.syncprogramTrigger a manual sync of a connection
program.audit.readprogramRead the program audit log
program.agent_runs.readprogramList agent runs and their events
program.agent_runs.manageprogramCancel agent runs

Evidence (evidence, 13)

PermissionScopeDescription
evidence.questions.readprogramRead research questions
evidence.questions.manageprogramCreate, update or delete research questions
evidence.sources.readprogramRead evidence sources
evidence.sources.manageprogramRegister or update evidence sources
evidence.sources.linkprogramLink a source to a question, finding or hypothesis
evidence.findings.readprogramRead findings
evidence.findings.manageprogramRecord or update findings
evidence.hypotheses.readprogramRead hypotheses
evidence.hypotheses.manageprogramPropose or update hypotheses
evidence.hypotheses.approveprogramAccept or reject a hypothesis
evidence.gaps.readprogramRead knowledge gaps
evidence.gaps.manageprogramAddress or dismiss knowledge gaps
evidence.agents.useprogramStart evidence agent runs (compare, gaps, hypotheses)

Plans (plans, 14)

PermissionScopeDescription
plans.plans.readprogramRead research plans
plans.plans.manageprogramCreate, update or transition research plans
plans.plans.approveprogramApprove a research plan
plans.protocols.readprogramRead protocols
plans.protocols.manageprogramDraft, update or transition protocols
plans.protocols.approveprogramApprove a protocol
plans.experiments.readprogramRead experiment records
plans.experiments.manageprogramCreate or update experiment records
plans.reports.readprogramRead research reports
plans.reports.manageprogramDraft, update or transition research reports
plans.reports.approveprogramApprove a research report
plans.tools.readprogramList approved tools and their invocations
plans.tools.useprogramInvoke an approved analytical or design tool
plans.agents.useprogramStart plans agent runs (draft protocol, draft report)

Review (review, 10)

PermissionScopeDescription
review.sops.readprogramRead standard operating procedures and document requirements
review.sops.manageprogramDraft, update or transition SOPs
review.sops.approveprogramApprove an SOP
review.checks.readprogramRead review checks
review.findings.readprogramRead review findings
review.findings.manageprogramAnnotate review findings
review.findings.approveprogramDecide a review finding (accept, dismiss, resolve)
review.deviations.readprogramRead deviations
review.deviations.manageprogramRecord or update deviations
review.agents.useprogramStart a review check (agent comparison against an SOP)

Progress (progress, 9)

PermissionScopeDescription
progress.milestones.readprogramRead milestones and the program overview
progress.milestones.manageprogramCreate, update or delete milestones
progress.dependencies.readprogramRead milestone dependencies
progress.dependencies.manageprogramCreate or delete milestone dependencies
progress.open_items.readprogramRead open items
progress.open_items.manageprogramCreate or update open items
progress.approvals.readprogramRead approval requests
progress.approvals.manageprogramRequest or withdraw approvals
progress.approvals.approveprogramDecide an approval request

Reading the table

evidence.hypotheses.approve (program) is the permission a person needs to accept or reject a hypothesis; org.roles.manage_owners (org) is the one permission that separates org_owner from org_admin. Which persona holds which key is on the personas page.

Source: api/app/auth/permissions.py, web/lib/auth/permissions.ts, web/scripts/check-permissions-sync.mjs, PRODUCT-CONTRACT.md