@oimlsmart/primmel-packages 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ # l10n.fra-Latn.prl — the package's fra-Latn alternates (TODO.v2/10). Kernel `text`
2
+ # blocks only; the default spelling stays inline in the source files, a
3
+ # translation rides alongside it, never instead (docs/spelling-codes.md).
4
+ # Rebuilt by build-prl-package (the SSOT app-config projection leg) — the
5
+ # committed copy and this emission are byte-compared.
6
+
7
+ text r60-3/table-6.3-6.4.name {
8
+ spell fra-Latn "Essai de charge"
9
+ }
10
+
11
+ text r60-3/table-6.3-6.4.fields.electronics_power_voltage.label {
12
+ spell fra-Latn "Tension d'alimentation"
13
+ }
14
+
15
+ text r60-3/table-6.3-6.4.fields.test_loads.label {
16
+ spell fra-Latn "Mesurages de la charge d'essai"
17
+ }
18
+
19
+ text r60-3/form-6.11.name {
20
+ spell fra-Latn "Temps de préchauffage"
21
+ }
22
+
23
+ text r60-3/form-6.11.fields.overall_result.true_label {
24
+ spell fra-Latn "Conforme"
25
+ }
26
+
27
+ text r60-3/form-6.11.fields.overall_result.false_label {
28
+ spell fra-Latn "Non conforme"
29
+ }
30
+
31
+ text load-test-row.fields.test_load.label {
32
+ spell fra-Latn "Charge d'essai"
33
+ }
34
+
35
+ text load-test-row.fields.direction.label {
36
+ spell fra-Latn "Sens"
37
+ }
38
+
39
+ text load-test-row.fields.runs.label {
40
+ spell fra-Latn "Séries"
41
+ }
42
+
43
+ text load-test-row.fields.runs.fields.indication.label {
44
+ spell fra-Latn "Indication"
45
+ }
46
+
47
+ text load-test-row.fields.runs.fields.time.label {
48
+ spell fra-Latn "Heure"
49
+ }
50
+
51
+ text load-test-row.fields.average_indication.label {
52
+ spell fra-Latn "Moyenne"
53
+ }
54
+
55
+ text load-test-row.fields.repeatability_error.label {
56
+ spell fra-Latn "Erreur de répétabilité"
57
+ }
58
+
@@ -11,6 +11,7 @@ package {
11
11
  validity { from 2021-01-01 }
12
12
  status current
13
13
  default_spelling eng-Latn
14
+ spellings { eng-Latn fra-Latn }
14
15
  description "Metrological regulation for load cells — requirements, test procedures, and test report forms."
15
16
  source { collection "sources/r060/collection.yml" parts { 1 2 3 } }
16
17
  }
@@ -4510,8 +4510,8 @@ participants:
4510
4510
  oiml_code: EX1
4511
4511
  country: "Example Member State"
4512
4512
  # DEMO_FLOWS/01 — the registry-carried logo (the IA cards render it;
4513
- # XX1 below carries none and rides the derived monogram, so the demo
4514
- # shows both postures honestly).
4513
+ # the three TLs below carry their own marks; XX1 below carries none and
4514
+ # rides the derived monogram, so the demo shows both postures honestly).
4515
4515
  logo: /orgs/ex1.svg
4516
4516
  address: { street: "1 Scheme Avenue", city: "Demoville", country: "Example Member State", postal_code: "DL-100" }
4517
4517
  contact: { person: "Ms. Emily Irving", email: "office@eia.example.org", phone: "+100 555 0101" }
@@ -4525,6 +4525,7 @@ participants:
4525
4525
  kind: test-laboratory
4526
4526
  name: "Example Test Laboratory"
4527
4527
  short_name: "ETL"
4528
+ logo: /orgs/etl.svg
4528
4529
  lab_kind: independent
4529
4530
  oiml_id: 21
4530
4531
  parent_oiml_code: EX1
@@ -4569,6 +4570,7 @@ participants:
4569
4570
  kind: test-laboratory
4570
4571
  name: "ACME Test Laboratory"
4571
4572
  short_name: "ACME-TL"
4573
+ logo: /orgs/acme-tl.svg
4572
4574
  lab_kind: manufacturer_test_lab
4573
4575
  parent_manufacturer_id: mfr-acme
4574
4576
  oiml_id: 990
@@ -4604,6 +4606,7 @@ participants:
4604
4606
  kind: test-laboratory
4605
4607
  name: "Example MTL GmbH"
