FA-96956 / Recipe scaling and nutrition / Open access
Cooked-yield nutrition per serving: energy under moisture loss · case 01
A roast that loses 25% water appears to lose 25% of its calories per serving.
ROOT CAUSE
Per-serving energy is multiplied by the cooking yield, although evaporated water carries no energy.
VERIFIED REPAIR
Divide the retained raw energy by servings without applying the yield.
Unsuccessful approach: Dividing by the yield inflates energy by the same factor the bug deflated it.
Case contract
Rows [name, raw_g, kcal_per_100g, sodium_mg_per_100g, use]; use "eat" counts fully, "marinade" retains 1/5 of its weight and nutrients, "discard" contributes nothing. Cooked weight = retained raw weight * yield_pct/100 (moisture loss changes weight, not energy or sodium). Return half-up integers: serving_g = cooked/servings, kcal and sodium_mg per serving, kcal_per_100g of cooked dish (0 if nothing is retained). servings < 1 returns an error string.
Why this case matters
Recipe nutrition must account for cooking moisture loss and for marinades and aromatics that are not eaten.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(ingredients, yield_pct, servings):
if servings < 1:
return 'error: servings'
kcal = Fraction(0)
na = Fraction(0)
raw = Fraction(0)
for name, g, k, s, use in ingredients:
if use == 'discard':
continue
share = Fraction(1, 5) if use == 'marinade' else Fraction(1)
grams = Fraction(g) * share
raw += grams
kcal += grams * k / 100
na += grams * s / 100
cooked = raw * Fraction(yield_pct, 100)
def r(x):
return math.floor(x + Fraction(1, 2))
return {'serving_g': r(cooked / servings), 'kcal': r(kcal * Fraction(yield_pct, 100) / servings), 'sodium_mg': r(na / servings),
'kcal_per_100g': r(kcal * 100 / cooked) if cooked else 0}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['stock', 510, 10, 350, 'eat'], ['rice', 310, 130, 1, 'eat'], ['bay leaf', 27, 313, 23, 'eat']], 80, 3],
{'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598}],
['repair check: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 175, 40, 4, 'eat'],
['chicken', 625, 165, 70, 'eat']],
110, 4],
{'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689}],
['generated control 1',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat']], 80, 5],
{'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790}],
['generated control 2',
[[['rice', 300, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['stock', 500, 10, 350, 'marinade']], 70,
2],
{'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 45, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']],
75, 1],
{'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433}]],
[['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'eat'], ['rice', 310, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'],
['lemon rind', 30, 47, 6, 'discard'], ['oil', 55, 884, 0, 'eat']],
110, 4],
{'kcal': 483, 'kcal_per_100g': 178, 'serving_g': 271, 'sodium_mg': 108}],
['repair check: energy under moisture loss',
[[['stock', 525, 10, 350, 'eat'], ['oil', 55, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['chicken', 610, 165, 70, 'eat']],
90, 2],
{'kcal': 773, 'kcal_per_100g': 144, 'serving_g': 536, 'sodium_mg': 1132}],
['generated control 1',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
100, 1],
{'kcal': 1412, 'kcal_per_100g': 199, 'serving_g': 710, 'sodium_mg': 2913}],
['generated control 2',
[[['bay leaf', 2, 313, 23, 'discard'], ['onion', 150, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['stock', 510, 10, 350, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 6],
{'kcal': 93, 'kcal_per_100g': 60, 'serving_g': 154, 'sodium_mg': 684}],
['generated control 3',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['rice', 325, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']],
90, 3],
{'kcal': 514, 'kcal_per_100g': 149, 'serving_g': 345, 'sodium_mg': 882}]],
[['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['regression: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 160, 40, 4, 'eat'], ['rice', 300, 130, 1, 'eat']],
80, 5],
{'kcal': 96, 'kcal_per_100g': 119, 'serving_g': 80, 'sodium_mg': 464}],
['repair check: energy under moisture loss',
[[['chicken', 610, 165, 70, 'eat'], ['lemon rind', 20, 47, 6, 'eat']], 90, 5],
{'kcal': 203, 'kcal_per_100g': 179, 'serving_g': 113, 'sodium_mg': 86}],
['generated control 1',
[[['rice', 300, 130, 1, 'eat'], ['oil', 40, 884, 0, 'eat'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade']],
100, 6],
{'kcal': 300, 'kcal_per_100g': 179, 'serving_g': 168, 'sodium_mg': 440}],
['generated control 2',
[[['bay leaf', 27, 313, 23, 'discard'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade']],
75, 4],
{'kcal': 264, 'kcal_per_100g': 211, 'serving_g': 125, 'sodium_mg': 687}],
['generated control 3',
[[['bay leaf', 27, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat'],
['chicken', 625, 165, 70, 'eat']],
100, 2],
{'kcal': 685, 'kcal_per_100g': 115, 'serving_g': 598, 'sodium_mg': 2194}]],
[['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'marinade'], ['soy marinade', 200, 60, 5500, 'marinade'],
['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'eat']],
90, 2],
{'kcal': 232, 'kcal_per_100g': 133, 'serving_g': 174, 'sodium_mg': 1103}],
['repair check: energy under moisture loss',
[[['lemon rind', 45, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat']], 70, 4],
{'kcal': 88, 'kcal_per_100g': 1263, 'serving_g': 7, 'sodium_mg': 0}],
['generated control 1',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['bay leaf', 2, 313, 23, 'eat'],
['onion', 160, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat']],
70, 1],
{'kcal': 146, 'kcal_per_100g': 29, 'serving_g': 500, 'sodium_mg': 4102}],
['generated control 2', [[['rice', 300, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 74, 'kcal_per_100g': 49, 'serving_g': 149, 'sodium_mg': 298}],
['generated control 3',
[[['chicken', 600, 165, 70, 'marinade'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 45, 47, 6, 'eat']],
110, 1],
{'kcal': 642, 'kcal_per_100g': 119, 'serving_g': 539, 'sodium_mg': 90}]],
[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['bay leaf', 27, 313, 23, 'discard'], ['lemon rind', 30, 47, 6, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'marinade'], ['stock', 525, 10, 350, 'marinade']],
75, 5],
{'kcal': 96, 'kcal_per_100g': 247, 'serving_g': 39, 'sodium_mg': 91}],
['repair check: energy under moisture loss',
[[['oil', 40, 884, 0, 'eat'], ['onion', 160, 40, 4, 'eat']], 70, 6],
{'kcal': 70, 'kcal_per_100g': 298, 'serving_g': 23, 'sodium_mg': 1}],
['generated control 1', [[['rice', 310, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 76, 'kcal_per_100g': 50, 'serving_g': 150, 'sodium_mg': 298}],
['generated control 2',
[[['stock', 525, 10, 350, 'eat'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
70, 1],
{'kcal': 961, 'kcal_per_100g': 152, 'serving_g': 634, 'sodium_mg': 1841}],
['generated control 3',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 610, 165, 70, 'marinade']], 60, 6],
{'kcal': 38, 'kcal_per_100g': 228, 'serving_g': 17, 'sodium_mg': 427}]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| plain dish | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | Passed |
| zero servings | error: servings | error: servings | Passed |
| only discarded aromatics | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | Passed |
| regression: energy under moisture loss | {'kcal': 144, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | {'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | Failed |
| repair check: energy under moisture loss | {'kcal': 310, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | {'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | Failed |
| generated control 1 | {'kcal': 12, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | {'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | Failed |
| generated control 2 | {'kcal': 492, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | {'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | Failed |
| generated control 3 | {'kcal': 800, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | {'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | Failed |
SHA-256 / e89b60ff499311e01c3e2529b550a19d89256cf18cfab5ef3ee7b6b7f593f8d1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(ingredients, yield_pct, servings):
if servings < 1:
return 'error: servings'
kcal = Fraction(0)
na = Fraction(0)
raw = Fraction(0)
for name, g, k, s, use in ingredients:
if use == 'discard':
continue
share = Fraction(1, 5) if use == 'marinade' else Fraction(1)
grams = Fraction(g) * share
raw += grams
kcal += grams * k / 100
na += grams * s / 100
cooked = raw * Fraction(yield_pct, 100)
def r(x):
return math.floor(x + Fraction(1, 2))
return {'serving_g': r(cooked / servings), 'kcal': r(kcal / Fraction(yield_pct, 100) / servings), 'sodium_mg': r(na / servings),
'kcal_per_100g': r(kcal * 100 / cooked) if cooked else 0}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['stock', 510, 10, 350, 'eat'], ['rice', 310, 130, 1, 'eat'], ['bay leaf', 27, 313, 23, 'eat']], 80, 3],
{'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598}],
['repair check: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 175, 40, 4, 'eat'],
['chicken', 625, 165, 70, 'eat']],
110, 4],
{'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689}],
['generated control 1',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat']], 80, 5],
{'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790}],
['generated control 2',
[[['rice', 300, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['stock', 500, 10, 350, 'marinade']], 70,
2],
{'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 45, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']],
75, 1],
{'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433}]],
[['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'eat'], ['rice', 310, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'],
['lemon rind', 30, 47, 6, 'discard'], ['oil', 55, 884, 0, 'eat']],
110, 4],
{'kcal': 483, 'kcal_per_100g': 178, 'serving_g': 271, 'sodium_mg': 108}],
['repair check: energy under moisture loss',
[[['stock', 525, 10, 350, 'eat'], ['oil', 55, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['chicken', 610, 165, 70, 'eat']],
90, 2],
{'kcal': 773, 'kcal_per_100g': 144, 'serving_g': 536, 'sodium_mg': 1132}],
['generated control 1',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
100, 1],
{'kcal': 1412, 'kcal_per_100g': 199, 'serving_g': 710, 'sodium_mg': 2913}],
['generated control 2',
[[['bay leaf', 2, 313, 23, 'discard'], ['onion', 150, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['stock', 510, 10, 350, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 6],
{'kcal': 93, 'kcal_per_100g': 60, 'serving_g': 154, 'sodium_mg': 684}],
['generated control 3',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['rice', 325, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']],
90, 3],
{'kcal': 514, 'kcal_per_100g': 149, 'serving_g': 345, 'sodium_mg': 882}]],
[['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['regression: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 160, 40, 4, 'eat'], ['rice', 300, 130, 1, 'eat']],
80, 5],
{'kcal': 96, 'kcal_per_100g': 119, 'serving_g': 80, 'sodium_mg': 464}],
['repair check: energy under moisture loss',
[[['chicken', 610, 165, 70, 'eat'], ['lemon rind', 20, 47, 6, 'eat']], 90, 5],
{'kcal': 203, 'kcal_per_100g': 179, 'serving_g': 113, 'sodium_mg': 86}],
['generated control 1',
[[['rice', 300, 130, 1, 'eat'], ['oil', 40, 884, 0, 'eat'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade']],
100, 6],
{'kcal': 300, 'kcal_per_100g': 179, 'serving_g': 168, 'sodium_mg': 440}],
['generated control 2',
[[['bay leaf', 27, 313, 23, 'discard'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade']],
75, 4],
{'kcal': 264, 'kcal_per_100g': 211, 'serving_g': 125, 'sodium_mg': 687}],
['generated control 3',
[[['bay leaf', 27, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat'],
['chicken', 625, 165, 70, 'eat']],
100, 2],
{'kcal': 685, 'kcal_per_100g': 115, 'serving_g': 598, 'sodium_mg': 2194}]],
[['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'marinade'], ['soy marinade', 200, 60, 5500, 'marinade'],
['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'eat']],
90, 2],
{'kcal': 232, 'kcal_per_100g': 133, 'serving_g': 174, 'sodium_mg': 1103}],
['repair check: energy under moisture loss',
[[['lemon rind', 45, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat']], 70, 4],
{'kcal': 88, 'kcal_per_100g': 1263, 'serving_g': 7, 'sodium_mg': 0}],
['generated control 1',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['bay leaf', 2, 313, 23, 'eat'],
['onion', 160, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat']],
70, 1],
{'kcal': 146, 'kcal_per_100g': 29, 'serving_g': 500, 'sodium_mg': 4102}],
['generated control 2', [[['rice', 300, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 74, 'kcal_per_100g': 49, 'serving_g': 149, 'sodium_mg': 298}],
['generated control 3',
[[['chicken', 600, 165, 70, 'marinade'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 45, 47, 6, 'eat']],
110, 1],
{'kcal': 642, 'kcal_per_100g': 119, 'serving_g': 539, 'sodium_mg': 90}]],
[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['bay leaf', 27, 313, 23, 'discard'], ['lemon rind', 30, 47, 6, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'marinade'], ['stock', 525, 10, 350, 'marinade']],
75, 5],
{'kcal': 96, 'kcal_per_100g': 247, 'serving_g': 39, 'sodium_mg': 91}],
['repair check: energy under moisture loss',
[[['oil', 40, 884, 0, 'eat'], ['onion', 160, 40, 4, 'eat']], 70, 6],
{'kcal': 70, 'kcal_per_100g': 298, 'serving_g': 23, 'sodium_mg': 1}],
['generated control 1', [[['rice', 310, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 76, 'kcal_per_100g': 50, 'serving_g': 150, 'sodium_mg': 298}],
['generated control 2',
[[['stock', 525, 10, 350, 'eat'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
70, 1],
{'kcal': 961, 'kcal_per_100g': 152, 'serving_g': 634, 'sodium_mg': 1841}],
['generated control 3',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 610, 165, 70, 'marinade']], 60, 6],
{'kcal': 38, 'kcal_per_100g': 228, 'serving_g': 17, 'sodium_mg': 427}]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| plain dish | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | Passed |
| zero servings | error: servings | error: servings | Passed |
| only discarded aromatics | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | Passed |
| regression: energy under moisture loss | {'kcal': 224, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | {'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | Failed |
| repair check: energy under moisture loss | {'kcal': 256, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | {'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | Failed |
| generated control 1 | {'kcal': 19, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | {'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | Failed |
| generated control 2 | {'kcal': 1005, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | {'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | Failed |
| generated control 3 | {'kcal': 1422, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | {'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | Failed |
SHA-256 / 5c20c441fa8136c2aa9cd79ea097d485c3cdd95a3fd1697c0cd55c57c07b93be
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(ingredients, yield_pct, servings):
if servings < 1:
return 'error: servings'
kcal = Fraction(0)
na = Fraction(0)
raw = Fraction(0)
for name, g, k, s, use in ingredients:
if use == 'discard':
continue
share = Fraction(1, 5) if use == 'marinade' else Fraction(1)
grams = Fraction(g) * share
raw += grams
kcal += grams * k / 100
na += grams * s / 100
cooked = raw * Fraction(yield_pct, 100)
def r(x):
return math.floor(x + Fraction(1, 2))
return {'serving_g': r(cooked / servings), 'kcal': r(kcal / servings), 'sodium_mg': r(na / servings),
'kcal_per_100g': r(kcal * 100 / cooked) if cooked else 0}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['stock', 510, 10, 350, 'eat'], ['rice', 310, 130, 1, 'eat'], ['bay leaf', 27, 313, 23, 'eat']], 80, 3],
{'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598}],
['repair check: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 175, 40, 4, 'eat'],
['chicken', 625, 165, 70, 'eat']],
110, 4],
{'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689}],
['generated control 1',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat']], 80, 5],
{'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790}],
['generated control 2',
[[['rice', 300, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['stock', 500, 10, 350, 'marinade']], 70,
2],
{'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 45, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']],
75, 1],
{'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433}]],
[['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'eat'], ['rice', 310, 130, 1, 'eat'], ['chicken', 610, 165, 70, 'eat'],
['lemon rind', 30, 47, 6, 'discard'], ['oil', 55, 884, 0, 'eat']],
110, 4],
{'kcal': 483, 'kcal_per_100g': 178, 'serving_g': 271, 'sodium_mg': 108}],
['repair check: energy under moisture loss',
[[['stock', 525, 10, 350, 'eat'], ['oil', 55, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['chicken', 610, 165, 70, 'eat']],
90, 2],
{'kcal': 773, 'kcal_per_100g': 144, 'serving_g': 536, 'sodium_mg': 1132}],
['generated control 1',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
100, 1],
{'kcal': 1412, 'kcal_per_100g': 199, 'serving_g': 710, 'sodium_mg': 2913}],
['generated control 2',
[[['bay leaf', 2, 313, 23, 'discard'], ['onion', 150, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['stock', 510, 10, 350, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 6],
{'kcal': 93, 'kcal_per_100g': 60, 'serving_g': 154, 'sodium_mg': 684}],
['generated control 3',
[[['soy marinade', 200, 60, 5500, 'marinade'], ['chicken', 625, 165, 70, 'eat'],
['lemon rind', 20, 47, 6, 'discard'], ['rice', 325, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']],
90, 3],
{'kcal': 514, 'kcal_per_100g': 149, 'serving_g': 345, 'sodium_mg': 882}]],
[['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['regression: energy under moisture loss',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['onion', 160, 40, 4, 'eat'], ['rice', 300, 130, 1, 'eat']],
80, 5],
{'kcal': 96, 'kcal_per_100g': 119, 'serving_g': 80, 'sodium_mg': 464}],
['repair check: energy under moisture loss',
[[['chicken', 610, 165, 70, 'eat'], ['lemon rind', 20, 47, 6, 'eat']], 90, 5],
{'kcal': 203, 'kcal_per_100g': 179, 'serving_g': 113, 'sodium_mg': 86}],
['generated control 1',
[[['rice', 300, 130, 1, 'eat'], ['oil', 40, 884, 0, 'eat'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade']],
100, 6],
{'kcal': 300, 'kcal_per_100g': 179, 'serving_g': 168, 'sodium_mg': 440}],
['generated control 2',
[[['bay leaf', 27, 313, 23, 'discard'], ['chicken', 625, 165, 70, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade']],
75, 4],
{'kcal': 264, 'kcal_per_100g': 211, 'serving_g': 125, 'sodium_mg': 687}],
['generated control 3',
[[['bay leaf', 27, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 500, 10, 350, 'eat'],
['chicken', 625, 165, 70, 'eat']],
100, 2],
{'kcal': 685, 'kcal_per_100g': 115, 'serving_g': 598, 'sodium_mg': 2194}]],
[['marinated chicken',
[[['chicken', 600, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 4],
{'kcal': 254, 'kcal_per_100g': 211, 'serving_g': 120, 'sodium_mg': 655}],
['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['regression: energy under moisture loss',
[[['bay leaf', 12, 313, 23, 'marinade'], ['soy marinade', 200, 60, 5500, 'marinade'],
['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'eat']],
90, 2],
{'kcal': 232, 'kcal_per_100g': 133, 'serving_g': 174, 'sodium_mg': 1103}],
['repair check: energy under moisture loss',
[[['lemon rind', 45, 47, 6, 'discard'], ['oil', 40, 884, 0, 'eat']], 70, 4],
{'kcal': 88, 'kcal_per_100g': 1263, 'serving_g': 7, 'sodium_mg': 0}],
['generated control 1',
[[['soy marinade', 210, 60, 5500, 'marinade'], ['bay leaf', 2, 313, 23, 'eat'],
['onion', 160, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat']],
70, 1],
{'kcal': 146, 'kcal_per_100g': 29, 'serving_g': 500, 'sodium_mg': 4102}],
['generated control 2', [[['rice', 300, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 74, 'kcal_per_100g': 49, 'serving_g': 149, 'sodium_mg': 298}],
['generated control 3',
[[['chicken', 600, 165, 70, 'marinade'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 45, 47, 6, 'eat']],
110, 1],
{'kcal': 642, 'kcal_per_100g': 119, 'serving_g': 539, 'sodium_mg': 90}]],
[['plain dish', [[['rice', 300, 130, 1, 'eat']], 100, 3],
{'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1}],
['zero servings', [[['rice', 300, 130, 1, 'eat']], 80, 0], 'error: servings'],
['only discarded aromatics', [[['bay leaf', 2, 313, 23, 'discard']], 90, 2],
{'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0}],
['regression: energy under moisture loss',
[[['bay leaf', 27, 313, 23, 'discard'], ['lemon rind', 30, 47, 6, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'marinade'], ['stock', 525, 10, 350, 'marinade']],
75, 5],
{'kcal': 96, 'kcal_per_100g': 247, 'serving_g': 39, 'sodium_mg': 91}],
['repair check: energy under moisture loss',
[[['oil', 40, 884, 0, 'eat'], ['onion', 160, 40, 4, 'eat']], 70, 6],
{'kcal': 70, 'kcal_per_100g': 298, 'serving_g': 23, 'sodium_mg': 1}],
['generated control 1', [[['rice', 310, 130, 1, 'eat'], ['stock', 510, 10, 350, 'eat']], 110, 6],
{'kcal': 76, 'kcal_per_100g': 50, 'serving_g': 150, 'sodium_mg': 298}],
['generated control 2',
[[['stock', 525, 10, 350, 'eat'], ['rice', 325, 130, 1, 'eat'], ['lemon rind', 20, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
70, 1],
{'kcal': 961, 'kcal_per_100g': 152, 'serving_g': 634, 'sodium_mg': 1841}],
['generated control 3',
[[['soy marinade', 225, 60, 5500, 'marinade'], ['chicken', 610, 165, 70, 'marinade']], 60, 6],
{'kcal': 38, 'kcal_per_100g': 228, 'serving_g': 17, 'sodium_mg': 427}]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| plain dish | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | {'kcal': 130, 'kcal_per_100g': 130, 'serving_g': 100, 'sodium_mg': 1} | Passed |
| zero servings | error: servings | error: servings | Passed |
| only discarded aromatics | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | Passed |
| regression: energy under moisture loss | {'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | {'kcal': 180, 'kcal_per_100g': 79, 'serving_g': 226, 'sodium_mg': 598} | Passed |
| repair check: energy under moisture loss | {'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | {'kcal': 282, 'kcal_per_100g': 122, 'serving_g': 232, 'sodium_mg': 689} | Passed |
| generated control 1 | {'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | {'kcal': 15, 'kcal_per_100g': 17, 'serving_g': 86, 'sodium_mg': 790} | Passed |
| generated control 2 | {'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | {'kcal': 703, 'kcal_per_100g': 199, 'serving_g': 354, 'sodium_mg': 390} | Passed |
| generated control 3 | {'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | {'kcal': 1067, 'kcal_per_100g': 187, 'serving_g': 570, 'sodium_mg': 433} | Passed |
SHA-256 / 554e2bde7ee62e35b79d0d32c68bb1ab4565d3b5e3038184fffb27430f162fca
Verification & scope
A deterministic toy contract stated in full here; it is a bounded teaching model, not an authoritative reference or standards implementation. 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:52:27.496722+00:00.
Case digest / 359a18f3cd6512d4c052b64e93235d1637bd3d8058ba4f0a6bb0634c7c981a12