DisclosureOS documentation · v2 Beta
Check a measured value
Run one synthetic reading through its source connections, capture metadata and file checks.
Follow a −3 m/s radial-velocity measurement from its observation to a captured channel and retained files. You will run a passing check, inspect the connections, then see how the result changes when bytes or a mapping disagree.
This is a small synthetic validation fixture, separate from the full fictional showcase case and from ELDÆON data. Its equipment, calibration, timing and processing are authored declarations. The exercise checks their structure and connections; it does not demonstrate a working sensor or reproduce the measurement.
For a real source row with incomplete equipment context, use Reproduce an ELDÆON reading.
1. Run the example
Download the complete example, unzip it and open the measurement folder. The download includes four JSON documents, three small artifacts, an MIT license, a pinned dependency and run.mjs.
With Node.js 22 or newer:
npm install
npm startThe dependency is the published @disclosureos/schema@2.0.0-beta.4. Installation fetches npm dependencies; the evaluator itself reads the supplied local bytes and never fetches provider URLs.
2. Read the result
The script prints this summary:
{
"success": true,
"checks": {
"structural": "passed",
"semantic": "passed",
"profile": "passed",
"external": "not_checked"
},
"scientific": "not_checked",
"clockUncertainty": "not_checked",
"artifactContents": "not_checked"
}| Result | What it means here |
|---|---|
structural: passed | The four inputs have the expected document shapes. |
semantic: passed | Their identifiers and declared relationships resolve consistently. |
profile: passed | The measurement has the required capture connection, matching quantity and unit, contained time and matching required artifact bytes. |
external: not_checked | The evaluator does not assert overall external verification. This remains unchanged even when the profile checks the supplied artifacts. A mismatching artifact can set it to failed. |
The three remaining not_checked values | The check does not establish scientific validity, apply clock uncertainty or interpret artifact contents. |
success is true when this measurement-binding profile passes. It is not an approval of the observation or every claim in its history. In particular, the calibration is explicitly unreviewed and the declared reduction has not been reproduced. Do not rewrite an unchecked stage as passed in your application.
3. Follow the reading
The observation's primary source chain starts with measurement:velocity, follows assertion:velocity to product:summary, then follows the declared reduction back to product:raw. Acquisition bindings connect that raw product to product:captured-raw in the context. Measurement bindings select its radar channel and capture time.
| File | What to inspect |
|---|---|
| history.json | The embedded observation declares −3 m/s, its source assertion, derived summary and processing inputs. The history also retains attributed synthetic claims. |
| context.json | The same capture used in Equipment and captures: product captured-raw, capture a1, configuration r1, channel radar and calibration c1. |
| bindings.json | Maps observation source:station to context instrument:station, and observation product:raw to context product:captured-raw. |
| measurements.json | Maps measurement:velocity to that observation raw product, channel radar and 2026-07-28T12:10:00Z. |
Both channel and measurement declare radial velocity and m/s. The instant is at the start of a one-minute capture. The observation's measurement uncertainty and the context's calibration uncertainty are separate declarations; this check does not combine them.
The three artifacts are intentionally small so you can inspect their bytes:
| Local file | Key supplied to the evaluator | Declared size |
|---|---|---|
assets/product-captured-raw.txt | product:captured-raw | 23 bytes |
assets/manifest-r1.txt | manifest:r1 | 367 bytes |
assets/calibration-c1-report.txt | calibration:c1/report | 94 bytes |
These keys use context IDs, not filenames or observation product IDs. The files' byte lengths and SHA-256 digests match the context declarations. The .txt filenames do not determine the declared media types. The evaluator checks the required bytes, but does not decode their contents or rerun the declared processing.
Read Connect measurements for the mapping documents and assembly rules. This example uses claim history 0.1.0, with an embedded observation, and acquisition context and bindings at 0.1.0. Newer research-history contracts have separate evaluators; they cannot be substituted into this call simply by changing a version string.
4. Try a missing file or broken connection
Run each command separately from the example folder. The flags change only in-memory inputs; the downloaded files stay intact. Each experiment exits with status 1 because the profile did not pass, and prints the summary followed by a diagnostic array.
Withhold the raw file
npm start -- --missingThe script leaves the raw-product bytes out of the asset map. The profile remains not_checked, with an EXTERNAL.ASSET_UNAVAILABLE warning. The required file has not been checked.
Change one byte
npm start -- --changedThe script flips one byte in memory and preserves the file length. Profile and external checks become failed, with EXTERNAL.DIGEST_MISMATCH. This is a supplied file that disagrees with its declaration.
Name an absent channel
npm start -- --wrong-channelThe mapping names missing-channel. Semantic and profile checks become failed, with MEASUREMENT.CHANNEL. The named channel must exist in both the pinned configuration and the capture.
Move beyond the capture
npm start -- --outside-captureThe measurement instant moves to 12:11:00Z, the exclusive capture end. Semantic and profile checks become failed, with MEASUREMENT.OUTSIDE_CAPTURE. An instant at the start is included; one at the end is not.
For example, the changed-byte experiment prints this issue inside its diagnostic array:
{
"code": "EXTERNAL.DIGEST_MISMATCH",
"stage": "external",
"severity": "error",
"pointer": "/context/products/0/artifact",
"message": "Supplied bytes do not match the pinned SHA-256 digest."
}The pointer names the artifact declaration in the first context product. It does not say which byte changed. Missing bytes are different: they leave the check incomplete and produce a warning, rather than proving that a supplied file disagrees with its digest. A channel or time error can stop the evaluator before it checks the artifacts.
Run npm start again to recover the original passing result. No download or manual file restoration is needed. The wrapper accepts one experiment at a time; an unrecognized option exits with status 2 and prints usage rather than silently running the passing case.
Use the evaluator in your application
The complete script reads JSON from disk, builds the asset map and calls the evaluator. This is the call to adapt after loading your inputs:
import { evaluateMeasurementBindings } from "@disclosureos/schema/experimental/v2";
// history, context, bindings and measurements are parsed JSON documents.
// assets maps context artifact IDs to complete Uint8Array file contents.
const result = await evaluateMeasurementBindings(
history,
context,
bindings,
measurements,
{ assets },
);
if (!result.success) {
// Retain the stage, severity, pointer and message for each issue.
console.error(result.checks, result.issues);
}A successful result checks this profile's declared relationships and required artifact matches. It does not prove that the raw file contains the stated value, that the source assertion is correct or that the reduction was executed. The history's confirmed source and assessment claims remain attributed synthetic declarations, not findings produced by this evaluator.
For a provider integration, start with one native recording and one traceable measured value. Preserve the actual bytes, units, capture time and configuration revision. Retain missing calibration or clock information explicitly instead of copying the synthetic fixture's declarations. The ELDÆON public preview uses supplied native files with validated source-intake receipts. Its electric-field reading example reproduces a real source cell while reporting incomplete capture context. Clock alignment and calibration remain unresolved.
Source and implementation
The four documents and three artifacts are copied unchanged from the canonical synthetic example, under its MIT license. The portal adds the runnable wrapper, safe experiment flags and dependency pin. The download's README records that provenance.
Continue with Equipment and captures, Connect measurements or the shared field reference. To see connected recordings in a larger interface, open Original scalar readings in the research desk.