Skip to content
DRAFT⚠OIML SMART pilot programme · internal use only · all documents and specifications are drafts and may change without notice

The simulated instruments (the SST split)

The simulated instruments live in two repositories: primmel/sst, the kind-agnostic SST framework, and oimlsmart/sst, the OIML instrument library, each bootable with zero SMART checkout.

What it is. Two repositories, split on 2026-08-01 when the pre-split sim-instruments repository was archived:

Repository Role
primmel/sst the SST framework: the kind-agnostic runtime (/twin, /world, the bench), the shell, the specifications
oimlsmart/sst the OIML instrument library: the D 11 environmental base, the kind packages, the ACME instances including the composite

The library’s instruments, each bootable alone with zero SMART checkout:

Instrument Rec Physics
acme-lc500 (load cell) R 60 strain → bridge → conditioning; creep, thermal hysteresis, configurable post-cycle residual
acme-cgm-200 (gas analyzer) R 144 CO by NDIR, NOx by chemiluminescence; drift classes, cross-sensitivity, calibration
acme-rs180 (speed meter) R 91 K-band Doppler, 20–180 km/h; cosine error, rain fade (missed readings, never wrong ones)
acme-md3xx (dimensioner) R 129 optical light-section dimensioning; along-track sampling, reflectance and ambient-light noise, protrusion resolution
acme-cgm-system (composite) R 144 the gas analyzer plus its sampling line, one boot, two components

What it does. Each instrument serves two channels and a bench:

  • /twin, the governed projection, generated from the product reference package (the serve declarations become the GraphQL schema; a startup conformance check fails the process if the schema drifts from the package).
  • /world, the physical world: place a load, sweep the environment (D 11 vocabulary: temperature, humidity, pressure, supply variations, EMC events), inject a fault, swap a scenario, advance the virtual clock, reset. Guarded for non-local boots by one env var (SIM_WORLD_TOKEN, opt-in; unset means open local posture).
  • A console and a bench, the LC-500’s bench app shows the physical scene and the paired analogue dial (a ground-truth rendering, so a human can read a needle and catch what the API can’t: the lying-twin lesson).

The physics are data, not code: each kind package declares its stage chain (physics-chain.yaml, three stages per construction), its MPE tables, and its damage scenarios (scenarios.yaml: fresh, creep-fail, temp-fail, drift-fail, lying-twin, and their per-kind equivalents), and each instance pins its samples as boot-time chains of custody (samples/<name>.yaml; one boot, one sample). The fresh sample is the teaching case (class-honest coefficients, recalibrated to be R 60 class-C creep-honest), creep-fail the deliberate behavioral fail.

What it owns. The framework owns the stage registry the data-driven physics composes on, the twin-schema generation, the world schemas, the console, the bench, and the interaction specifications. The library owns the OIML content: the D 11 environmental base (sst-oiml-base, Edition 13), the kinds (sst-r60, sst-r91, sst-r129, sst-r144, sst-sampling-line), and the ACME instances with their coefficients and samples. The boundary is mechanical: the framework never imports instrument content, and the library resolves the framework through a declared file: link in development (the npm tag at release).

How it proves it works. The framework runs the suites: npm test in primmel/sst with the library declared (SST_LIBRARY_PATH=<oimlsmart/sst checkout>), 255 of 259 tests across four vitest workspaces (4 skip-honest; hand-counted 2026-09-27 and rendered as an ungated number on the architecture page, physics pinned per stage, contract conformance to the real packages, server and channel behavior, boot smoke) plus typecheck and CI on GitHub Actions. The library validates rather than tests, by design: npm run validate checks every package (12) against the real runtime, and the instance-parameter guard compares each instance’s typed parameters against the product package it maps to.

Where it plugs in. The smart app consumes an instrument’s /twin through the graphql connector (the real out-of-process acceptance path) and embeds its bench in /app/sim as a human face, interaction never needs the iframe: the contract is two endpoints and four verbs, specified in 12, the SST interaction contract. The smart repo’s live-sim legs resolve the two checkouts from declared envs (SST_REPO for the framework, SST_LIBRARY_PATH for the library) and skip honestly when they are undeclared. The epistemic wall stands: the SMART app never calls /world outside the declared practice seam, certification logic reads only the served channel.

Peel deeper. Each repo’s own README.md (the library’s quickstart boots every instrument with one npm script), the framework’s specifications (specs/), and the product packages the instances mirror (maps_to: in each package.sst.yaml).


Back to the index.