SEIF Docs

Authorization model

IMPLEMENTED in 0.4.0 (context-registry.v2). Workstation product concepts, not SEIF Protocol authority.

Principal classes

ClassWhoHow it authenticatesCan ever hold
HumanPeople: Viewer, Developer, Reviewer, AdminBearer credential resolved from an operator-configured reference (env:/keychain:)Capabilities granted by the role
AutomationCI and release toolingRegistry-issued scw_ci_… credential, digest-only at restBuild, regression, promotion/deploy within scope, trace ingestion — never approval, break-glass, access, policy or binding management
ApplicationRuntime consumers (a support backend, a mobile app)Registry-issued scw_app_… credential, digest-only at restcontext.resolve, context.expand, context.report_consumption, context.report_outcome, runtime.inspect — nothing that changes releases
RunnerThe Registry's own deployment runnerNo credential (in-process)trace.ingest, scoped to one deployment's Project and environment

APPLICATION IDENTITY ≠ HUMAN IDENTITY. CONSUMER CAPABILITY ≠ RELEASE AUTHORITY. An application credential can never be configured to deploy: the class bound is checked when the identity is created and on every request.

Scope

Every principal belongs to one organization. Service identities are scoped to exactly one Project; application identities must also name the environments they may resolve in. Humans may optionally be scoped to Projects. Authorization checks, in order: the route's capability (router-level, before any handler work), then the Project and environment of the addressed object. Authorization precedes routing, so an out-of-scope caller cannot learn whether an environment has an active deployment. Cross-organization reads return 404 (the object does not exist for that tenant).

Lifecycle

POST /v1/service-identities creates an identity (no secret). POST …/credentials issues a credential: the bearer secret appears once in that response; the Registry stores its SHA-256 digest, a 4-character hint, creator, expiry and last use. At most two credentials are active per identity, so rotation is replace-in-one-step ({"replaces": "<credential id>"}) or overlap-then-revoke. …/revoke and …/disable take effect on the next request. Every step is audited. Credentials carry recognizable prefixes so the secret scanners in Builds, traces, provider responses and delivery audits refuse them.

Security invariants

  • No route reachable by an application credential belongs to the access, development or delivery planes (tested over the route table).
  • Approval (environment.approve) and break-glass are human-only. A human Admin cannot inject traces (trace.ingest is automation/runner only).
  • Separation of duties (requireDistinctApprover) refuses an approval by the principal who registered the candidate, re-checked at promotion; break-glass under that policy needs a second administrator.
  • Denied mutations by machine credentials are audited (access.denied, bounded per principal).
  • Bearer secrets are never stored, logged, returned after issuance or written to traces.

<!-- BEGIN GENERATED: node scripts/authz-matrix.mjs -->

Capabilities by principal class and role

CapabilityHumanAutomationApplicationRunnerViewerDeveloperReviewerAdmin
context.resolve✓—✓——✓—✓
context.expand✓—✓——✓—✓
context.report_consumption✓—✓——✓—✓
context.report_outcome✓—✓——✓—✓
tools.execute✓—✓——✓—✓
tools.approve✓—————✓✓
runtime.inspect✓✓✓——✓✓✓
build.view✓✓——✓✓✓✓
build.register✓✓———✓—✓
build.tag✓✓———✓—✓
regression.run✓✓———✓✓✓
environment.view✓✓——✓✓✓✓
environment.promote✓✓———✓✓✓
environment.approve✓—————✓✓
environment.deploy✓✓———✓✓✓
environment.rollback✓✓———✓✓✓
environment.emergency_rollback✓——————✓
environment.configure✓——————✓
binding.view✓✓——✓✓✓✓
binding.manage✓——————✓
trace.view✓✓——✓✓✓✓
trace.content✓✓———✓✓✓
trace.reproduce✓✓———✓✓✓
trace.ingest—✓—✓————
reliability.events✓✓——✓✓✓✓
access.view✓———✓✓✓✓
member.manage✓——————✓
service.manage✓——————✓
audit.view✓———✓✓✓✓

Service identity defaults

  • application default: context.resolve, context.expand, context.report_consumption, context.report_outcome
  • automation default: build.view, build.register, regression.run, environment.view, binding.view

Endpoint matrix

