Conformance / Test suite

The test suite

85 tests across five groups. Every test names the clause it enforces and the exact condition that constitutes a pass. A conformance statement MUST list the tests it fails.

85 tests

PK — Package validity 28 tests · target: package

PK-1MUSTContainer formBUS-1 16.2

Procedure. Open the package as a ZIP archive.

Pass. The archive opens, the first entry is named 'mimetype', it is stored uncompressed, and its content is exactly the registered media type string with no trailing newline.

PK-2MUSTManifest present and validBUS-1 16.3

Procedure. Read manifest.json at the package root and validate against bus-manifest.schema.json.

Pass. The manifest exists and validates with no errors.

PK-3MUSTDocument validityBUS-1 17.4

Procedure. Validate every file listed in manifest.documents against bus-document.schema.json.

Pass. Every listed document exists and validates with no errors.

PK-4MUSTDigest integrityBUS-1 16.5

Procedure. Recompute the digest of every entry in manifest.documents and manifest.resources.

Pass. Every recomputed digest equals the declared digest, and every declared byteLength matches.

PK-5MUSTNo undeclared payloadBUS-1 16.4

Procedure. Enumerate all archive entries.

Pass. Every entry other than 'mimetype' and 'manifest.json' appears in manifest.documents or manifest.resources.

PK-6MUSTPath safetyBUS-1 16.4

Procedure. Inspect every archive entry name.

Pass. No entry is absolute, contains a '..' segment, or resolves outside the package root.

PK-7MUSTIdentifier uniquenessBUS-1 6.2

Procedure. Collect every entity id in the package.

Pass. No id occurs twice.

PK-8MUSTReferential closureBUS-1 9.2

Procedure. Resolve every reference in the package: relationship subject and object, deviceRef, networkRef, targetOf, appliesToRef, scheduleRef, deployment.controllerRef, port mapsTo.assetRef, ChangeRecord subject, and every other IdRef-typed field defined by the core schema. Derive the field list from the schema rather than from this sentence: v0.3 added three reference fields that a hand-maintained list did not catch.

Pass. Every reference resolves to an entity present in the package, or to an entity explicitly declared external in the manifest.

PK-9MUSTExtension declarationBUS-1 15.3

Procedure. Collect every namespace prefix used in type names, predicates and extension keys.

Pass. Every non-bus prefix is declared in manifest.extensions.

PK-10MUSTCompleteness declarationBUS-1 16.6

Procedure. Inspect manifest.completeness.domains.

Pass. All twelve substrate domains are present, and every domain in state partial or absent carries a reason.

PK-11SHOULDProfile supportBUS-1 2.3

Procedure. Compare the declared profile against the domains actually populated.

Pass. Every domain required by the declared profile is in state complete or partial, not absent.

PK-12MUSTProperty definition coverageBUS-1 7.8

Procedure. Collect every property value in the package and resolve its definition.

Pass. Every property value references a bus:PropertyDefinition present in the package. No bare key-value property data appears anywhere.

PK-13MUSTProperty value agrees with its definitionBUS-1 7.8

Procedure. For each property value, compare its shape against the declared datatype and unit.

Pass. Quantity values carry the unit declared by the definition; string, number and enum values match their declared datatype.

PK-14MUSTPresentation referential integrityBUS-1 13

Procedure. Resolve every element drawing and layer, every layer drawing, every represents and navigatesTo, and every binding element and target.

Pass. All resolve. Every element's layer belongs to the same drawing as the element. Every navigatesTo names a drawing.

PK-15MUSTActuation declaration is accurateBUS-1 16.7

Procedure. Count write and readWrite bindings and compare against manifest.actuation.

Pass. present matches whether any write binding exists; bindingCount and highestPriority match the content. A package containing write bindings and declaring actuation absent fails.

PK-16MUSTWrite bindings are well formedBUS-1 13.7

Procedure. For each write binding, inspect its write block and its target.

Pass. A command priority is declared, the target point is writable, the priority is within the target's declared priority model, and any constraintRef or interlockRef resolves to a bus:Constraint.

PK-17SHOULDDrawing scale is checkableBUS-1 13.3

Procedure. Inspect each drawing for a reference dimension.

Pass. A reference dimension is present and its stated length agrees with the distance between its two drawing coordinates under the declared units.

