Authoring · 12 of 17
Modelling Your Product
In this chapter: the manufacturer side of the model supply chain , you author a product reference package: your instrument modelled as a subject (the same methodology as chapters 1–7), every conformance-relevant aspect and promise mapped to the Recommendation, and the package consumed by your customers in two modes, abstract import and live integration. The worked example is ACME’s LC-500 load cell mapped to R 60, consumed by a quarry’s belt scale, both fictional, the simulator’s demonstration scenario. The normative spec of the supply-chain model is Volume I, chapter 15 (Primmel SMART docs), this chapter is the authoring path.
12.1 Why a product model
Chapters 1–9 produced the standards-reference side: the Recommendation. Chapter 10 produced the implementation side for a laboratory. The third publisher of the supply chain (Volume I, §15.1) is you, the manufacturer: your LC-500 exists as a product whether or not R 60 exists, and your model of it is a reference model, it states what the product is and claims. It is not derived from the Recommendation, and it does not compose the Recommendation: the two are related by mapping only.
Today the product’s conformance story lives in brochures, datasheets and the certificate’s prose. The product reference package makes it computable, “against which clause is this claim made, and does the evidence support it?” An unmapped product model is a brochure; a mapped one lets your customer’s engine reason about your product without re-modelling it:
user's implementation ──maps──▶ your product reference model ──maps──▶ the Recommendation
12.2 The manifest
A product reference package is an authored-native Primmel package, a
directory primmel-packages/<vendor>-<product>/ whose manifest declares
the new package kind and the supply-chain facets:
package {
id acme-lc500
kind product_reference
manufacturer "ACME Weighing GmbH"
product "LC-500"
version "2021"
editions { 2021 }
status current
maps_to { oiml-r60 }
}
Four declarations carry the semantics:
kind product_reference, the package speaks for the product. Registries skip it in rec listings; registries of the supply chain discover it by this kind.manufacturer/product, who the model speaks for and the product designation (linter rule C81 requires both).maps_to, the standards-reference packages this model maps to (C81 again: every entry must resolve, must not itself be a product , products map to the standard, never to each other, and must be actually mapped; every map profile’s namespace must be declared here).- No
usesof the Recommendation, import is not mapping (C24); the product model is a peer, not an overlay.
12.3 The subject, the methodology, applied by you
Author the product model exactly as any subject model (chapter 2), the full IS/HAS/DOES anatomy (Volume I, §15.2):
- IS: design parameters, promises, metadata, provenance. Quantity-
typed design parameters carry their literal as the qualifier string
(
e_max : "500 kg"), this is the vocabulary your customers’ design-time validation reads (§12.5). The promises are your claims on characteristics and behavior (chapter 3’s promise grammar), each withverified_byciting the verifying requirements, and the certificate’s provenance ridesis.provenance(the promises-as- verified stratum: the claims as declared and the claims as verified, distinguishable, both citable). - HAS: exhibited attributes, the characteristics the standard’s tests compute, the operational state machine.
- DOES: the response behaviors (creep) and the self-tests.
- Twin-ready: the
endpointdeclaration (IS-level, “this product offers this interface”) and theservebindings with freshness windows (Volume I, chapter 14), required only if your customers integrate live (§12.5, mode 2).
12.4 The mapping, the conformance claim made computable
The decisive act: every conformance-relevant aspect and promise is
mapped to the Recommendation’s, aspect by aspect, promise to
requirement. Declare the local aliases of the reference elements you map
to (the C21 discipline, requirement oiml-r60#/req/class-c/mpe { … },
citing the real clause in source), then the profile:
map_profile oiml-r60 {
description "LC-500 → R 60: the manufacturer's conformance claim, made computable."
mapping {
mpe_within -> oiml-r60#/req/class-c/mpe {
description "The class-limited error promise answers the class C MPE requirement."
justification "Same quantity, same clause definition."
}
e_max -> oiml-r60#/req/metrological/measuring-range-max {
description "Our E_max is R 60's E_max."
justification "Same quantity, same clause definition (R 60-1, 5.2.2)."
}
…
}
}
The discipline the gates enforce:
- 100 % of the tested characteristics covered. Every block-form
promise is a mapping source (C82
product-unmapped-promiseswarns at authoring, an unmapped promise is a brochure claim), and the platform’s product-coverage gate recomputes the coverage over the real Recommendation: every characteristic/behavior your promises target must be reachable through a mapping, or the gate fails. - No dangling clause refs. The same gate resolves every map target against the Recommendation’s real requirement/test vocabulary.
- Every pair carries
description+justification(C25 demands the description at audit strictness), this is the text your customer’s auditor reads instead of interviewing your engineers.
12.5 The two consumption modes, what your customer authors
Your customer (the integrator, the quarry, the factory) owns an implementation package and consumes yours in one of two modes, serve both; you author once (Volume I, §15.3).
Mode 1, abstract import. The customer’s manifest pins the edition:
package {
id quarry-belt-scale
uses { acme-lc500@2021 } # version-pinned — no unpinned reference
} # consumption (C83 abstract-import-pinned)
The import is reference content at the pinned edition: the composer
locates and pin-checks your package but never content-merges it. And the
import is itself a mapping, the customer maps their usage to your
promised aspects (map_profile acme-lc500 { … }; C24 exempts the edge ,
the import IS expressed as a mapping), so coverage applies: how much of
your promised envelope does their installation actually use? Design-
time validation comes with it: the customer’s quantity claims that map
to your quantity-typed design parameters must hold against your promised
envelope, the scale’s capacity within your E_max, computed by the
platform’s gate, failing loudly on an exceeded envelope.
Mode 2, live integration. The deployed instance serves its endpoint; the customer’s implementation model integrates it directly , your served aspects feed their registers, your operational state gates their processes, your promises are monitored by the Compliance Engine inside their compliance story (Volume I, chapter 14’s rules apply: declare the endpoint and the serve bindings they consume). Their evidence references your twin’s, endpoint, operation, timestamps, version pins, never copies it.
12.6 The chain rule, what the platform computes
The topology is a chain of typed mappings, and the coverage calculus of Volume I, chapter 5 gives it teeth (§15.4):
- Transitivity at process level: the customer’s mappings to your aspects compose with your mappings to the standard, yielding derived user ⇒ standard pairs, the part of their R 60 conformance that flows through your cell’s mapped promises, answered by computation.
- The shared-component guard: the chain only works through shared components. Where the customer’s process maps an aspect you never mapped, no compliance flows, and the coverage report says so, visibly (it never fails: operational data is legitimately unmappable).
The platform’s supply-chain gate (browser/build/product-coverage.ts,
validate section 1h) computes all of it on every build; the live
demonstration’s steady state is the proof:
acme-lc500 (product_reference → oiml-r60; consumers: quarry-belt-scale)
✓ tested characteristics covered: 3/3
✓ design-time: capacity_within_emax — the claimed envelope (max 500 kg) fits the promised 500 kg
⇒ batch_weighing —[mpe_within]→ oiml-r60#/req/class-c/mpe
⇒ batch_weighing —[fault_annunciation]→ oiml-r60#/req/electronic/no-significant-faults
⇒ capacity_within_emax —[e_max]→ oiml-r60#/req/metrological/measuring-range-max
○ guard: batch_weighing → indication — the live register feed flows no compliance (visible)
12.7 The gates, in order
primmel check --strict --audit primmel-packages/<your-package>, the linter: C81 (your declaration resolves), C82 (no unmapped promises), the C21/C22 mapping discipline, C83 on your customer’s side (their pin).cd browser && npx vitest run src/__tests__/product-supply-chain.test.ts, the platform proof: the chain-rule gate, the mutation proofs (every leg fails loudly), the abstract import’s reference-only composition, the promises-as-verified derivation from the type evaluation record, and the live-integration runtime over the real gateway and monitor services.cd browser && npm run validate, section 1h recomputes the whole chain on every validation run.
The running example to copy: primmel-packages/acme-lc500/ (the product
model + the R 60 mapping) and primmel-packages/quarry-belt-scale/ (the
customer in both modes). Multi-manufacturer composition, one customer
integrating two product packages, is the same pattern twice: the
patterns compose; nothing in the chain rule privileges one manufacturer.
12.8 The live demonstration, end to end
Everything in this chapter runs as ONE demonstration (TODO.roadmap/37 , the doctrine’s worked examples made real: Volume I, §14.9 and §15.7):
cd browser && npm run pilot
From a clean checkout, the demonstration (the pilot suite):
- executes the type evaluation, the LC-500 against the real R 60 program (three samples, the full dispatch/run/report/verdict/ aggregation workflow), the certificate issued through the signing gate with the five product promises as-verified derived from the executed record through the mapping (step 1 of §15.7, no longer declared-but-not-run);
- integrates one simulated twin, the quarry’s deployment binding
the declared
lc500_api(validated at design time against the projected endpoint; the demo provider servingget_indicationandwatch_stateat the connector seam); - runs the monitor loop over a simulated quarter, hourly +
on change state; an injected drift fails and flags the certificate; a feed outage degrades toindeterminate; afaultpush trips the batch gate and a service case opens; - serves the passport, the minimal §14.9 view (abstract +
live) at
/passport/upi:acme:lc500(public page) and its JSON at/passport/upi:acme:lc500.json(the QR payload’s resolver); - answers the audit chain,
5.3.2→mpe_within→ the quarter’s verdict history → the morning’s batch records, printed by the run; - asserts all of it, the six steps are the e2e spec
(
browser/e2e/pilot.e2e.ts, service-level: the twin machinery’s own acceptance precedent).
The supply-chain model itself, the three publishers, the two modes, the passport, the worked example, is specified in Volume I, chapter 15; the twin machinery (mode 2) in chapter 14, both on the Primmel SMART docs site.