Conformance

SAPIENT conformance rule catalogue

All 409 rules the SAPIENT test harness checks, by rule ID, with the message it prints when one fails. If the harness reported a finding against your node, look up its rule ID here.

This catalogue is for harness v1.0.0-beta.7, generated from the harness's own rule list for that release. To find a rule, search this page for its ID (Ctrl+F, or ⌘F on a Mac). Each rule ID links to its own row, so you can share a link to a single rule.

Reading a rule ID

Message rules check one message on its own, whichever role the harness is playing. Their IDs name the message type, the field and what is wrong with it: <message type>.<field>.<problem>. The problem is one of:

missing

A mandatory field is absent.

invalid

The field is present but fails a format, range or enum check. For example, an ID that isn't a valid UUID or ULID, or a coordinate that isn't a finite number.

malformed

The field is present but structurally broken, mainly a timestamp whose nanoseconds are out of range.

empty

A list or string is present but empty where at least one entry is required.

Nested fields repeat the path, so alert.location.x.missing means an Alert's location has no x-coordinate. Session rules start with session. and cover what no single message shows: the order messages arrive in, whether acknowledgements match what was sent, reporting intervals, and whether reports agree with what the node registered.

Messages are quoted exactly as the harness prints them. Text in ‹angle quotes› is filled in from the actual message, such as a task ID or a time in seconds.

Message rules (384)

SapientMessage (5)

The wrapper around every message: node ID, timestamp and content.

SapientMessage rules
Rule IDHarness message
sapient_message.content.missingContent must be specified in sapient message.
sapient_message.destination_id.invalidA valid UUID v4 must be used for a destination ID in sapient message.
sapient_message.node_id.invalidA valid UUID v4 must be used for a node ID in sapient message.
sapient_message.timestamp.malformedTimestamp is malformed in sapient message.
sapient_message.timestamp.missingTimestamp must be specified in sapient message.

Registration (101)