PK-18MUSTPort names are unique within an assetBUS-1 9.4.2, Requirement 9.4-1

Procedure. For every bus:Asset carrying ports, compare the port names in the array.

Pass. No asset declares two ports with the same name. JSON Schema cannot express uniqueness over a field of an array item, so this is the only check that enforces it — and PK-21 is undecidable without it, because a subjectPort could match two ports at once. Note that direction and medium are required by the schema and therefore already graded by PK-3.

PK-19MUSTPaired and mapped ports resolveBUS-1 9.4.2

Procedure. For every port carrying pairedWith or mapsTo, resolve the target.

Pass. pairedWith names another port on the same asset. mapsTo names an asset that exists in the package and a port that asset declares. An unresolvable pairing is reported, not repaired.

PK-20MUSTPort medium agrees with relationship mediumBUS-1 9.4.3, Requirement 9.4-2

Procedure. For every relationship naming a port at either end, compare the relationship's medium with the medium of the named port.

Pass. They are equal. A relationship carrying chilled water into a port declared for air is reported: it is the signature of a mis-wired export and is invisible without ports.

PK-21MUSTNamed ports are declared portsBUS-1 9.4.3, Requirement 9.4-1

Procedure. For every relationship carrying subjectPort or objectPort, look for a matching Port.name on the endpoint asset.

Pass. Every named port is declared by the asset at that end of the relationship. A port name matching nothing is a package error. Scoped per 18.3.1: the check applies to an endpoint that declares ports, so a v0.2 package — which cannot declare any — neither fails nor is exempted by special case.

PK-22MUSTFigures conform to the bus-vector-1 profileBUS-1 13.4.3

Procedure. Parse every figure source. Compare its elements and attributes against bus-vector-profile.json.

Pass. Every figure is well-formed XML, declares a viewBox, contains no element outside the permitted list, contains no reference resolving outside the figure, carries no CSS, and is within the nesting and element ceilings of VEC-5. Scoped per 18.3.1: a package declaring busVersion 0.2 is not graded on a profile that did not exist when it was written. A receiver still refuses to render a figure that violates 19.3, which is a rendering refusal and not a package refusal.

PK-23MUSTNetwork references resolveBUS-1 8.10.3

Procedure. For every TelemetryBinding carrying networkRef, resolve it.

Pass. It names a bus:Network in the package. A binding pointing at a network the package does not contain is reported.

PK-24SHOULDProtocol tokens are spelled from the registryBUS-1 8.10.2

Procedure. Compare every protocol token against bus-protocols.json.

Pass. A token that matches a registered token case-insensitively but not exactly is reported — 'BACnet/IP' where 'bacnet' is registered. An unregistered token is NOT a failure: the registry is open and an unknown protocol MUST be preserved.

PK-25SHOULDSequences declare whether they are designed or deployedBUS-1 10.5

Procedure. For every bus:Sequence, look for a deployment block.

Pass. The block is present and its state is asDesigned, asDeployed or unknown. Absence is reported: it is the case where a reader cannot tell whether they are looking at the submittal or at what the controller runs.

PK-26MUSTDeployment controller references resolveBUS-1 10.5.1

Procedure. For every bus:Sequence carrying deployment.controllerRef, resolve it.

Pass. It names an entity in the package. PK-8 enumerates the reference fields it closes over and was not extended when this field was added, so without this check a sequence could name a controller that does not exist and pass the suite.

PK-27MUSTGeoreference forms agree and are non-degenerateBUS-1 13.3

Procedure. For every georeference carrying the v0.3 affine form: compute the determinant of its linear part (a*e - b*d); where the anchor fields are also present, apply the affine to (atX, atY) and compare against the anchor's position, and compare the affine's rotation against the declared rotation.

Pass. The determinant is nonzero, every coefficient is finite, and where both forms are present they describe the same placement within the RT-18 tolerance. A singular transform maps the whole drawing onto a line, and two forms that disagree are a package contradicting itself — both package-visible, neither a matter of exporter knowledge. Applies only where the affine is present; both forms are OPTIONAL and an exporter that does not know a transform omits it (13.3).

PK-28SHOULDSignature envelopes parse and declare their coverageBUS-1 19.2, Requirement 19.2-1

Procedure. For every signature present in the manifest's signatures slot, parse the envelope.

