diff --git a/sources/unitsml-36812-general/document.adoc b/sources/unitsml-36812-general/document.adoc index 044a4fa..cb692f1 100644 --- a/sources/unitsml-36812-general/document.adoc +++ b/sources/unitsml-36812-general/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 1: General — procedures, terms and conformance language += UnitsML general :docnumber: 36812 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36812:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 1: General — procedures, terms and conformance language +:script: Latn +:title: UnitsML specifications -- General :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -38,4 +43,4 @@ include::sections/aa-series-map.adoc[] include::sections/ab-test-suite.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36812-general/sections/00-foreword.adoc b/sources/unitsml-36812-general/sections/00-foreword.adoc index 9309edd..3a96a86 100644 --- a/sources/unitsml-36812-general/sections/00-foreword.adoc +++ b/sources/unitsml-36812-general/sections/00-foreword.adoc @@ -2,4 +2,4 @@ This part of the UnitsML specification series establishes the register procedures, the normative vocabulary, the artifact discipline and the release procedures that every other part assumes. It is the root of the series: every other part cites it for requirement language and procedures and carries no duplicate of that content. -The series is developed within the UnitsML program. The program dependency graph and stage gates are tracked in unitsml/unitsml-ruby#95. This edition restructures the series to the ISO document pattern: scope, normative references, terms, conventions, technical clauses with worked examples and expected outcomes, a conformance clause, and informative test-suite annexes. +The series is developed within the UnitsML program. The program dependency graph and stage gates are tracked in unitsml/unitsml-ruby#95. The series is specified in the ribose document flavor: each part states its model normatively (LML where the content is a data model, PARG where it is a grammar), carries worked examples with expected outcomes, and is gated by the register validator and the frozen corpora. diff --git a/sources/unitsml-36812-general/sections/01-scope.adoc b/sources/unitsml-36812-general/sections/01-scope.adoc index 99fd93a..0946c83 100644 --- a/sources/unitsml-36812-general/sections/01-scope.adoc +++ b/sources/unitsml-36812-general/sections/01-scope.adoc @@ -3,7 +3,7 @@ This document specifies: - the procedures of the UnitsML specification register: document numbering, types, lifecycle and amendment rules; -- the normative vocabulary of the series and the requirement language (MUST/SHOULD/MAY); +- the normative vocabulary of the series and the binding of statements to conformance classes; - the artifact discipline: checksums, editions, and the binding between normative parts and their conformance corpora; - the release and distribution procedures for the data register and its downstream packages. diff --git a/sources/unitsml-36812-general/sections/02-norm-refs.adoc b/sources/unitsml-36812-general/sections/02-normrefs.adoc similarity index 70% rename from sources/unitsml-36812-general/sections/02-norm-refs.adoc rename to sources/unitsml-36812-general/sections/02-normrefs.adoc index 1c6a73c..3f52c9b 100644 --- a/sources/unitsml-36812-general/sections/02-norm-refs.adoc +++ b/sources/unitsml-36812-general/sections/02-normrefs.adoc @@ -3,7 +3,5 @@ The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. -* [[[rfc2119,nofetch(RFC 2119)]]], _Key words for use in RFCs to Indicate Requirement Levels_ -* [[[rfc8174,nofetch(RFC 8174)]]], _Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words_ * [[[jcgm200,JCGM 200:2012]]], _International vocabulary of metrology — Basic and general concepts and associated terms (VIM)_ * [[[jcgm100,JCGM 100:2008]]], _Evaluation of measurement data — Guide to the expression of uncertainty in measurement (GUM)_ diff --git a/sources/unitsml-36812-general/sections/03-terms.adoc b/sources/unitsml-36812-general/sections/03-terms.adoc index 566841e..8ff614d 100644 --- a/sources/unitsml-36812-general/sections/03-terms.adoc +++ b/sources/unitsml-36812-general/sections/03-terms.adoc @@ -2,8 +2,6 @@ For the purposes of this document, the following terms and definitions apply. -ISO and IEC maintain terminology databases for use in standardization at https://www.iso.org/obp and https://www.iec.ch/harmonized-terminology-database. - artifact:: versioned, checksummed, language-independent file produced from a normative source (grammar, register, schema, corpus) and consumed by implementations without modification. Artifact bytes are authoritative; consumers verify checksums before use. diff --git a/sources/unitsml-36812-general/sections/04-conventions.adoc b/sources/unitsml-36812-general/sections/04-conventions.adoc index c7826f9..5b4cc5d 100644 --- a/sources/unitsml-36812-general/sections/04-conventions.adoc +++ b/sources/unitsml-36812-general/sections/04-conventions.adoc @@ -1,8 +1,8 @@ == Conventions -The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, and OPTIONAL are to be interpreted as described in RFC 2119 and RFC 8174. A requirement binds an implementation only within the conformance class it claims (CalConnect 36819). +Normative statements are declarative: the document states what implementations do and what invariants hold, and an implementation that does otherwise does not conform. A statement binds an implementation only within the conformance class it claims (CalConnect 36819). [example] -A TypeScript runtime that replays the parse/render and conversion corpora but no evaluator vectors claims class `quantity-conversion`; it MAY not advertise evaluation. +A TypeScript runtime that replays the parse/render and conversion corpora but no evaluator vectors claims class `quantity-conversion`; it does not advertise evaluation. Single-source normativity: a normative rule is stated in exactly one part of the series; other parts cite it. Restating a rule from another part is an editorial defect corrected on sight. diff --git a/sources/unitsml-36812-general/sections/06-conformance-language.adoc b/sources/unitsml-36812-general/sections/06-conformance-language.adoc index 72a0196..60399ab 100644 --- a/sources/unitsml-36812-general/sections/06-conformance-language.adoc +++ b/sources/unitsml-36812-general/sections/06-conformance-language.adoc @@ -1,6 +1,6 @@ == Conformance language -MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, OPTIONAL per RFC 2119/8174. +Statements are declarative; requirement strength comes from precision and from the corpus vectors that test them. [example] -*Interpretation.* "Conversions with `exact="true"` MUST be computed in exact rational arithmetic" (CalConnect 36816: an implementation returning 0.1 as a binary float for a declared-exact tenth is non-conforming, and the violation is detectable by byte comparison of the serialized decimal string. +*Interpretation.* "Conversions with `exact="true"` are computed in exact rational arithmetic" (CalConnect 36816: an implementation returning 0.1 as a binary float for a declared-exact tenth is non-conforming, and the violation is detectable by byte comparison of the serialized decimal string. diff --git a/sources/unitsml-36812-general/sections/07-artifact-discipline.adoc b/sources/unitsml-36812-general/sections/07-artifact-discipline.adoc index c96f3e6..8914465 100644 --- a/sources/unitsml-36812-general/sections/07-artifact-discipline.adoc +++ b/sources/unitsml-36812-general/sections/07-artifact-discipline.adoc @@ -1,6 +1,6 @@ == Artifact discipline -Every artifact carries a checksum; consumers MUST verify it before load. Every artifact records its edition (source revision and generation date). Grammars, the register dataset, model schemas and corpora are artifacts; per-language engines are not. A change to artifact content regenerates the artifact and its conformance corpus in the same change. +Every artifact carries a checksum; consumers verify it before load. Every artifact records its edition (source revision and generation date). Grammars, the register dataset, model schemas and corpora are artifacts; per-language engines are not. A change to artifact content regenerates the artifact and its conformance corpus in the same change. [example] *Expected outcome.* The asciiunits artifact ships `artifacts/unitsml.json` with a checksum file. A consumer loading the artifact with a stale checksum aborts with a typed load error — not a warning — because grammar and behavior are bound to the bytes. diff --git a/sources/unitsml-36812-general/sections/99-bibliography.adoc b/sources/unitsml-36812-general/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36812-general/sections/99-bibliography.adoc rename to sources/unitsml-36812-general/sections/98-bibliography.adoc diff --git a/sources/unitsml-36812-general/sections/ab-test-suite.adoc b/sources/unitsml-36812-general/sections/ab-test-suite.adoc index b3244ba..a278e22 100644 --- a/sources/unitsml-36812-general/sections/ab-test-suite.adoc +++ b/sources/unitsml-36812-general/sections/ab-test-suite.adoc @@ -3,10 +3,10 @@ == Annex B (informative): additional test-suite examples [example] -*Release-chain integrity.* After the worked release of Clause 8, a consumer pinning `unitsdb@0.1.2` MUST observe: 178 currencies; `getById("cur:EUR")` → Euro (ISO numeric 978); the joule's `quantity_references` containing exactly one `primary: true` entry, `NISTq17` (energy); and 6 quantities carrying `equivalence_class: "energy"`. +*Release-chain integrity.* After the worked release of Clause 8, a consumer pinning `unitsdb@0.1.2` observes: 178 currencies; `getById("cur:EUR")` → Euro (ISO numeric 978); the joule's `quantity_references` containing exactly one `primary: true` entry, `NISTq17` (energy); and 6 quantities carrying `equivalence_class: "energy"`. [example] -*Checksum failure.* Modifying one byte of `artifacts/unitsml.json` without regenerating `checksums` MUST abort the load with the typed checksum error in every runtime. +*Checksum failure.* Modifying one byte of `artifacts/unitsml.json` without regenerating `checksums` aborts the load with the typed checksum error in every runtime. [example] -*Amendment trace.* A reader of Published CalConnect 36814 following an amendment MUST find the Amendment entry referenced from the part's revision history; an unamended content change between releases is a register defect. +*Amendment trace.* A reader of Published CalConnect 36814 following an amendment finds the Amendment entry referenced from the part's revision history; an unamended content change between releases is a register defect. diff --git a/sources/unitsml-36813-numeric/document.adoc b/sources/unitsml-36813-numeric/document.adoc index 692ed9a..8b8471e 100644 --- a/sources/unitsml-36813-numeric/document.adoc +++ b/sources/unitsml-36813-numeric/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 2: Numeric and serialization contract += UnitsML numeric contract :docnumber: 36813 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36813:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 2: Numeric and serialization contract +:script: Latn +:title: UnitsML specifications -- Numeric Contract :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -38,4 +43,4 @@ include::sections/10-conformance.adoc[] include::sections/ab-test-suite.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36813-numeric/sections/02-norm-refs.adoc b/sources/unitsml-36813-numeric/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36813-numeric/sections/02-norm-refs.adoc rename to sources/unitsml-36813-numeric/sections/02-normrefs.adoc diff --git a/sources/unitsml-36813-numeric/sections/05-exact-arithmetic.adoc b/sources/unitsml-36813-numeric/sections/05-exact-arithmetic.adoc index 5a79f2b..22e7433 100644 --- a/sources/unitsml-36813-numeric/sections/05-exact-arithmetic.adoc +++ b/sources/unitsml-36813-numeric/sections/05-exact-arithmetic.adoc @@ -1,8 +1,8 @@ == Exact rational arithmetic -Conversions declared `exact="true"` (CalConnect 36816, scale and difference arithmetic (CalConnect 36815, Type A statistics, and all rational operations of propagation MUST be computed in exact rational arithmetic. An implementation MUST NOT round an intermediate exact value. +Conversions declared `exact="true"` (CalConnect 36816, scale and difference arithmetic (CalConnect 36815, Type A statistics, and all rational operations of propagation are computed in exact rational arithmetic; an implementation never rounds an intermediate exact value. -Irrational results — square roots of non-square rationals, Student-t quantiles — MUST be computed by the declared algorithm of Clause 7 or refused. An implementation MUST NOT produce them through a floating-point shortcut. +Irrational results — square roots of non-square rationals, Student-t quantiles — are computed by the declared algorithm of Clause 7 or refused — never through a floating-point shortcut. [example] *Expected outcome.* Converting 32 °F to kelvin: the factor 5/9 and the offset arithmetic run in rationals; the serialized result is exactly `"273.15"`. A float path would emit platform-dependent digits at the tail. diff --git a/sources/unitsml-36813-numeric/sections/06-decimal-strings.adoc b/sources/unitsml-36813-numeric/sections/06-decimal-strings.adoc index 00109a6..5d94ac3 100644 --- a/sources/unitsml-36813-numeric/sections/06-decimal-strings.adoc +++ b/sources/unitsml-36813-numeric/sections/06-decimal-strings.adoc @@ -1,12 +1,12 @@ == Decimal-string representation -Numbers crossing a serialization boundary MUST be decimal strings. IEEE-754 values MUST NOT appear in any artifact, corpus or API result of this series. Decimal strings preserve: +Numbers crossing a serialization boundary are decimal strings. IEEE-754 values never appear in any artifact, corpus or API result of this series. Decimal strings preserve: - the author's text verbatim in record positions — rounding is the author's act (JCGM 100:2008, 7.2.2); - the exact rational value elsewhere: integer strings for integral rationals, `p/q` rationals where the register uses them, and fixed-decimal strings with declared guard digits for non-exact results. [example] -*Verbatim preservation.* The author writes `2.10`; the record, every render and every vector carry `"2.10"`. `"2.1"` is a different author text and MUST NOT replace it. +*Verbatim preservation.* The author writes `2.10`; the record, every render and every vector carry `"2.10"`. `"2.1"` is a different author text and never replaces it. [example] *Register rationals.* The register carries the litre as `factor: '0.001'` and degree Fahrenheit as `factor: 5/9`, `offset: 229835/900` — exact by construction. Conforming conversions reproduce these strings on round-trip. diff --git a/sources/unitsml-36813-numeric/sections/07-t-quantile.adoc b/sources/unitsml-36813-numeric/sections/07-t-quantile.adoc index c01ae5f..87deeef 100644 --- a/sources/unitsml-36813-numeric/sections/07-t-quantile.adoc +++ b/sources/unitsml-36813-numeric/sections/07-t-quantile.adoc @@ -1,6 +1,6 @@ == The t-quantile algorithm -Coverage factors from the Student-t distribution at probability p with ν degrees of freedom MUST be computed by Newton iteration on the regularized incomplete beta function at fixed precision, with a published monotone error bound. The algorithm identity and version MUST be stamped in every result and vector metadata (`numeric_algorithm`). +Coverage factors from the Student-t distribution at probability p with ν degrees of freedom are computed by Newton iteration on the regularized incomplete beta function at fixed precision, with a published monotone error bound. The algorithm identity and version are stamped in every result and vector metadata (`numeric_algorithm`). [example] *Expected outcome.* For p = 0.95, ν = 16: k = 2.119905…, published to the vector's declared decimals with `numeric_algorithm: "unitsml-t-newton-1"`. A conforming TypeScript runtime emits the same bytes as the Ruby reference for the same stamp. Substituting a table-based or library quantile without restamping is non-conforming. diff --git a/sources/unitsml-36813-numeric/sections/08-rounding.adoc b/sources/unitsml-36813-numeric/sections/08-rounding.adoc index 7f02271..84bf89f 100644 --- a/sources/unitsml-36813-numeric/sections/08-rounding.adoc +++ b/sources/unitsml-36813-numeric/sections/08-rounding.adoc @@ -2,7 +2,7 @@ - Record nodes: no rounding by the implementation; author text is preserved verbatim. - Vectors: published at the fixed decimal places declared per vector. -- Presentation: rounding is a presentation decision and MUST NOT feed back into stored values. +- Presentation: rounding is a presentation decision and never feeds back into stored values. [example] *Interpretation.* An evaluator computing u_c = 34.1839… nm for a vector declaring three decimals publishes `"34.184"`; the stored record meanwhile keeps whatever text the author wrote. Neither the author text nor the vector is altered by the presentation layer's choice to display `34 µm`. diff --git a/sources/unitsml-36813-numeric/sections/09-serialization.adoc b/sources/unitsml-36813-numeric/sections/09-serialization.adoc index b633357..276517c 100644 --- a/sources/unitsml-36813-numeric/sections/09-serialization.adoc +++ b/sources/unitsml-36813-numeric/sections/09-serialization.adoc @@ -1,6 +1,6 @@ == Serialization contract -JSON output of conformance replays and evaluator APIs MUST be: UTF-8; fixed key order (lexicographic, defined once per schema); decimal strings for all numerics; stamped with `engine_version`, `grammar_version`, `vector_set_version`, `numeric_algorithm`. Two conforming implementations given the same input MUST emit byte-identical output. +JSON output of conformance replays and evaluator APIs are: UTF-8; fixed key order (lexicographic, defined once per schema); decimal strings for all numerics; stamped with `engine_version`, `grammar_version`, `vector_set_version`, `numeric_algorithm`. Two conforming implementations given the same input emit byte-identical output. [example] *Byte-identity.* Given the same conversion input, the Ruby and TypeScript runtimes emit identical JSON including key order and the trailing digits of `"127/25000"`-class rationals. Any byte difference is vector drift and blocks the release (CalConnect 36819). diff --git a/sources/unitsml-36813-numeric/sections/99-bibliography.adoc b/sources/unitsml-36813-numeric/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36813-numeric/sections/99-bibliography.adoc rename to sources/unitsml-36813-numeric/sections/98-bibliography.adoc diff --git a/sources/unitsml-36813-numeric/sections/ab-test-suite.adoc b/sources/unitsml-36813-numeric/sections/ab-test-suite.adoc index 90c0d64..857aae6 100644 --- a/sources/unitsml-36813-numeric/sections/ab-test-suite.adoc +++ b/sources/unitsml-36813-numeric/sections/ab-test-suite.adoc @@ -3,10 +3,10 @@ == Annex (informative): additional test-suite examples [example] -*Exact flag discipline.* `exact="false"` percent-per-degree (`0.5729577951308232087679815481`): the result carries the declared digits, the vector declares `tolerance_d`, and the output MUST NOT contain an `exact` marker. +*Exact flag discipline.* `exact="false"` percent-per-degree (`0.5729577951308232087679815481`): the result carries the declared digits, the vector declares `tolerance_d`, and the output contains no `exact` marker. [example] *No float leakage.* Grep gate: no serialized corpus artifact contains a decimal exponent form (`e-17`) originating from a binary double; guard-digit strings only. [example] -*Stamp integrity.* Two vectors with differing `numeric_algorithm` stamps MUST NOT be byte-compared against each other; the harness rejects the cross-stamp comparison. +*Stamp integrity.* Two vectors with differing `numeric_algorithm` stamps are never byte-compared against each other; the harness rejects the cross-stamp comparison. diff --git a/sources/unitsml-36814-unitsdb/document.adoc b/sources/unitsml-36814-unitsdb/document.adoc index c88a3bb..3d2d834 100644 --- a/sources/unitsml-36814-unitsdb/document.adoc +++ b/sources/unitsml-36814-unitsdb/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 3: UnitsDB — the register: data model and content rules += UnitsML UnitsDB register :docnumber: 36814 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36814:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 3: UnitsDB — the register: data model and content rules +:script: Latn +:title: UnitsML specifications -- Unitsdb Register :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -40,4 +45,4 @@ include::sections/aa-validation.adoc[] include::sections/ab-test-suite.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36814-unitsdb/sections/02-norm-refs.adoc b/sources/unitsml-36814-unitsdb/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36814-unitsdb/sections/02-norm-refs.adoc rename to sources/unitsml-36814-unitsdb/sections/02-normrefs.adoc diff --git a/sources/unitsml-36814-unitsdb/sections/05-collections.adoc b/sources/unitsml-36814-unitsdb/sections/05-collections.adoc index ae21457..21448a4 100644 --- a/sources/unitsml-36814-unitsdb/sections/05-collections.adoc +++ b/sources/unitsml-36814-unitsdb/sections/05-collections.adoc @@ -1,6 +1,6 @@ == Collections and identifiers -The register comprises `units.yaml`, `prefixes.yaml`, `dimensions.yaml`, `quantities.yaml`, `scales.yaml`, `unit_systems.yaml`, `currencies.yaml`. All collections in one release carry the SAME `schema_version`, quoted. Loaders treat units, prefixes, dimensions, quantities and unit systems as REQUIRED and currencies as OPTIONAL-IF-ABSENT; any collection that is present MUST match the uniform version. +The register comprises `units.yaml`, `prefixes.yaml`, `dimensions.yaml`, `quantities.yaml`, `scales.yaml`, `unit_systems.yaml`, `currencies.yaml`. All collections in one release carry the SAME `schema_version`, quoted. Loaders treat units, prefixes, dimensions, quantities and unit systems as required and currencies as optional-if-absent; any collection that is present matches the uniform version. [example] *Expected outcome.* A loader presented with units at 2.2.0 and currencies at 2.1.0 rejects the register with a version-mismatch error naming both files. A loader presented with no currencies file at all loads the five required collections and exposes an empty currency collection. diff --git a/sources/unitsml-36814-unitsdb/sections/06-schema-versioning.adoc b/sources/unitsml-36814-unitsdb/sections/06-schema-versioning.adoc index 862c04e..48f1be3 100644 --- a/sources/unitsml-36814-unitsdb/sections/06-schema-versioning.adoc +++ b/sources/unitsml-36814-unitsdb/sections/06-schema-versioning.adoc @@ -1,6 +1,6 @@ == Schema versioning policy -The schema version moves only by maintainer decision. Additive optional fields move the minor component; removals or semantic changes move the major component. A schema version MUST be supported by the register loader before a data release can adopt it (unitsdb-ruby ≥ 2.2.12 supports 2.2.0). +The schema version moves only by maintainer decision. Additive optional fields move the minor component; removals or semantic changes move the major component. A schema version is supported by the register loader before a data release can adopt it (unitsdb-ruby ≥ 2.2.12 supports 2.2.0). [example] *Expected outcome.* Schema 2.2.0 added exactly two optional fields — `primary` on unit quantity references and `equivalence_class` on quantities — and every collection moved 2.1.0 → 2.2.0 in one release, with the loader support released first (unitsdb-ruby 2.2.12). diff --git a/sources/unitsml-36814-unitsdb/sections/07-content-rules.adoc b/sources/unitsml-36814-unitsdb/sections/07-content-rules.adoc index 8ae26a7..252d767 100644 --- a/sources/unitsml-36814-unitsdb/sections/07-content-rules.adoc +++ b/sources/unitsml-36814-unitsdb/sections/07-content-rules.adoc @@ -2,18 +2,18 @@ === Canonical conversions -A unit whose derivation is mechanical MUST carry `canonical_conversion`: an exact rational `factor` (decimal or `p/q` string), an `offset` where the unit is affine, and the `root_units` decomposition the factor was computed over (REQUIRED). Units at powers other than 1, affine units inside composites, logarithmic units, and prefix-level units do not carry canonical data; the coverage report itemizes every unit as generated, derived-by-design, or source-needed with a reason. +A unit whose derivation is mechanical carries `canonical_conversion`: an exact rational `factor` (decimal or `p/q` string), an `offset` where the unit is affine, and the `root_units` decomposition the factor was computed over (present in every such record). Units at powers other than 1, affine units inside composites, logarithmic units, and prefix-level units do not carry canonical data; the coverage report itemizes every unit as generated, derived-by-design, or source-needed with a reason. [example] *Expected outcome.* foot per minute carries `factor: 127/25000` with `root_units` = foot × minute⁻¹; gram-force carries none and is reported "self-referential root_units — needs a sourced definition" (its 9.80665 value is source-needed, not derivable). === Scale operation legality -`scales.yaml` classifies scales and lists the operations each permits; consumers MUST take operation legality from this data (CalConnect 36815). +`scales.yaml` classifies scales and lists the operations each permits; consumers take operation legality from this data (CalConnect 36815). === Primary quantity reference -A unit with more than one `quantity_reference` MUST designate exactly one entry `primary: true`. Selection rule: the quantity in the SI Brochure definition where the unit has an SI special name (joule → energy, weber → magnetic flux, …); the explicitly curated first entry otherwise. The current register flags 96 units. +A unit with more than one `quantity_reference` designates exactly one entry `primary: true`. Selection rule: the quantity in the SI Brochure definition where the unit has an SI special name (joule → energy, weber → magnetic flux, …); the explicitly curated first entry otherwise. The current register flags 96 units. [example] *Expected outcome.* The joule's references list `NISTq17` with `primary: true`; every other entry is unflagged. A consumer rendering without an asserted kind emits "energy" — never "Lagrange function", which is merely a member of the reference list. diff --git a/sources/unitsml-36814-unitsdb/sections/99-bibliography.adoc b/sources/unitsml-36814-unitsdb/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36814-unitsdb/sections/99-bibliography.adoc rename to sources/unitsml-36814-unitsdb/sections/98-bibliography.adoc diff --git a/sources/unitsml-36814-unitsdb/sections/aa-validation.adoc b/sources/unitsml-36814-unitsdb/sections/aa-validation.adoc index adb27a6..5d48178 100644 --- a/sources/unitsml-36814-unitsdb/sections/aa-validation.adoc +++ b/sources/unitsml-36814-unitsdb/sections/aa-validation.adoc @@ -2,7 +2,7 @@ [appendix] == Annex A (normative): validation suite -The register MUST pass, per release: +The register passes, per release: - JSON-schema validation of every collection against `schemas/*-schema.yaml`; - identifier uniqueness (`unitsdb validate identifiers`); diff --git a/sources/unitsml-36815-units-model/document.adoc b/sources/unitsml-36815-units-model/document.adoc index 28c5116..5def6cb 100644 --- a/sources/unitsml-36815-units-model/document.adoc +++ b/sources/unitsml-36815-units-model/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 4: The units model — quantities, scales and the difference law += UnitsML units model :docnumber: 36815 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36815:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 4: The units model — quantities, scales and the difference law +:script: Latn +:title: UnitsML specifications -- Units Model :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -38,4 +43,4 @@ include::sections/10-conformance.adoc[] include::sections/aa-vectors.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36815-units-model/sections/02-norm-refs.adoc b/sources/unitsml-36815-units-model/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36815-units-model/sections/02-norm-refs.adoc rename to sources/unitsml-36815-units-model/sections/02-normrefs.adoc diff --git a/sources/unitsml-36815-units-model/sections/04-conventions.adoc b/sources/unitsml-36815-units-model/sections/04-conventions.adoc index 8d62400..dd5bcfe 100644 --- a/sources/unitsml-36815-units-model/sections/04-conventions.adoc +++ b/sources/unitsml-36815-units-model/sections/04-conventions.adoc @@ -1,3 +1,3 @@ == Conventions -Requirement language per CalConnect 36812. Kind identifiers resolve exactly as tokens; prose names are never syntax. Errors name the violated rule and the data involved (both kinds, or the scale class). +Statements are declarative. Kind identifiers resolve exactly as tokens; prose names are never syntax. Errors name the violated rule and the data involved (both kinds, or the scale class). diff --git a/sources/unitsml-36815-units-model/sections/06-resolution.adoc b/sources/unitsml-36815-units-model/sections/06-resolution.adoc index c801680..7f7fef2 100644 --- a/sources/unitsml-36815-units-model/sections/06-resolution.adoc +++ b/sources/unitsml-36815-units-model/sections/06-resolution.adoc @@ -1,6 +1,6 @@ == Quantity resolution -A value MAY assert one L1 quantity by identifier. The assertion MUST resolve against the register in the fixed order: `short` name → `unitsml` identifier (`q:…`) → `nist` identifier (`NISTq…`); resolution is exact-token; free-text names are never syntax. A stated kind MUST be a member of the resolved unit's `quantity_references` (CalConnect 36814). For register units with multiple references and no stated kind, the primary reference is the default; an unregistered composite falls back to the dimension check of Clause 8 only. +A value asserts at most one L1 quantity by identifier. The assertion resolves against the register in the fixed order: `short` name → `unitsml` identifier (`q:…`) → `nist` identifier (`NISTq…`); resolution is exact-token; free-text names are never syntax. A stated kind is a member of the resolved unit's `quantity_references` (CalConnect 36814). For register units with multiple references and no stated kind, the primary reference is the default; an unregistered composite falls back to the dimension check of Clause 8 only. [example] *Expected outcome.* `u:joule` without an assertion resolves to energy (`NISTq17`, the primary reference) — never "Lagrange function", which is merely a list member. `unit(J::torque)` is invalid: torque is not among the joule's references, though the dimensions match. `unit(N·m::torque)` is valid: the newton-metre record lists it. diff --git a/sources/unitsml-36815-units-model/sections/07-gating.adoc b/sources/unitsml-36815-units-model/sections/07-gating.adoc index ffa4d9b..a1b98ee 100644 --- a/sources/unitsml-36815-units-model/sections/07-gating.adoc +++ b/sources/unitsml-36815-units-model/sections/07-gating.adoc @@ -1,6 +1,6 @@ == Arithmetic gating -Addition and subtraction REQUIRE equal dimension vectors, and REQUIRE kind compatibility: identical L1 kinds, or kinds within one declared `equivalence_class` (CalConnect 36814). Multiplication, division and scaling compose dimensions and derive the result kind through the normalized register record (primary reference), falling back to dimension-only when no record matches. Strict conversion gating: dimension-compatible units with disjoint kinds MUST be rejected as conversions (Bq↔Hz, Sv↔Gy) unless the asserted kinds are compatible. +Addition and subtraction require equal dimension vectors and kind compatibility: identical L1 kinds, or kinds within one declared `equivalence_class` (CalConnect 36814). Multiplication, division and scaling compose dimensions and derive the result kind through the normalized register record (primary reference), falling back to dimension-only when no record matches. Strict conversion gating: dimension-compatible units with disjoint kinds are rejected as conversions (Bq↔Hz, Sv↔Gy) unless the asserted kinds are compatible. [example] *Expected outcome.* `unit(J::work) + unit(J::energy)` evaluates (one equivalence class). `unit(J::energy) + unit(N·m::torque)` raises a typed error naming both kinds — the classic blunder the gate exists to catch. `Bq → Hz` without stated kinds is rejected as a conversion. diff --git a/sources/unitsml-36815-units-model/sections/08-scales.adoc b/sources/unitsml-36815-units-model/sections/08-scales.adoc index f1b3dd0..c796052 100644 --- a/sources/unitsml-36815-units-model/sections/08-scales.adoc +++ b/sources/unitsml-36815-units-model/sections/08-scales.adoc @@ -1,6 +1,6 @@ == Scales and operation legality -Each scale class in `scales.yaml` lists its permitted operations; consumers MUST enforce exactly that list and MUST name the scale class in the error. The landed classes: `continuous_ratio` (+, −, scaling, ×, ÷, comparison), `continuous_interval` (+, −, comparison only), `logarithmic_ratio`, `logarithmic_field`, `discrete`. +Each scale class in `scales.yaml` lists its permitted operations; consumers enforce exactly that list and name the scale class in the error. The landed classes: `continuous_ratio` (+, −, scaling, ×, ÷, comparison), `continuous_interval` (+, −, comparison only), `logarithmic_ratio`, `logarithmic_field`, `discrete`. [example] *Expected outcome.* `10 °C × 2` is a specified scale error naming `continuous_interval`; `10 K × 2` is legal (`continuous_ratio`); `20 °C − 15 °C` is legal on both — differences are permitted wherever the scale permits subtraction. diff --git a/sources/unitsml-36815-units-model/sections/99-bibliography.adoc b/sources/unitsml-36815-units-model/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36815-units-model/sections/99-bibliography.adoc rename to sources/unitsml-36815-units-model/sections/98-bibliography.adoc diff --git a/sources/unitsml-36816-conversions/document.adoc b/sources/unitsml-36816-conversions/document.adoc index 8271a40..75d4d3b 100644 --- a/sources/unitsml-36816-conversions/document.adoc +++ b/sources/unitsml-36816-conversions/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 5: Conversions — definitions and application += UnitsML conversions :docnumber: 36816 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36816:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 5: Conversions — definitions and application +:script: Latn +:title: UnitsML specifications -- Conversions :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -40,4 +45,4 @@ include::sections/11-conformance.adoc[] include::sections/aa-vectors.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36816-conversions/sections/02-norm-refs.adoc b/sources/unitsml-36816-conversions/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36816-conversions/sections/02-norm-refs.adoc rename to sources/unitsml-36816-conversions/sections/02-normrefs.adoc diff --git a/sources/unitsml-36816-conversions/sections/06-exactness.adoc b/sources/unitsml-36816-conversions/sections/06-exactness.adoc index ea614e5..18fab97 100644 --- a/sources/unitsml-36816-conversions/sections/06-exactness.adoc +++ b/sources/unitsml-36816-conversions/sections/06-exactness.adoc @@ -1,6 +1,6 @@ == Exactness and digit metadata -`exact="true"` conversions MUST be computed in exact rational arithmetic (CalConnect 36813, with their lexical decimal attributes parsed exactly; an implementation MUST NOT route them through binary floating point. `exact="false"` or absent: the declared precision travels; implementations MUST NOT present the result as exact. Digit metadata — `multiplicandDigits`, `divisorDigits`, `initialAddendDecimalPlace`, `finalAddendDecimalPlace` — MUST be carried by data layers and MUST NOT be discarded on import. +`exact="true"` conversions are computed in exact rational arithmetic (CalConnect 36813, with their lexical decimal attributes parsed exactly; an implementation never routes them through binary floating point. `exact="false"` or absent: the declared precision travels, and the result is never presented as exact. Digit metadata — `multiplicandDigits`, `divisorDigits`, `initialAddendDecimalPlace`, `finalAddendDecimalPlace` — are carried by data layers and never discarded on import. [example] *Expected outcome.* Degree Fahrenheit carries factor 5/9 and offset 229835/900 in the register: 32 °F → K is exactly stem:[273.15], and the round-trip returns `"32"`-class exact values. Percent per degree carries the declared `0.5729577951308232087679815481` without an exact marker; its results are published at declared precision, never labelled exact. diff --git a/sources/unitsml-36816-conversions/sections/07-differences.adoc b/sources/unitsml-36816-conversions/sections/07-differences.adoc index 39adcb4..8b3b58b 100644 --- a/sources/unitsml-36816-conversions/sections/07-differences.adoc +++ b/sources/unitsml-36816-conversions/sections/07-differences.adoc @@ -1,6 +1,6 @@ == Difference application and affine legality -The difference law of CalConnect 36815 Clause 9 governs application: absolutes convert affinely; differences (including uncertainty magnitudes and interval-endpoint distances) convert by the factor b/c alone. Affine units MUST NOT appear inside composite expressions nor at powers ≠ 1; each is a specified error. +The difference law of CalConnect 36815 Clause 9 governs application: absolutes convert affinely; differences (including uncertainty magnitudes and interval-endpoint distances) convert by the factor b/c alone. Affine units never appear inside composite expressions nor at powers ≠ 1; each is a specified error. [example] *Expected outcome.* `(20 °C − 15 °C) → K` is `5 K`; an uncertainty magnitude `0.2 °C → K` is `0.2 K`; `degC^2` and `(degC)·(s)` are specified errors. The canonical register entries encode the same law structurally — `factor` with `offset` only for the affine unit at power 1. diff --git a/sources/unitsml-36816-conversions/sections/09-refusals.adoc b/sources/unitsml-36816-conversions/sections/09-refusals.adoc index 3680312..6a6428e 100644 --- a/sources/unitsml-36816-conversions/sections/09-refusals.adoc +++ b/sources/unitsml-36816-conversions/sections/09-refusals.adoc @@ -1,6 +1,6 @@ == Refusal semantics -`SpecialConversionFrom` and `WSDLConversionFrom` MUST be refused with typed errors naming the conversion and its kind. Approximating a non-linear conversion by a linear factor is non-conforming. Logarithmic units without canonical data (dB, Np, B) refuse conversion the same way ("no derivation path"). +`SpecialConversionFrom` and `WSDLConversionFrom` are refused with typed errors naming the conversion and its kind. Approximating a non-linear conversion by a linear factor is non-conforming. Logarithmic units without canonical data (dB, Np, B) refuse conversion the same way ("no derivation path"). [example] *Expected outcome.* Attempting `dBm → W` yields a typed refusal citing the logarithmic class; no numeric result is produced in any output format. diff --git a/sources/unitsml-36816-conversions/sections/99-bibliography.adoc b/sources/unitsml-36816-conversions/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36816-conversions/sections/99-bibliography.adoc rename to sources/unitsml-36816-conversions/sections/98-bibliography.adoc diff --git a/sources/unitsml-36817-asciiunits/document.adoc b/sources/unitsml-36817-asciiunits/document.adoc index a79a5e8..258b87c 100644 --- a/sources/unitsml-36817-asciiunits/document.adoc +++ b/sources/unitsml-36817-asciiunits/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 6: asciiunits — the unit expression content language += UnitsML asciiunits content language :docnumber: 36817 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36817:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 6: asciiunits — the unit expression content language +:script: Latn +:title: UnitsML specifications -- Asciiunits Content Language :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -38,4 +43,4 @@ include::sections/10-conformance.adoc[] include::sections/aa-test-suite.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36817-asciiunits/sections/02-norm-refs.adoc b/sources/unitsml-36817-asciiunits/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36817-asciiunits/sections/02-norm-refs.adoc rename to sources/unitsml-36817-asciiunits/sections/02-normrefs.adoc diff --git a/sources/unitsml-36817-asciiunits/sections/09-artifact.adoc b/sources/unitsml-36817-asciiunits/sections/09-artifact.adoc index 2aaf294..658e5a6 100644 --- a/sources/unitsml-36817-asciiunits/sections/09-artifact.adoc +++ b/sources/unitsml-36817-asciiunits/sections/09-artifact.adoc @@ -1,6 +1,6 @@ == The artifact contract -- The artifact carries a checksum set; every consuming runtime MUST verify checksums before load. +- The artifact carries a checksum set; every consuming runtime verifies checksums before load. - The artifact records its grammar edition; edition 2 carries grammar v2 (registered prefixed symbols, trailing-extender rejection). - Grammar edits regenerate the artifact AND the corpus in the same change; consumer-runtime CI (dependent-gems against unitsml-ruby) gates the regeneration. - The corpus: 143 cases covering every terminal class and every production of Clause 5, frozen byte-for-byte. diff --git a/sources/unitsml-36817-asciiunits/sections/99-bibliography.adoc b/sources/unitsml-36817-asciiunits/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36817-asciiunits/sections/99-bibliography.adoc rename to sources/unitsml-36817-asciiunits/sections/98-bibliography.adoc diff --git a/sources/unitsml-36818-xml-usage/document.adoc b/sources/unitsml-36818-xml-usage/document.adoc index 3ddbd46..4bd9c05 100644 --- a/sources/unitsml-36818-xml-usage/document.adoc +++ b/sources/unitsml-36818-xml-usage/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 7: UnitsML XML — the usage contract += UnitsML XML usage :docnumber: 36818 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36818:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 7: UnitsML XML — the usage contract +:script: Latn +:title: UnitsML specifications -- Xml Usage :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -42,4 +47,4 @@ include::sections/aa-validation.adoc[] include::sections/ab-proposal.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36818-xml-usage/sections/02-norm-refs.adoc b/sources/unitsml-36818-xml-usage/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36818-xml-usage/sections/02-norm-refs.adoc rename to sources/unitsml-36818-xml-usage/sections/02-normrefs.adoc diff --git a/sources/unitsml-36818-xml-usage/sections/05-emission.adoc b/sources/unitsml-36818-xml-usage/sections/05-emission.adoc index 68bf159..a17f9a6 100644 --- a/sources/unitsml-36818-xml-usage/sections/05-emission.adoc +++ b/sources/unitsml-36818-xml-usage/sections/05-emission.adoc @@ -1,6 +1,6 @@ == Emission contract -Producers MUST emit only elements and attributes the XSD defines, targeting the declared schema version. `xml:id` values are producer-allocated, unique per document, and stable across regenerations of the same input. The emitted element set: `Unit` (symbols, `unitSystem`, roots and prefixes, `dimensionURL`), `Prefix`, `Quantity` (names, symbols, `quantityType`, `dimensionURL`), `Dimension`, per-unit `QuantityReference` (0..*) and `Conversions` (0..1). `SpecialConversionFrom`/`WSDLConversionFrom` are never emitted synthetically. +Producers emit only elements and attributes the XSD defines, targeting the declared schema version. `xml:id` values are producer-allocated, unique per document, and stable across regenerations of the same input. The emitted element set: `Unit` (symbols, `unitSystem`, roots and prefixes, `dimensionURL`), `Prefix`, `Quantity` (names, symbols, `quantityType`, `dimensionURL`), `Dimension`, per-unit `QuantityReference` (0..*) and `Conversions` (0..1). `SpecialConversionFrom`/`WSDLConversionFrom` are never emitted synthetically. [example] *Expected outcome.* Regenerating the UnitsML for the same input yields byte-identical XML — same ids, same order, same attribute values. A producer whose regeneration flips element order or mints new ids is non-conforming. diff --git a/sources/unitsml-36818-xml-usage/sections/06-selection.adoc b/sources/unitsml-36818-xml-usage/sections/06-selection.adoc index 65dbf74..a76077f 100644 --- a/sources/unitsml-36818-xml-usage/sections/06-selection.adoc +++ b/sources/unitsml-36818-xml-usage/sections/06-selection.adoc @@ -1,6 +1,6 @@ == QuantityReference selection -`QuantityReference` is 0..* per unit; a producer MUST NOT emit positional order. Selection follows the CalConnect 36814 primary-reference rule: the `primary: true` entry when present; the caller's asserted kind when one is stated. +`QuantityReference` is 0..* per unit; a producer never emits positional order. Selection follows the CalConnect 36814 primary-reference rule: the `primary: true` entry when present; the caller's asserted kind when one is stated. [example] *Expected outcome.* A joule emitted against the current register resolves to `Quantity id="NISTq17"` (energy). A producer emitting `NISTq152` ("Lagrange function") from list position is non-conforming — the red member of the frozen vector pair. diff --git a/sources/unitsml-36818-xml-usage/sections/07-conversions.adoc b/sources/unitsml-36818-xml-usage/sections/07-conversions.adoc index b955034..608bb40 100644 --- a/sources/unitsml-36818-xml-usage/sections/07-conversions.adoc +++ b/sources/unitsml-36818-xml-usage/sections/07-conversions.adoc @@ -1,6 +1,6 @@ == Conversions emission -`Conversions` carries the full affine attribute set of CalConnect 36816 — `initialUnit`, `initialAddend`, `multiplicand`, `divisor`, `finalAddend`, `exact`, digit metadata — with decimal attributes as lexical strings. A producer MUST NOT emit a conversion whose definition it cannot reproduce; register factors are emitted with their exact strings. +`Conversions` carries the full affine attribute set of CalConnect 36816 — `initialUnit`, `initialAddend`, `multiplicand`, `divisor`, `finalAddend`, `exact`, digit metadata — with decimal attributes as lexical strings. A producer never emits a conversion whose definition it cannot reproduce; register factors are emitted with their exact strings. [example] *Expected outcome.* The degree Celsius emission carries `finalAddend="273.15" exact="true"`; the percent-per-degree emission carries its full declared decimal and no `exact` attribute. diff --git a/sources/unitsml-36818-xml-usage/sections/09-reading.adoc b/sources/unitsml-36818-xml-usage/sections/09-reading.adoc index 5c8c6b7..797df1c 100644 --- a/sources/unitsml-36818-xml-usage/sections/09-reading.adoc +++ b/sources/unitsml-36818-xml-usage/sections/09-reading.adoc @@ -1,6 +1,6 @@ == Reading rules and determinism -Readers MUST tolerate foreign-payload defects deterministically: duplicate lowercase attributes (the openCDD `finaladdend` beside `finalAddend`) are accepted with the camel-case value prevailing on read and never reproduced on write; unrecognized elements are skipped, not fatal; recognized names with malformed shapes are fatal. +Readers tolerate foreign-payload defects deterministically: duplicate lowercase attributes (the openCDD `finaladdend` beside `finalAddend`) are accepted with the camel-case value prevailing on read and never reproduced on write; unrecognized elements are skipped, not fatal; recognized names with malformed shapes are fatal. [example] *Expected outcome.* The known degree-Celsius payload defect (one duplicate attribute) is reported in the coverage report, accepted on read, and absent from every emission this series produces. diff --git a/sources/unitsml-36818-xml-usage/sections/99-bibliography.adoc b/sources/unitsml-36818-xml-usage/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36818-xml-usage/sections/99-bibliography.adoc rename to sources/unitsml-36818-xml-usage/sections/98-bibliography.adoc diff --git a/sources/unitsml-36819-conformance/document.adoc b/sources/unitsml-36819-conformance/document.adoc index 018f0d4..3727d6e 100644 --- a/sources/unitsml-36819-conformance/document.adoc +++ b/sources/unitsml-36819-conformance/document.adoc @@ -1,16 +1,21 @@ -= UnitsML — Part 8: Conformance — corpora, vector sets and runtime classes += UnitsML conformance :docnumber: 36819 :edition: 1 -:revdate: 2026-10-30 +:ref-docnumber: CC 36819:2026(E) :copyright-year: 2026 +:revdate: 2026-11-01 :language: en -:title-intro-en: UnitsML -:title-main-en: Part 8: Conformance — corpora, vector sets and runtime classes +:script: Latn +:title: UnitsML specifications -- Conformance :doctype: standard -:docstage: 20 -:mn-document-class: iso -:mn-output-extensions: xml,html,doc,pdf -:imagesdir: images +:status: draft-standard +:committee: CalConnect +:committee-type: technical +:mn-document-class: ribose +:docfile: document.adoc +:mn-output-extensions: xml,html,doc +:local-cache-only: +:data-uri-image: include::sections/00-foreword.adoc[] @@ -18,7 +23,7 @@ include::sections/00-introduction.adoc[] include::sections/01-scope.adoc[] -include::sections/02-norm-refs.adoc[] +include::sections/02-normrefs.adoc[] include::sections/03-terms.adoc[] @@ -44,4 +49,4 @@ include::sections/ac-annex-c.adoc[] include::sections/ad-annex-d.adoc[] -include::sections/99-bibliography.adoc[] +include::sections/98-bibliography.adoc[] diff --git a/sources/unitsml-36819-conformance/sections/02-norm-refs.adoc b/sources/unitsml-36819-conformance/sections/02-normrefs.adoc similarity index 100% rename from sources/unitsml-36819-conformance/sections/02-norm-refs.adoc rename to sources/unitsml-36819-conformance/sections/02-normrefs.adoc diff --git a/sources/unitsml-36819-conformance/sections/07-harness.adoc b/sources/unitsml-36819-conformance/sections/07-harness.adoc index c488966..8c5b438 100644 --- a/sources/unitsml-36819-conformance/sections/07-harness.adoc +++ b/sources/unitsml-36819-conformance/sections/07-harness.adoc @@ -1,3 +1,3 @@ == Replay harness requirements and CI gates -A conforming harness MUST: load and checksum-verify the corpora; replay every vector of every claimed class; compare bytes; and report drift per vector. Release CI MUST block on any drift. The reference harness lives in unitsml/unitsml-testsuite; parity runtimes (TypeScript, Rust) run the same corpora through their own lanes. +A conforming harness: load and checksum-verify the corpora; replay every vector of every claimed class; compare bytes; and report drift per vector. Release CI blocks on any drift. The reference harness lives in unitsml/unitsml-testsuite; parity runtimes (TypeScript, Rust) run the same corpora through their own lanes. diff --git a/sources/unitsml-36819-conformance/sections/08-classes.adoc b/sources/unitsml-36819-conformance/sections/08-classes.adoc index 716e379..45282da 100644 --- a/sources/unitsml-36819-conformance/sections/08-classes.adoc +++ b/sources/unitsml-36819-conformance/sections/08-classes.adoc @@ -21,7 +21,7 @@ Implementations are licensed to claim conformance as in <>. |all of the above plus round-trip guarantees (Plurimath 2, Annex A) |=== -Claims MUST name the class and the corpus version replayed. An implementation MUST NOT claim a class whose vectors it does not replay. +Claims name the class and the corpus version replayed; an implementation never claims a class whose vectors it does not replay. [example] *Expected claim shape.* "Conforming at class `quantity-conversion`, corpus v2026.10" licenses resolution, gating, scales and conversions — and says nothing about evaluation. diff --git a/sources/unitsml-36819-conformance/sections/09-reproducibility.adoc b/sources/unitsml-36819-conformance/sections/09-reproducibility.adoc index ff832da..5a84034 100644 --- a/sources/unitsml-36819-conformance/sections/09-reproducibility.adoc +++ b/sources/unitsml-36819-conformance/sections/09-reproducibility.adoc @@ -1,6 +1,6 @@ == Monte Carlo reproducibility classes -Byte-exact: vectors produced by the pinned Wichmann–Hill generator with recorded seed and trial count; the adaptive stopping δ = ½·10^ℓ is part of the vector. Distributional: for methods without deterministic draws (e.g. MCMC sampling, GUM-5 Ex 12), vectors carry statistical-equivalence assertions (stated test and threshold) instead of byte expectations. Implementations MUST state which class each claimed vector satisfies. +Byte-exact: vectors produced by the pinned Wichmann–Hill generator with recorded seed and trial count; the adaptive stopping δ = ½·10^ℓ is part of the vector. Distributional: for methods without deterministic draws (e.g. MCMC sampling, GUM-5 Ex 12), vectors carry statistical-equivalence assertions (stated test and threshold) instead of byte expectations. Implementations state which class each claimed vector satisfies. [example] *Expected outcome.* The JCGM 101 §9.5 vector records Wichmann–Hill with its seed and trial count; a runtime producing 36 nm-class results with a different generator claims the distributional class, not byte-exact. diff --git a/sources/unitsml-36819-conformance/sections/99-bibliography.adoc b/sources/unitsml-36819-conformance/sections/98-bibliography.adoc similarity index 100% rename from sources/unitsml-36819-conformance/sections/99-bibliography.adoc rename to sources/unitsml-36819-conformance/sections/98-bibliography.adoc