Skip to content
Reference

Glossary

The exact meaning of every platform term, organized by the pairs developers confuse, with what each term is not.

Glossary

Look up terms while reading a task guide or API contract. Scope, population, ownership, and membership describe different facts; use the authorization example below to distinguish them. This page defines vocabulary rather than adding setup prerequisites.

How to read this glossary

Terms are grouped by the confusion they cause, not alphabetically. Each entry states what the term is and — where it matters more — what it is not.

The durable vocabulary owner is docs/doctrine/02-TERMS.md. Where a term names something that does not run yet, this page says so.

When a definition and the code disagree, the enum wins. These four are the authoritative value sets behind the terms below:

Nexia\Permission\AssignmentScope;   // tenant, legal_entity, operating_unit
Nexia\Permission\SubjectPopulation; // all, self, direct_reports, legal_entity, operating_unit
Nexia\Permission\GrantControl;      // standard, protected
Nexia\AppDescriptors\DescriptorStatus; // active, deprecated, removed

Minimal example

Read an authorization statement as four different terms:

Permission: workshop.note.update
Role: Workshop editor
Data scope: one Legal Entity
Subject population: all

The Permission names the action, the Role bundles it, and the Access Grant adds scope and population. None of those is authentication or organization membership.

Platform and ownership

TermIsIs not
TenantThe boundary that separates one customer's data and execution from every other customer'sA filter applied to queries
PlatformThe tenant-facing product surface an App integrates with — Core plus the host that composes itThe operations layer that runs the service
CoreThe internal ownership term for that same surface, which is why core.* identifiers carry itThe outward name to use in prose
Service operationsSubscriber lifecycle, domains, provisioning, the public site, developer portalsAn owner of tenant business truth
AppA bounded business capability owning its domain truth, integrating through explicit contractsA folder in the platform, or a separate service
App PackageThe independently versioned Composer delivery unit of one Appplatform-owned source
App ManifestThe class declaring where the platform may discover your contributionsA registry of your capabilities
App DefinitionThe extra.nexia.app metadata blockPHP configuration
SDKThe only public boundary — Nexia\* and @nexia/sdkA utility library
ResourceA durable business concept with an explicit ownership and authority boundaryAny Eloquent model

Platform versus Core. Two names for one thing, aimed at two audiences: platform in prose, Core in code. The app/Platform/ directory predates the vocabulary and is service operations, not the Platform meant here.

App versus App Package. The App is the capability; the Package is how it ships. app_key identifies both and never changes.

Workspace and package resolution

These terms describe different stages of getting source code into a running tenant. They are not synonyms, and they describe current development mechanics rather than durable doctrine vocabulary.

TermIsIs not
RepositoryVersioned source and its Git history. Core, the App SDK, and every App Package have separate repositoriesA Composer installation or an App enabled for a tenant
Source folderThe folder where developers read and edit code. Core is in nexia-cloud-os/, the SDK in packages/app-sdk, and Apps in packages/{app}A Composer installation view. A source folder can exist without Composer using it
Local package selectionThe package-key list supplied through PACKAGES=... and stored locally. It tells generated composer.local.json which SDK and App source folders to useA Git branch choice, an ordinary UI selection, or tenant installation
Selected local packageA package in the persisted local package selection. Core prepares its Composer and frontend local overlays from that checkoutProof that the App is installed for a tenant
Lock-resolved packageA package outside the local package selection whose version and source come from committed composer.lockAn editable source root
Composer installation viewThe resolved package path used by runtime tooling through Composer\InstalledVersions::getInstallPath()The source location a developer edits
Tenant installationThe runtime record and initializer result that make one App available to one tenantA source folder under packages/, Composer resolution, or authority for a user

Name repository actions directly: clone a repository, switch a branch, or restore a file. Likewise, selection by itself remains an ordinary choice; use the full phrase local package selection for the persisted package-key list.

Work execution and orchestration

TermIsIs not
WorkbenchThe Shell context where people open current work and its toolsAn owner of work state, or an execution engine
Business ProcessThe Core runtime for human-authored BPMN processes and DMN decisionsWorkflow, or an embedded Camunda runtime
Electronic Approval (Approval)The Core runtime owning approval lines, decision evidence, and document snapshotsOne business form, or a Process User Task
WorkflowA term reserved for the durable-workflow runtime category represented by systems such as TemporalAn umbrella for Business Process and Electronic Approval

