A profile is a claim about how an array behaves on a process. The evidence block is where the author shows the claim was tested: a held-out report, the measured false-alarm rate, latency, minimum detectable effect, exposure, and at least one deterministic fixture. The registry review checks the claim; the host still verifies the bytes.
{
"evidence": {
"grade": "B",
"reportUrl": "https://…/EVIDENCE.md",
"measuredAt": "2026-10-25",
"dataset": "Held-out batch on the six-channel rig, one preparation, two sessions.",
"metrics": {
"farPerMonth": 0.5,
"latencyS": 42,
"mde": 0.12,
"nSamples": 1800,
"nAlarms": 6
},
"fixtures": [
{ "id": "step", "file": "fixtures/step.json", "expect": "warning" },
{ "id": "return", "file": "fixtures/return.json", "expect": "normal" }
]
}
}| Field | Required | Meaning |
|---|---|---|
grade | yes | A, B, C, or D. The review bar depends on the claim. |
reportUrl | yes | An HTTPS URL to the held-out report. A real document at a stable URL. |
measuredAt | yes | ISO date the measurement was taken. |
dataset | yes | The corpus and rig. Name the units, sessions, and preparation. |
metrics | at least one number | farPerMonth, latencyS, mde, nSamples, nAlarms. Use the numbers from the report. |
fixtures | at least one for Gated | Deterministic cases that `noses test` replays against the declared profile. A v2 without one is Ungated. |
| Grade | Evidence | Use |
|---|---|---|
| A | Held-out unit + external replication; report, data, and code available. | A strong paid or safety-adjacent listing. |
| B | Held-out unit on one rig; report and data available. | The normal bar for a paid or operational Vial. |
| C | Held-out session on one unit; report available. | A free or experimental Vial, clearly labeled. |
| D | Author claim, bench demo, or static check only. | Installable for development. A paid listing requires a held-out unit report. |
A grade describes the evidence. The host never converts a grade into permission. A grade-D Vial can still be installed and still refuses to arm on a bad baseline; it simply does not get to claim it was validated.
A fixture is a JSON file beside the manifest. It is a sequence of samples and the state transitions that must occur. noses test reads every fixture declared in evidence.fixtures, simulates the profile's state machine, and fails the command on the first mismatch.
{
"schema": "osmograph.vial-fixture/1",
"description": "Synthetic step: baseline at 1.00, then 1.20 on both channels.",
"dtS": 1.0,
"samples": [
{ "t": 0, "channels": { "ch1": 1.00, "ch2": 1.00 } },
{ "t": 1, "channels": { "ch1": 1.00, "ch2": 1.00 } },
{ "t": 2, "channels": { "ch1": 1.00, "ch2": 1.00 } },
{ "t": 3, "channels": { "ch1": 1.20, "ch2": 1.20 } },
{ "t": 4, "channels": { "ch1": 1.20, "ch2": 1.20 } },
{ "t": 5, "channels": { "ch1": 1.20, "ch2": 1.20 } }
],
"expected": {
"final": "warning",
"alerts": [{ "t": 3, "level": 1 }],
"toleranceS": 1.0
}
}| Field | Meaning |
|---|---|
schema | Must be osmograph.vial-fixture/1 when present. |
description | What the sequence is. Say when it is synthetic. |
dtS | Seconds between samples when a sample omits `t`. Default 1.0. |
samples | { t?, channels: Record<channelId, number> }[]. Omitted channels are not zero; they are absent. |
expected.final | normal, warning, critical, or emergency. |
expected.alerts | { t, level }[]; level 1 warning, 2 critical, 3 emergency. Each must occur within the tolerance. |
expected.toleranceS | Timing tolerance. Defaults to one sample. |
noses test is a profile state-machine test, not the live engine. It reads the declared fields and replays the fixture:
anomaly.baseline.warmupS. The first sample after that window is the first scored sample.transforms.response (delta-over-r0, relative, or delta) to the declared baseline. A channel with no perChannelLimits entry cannot trigger.detection.minChannels channels must clear their limit on the same sample.warningS → criticalS → emergencyS. Continuous normal seconds plus the hysteresis band drive resetNormalS.(1 − hysteresis) × peak, even after the reset timer.The simulator does not model the engine's Kalman/UKF calibration, sensor faults, environmental drift, cross-channel covariance, or the host's hardware-sufficiency refusal. It proves the declared timers and thresholds behave as written. The held-out report is the evidence for the statistical claims; the live app is the evidence for the installed profile.
noses lint
noses testProfile fixtures (deterministic, no hardware)
✓ step fixtures/step.json → warning (1 alert(s))
✓ return fixtures/return.json → normal (0 alert(s))A missing fixture is a warning: noses test says the static surface is all it can check. A failing fixture exits non-zero. A fixture that references a path outside fixtures/ is refused.
Approval re-fetches the manifest, every UI asset, and every declared fixture, re-runs the same checks, and refuses if a hash differs from the submission. The registry commit is the only write. There is no hand-edited registry entry in the normal path.
| Moment | What is verified |
|---|---|
| Publish | The manifest sha256, every UI asset sha256, and every declared fixture sha256. |
| Submit | The server recomputes all three and writes them into the submission issue. |
| Approve | The server recomputes all three and refuses changed bytes; the registry pins them. |
| Install | The desktop recomputes both before writing the pack; a mismatch is refused. |
| Update | The same checks run for the new version before the local copy is replaced. |
| Report | The report carries the Vial id, version, manifest hash, and asset hashes. |
This is what makes an upstream edit visible. An author who changes `ui.html` without bumping the version does not silently change what a user runs; the install refuses and the mismatch is a reportable event. Fixtures are pinned at review so a changed evidence claim is visible too; the host does not execute them at runtime.
a user reports a wrong state
│
├─ the report carries id, version, manifest hash, asset hashes
├─ the author reproduces it as fixtures/<case>.json
├─ the fixture is added to evidence.fixtures
├─ noses test fails before the fix and passes after it
└─ the next version is reviewed with the new fixture pinnedA Vial without a fixture cannot regress safely, because there is nothing to replay. A bug fix that does not add a fixture is a claim. The review checks for both.