Pass. It is a structurally valid detached JWS or CMS envelope and it covers the manifest bytes. Cryptographic verification is out of scope for a package test — the receiver holds no keys — but an envelope that does not parse, or that covers something other than the manifest, is decoration wearing a signature's clothes, and is reported. Absence of any signature is NOT a failure; 19.2-1 grades signing SHOULD.

RT — Round-trip reconstruction 28 tests · target: roundTrip

RT-1MUSTIdentity preservationBUS-1 6.4

Procedure. Compare the id of every entity in A with its counterpart in B.

Pass. Every id in A appears unchanged in B, or B contains a bus:IdentityMapping with equivalence 'same' linking the new id to the original. No entity is silently reidentified.

RT-2MUSTObject meaningBUS-1 8

Procedure. Compare type, pointKind, dataType, unit, range, enumeration, classifications and attributes for every entity.

Pass. All are preserved. Unit codes are preserved without conversion, or converted with the original code recorded in provenance.

RT-3MUSTRelationship graphBUS-1 9

Procedure. Construct the labeled directed graph of relationships in A and in B and test for isomorphism under the identity mapping from RT-1.

Pass. The graphs are isomorphic, including predicate, direction, medium and qualifiers. Inverse-form substitution is permitted; loss of a relationship is not.

RT-4MUSTIntent distinguishabilityBUS-1 10

Procedure. For each Objective, Target, Constraint, Schedule and SequenceReference in A, locate it in B.

Pass. The receiving system can still distinguish what should happen from what is happening and what happened. Constraints retain their constraintKind and bounds; schedules retain their recurrence and exceptions.

RT-5MUSTProvenance retentionBUS-1 14

Procedure. Compare provenance blocks and ChangeRecords.

Pass. assertedBy, assertedAt, method, source, confidence and approvals survive. The receiving system MAY add its own provenance; it MUST NOT overwrite the original.

RT-6MUSTUnknown extension preservationBUS-1 15.4

Procedure. Include in A an extension namespace the receiving system does not implement, with mustUnderstand false, attached to at least one entity of each core class.

Pass. Every extension value reappears in B byte-identical after canonicalization, and the namespace is still declared in B's manifest.

RT-7MUSTMust-understand refusalBUS-1 15.4

Procedure. Include in A an extension with mustUnderstand true that the receiving system does not implement.

Pass. The importer reports the import as incomplete and names the namespace. It MUST NOT report success, and it MUST still preserve the data.

RT-8MUSTResource integrityBUS-1 16.5

Procedure. Compare resource payloads and digests between A and B.

Pass. Included resources are byte-identical and digests match. Externally referenced resources retain their URI and digest.

RT-9MUSTTelemetry binding retentionBUS-1 8.6

Procedure. Compare the binding object of every point.

Pass. protocol, address, network and parameters are preserved verbatim, so acquisition can be re-established without rediscovery.

RT-10MUSTKnowledge retentionBUS-1 8.9

Procedure. Compare every KnowledgeNote and its attachment relationship.

Pass. Body text, noteKind, observedAt and the appliesTo relationship survive unaltered.

RT-11MUSTLifecycle continuityBUS-1 9.3

Procedure. In A, replace an asset and record bus:replaces and bus:replacedBy. Round-trip.

Pass. B retains both the superseded and the superseding entity and the replacement relationship, so history remains attributable across the change.

RT-12MUSTOmission honestyBUS-1 16.6

Procedure. Compare B's completeness declaration against what B actually contains, and against A.

Pass. Anything present in A but absent from B is declared in B's completeness block with a reason. Silent loss is a failure of this test even when every other test passes.

RT-13SHOULDIdempotenceBUS-1 17.5

Procedure. Import B and re-export as C.

Pass. C and B are identical after canonicalization. Drift between successive round trips indicates unstable identity or unstable ordering.

RT-14INFOScaleBUS-1 16.4

Procedure. Round-trip a package with at least 50000 points and 250000 relationships.

Pass. Report wall-clock export time, import time and peak memory. No pass or fail threshold is set in v0.1.

RT-15MUSTBinding preservationBUS-1 13.6

Procedure. Compare every binding in A with its counterpart in B: element, target, channel, direction, mapping, quality.

Pass. All survive. A binding lost, repointed, or reduced to a different channel is a failure, even where the graphic still renders.

RT-16MUSTCommand priority is not substitutedBUS-1 13.7