4606
4608
  short_name: "EMTL"
4609
+ logo: /orgs/mtl-rhein.svg
4607
4610
  lab_kind: independent
4608
4611
  oiml_id: 1991
4609
4612
  parent_oiml_code: EX1
@@ -4824,9 +4827,10 @@ participants:
4824
4827
  status: ACTIVE
4825
4828
  decision_date: "2026-06-30"
4826
4829
  notes: "Manufacturer's Test Laboratory under the controlled supervision of XX1 (PD-04, 7.1)."
4827
- # An IN-FLIGHT Utilizer admission (PD-09) at the MC vote the RC has
4828
- # recommended, 3 of 5 MC ballots are cast and the 80 % decision is
4829
- # still open (the approval board's live-vote demonstration).
4830
+ # A Utilizer admission (PD-09) admitted to Scheme B. Participation
4831
+ # cases register DIRECTLY (the scheme operator's registration act);
4832
+ # the ballot pipeline is modelled (data/core state machines, B 18:2025
4833
+ # §11) but not operated by the platform.
4830
4834
  - id: app-ut-ng
4831
4835
  kind: utilizer_admission
4832
4836
  applicant_organization_id: ut-wmd-ng
@@ -4836,8 +4840,9 @@ participants:
4836
4840
  scope:
4837
4841
  - { category: load-cells, schemes: [scheme_b] }
4838
4842
  mc_electorate: 5
4839
- status: MC_VOTE
4843
+ status: ACTIVE
4840
4844
  submitted_by: "A. Okonkwo"
4845
+ decision_date: "2026-07-12"
4841
4846
 
4842
4847
  competence_evidence:
4843
4848
  - id: ev-ia-de1
@@ -4873,136 +4878,6 @@ participants:
4873
4878
  team: ["L. Moreau (LME)", "A. Fitzgerald (MSE, team leader)"]
4874
4879
  notes: "Peer assessment of the MTL including the PD-04, 7.1 controlled-supervision arrangements with XX1."
4875
4880
 
