2 Conformance§
AGREED The grading rule and the withdrawal of the v0.2 dispensation are settled. The tests themselves are as new as the part.
2.1 Requirement keywords and targets§
Requirement keywords are used per BCP 14 [RFC2119] [RFC8174], capitalized exactly as in BUS-1 2.1. The conformance targets — package, exporter, importer, round-trip — are BUS-1 2.2’s, and profiles remain floors, not ceilings (BUS-1 2.3).
2.2 The full profile§
The full profile names the timeSeries domain, and through v0.2 that domain was specified by nothing, so BUS-1 2.3 carried a dispensation: declare it absent with reason deferredToLaterVersion and claim full anyway. This part withdraws it. The domain is specified, deferredToLaterVersion is no longer a true statement about it, and an absent timeSeries domain now requires a real reason under BUS-1 16.6 like any other absent domain — clause 6 says which reasons are honest where.
A claim of full is tested against the group TS tests of this clause in addition to the Annex A groups of BUS-1. An implementation already claiming a lower profile is unaffected: timeSeries is not a domain of core, core-intent, or core-intent-knowledge, and carrying series at those profiles is permitted and simply untested.
2.3 Group TS§
Group TS tests a package, statically, with neither system present — the same discipline as group PK. The grading rule is BUS-1 Annex A’s: a contradiction visible in the package is MUST, a judgment about what the exporter knew is SHOULD, and an importer never refuses on a SHOULD.
| ID | Grade | Test and pass criterion |
|---|---|---|
TS-1 | MUST | Sample files conform to bus-csv-1 (BUS-2 4). 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-2 | MUST | Series references resolve (BUS-2 3.2, 5.2). 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-3 | MUST | Row count is accurate (BUS-2 3.3). 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-4 | MUST | Coverage encloses the data (BUS-2 3.3). 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-5 | MUST | Series unit names the point's quantity (BUS-2 3.4). 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-6 | SHOULD | Series unit code equals the point's (BUS-2 3.4). 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-7 | MUST | Declared history agrees with carried series (BUS-2 6.2). 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. |
Two tests live in BUS-1’s own groups because that is where their targets are: RT-28 (MUST) requires that series survive a round trip byte-identical — clause 7 states the comparison rule it applies — and EX-10 (SHOULD) grades the honesty of the completeness declaration against the source system, which only certification can see.
NOTE A machine-readable form of every test in this clause is distributed in bus-conformance-tests.json, the same file that carries BUS-1’s suite. One artifact, one grading vocabulary, one profile table.