Registration rules
Rule IDHarness message
registration.behaviour_definition.type.missingBehaviour definition type must be specified.
registration.behaviour_filter_definition.type.missingBehaviour filter definition type must be specified.
registration.capabilities.category.missingCapability category must be specified in registration.
registration.capabilities.emptyCapabilities must be specified in registration.
registration.capabilities.type.missingCapability type must be specified in registration.
registration.class_definition.type.missingClass definition type must be specified.
registration.class_filter_definition.type.missingClass filter definition type must be specified.
registration.command.completion_time.missingCommand completion time must be specified.
registration.command.completion_time.units.missingTime Units must be specified.
registration.command.completion_time.value.invalidDuration value must be a finite number 0 or greater.
registration.command.completion_time.value.missingDuration value must be provided.
registration.command.type.missingCommand type must be specified.
registration.command.units.missingCommand units must be specified.
registration.config_data.emptyConfiguration data must be specified in registration.
registration.config_data.manufacturer.missingConfiguration data manufacturer must be specified.
registration.config_data.model.missingConfiguration data model must be specified.
registration.dependent_nodes.invalidA valid UUID v4 must be used for a dependent node ID in registration.
registration.detection_class_definition.confidence_definition.invalidConfidence definition is not a valid option in detection class definition.
registration.detection_definition.location_type.missingLocation type must be specified in detection definition.
registration.detection_report.category.missingDetection report category must be specified.
registration.detection_report.type.missingDetection report type must be specified.
registration.detection_report.units.missingDetection report units must be specified.
registration.enu_velocity_units.east_north_rate_units.missingEast/north rate units must be specified in velocity type.
registration.enu_velocity_units.up_rate_units.invalidUp rate units is not a valid option in velocity type.
registration.extension_subclass.subclass_name.missingExtension subclass name must be specified.
registration.extension_subclass.subclass_namespace.missingExtension subclass namespace must be specified.
registration.filter_parameter.operators.invalidFilter parameter operators must be specified, and each must be a valid option.
registration.filter_parameter.parameter.missingFilter parameter name must be specified.
registration.geometric_error.type.missingGeometric error type must be specified.
registration.geometric_error.units.missingGeometric error units must be specified.
registration.geometric_error.variation_type.missingGeometric error variation type must be specified.
registration.icd_version.invalidICD version specified in registration is not a valid option.
registration.icd_version.missingNo ICD version specified in registration message
registration.location_type.datum.invalidDatum must not be unspecified (0) in location type.
registration.location_type.datum.missingDatum must be specified in location type.
registration.location_type.units.invalidUnits are not a valid option in location type.
registration.location_type.units.missingUnits must be specified in location type.
registration.mode_definition.emptyMode definition must be specified in registration.
registration.mode_definition.mode_name.invalidMode names must be unique so a mode_change Task can address each unambiguously.
registration.mode_definition.mode_name.missingMode name must be specified in mode definition.
registration.mode_definition.mode_type.missingMode type must be specified.
registration.mode_definition.settle_time.missingSettle time must be specified in mode definition.
registration.mode_definition.settle_time.units.missingTime Units must be specified.
registration.mode_definition.settle_time.value.invalidDuration value must be a finite number 0 or greater.
registration.mode_definition.settle_time.value.missingDuration value must be provided.
registration.mode_parameter.type.missingMode parameter type must be specified.
registration.mode_parameter.value.missingMode parameter value must be specified.
registration.node_definition.emptyNode type must be specified in node definition.
registration.node_definition.node_type.missingNode type must be specified in node definition.
registration.performance_value.type.missingPerformance value type must be specified.
registration.performance_value.unit_value.missingPerformance value unit value must be specified.
registration.performance_value.units.missingPerformance value units must be specified.
registration.region_definition.region_area.emptyRegion area must be specified in region definition.
registration.region_definition.region_type.emptyRegion type must be specified in region definition.
registration.region_definition.region_type.invalidRegion type is not a valid option in region definition.
registration.region_definition.settle_time.units.missingTime Units must be specified.
registration.region_definition.settle_time.value.invalidDuration value must be a finite number 0 or greater.
registration.region_definition.settle_time.value.missingDuration value must be provided.
registration.reporting_region.azimuth.invalidValue must be a finite number in range bearing.
registration.reporting_region.azimuth_error.invalidValue must be a finite number in range bearing.
registration.reporting_region.coordinate_system.invalidCoordinate system must be specified in range bearing.
registration.reporting_region.datum.missingDatum must be specified in range bearing.
registration.reporting_region.elevation.invalidValue must be a finite number in range bearing.
registration.reporting_region.elevation_error.invalidValue must be a finite number in range bearing.
registration.reporting_region.horizontal_extent.invalidValue must be a finite number in range bearing.
registration.reporting_region.horizontal_extent_error.invalidValue must be a finite number in range bearing.
registration.reporting_region.locations.coordinate_system.invalidCoordinate system must be specified in location.
registration.reporting_region.locations.datum.missingDatum must be specified in location.
registration.reporting_region.locations.emptyAt least one location must be specified in location list.
registration.reporting_region.locations.x.invalidCoordinate must be a finite number in location.
registration.reporting_region.locations.x.missingX-coordinate must be specified in location.
registration.reporting_region.locations.x_error.invalidCoordinate must be a finite number in location.
registration.reporting_region.locations.y.invalidCoordinate must be a finite number in location.
registration.reporting_region.locations.y.missingY-coordinate must be specified in location.
registration.reporting_region.locations.y_error.invalidCoordinate must be a finite number in location.
registration.reporting_region.locations.z.invalidCoordinate must be a finite number in location.
registration.reporting_region.locations.z_error.invalidCoordinate must be a finite number in location.
registration.reporting_region.missingLocation or range-bearing must be specified in reporting region.
registration.reporting_region.range.invalidRange must be a finite number 0 or greater in range bearing.
registration.reporting_region.range_error.invalidRange must be a finite number 0 or greater in range bearing.
registration.reporting_region.vertical_extent.invalidValue must be a finite number in range bearing.
registration.reporting_region.vertical_extent_error.invalidValue must be a finite number in range bearing.
registration.status_definition.missingStatus definition must be specified in registration.
registration.status_definition.status_interval.missingStatus interval must be specified in status definition.
registration.status_definition.status_interval.units.missingTime Units must be specified.
registration.status_definition.status_interval.value.invalidDuration value must be a finite number 0 or greater.
registration.status_definition.status_interval.value.missingDuration value must be provided.
registration.status_definition.status_report.category.missingStatus report category must be specified in registration.
registration.status_definition.status_report.type.missingStatus report type must be specified in registration.
registration.sub_class.level.missingSub class level must be specified.
registration.sub_class.type.missingSub class type must be specified.
registration.sub_class_filter_definition.level.missingSub class filter definition level must be specified.
registration.sub_class_filter_definition.type.missingSub class filter definition type must be specified.
registration.task_definition.concurrent_tasks.invalidConcurrent tasks must be 0 or greater.
registration.task_definition.concurrent_tasks.missingConcurrent tasks must be specified in task definition.
registration.task_definition.missingTask definition must be populated
registration.task_definition.region_definition.missingRegion definition must be specified in task definition.
registration.taxonomy_dock_definition.dock_class.missingTaxonomy dock class must be specified.
registration.taxonomy_dock_definition.dock_class_namespace.missingTaxonomy dock class namespace must be specified.
registration.velocity_type.datum.missingDatum must be specified in velocity type.
registration.velocity_type.velocity_units.missingVelocity units must be specified in velocity type.

RegistrationAck (1)

RegistrationAck rules
Rule IDHarness message
registration_ack.acceptance.missingAcceptance must be specified in a registration ack message.