4876
- approval_votes:
4877
- - id: vote-rc-de1
4878
- application_id: app-ia-de1
4879
- organ: review_committee
4880
- kind: rc_recommendation
4881
- voter: "RC rapporteur (K. Tanaka)"
4882
- ballot: in_favour
4883
- cast_at: "2022-11-20T10:00:00.000Z"
4884
- - id: vote-mc-de1-1
4885
- application_id: app-ia-de1
4886
- organ: management_committee
4887
- kind: mc_ballot
4888
- voter: "DE"
4889
- member_state: "Germany"
4890
- ballot: in_favour
4891
- cast_at: "2022-12-10T15:00:00.000Z"
4892
- - id: vote-mc-de1-2
4893
- application_id: app-ia-de1
4894
- organ: management_committee
4895
- kind: mc_ballot
4896
- voter: "NL"
4897
- member_state: "Netherlands"
4898
- ballot: in_favour
4899
- cast_at: "2022-12-10T15:00:00.000Z"
4900
- - id: vote-mc-de1-3
4901
- application_id: app-ia-de1
4902
- organ: management_committee
4903
- kind: mc_ballot
4904
- voter: "CH"
4905
- member_state: "Switzerland"
4906
- ballot: in_favour
4907
- cast_at: "2022-12-10T15:00:00.000Z"
4908
- - id: vote-mc-de1-4
4909
- application_id: app-ia-de1
4910
- organ: management_committee
4911
- kind: mc_ballot
4912
- voter: "FR"
4913
- member_state: "France"
4914
- ballot: in_favour
4915
- cast_at: "2022-12-10T15:00:00.000Z"
4916
- - id: vote-mc-de1-5
4917
- application_id: app-ia-de1
4918
- organ: management_committee
4919
- kind: mc_ballot
4920
- voter: "JP"
4921
- member_state: "Japan"
4922
- ballot: in_favour
4923
- cast_at: "2022-12-10T15:00:00.000Z"
4924
- - id: vote-rc-xx1
4925
- application_id: app-ia-xx1
4926
- organ: review_committee
4927
- kind: rc_recommendation
4928
- voter: "RC rapporteur (K. Tanaka)"
4929
- ballot: in_favour
4930
- cast_at: "2026-06-15T10:00:00.000Z"
4931
- - id: vote-mc-xx1-1
4932
- application_id: app-ia-xx1
4933
- organ: management_committee
4934
- kind: mc_ballot
4935
- voter: "DE"
4936
- member_state: "Germany"
4937
- ballot: in_favour
4938
- cast_at: "2026-06-30T15:00:00.000Z"
4939
- - id: vote-mc-xx1-2
4940
- application_id: app-ia-xx1
4941
- organ: management_committee
4942
- kind: mc_ballot
4943
- voter: "NL"
4944
- member_state: "Netherlands"
4945
- ballot: in_favour
4946
- cast_at: "2026-06-30T15:00:00.000Z"
4947
- - id: vote-mc-xx1-3
4948
- application_id: app-ia-xx1
4949
- organ: management_committee
4950
- kind: mc_ballot
4951
- voter: "CH"
4952
- member_state: "Switzerland"
4953
- ballot: in_favour
4954
- cast_at: "2026-06-30T15:00:00.000Z"
4955
- - id: vote-mc-xx1-4
4956
- application_id: app-ia-xx1
4957
- organ: management_committee
4958
- kind: mc_ballot
4959
- voter: "FR"
4960
- member_state: "France"
4961
- ballot: in_favour
4962
- cast_at: "2026-06-30T15:00:00.000Z"
4963
- - id: vote-mc-xx1-5
4964
- application_id: app-ia-xx1
4965
- organ: management_committee
4966
- kind: mc_ballot
4967
- voter: "JP"
4968
- member_state: "Japan"
4969
- ballot: abstain
4970
- reason: "No national position on the new applicant yet."
4971
- cast_at: "2026-06-30T15:00:00.000Z"
4972
- # The in-flight Utilizer admission: RC recommendation + 3 of 5 ballots.
4973
- - id: vote-rc-ut-ng
4974
- application_id: app-ut-ng
4975
- organ: review_committee
4976
- kind: rc_recommendation
4977
- voter: "RC rapporteur (K. Tanaka)"
4978
- ballot: in_favour
4979
- cast_at: "2026-07-05T10:00:00.000Z"
4980
- - id: vote-mc-ut-ng-1
4981
- application_id: app-ut-ng
4982
- organ: management_committee
4983
- kind: mc_ballot
4984
- voter: "DE"
4985
- member_state: "Germany"
4986
- ballot: in_favour
4987
- cast_at: "2026-07-12T15:00:00.000Z"
4988
- - id: vote-mc-ut-ng-2
4989
- application_id: app-ut-ng
4990
- organ: management_committee
4991
- kind: mc_ballot
4992
- voter: "NL"
4993
- member_state: "Netherlands"
4994
- ballot: in_favour
4995
- cast_at: "2026-07-12T15:00:00.000Z"
4996
- - id: vote-mc-ut-ng-3
4997
- application_id: app-ut-ng
4998
- organ: management_committee
4999
- kind: mc_ballot
5000
- voter: "BR"
5001
- member_state: "Brazil"
5002
- ballot: abstain
5003
- reason: "Awaiting the outcome of the national stakeholder consultation."
5004
- cast_at: "2026-07-12T15:00:00.000Z"
5005
-
5006
4881
  # The per-category scheme state (B 18:2025 clause 15): load-cells
5007
4882
  # transitioned to Scheme A in 2020; traffic-speed-meters (R 91:2025) is
5008
4883
  # in Scheme B with its two-year window elapsed on 2026-07-01 — the