Nexia Business Process uses the OMG BPMN and DMN vocabulary and references Camunda 8's authoring and orchestration model, but owns its execution state and nexia:* extensions. Workflow does not name a currently documented product area; it is reserved for a future durable-workflow runtime so it stays distinct from Business Process.

Organization structure

Everything in this group models real structure. None of it grants authority.

TermIsIs not
PartyThe shared identity of one real-world person or organizationAn authority scope or business profile
Legal EntityAn internal legal, contractual, tax, accounting, or employing entityThe operating hierarchy, or a PartyRole
Legal Entity MembershipA User's effective-dated participation in one Legal EntityAction authority — it controls participation and Shell availability only
Operating UnitA durable internal unit of operational responsibilityA Legal Entity, or an implicit grant
Operating Unit MembershipA User's effective-dated participation in one Operating UnitA Worker Assignment, or a grant
SiteA real-world place — office, plant, branch, logistics siteAn Operating Unit, or an App execution facility
WorkerA People-owned workforce profile for a person PartyA PartyRole, and not itself authority
Worker AssignmentAn effective-dated placement of a Worker in a work contextA User membership, or an Access Grant
PartyRoleA lightweight, non-authoritative classification of one PartyA Legal Entity, business profile, or relationship
PartyRelationshipA durable typed relationship between two PartiesA grant of authority
Business profileAn App-owned record defining how a Party participates in that App's domainA Party, or a PartyRole
Workspace / view contextA user-experience contextA permission root or durable owner

The rule for the whole group: participation is not permission. Membership makes something selectable. Acting on its records takes an Access Grant.

Authorization

The four parts that compose one decision:

TermIsIs not
AuthenticationVerification of an identityAuthorization
AuthorizationBackend-enforced evaluation of whether an actor may perform a protected actionAnything the frontend decides
PermissionAn exact, backend-enforced business action, declared by the code owning the capability — Core, or an AppA target population or data scope
RoleA reusable bundle of Permissions, either tenant-authored or a Core-synchronized system baselineData access by name or placement
Access grantAn effective-dated assignment of Roles to an actor within a Data scopeA membership
Data scopeThe bounded business context a grant applies toAnything created implicitly by structure
Subject populationThe actor-relative population a grant may target — self, direct_reports, …A grant of an action by itself
DelegationExplicit, bounded, revocable, auditable authority to act for a purposeInherited or self-expanding authority
Field policyA backend rule for which fields of a visible record may be read or changedRecord-level visibility
Separation of dutiesA server-enforced policy preventing incompatible authoritySomething that runs today — deferred

Permission versus Role versus Grant. The Permission says what; the Role bundles which; the Grant says where and whose. Your App declares only its own Permissions — Core declares the platform's.

A Permission names capability, not scope. workshop.note.update says nothing about which defect codes.

Extension patterns

The five that look alike. The discriminator is who owns the result:

TermResult owned byDiverges from your source
CatalogYour code — read liveNever
DescriptorYour code — resolved at runtimeNever
PresetThe tenant, after selectionImmediately
TemplateThe tenant, after copyingImmediately
InitializerThe tenant, at install timeImmediately
TermIsIs not
ContributionA class implementing an SDK interface in a declared locationA registration call
CatalogA code-owned definition the platform discovers, gates, and resolvesTenant-maintained master data
Registry (backend)The platform's runtime lookup layer over discovered contributionsSomething you write to
Registry (frontend SDK)A registry an App writes to at startup and the Shell reads at runtime — resourceInspectorAdapterRegistry, approvalComposerBusinessFormRegistryA backend contribution registry
DescriptorA typed declaration connecting a capability to a platform runtime; version and lifecycle fields follow the descriptor family's contract, and a nested ResourceLifecycleEventDescriptor carries its own payload schemaVersionA tenant record or a template
PresetA recommended configuration an administrator may adoptA grant, or a created Role
Copyable templateA code-defined source an actor explicitly copiesA live definition
InitializerMinimum rows an App needs to be operationalA data-loading mechanism
Demo dataDisposable sample recordsAn installation prerequisite

