This report lists the requirements of the Sparkplug B 3.0.0 specification and RelayQ’s coverage of each. RelayQ is a Sparkplug Compliant MQTT Server, it includes a fully conformant MQTT 3.1.1 and 5.0 broker, and Sparkplug traffic routes correctly through standard MQTT with no Sparkplug-specific logic required. Sparkplug Aware mode is RelayQ’s elective value-add on top of that: validating some of what a Sparkplug Host Application would otherwise have to check itself, at the point of ingress, before a malformed or out-of-sequence message ever reaches a subscriber.
Aware mode enforces exactly three things today, proven in binary-level testing against
the signed release tarball: a malformed Sparkplug topic is rejected; a DBIRTH with no
prior NBIRTH for its node is rejected; a stale or duplicate NBIRTH/NDEATH (by bdSeq)
is rejected. Nothing else, payload-content validation (metric datatype stability,
birth/death payload completeness), NDATA/DDATA/DDEATH ordering, command-topic ACLs, and
host-STATE tracking exist as reviewed, unit-tested modules in the runtime but are not
yet wired into the ingress-enforcement path.
| Status | Meaning |
|---|
| ✅ tested | Enforced by RelayQ’s Sparkplug Aware ingress check, and covered by an automated test |
| ◌ inspected | Code exists and was reviewed; either structural field-handling with no failure mode to test, or exercised only incidentally by another requirement’s test |
| ⚠️ unwired | The implementing code exists, usually with its own tests, but is not called from the ingress-enforcement path. RelayQ does not currently enforce this as a running server |
| , n/a | The specification assigns this requirement to the Edge Node, Device, or Host Application role, not to message-broker infrastructure |
§4 Sparkplug™ Topic Namespace and State Management
| ID | Requirement | Status |
|---|
| SPK-4-001 | Implementations MUST use the canonical topic shape namespace/group_id/message_type/edge_node_id/[device_id]. | ✅ tested |
| SPK-4-002 | namespace MUST identify the Sparkplug payload family and version (for example spBv1.0). | ✅ tested |
| SPK-4-003 | group_id MUST represent the logical grouping boundary used for routing and filtering. | ✅ tested |
| SPK-4-004 | message_type MUST be one of: NBIRTH, NDEATH, DBIRTH, DDEATH, NDATA, DDATA, NCMD, DCMD, STATE. | ✅ tested |
| SPK-4-005 | edge_node_id MUST uniquely identify an edge node within group_id scope. | ◌ inspected |
| SPK-4-006 | device_id MUST be present for device-class messages and omitted for node/state-class messages. | ✅ tested |
| SPK-4-101 | NBIRTH MUST establish node baseline contract and initial metric model. | ✅ tested |
| SPK-4-102 | NDATA MUST carry node metric updates after baseline establishment. | ⚠️ unwired |
| SPK-4-103 | NDEATH MUST signal node session end or loss semantics. | ✅ tested |
| SPK-4-104 | NCMD MUST be used for node command delivery semantics. | ⚠️ unwired |
| SPK-4-105 | DBIRTH MUST establish device baseline contract under node scope. | ✅ tested |
| SPK-4-106 | DDATA MUST carry device metric updates after DBIRTH. | ⚠️ unwired |
| SPK-4-107 | DDEATH MUST signal device lifecycle end or loss semantics. | ⚠️ unwired |
| SPK-4-108 | DCMD MUST be used for device command delivery semantics. | ⚠️ unwired |
| SPK-4-109 | STATE MUST represent host online/offline lifecycle coordination. | ⚠️ unwired |
§5 Sparkplug™ Operational Behavior
| ID | Requirement | Status |
|---|
| SPK-5-001 | Messages MUST include usable timestamp semantics for ordering and freshness checks. | ⚠️ unwired |
| SPK-5-002 | Topic tokens and identifiers MUST be treated as case-sensitive unless profile overrides are defined. | ✅ tested |
| SPK-5-003 | Host startup MUST establish subscriptions and publish lifecycle state before steady-state processing. | , n/a |
| SPK-5-004 | Edge startup MUST connect, register death behavior, and publish birth state before normal updates. | ◌ inspected |
| SPK-5-005 | Edge termination handling MUST map both graceful and ungraceful paths to deterministic host-visible state. | ✅ tested |
| SPK-5-006 | Device startup MUST publish birth semantics before device updates. | ⚠️ unwired |
| SPK-5-007 | Device termination MUST produce deterministic quality/state degradation behavior on hosts. | ⚠️ unwired |
| SPK-5-008 | Hosts MUST implement discovery, lifecycle tracking, quality evaluation, and command arbitration. | , n/a |
| SPK-5-009 | Hosts SHOULD process ordering-sensitive streams with replay safeguards. | ⚠️ unwired |
| SPK-5-010 | Primary-host STATE behavior MUST remain coherent in multi-broker topologies. | , n/a |
| SPK-5-011 | NDATA/NCMD flow handling MUST preserve sequence integrity and prevent stale command execution. | ✅ tested |
| SPK-5-012 | Native MQTT-enabled devices MUST follow the same session lifecycle principles as edge-managed devices. | ⚠️ unwired |
| SPK-5-013 | Host startup SHOULD prioritize STATE publication and baseline subscriptions. | , n/a |
| SPK-5-014 | Host shutdown SHOULD publish deterministic offline state when possible. | , n/a |
| SPK-5-015 | Receiving hosts MUST validate source lifecycle state, message ordering, and quality before actioning data. | , n/a |
| SPK-5-016 | Publish behavior SHOULD prefer RBE and MUST remain consistent with baseline birth contracts. | , n/a |
| SPK-5-017 | Command topics MUST enforce tight authorization and entity correlation. | ⚠️ unwired |
§6 Sparkplug™ Payload Definition
| ID | Requirement | Status |
|---|
| SPK-6-001 | Payloads MUST encode metrics, metadata, and lifecycle context for interoperable exchange. | ◌ inspected |
| SPK-6-002 | Implementations MUST serialize using Protocol Buffers schema conventions defined by profile. | ◌ inspected |
| SPK-6-003 | Sparkplug A support MAY be treated as legacy/deprecated by modern profiles. | , n/a |
| SPK-6-004 | Sparkplug B MUST be treated as the primary payload model for current deployments. | ◌ inspected |
| SPK-6-005 | Schema definitions MUST include payload container and metric structure contracts. | ◌ inspected |
| SPK-6-006 | Metric naming MUST remain consistent and stable across birth and update flows. | ⚠️ unwired |
| SPK-6-007 | Payload component families MUST include Payload, Metric, Metadata, PropertySet, Template, and DataSet semantics where applicable. | ◌ inspected |
| SPK-6-008 | Component definitions MUST preserve explicit type and usage semantics. | ◌ inspected |
| SPK-6-009 | Top-level Payload MUST support timestamped metric collection semantics. | ◌ inspected |
| SPK-6-010 | Metric entities MUST include typed value semantics with optional metadata/properties according to profile. | ◌ inspected |
| SPK-6-011 | Metadata SHOULD provide optional interpretation context without breaking payload compatibility. | ◌ inspected |
| SPK-6-012 | PropertySet and PropertyValue MUST preserve typed key/value extension semantics. | ◌ inspected |
| SPK-6-013 | PropertySetList MAY be used for grouped property constructs when required by profile. | ◌ inspected |
| SPK-6-014 | DataSet, DataSet.Row, and DataSet.DataSetValue MUST preserve tabular structured-data semantics. | ◌ inspected |
| SPK-6-015 | Template and Template.Parameter MUST preserve reusable metric-group semantics. | ◌ inspected |
| SPK-6-016 | Datatype mapping MUST remain consistent between Sparkplug datatypes and Protobuf-native encodings. | ◌ inspected |
| SPK-6-017 | Datatype constraints and semantics MUST remain stable across birth and update flows. | ⚠️ unwired |
| SPK-6-018 | Host payload representations MUST deserialize into deterministic internal models with quality and timestamp handling. | , n/a |
| SPK-6-019 | NBIRTH payloads MUST establish baseline node metrics and control primitives. | ⚠️ unwired |
| SPK-6-020 | DBIRTH payloads MUST establish baseline device metrics. | ⚠️ unwired |
| SPK-6-021 | NDATA payloads MUST carry node delta/update semantics. | ⚠️ unwired |
| SPK-6-022 | DDATA payloads MUST carry device delta/update semantics. | ⚠️ unwired |
| SPK-6-023 | NCMD payloads MUST carry node command semantics. | ⚠️ unwired |
| SPK-6-024 | DCMD payloads MUST carry device command semantics. | ⚠️ unwired |
| SPK-6-025 | NDEATH payloads MUST signal node death semantics. | ⚠️ unwired |
| SPK-6-026 | DDEATH payloads MUST signal device death semantics. | ⚠️ unwired |
| SPK-6-027 | STATE payloads MUST signal host lifecycle state semantics. | ⚠️ unwired |