FAILURE MAP
← Case archive

FA-65961 / Aviation weight and balance / Open access

Weight to shift rounded to nearest pound · case 01

After moving the computed weight the CG still falls a fraction short of the target.

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

ROOT CAUSE

The result uses nearest rounding, so fractional requirements below one half are rounded down and the target CG is not reached.

VERIFIED REPAIR

Round the required weight up to the next whole pound.

Unsuccessful approach: Adding one to the truncated value overshoots by a pound whenever the requirement is already a whole number.

Case contract

Input [total lb, current CG, target CG, from-station arm, to-station arm]. Weight to move = W*dCG/dArm, rounded UP to a whole pound after clearing float noise at 6 decimals. Same station -> 'ERR_SAME_STATION'; zero dCG -> 0; a move that shifts CG the wrong way -> 'ERR_DIRECTION'.

Why this case matters

The weight-shift formula moves existing load between stations without changing total weight; the answer must be conservative (rounded up).

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    W, cg0, cg1, a_from, a_to = x
    if a_from == a_to: return 'ERR_SAME_STATION'
    dcg = cg1 - cg0
    darm = a_to - a_from
    if dcg == 0: return 0
    if (dcg > 0) != (darm > 0): return 'ERR_DIRECTION'
    moved = W * dcg / darm
    return round(moved)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['baggage moved aft', [2400, 40.0, 41.1, 70.0, 120.0], 53], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2610, 46.5, 45.0, 140.0, 60.0], 49], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 69.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3980, 45.3, 44.23, 41.8, 92.7], 'ERR_DIRECTION'], ['sampled case 2', [2707, 38.32, 40.1, 125.8, 85.0], 'ERR_DIRECTION'], ['sampled case 3', [3239, 40.39, 40.5, 103.2, 113.0], 37], ['regression: shift quantity rounding mode', [2550, 42.3, 43.9, 94.3, 94.6], 13600]], [['baggage moved aft', [2400, 40.0, 41.2, 70.0, 120.0], 58], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2620, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 68.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2415, 40.34, 38.4, 91.5, 122.3], 'ERR_DIRECTION'], ['sampled case 2', [3730, 42.18, 40.8, 132.4, 79.3], 97], ['sampled case 3', [2931, 40.9, 40.9, 127.0, 108.6], 0], ['regression: shift quantity rounding mode', [1800, 39.8, 38.3, 97.3, 95.3], 1350]], [['baggage moved aft', [2400, 40.0, 41.3, 70.0, 120.0], 63], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2630, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 67.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3390, 43.8, 43.8, 81.2, 142.7], 0], ['sampled case 2', [2280, 42.43, 43.6, 91.3, 32.9], 'ERR_DIRECTION'], ['sampled case 3', [3550, 38.5, 38.5, 60.9, 57.1], 0], ['regression: shift quantity rounding mode', [3330, 41.7, 43.2, 88.2, 103.2], 333]], [['baggage moved aft', [2400, 40.0, 41.4, 70.0, 120.0], 68], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2640, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 66.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2103, 45.94, 44.79, 82.0, 59.6], 108], ['sampled case 2', [1930, 43.1, 41.2, 104.4, 84.0], 180], ['sampled case 3', [2160, 40.97, 40.7, 113.1, 93.1], 30], ['regression: shift quantity rounding mode', [2860, 40.8, 41.4, 138.1, 138.7], 2860]], [['baggage moved aft', [2400, 40.0, 41.5, 70.0, 120.0], 72], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2650, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 65.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2243, 42.7, 42.6, 141.2, 133.0], 28], ['sampled case 2', [3954, 45.3, 43.62, 97.4, 126.8], 'ERR_DIRECTION'], ['sampled case 3', [3960, 41.6, 42.67, 35.8, 103.5], 63]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
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
baggage moved aft5353Passed
exact whole-pound shift1010Passed
shift forward4949Passed
wrong direction requestERR_DIRECTIONERR_DIRECTIONPassed
already at target00Passed
same stationERR_SAME_STATIONERR_SAME_STATIONPassed
sampled case 1ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 2ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 33637Failed
regression: shift quantity rounding mode1360013600Passed