Catalog versus master data. That quality.defect_code exists is a catalog. The defect codes a factory uses are master data.

Template versus Catalog. Ship a fix to a catalog and every tenant gets it. Ship a fix to a template and existing copies are untouched.

Shell and frontend

TermIsIs not
ShellThe host-owned application frameSomething an App lays out
Activity RailThe leftmost region — Workbench, App Launcher, OperationsNavigation you contribute to directly
Side Navigation SurfaceOne slot rendering Settings, an App Menu, or a Workbench contextThree separate regions
App MenuThe app:{app_key} view of that slotThe Settings Menu
Settings MenuThe shell.settings view — host-onlyWhere App settings live
Navigation contextWhich Side Navigation view an entry belongs toA permission
DestinationA route, icon, label, placement, and permission gateAuthorization
Route SurfaceA route- or tab-level screenA Work Surface
Work SurfaceA Primary Section plus optional Inspector Section inside a Route SurfaceA Route Surface
SlotA named, versioned insertion point in a host-owned surfaceSomething you may invent
Slot WidgetYour component filling a registry slotA dashboard widget
Dashboard widgetA placeable, Resource-bound componentA slot widget

Slot Widget versus Dashboard widget. A slot widget fills a fixed point a host surface publishes. A dashboard widget is placed by a tenant on a Dashboard.

selected/active versus focused. Durable current state versus the transient keyboard or pointer candidate.

Lifecycle

TermIsGrants access
Host activationInstalling the package into the host and syncing definitionsNo
Tenant installationWriting installation rows and running initializers for one tenantNo
InitializationThe initializer stage of installation — pending → initialized | failedNo
OperationalInstalled, active, initialized, and every prerequisite also operationalNo
Access GrantThe record binding an actor, Roles, a Data scope, a Subject population, and a validity period — the sole durable source of standing authorityYes
Role assignmentUI shorthand for creating or editing an Access Grant. Role membership alone grants nothingNo, on its own

An applicable Access Grant provides standing authority. Discovery and installation make capabilities available; they do not grant permission.

Documentation and design

TermIs
Current designA changeable implementation choice documented in Reference
Protected invariantA product, security, integrity, or recovery outcome that must survive implementation change
Transition exceptionAn existing boundary violation recorded only when it cannot yet be removed; never a pattern to reuse

Named in doctrine, not implemented

Do not design around these. They are deferred, not abandoned:

TermStatus
Separation of dutiesNo SoD rule table today
Access delegation recordsDeferred
core.site as a Data scopeDeferred — scopes are tenant, legal_entity, operating_unit
Legal Entity relationship descendantsDeferred — only core.operating_unit supports descendants
reporting_tree, assigned_records populationsNot in SubjectPopulation

When doctrine names a value an enum does not have, the enum is what runs.

Errors

Confused pairWrong inferenceCorrect lookup
Authentication / authorizationA signed-in user may actCheck the backend Permission decision
Membership / Access GrantOrganizational participation grants authorityMembership affects participation; the Grant carries authority
Catalog / master dataA code-owned Resource definition is editable tenant dataCatalog declares the type; master data is the tenant's rows
App / App PackageA folder is the business capabilityApp is the capability; Package is its delivery unit
Source folder under packages/ / local package selectionA package source folder on disk automatically supplies code to ComposerConfirm the package key is in the stored local package selection
Composer installation / tenant installationA package visible under vendor/ makes the App available to every tenantCheck the tenant's App installation state separately

Real usage

packages/assets/src/Contribution/Resources/AssetModule.php keeps capability and scope as separate declarations:

Code example
PHP
public static function permissionAssignmentScope(): AssignmentScope
{
    return AssignmentScope::LegalEntity;
}

public static function permissionResources(): array
{
    return ['assets.asset' => ['read', 'register', 'update_identity', 'validate', 'import', 'retire', 'export', 'audit']];
}

The source demonstrates the glossary distinction: Permission names actions; AssignmentScope names where a grant may apply.

Source of truth: docs/developers/content/en/app-sdk/glossary.md