Skip to Content

Personas

A persona is a versioned bundle of permissions seeded into the roles table (BuiltinRole{key, name, scope_kind, description, permissions, version}, version 1). Bundles are expanded from patterns at import time, so a typo fails the API at start-up; sync_builtin_roles inserts missing personas and updates changed bundles at every API start and never deletes. Ten personas exist: four in organisation scope and six in program scope. A role assignment binds a user or group to a persona in org scope or in one program.

Summary

KeyNameScopePermissionsBundle
org_ownerOrganisation ownerorg13Full control of the organisation, including owner grants.
org_adminOrganisation adminorg12Manages programs, users, groups and roles; cannot grant or revoke owners.
org_memberOrganisation memberorg5Reads organisation settings, programs, users, groups and roles.
org_auditorOrganisation auditororg6Reads every organisation record including the audit log.
program_ownerProgram ownerprogram59Full control of one program across all four products, including owner grants.
program_leadProgram leadprogram58Runs the program across all four products; cannot grant or revoke program owners.
scientistScientistprogram41Investigates evidence, drafts plans, protocols, experiments and reports; approvals of protocols and reports stay with approvers.
quality_reviewerQuality reviewerprogram31Compares records with SOPs, decides review findings and records deviations.
manufacturing_specialistManufacturing specialistprogram29Plans milestones, dependencies and open items for manufacturing planning; approvals stay with approvers.
viewerViewerprogram24Reads every program record; changes nothing.

Matrix

One row per resource, one column per persona. Letters are the actions of the permission strings the persona holds on that resource: r read, c create, u update, d delete, m manage, a approve, l link, s sync, x use, w manage_owners. A dash means no permission on that resource.

Resourceorg_ownerorg_adminorg_memberorg_auditorprogram_ownerprogram_leadscientistquality_reviewermanufacturing_specialistviewer
org.settingsr ur urr------
org.programsr c mr c mrr------
org.usersr mr mrr------
org.groupsr mr mrr------
org.rolesr m wr mrr------
org.auditrr-r------
program.settings----r ur urrrr
program.members----r mr mrrrr
program.roles----r m wr mrrrr
program.connections----r m sr m srrrr
program.audit----rrrrrr
program.agent_runs----r mr mrrrr
evidence.questions----r mr mr mrrr
evidence.sources----r m lr m lr m lrrr
evidence.findings----r mr mr mrrr
evidence.hypotheses----r m ar m ar m arrr
evidence.gaps----r mr mr mrrr
evidence.agents----xxx---
plans.plans----r m ar m ar m arr mr
plans.protocols----r m ar m ar mrrr
plans.experiments----r mr mr mrrr
plans.reports----r m ar m ar mrrr
plans.tools----r xr xr xrrr
plans.agents----xxx---
review.sops----r m ar m arr m arr
review.checks----rrrrrr
review.findings----r m ar m arr m arr
review.deviations----r mr mrr mrr
review.agents----xxxx--
progress.milestones----r mr mrrr mr
progress.dependencies----r mr mrrr mr
progress.open_items----r mr mr mr mr mr
progress.approvals----r m ar m arrr mr

How the bundles are built

  • org_owner is every org.* key; org_admin is the same minus org.roles.manage_owners; org_member is every org.*.read minus org.audit.read; org_auditor is every org.*.read.
  • program_owner is every program-scope key (program.*, evidence.*, plans.*, review.*, progress.*); program_lead is the same minus program.roles.manage_owners.
  • scientist reads everything in program scope, holds all of evidence.*, all of plans.* except plans.protocols.approve and plans.reports.approve, plus progress.open_items.manage and review.agents.use.
  • quality_reviewer reads everything, holds all of review.* and progress.open_items.manage.
  • manufacturing_specialist reads everything, holds progress.* except progress.approvals.approve, plus plans.plans.manage.
  • viewer reads everything in program scope and changes nothing.

Approvals stay with approvers by design: only program_owner and program_lead hold progress.approvals.approve, plans.protocols.approve and plans.reports.approve together.

Source: api/app/auth/personas.py, api/app/auth/permissions.py, api/app/services/roles.py, PRODUCT-CONTRACT.md