SHA-256 / 70a7032202646177e74aeefb5753e5b5aaecea54adf907971ed240ca485cd7be

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    W, cg0, cg1, a_from, a_to = x
    if a_from == a_to: return 'ERR_SAME_STATION'
    dcg = cg1 - cg0
    darm = a_to - a_from
    if dcg == 0: return 0
    if (dcg > 0) != (darm > 0): return 'ERR_DIRECTION'
    moved = W * dcg / darm
    return int(moved) + 1
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['baggage moved aft', [2400, 40.0, 41.1, 70.0, 120.0], 53], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2610, 46.5, 45.0, 140.0, 60.0], 49], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 69.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3980, 45.3, 44.23, 41.8, 92.7], 'ERR_DIRECTION'], ['sampled case 2', [2707, 38.32, 40.1, 125.8, 85.0], 'ERR_DIRECTION'], ['sampled case 3', [3239, 40.39, 40.5, 103.2, 113.0], 37], ['regression: shift quantity rounding mode', [2550, 42.3, 43.9, 94.3, 94.6], 13600]], [['baggage moved aft', [2400, 40.0, 41.2, 70.0, 120.0], 58], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2620, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 68.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2415, 40.34, 38.4, 91.5, 122.3], 'ERR_DIRECTION'], ['sampled case 2', [3730, 42.18, 40.8, 132.4, 79.3], 97], ['sampled case 3', [2931, 40.9, 40.9, 127.0, 108.6], 0], ['regression: shift quantity rounding mode', [1800, 39.8, 38.3, 97.3, 95.3], 1350]], [['baggage moved aft', [2400, 40.0, 41.3, 70.0, 120.0], 63], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2630, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 67.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3390, 43.8, 43.8, 81.2, 142.7], 0], ['sampled case 2', [2280, 42.43, 43.6, 91.3, 32.9], 'ERR_DIRECTION'], ['sampled case 3', [3550, 38.5, 38.5, 60.9, 57.1], 0], ['regression: shift quantity rounding mode', [3330, 41.7, 43.2, 88.2, 103.2], 333]], [['baggage moved aft', [2400, 40.0, 41.4, 70.0, 120.0], 68], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2640, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 66.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2103, 45.94, 44.79, 82.0, 59.6], 108], ['sampled case 2', [1930, 43.1, 41.2, 104.4, 84.0], 180], ['sampled case 3', [2160, 40.97, 40.7, 113.1, 93.1], 30], ['regression: shift quantity rounding mode', [2860, 40.8, 41.4, 138.1, 138.7], 2860]], [['baggage moved aft', [2400, 40.0, 41.5, 70.0, 120.0], 72], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2650, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 65.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2243, 42.7, 42.6, 141.2, 133.0], 28], ['sampled case 2', [3954, 45.3, 43.62, 97.4, 126.8], 'ERR_DIRECTION'], ['sampled case 3', [3960, 41.6, 42.67, 35.8, 103.5], 63]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
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
baggage moved aft5353Passed
exact whole-pound shift1010Passed
shift forward4949Passed
wrong direction requestERR_DIRECTIONERR_DIRECTIONPassed
already at target00Passed
same stationERR_SAME_STATIONERR_SAME_STATIONPassed
sampled case 1ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 2ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 33737Passed
regression: shift quantity rounding mode1360113600Failed

