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.