StatusReport (92)

StatusReport rules
Rule IDHarness message
status_report.active_task_id.invalidA valid ULID must be used for an active task ID in a status report.
status_report.coverage.azimuth.invalidValue must be a finite number in range bearing.
status_report.coverage.azimuth_error.invalidValue must be a finite number in range bearing.
status_report.coverage.coordinate_system.invalidCoordinate system must be specified in range bearing.
status_report.coverage.datum.missingDatum must be specified in range bearing.
status_report.coverage.elevation.invalidValue must be a finite number in range bearing.
status_report.coverage.elevation_error.invalidValue must be a finite number in range bearing.
status_report.coverage.horizontal_extent.invalidValue must be a finite number in range bearing.
status_report.coverage.horizontal_extent_error.invalidValue must be a finite number in range bearing.
status_report.coverage.locations.coordinate_system.invalidCoordinate system must be specified in location.
status_report.coverage.locations.datum.missingDatum must be specified in location.
status_report.coverage.locations.emptyAt least one location must be specified in location list.
status_report.coverage.locations.x.invalidCoordinate must be a finite number in location.
status_report.coverage.locations.x.missingX-coordinate must be specified in location.
status_report.coverage.locations.x_error.invalidCoordinate must be a finite number in location.
status_report.coverage.locations.y.invalidCoordinate must be a finite number in location.
status_report.coverage.locations.y.missingY-coordinate must be specified in location.
status_report.coverage.locations.y_error.invalidCoordinate must be a finite number in location.
status_report.coverage.locations.z.invalidCoordinate must be a finite number in location.
status_report.coverage.locations.z_error.invalidCoordinate must be a finite number in location.
status_report.coverage.missingLocation or range-bearing must be specified in status report.
status_report.coverage.range.invalidRange must be a finite number 0 or greater in range bearing.
status_report.coverage.range_error.invalidRange must be a finite number 0 or greater in range bearing.
status_report.coverage.vertical_extent.invalidValue must be a finite number in range bearing.
status_report.coverage.vertical_extent_error.invalidValue must be a finite number in range bearing.
status_report.field_of_view.azimuth.invalidValue must be a finite number in range bearing.
status_report.field_of_view.azimuth_error.invalidValue must be a finite number in range bearing.
status_report.field_of_view.coordinate_system.invalidCoordinate system must be specified in range bearing.
status_report.field_of_view.datum.missingDatum must be specified in range bearing.
status_report.field_of_view.elevation.invalidValue must be a finite number in range bearing.
status_report.field_of_view.elevation_error.invalidValue must be a finite number in range bearing.
status_report.field_of_view.horizontal_extent.invalidValue must be a finite number in range bearing.
status_report.field_of_view.horizontal_extent_error.invalidValue must be a finite number in range bearing.
status_report.field_of_view.locations.coordinate_system.invalidCoordinate system must be specified in location.
status_report.field_of_view.locations.datum.missingDatum must be specified in location.
status_report.field_of_view.locations.emptyAt least one location must be specified in location list.
status_report.field_of_view.locations.x.invalidCoordinate must be a finite number in location.
status_report.field_of_view.locations.x.missingX-coordinate must be specified in location.
status_report.field_of_view.locations.x_error.invalidCoordinate must be a finite number in location.
status_report.field_of_view.locations.y.invalidCoordinate must be a finite number in location.
status_report.field_of_view.locations.y.missingY-coordinate must be specified in location.
status_report.field_of_view.locations.y_error.invalidCoordinate must be a finite number in location.
status_report.field_of_view.locations.z.invalidCoordinate must be a finite number in location.
status_report.field_of_view.locations.z_error.invalidCoordinate must be a finite number in location.
status_report.field_of_view.missingLocation or range-bearing must be specified in status report.
status_report.field_of_view.range.invalidRange must be a finite number 0 or greater in range bearing.
status_report.field_of_view.range_error.invalidRange must be a finite number 0 or greater in range bearing.
status_report.field_of_view.vertical_extent.invalidValue must be a finite number in range bearing.
status_report.field_of_view.vertical_extent_error.invalidValue must be a finite number in range bearing.
status_report.info.invalidInfo must be specified in status report.
status_report.mode.missingMode must be specified in status report.
status_report.node_location.coordinate_system.invalidCoordinate system must be specified in location.
status_report.node_location.datum.missingDatum must be specified in location.
status_report.node_location.x.invalidCoordinate must be a finite number in location.
status_report.node_location.x.missingX-coordinate must be specified in location.
status_report.node_location.x_error.invalidCoordinate must be a finite number in location.
status_report.node_location.y.invalidCoordinate must be a finite number in location.
status_report.node_location.y.missingY-coordinate must be specified in location.
status_report.node_location.y_error.invalidCoordinate must be a finite number in location.
status_report.node_location.z.invalidCoordinate must be a finite number in location.
status_report.node_location.z_error.invalidCoordinate must be a finite number in location.
status_report.obscuration.azimuth.invalidValue must be a finite number in range bearing.
status_report.obscuration.azimuth_error.invalidValue must be a finite number in range bearing.
status_report.obscuration.coordinate_system.invalidCoordinate system must be specified in range bearing.
status_report.obscuration.datum.missingDatum must be specified in range bearing.
status_report.obscuration.elevation.invalidValue must be a finite number in range bearing.
status_report.obscuration.elevation_error.invalidValue must be a finite number in range bearing.
status_report.obscuration.horizontal_extent.invalidValue must be a finite number in range bearing.
status_report.obscuration.horizontal_extent_error.invalidValue must be a finite number in range bearing.
status_report.obscuration.locations.coordinate_system.invalidCoordinate system must be specified in location.
status_report.obscuration.locations.datum.missingDatum must be specified in location.
status_report.obscuration.locations.emptyAt least one location must be specified in location list.
status_report.obscuration.locations.x.invalidCoordinate must be a finite number in location.
status_report.obscuration.locations.x.missingX-coordinate must be specified in location.
status_report.obscuration.locations.x_error.invalidCoordinate must be a finite number in location.
status_report.obscuration.locations.y.invalidCoordinate must be a finite number in location.
status_report.obscuration.locations.y.missingY-coordinate must be specified in location.
status_report.obscuration.locations.y_error.invalidCoordinate must be a finite number in location.
status_report.obscuration.locations.z.invalidCoordinate must be a finite number in location.
status_report.obscuration.locations.z_error.invalidCoordinate must be a finite number in location.
status_report.obscuration.missingLocation or range-bearing must be specified in status report.
status_report.obscuration.range.invalidRange must be a finite number 0 or greater in range bearing.
status_report.obscuration.range_error.invalidRange must be a finite number 0 or greater in range bearing.
status_report.obscuration.vertical_extent.invalidValue must be a finite number in range bearing.
status_report.obscuration.vertical_extent_error.invalidValue must be a finite number in range bearing.
status_report.power.level.invalidPower level must be between 0 and 100 in status report.
status_report.power.source.invalidPower source is not a valid option in status report.
status_report.power.status.invalidPower status is not a valid option in status report.
status_report.report_id.invalidA valid ULID must be used for a report ID in a status report.
status_report.status.status_level.invalidStatus level is not a valid option in status report.
status_report.status.status_type.missingStatus type must be specified in status report.
status_report.system.invalidSystem must be specified in status report.

