FAILURE MAP
← Case archive

FA-11941 / Discrete control systems / Open access

Saturation continues accumulating outward integral action · case 01

Saturation continues accumulating outward integral action.

Verified by executionVariant 1 · 6 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
upper outward21Failed
upper inward00Passed
lower outward-2-1Failed
lower inward00Passed
inside reaches edge11Passed
zero increment00Passed

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 fixtureActualExpectedOutcome
upper outward11Passed
upper inward10Failed
lower outward-1-1Passed
lower inward-10Failed
inside reaches edge11Passed
zero increment00Passed

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 fixtureActualExpectedOutcome
upper outward11Passed
upper inward00Passed
lower outward-1-1Passed
lower inward00Passed
inside reaches edge11Passed
zero increment00Passed

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