FAILURE MAP
← Case archive

FA-11981 / Discrete control systems / Open access

Feedforward escapes the actuator command limit · case 01

Feedforward escapes the actuator command limit.

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

ROOT CAUSE

Feedback is clamped before feedforward is added.

VERIFIED REPAIR

Sum all command contributions before applying the final clamp.

Unsuccessful approach: Clamping each contribution separately destroys cancellation.

Case contract

Return clamp(feedback+feedforward,low,high) for low<=high; individual terms may exceed bounds.

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(feedback, feedforward, low, high):
    return max(low,min(high,feedback))+feedforward
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper overflow', solve(N, N, -N, N), N)
check('cancel large terms', solve(3*N, -2*N, -N, N), N)
check('lower overflow', solve(-N, -N, -N, N), -N)
check('reverse cancel', solve(-3*N, 2*N, -N, N), -N)
check('zero', solve(0, 0, -N, N), 0)
check('within', solve(N, -N, -2*N, 2*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 overflow21Failed
cancel large terms-11Failed
lower overflow-2-1Failed
reverse cancel1-1Failed
zero00Passed
within00Passed

SHA-256 / 3ce1154f47c3165d67c537f2dfc9ddcd67daf5085d081aa1113dcded84678ec7

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(feedback, feedforward, low, high):
    return max(low,min(high,max(low,min(high,feedback))+max(low,min(high,feedforward))))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper overflow', solve(N, N, -N, N), N)
check('cancel large terms', solve(3*N, -2*N, -N, N), N)
check('lower overflow', solve(-N, -N, -N, N), -N)
check('reverse cancel', solve(-3*N, 2*N, -N, N), -N)
check('zero', solve(0, 0, -N, N), 0)
check('within', solve(N, -N, -2*N, 2*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 overflow11Passed
cancel large terms01Failed
lower overflow-1-1Passed
reverse cancel0-1Failed
zero00Passed
within00Passed

SHA-256 / 10e8a07cdefc7694928f00532a171a006b1e44a75b30d895ce60afbd5f0b347f

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(feedback, feedforward, low, high):
    return max(low,min(high,feedback+feedforward))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('upper overflow', solve(N, N, -N, N), N)
check('cancel large terms', solve(3*N, -2*N, -N, N), N)
check('lower overflow', solve(-N, -N, -N, N), -N)
check('reverse cancel', solve(-3*N, 2*N, -N, N), -N)
check('zero', solve(0, 0, -N, N), 0)
check('within', solve(N, -N, -2*N, 2*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 overflow11Passed
cancel large terms11Passed
lower overflow-1-1Passed
reverse cancel-1-1Passed
zero00Passed
within00Passed

SHA-256 / 98815538b158ff98c2ba0684c7dc19dd327d7a4d6074aef8a435a035c2fd0f2e

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.780494+00:00.

Case digest / 84171d314d4e906de2f3d353ddaa052d8e0dc6ceab0e32ff3caac931a9f817e3