DetectionReport (61)

DetectionReport rules
Rule IDHarness message
detection_report.associated_detection.association_type.invalidAssociation type is not a valid option in associated detection.
detection_report.associated_detection.node_id.invalidA valid UUID v4 must be used for a node ID in a detection report associated detection.
detection_report.associated_detection.object_id.invalidA valid ULID must be used for an object ID in a detection report associated detection.
detection_report.associated_file.type.missingAssociated file type must be specified in a detection report.
detection_report.associated_file.url.missingAssociated file URL must be specified in a detection report.
detection_report.behaviour.confidence.invalidBehaviour confidence must be between 0.0 and 1.0 in detection report.
detection_report.behaviour.type.missingBehaviour type must be specified in detection report.
detection_report.classification.confidence.invalidClassification confidence must be between 0.0 and 1.0 in detection report.
detection_report.classification.sub_class.level.missingClassification sub class level must be specified in detection report.
detection_report.classification.sub_class.type.missingClassification sub class type must be specified in detection report.
detection_report.classification.type.missingClassification type must be specified in detection report.
detection_report.derived_detection.node_id.invalidA valid UUID v4 must be used for a node ID in a derived detection.
detection_report.derived_detection.object_id.invalidA valid ULID must be used for an object ID in a derived detection.
detection_report.derived_detection.timestamp.malformedDerived detection timestamp is malformed in detection report.
detection_report.derived_detection.timestamp.missingDerived detection timestamp must be specified in detection report.
detection_report.detection_confidence.invalidDetection confidence must be between 0.0 and 1.0 in detection report.
detection_report.enu_velocity.east_rate.missingENU velocity east rate must be specified in detection report.
detection_report.enu_velocity.north_rate.missingENU velocity north rate must be specified in detection report.
detection_report.location.azimuth.invalidValue must be a finite number in range bearing.
detection_report.location.azimuth_error.invalidValue must be a finite number in range bearing.
detection_report.location.coordinate_system.invalidCoordinate system must be specified in location. / Coordinate system must be specified in range bearing.
detection_report.location.datum.missingDatum must be specified in location. / Datum must be specified in range bearing.
detection_report.location.elevation.invalidValue must be a finite number in range bearing.
detection_report.location.elevation_error.invalidValue must be a finite number in range bearing.
detection_report.location.missingLocation or range-bearing must be specified in detection report.
detection_report.location.range.invalidRange must be a finite number 0 or greater in range bearing.
detection_report.location.range_error.invalidRange must be a finite number 0 or greater in range bearing.
detection_report.location.x.invalidCoordinate must be a finite number in location.
detection_report.location.x.missingX-coordinate must be specified in location.
detection_report.location.x_error.invalidCoordinate must be a finite number in location.
detection_report.location.y.invalidCoordinate must be a finite number in location.
detection_report.location.y.missingY-coordinate must be specified in location.
detection_report.location.y_error.invalidCoordinate must be a finite number in location.
detection_report.location.z.invalidCoordinate must be a finite number in location.
detection_report.location.z_error.invalidCoordinate must be a finite number in location.
detection_report.object_id.invalidA valid ULID must be used for an object ID in a detection report.
detection_report.object_info.type.missingTrack object info type must be specified in detection report.
detection_report.object_info.value.missingTrack object info value must be specified in detection report.
detection_report.prediction_location.azimuth.invalidValue must be a finite number in range bearing.
detection_report.prediction_location.azimuth_error.invalidValue must be a finite number in range bearing.
detection_report.prediction_location.coordinate_system.invalidCoordinate system must be specified in location. / Coordinate system must be specified in range bearing.
detection_report.prediction_location.datum.missingDatum must be specified in location. / Datum must be specified in range bearing.
detection_report.prediction_location.elevation.invalidValue must be a finite number in range bearing.
detection_report.prediction_location.elevation_error.invalidValue must be a finite number in range bearing.
detection_report.prediction_location.missingPredicted location or range-bearing must be specified in detection report.
detection_report.prediction_location.range.invalidRange must be a finite number 0 or greater in range bearing.
detection_report.prediction_location.range_error.invalidRange must be a finite number 0 or greater in range bearing.
detection_report.prediction_location.x.invalidCoordinate must be a finite number in location.
detection_report.prediction_location.x.missingX-coordinate must be specified in location.
detection_report.prediction_location.x_error.invalidCoordinate must be a finite number in location.
detection_report.prediction_location.y.invalidCoordinate must be a finite number in location.
detection_report.prediction_location.y.missingY-coordinate must be specified in location.
detection_report.prediction_location.y_error.invalidCoordinate must be a finite number in location.
detection_report.prediction_location.z.invalidCoordinate must be a finite number in location.
detection_report.prediction_location.z_error.invalidCoordinate must be a finite number in location.
detection_report.report_id.invalidA valid ULID must be used for a report ID in a detection report.
detection_report.signal.amplitude.missingSignal amplitude must be specified in detection report.
detection_report.signal.centre_frequency.missingSignal centre frequency must be specified in detection report.
detection_report.task_id.invalidA valid ULID must be used for a task ID in a detection report.
detection_report.track_info.type.missingTrack object info type must be specified in detection report.
detection_report.track_info.value.missingTrack object info value must be specified in detection report.

