Verified: Forcing
Each claim the Forcing page makes, with the tests that
prove it in the last green CI run: 9 of 16 verified.
The claims live in docs/claims/forcing.yaml.
Last green CI run 16 Oct 2026, 14:48 UTC on c7618d3 · all runtime claims
FRC-001 verified
A force on an input replaces the driver's reading before the logic runs, every scan, so the program sees the forced value.
- pass
TestForceInputOverridesDriverinruntime
FRC-002 verified
A force on an output or state tag is laid back over whatever the logic wrote every scan, so the driver is handed the forced value.
- pass
TestForceHoldsAgainstPlantAndLogicinacceptance - pass
TestForceOutputReappliedAfterLogicinruntime
FRC-003 verified
Forcing a struct member (P101.Speed, Recipe.Steps[2].Mode) holds only that member; the rest of the struct follows its writers.
FRC-004 verified
A forced value is coerced like any write: an enumerated tag or member takes its member name, and a name that is no member is refused with the list of members.
FRC-005 verified
The force table records the actual value the tag would hold (the driver's latest reading, the logic's latest write) and removing a force puts the tag back to it at once, not on the next write.
FRC-006 verified
A write to a forced tag through POST /api/tags is refused with 409 rather than accepted and silently overridden.
- pass
TestForceAPIinserver
FRC-008 partly verified
Set Active Step jumps a running SFC chart once: every step is deactivated and the target activated, old steps see a falling edge and the new step a rising edge, and nothing is held, so the chart evolves normally from the next scan.
- pass
TestSFCSetStepinruntime
FRC-009 partly verified
Fire Transition takes one transition once whatever its condition says (sources deactivated, targets activated), is refused when a source step is not active, and addresses an unnamed transition as t<line>.
FRC-010 partly verified
An SFC command needs pou only when two running charts share the step or transition name.
FRC-011 partly verified
Forces are not retained: a restart comes up with no forces.
FRC-012 verified
The force table lives on the leader (a standby proxies the API to it), and a takeover or a leader stepping down drops it.
FRC-013 partly verified
Every force, removal, clear-all, step jump and fired transition leaves a line in the controller log with the caller's address.
FRC-014 partly verified
Every force and SFC write passes the same guard as POST /api/tags: same-origin by default, the token when NAUTILUS_TOKEN is set.
- pass
TestForceAuthinserver
FRC-015 partly verified
GET /api/forces lists name, value, actual and sinceMs; DELETE /api/forces/{name} removes one (404 if it was not forced); POST /api/forces/clear removes all and returns the count.
- pass
TestForceAPIinserver
FRC-016 verified
Every stream frame carries forces while at least one force is active and omits it when none is; it is never delta-gated; /api/meta advertises "forces": true.
FRC-017 verified
An acceptance test can hold a tag the same way, with force: and unforce: steps.
- pass
TestForceHoldsAgainstPlantAndLogicinacceptance