Skip to content

Roles and permissions

Two roles, and an owner that is not a role

Section titled “Two roles, and an owner that is not a role”

A member of a workspace has exactly one of two roles: admin or member. Those are the only roles in the system — there is no system-level admin and no owner role. Ownership is a field on the workspace (the owner’s user id), and the owner may hold either role.

Any authenticated user can create a workspace. The creator automatically becomes its owner and an admin member. No other permission is involved.

OperationWho
Create a workspaceAny authenticated user, becoming its owner and an admin
Read, update or delete a workspaceOwner or admin
List members, add a member, change a member’s role, remove a memberOwner or admin
Transfer ownership to another adminOwner only
Read the LLM configuration, change it, edit prompts, manage custom providers, probe a provider’s modelsAdmin
Test an LLM connection with credentials that are not saved yetAdmin
Read whether the workspace can extract, and which fields are missingAny member — this is the one configuration read a plain member may call
Start an extractionOwner or admin
Delete a storyOwner or admin
Mark a task invalid, or revoke an invalidation markOwner or admin
Create, list, update or delete projectsAny member
Create and edit user stories; read stories, their versions and their invalidation historyAny member
Import stories from a CSVAny member
Check the status of a running extractionAny member
Export the workspace’s tasksAny member
Read tasks and update them — their state and labels anywhere, their dependencies only on the current versionAny member

One footnote to that table:

  • Starting an extraction mints a new version of the story, so it is reserved to the owner or an admin. Deleting a user story takes the same gate, and so do the mutating ends of the invalidation history.
  • The owner’s role cannot be changed: ownership has to be transferred first.
  • The owner cannot be removed from the workspace.
  • An admin cannot remove themselves while they are the workspace’s last admin — the request is refused with HTTP 400 and LAST_ADMIN_ERROR.
  • Adding a member always assigns the member role; becoming an admin is a role change, not an invite option.

Some permission-gated operations can fail for a reason that has nothing to do with permissions: deleting a story, and marking or revoking an invalidation, must update the vector store. When Qdrant is configured but unreachable they are refused with HTTP 503 and VECTOR_STORE_UNAVAILABLE. See Historical context.