@@ -0,0 +1,32 @@
1
+ form r79-label-examination/record {
2
+ name "Label examination record"
3
+ description "The permanent record of a quantity-declaration review: the label as read, and the outcome of each Annex A / 6.1 check."
4
+ field declaration_text : string {
5
+ required true
6
+ bind model.attributes.quantity_declaration_text
7
+ }
8
+ field declaration_unit : string {
9
+ required true
10
+ bind model.attributes.quantity_declaration_unit
11
+ }
12
+ field measure_type : string {
13
+ required true
14
+ bind model.attributes.measure_type
15
+ }
16
+ field nominal_quantity : number {
17
+ required true
18
+ bind model.attributes.nominal_quantity_value
19
+ }
20
+ field unit_is_table_a1_symbol : boolean {
21
+ required true
22
+ }
23
+ field unit_is_table_a2_choice : boolean {
24
+ required true
25
+ }
26
+ field no_ambiguous_expression : boolean {
27
+ required true
28
+ }
29
+ field label_not_misleading : boolean {
30
+ required true
31
+ }
32
+ }
@@ -0,0 +1,39 @@
1
+ attribute_definition quantity_declaration_text {
2
+ name "Quantity declaration text"
3
+ definition "The text of the quantity declaration as it appears on the prepackage label, against which the Annex A.1.3 prohibition of ambiguous expressions is checked."
4
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.3"
5
+ value_type string
6
+ origin measured
7
+ scope model
8
+ category metrological
9
+ }
10
+
11
+ attribute_definition quantity_declaration_unit {
12
+ name "Quantity declaration unit"
13
+ definition "The unit of measurement symbol used in the quantity declaration (checked against Table A.1 and, with the measure type and quantity, Table A.2)."
14
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1"
15
+ value_type string
16
+ origin measured
17
+ scope model
18
+ category metrological
19
+ }
20
+
21
+ attribute_definition measure_type {
22
+ name "Type of measurement"
23
+ definition "The type of measurement the quantity declaration expresses (volume-liquid, volume-cubic, mass, length or area), selecting the row family of Table A.2."
24
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.4"
25
+ value_type string
26
+ origin measured
27
+ scope model
28
+ category metrological
29
+ }
30
+
31
+ attribute_definition nominal_quantity_value {
32
+ name "Nominal quantity value"
33
+ definition "The declared nominal quantity of product in the prepackage (the q of Table A.2's unit-choice bands), in the base unit of its measure type."
34
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-2.5"
35
+ value_type number
36
+ origin measured
37
+ scope model
38
+ category metrological
39
+ }
@@ -0,0 +1,15 @@
1
+ package {
2
+ id oiml-r79
3
+ kind rec
4
+ title "OIML R 79:2015 — R 79 package"
5
+ version "2015"
6
+ editions { 2015 }
7
+ baseUrn "urn:oiml:pub:r:79:2015"
8
+ uses { oiml-smart-core }
9
+ requires { core }
10
+ validity { from 2015-01-01 }
11
+ status current
12
+ default_spelling eng-Latn
13
+ description "Labeling requirements for prepackages — identity of the product, declaration of responsibility, and quantity declarations; units of measurement and symbols (mandatory Annex A), misleading practices, and the informative type-size models of Annex B. Authored from the corpus draft whose sections 3–5.5 are heading-only (content pending upstream); sections 5.6, 6 and Annexes A/B are complete and carried here in full."
14
+ source { collection "sources/r79/collection.yml" }
15
+ }
@@ -0,0 +1,39 @@
1
+ conformance_class /conf/label-examination {
2
+ title "Label examination"
3
+ name "Label examination for prepackages"
4
+ target /req/units
5
+ subject "prepackage label"
6
+ description "Examination of the quantity declaration on a prepackage label against the unit and expression rules of R 79 Annex A (A.1, A.1.3, A.1.4) and the misleading-information prohibition of 6.1. All checks are documentation/string examinations of the label as presented — no instrument testing is involved."
7
+ }
8
+
9
+ conformance_test /conf/label-examination/quantity-declaration-review {
10
+ name "Quantity declaration review"
11
+ purpose "Verify that the quantity declaration's unit is a Table A.1 symbol, is the Table A.2 unit for the measure type and nominal quantity, and that the declaration text carries none of the prohibited ambiguous expressions."
12
+ method "Read the quantity declaration as presented on the principal display panel: record the declaration text, the unit symbol, the type of measurement and the nominal quantity value; evaluate the four checks (unit is a Table A.1 symbol; unit is permitted by Table A.2 for the recorded type and quantity; no 'approximately'/'standard'/'when packed' in the declaration; no misleading information on the label per 6.1)."
13
+ type Inspection
14
+ kind performance
15
+ reference { doc "urn:oiml:pub:r:79:2015" clause "A.1" }
16
+ reference { doc "urn:oiml:pub:r:79:2015" clause "A.1.3" }
17
+ reference { doc "urn:oiml:pub:r:79:2015" clause "A.1.4" }
18
+ reference { doc "urn:oiml:pub:r:79:2015" clause "6.1" }
19
+ targets { /req/units/symbols-table /req/units/choice-of-units /req/units/no-ambiguous-expressions /req/practices/no-misleading-information }
20
+ result_forms { record }
21
+ variables {
22
+ variable quantity_declaration_text { type string source measured description "The quantity declaration text as presented" }
23
+ variable quantity_declaration_unit { type string source measured description "The unit symbol used in the declaration" }
24
+ variable measure_type { type string source measured description "Type of measurement (volume-liquid, volume-cubic, mass, length, area)" }
25
+ variable nominal_quantity_value { type number source measured description "Declared nominal quantity in the measure type's base unit" }
26
+ }
27
+ procedure {
28
+ 1 "Record the declaration text, unit symbol, measure type and nominal quantity from the principal display panel" outputs { quantity_declaration_text quantity_declaration_unit measure_type nominal_quantity_value }
29
+ 2 "Evaluate the four checks against Tables A.1/A.2 and the A.1.3/6.1 prohibitions"
30
+ }
31
+ acceptance_criteria {
32
+ type composite
33
+ pass_if "ocl{not quantity_declaration_text.matches('(?i).*(approximately|standard|when packed).*') and unit_symbols.symbols->exists(s | s = quantity_declaration_unit) and unit_choice_by_quantity.permits(measure_type, nominal_quantity_value, quantity_declaration_unit)"
34
+ criterion symbols { target /req/units/symbols-table pass_if "ocl{unit_symbols.symbols->exists(s | s = quantity_declaration_unit)}" description "The declared unit is a Table A.1 symbol" }
35
+ criterion unit_choice { target /req/units/choice-of-units pass_if "ocl{unit_choice_by_quantity.permits(measure_type, nominal_quantity_value, quantity_declaration_unit)}" description "The unit is Table A.2's unit for the measure type and quantity" }
36
+ criterion no_ambiguous { target /req/units/no-ambiguous-expressions pass_if "ocl{not quantity_declaration_text.matches('(?i).*(approximately|standard|when packed).*')}" description "No prohibited ambiguous expression in the declaration" }
37
+ criterion not_misleading { target /req/practices/no-misleading-information pass_if "ocl{not quantity_declaration_text.matches('(?i).*(approximately|standard|when packed).*')}" description "The label carries no ambiguous statement likely to mislead (6.1 read with A.1.3)" }
38
+ }
39
+ }
@@ -0,0 +1,20 @@
1
+ requirement_class /req/labeling {
2
+ title "Presentation of information"
3
+ name "Presentation of information on the prepackage label"
4
+ description "Legibility, prominence and placement of quantity declarations (R 79, 5.6)."
5
+ subject "prepackage label"
6
+ }
7
+
8
+ requirement /req/labeling/quantity-declaration-prominence {
9
+ name "Quantity declarations prominent and legible"
10
+ statement "Quantity declarations shall appear in easily legible boldface type or print that contrasts conspicuously with the background and with other information on the prepackage, and are so positioned on the principal display panel as to make them conspicuous and easy to read and understand."
11
+ verification { method definitional }
12
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-5.6.1"
13
+ }
14
+
15
+ requirement /req/labeling/blown-molded-declarations {
16
+ name "Blown, embossed or molded declarations"
17
+ statement "When the quantity declaration is blown, embossed or molded on the surface of the prepackage, then all other required label information shall be provided elsewhere on the surface or on a label so as to be conspicuous and easy to read and understand."
18
+ verification { method definitional }
19
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-5.6.2"
20
+ }
@@ -0,0 +1,61 @@
1
+ requirement_class /req/practices {
2
+ title "Misleading practices"
3
+ name "Provisions against misleading prepackages"
4
+ description "Information, fill level, packing-material design, duplication and free-quantity rules that prevent a purchaser from being misled about quantity or identity (R 79, 6)."
5
+ subject "prepackage"
6
+ }
7
+
8
+ requirement /req/practices/no-misleading-information {
9
+ name "No misleading information"
10
+ statement "The label on a prepackage shall not contain any information or ambiguous statements likely to mislead a purchaser. This includes the ambiguous expressions prohibited in Annex A, A.1.3."
11
+ binds_to { model.attributes.quantity_declaration_text }
12
+ limit {
13
+ expression "ocl{not model.attributes.quantity_declaration_text.matches('(?i).*(approximately|standard|when packed).*')}"
14
+ notes "The Annex A.1.3 prohibition, machine-checkable against the declared quantity text: 'approximately', 'standard' and 'when packed' shall not appear as part of the quantity declaration."
15
+ uses { model.attributes.quantity_declaration_text }
16
+ }
17
+ verification { method test }
18
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.1"
19
+ }
20
+
21
+ requirement /req/practices/fill-level {
22
+ name "Fill level not misleading"
23
+ statement "A prepackage shall be filled in such a manner that a purchaser may not reasonably be misled with respect to the quantity of the product it contains, taking into consideration any recognized and accepted production practices that may be necessary for the manufacturer or packer."
24
+ verification { method definitional }
25
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.2.1"
26
+ }
27
+
28
+ requirement /req/practices/no-excessive-slack-fill {
29
+ name "No excessive non-functional slack fill"
30
+ statement "If a purchaser cannot fully view the product in a prepackage, it shall be considered to be filled, and shall be misleading if it contains excessive non-functional slack fill that is not required by any production process. Slack fill necessary for product protection, machine requirements, unavoidable product settling during shipping and handling, or a packaging function inherent in the nature of the product and clearly communicated to consumers is not regarded as misleading."
31
+ verification { method definitional }
32
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.2.2"
33
+ }
34
+
35
+ requirement /req/practices/aerosol-fill-level {
36
+ name "Aerosol dispenser fill level"
37
+ statement "The fill level of aerosol dispensers shall be in accordance with national legislation or recognized industry standards specified in national legislation."
38
+ verification { method definitional }
39
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.2.3"
40
+ }
41
+
42
+ requirement /req/practices/packing-material-design {
43
+ name "Design and display of packing material"
44
+ statement "Prepackages shall be manufactured, constructed or displayed in such a manner as to reasonably prevent a purchaser from being misled with respect to the quantity or identity of product contained therein. A prepackage shall not have a false bottom, sidewalls, lid or covering, or be otherwise so constructed or filled, wholly or partially, that may deceive the purchaser. Concave bottoms may be justified for safety reasons."
45
+ verification { method definitional }
46
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.3"
47
+ }
48
+
49
+ requirement /req/practices/duplication-of-information {
50
+ name "Duplication on multiple principal display panels"
51
+ statement "If a prepackage has more than one principal display panel the product identity and the quantity declaration shall appear on each principal display panel in accordance with the requirements of this Recommendation."
52
+ verification { method definitional }
53
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.4"
54
+ }
55
+
56
+ requirement /req/practices/free-quantities {
57
+ name "Additional or free quantities"
58
+ statement "Unless the packer declares that the free quantity is included in the nominal quantity, any such declaration shall be made in a manner which will reasonably prevent a purchaser from being misled with respect to the total quantity."
59
+ verification { method definitional }
60
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-6.5"
61
+ }
@@ -0,0 +1,59 @@
1
+ requirement_class /req/units {
2
+ title "Units of measurement and symbols"
3
+ name "Units and symbols for quantity declarations (Annex A, mandatory)"
4
+ description "Permissible units and symbols, their spacing, accompanying phrases, prohibited ambiguous expressions, and the unit chosen by measure type and quantity (R 79, Annex A)."
5
+ subject "quantity declaration"
6
+ }
7
+
8
+ requirement /req/units/symbols-table {
9
+ name "Units expressed in words or symbols"
10
+ statement "Units of measurement shall be expressed in either words or symbols as provided by Table A.1. Neither a period nor the letter 's' shall be used after any of the symbols."
11
+ binds_to { model.attributes.quantity_declaration_unit }
12
+ limit {
13
+ expression "ocl{unit_symbols.symbols->exists(s | s = quantity_declaration_unit)}"
14
+ notes "The declared unit must be one of Table A.1's symbols (mg, g, kg, t, mL, cL, L, μm, mm, cm, m, mm2, cm2, dm2, m2, cm3, dm3, m3)."
15
+ uses { model.attributes.quantity_declaration_unit table:unit_symbols }
16
+ }
17
+ verification { method test }
18
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1"
19
+ }
20
+
21
+ requirement /req/units/spacing {
22
+ name "Single space between number and unit"
23
+ statement "A single space shall be used to separate the number from the unit of measurement."
24
+ verification { method definitional }
25
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.1"
26
+ }
27
+
28
+ requirement /req/units/phrases {
29
+ name "Accompanying phrases"
30
+ statement "Appropriate phrases such as 'content', 'contents', 'quantity', 'mass', 'weight', 'net', 'net mass', 'net weight', 'net contents' or 'net quantity' may be used in connection with the quantity declaration in accordance with national legislation, appearing either before or after the quantity declaration. The words 'drained' or 'drained weight' shall only be used as described in 5.2."
31
+ verification { method definitional }
32
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.2"
33
+ }
34
+
35
+ requirement /req/units/no-ambiguous-expressions {
36
+ name "No ambiguous expressions"
37
+ statement "Ambiguous expressions such as 'approximately' or 'standard' or 'when packed' shall not be used as part of the quantity declaration."
38
+ binds_to { model.attributes.quantity_declaration_text }
39
+ limit {
40
+ expression "ocl{not model.attributes.quantity_declaration_text.matches('(?i).*(approximately|standard|when packed).*')}"
41
+ notes "Machine-checkable string prohibition over the quantity declaration text (Annex A.1.3, referenced by 6.1)."
42
+ uses { model.attributes.quantity_declaration_text }
43
+ }
44
+ verification { method test }
45
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.3"
46
+ }
47
+
48
+ requirement /req/units/choice-of-units {
49
+ name "Choice of unit by measure type and quantity"
50
+ statement "The unit used depends on the type of measurement and the nominal quantity of product, as indicated in Table A.2: volume (liquids) below 1000 mL in mL or cL, from 1000 mL in L; volume-cubic (solids) up to 1000 cm3 in cm3 or mL, from 1 dm3 to below 1000 dm3 in dm3 or L, from 1000 dm3 in m3; mass below 1 g in mg, from 1 g to below 1000 g in g, from 1000 g in kg or t; length below 1 mm in μm or mm, from 1 mm to below 100 cm in mm or cm, from 100 cm in m; area below 100 cm2 in mm2 or cm2, from 1 dm2 to below 100 dm2 in dm2, from 1 m2 in m2."
51
+ binds_to { model.attributes.measure_type model.attributes.nominal_quantity_value model.attributes.quantity_declaration_unit }
52
+ limit {
53
+ expression "ocl{unit_choice_by_quantity.permits(measure_type, nominal_quantity_value, quantity_declaration_unit)}"
54
+ notes "Table A.2 as a lookup: given the measure type and the nominal quantity value, the declared unit must be among the table's permitted units for that band."
55
+ uses { model.attributes.measure_type model.attributes.nominal_quantity_value model.attributes.quantity_declaration_unit table:unit_choice_by_quantity }
56
+ }
57
+ verification { method test }
58
+ ref derives-from "urn:oiml:pub:r:79:2015#clause-A.1.4"
59
+ }
@@ -0,0 +1,69 @@
1
+ table unit_symbols {
2
+ description "Units of measurement and their symbols (R 79, Table A.1)"
3
+ columns {
4
+ unit: string
5
+ symbol: string
6
+ }
7
+ data {
8
+ "milligram" "mg"
9
+ "gram" "g"
10
+ "kilogram" "kg"
11
+ "tonne" "t"
12
+ "millilitre" "mL"
13
+ "centilitre" "cL"
14
+ "litre" "L"
15
+ "micrometre" "μm"
16
+ "millimetre" "mm"
17
+ "centimetre" "cm"
18
+ "metre" "m"
19
+ "square millimetre" "mm2"
20
+ "square centimetre" "cm2"
21
+ "square decimetre" "dm2"
22
+ "square metre" "m2"
23
+ "cubic centimetre" "cm3"
24
+ "cubic decimetre" "dm3"
25
+ "cubic metre" "m3"
26
+ }
27
+ }
28
+
29
+ table unit_choice_by_quantity {
30
+ description "The correct unit by type of measurement and quantity of product (R 79, Table A.2; q is the nominal quantity)."
31
+ columns {
32
+ measure_type: string
33
+ band_min: string "the band's inclusive lower bound, '-' for open-ended below"
34
+ band_max: string "the band's exclusive upper bound, '-' for open-ended above"
35
+ units: string
36
+ }
37
+ data {
38
+ "volume-liquid" "-" "1000 mL" "mL|cL"
39
+ "volume-liquid" "1000 mL" "-" "L"
40
+ "volume-cubic" "-" "1000 cm3" "cm3|mL"
41
+ "volume-cubic" "1 dm3" "1000 dm3" "dm3|L"
42
+ "volume-cubic" "1000 dm3" "-" "m3"
43
+ "mass" "-" "1 g" "mg"
44
+ "mass" "1 g" "1000 g" "g"
45
+ "mass" "1000 g" "-" "kg|t"
46
+ "length" "-" "1 mm" "μm|mm"
47
+ "length" "1 mm" "100 cm" "mm|cm"
48
+ "length" "100 cm" "-" "m"
49
+ "area" "-" "100 cm2" "mm2|cm2"
50
+ "area" "1 dm2" "100 dm2" "dm2"
51
+ "area" "1 m2" "-" "m2"
52
+ }
53
+ }
54
+
55
+ table type_size_usa {
56
+ description "Minimum height of numbers and letters for quantity declarations by area of the principal display panel — the USA model (R 79, Annex B, Table B.1; INFORMATIVE: a national example, not an OIML requirement)."
57
+ columns {
58
+ panel_area_band: string
59
+ min_height_printed_mm: number "mm"
60
+ min_height_blowmolded_mm: number "mm"
61
+ }
62
+ data {
63
+ "A ≤ 32 cm2" 1.6 3.2
64
+ "32 < A ≤ 161 cm2" 3.2 4.8
65
+ "161 < A ≤ 645 cm2" 4.8 6.4
66
+ "645 < A ≤ 2581 cm2" 6.4 7.9
67
+ "2581 cm2 < A" 12.7 14.3
68
+ }
69
+ }
@@ -0,0 +1,52 @@
1
+ term label {
2
+ label "label"
3
+ definition "written, printed, or graphic matter affixed to, applied to, attached to, blown into, formed or molded into, embossed on, appearing upon, included in, belonging to, or accompanying a prepackage containing any product for purposes of branding, identifying, or giving any information with respect to the product or to the contents of the prepackage"
4
+ section "2.1"
5
+ source "urn:oiml:pub:r:79:2015#clause-2.1"
6
+ language "en"
7
+ form_type "fullForm"
8
+ part_of_speech "noun"
9
+ }
10
+
11
+ term medium {
12
+ label "medium"
13
+ definition "fluid that is put in the prepackage together with the product, either separated from, in or surrounding the product, and that is intended to be left over after use of the product, except for items naturally in the product"
14
+ section "2.2"
15
+ note "For the purpose of this Recommendation 'fluid' includes either liquid, semi-liquid or frozen liquids, or a gas or a mixture of gasses, whether below, at or above atmospheric pressure, or a combination of both. 'Use' includes consumption. A medium is sometimes also referred to as 'liquid packing medium'. A medium can be separated from the product by the measuring procedures in OIML R 87, and includes the liquid mediums of CODEX STAN 1-1985 (drained weight) and the ice-glaze of CODEX standards on ice-glazed foods."
16
+ source "urn:oiml:pub:r:79:2015#clause-2.2"
17
+ language "en"
18
+ form_type "fullForm"
19
+ part_of_speech "noun"
20
+ }
21
+
22
+ term misleading-prepackage {
23
+ label "misleading prepackage"
24
+ definition "prepackage that is made, formed, presented, marked or filled in any way that may mislead a consumer about the quantity of product that it contains"
25
+ section "2.3"
26
+ source "urn:oiml:pub:r:79:2015#clause-2.3"
27
+ language "en"
28
+ form_type "fullForm"
29
+ part_of_speech "noun"
30
+ }
31
+
32
+ term net-quantity {
33
+ label "net quantity"
34
+ definition "quantity of the identified product in the prepackage exclusive of packing material"
35
+ section "2.4"
36
+ note "Includes wrappers and any other material packed with such product. Relates to specifications on a prepackage; the actual quantity in an individual prepackage is governed by OIML R 87."
37
+ source "urn:oiml:pub:r:79:2015#clause-2.4"
38
+ language "en"
39
+ form_type "fullForm"
40
+ part_of_speech "noun"
41
+ }
42
+
43
+ term nominal-quantity {
44
+ label "nominal quantity"
45
+ definition "quantity of product in a prepackage declared on the label"
46
+ section "2.5"
47
+ note "In some national legislation referred to as 'net quantity', 'net contents', 'net mass' or 'net volume'. Relates to specifications on a prepackage; procedures for inspection lots are provided in OIML R 87."
48
+ source "urn:oiml:pub:r:79:2015#clause-2.5"
49
+ language "en"
50
+ form_type "fullForm"
51
+ part_of_speech "noun"
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oimlsmart/primmel-packages",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "The OIML SMART platform's authoritative model content: every Recommendation, the OIML-CS scheme, the CASCO foundations, the shared modules, and the product/program reference packages as Primmel (.prl) packages — the single source of truth the platform's data trees regenerate from. Consumed by the smart monorepo (oimlsmart/smart) at a pinned version (TODO.repos/02).",
5
5
  "type": "module",
6
6
  "repository": {
@@ -12,6 +12,6 @@
12
12
  },
13
13
  "license": "MIT",
14
14
  "devDependencies": {
15
- "@primmel/primmel": "^1.9.1"
15
+ "@primmel/primmel": "^1.10.0"
16
16
  }
17
17
  }