Procedure. Round-trip a write binding whose priority the receiving system does not natively support.

Pass. The priority is re-exported unchanged and the importer reported that it could not honor it. Silent substitution is a failure even though the graphic appears identical.

RT-17MUSTQuality behavior preservationBUS-1 13.6

Procedure. Compare the quality block of every binding.

Pass. staleAfter, onStale, onUnavailable and onOutOfService survive unchanged.

RT-18MUSTGeometry fidelityBUS-1 13.5

Procedure. Compare drawing coordinate systems, extents, layer purposes, and every element geometry and transform.

Pass. Coordinates agree within one part in 10000 of the drawing extent. The coordinate system, georeference, and layer purposes are unchanged.

RT-19MUSTSymbol role fallbackBUS-1 13.4

Procedure. Include an element whose leaf symbol role the receiving system does not implement but whose ancestor it does.

Pass. The receiver renders using the ancestor role and re-exports the original leaf role unchanged. Substituting the ancestor into the exported data is a failure.

RT-20MUSTBespoke figure preservationBUS-1 13.4

Procedure. Round-trip an element carrying a figure payload for which no symbol role applies.

Pass. The figure survives byte-identical after canonicalization and is rendered substantially as given rather than replaced by a library symbol.

RT-21MUSTProperty definitions surviveBUS-1 7.8

Procedure. Compare every property definition and every property value.

Pass. Definitions survive with their meaning text intact. No property is re-exported without its definition, and no definition is silently merged with another of the same name but different meaning.

RT-22MUSTAlarm configuration survivesBUS-1 11

Procedure. Compare every alarm definition: limits, deadband, delays, priority, acknowledgment, shelving and routing.

Pass. All survive. Routing that the receiver cannot execute is preserved and reported as unenforced, not dropped.

RT-23MUSTEvents survive with their subjectsBUS-1 12

Procedure. Compare every event and its subject reference.

Pass. Event kind, timestamps, actor, values and subject survive. An override event that loses its subject is a failure.

RT-24MUSTRevision continuityBUS-1 6.6

Procedure. Compare the versioning block of every entity across the round-trip.

Pass. Revision numbers are preserved or advanced, never reset. An entity re-exported at revision 1 having arrived at revision 4 is a failure.

RT-25MUSTPorts survive a round tripBUS-1 9.4

Procedure. Export, import, re-export. Compare ports on every asset.

Pass. Every port's name, direction and medium is unchanged, and every relationship still names the same ports. Reordering the array is permitted; renaming a port is not.

RT-26SHOULDNetwork structure survives a round tripBUS-1 8.10

Procedure. Export, import, re-export. Compare bus:Network entities and the bindings referencing them.

Pass. Networks appear with the same identifier and protocol, and the same bindings reference them. Collapsing two networks into one is a failure even where every binding still resolves.

RT-27MUSTDeployment state is not upgradedBUS-1 10.5.1

Procedure. Export, import, re-export a sequence whose deployment state is unknown.

Pass. The state is still unknown. A round trip that turns unknown into asDesigned has manufactured a claim about the building, which is the specific failure 10.5.1 names.

RT-28MUSTSeries survive a round trip byte-identicalBUS-2 7

Procedure. Export, import, re-export a package carrying series. Compare every bus:Series and every sample file between A and B.

Pass. Each sample file reappears byte-identical — the format has no permitted variation, so byte equality is the comparison rule — and each bus:Series survives with pointRef, coverage, sampling, aggregation, unitCode and rowCount unchanged. An importer stores samples however it likes; what it re-emits is the same bytes.

IM — Importer behavior 11 tests · target: importer

IM-1MUSTRejects a corrupt digestBUS-1 16.5

Procedure. Present a package in which one document digest does not match.

Pass. The importer refuses the package and names the failing path. Partial silent ingestion is a failure.

IM-2MUSTRejects an unknown major versionBUS-1 18.2

Procedure. Present a package whose busVersion has a higher major number.

Pass. The importer refuses and reports the version it supports.

IM-3MUSTAccepts an unknown minor versionBUS-1 18.2

Procedure. Present a package whose busVersion has the same major and a higher minor number.

Pass. The importer accepts it, preserves what it does not understand, and reports which constructs it ignored.

IM-4MUSTTolerates unknown enumeration membersBUS-1 18.3