SHA-256 / b88d74f331899118fba74a94b75b7751b93a2267e261e185a005543ea14dccaa

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    W, cg0, cg1, a_from, a_to = x
    if a_from == a_to: return 'ERR_SAME_STATION'
    dcg = cg1 - cg0
    darm = a_to - a_from
    if dcg == 0: return 0
    if (dcg > 0) != (darm > 0): return 'ERR_DIRECTION'
    moved = W * dcg / darm
    return math.ceil(round(moved, 6))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['baggage moved aft', [2400, 40.0, 41.1, 70.0, 120.0], 53], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2610, 46.5, 45.0, 140.0, 60.0], 49], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 69.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3980, 45.3, 44.23, 41.8, 92.7], 'ERR_DIRECTION'], ['sampled case 2', [2707, 38.32, 40.1, 125.8, 85.0], 'ERR_DIRECTION'], ['sampled case 3', [3239, 40.39, 40.5, 103.2, 113.0], 37], ['regression: shift quantity rounding mode', [2550, 42.3, 43.9, 94.3, 94.6], 13600]], [['baggage moved aft', [2400, 40.0, 41.2, 70.0, 120.0], 58], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2620, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 68.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2415, 40.34, 38.4, 91.5, 122.3], 'ERR_DIRECTION'], ['sampled case 2', [3730, 42.18, 40.8, 132.4, 79.3], 97], ['sampled case 3', [2931, 40.9, 40.9, 127.0, 108.6], 0], ['regression: shift quantity rounding mode', [1800, 39.8, 38.3, 97.3, 95.3], 1350]], [['baggage moved aft', [2400, 40.0, 41.3, 70.0, 120.0], 63], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2630, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 67.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [3390, 43.8, 43.8, 81.2, 142.7], 0], ['sampled case 2', [2280, 42.43, 43.6, 91.3, 32.9], 'ERR_DIRECTION'], ['sampled case 3', [3550, 38.5, 38.5, 60.9, 57.1], 0], ['regression: shift quantity rounding mode', [3330, 41.7, 43.2, 88.2, 103.2], 333]], [['baggage moved aft', [2400, 40.0, 41.4, 70.0, 120.0], 68], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2640, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 66.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2103, 45.94, 44.79, 82.0, 59.6], 108], ['sampled case 2', [1930, 43.1, 41.2, 104.4, 84.0], 180], ['sampled case 3', [2160, 40.97, 40.7, 113.1, 93.1], 30], ['regression: shift quantity rounding mode', [2860, 40.8, 41.4, 138.1, 138.7], 2860]], [['baggage moved aft', [2400, 40.0, 41.5, 70.0, 120.0], 72], ['exact whole-pound shift', [3000, 42.0, 42.3, 50.0, 140.0], 10], ['shift forward', [2650, 46.5, 45.0, 140.0, 60.0], 50], ['wrong direction request', [2500, 40.0, 41.0, 120.0, 65.0], 'ERR_DIRECTION'], ['already at target', [2300, 43.2, 43.2, 70.0, 120.0], 0], ['same station', [2300, 43.2, 44.0, 95.0, 95.0], 'ERR_SAME_STATION'], ['sampled case 1', [2243, 42.7, 42.6, 141.2, 133.0], 28], ['sampled case 2', [3954, 45.3, 43.62, 97.4, 126.8], 'ERR_DIRECTION'], ['sampled case 3', [3960, 41.6, 42.67, 35.8, 103.5], 63]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
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
baggage moved aft5353Passed
exact whole-pound shift1010Passed
shift forward4949Passed
wrong direction requestERR_DIRECTIONERR_DIRECTIONPassed
already at target00Passed
same stationERR_SAME_STATIONERR_SAME_STATIONPassed
sampled case 1ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 2ERR_DIRECTIONERR_DIRECTIONPassed
sampled case 33737Passed
regression: shift quantity rounding mode1360013600Passed

SHA-256 / a0c52d14c5f96a1fbddd0db88d285ba596ef6d96a8cc4b9445e3bb1a5bc9988a

Verification & scope

A deterministic toy loading model with stipulated constants; it is not an approved aircraft flight manual procedure and makes no claim of regulatory conformance. 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:47:38.653264+00:00.

Case digest / 9eca0100960e61fb81c4721e0468b531d3517cc8bad774e124ee096eafbf9a65