Task (85)

Task rules
Rule IDHarness message
task.behaviour_filter.parameter.missingParameter must be specified in behaviour filter.
task.behaviour_filter.parameter.name.missingParameter name must be specified.
task.behaviour_filter.parameter.operator.missingParameter operator must be specified.
task.behaviour_filter.parameter.value.invalidParameter value must be a finite number.
task.behaviour_filter.parameter.value.missingParameter value must be specified.
task.class_filter.parameter.missingParameter must be specified in class filter.
task.class_filter.parameter.name.missingParameter name must be specified.
task.class_filter.parameter.operator.missingParameter operator must be specified.
task.class_filter.parameter.value.invalidParameter value must be a finite number.
task.class_filter.parameter.value.missingParameter value must be specified.
task.class_filter.type.missingType must be specified in class filter.
task.command.location_list.locations.coordinate_system.invalidCoordinate system must be specified in location.
task.command.location_list.locations.datum.missingDatum must be specified in location.
task.command.location_list.locations.emptyAt least one location must be specified in location list.
task.command.location_list.locations.x.invalidCoordinate must be a finite number in location.
task.command.location_list.locations.x.missingX-coordinate must be specified in location.
task.command.location_list.locations.x_error.invalidCoordinate must be a finite number in location.
task.command.location_list.locations.y.invalidCoordinate must be a finite number in location.
task.command.location_list.locations.y.missingY-coordinate must be specified in location.
task.command.location_list.locations.y_error.invalidCoordinate must be a finite number in location.
task.command.location_list.locations.z.invalidCoordinate must be a finite number in location.
task.command.location_list.locations.z_error.invalidCoordinate must be a finite number in location.
task.command.look_at.azimuth.invalidValue must be a finite number in range bearing.
task.command.look_at.azimuth_error.invalidValue must be a finite number in range bearing.
task.command.look_at.coordinate_system.invalidCoordinate system must be specified in range bearing.
task.command.look_at.datum.missingDatum must be specified in range bearing.
task.command.look_at.elevation.invalidValue must be a finite number in range bearing.
task.command.look_at.elevation_error.invalidValue must be a finite number in range bearing.
task.command.look_at.horizontal_extent.invalidValue must be a finite number in range bearing.
task.command.look_at.horizontal_extent_error.invalidValue must be a finite number in range bearing.
task.command.look_at.locations.coordinate_system.invalidCoordinate system must be specified in location.
task.command.look_at.locations.datum.missingDatum must be specified in location.
task.command.look_at.locations.emptyAt least one location must be specified in location list.
task.command.look_at.locations.x.invalidCoordinate must be a finite number in location.
task.command.look_at.locations.x.missingX-coordinate must be specified in location.
task.command.look_at.locations.x_error.invalidCoordinate must be a finite number in location.
task.command.look_at.locations.y.invalidCoordinate must be a finite number in location.
task.command.look_at.locations.y.missingY-coordinate must be specified in location.
task.command.look_at.locations.y_error.invalidCoordinate must be a finite number in location.
task.command.look_at.locations.z.invalidCoordinate must be a finite number in location.
task.command.look_at.locations.z_error.invalidCoordinate must be a finite number in location.
task.command.look_at.missingLocation or range-bearing must be specified in task message.
task.command.look_at.range.invalidRange must be a finite number 0 or greater in range bearing.
task.command.look_at.range_error.invalidRange must be a finite number 0 or greater in range bearing.
task.command.look_at.vertical_extent.invalidValue must be a finite number in range bearing.
task.command.look_at.vertical_extent_error.invalidValue must be a finite number in range bearing.
task.command.missingTask command must be specified.
task.command.threshold.invalidTask threshold must be specified.
task.command.value.emptyTask command must be populated.
task.control.invalidControl must be specified in a task message.
task.follow_object.follow_object_id.invalidA valid ULID must be used for a follow object ID in a follow object message.
task.region.region_area.azimuth.invalidValue must be a finite number in range bearing.
task.region.region_area.azimuth_error.invalidValue must be a finite number in range bearing.
task.region.region_area.coordinate_system.invalidCoordinate system must be specified in range bearing.
task.region.region_area.datum.missingDatum must be specified in range bearing.
task.region.region_area.elevation.invalidValue must be a finite number in range bearing.
task.region.region_area.elevation_error.invalidValue must be a finite number in range bearing.
task.region.region_area.horizontal_extent.invalidValue must be a finite number in range bearing.
task.region.region_area.horizontal_extent_error.invalidValue must be a finite number in range bearing.
task.region.region_area.locations.coordinate_system.invalidCoordinate system must be specified in location.
task.region.region_area.locations.datum.missingDatum must be specified in location.
task.region.region_area.locations.emptyAt least one location must be specified in location list.
task.region.region_area.locations.x.invalidCoordinate must be a finite number in location.
task.region.region_area.locations.x.missingX-coordinate must be specified in location.
task.region.region_area.locations.x_error.invalidCoordinate must be a finite number in location.
task.region.region_area.locations.y.invalidCoordinate must be a finite number in location.
task.region.region_area.locations.y.missingY-coordinate must be specified in location.
task.region.region_area.locations.y_error.invalidCoordinate must be a finite number in location.
task.region.region_area.locations.z.invalidCoordinate must be a finite number in location.
task.region.region_area.locations.z_error.invalidCoordinate must be a finite number in location.
task.region.region_area.missingRegion area must be specified in task message. / Location or range-bearing must be specified in task message.
task.region.region_area.range.invalidRange must be a finite number 0 or greater in range bearing.
task.region.region_area.range_error.invalidRange must be a finite number 0 or greater in range bearing.
task.region.region_area.vertical_extent.invalidValue must be a finite number in range bearing.
task.region.region_area.vertical_extent_error.invalidValue must be a finite number in range bearing.
task.region.region_id.invalidA valid ULID must be used for a region ID in a task message.
task.region.region_name.missingRegion name must be specified in task message.
task.region.type.missingRegion type must be specified in task message.
task.sub_class_filter.parameter.missingParameter must be specified in sub class filter.
task.sub_class_filter.parameter.name.missingParameter name must be specified.
task.sub_class_filter.parameter.operator.missingParameter operator must be specified.
task.sub_class_filter.parameter.value.invalidParameter value must be a finite number.
task.sub_class_filter.parameter.value.missingParameter value must be specified.
task.sub_class_filter.type.missingType must be specified in sub class filter.
task.task_id.invalidA valid ULID must be used for a task ID in a task message.

