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
| Term | Is | Is not |
|---|---|---|
| Tenant | The boundary that separates one customer's data and execution from every other customer's | A filter applied to queries |
| Platform | The tenant-facing product surface an App integrates with — Core plus the host that composes it | The operations layer that runs the service |
| Core | The internal ownership term for that same surface, which is why core.* identifiers carry it | The outward name to use in prose |
| Service operations | Subscriber lifecycle, domains, provisioning, the public site, developer portals | An owner of tenant business truth |
| App | A bounded business capability owning its domain truth, integrating through explicit contracts | A folder in the platform, or a separate service |
| App Package | The independently versioned Composer delivery unit of one App | platform-owned source |
| App Manifest | The class declaring where the platform may discover your contributions | A registry of your capabilities |
| App Definition | The extra.nexia.app metadata block | PHP configuration |
| SDK | The only public boundary — Nexia\* and @nexia/sdk | A utility library |
| Resource | A durable business concept with an explicit ownership and authority boundary | Any 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.
| Term | Is | Is not |
|---|---|---|
| Repository | Versioned source and its Git history. Core, the App SDK, and every App Package have separate repositories | A Composer installation or an App enabled for a tenant |
| Source folder | The 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 selection | The package-key list supplied through PACKAGES=... and stored locally. It tells generated composer.local.json which SDK and App source folders to use | A Git branch choice, an ordinary UI selection, or tenant installation |
| Selected local package | A package in the persisted local package selection. Core prepares its Composer and frontend local overlays from that checkout | Proof that the App is installed for a tenant |
| Lock-resolved package | A package outside the local package selection whose version and source come from committed composer.lock | An editable source root |
| Composer installation view | The resolved package path used by runtime tooling through Composer\InstalledVersions::getInstallPath() | The source location a developer edits |
| Tenant installation | The runtime record and initializer result that make one App available to one tenant | A 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
| Term | Is | Is not |
|---|---|---|
| Workbench | The Shell context where people open current work and its tools | An owner of work state, or an execution engine |
| Business Process | The Core runtime for human-authored BPMN processes and DMN decisions | Workflow, or an embedded Camunda runtime |
Electronic Approval (Approval) | The Core runtime owning approval lines, decision evidence, and document snapshots | One business form, or a Process User Task |
| Workflow | A term reserved for the durable-workflow runtime category represented by systems such as Temporal | An 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.
| Term | Is | Is not |
|---|---|---|
| Party | The shared identity of one real-world person or organization | An authority scope or business profile |
| Legal Entity | An internal legal, contractual, tax, accounting, or employing entity | The operating hierarchy, or a PartyRole |
| Legal Entity Membership | A User's effective-dated participation in one Legal Entity | Action authority — it controls participation and Shell availability only |
| Operating Unit | A durable internal unit of operational responsibility | A Legal Entity, or an implicit grant |
| Operating Unit Membership | A User's effective-dated participation in one Operating Unit | A Worker Assignment, or a grant |
| Site | A real-world place — office, plant, branch, logistics site | An Operating Unit, or an App execution facility |
| Worker | A People-owned workforce profile for a person Party | A PartyRole, and not itself authority |
| Worker Assignment | An effective-dated placement of a Worker in a work context | A User membership, or an Access Grant |
| PartyRole | A lightweight, non-authoritative classification of one Party | A Legal Entity, business profile, or relationship |
| PartyRelationship | A durable typed relationship between two Parties | A grant of authority |
| Business profile | An App-owned record defining how a Party participates in that App's domain | A Party, or a PartyRole |
| Workspace / view context | A user-experience context | A 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:
| Term | Is | Is not |
|---|---|---|
| Authentication | Verification of an identity | Authorization |
| Authorization | Backend-enforced evaluation of whether an actor may perform a protected action | Anything the frontend decides |
| Permission | An exact, backend-enforced business action, declared by the code owning the capability — Core, or an App | A target population or data scope |
| Role | A reusable bundle of Permissions, either tenant-authored or a Core-synchronized system baseline | Data access by name or placement |
| Access grant | An effective-dated assignment of Roles to an actor within a Data scope | A membership |
| Data scope | The bounded business context a grant applies to | Anything created implicitly by structure |
| Subject population | The actor-relative population a grant may target — self, direct_reports, … | A grant of an action by itself |
| Delegation | Explicit, bounded, revocable, auditable authority to act for a purpose | Inherited or self-expanding authority |
| Field policy | A backend rule for which fields of a visible record may be read or changed | Record-level visibility |
| Separation of duties | A server-enforced policy preventing incompatible authority | Something 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:
| Term | Result owned by | Diverges from your source |
|---|---|---|
| Catalog | Your code — read live | Never |
| Descriptor | Your code — resolved at runtime | Never |
| Preset | The tenant, after selection | Immediately |
| Template | The tenant, after copying | Immediately |
| Initializer | The tenant, at install time | Immediately |
| Term | Is | Is not |
|---|---|---|
| Contribution | A class implementing an SDK interface in a declared location | A registration call |
| Catalog | A code-owned definition the platform discovers, gates, and resolves | Tenant-maintained master data |
| Registry (backend) | The platform's runtime lookup layer over discovered contributions | Something you write to |
| Registry (frontend SDK) | A registry an App writes to at startup and the Shell reads at runtime — resourceInspectorAdapterRegistry, approvalComposerBusinessFormRegistry | A backend contribution registry |
| Descriptor | A 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 schemaVersion | A tenant record or a template |
| Preset | A recommended configuration an administrator may adopt | A grant, or a created Role |
| Copyable template | A code-defined source an actor explicitly copies | A live definition |
| Initializer | Minimum rows an App needs to be operational | A data-loading mechanism |
| Demo data | Disposable sample records | An 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
| Term | Is | Is not |
|---|---|---|
| Shell | The host-owned application frame | Something an App lays out |
| Activity Rail | The leftmost region — Workbench, App Launcher, Operations | Navigation you contribute to directly |
| Side Navigation Surface | One slot rendering Settings, an App Menu, or a Workbench context | Three separate regions |
| App Menu | The app:{app_key} view of that slot | The Settings Menu |
| Settings Menu | The shell.settings view — host-only | Where App settings live |
| Navigation context | Which Side Navigation view an entry belongs to | A permission |
| Destination | A route, icon, label, placement, and permission gate | Authorization |
| Route Surface | A route- or tab-level screen | A Work Surface |
| Work Surface | A Primary Section plus optional Inspector Section inside a Route Surface | A Route Surface |
| Slot | A named, versioned insertion point in a host-owned surface | Something you may invent |
| Slot Widget | Your component filling a registry slot | A dashboard widget |
| Dashboard widget | A placeable, Resource-bound component | A 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
| Term | Is | Grants access |
|---|---|---|
| Host activation | Installing the package into the host and syncing definitions | No |
| Tenant installation | Writing installation rows and running initializers for one tenant | No |
| Initialization | The initializer stage of installation — pending → initialized | failed | No |
| Operational | Installed, active, initialized, and every prerequisite also operational | No |
| Access Grant | The record binding an actor, Roles, a Data scope, a Subject population, and a validity period — the sole durable source of standing authority | Yes |
| Role assignment | UI shorthand for creating or editing an Access Grant. Role membership alone grants nothing | No, on its own |
An applicable Access Grant provides standing authority. Discovery and installation make capabilities available; they do not grant permission.
Documentation and design
| Term | Is |
|---|---|
| Current design | A changeable implementation choice documented in Reference |
| Protected invariant | A product, security, integrity, or recovery outcome that must survive implementation change |
| Transition exception | An 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:
| Term | Status |
|---|---|
| Separation of duties | No SoD rule table today |
| Access delegation records | Deferred |
core.site as a Data scope | Deferred — scopes are tenant, legal_entity, operating_unit |
| Legal Entity relationship descendants | Deferred — only core.operating_unit supports descendants |
reporting_tree, assigned_records populations | Not in SubjectPopulation |
When doctrine names a value an enum does not have, the enum is what runs.
Errors
| Confused pair | Wrong inference | Correct lookup |
|---|---|---|
| Authentication / authorization | A signed-in user may act | Check the backend Permission decision |
| Membership / Access Grant | Organizational participation grants authority | Membership affects participation; the Grant carries authority |
| Catalog / master data | A code-owned Resource definition is editable tenant data | Catalog declares the type; master data is the tenant's rows |
| App / App Package | A folder is the business capability | App is the capability; Package is its delivery unit |
Source folder under packages/ / local package selection | A package source folder on disk automatically supplies code to Composer | Confirm the package key is in the stored local package selection |
| Composer installation / tenant installation | A package visible under vendor/ makes the App available to every tenant | Check the tenant's App installation state separately |
Real usage
packages/assets/src/Contribution/Resources/AssetModule.php keeps capability
and scope as separate declarations:
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.
Related
- Tenant and context — the isolation terms in depth
- Permissions and roles — the four-part authorization model
- Extension Model — choosing between the five patterns
- Shell layout regions — the region and surface terms in depth