Skip to main content
All plans Nitsor records people, agent credentials and model Agents as distinct principals. Account roles, project rungs and credential scopes determine what each principal can do.

Identity, role, and permission

An identity answers “who or what is acting?” Nitsor knows three principal types, and every event, Decision and Ledger entry records which one acted: Workspace roles control account permissions. Project access levels control actions within a project; Nitsor calls a project access level a rung. Credential scopes limit API access. None of the three implies another.

Workspace roles

A workspace is an account. A member holds one of four roles; the matrix below is the permission table in the code. An admin holds every permission except billing:write, which stays with the owner and the billing role. The matrix shows what each role holds by itself. An owner or admin can also give one member two capabilities on top of their role, from Team settings, Members: Register and retry Sources (sources:register) and Manage storage connections (storage:write). Source access (sources:browse) works the same way when the account has made it explicit instead of giving it to every member. Nothing else on the matrix can be given to a member this way. A plain member can read the account, the roster, storage and notifications, create nothing at account level, and hold work:contribute, the floor that lets them claim, complete, review and commit annotations on projects they have been given a rung on. projects:write covers creating a project, binding routers and approving merges. What a person may do inside a project is decided by the rung, not by the role. Billing pages exist only on hosted plans. Community deployments turn billing off. Enterprise single sign-on uses the organization’s identity provider.

Project rungs

Inside a project, authority is one of four rungs, each including the ones below it: read, contribute, operate, admin. A rung is held through a grant row, per principal, per project. Account owners and admins hold admin on every project of the account without a row. Everyone else holds only what a grant on the project’s Access page (project Settings, then Access) gave them. There are no deny rules; exclusion is the absence of a row. The dashboard names the rungs Viewer (read), Contributor (contribute), Operator (operate) and Project admin (admin). A write denied at guarded authorization answers AUTHORIZATION_DENIED naming the missing scope or rung and a decisionId. A write refused before it reaches that check, such as an unscoped request whose body is invalid, answers AUTHORIZATION_DENIED with no decisionId and records nothing. A read below the required rung is refused too, but the read check persists no Decision, so a refused read carries no decisionId and does not appear in the Decision list.

Human roles

The pipeline, not the account, names the working roles. A workflow definition declares its own roles (for example annotator, reviewer) and each stage may require one; the rung granted on the Access page decides whether a person may hold work at all, and the stage’s requiredRole and requiredQualifications decide whether this person may hold this work. The contract declares qualifications but has no dated-evidence model for them.

Why the two tables stay separate

The role matrix answers “who may administer this account?” The rung table answers “who may act inside this project?” A workspace admin is a project admin everywhere by construction, and a plain member is nothing on a project until someone grants a rung. Merging the two would hide that a member with no grant can open no project at all.

Who can claim a stage

A rung says whether a person may act in a project. Eligibility says whether this person fits this work. A claim needs both, and it needs room: under the person’s load limit and under the stage’s limit. Four details decide most surprises:
  • Only a stage’s required role limits anyone. A workflow definition also declares a roles list, but that list restricts nobody, and a declared role that no stage requires opens nothing to anyone. A stage that requires no role passes everyone with contribute on the role check, and the other checks above still apply.
  • Stage roles and qualifications belong to the person across the workspace. They are granted on a project’s Access page, by a workspace owner or admin, and apply at the person’s next claim in every project of the workspace. Removing one leaves work the person already holds with them.
  • A model Agent holds no stage roles or qualifications, so it can work only at stages that require neither.
  • A Task is judged against the pipeline version it was created under. Adding or removing a requirement reaches only Tasks created after the pipeline is applied. A grant needs no new pipeline version, because the claim reads the person’s roles when it happens, but it opens waiting work only to a person who passes the other checks in the table. Pipelines explains why.
When nobody in the workspace holds a stage’s requirement, every claim there is refused, the owner’s included. The stage’s card on the Pipeline tab then says “Nobody holds it”, and the Inspector offers Grant on Access, a link to the Access page.

Machine roles

Two kinds of machine principal exist, and the ladder treats them differently. An agent credential’s token is generated with a cryptographically secure random number generator, shown once, and stored only as its SHA-256. A service account’s page lists each token with its status, and a revoked token stays listed for audit. Create one service account per job: every token of a service account acts as the same subject, so a service account shared by several tools makes the Ledger name one subject for all of them. Service accounts and tokens covers creating, rolling and revoking a token.

Provenance

Every governed write is an event on a branch with a principal, an authorization Decision and a Ledger entry. The minimum a later reader can recover: Almost nothing is self-reported. The one field a caller supplies about itself is the idempotencyKey, and the server refuses reserved namespaces (asset-commit:, safety-checkpoint:).

Denials and failed actions

Denials at guarded write authorization are kept. Such a refusal records a deny Decision with a reason code, and the response carries its decisionId, so an investigator can read the attempt through GET /api/v1/decisions. A write the route layer refuses earlier, because the credential lacks the account scope and the body is invalid, is answered without a Decision. A refused read is not recorded. Ledger entries exist only for accepted events. Neither has a dashboard screen. Clearances are a further check. A source can carry export-control markings, and a principal reaches marked data only when the account has recorded a clearance for every marking on it. A missing clearance denies after the grant check; an agent is never eligible for clearance:write.

Next step

List the human and machine identities involved in one real workflow, then read Review and rework to define how their outcomes combine.
PlansAll plans
Last verified2026-10-21