Verified: Testing (naut test)
Each claim the Testing (naut test) page makes, with the tests that
prove it in the last green CI run: 8 of 32 verified, 4 with no test yet.
The claims live in docs/claims/testing.yaml.
Last green CI run 16 Oct 2026, 14:48 UTC on c7618d3 · all runtime claims
TEST-001 partly verified
naut test runs the resource on a virtual clock that both the measured scan-to-scan dt (bound to dt-tag) and the TON/TOF/TP millisecond base follow, so advance: 10s runs ten seconds of process time exactly.
- pass
TestVirtualDtIsExactinacceptance - pass
TestLowTempAlarmWaitsItsFullDelayinacceptance - pass
low-temp alarm waits its full 10 sintestdata/projects/heated-tank
TEST-002 verified
Runs are deterministic: the scheduler lands the clock exactly on each tick, so dt is exactly the configured period and a loop's trajectory is identical on every run.
- pass
TestRunsAreReproducibleinacceptance - pass
TestVirtualDtIsExactinacceptance
TEST-003 partly verified
The fixture is nautilus.yaml: tasks, scan rates, tag roles, seeds, units and descriptions come from the manifest, so a test never restates them.
- pass
TestHeatedTankSuiteinacceptance
TEST-004 verified
A test file that breaks the format's rules is refused: a step takes at most one of scans, advance or until, hold applies only with until, a test needs a name, and a test has either steps: or inline step keys, not both.
- pass
TestSpecRejectsMistakesinacceptance(13 of 13 passed)
TEST-005 verified
A test with no steps: is one step, so that step's keys may be written inline on the test.
- pass
TestShorthandIsOneStepinacceptance - pass
TestFailureLinePointsAtTheAssertioninacceptance
TEST-006 partly verified
scans: N runs until the main task has completed N more scans.
- pass
TestPumpSealInHysteresisinacceptance - pass
pump seals in below the start level and drops out above itintestdata/projects/heated-tank
TEST-007 partly verified
advance: d runs every due tick up to now+d and lands exactly there; a step with none of scans/advance/until asserts on the seeded state before anything runs.
- pass
TestVirtualDtIsExactinacceptance - pass
TestLowTempAlarmWaitsItsFullDelayinacceptance
TEST-008 partly verified
until: runs up to the bound and stops as soon as expect holds; with hold: the expectation must stay true for that long, so a loop that merely passes through its target does not count as settled.
- pass
TestPISettlesSetpointStepinacceptance - pass
PI settles a 65 to 72 C setpoint step and holds itintestdata/projects/heated-tank
TEST-009 verified
always: is checked after every scan in the step (an invariant, not an endpoint).
- pass
TestAlwaysCatchesAViolationThatRecoversinacceptance
TEST-010 partly verified
given: writes are routed by the role the manifest declared: an input goes to the driver's input image and arrives at the top of the next scan, everything else is written straight to the store, applied before the step's first scan.
- pass
TestGivenComposesAfterZeroScansinacceptance
TEST-011 no test yet
Writing an undeclared tag in given: is an error, not a new tag.
TEST-012 verified
A dotted name in given: addresses one field of a UDT tag and zero-fills the rest of that struct the first time a test touches it, and every dotted field of the same tag in one given map composes onto a single write, independent of key order.
- pass
TestGivenSingleFieldStillZeroFillsTheRestinacceptance - pass
TestGivenComposesTwoFieldsOfSameStructInOneMapinacceptance - pass
TestGivenNestedFieldAndSiblingFieldComposeinacceptance - pass
TestGivenScalarAndStructFieldInSameStepinacceptance
TEST-013 verified
An array element is [n] from the declared lower bound in given: and expect:, an enumeration member takes its name (or integer) at any depth, and a name that is no member fails the test with the members listed.
- pass
TestGivenEnumMemberByPathinacceptance - pass
TestGivenEnumNonMemberNamesMembersinacceptance
TEST-014 no test yet
Tests never open a socket: whatever driver: says (including eip), the harness substitutes a stub, so a project bound to hardware is testable offline.
TEST-015 partly verified
Expectations take an exact value (BOOL, STRING or number) or a matcher: near with tol (defaulting to the file's tolerance), gt, ge, lt, le, between (inclusive) and eq.
- pass
TestExpectShapesinacceptance - pass
TestSchemaMatchersAreImplementedinacceptance - pass
PI settles a 65 to 72 C setpoint step and holds itintestdata/projects/heated-tank
TEST-016 partly verified
An ST expression string (or a list mixing mappings and strings) is compiled by the same compiler as the logic, can use tags and library FUNCTIONs, and a mapping is tag matchers while a string is an expression.
- pass
TestExpectShapesinacceptance - pass
TestExpressionAddressesStructFieldinacceptance - pass
TestFailureLinePointsAtTheAssertioninacceptance
TEST-017 partly verified
Program locals are addressable as task.local in the matcher form (exact or with a matcher), resolution is tag-first then <tag>.<field> then <task>.<local> then an error naming both namespaces, and task.local is not a name an ST expression string can use.
- pass
TestTaskLocalStillResolvesinacceptance - pass
TestTaskLocalInListForminacceptance - pass
TestUnknownHeadNamesBothNamespacesinacceptance - pass
TestTaskLocalNotResolvedInExpressioninacceptance
TEST-018 no test yet
A scan that faults fails the test that ran it, with the error and the virtual timestamp, without the author writing an assertion.
TEST-019 partly verified
alarms: asserts host alarm state (active, unacked, shelved, state, priority, journal) at the end of a step, and the ack, shelve and unshelve verbs in given: make the same calls as POST /api/alarms/*.
- pass
TestAlarmAckVerbinacceptance - pass
TestAlarmShelveAndUnshelveVerbsinacceptance - pass
TestAlarmOnDelayWalksInVirtualTimeinacceptance - pass
TestAlarmFailureNamesWhatItSawinacceptance(7 of 7 passed)
TEST-020 verified
The alarm engine reads the runtime's virtual clock, so a five-minute on-delay is walked exactly and a fifteen-minute shelf expires under advance: 16m.
- pass
TestAlarmOnDelayWalksInVirtualTimeinacceptance - pass
TestAlarmShelveAndUnshelveVerbsinacceptance - pass
a shelved high-level alarm is silent and always expiresinexamples/lift-station
TEST-021 verified
Using alarms: keys without a manifest alarms: section is an error rather than a quiet pass, and alarms: does not combine with until:.
- pass
TestAlarmKeysWithoutAnEngineAreAnErrorinacceptance - pass
TestAlarmsAndUntilAreRefusedinacceptance
TEST-022 partly verified
Alarm state does not leak between tests, and WithAlarms builds the manifest's own engine over each test's runtime with an in-memory journal and no notifiers.
- pass
TestAlarmStateDoesNotLeakBetweenTestsinacceptance
TEST-023 partly verified
suspend: [task] stops the named tasks from scanning for the duration of a test (file default overridable per test), turning a closed loop into an open-loop test.
- pass
low-temp alarm waits its full 10 sintestdata/projects/heated-tank - pass
TestLowTempAlarmWaitsItsFullDelayinacceptance
TEST-024 partly verified
force: puts tags in the controller's force table and they stay held against the driver's input image, the plant model and the logic until unforce: names them (or all); dotted member paths work as in given:; forces end with the test.
- pass
TestForceHoldsAgainstPlantAndLogicinacceptance
TEST-025 partly verified
A failure reports the assertion that broke (file:line of the tag key, expression or alarms: key), the step and its first line, the virtual time, and a trajectory of the process values with their units and descriptions.
- pass
TestFailureLinePointsAtTheAssertioninacceptance - pass
TestFailureReportsBothLinesinacceptance
TEST-026 partly verified
The -json event carries the test's line, passed, scans, elapsedMs and for failures step, line, stepLine, atMs, reason, detail and trace.
- pass
TestFailureReportsBothLinesinacceptance
TEST-027 no test yet
naut test exits non-zero on any failure, and -run filters tests by name pattern.
TEST-028 partly verified
*_test.yaml files are discovered in the project, and never reach a deployed controller: naut build excludes them from the embedded project.
- pass
TestDiscoveryinacceptance
TEST-029 partly verified
An SDK (Go) project runs the same suites through the same harness (acceptance.Run with WithAlarms), and hand-written Go tests get the virtual clock through acceptance.NewRuntime and its scheduler's Advance, Scans, AdvanceUntil and Suspend.
- pass
TestPumpSealInHysteresisinacceptance - pass
TestPISettlesSetpointStepinacceptance - pass
TestPISettlesinexamples/go-sdk
TEST-030 partly verified
The harness replays one deterministic interleaving (next task due, ties broken by declaration order).
- pass
TestRunsAreReproducibleinacceptance
TEST-031 partly verified
naut test --target logix drives the same scenarios against a Logix controller: given writes go to the controller and wait to read back, advance: d is d of wall time plus a poll, scans: n is n task periods plus a poll (a continuous task counting one poll each), until/hold/always are evaluated per poll, suspend is a no-op, and alarm verbs are unavailable.
- pass
TestLiveSealInAndAlarminacceptance - pass
TestLiveUntilHoldAndAlwaysinacceptance - pass
TestLiveRefusesWhatAControllerCannotDoinacceptance
TEST-032 partly verified
Program-scope tags on a Logix controller are served as <Program>_<Tag>, and a scenario may use the bare name.
- pass
TestLiveSealInAndAlarminacceptance