Procedure. Present a package using an enumeration member added after the importer was built.

Pass. The importer preserves the value and does not coerce it to a default.

IM-5SHOULDReports a coverage summaryBUS-1 2.5

Procedure. Import a valid package.

Pass. The importer produces a machine-readable summary of entities ingested, entities preserved but not interpreted, and constructs not understood.

IM-6MUSTUnknown symbol role degrades rather than failsBUS-1 13.4

Procedure. Present an element with a symbol role several levels deeper than the importer implements.

Pass. The importer walks the dotted path upward, renders at the deepest ancestor it knows, and preserves the original role. Refusing the package or dropping the element is a failure.

IM-7MUSTReports unenforceable actuationBUS-1 13.7

Procedure. Present write bindings whose priority model, interlock, or confirmation requirement the importer cannot enforce.

Pass. Each is named in the import report as unenforced. Importing them as ordinary writes without report is a failure.

IM-8MUSTRefuses undefined propertiesBUS-1 7.8

Procedure. Present a package containing a property value whose definition is absent.

Pass. The importer reports the package as invalid and names the property. Accepting it as an untyped string is a failure.

IM-9MUSTPreserves unknown protocol tokensBUS-1 8.10.2

Procedure. Import a package whose TelemetryBinding carries a protocol token outside the registry, then re-export.

Pass. The token survives byte-for-byte. An importer that normalizes an unknown protocol to a known one, or drops the binding, has failed.

IM-10SHOULDPreserves ports it does not modelBUS-1 9.4

Procedure. Import a package declaring ports into a system with no port concept, then re-export.

Pass. The ports reappear, or the re-export declares the relevant domain partial with a reason. Silent loss is the failure this test exists for.

IM-11MUSTRefuses an unsafe figureBUS-1 19.3

Procedure. Present a package containing a figure with a script element, a foreignObject, or an href resolving outside the figure.

Pass. The importer refuses the figure and says why. Silently stripping the offending element is a failure: the exporter is not told its package is invalid, and the next receiver may not strip it.

EX — Exporter behavior 11 tests · target: exporter

EX-1MUSTExports without a live vendor dependencyBUS-1 2.4

Procedure. Produce a package and inspect it for references that can only be resolved by the exporting vendor.

Pass. Every reference is either resolvable inside the package or is a durable external locator with a digest. No reference requires a proprietary service to interpret.

EX-2MUSTIdentifier stability across exportsBUS-1 6.4

Procedure. Export the same building twice with no intervening change.

Pass. Every entity id is identical in both exports.

EX-3MUSTIdentifier stability across changeBUS-1 6.4

Procedure. Rename an asset, then export again.

Pass. The id is unchanged and the rename appears as a ChangeRecord.

EX-4MUSTExport is not narrower than operationBUS-1 2.4

Procedure. Compare the exported model against the model the system uses to operate the building.

Pass. No construct the system relies on to operate is omitted without a completeness declaration naming it.

EX-5SHOULDOwner-initiated exportBUS-1 2.2

Procedure. Attempt an export as an operator-role user without vendor assistance.

Pass. The export completes without vendor involvement, professional services, or a support ticket.

EX-6MUSTGraphics export is unaidedBUS-1 2.4

Procedure. Export a floor plan and an equipment graphic as an operator-role user.

Pass. Both export with geometry, roles and bindings intact, without vendor involvement or professional services. This is the test the rebuild tax is measured against.

EX-7MUSTProperty definitions are published, not invented per exportBUS-1 7.8

Procedure. Export the same building twice and compare property definition identifiers.

Pass. Definition identifiers are stable between exports. Regenerating identifiers each time defeats RT-21 and makes cross-package comparison impossible.

EX-8SHOULDDoes not invent portsBUS-1 9.4.3, Requirement 9.4-3

Procedure. Export from a system that records connection topology but not port structure.

Pass. Ports are absent. An exporter that synthesizes port names to fill the field has asserted something nobody knows, which 5.3.5 exists to prevent.

EX-9SHOULDDeclares intent partial when only design-time logic is exportedBUS-1 10.5.1, Requirement 10.5-2

Procedure. Export from a system holding both design sequences and running control programs, exporting only the former.