TaskAck (4)

TaskAck rules
Rule IDHarness message
task_ack.associated_file.type.missingAssociated file type must be specified in a task ack message.
task_ack.associated_file.url.missingAssociated file URL must be specified in a task ack message.
task_ack.task_id.invalidA valid ULID must be used for a task ID in a task ack message.
task_ack.task_status.invalidTask status must be specified in a task ack message.

Alert (30)

Alert rules
Rule IDHarness message
alert.alert_id.invalidA valid ULID must be used for an alert ID in an alert message.
alert.alert_type.invalidAlert type is not a valid option in an alert message.
alert.associated_detection.association_type.invalidAssociation type is not a valid option in associated detection.
alert.associated_detection.node_id.invalidA valid UUID v4 must be used for a node ID in an alert associated detection.
alert.associated_detection.object_id.invalidA valid ULID must be used for an object ID in an alert associated detection.
alert.associated_file.type.missingAssociated file type must be specified in an alert message.
alert.associated_file.url.missingAssociated file URL must be specified in an alert message.
alert.confidence.invalidAlert confidence must be between 0.0 and 1.0.
alert.location.coordinate_system.invalidCoordinate system must be specified in location.
alert.location.datum.missingDatum must be specified in location.
alert.location.x.invalidCoordinate must be a finite number in location.
alert.location.x.missingX-coordinate must be specified in location.
alert.location.x_error.invalidCoordinate must be a finite number in location.
alert.location.y.invalidCoordinate must be a finite number in location.
alert.location.y.missingY-coordinate must be specified in location.
alert.location.y_error.invalidCoordinate must be a finite number in location.
alert.location.z.invalidCoordinate must be a finite number in location.
alert.location.z_error.invalidCoordinate must be a finite number in location.
alert.priority.invalidAlert priority is not a valid option in an alert message.
alert.range_bearing.azimuth.invalidValue must be a finite number in range bearing.
alert.range_bearing.azimuth_error.invalidValue must be a finite number in range bearing.
alert.range_bearing.coordinate_system.invalidCoordinate system must be specified in range bearing.
alert.range_bearing.datum.missingDatum must be specified in range bearing.
alert.range_bearing.elevation.invalidValue must be a finite number in range bearing.
alert.range_bearing.elevation_error.invalidValue must be a finite number in range bearing.
alert.range_bearing.range.invalidRange must be a finite number 0 or greater in range bearing.
alert.range_bearing.range_error.invalidRange must be a finite number 0 or greater in range bearing.
alert.ranking.invalidAlert ranking must be between 0.0 and 1.0.
alert.region_id.invalidA valid ULID must be used for a region ID in an alert message.
alert.status.invalidAlert status is not a valid option in an alert message.

