FA-86211 / Game economy crafting balance / Open access
Currency exchange desk: Same-currency exchange charges a fee · case 01
Converting gold to gold loses money.
ROOT CAUSE
The shortcut applies only when no fee is configured.
VERIFIED REPAIR
Restore `if from_cur == to_cur:` at the same currency shortcut step.
Unsuccessful approach: Comparing rates happens to match here but treats distinct equal-rate currencies as identical.
Case contract
rates map currency -> copper value. Same currency returns [amount, 0] without fee. Otherwise value = amount*rate[from]; fee = ceil(value*fee_bp/10000), at least 1 copper when value > 0 and fee_bp > 0 and 0 otherwise; net = value - fee; return [net // rate[to], net % rate[to]] (change in copper).
Why this case matters
Game economies leak or destroy currency when one crafting or pricing rule is off by one boundary, rounding stage or state update; the defect is observable in exact integer outcomes.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(amount, from_cur, to_cur, rates, fee_bp):
if from_cur == to_cur and fee_bp == 0:
return [amount, 0]
value = amount * rates[from_cur]
fee = -(-value * fee_bp // 10000)
if value > 0 and fee_bp > 0:
fee = max(fee, 1)
net = value - fee
return [net // rates[to_cur], net % rates[to_cur]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0]),
('fault site same currency shortcut #2',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('partial repair boundary #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('partial repair boundary #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('fault site same currency shortcut #2',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[3, 0]),
('partial repair boundary #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('partial repair boundary #2',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[3, 0]),
('fault site same currency shortcut #2',
[7, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[7, 0]),
('partial repair boundary #1',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[7, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[7, 0]),
('fault site same currency shortcut #2',
[40, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[40, 0]),
('partial repair boundary #1',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[1, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('fault site same currency shortcut #2',
[1, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('partial repair boundary #1',
[7, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[2, 90]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[0, 'gem', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0])]]
for label, args, expected in cases[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| same currency no fee #1 | [4, 9250] | [5, 0] | Failed |
| fault site same currency shortcut #1 | [750, 92] | [751, 0] | Failed |
| fault site same currency shortcut #2 | [0, 0] | [1, 0] | Failed |
| partial repair boundary #1 | [2, 99] | [2, 99] | Passed |
| partial repair boundary #2 | [6, 89] | [6, 89] | Passed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| fee rounds up #1 | [7, 48] | [7, 48] | Passed |
| control #1 | [2, 49] | [2, 49] | Passed |
SHA-256 / ca4441eb5d9852925ccb6cc8272bd0b820d744d35f6e7eb2898e3a0cc024106a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(amount, from_cur, to_cur, rates, fee_bp):
if rates[from_cur] == rates[to_cur]:
return [amount, 0]
value = amount * rates[from_cur]
fee = -(-value * fee_bp // 10000)
if value > 0 and fee_bp > 0:
fee = max(fee, 1)
net = value - fee
return [net // rates[to_cur], net % rates[to_cur]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0]),
('fault site same currency shortcut #2',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('partial repair boundary #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('partial repair boundary #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('fault site same currency shortcut #2',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[3, 0]),
('partial repair boundary #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('partial repair boundary #2',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[3, 0]),
('fault site same currency shortcut #2',
[7, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[7, 0]),
('partial repair boundary #1',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[7, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[7, 0]),
('fault site same currency shortcut #2',
[40, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[40, 0]),
('partial repair boundary #1',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[1, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('fault site same currency shortcut #2',
[1, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('partial repair boundary #1',
[7, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[2, 90]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[0, 'gem', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0])]]
for label, args, expected in cases[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| same currency no fee #1 | [5, 0] | [5, 0] | Passed |
| fault site same currency shortcut #1 | [751, 0] | [751, 0] | Passed |
| fault site same currency shortcut #2 | [1, 0] | [1, 0] | Passed |
| partial repair boundary #1 | [3, 0] | [2, 99] | Failed |
| partial repair boundary #2 | [7, 0] | [6, 89] | Failed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| fee rounds up #1 | [7, 48] | [7, 48] | Passed |
| control #1 | [2, 49] | [2, 49] | Passed |
SHA-256 / 6f6f987b7dc17238e5d8230f02ebeb2d09b56524b3bd55d92f1f015725690e51
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(amount, from_cur, to_cur, rates, fee_bp):
if from_cur == to_cur:
return [amount, 0]
value = amount * rates[from_cur]
fee = -(-value * fee_bp // 10000)
if value > 0 and fee_bp > 0:
fee = max(fee, 1)
net = value - fee
return [net // rates[to_cur], net % rates[to_cur]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0]),
('fault site same currency shortcut #2',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('partial repair boundary #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('partial repair boundary #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 0]),
('fault site same currency shortcut #2',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[3, 0]),
('partial repair boundary #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('partial repair boundary #2',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[3, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[3, 0]),
('fault site same currency shortcut #2',
[7, 'gem', 'gem', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[7, 0]),
('partial repair boundary #1',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[7, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[7, 0]),
('fault site same currency shortcut #2',
[40, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[40, 0]),
('partial repair boundary #1',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[1, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[0, 99]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('fault site same currency shortcut #1',
[1, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('fault site same currency shortcut #2',
[1, 'token', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[1, 0]),
('partial repair boundary #1',
[7, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[6, 99]),
('partial repair boundary #2',
[3, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[2, 90]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('control #1',
[0, 'gem', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0])]]
for label, args, expected in cases[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| same currency no fee #1 | [5, 0] | [5, 0] | Passed |
| fault site same currency shortcut #1 | [751, 0] | [751, 0] | Passed |
| fault site same currency shortcut #2 | [1, 0] | [1, 0] | Passed |
| partial repair boundary #1 | [2, 99] | [2, 99] | Passed |
| partial repair boundary #2 | [6, 89] | [6, 89] | Passed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| fee rounds up #1 | [7, 48] | [7, 48] | Passed |
| control #1 | [2, 49] | [2, 49] | Passed |
SHA-256 / d91cec103387d591f30e5708d152c33b5621187bf5240bab92158fade1f1e519
Verification & scope
Deterministic toy contract stipulated for this model; integer or exact arithmetic only, not a reproduction of any specific game engine. 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:50:47.501560+00:00.
Case digest / a910a4ca0817cc86fcf1c26c62537135eaf238e23e8840c319f735fdc4c02403