Pass. The manifest declares intent partial with reason notSupportedByExporter. An exporter that ships the submittal, declares intent complete, and leaves the running logic behind is technically conforming and materially false. Graded SHOULD despite the requirement being a MUST, because nothing in the package reveals what the exporting system also held: this is checked against the source system during certification, not by a receiver, and a receiver MUST NOT refuse on it.

EX-10SHOULDDeclares time series honestly when the historian is out of reachBUS-2 6.2

Procedure. Export from a system whose historian is unreachable, retention-limited, or partially excluded by the owner.

Pass. The timeSeries domain is declared partial or absent with the reason that is true: sourceUnavailable for a store that could not be reached, retentionExpired for data the window has purged, excludedByOwner for an interval withheld on instruction. Graded SHOULD because nothing in the package reveals what the exporter's historian held; this is checked against the source system during certification, and a receiver MUST NOT refuse on it.

EX-11MUSTSerializes or forks under concurrent authorityBUS-1 6.6.1

Procedure. Present concurrent updates for one entity from two systems to an exporter, then inspect what it emits.

Pass. Either one package whose revisions advanced under a single serialized writer, or two packages with distinct packageIds and the succession recorded per 16.9. One package advancing one revision counter under two authorities asserts an ordering nobody enforced, and fails. This test exists so that the single-writer assumption is a tested boundary rather than an escape hatch: an exporter cannot claim concurrency to exempt itself from the reconstruction tests, because handling concurrency correctly is itself the requirement.

TS — Time series 7 tests · target: package

TS-1MUSTSample files conform to bus-csv-1BUS-2 4

Procedure. Parse every file a bus:Series names against the bus-csv-1 grammar: encoding, line endings, the exact header, timestamp form and ordering, the value grammar, the quality vocabulary.

Pass. Every file parses with no violations. UTF-8 without a byte order mark, LF line endings, the header row exactly 'timestamp,value,quality', RFC 3339 UTC timestamps with the Z designator in non-decreasing order, values within the grammar for the point's dataType, quality tokens from the fixed vocabulary or empty, and the value field empty exactly where quality is missing.

TS-2MUSTSeries references resolveBUS-2 3.2, 5.2

Procedure. For every bus:Series, resolve pointRef against the package's entities and resourceRef against manifest.resources and the archive.

Pass. pointRef names a bus:Point in the package. resourceRef names a manifest resource whose path exists in the archive, so its digest was verified by PK-4 before any row was read. A series naming a point or a file the package does not contain is a package error.

TS-3MUSTRow count is accurateBUS-2 3.3

Procedure. Count the data rows of every sample file and compare with the declaring series.

Pass. Series.rowCount equals the rows in the file, excluding the header. A mismatch is the signature of a truncated or padded export, and the declared count is what makes it detectable — the same mechanism as the actuation declaration (PK-15).

TS-4MUSTCoverage encloses the dataBUS-2 3.3

Procedure. Compare the first and last timestamps of every sample file with the declaring series' coverage interval.

Pass. Every row's timestamp lies within [coverage.start, coverage.end]. Coverage MAY be wider than the data — an exported period that held no samples — and MUST NOT be narrower.

TS-5MUSTSeries unit names the point's quantityBUS-2 3.4

Procedure. For every series whose point carries a unitCode, resolve both codes against the quantity families of bus-units.json.

Pass. The series unit and the point unit name the same quantity. A series in kPa on a temperature point is a mis-wired export, visible to any receiver, and stating the unit in both places is what makes it detectable.

TS-6SHOULDSeries unit code equals the point'sBUS-2 3.4

Procedure. For every series whose point carries a unitCode, compare the two codes for equality.

Pass. They are equal. Where they differ, the samples are in the series' unit, the disagreement is a true fact about the source system — a historian that kept degF after the point was re-configured to degC — and it is reported, never repaired by conversion (BUS-1 7.4-1). Graded SHOULD because a true statement about the source is not a contradiction in the package.

TS-7MUSTDeclared history agrees with carried seriesBUS-2 6.2

Procedure. Where the timeSeries domain is declared complete, compare each point's history declaration (BUS-1 8.8) with the series that carry it.

Pass. Every point declaring history available has at least one series, and the union of its series' coverage encloses the declared from/to extent. Both statements are the exporter's own, in one package; a package that declares completeness its own point declarations contradict is internally inconsistent, which is what MUST grades. A domain declared partial or absent is not graded here.

Machine-readable: bus-conformance-tests.json