The test suite
56 tests across four 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.
PK — Package validity 17 tests · target: package
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.
Procedure. Read manifest.json at the package root and validate against bus-manifest.schema.json.
Pass. The manifest exists and validates with no errors.
Procedure. Validate every file listed in manifest.documents against bus-document.schema.json.
Pass. Every listed document exists and validates with no errors.
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.
Procedure. Enumerate all archive entries.
Pass. Every entry other than 'mimetype' and 'manifest.json' appears in manifest.documents or manifest.resources.
Procedure. Inspect every archive entry name.
Pass. No entry is absolute, contains a '..' segment, or resolves outside the package root.
Procedure. Collect every entity id in the package.
Pass. No id occurs twice.
Procedure. Resolve every subject, object, deviceRef, targetOf, appliesToRef, scheduleRef and ChangeRecord subject.
Pass. Every reference resolves to an entity present in the package, or to an entity explicitly declared external in the manifest.
Procedure. Collect every namespace prefix used in type names, predicates and extension keys.
Pass. Every non-bus prefix is declared in manifest.extensions.
Procedure. Inspect manifest.completeness.domains.
Pass. All twelve substrate domains are present, and every domain in state partial or absent carries a reason.
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.
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.
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.
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.
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.
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.
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.
RT — Round-trip reconstruction 24 tests · target: roundTrip
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.
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.
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.
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.
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.
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.
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.
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.
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.
Procedure. Compare every KnowledgeNote and its attachment relationship.
Pass. Body text, noteKind, observedAt and the appliesTo relationship survive unaltered.
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.
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.
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.
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.
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.
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.
Procedure. Compare the quality block of every binding.
Pass. staleAfter, onStale, onUnavailable and onOutOfService survive unchanged.
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.
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.
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.
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.
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.
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.
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.
IM — Importer behavior 8 tests · target: importer
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.
Procedure. Present a package whose busVersion has a higher major number.
Pass. The importer refuses and reports the version it supports.
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.
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.
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.
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.
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.
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.
EX — Exporter behavior 7 tests · target: exporter
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.
Procedure. Export the same building twice with no intervening change.
Pass. Every entity id is identical in both exports.
Procedure. Rename an asset, then export again.
Pass. The id is unchanged and the rename appears as a ChangeRecord.
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.
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.
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.
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.
Machine-readable: bus-conformance-tests.json