AlertAck (2)

AlertAck rules
Rule IDHarness message
alert_ack.alert_ack_status.invalidAlert status must be specified in an alert ack message.
alert_ack.alert_id.invalidA valid ULID must be used for an alert ID in an alert ack message.

Error (3)

Error rules
Rule IDHarness message
error.error_message.emptyError must contain a populated error message.
error.packet.emptyError must contain a populated packet.
error.packet.missingError must contain a populated packet.

Session rules

A few rules appear under both roles. In the Fusion Node tests, the harness also reports on its own Registration where the scenario it was given is at fault; those messages say so.

Session rules when testing an Edge Node

Raised while the harness plays the Fusion Node (--role fusion) and your Edge Node connects to it.

Session rules when testing an Edge Node
Rule IDHarness message
sapient_message.content.missingContent must be specified in sapient message.
session.detection_report.location_type_mismatchDetectionReport's location coordinate system/datum does not match any detection_definition.location_type the active mode (‹…›) declared.
session.detection_report.undeclared_classificationDetectionReport classifies the object as ‹reported type›, which the active mode (‹…›) never declared in its detection_class_definition.
session.detection_report.undeclared_subclassificationDetectionReport reports sub-class ‹sub type› under ‹ancestry›, which the active mode (‹mode name›) never declared there.
session.framing.undecodablereceived bytes that don't decode as a SapientMessage: ‹err›
session.peer_reported_errorPeer sent an Error message about a packet it received: ‹…›
session.registration.default_mode_via_first_permanentRegistration declares no mode with mode_type MODE_TYPE_DEFAULT and no MODE_TYPE_PERMANENT mode named "default"; falling back to the first declared MODE_TYPE_PERMANENT mode (‹…›) as the initial active mode. Declare MODE_TYPE_DEFAULT explicitly, or name a Permanent mode "Default", to avoid this warning.
session.registration.default_mode_via_permanent_nameRegistration declares no mode with mode_type MODE_TYPE_DEFAULT; using the MODE_TYPE_PERMANENT mode named ‹…› as the initial active mode, matching the legacy Fusion Node convention MODE_TYPE_DEFAULT was introduced to replace. Declare MODE_TYPE_DEFAULT explicitly to avoid this warning.
session.registration.multiple_default_modesRegistration declares ‹count› modes with mode_type MODE_TYPE_DEFAULT; exactly one is required.
session.registration.no_default_modeRegistration must declare either a mode with mode_type MODE_TYPE_DEFAULT, or (for backward compatibility) at least one mode with mode_type MODE_TYPE_PERMANENT, so the session has a starting mode.
session.sequencing.registration_requiredReceived a ‹message type› before a successful Registration/RegistrationAck handshake; Registration must always come first.
session.status_report.first_report_lateFirst StatusReport arrived ‹elapsed seconds›s after Registration, exceeding the allowed ‹…› declared intervals (‹allowed seconds›s of ‹declared seconds›s each).
session.status_report.interval_exceededStatusReport arrived ‹elapsed seconds›s after the previous one, exceeding the declared interval of ‹declared seconds›s by more than the ‹…›% tolerance.
session.status_report.mode_mismatchStatusReport declares mode ‹reported mode›, but the session's tracked active mode (from Registration/mode_change tasks) is ‹…›.
session.status_report.timestamp_reversedStatusReport's timestamp is ‹seconds before›s before ‹context›'s timestamp; the Edge Node's reported time must not go backwards.
session.task.duplicate_idIssued an already tracked task ID ‹task id›; existing lifecycle retained.
session.task.issued_before_registrationA Task was issued before any Edge Node had registered on this session.
session.task.mode_change_unknown_modeIssued a mode_change task targeting mode ‹target mode name›, which isn't declared anywhere in the registration's mode_definition list.
session.task_ack.correlation_mismatchNo outstanding task matches TaskAck task_id ‹task id›.
session.task_ack.duplicateRepeated ‹status› acknowledgement for task ‹task id›; state unchanged.
session.task_ack.invalid_transitionTask ‹task id› cannot transition from ‹…› to ‹status› under the harness lifecycle policy.
session.unexpected_message_for_roleReceived a message type the Fusion Node role never expects as inbound traffic (e.g. Task, AlertAck, RegistrationAck are Fusion-to-Edge Node messages).