MethodPathCapabilityClasses that can ever hold itPlaneNote
POST/v1/projects/:project/environments/:environment/context/tools/executetools.executehuman, applicationoperations
POST/v1/projects/:project/environments/:environment/context/tools/approvetools.approvehumanoperationsHuman only; exact call binding, five-minute expiry
GET/v1/reliabilityenvironment.viewhuman, automationoperations
GET/v1/reliability/impactenvironment.viewhuman, automationoperationsAlso requires build.view and trace.view; content diagnostics require trace.content
POST/v1/reliability/impact-policyenvironment.configurehumanoperations
POST/v1/traces/:id/investigation-measurementstrace.viewhuman, automationoperationsHuman only; explicit environment consent; elapsed time is not labor
GET/v1/reliability/eventsreliability.eventshuman, automationoperationsAlso requires environment.view and trace.view; durable cursor feed without content
GET/v1/reliability/historyenvironment.viewhuman, automationoperations
POST/v1/reliability/monitorenvironment.configurehumanoperations
POST/v1/reliability/checkpointregression.runhuman, automationoperations
POST/v1/reliability/alerts/:id/acknowledgeregression.runhuman, automationoperations
GET/v1/health—any authenticated principalsystemany authenticated principal; metrics for humans only
GET/v1/capabilities—any authenticated principalsystem
GET/v1/me—any authenticated principalsystem
GET/v1/membersaccess.viewhumanaccess
POST/v1/membersmember.managehumanaccess
GET/v1/service-identitiesaccess.viewhumanaccess
POST/v1/service-identitiesservice.managehumanaccess
GET/v1/service-identities/:idaccess.viewhumanaccess
POST/v1/service-identities/:id/credentialsservice.managehumanaccess
POST/v1/service-identities/:id/credentials/:credential/revokeservice.managehumanaccess
POST/v1/service-identities/:id/disableservice.managehumanaccess
GET/v1/projectsbuild.viewhuman, automationdelivery
POST/v1/buildsbuild.registerhuman, automationdelivery
GET/v1/buildsbuild.viewhuman, automationdelivery
GET/v1/builds/:idbuild.viewhuman, automationdelivery
GET/v1/builds/:id/artifactbuild.viewhuman, automationdelivery
GET/v1/builds/:id/lineagebuild.viewhuman, automationdelivery
POST/v1/builds/:id/tagsbuild.taghuman, automationdelivery
POST/v1/comparebuild.viewhuman, automationdevelopment
POST/v1/regressionsregression.runhuman, automationdevelopment
GET/v1/environmentsenvironment.viewhuman, automationdelivery
POST/v1/environmentsenvironment.configurehumandelivery
POST/v1/approvalsenvironment.approvehumandelivery
POST/v1/promotionsenvironment.promote or environment.rollbackhuman, automationdeliveryrollback=true requires environment.rollback
POST/v1/emergency-rollbacksenvironment.emergency_rollbackhumandelivery
POST/v1/emergency-rollbacks/:id/confirmenvironment.emergency_rollbackhumandelivery
GET/v1/emergency-candidatesenvironment.viewhuman, automationdelivery
GET/v1/bindingsbinding.viewhuman, automationdelivery
GET/v1/bindings/:project/:environmentbinding.viewhuman, automationdelivery
GET/v1/bindings/:project/:environment/revisionsbinding.viewhuman, automationdelivery
POST/v1/bindingsbinding.managehumandelivery
POST/v1/bindings/validatebinding.viewhuman, automationdelivery
POST/v1/deploymentsenvironment.deployhuman, automationdelivery
POST/v1/deployments/:id/stopenvironment.deployhuman, automationdelivery
POST/v1/deployments/:id/collecttrace.viewhuman, automationoperations
POST/v1/deployments/:id/:operationcontext.resolve or context.expand or context.report_consumption or context.report_outcome or tools.execute or tools.approvehuman, applicationoperationsoperation is resolve, expand, consumption or outcome; each requires its own context.* capability
GET/v1/deployments/:id/runtime/*runtime.inspect or trace.viewhuman, automation, applicationoperationshealth/build: runtime.inspect; traces/:id: trace.view
POST/v1/deployments/:id/runtime/*context.resolve or context.expand or context.report_consumption or context.report_outcome or tools.execute or tools.approvehuman, applicationoperations
GET/v1/projects/:project/environments/:environmentenvironment.view or runtime.inspecthuman, automation, applicationoperationsstable environment route status
POST/v1/projects/:project/environments/:environment/context/:operationcontext.resolve or context.expand or context.report_consumption or context.report_outcome or tools.execute or tools.approvehuman, applicationoperationsstable application endpoint; routes only to the active HEALTHY/DEGRADED deployment
GET/v1/projects/:project/environments/:environment/runtime/*runtime.inspecthuman, automation, applicationoperations
POST/v1/projects/:project/environments/:environment/runtime/*context.resolve or context.expand or context.report_consumption or context.report_outcome or tools.execute or tools.approvehuman, applicationoperations
GET/v1/promotionsenvironment.viewhuman, automationdelivery
GET/v1/deploymentsenvironment.viewhuman, automationdelivery
GET/v1/regressionsbuild.viewhuman, automationdevelopment
GET/v1/approvalsenvironment.viewhuman, automationdelivery
GET/v1/tagsbuild.viewhuman, automationdelivery
GET/v1/emergency-rollbacksenvironment.viewhuman, automationdelivery
GET/v1/promotions/:idenvironment.viewhuman, automationdelivery
GET/v1/deployments/:idenvironment.viewhuman, automationdelivery
GET/v1/regressions/:idbuild.viewhuman, automationdevelopment
GET/v1/approvals/:idenvironment.viewhuman, automationdelivery
GET/v1/tags/:idbuild.viewhuman, automationdelivery
GET/v1/emergency-rollbacks/:idenvironment.viewhuman, automationdelivery
GET/v1/auditaudit.viewhumanaccess
POST/v1/tracestrace.ingestautomation, runneroperations
GET/v1/tracestrace.viewhuman, automationoperations
GET/v1/traces/:idtrace.viewhuman, automationoperations
GET/v1/traces/:id/investigationtrace.viewhuman, automationoperations
POST/v1/traces/:id/materialtrace.contenthuman, automationoperationsAlso requires trace.view and build.view
POST/v1/traces/:id/testtrace.contenthuman, automationoperationsAlso requires regression.run, trace.view and build.view; returns a draft only
POST/v1/traces/:id/comparetrace.contenthuman, automationoperations
POST/v1/traces/:id/reproducetrace.reproducehuman, automationoperations
GET/v1/analyticstrace.viewhuman, automationoperations

<!-- END GENERATED -->