FA-11941 / Discrete control systems / Open access
Saturation continues accumulating outward integral action · case 01
Saturation continues accumulating outward integral action.
ROOT CAUSE
Every error is integrated even when it drives the stored command beyond its bound.
VERIFIED REPAIR
Reject only an outward increment beyond the bound, while allowing inward recovery.
Unsuccessful approach: Freezing whenever the previous state is at a limit also blocks inward recovery.
Case contract
One conditional integration step: reject delta when candidate exceeds high and delta>0, or candidate<low and delta<0; otherwise accept candidate. Bounds are inclusive.
Why this case matters
An offline discrete controller model isolates this state or arithmetic fault; it makes no physical plant or safety claim.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, delta, low, high):
return state + delta
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper outward', solve(N, 1, -N, N), N)
check('upper inward', solve(N, -1, -N, N), N-1)
check('lower outward', solve(-N, -1, -N, N), -N)
check('lower inward', solve(-N, 1, -N, N), -N+1)
check('inside reaches edge', solve(0, N, -N, N), N)
check('zero increment', solve(0, 0, -N, N), 0)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper outward | 2 | 1 | Failed |
| upper inward | 0 | 0 | Passed |
| lower outward | -2 | -1 | Failed |
| lower inward | 0 | 0 | Passed |
| inside reaches edge | 1 | 1 | Passed |
| zero increment | 0 | 0 | Passed |
SHA-256 / d5592e205cec5d9b829e9908ada6b681c9aad66632426f022f7540fd52b56c5f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, delta, low, high):
return state if state >= high or state <= low else state + delta
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper outward', solve(N, 1, -N, N), N)
check('upper inward', solve(N, -1, -N, N), N-1)
check('lower outward', solve(-N, -1, -N, N), -N)
check('lower inward', solve(-N, 1, -N, N), -N+1)
check('inside reaches edge', solve(0, N, -N, N), N)
check('zero increment', solve(0, 0, -N, N), 0)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper outward | 1 | 1 | Passed |
| upper inward | 1 | 0 | Failed |
| lower outward | -1 | -1 | Passed |
| lower inward | -1 | 0 | Failed |
| inside reaches edge | 1 | 1 | Passed |
| zero increment | 0 | 0 | Passed |
SHA-256 / e0ab659b610c8c415f53f0a007965c0c95b14fb99e83e107d6d6c9d02bd8d9b9
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(state, delta, low, high):
candidate = state + delta
return state if (candidate > high and delta > 0) or (candidate < low and delta < 0) else candidate
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper outward', solve(N, 1, -N, N), N)
check('upper inward', solve(N, -1, -N, N), N-1)
check('lower outward', solve(-N, -1, -N, N), -N)
check('lower inward', solve(-N, 1, -N, N), -N+1)
check('inside reaches edge', solve(0, N, -N, N), N)
check('zero increment', solve(0, 0, -N, N), 0)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper outward | 1 | 1 | Passed |
| upper inward | 0 | 0 | Passed |
| lower outward | -1 | -1 | Passed |
| lower inward | 0 | 0 | Passed |
| inside reaches edge | 1 | 1 | Passed |
| zero increment | 0 | 0 | Passed |
SHA-256 / 0e39a8a4212ea852f88d2eb9a08eac4a757f21c4f9994ee01921b99b4c185d7f
Verification & scope
Integer-valued controlled examples only; no physical plant, stability guarantee, timing jitter, or hardware behavior is modeled. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:52.391049+00:00.
Case digest / 9b9baec6b7dc3c51255da7735fab7ed1ed0da2d1c70e59b66f6bbceaa5b69ef0