Session rules when testing a Fusion Node

Raised while the harness plays the Edge Node (--role edge) and connects to your Fusion Node.

Session rules when testing a Fusion Node
Rule IDHarness message
sapient_message.content.missingContent must be specified in sapient message.
session.alert_ack.correlation_mismatchAlertAck references alert_id ‹alert id›, which doesn't match any Alert this session sent that's still awaiting acknowledgement.
session.framing.undecodablereceived bytes that don't decode as a SapientMessage: ‹err›
session.peer_reported_errorPeer sent an Error message about a packet it received: ‹…›
session.registration.default_mode_via_first_permanentOur own Registration declares no mode with mode_type MODE_TYPE_DEFAULT and no MODE_TYPE_PERMANENT mode named "default"; falling back to the first declared MODE_TYPE_PERMANENT mode (‹…›) as the initial active mode.
session.registration.default_mode_via_permanent_nameOur own Registration declares no mode with mode_type MODE_TYPE_DEFAULT; using the MODE_TYPE_PERMANENT mode named ‹…› as the initial active mode, matching the legacy Fusion Node convention MODE_TYPE_DEFAULT was introduced to replace.
session.registration.multiple_default_modesOur own Registration declared ‹count› modes with mode_type MODE_TYPE_DEFAULT; exactly one is required. This is a harness/test scenario bug (the Fusion Node already accepted it), not something the peer did wrong.
session.registration.no_default_modeOur own Registration declared no mode with mode_type MODE_TYPE_DEFAULT and no mode with mode_type MODE_TYPE_PERMANENT to fall back to. This is a harness/test scenario bug (the Fusion Node already accepted it), not something the peer did wrong.
session.registration.rejectedFusion Node rejected our Registration: ‹…›
session.registration.sent_twiceregister() was called again while a Registration was already outstanding or accepted; this session's own Registration should only be sent once (re-registration is a legitimate protocol event, but the harness itself choosing to send a second one mid-test is almost always a scenario bug, not something to encode here).
session.sequencing.registration_requiredReceived a ‹message type› before our Registration was accepted; the Fusion Node shouldn't send this yet.
session.sequencing.unexpected_registration_ackReceived a RegistrationAck before this session ever sent a Registration.
session.task.mode_change_unknown_modeFusion Node issued a mode_change task targeting mode ‹target mode name›, which we never declared in our own Registration's mode_definition list.
session.unexpected_message_for_roleReceived an unprompted RegistrationAck while already registered; expected at most one per Registration sent.

If a rule looks wrong

The harness is an independent reading of BSI Flex 335. Where the two disagree, the standard wins: please report the discrepancy, quoting the rule ID and the clause of the standard.