FA-11981 / Discrete control systems / Open access
Feedforward escapes the actuator command limit · case 01
Feedforward escapes the actuator command limit.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper overflow | 2 | 1 | Failed |
| cancel large terms | -1 | 1 | Failed |
| lower overflow | -2 | -1 | Failed |
| reverse cancel | 1 | -1 | Failed |
| zero | 0 | 0 | Passed |
| within | 0 | 0 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper overflow | 1 | 1 | Passed |
| cancel large terms | 0 | 1 | Failed |
| lower overflow | -1 | -1 | Passed |
| reverse cancel | 0 | -1 | Failed |
| zero | 0 | 0 | Passed |
| within | 0 | 0 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| upper overflow | 1 | 1 | Passed |
| cancel large terms | 1 | 1 | Passed |
| lower overflow | -1 | -1 | Passed |
| reverse cancel | -1 | -1 | Passed |
| zero | 0 | 0 | Passed |
| within | 0 | 0 | Passed |
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