Sparkplug B Conformance Report

RelayQ Sparkplug B 3.0.0 conformance, broker-scope requirements.

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.

StatusMeaning
✅ testedEnforced by RelayQ’s Sparkplug Aware ingress check, and covered by an automated test
◌ inspectedCode exists and was reviewed; either structural field-handling with no failure mode to test, or exercised only incidentally by another requirement’s test
⚠️ unwiredThe 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/aThe 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

IDRequirementStatus
SPK-4-001Implementations MUST use the canonical topic shape namespace/group_id/message_type/edge_node_id/[device_id].✅ tested
SPK-4-002namespace MUST identify the Sparkplug payload family and version (for example spBv1.0).✅ tested
SPK-4-003group_id MUST represent the logical grouping boundary used for routing and filtering.✅ tested
SPK-4-004message_type MUST be one of: NBIRTH, NDEATH, DBIRTH, DDEATH, NDATA, DDATA, NCMD, DCMD, STATE.✅ tested
SPK-4-005edge_node_id MUST uniquely identify an edge node within group_id scope.◌ inspected
SPK-4-006device_id MUST be present for device-class messages and omitted for node/state-class messages.✅ tested
SPK-4-101NBIRTH MUST establish node baseline contract and initial metric model.✅ tested
SPK-4-102NDATA MUST carry node metric updates after baseline establishment.⚠️ unwired
SPK-4-103NDEATH MUST signal node session end or loss semantics.✅ tested
SPK-4-104NCMD MUST be used for node command delivery semantics.⚠️ unwired
SPK-4-105DBIRTH MUST establish device baseline contract under node scope.✅ tested
SPK-4-106DDATA MUST carry device metric updates after DBIRTH.⚠️ unwired
SPK-4-107DDEATH MUST signal device lifecycle end or loss semantics.⚠️ unwired
SPK-4-108DCMD MUST be used for device command delivery semantics.⚠️ unwired
SPK-4-109STATE MUST represent host online/offline lifecycle coordination.⚠️ unwired

§5 Sparkplug™ Operational Behavior

IDRequirementStatus
SPK-5-001Messages MUST include usable timestamp semantics for ordering and freshness checks.⚠️ unwired
SPK-5-002Topic tokens and identifiers MUST be treated as case-sensitive unless profile overrides are defined.✅ tested
SPK-5-003Host startup MUST establish subscriptions and publish lifecycle state before steady-state processing., n/a
SPK-5-004Edge startup MUST connect, register death behavior, and publish birth state before normal updates.◌ inspected
SPK-5-005Edge termination handling MUST map both graceful and ungraceful paths to deterministic host-visible state.✅ tested
SPK-5-006Device startup MUST publish birth semantics before device updates.⚠️ unwired
SPK-5-007Device termination MUST produce deterministic quality/state degradation behavior on hosts.⚠️ unwired
SPK-5-008Hosts MUST implement discovery, lifecycle tracking, quality evaluation, and command arbitration., n/a
SPK-5-009Hosts SHOULD process ordering-sensitive streams with replay safeguards.⚠️ unwired
SPK-5-010Primary-host STATE behavior MUST remain coherent in multi-broker topologies., n/a
SPK-5-011NDATA/NCMD flow handling MUST preserve sequence integrity and prevent stale command execution.✅ tested
SPK-5-012Native MQTT-enabled devices MUST follow the same session lifecycle principles as edge-managed devices.⚠️ unwired
SPK-5-013Host startup SHOULD prioritize STATE publication and baseline subscriptions., n/a
SPK-5-014Host shutdown SHOULD publish deterministic offline state when possible., n/a
SPK-5-015Receiving hosts MUST validate source lifecycle state, message ordering, and quality before actioning data., n/a
SPK-5-016Publish behavior SHOULD prefer RBE and MUST remain consistent with baseline birth contracts., n/a
SPK-5-017Command topics MUST enforce tight authorization and entity correlation.⚠️ unwired

§6 Sparkplug™ Payload Definition

IDRequirementStatus
SPK-6-001Payloads MUST encode metrics, metadata, and lifecycle context for interoperable exchange.◌ inspected
SPK-6-002Implementations MUST serialize using Protocol Buffers schema conventions defined by profile.◌ inspected
SPK-6-003Sparkplug A support MAY be treated as legacy/deprecated by modern profiles., n/a
SPK-6-004Sparkplug B MUST be treated as the primary payload model for current deployments.◌ inspected
SPK-6-005Schema definitions MUST include payload container and metric structure contracts.◌ inspected
SPK-6-006Metric naming MUST remain consistent and stable across birth and update flows.⚠️ unwired
SPK-6-007Payload component families MUST include Payload, Metric, Metadata, PropertySet, Template, and DataSet semantics where applicable.◌ inspected
SPK-6-008Component definitions MUST preserve explicit type and usage semantics.◌ inspected
SPK-6-009Top-level Payload MUST support timestamped metric collection semantics.◌ inspected
SPK-6-010Metric entities MUST include typed value semantics with optional metadata/properties according to profile.◌ inspected
SPK-6-011Metadata SHOULD provide optional interpretation context without breaking payload compatibility.◌ inspected
SPK-6-012PropertySet and PropertyValue MUST preserve typed key/value extension semantics.◌ inspected
SPK-6-013PropertySetList MAY be used for grouped property constructs when required by profile.◌ inspected
SPK-6-014DataSet, DataSet.Row, and DataSet.DataSetValue MUST preserve tabular structured-data semantics.◌ inspected
SPK-6-015Template and Template.Parameter MUST preserve reusable metric-group semantics.◌ inspected
SPK-6-016Datatype mapping MUST remain consistent between Sparkplug datatypes and Protobuf-native encodings.◌ inspected
SPK-6-017Datatype constraints and semantics MUST remain stable across birth and update flows.⚠️ unwired
SPK-6-018Host payload representations MUST deserialize into deterministic internal models with quality and timestamp handling., n/a
SPK-6-019NBIRTH payloads MUST establish baseline node metrics and control primitives.⚠️ unwired
SPK-6-020DBIRTH payloads MUST establish baseline device metrics.⚠️ unwired
SPK-6-021NDATA payloads MUST carry node delta/update semantics.⚠️ unwired
SPK-6-022DDATA payloads MUST carry device delta/update semantics.⚠️ unwired
SPK-6-023NCMD payloads MUST carry node command semantics.⚠️ unwired
SPK-6-024DCMD payloads MUST carry device command semantics.⚠️ unwired
SPK-6-025NDEATH payloads MUST signal node death semantics.⚠️ unwired
SPK-6-026DDEATH payloads MUST signal device death semantics.⚠️ unwired
SPK-6-027STATE payloads MUST signal host lifecycle state semantics.⚠️ unwired