FA-86226 / Game economy crafting balance / Open access
Currency exchange desk: Change ignores the fee · case 01
Change returned is computed before deducting the fee.
ROOT CAUSE
The copper change is taken from the gross value.
VERIFIED REPAIR
Restore `net % rates[to_cur]` at the change remainder step.
Unsuccessful approach: Subtracting the coin count mixes units.
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:
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], value % rates[to_cur]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49]),
('regression change remainder #2',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('regression change remainder #3',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #4',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('fault site change remainder #1',
[3, 'copper', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 2]),
('regression change remainder #2',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #3',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('fault site change remainder #1',
[1, 'copper', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0]),
('regression change remainder #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #2',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #3',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('regression change remainder #3',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('regression change remainder #4',
[7, 'gold', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[698, 25]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('fault site change remainder #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('regression change remainder #2',
[7, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[17, 41]),
('regression change remainder #3',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 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 |
|---|---|---|---|
| fee rounds up #1 | [7, 50] | [7, 48] | Failed |
| regression change remainder #1 | [2, 50] | [2, 49] | Failed |
| regression change remainder #2 | [128777, 0] | [128777, 25] | Failed |
| regression change remainder #3 | [2, 0] | [2, 99] | Failed |
| regression change remainder #4 | [7, 50] | [7, 46] | Failed |
| same currency no fee #1 | [5, 0] | [5, 0] | Passed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| control #1 | [751, 0] | [751, 0] | Passed |
SHA-256 / 8c26ed000f83a916fcf1d1d7c1b97352988faf367884f00efc8e40bfbbb58d03
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 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 - net // rates[to_cur]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49]),
('regression change remainder #2',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('regression change remainder #3',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #4',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('fault site change remainder #1',
[3, 'copper', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 2]),
('regression change remainder #2',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #3',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('fault site change remainder #1',
[1, 'copper', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0]),
('regression change remainder #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #2',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #3',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('regression change remainder #3',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('regression change remainder #4',
[7, 'gold', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[698, 25]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('fault site change remainder #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('regression change remainder #2',
[7, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[17, 41]),
('regression change remainder #3',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 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 |
|---|---|---|---|
| fee rounds up #1 | [7, 741] | [7, 48] | Failed |
| regression change remainder #1 | [2, 247] | [2, 49] | Failed |
| regression change remainder #2 | [128777, 12748948] | [128777, 25] | Failed |
| regression change remainder #3 | [2, 297] | [2, 99] | Failed |
| regression change remainder #4 | [7, 739] | [7, 46] | Failed |
| same currency no fee #1 | [5, 0] | [5, 0] | Passed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| control #1 | [751, 0] | [751, 0] | Passed |
SHA-256 / cb780edf5d5b51d8c971235da393003b94f52886b3473830109337da63faeb0c
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 = [[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[2, 49]),
('regression change remainder #2',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('regression change remainder #3',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #4',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[1291, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[128777, 25]),
('fault site change remainder #1',
[3, 'copper', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 2]),
('regression change remainder #2',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #3',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('fault site change remainder #1',
[1, 'copper', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[0, 0]),
('regression change remainder #1',
[3, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[2, 99]),
('regression change remainder #2',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #3',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[751, 'silver', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[751, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[7, 46]),
('regression change remainder #2',
[7, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[6, 89]),
('regression change remainder #3',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('regression change remainder #4',
[7, 'gold', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[698, 25]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[7, 'gold', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 333],
[67669, 0])],
[('fee rounds up #1', [3, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 25], [7, 48]),
('regression change remainder #1',
[40, 'gold', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 1],
[3999, 60]),
('fault site change remainder #1',
[1, 'token', 'silver', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 25],
[0, 99]),
('regression change remainder #2',
[7, 'gem', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[17, 41]),
('regression change remainder #3',
[40, 'silver', 'token', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 150],
[39, 40]),
('same currency no fee #1',
[5, 'gold', 'gold', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250}, 150],
[5, 0]),
('zero amount with fee #1', [0, 'gem', 'silver', {'copper': 1, 'silver': 100, 'gem': 250}, 50], [0, 0]),
('control #1',
[1, 'copper', 'copper', {'copper': 1, 'silver': 100, 'gold': 10000, 'gem': 250, 'token': 100}, 50],
[1, 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 |
|---|---|---|---|
| fee rounds up #1 | [7, 48] | [7, 48] | Passed |
| regression change remainder #1 | [2, 49] | [2, 49] | Passed |
| regression change remainder #2 | [128777, 25] | [128777, 25] | Passed |
| regression change remainder #3 | [2, 99] | [2, 99] | Passed |
| regression change remainder #4 | [7, 46] | [7, 46] | Passed |
| same currency no fee #1 | [5, 0] | [5, 0] | Passed |
| zero amount with fee #1 | [0, 0] | [0, 0] | Passed |
| control #1 | [751, 0] | [751, 0] | Passed |
SHA-256 / e5eca149a8e21ef630619b25b7890e5b52be1ddf5757b58256ddeaaba37468c8
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.590944+00:00.
Case digest / b31d97f461750782aa55c12c921e5e3792c418ec47a9616296a55023109330dd