Skip to content

Roles and Permissions

TruePPM uses a 5-role per-project permission model stored in ProjectMembership and enforced on every API endpoint and WebSocket connection.

RoleOrdinalLabelDescription
Owner4Project AdminFull control. Manages members, can assign any role below Owner, deletes project.
Admin3Project ManagerFull task and dependency edit, project settings, baseline creation.
Scheduler2Resource ManagerAssigns resources and edits dependencies. Cannot edit task content.
Member1Team MemberEdits own assigned tasks. Logs time.
Viewer0ViewerRead-only. Can pull delta sync to mobile.
ActionOwnerAdminSchedulerMemberViewer
View project data
Pull delta sync
Connect WebSocket
Edit own assigned tasks
Create/edit any task
Create/edit dependencies
Assign resources
Edit project settings
Manage members
Delete project
Self-remove

The 5 roles are capability levels, not job titles. The same role may serve different personas depending on the team’s delivery method (waterfall, agile, or hybrid).

PersonaRecommended roleRationale
Executive Sponsor / COOViewerReads status and reports; no editing needed.
PMO DirectorViewerPortfolio-level visibility; project edits belong to the PM.
Project ManagerProject Manager (Admin)Full task/dependency edit, baseline management.
Product OwnerProject Manager (Admin)Backlog and sprint content authority requires the same write access as a PM.
Scrum Master / Agile Delivery LeadProject Manager (Admin)Opens/closes sprints, manages velocity, runs ceremonies — same capability tier as a PM.
Resource ManagerResource Manager (Scheduler)Assigns resources without touching task content or the schedule directly.
Team Member / ContributorTeam Member (Member)Edits their own assigned tasks and logs time.
Agile CoachViewerObserves team health signals; editing authority belongs to the team, not the coach.

Product Owners and Scrum Masters hold the same Project Manager role as a traditional PM. This is intentional: sprint sovereignty and scope-change protection are enforced at the application layer (sprint open/close rules, explicit scope-injection approval), not by RBAC. A PM cannot silently add tasks to an active sprint regardless of their role, because the sprint model rejects mid-sprint mutations without team notification — the guardrail is in the workflow, not the permission level.

This means you do not need separate “Product Owner” or “Scrum Master” role slots. A project board with a Scrum Master assigned Admin and a PM also assigned Admin will have both respect the sprint boundary because the system enforces it uniformly.

Members are managed at /api/v1/projects/{project_id}/members/.

POST /api/v1/projects/{project_id}/members/
Authorization: Bearer <token>
{"user": "<user-id>", "role": 1}

Role escalation rule: you can only assign a role strictly below your own. An Owner (4) can assign up to Admin (3).

PATCH /api/v1/projects/{project_id}/members/{membership_id}/
{"role": 2}
DELETE /api/v1/projects/{project_id}/members/{membership_id}/

Any member may remove themselves. An Owner may remove members with a role below their own.

A project must always have at least one Owner. Removing or demoting the last Owner returns HTTP 400. The check uses SELECT FOR UPDATE to prevent a concurrent-removal race condition.

When a user creates a project, they are automatically assigned the Owner role via ProjectViewSet.perform_create().

All querysets are scoped to projects the requesting user is a member of via ProjectScopedViewSet. Non-members receive an empty queryset rather than a 403, preventing information leakage about object existence.

WebSocket connections authenticate via ?token=<jwt> on the connection URL. Viewer (role=0) connections are rejected with close code 4003 — real-time push requires Member or above.