Skip to content

Glossary

Design

This is the authoritative glossary: every official term in the architecture, defined once. The other pages introduce these terms in bold as the story reaches them; this is where you look any of them up.

TermDefinition
nodeEdge process (--mode node); pulls and runs tasks and commands over interfaces; carries placement, heartbeat, bound credential.
node modeThe Storage Gateway’s placement-scoped write mode for node-driven ingest, between scoped and system: visibility is the node’s placement-derived visible_set, not all-visibility. See identity and access.
placement visible_setThe owners a node may write, derived from its materialized worklist (the owners of the tasks assigned to it). A node’s writes are confined to this set; an emitted owner outside it is an orphan / discovery candidate, never an authoritative write. See collection.
functionA trigger plus a DAG of steps, declared in a component template; the unit of edge collection. Triggered by a schedule (poll), incoming data (listen), or a command. See collection.
flowA multi-step action (branching, parallel steps, waits); an escalation is the canonical case. See alarms and actions.
taskA node’s unit of collection: poll (we ask) or listen (we wait), over a stateless or stateful (session) interface. Content-addressed.
interfaceA connection to a component, declared once per protocol; transport stateless or stateful (to a session).
interface_typeProtocol-and-style registry (ssh, http, snmp, mqtt, webhook…); built-flag + param schema.
sessionA stateful interface’s live held-open connection; a current-state view over session_log.
collection.failedThe event emitted when a parse or validation rejects; carries the raw payload for diagnosis and backfill-after-fix. There is no stored telemetry table; raw is not otherwise persisted (a dev raw-mode taps it live).
raw_sampleAn opt-in raw-retention policy, cascade-resolved on interface / task / template: off (default), all, or 1-in-N (sampled). Short TTL, range-partitioned and cold-tierable like metric partitions. The kept window is re-parsable against the immutable function version, so a corrected extractor re-derives it; outside the window a wrong-but-conforming parse is forward-fixable only. Bounded, sampled, short-lived: not a telemetry table. See collection.
datapointAn observation: a key’s value on one owning entity at one time, with provenance + source + on-row lineage. Kinds: metric, state, log.
metricNumeric (float8) datapoint. Continuous, aggregatable. The firehose.
stateCategorical/text/object datapoint. Discrete, dwell-measurable. Config is keyed to one as its observed side.
log_datapointA component’s own log lines; value = the line. A stream; also the holding pen for un-normalized occurrences.
kindWhat a key is: metric, state, or log. Fixed per key at definition.
keyThe identity of what is measured or asserted; registered in property_type.
canonical signalA registered, owner-agnostic measurement name (power.state, not room.power); one comparable signal across every vendor.
owner / owner_kindA datapoint/event/alarm’s subject, the exclusive-arc: owner_kind + the matching typed FK (component_id/system_id/location_id/node_id), or the singleton global (no FK), + CHECK.
property_typeRegistry for datapoint keys: name, scope, kind, value_type, unit, fusion_policy, validation. scope (template / org / official) decides where the name is unique: (template_id, name) at template scope, name at org/official. Every datapoint is typed by one (the FK is non-null). Promotes template -> org -> official by re-scope/re-point.
canonical unitThe one unit a property_type stores in: stored values are always in it, so the firehose is single-unit and every threshold / calc / fusion compares like with like. Native unit is a collection-time fact (normalized in by the alignment value-transform), display unit a presentation fact (converted out on read); neither is stored. See datapoints.
unit registryA unit registry grouped by family / dimension (temperature, data-size, bitrate…), each family one canonical unit plus alternates; each alternate carries a to_canonical / from_canonical transform, affine (factor + offset) or an Expr (the rare nonlinear case, dB). Official / org scoped. Drives both edge normalization and read-side display conversion. See datapoints.
convert(value, "<unit>")The expression stdlib conversion fn: returns the value in a registered same-family unit (a compile error otherwise). Source unit inferred from the bound key’s canonical unit, target looked up in the unit registry, so convert(value, "fahrenheit") > 100 authors a threshold in F while storage stays C. Available wherever expressions run (event_rule / alarm criteria, calc leaves, list filters). See expressions.
scopeA key’s uniqueness-and-trust axis on property_type: template ((template_id, name), the template author’s, local), org (name within the deployment, the operator’s custom canonical), official (name globally, shipped with the distro). official = the top scope (folds in the prior official boolean).
template-scoped / org-scopedA key minted at scope=template (local to one template, (template_id, name)) or scope=org (a deployment’s own canonical, unique by name). The promotion ladder lifts template -> org -> official.
event_typeRegistry for event keys: name, display_name, payload_schema, scope. Supports the same template / org / official scope as property_type (a template can define a template-local event).
provenanceHow we know a value: observed, calculated, intended. Per row. Declared intent is config.
observedMeasured from a component. On-row lineage: source_rule (+ version), the edge function.
calculatedDerived from other datapoints by a calc_rule. On-row lineage: source_rule (+ version), the calc_rule. Distinguished from observed by the provenance column.
intendedA command’s declared effect, pending reconciliation. Lineage: the command event_id. Only commands set it.
sourceWhich sensor/path produced an observed value; distinct from provenance; enables multi-source rows + fusion. A source registry carries default weights.
correlation_id (datapoint) / caused_by_event_idNullable trace columns on the datapoint tables, orthogonal to the exclusive-lineage CHECK (not lineage pointers). A command propagates its originating correlation_id onto the adaptive-poll’s observed datapoint, so the event_rule that fires off it inherits the id and the cycle-guard walk crosses the command -> device -> observed round trip. Distinct from the read-side correlation id trace. See datapoints.
perspectivesThe source-tagged observed rows for one signal: multiple sources reporting one value, all preserved; a reduce-on-read policy produces the effective value, while every perspective stays queryable.
fusion_policyPer-key reduce-on-read default/hint for multi-source observations (mode + tie-break + source weights), not a mandate: a policy may default from the type but can be source-weighted, per-instance, or left to read time (keep all perspectives, decide on read). Applied on read.
fusionReading one effective value from multiple perspectives on a signal: same-key multi-source reduces by a policy (read-time, defaulting from the key’s fusion_policy); cross-key/system-level = a calc_rule. Perspectives are always preserved.
configThe declared side of a canonical signal: an operator-set value keyed to a property_type, reconciled against the observed datapoint via the template’s get/set functions and a per-item reconcile policy. See config and credentials.
credentialAn access secret with a structured shape, a pluggable SecretProvider (inline or external), and a lifecycle (refresh / rotation / expiry); read is secret:read-gated and every decrypt audited. Template-driven.
variableA free interpolated value (a macro): $var:<name>, resolved platform→template→instance down the cascade; org-keyed, not signal-bound, no observed side.
driftThe gap between config’s declared value and its observed datapoint, on one signal key.
reconcilePer-config item policy for drift, one of three modes: observe (record drift, no alarm), warn (alarm at warning severity), enforce (call the set function to converge, alarm on set failure). Adopting the observed value as declared is a separate one-shot import action, not a mode.
cascadeResolves the effective config / variable value by folding bindings (things somebody decided): platform, component_template, system_template, then the location / system / component trees (weight-free, pure depth); most-specific (deepest) wins. Falls through to the type’s default when no rung bound anything. Type is not a layer (it resolves via a group filter); groups are placed by weight on the same specificity scale.
segmented precedence keyThe cascade’s precedence comparator as a segmented / lexicographic key (segment_rank, depth, group_weight, creation_order), so a structural segment never overruns into another regardless of tree depth or stacked group weights. The presentation numbers (e.g. 0 / 100 / 300s / 400s) are presentation-only, not the comparison key. See cascade.
platformThe cascade’s least-specific binding tier, on both the estate axis (owner_kind = platform, no FK) and the settings axis (the platform level): what an admin set for the whole install. segment_rank 0. A write there needs platform:<action> on top of the resource permission. Distinct from the global estate owner, from a “platform credential” (a vendor account secret), and from the settings platform domain (a namespace classifier: a namespace only ever set at this level, never further down the principal axis, named after the level but not the same thing as it). See cascade.
defaultWhat a value is when nobody bound it: a column on a declaration row (a setting’s struct tag, a classifier contract’s default_value on product_property and its siblings), beside the unit and the kind. Not a cascade tier: it shadows nothing, nothing shadows it, and the fold falls through to it. A kind with no declaration row has none (variable, secret, tag: absent means absent).
edge parseA function parses a raw payload into datapoints on the node, the edge half of collection. There is no server-side transform rule.
calc_ruledatapoint(s) to datapoint (calculated): cross-key / system-level derivation. (Same-key multi-source reconcile is the key’s fusion_policy.)
event_ruledatapoint change to event: fire_criteria + optional clear_criteria (clear makes events alarm-paired). No separate alarm or condition rule. Still Design: an alarm today is raised by a caller, not by a rule. The rule declares the capabilities its alarm degrades; it carries no health impact of its own, since impact now lives on the system role (ADR-0050).
for_clearA recovery sustain on an event_rule, mirroring the fire-side for: clear_criteria must hold for for_clear before the alarm resolves, so a source flapping at the cadence boundary does not churn open/clear. Default 0 (immediate). See alarms and actions.
action_ruleA subscription (Expr over events; alarms via edge events) wiring occurrences to actions.
identity bindingHow a shared-API / multiplexed source’s emitted rows bind to the right owner: a value->owner index (property_type, value) -> owner (an identity arc on identity config), resolved in a cascade scope. Precedence: a declared identity config value wins, falling back to the observed identity datapoint sharing its key. See collection.
discovery_ruleobserved data creates components/systems/locations + their identity config; carries the official boolean. Input is the orphan / unmatched stream (including out-of-placement labels), idempotent on re-discovery (re-seeing the same identity does not duplicate). See collection.
eventA discrete semantic occurrence the action layer reacts to. Keyed, point-in-time, owned via the arc. Not a datapoint.
originHow an event arose: caught, caused, derived, scheduled.
alarmOne raised condition on a component: a stateful row with a severity (info / warning / critical), a message, a raised_at, and a nullable cleared_at. Clearing keeps the row, so what was wrong and when survives the fix. It reaches a system only through the capabilities it degrades (below). Not event-sourced. The ITSM anchor. Design: the open-to-close lifecycle driven by an event_rule’s paired events, and an alarm owned by a system, location, or node rather than a component.
alarm capabilityThe capabilities one alarm degrades (alarm_capability). The single route out of a component: a component that provides a capability but has it degraded does not satisfy a role requiring it. An alarm naming none is a note on the device that reaches no system.
dependency suppressionMuting a child alarm whose owner’s parent entity (on the exclusive-arc structural tree) is itself down, so one upstream failure does not emit N child pages. Expressible over the exclusive-arc tree. See alarms and actions.
action groupingCoalescing alarms sharing owner / label / correlation_id into one action dispatch (one ticket, N members), so a storm is one notification, not N. See alarms and actions.
severityAn alarm’s alert importance, set to a severity level by id; distinct from health (a different axis). It drives the component’s own verdict (any active alarm degrades it, a critical one is an outage) and nothing above: what reaches a system is the degraded capability set. Rules and action_rule predicates compare by level (resolved via the level’s order).
severity levelA registry row: id, label, color, and an integer order (for comparison only). Official defaults ship spaced; an operator can add, relabel, or recolor. Carries the official boolean.
actionAn ordered sequence of steps (notify, command, wait, branch). A single-step notify or command is the simple case; a multi-step shape (including remediate-verify-escalate) is a flow.
commandA run-action declaration in a component_template version (not a table); an instance is an action with kind=command.
disagree(A,B)A condition operator comparing two provenances or sources of one key. Drift, config drift, conflict. Keeps the DAG.
divergenceAny two provenances or sources of one key that disagree. The universal anomaly signal.
lineage (on-row)A derived row carries its own lineage; no execution table. The rule version is the backtest hinge.
correlation idA read-side trace id threading one causal chain end to end: the originating event through every downstream event and action it caused (event -> alarm -> flow/action -> command). Built on the causation lineage; alarm_id links one alarm’s open/clear events, the correlation id links the whole chain. DX/observability sugar, not a datapoint kind or a stored span subsystem.
scheduleConfig: a recurring definition (cron/rrule + IANA tz + what it triggers).
timerThe clock singleton’s pending-fire working set (schedule-tick / for-sustain / runbook-wait / watchdog); a Postgres table scanned by the leader-elected clock, each fire realized onto its lane; not history.
componentA deployed instance (device/app/service); owns datapoints; a variable-depth tree; pins a component_template_version; points at the product it is, the source of its shape.
productThe concrete SKU (Cisco Room Bar): binds a vendor, a driver, a kind, the capabilities it provides, and the property contract its instances carry. Carries the official boolean.
capabilityA flat catalog name for what a component can do (microphone, flat-panel-display). Claimed by a product (the default for its instances) and by a component (its own facts over that default), and required by a system role. Carries the official boolean.
product_propertyOne line of a product’s declared-property contract: a catalog property, an optional default, and whether an instance must set it.
standardThe blueprint a system conforms to (Huddle Room, Classroom): the system-side counterpart of product, carrying variants (parent_standard_id) and the property contract its systems inherit. Optional on a system.
standard_property / location_type_propertyThe same contract line as product_property, declared by a standard for its systems and by a location type for its locations.
system roleA slot a system needs filled (a table microphone, a main display), declared on a standard (inherited live by every conforming system) or directly on one system (ad-hoc), on the same exclusive arc property uses. Carries a quorum, a required capability set, and an impact. Not an IAM role (below). See core entities.
role (disambiguation)The word is overloaded, and the two senses never cross. A system role is a slot in a system, filled by a component (system_role, system_role_assignment, storage methods ListSystemRoles / SetSystemRole / DeleteSystemRole). An IAM role is a capability set granted to a principal (viewer / operator / admin / owner; the role table, ListRoles / UpsertRole, the /roles routes). A health_role was a third, narrower sense (how a member counts in its system’s health rollup), now superseded by the system role’s quorum and impact.
role capabilityOne line of what a system role requires (system_role_capability). The set is conjunctive: a component must provide every listed capability to fill the role. A role that requires nothing admits anything.
component capabilityA component’s own capability fact (component_capability), layered over the ones its product declares: present=true adds one the product does not claim, present=false suppresses one it does. What lets a productless component be staffed while the assignment guard stays strict.
effective capabilitiesWhat a component actually provides: its product’s capabilities, UNION its present=true facts, MINUS its present=false facts. The single definition of “what this component can do” platform-wide, and the set the assignment guard checks.
role assignmentThe row that puts a component in a role in one system (system_role_assignment). Refused (422) when the component’s effective capabilities do not cover the role’s requirement, and the refusal names the missing capabilities. The component FK is on delete restrict: a component staffing a role cannot be deleted out from under the system.
quorumHow many components a system role wants filling it, at least one. Two readings ride it: staffing (a role with quorum 2 and one assignment is understaffed by one, on operator-entered data alone) and health (a role with fewer satisfying components than its quorum is impaired). It is also the redundancy knob: quorum 1 with two assigned tolerates one failure.
impactWhat an impaired system role means for its system: outage, degraded, or none (a column on system_role, defaulting to degraded). It lives on the role, not the alarm or the component, because the same broken box matters differently depending on the slot it was filling: a dead confidence monitor is not a dead main display. The one input the health rollup takes from the declaration side.
impairedA system role with fewer satisfying components than its quorum. A component satisfies a role only when it provides every required capability and none of those is currently degraded by an active alarm. An impaired role contributes its impact.
effective rolesThe resolved read for one system: the roles its standard declares (from_standard) UNION those declared on it directly, each with its required capabilities, quorum, impact, assignments, and its served assigned / understaffed counts. A one-off system resolves only the ad-hoc arm.
propertyA stored value for a property_type on one arc owner (the latest-value store, was property_value), tagged with its provenance (observed / calculated / intended / declared).
component_template / _versionThe device shape (collection, commands, property_types, defaults, alarms); the immutable version instances pin.
systemA composition of components/subsystems (the service tree); pins a system_template_version; located at a location; conforms to an optional standard.
system_template / _versionThe system shape; the immutable version is the snapshot instances pin. Carries a frozen BOM: per role, its requirement (required canonical datapoints + commands) + health_role. Still Design, and both halves are superseded by the built system_role (a capability set, a quorum, and an impact).
template signature / attestationAn optional author signature on a template_version, verified on import; authenticity (who authored it), distinct from the content-hash integrity (that it is unaltered). The hosted / marketplace path verifies signatures regardless of the self-host runtime stance. See templates.
capability manifestA declaration on a template of which write-commands and credential shapes it exercises; shown and approved at :apply, and the gate behind which latest / channel auto-update for device-mutating templates requires an explicit operator re-pin. See templates.
role requirementWhat a system_template_member declares for a role: the canonical datapoints and commands a member must provide (plus health_role). A component qualifies when its template aligns the required set; pairing filters to qualifiers and the API validates on assign. No allow-list of templates: declare what you need, any qualifying component fills it. Still Design: the requirement that is built today is a system role’s capability set, declared on a standard or a system rather than frozen into a template version. See templates and ADR-0049.
locationA place tree; classified by location_type; no template.
globalThe singleton estate owner: the top owner above every location where estate-wide health and KPIs roll up. One per deployment, no FK. Ownership only, not a cascade tier (that is platform) and not a location (the location tree has N unparented tops and no root).
operational modeA cascade-resolved entity state: active / maintenance / disabled. Maintenance keeps collecting but suppresses consequences (no action dispatch, no drift enforce, no health rollup impact, no SLA count); disabled is the same suppression but also stops collecting (the Zabbix host-disable). Maintenance is windowed and audited. See core entities.
decommission / purgeDelete is decommission by default (soft delete: tombstone, retain history, re-commissionable, in-flight cleanup); purge is the privileged hard erase. The cascade does not delete members: a system delete unbinds members, an occupied location delete is refused (re-home first), a node delete re-places its tasks. See core entities.
KPIA shipped derived datapoint (a calc / SLI) owned at system / location / global: availability (health over time) and the utilization family (occupancy, time, booking, ghost). An official default set with an escape hatch.
SLIService Level Indicator: a time_in_state calc datapoint over a window (e.g. system.availability). See health.
SLOService Level Objective: the target config value the SLI must hold (availability >= 99.9%). See health.
SLAService Level Agreement: meeting the SLO, an event_rule firing on breach; compliance over the window is itself an SLI. See health.
tagAn operator key: value label. The key is a tenant-wide governed vocabulary (the tag registry; new keys need tag:create, autocompleted in the UI); values bind per entity (tag_binding) and resolve union on key, override on value down the cascade. See config and credentials.
groupA named set (component/system/location/principal), static or dynamic, weighted; a cascade overlay + access scope. A principal_group is the principal-subject case.
healthThe first-class operational state of every entity, carried as a calculated state on the owner arc (source_rule = health-rollup): an alarm degrades a capability, a role missing one falls below quorum and is impaired, its impact sinks its system, and a location takes the worst of its systems. A model, not just a rule. See health.
verdictOne health value: healthy < degraded < outage, ordered so “worst” has a meaning. outage rather than down, because a device is down and a room has an outage. Distinct from severity (a different axis).
health transitionOne recorded edge: the moment an owner’s verdict changed and what it changed to. Health is written transition-only on state, so its history is edges and only edges, which is what makes “when did this break” answerable weeks later. See health.
recompute at the writeThe rule that a verdict is recomputed by every mutation that can change it (alarm raise / clear, assign / unassign, role declare / withdraw, quorum or impact change, component capability or product change, system create, standard change, relocation), in the same transaction. A read never writes: computing on read keeps no history, and writing through on read stamps the edge at the moment somebody looked. See health.
health impactSuperseded by impact on a system role (above). The design hung an optional down / degraded tag on an event_rule; an alarm now reaches a system only through the capabilities it degrades (ADR-0050).
health_roleSuperseded by quorum plus impact on a system role. The design tagged a member required / redundant / informational on the system_template_member; the same three cases are quorum 1 with impact outage, a quorum below the number assigned, and impact none, with no fourth vocabulary. A third sense of “role” (see the disambiguation above).
health coverage / uncoveredDesign. Whether any health-impacting rule resolves against an entity’s properties. Covered + none firing + data fresh resolves healthy; uncovered resolves unknown, not falsely green. See health.
unknown reasonDesign. A discriminator carried as metadata on health unknown, leaving the ordered domain (healthy < degraded < outage, unknown off-order) unchanged: stale (had data, went stale), uncovered (no health-impacting rule resolves), no-data (covered but never reported). See health.
baseline reachability alarmDesign. A reachability alarm seeded per collected component (via the collection / template default), so a freshly-collected device is covered immediately and resolves unknown -> healthy/outage on first poll; bare unknown(uncovered) is then the rare honest “you have not told me what failure looks like” state. See health.
viewA named query returning a uniform {columns, rows}; the read side, executed through the scoped gateway.
Storage GatewayThe single door to the database; every read and write goes through it, and scope is injected here.
audit_logWho-did-what ground truth; one row per operator write, same-tx; the lineage target for operator writes, including config changes.
session_logConnection-lifecycle transitions (node-reported, diagnostic).
internal_logPlatform self-narration (startup, reconcile, migration, node-reg, config-sync).
ground truthImmutable append-only records: log_datapoint, audit_log, session_log, internal_log.
principal / role / grantIAM subject (kind human / service / node; identity is an opaque uuid, never a name); an RBAC capability set crossed with a scope. The base principal holds identity + kind only; a human’s display_name lives on the human per-kind table. A principal_group is a group of principals used as a grant subject. An AI tool acts via OAuth as a human / service principal (first-class agent identity is deferred, identity and access). See identity and access.
secret:readThe IAM permission to read a credential in plaintext; gated per role, and every decrypt is audited.
file / blobSearchable metadata over content-addressed bytes (pgblobs/S3/disk); dedup.