FA-96971 / Recipe scaling and nutrition / Open access
Cooked-yield nutrition per serving: discarded aromatics · case 01
A bay leaf removed before serving still adds weight and calories.
ROOT CAUSE
Discarded rows are skipped only when they have zero energy.
VERIFIED REPAIR
Skip every discard row regardless of its values.
Unsuccessful approach: Skipping only light discards still counts a 20 g lemon rind that is removed.
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' and k == 0:
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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['stock', 525, 10, 350, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['onion', 175, 40, 4, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 4],
{'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039}],
['repair check: discarded aromatics',
[[['bay leaf', 12, 313, 23, 'discard'], ['oil', 30, 884, 0, 'marinade']], 75, 2],
{'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0}],
['generated control 1',
[[['onion', 175, 40, 4, 'eat'], ['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat']], 100, 1],
{'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845}],
['generated control 2', [[['oil', 30, 884, 0, 'marinade'], ['onion', 160, 40, 4, 'eat']], 75, 2],
{'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 30, 47, 6, 'discard'], ['rice', 310, 130, 1, 'eat'],
['chicken', 610, 165, 70, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
75, 5],
{'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87}]],
[['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: discarded aromatics',
[[['bay leaf', 2, 313, 23, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
80, 2],
{'kcal': 749, 'kcal_per_100g': 281, 'serving_g': 267, 'sodium_mg': 214}],
['repair check: discarded aromatics',
[[['lemon rind', 20, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']], 60, 1],
{'kcal': 1007, 'kcal_per_100g': 275, 'serving_g': 366, 'sodium_mg': 427}],
['generated control 1',
[[['chicken', 610, 165, 70, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']], 70, 5],
{'kcal': 206, 'kcal_per_100g': 226, 'serving_g': 91, 'sodium_mg': 547}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat'], ['chicken', 625, 165, 70, 'eat'], ['bay leaf', 12, 313, 23, 'eat']],
70, 6],
{'kcal': 253, 'kcal_per_100g': 210, 'serving_g': 121, 'sodium_mg': 459}],
['generated control 3',
[[['bay leaf', 2, 313, 23, 'marinade'], ['lemon rind', 30, 47, 6, 'eat'],
['chicken', 600, 165, 70, 'eat']],
90, 4],
{'kcal': 251, 'kcal_per_100g': 177, 'serving_g': 142, 'sodium_mg': 105}]],
[['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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['bay leaf', 2, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'eat']],
75, 4],
{'kcal': 422, 'kcal_per_100g': 235, 'serving_g': 179, 'sodium_mg': 110}],
['repair check: discarded aromatics',
[[['chicken', 600, 165, 70, 'eat'], ['stock', 500, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade'], ['lemon rind', 30, 47, 6, 'discard']],
80, 6],
{'kcal': 189, 'kcal_per_100g': 108, 'serving_g': 176, 'sodium_mg': 748}],
['generated control 1',
[[['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['rice', 310, 130, 1, 'eat'], ['chicken', 600, 165, 70, 'eat']],
60, 4],
{'kcal': 428, 'kcal_per_100g': 195, 'serving_g': 220, 'sodium_mg': 565}],
['generated control 2',
[[['stock', 510, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['bay leaf', 2, 313, 23, 'discard'], ['soy marinade', 225, 60, 5500, 'marinade']],
75, 5],
{'kcal': 114, 'kcal_per_100g': 72, 'serving_g': 158, 'sodium_mg': 854}],
['generated control 3',
[[['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade']],
60, 6],
{'kcal': 48, 'kcal_per_100g': 689, 'serving_g': 7, 'sodium_mg': 367}]],
[['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: discarded aromatics',
[[['chicken', 610, 165, 70, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade'], ['oil', 40, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat']],
70, 4],
{'kcal': 447, 'kcal_per_100g': 255, 'serving_g': 175, 'sodium_mg': 658}],
['repair check: discarded aromatics',
[[['stock', 500, 10, 350, 'eat'], ['lemon rind', 30, 47, 6, 'discard']], 60, 2],
{'kcal': 25, 'kcal_per_100g': 17, 'serving_g': 150, 'sodium_mg': 875}],
['generated control 1',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat']],
100, 5],
{'kcal': 90, 'kcal_per_100g': 113, 'serving_g': 79, 'sodium_mg': 463}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['bay leaf', 12, 313, 23, 'eat'], ['chicken', 600, 165, 70, 'eat'],
['oil', 30, 884, 0, 'eat'], ['stock', 510, 10, 350, 'eat']],
80, 1],
{'kcal': 1365, 'kcal_per_100g': 143, 'serving_g': 958, 'sodium_mg': 2210}],
['generated control 3',
[[['stock', 500, 10, 350, 'eat'], ['rice', 300, 130, 1, 'eat'], ['oil', 30, 884, 0, 'eat']], 110, 1],
{'kcal': 705, 'kcal_per_100g': 77, 'serving_g': 913, 'sodium_mg': 1753}]],
[['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: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['onion', 175, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat'],
['rice', 310, 130, 1, 'eat']],
110, 2],
{'kcal': 262, 'kcal_per_100g': 48, 'serving_g': 547, 'sodium_mg': 898}],
['repair check: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['rice', 310, 130, 1, 'eat'], ['onion', 150, 40, 4, 'eat']], 70,
2],
{'kcal': 232, 'kcal_per_100g': 144, 'serving_g': 161, 'sodium_mg': 5}],
['generated control 1',
[[['oil', 30, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']], 90, 5],
{'kcal': 146, 'kcal_per_100g': 163, 'serving_g': 90, 'sodium_mg': 2}],
['generated control 2',
[[['chicken', 625, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 6],
{'kcal': 176, 'kcal_per_100g': 212, 'serving_g': 83, 'sodium_mg': 440}],
['generated control 3',
[[['bay leaf', 12, 313, 23, 'discard'], ['onion', 160, 40, 4, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 525, 10, 350, 'marinade'],
['oil', 30, 884, 0, 'eat']],
70, 2],
{'kcal': 182, 'kcal_per_100g': 155, 'serving_g': 117, 'sodium_mg': 1287}]]]
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': 3, 'kcal_per_100g': 348, 'serving_g': 1, 'sodium_mg': 0} | {'kcal': 0, 'kcal_per_100g': 0, 'serving_g': 0, 'sodium_mg': 0} | Failed |
| regression: discarded aromatics | {'kcal': 140, 'kcal_per_100g': 57, 'serving_g': 245, 'sodium_mg': 1040} | {'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039} | Failed |
| repair check: discarded aromatics | {'kcal': 45, 'kcal_per_100g': 671, 'serving_g': 7, 'sodium_mg': 1} | {'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0} | Failed |
| generated control 1 | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | Passed |
| generated control 2 | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | Passed |
| generated control 3 | {'kcal': 314, 'kcal_per_100g': 186, 'serving_g': 169, 'sodium_mg': 89} | {'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87} | Failed |
SHA-256 / d74dd37569db9641029e68b1253df0cb6c41e46f1d1a6f342c1ee1cb9c73afb5
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' and g < 10:
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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['stock', 525, 10, 350, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['onion', 175, 40, 4, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 4],
{'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039}],
['repair check: discarded aromatics',
[[['bay leaf', 12, 313, 23, 'discard'], ['oil', 30, 884, 0, 'marinade']], 75, 2],
{'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0}],
['generated control 1',
[[['onion', 175, 40, 4, 'eat'], ['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat']], 100, 1],
{'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845}],
['generated control 2', [[['oil', 30, 884, 0, 'marinade'], ['onion', 160, 40, 4, 'eat']], 75, 2],
{'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 30, 47, 6, 'discard'], ['rice', 310, 130, 1, 'eat'],
['chicken', 610, 165, 70, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
75, 5],
{'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87}]],
[['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: discarded aromatics',
[[['bay leaf', 2, 313, 23, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
80, 2],
{'kcal': 749, 'kcal_per_100g': 281, 'serving_g': 267, 'sodium_mg': 214}],
['repair check: discarded aromatics',
[[['lemon rind', 20, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']], 60, 1],
{'kcal': 1007, 'kcal_per_100g': 275, 'serving_g': 366, 'sodium_mg': 427}],
['generated control 1',
[[['chicken', 610, 165, 70, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']], 70, 5],
{'kcal': 206, 'kcal_per_100g': 226, 'serving_g': 91, 'sodium_mg': 547}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat'], ['chicken', 625, 165, 70, 'eat'], ['bay leaf', 12, 313, 23, 'eat']],
70, 6],
{'kcal': 253, 'kcal_per_100g': 210, 'serving_g': 121, 'sodium_mg': 459}],
['generated control 3',
[[['bay leaf', 2, 313, 23, 'marinade'], ['lemon rind', 30, 47, 6, 'eat'],
['chicken', 600, 165, 70, 'eat']],
90, 4],
{'kcal': 251, 'kcal_per_100g': 177, 'serving_g': 142, 'sodium_mg': 105}]],
[['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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['bay leaf', 2, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'eat']],
75, 4],
{'kcal': 422, 'kcal_per_100g': 235, 'serving_g': 179, 'sodium_mg': 110}],
['repair check: discarded aromatics',
[[['chicken', 600, 165, 70, 'eat'], ['stock', 500, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade'], ['lemon rind', 30, 47, 6, 'discard']],
80, 6],
{'kcal': 189, 'kcal_per_100g': 108, 'serving_g': 176, 'sodium_mg': 748}],
['generated control 1',
[[['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['rice', 310, 130, 1, 'eat'], ['chicken', 600, 165, 70, 'eat']],
60, 4],
{'kcal': 428, 'kcal_per_100g': 195, 'serving_g': 220, 'sodium_mg': 565}],
['generated control 2',
[[['stock', 510, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['bay leaf', 2, 313, 23, 'discard'], ['soy marinade', 225, 60, 5500, 'marinade']],
75, 5],
{'kcal': 114, 'kcal_per_100g': 72, 'serving_g': 158, 'sodium_mg': 854}],
['generated control 3',
[[['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade']],
60, 6],
{'kcal': 48, 'kcal_per_100g': 689, 'serving_g': 7, 'sodium_mg': 367}]],
[['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: discarded aromatics',
[[['chicken', 610, 165, 70, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade'], ['oil', 40, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat']],
70, 4],
{'kcal': 447, 'kcal_per_100g': 255, 'serving_g': 175, 'sodium_mg': 658}],
['repair check: discarded aromatics',
[[['stock', 500, 10, 350, 'eat'], ['lemon rind', 30, 47, 6, 'discard']], 60, 2],
{'kcal': 25, 'kcal_per_100g': 17, 'serving_g': 150, 'sodium_mg': 875}],
['generated control 1',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat']],
100, 5],
{'kcal': 90, 'kcal_per_100g': 113, 'serving_g': 79, 'sodium_mg': 463}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['bay leaf', 12, 313, 23, 'eat'], ['chicken', 600, 165, 70, 'eat'],
['oil', 30, 884, 0, 'eat'], ['stock', 510, 10, 350, 'eat']],
80, 1],
{'kcal': 1365, 'kcal_per_100g': 143, 'serving_g': 958, 'sodium_mg': 2210}],
['generated control 3',
[[['stock', 500, 10, 350, 'eat'], ['rice', 300, 130, 1, 'eat'], ['oil', 30, 884, 0, 'eat']], 110, 1],
{'kcal': 705, 'kcal_per_100g': 77, 'serving_g': 913, 'sodium_mg': 1753}]],
[['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: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['onion', 175, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat'],
['rice', 310, 130, 1, 'eat']],
110, 2],
{'kcal': 262, 'kcal_per_100g': 48, 'serving_g': 547, 'sodium_mg': 898}],
['repair check: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['rice', 310, 130, 1, 'eat'], ['onion', 150, 40, 4, 'eat']], 70,
2],
{'kcal': 232, 'kcal_per_100g': 144, 'serving_g': 161, 'sodium_mg': 5}],
['generated control 1',
[[['oil', 30, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']], 90, 5],
{'kcal': 146, 'kcal_per_100g': 163, 'serving_g': 90, 'sodium_mg': 2}],
['generated control 2',
[[['chicken', 625, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 6],
{'kcal': 176, 'kcal_per_100g': 212, 'serving_g': 83, 'sodium_mg': 440}],
['generated control 3',
[[['bay leaf', 12, 313, 23, 'discard'], ['onion', 160, 40, 4, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 525, 10, 350, 'marinade'],
['oil', 30, 884, 0, 'eat']],
70, 2],
{'kcal': 182, 'kcal_per_100g': 155, 'serving_g': 117, 'sodium_mg': 1287}]]]
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: discarded aromatics | {'kcal': 140, 'kcal_per_100g': 57, 'serving_g': 245, 'sodium_mg': 1040} | {'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039} | Failed |
| repair check: discarded aromatics | {'kcal': 45, 'kcal_per_100g': 671, 'serving_g': 7, 'sodium_mg': 1} | {'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0} | Failed |
| generated control 1 | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | Passed |
| generated control 2 | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | Passed |
| generated control 3 | {'kcal': 314, 'kcal_per_100g': 186, 'serving_g': 169, 'sodium_mg': 89} | {'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87} | Failed |
SHA-256 / 8c02b0430849012041a450989dbd9ddf48c574ff8a574a2a23f7896e5902ef57
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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['stock', 525, 10, 350, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['onion', 175, 40, 4, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']],
90, 4],
{'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039}],
['repair check: discarded aromatics',
[[['bay leaf', 12, 313, 23, 'discard'], ['oil', 30, 884, 0, 'marinade']], 75, 2],
{'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0}],
['generated control 1',
[[['onion', 175, 40, 4, 'eat'], ['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat']], 100, 1],
{'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845}],
['generated control 2', [[['oil', 30, 884, 0, 'marinade'], ['onion', 160, 40, 4, 'eat']], 75, 2],
{'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3}],
['generated control 3',
[[['onion', 150, 40, 4, 'eat'], ['lemon rind', 30, 47, 6, 'discard'], ['rice', 310, 130, 1, 'eat'],
['chicken', 610, 165, 70, 'eat'], ['bay leaf', 27, 313, 23, 'discard']],
75, 5],
{'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87}]],
[['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: discarded aromatics',
[[['bay leaf', 2, 313, 23, 'eat'], ['chicken', 610, 165, 70, 'eat'], ['lemon rind', 45, 47, 6, 'discard'],
['oil', 55, 884, 0, 'eat']],
80, 2],
{'kcal': 749, 'kcal_per_100g': 281, 'serving_g': 267, 'sodium_mg': 214}],
['repair check: discarded aromatics',
[[['lemon rind', 20, 47, 6, 'discard'], ['chicken', 610, 165, 70, 'eat']], 60, 1],
{'kcal': 1007, 'kcal_per_100g': 275, 'serving_g': 366, 'sodium_mg': 427}],
['generated control 1',
[[['chicken', 610, 165, 70, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade']], 70, 5],
{'kcal': 206, 'kcal_per_100g': 226, 'serving_g': 91, 'sodium_mg': 547}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat'], ['chicken', 625, 165, 70, 'eat'], ['bay leaf', 12, 313, 23, 'eat']],
70, 6],
{'kcal': 253, 'kcal_per_100g': 210, 'serving_g': 121, 'sodium_mg': 459}],
['generated control 3',
[[['bay leaf', 2, 313, 23, 'marinade'], ['lemon rind', 30, 47, 6, 'eat'],
['chicken', 600, 165, 70, 'eat']],
90, 4],
{'kcal': 251, 'kcal_per_100g': 177, 'serving_g': 142, 'sodium_mg': 105}]],
[['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: discarded aromatics',
[[['rice', 300, 130, 1, 'eat'], ['bay leaf', 2, 313, 23, 'discard'], ['oil', 30, 884, 0, 'eat'],
['chicken', 625, 165, 70, 'eat']],
75, 4],
{'kcal': 422, 'kcal_per_100g': 235, 'serving_g': 179, 'sodium_mg': 110}],
['repair check: discarded aromatics',
[[['chicken', 600, 165, 70, 'eat'], ['stock', 500, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'],
['soy marinade', 210, 60, 5500, 'marinade'], ['lemon rind', 30, 47, 6, 'discard']],
80, 6],
{'kcal': 189, 'kcal_per_100g': 108, 'serving_g': 176, 'sodium_mg': 748}],
['generated control 1',
[[['stock', 525, 10, 350, 'eat'], ['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['rice', 310, 130, 1, 'eat'], ['chicken', 600, 165, 70, 'eat']],
60, 4],
{'kcal': 428, 'kcal_per_100g': 195, 'serving_g': 220, 'sodium_mg': 565}],
['generated control 2',
[[['stock', 510, 10, 350, 'eat'], ['onion', 175, 40, 4, 'eat'], ['rice', 325, 130, 1, 'eat'],
['bay leaf', 2, 313, 23, 'discard'], ['soy marinade', 225, 60, 5500, 'marinade']],
75, 5],
{'kcal': 114, 'kcal_per_100g': 72, 'serving_g': 158, 'sodium_mg': 854}],
['generated control 3',
[[['oil', 30, 884, 0, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade']],
60, 6],
{'kcal': 48, 'kcal_per_100g': 689, 'serving_g': 7, 'sodium_mg': 367}]],
[['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: discarded aromatics',
[[['chicken', 610, 165, 70, 'eat'], ['bay leaf', 2, 313, 23, 'discard'],
['soy marinade', 200, 60, 5500, 'marinade'], ['oil', 40, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat']],
70, 4],
{'kcal': 447, 'kcal_per_100g': 255, 'serving_g': 175, 'sodium_mg': 658}],
['repair check: discarded aromatics',
[[['stock', 500, 10, 350, 'eat'], ['lemon rind', 30, 47, 6, 'discard']], 60, 2],
{'kcal': 25, 'kcal_per_100g': 17, 'serving_g': 150, 'sodium_mg': 875}],
['generated control 1',
[[['lemon rind', 45, 47, 6, 'eat'], ['soy marinade', 210, 60, 5500, 'marinade'],
['rice', 310, 130, 1, 'eat']],
100, 5],
{'kcal': 90, 'kcal_per_100g': 113, 'serving_g': 79, 'sodium_mg': 463}],
['generated control 2',
[[['lemon rind', 45, 47, 6, 'eat'], ['bay leaf', 12, 313, 23, 'eat'], ['chicken', 600, 165, 70, 'eat'],
['oil', 30, 884, 0, 'eat'], ['stock', 510, 10, 350, 'eat']],
80, 1],
{'kcal': 1365, 'kcal_per_100g': 143, 'serving_g': 958, 'sodium_mg': 2210}],
['generated control 3',
[[['stock', 500, 10, 350, 'eat'], ['rice', 300, 130, 1, 'eat'], ['oil', 30, 884, 0, 'eat']], 110, 1],
{'kcal': 705, 'kcal_per_100g': 77, 'serving_g': 913, 'sodium_mg': 1753}]],
[['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: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['onion', 175, 40, 4, 'eat'], ['stock', 510, 10, 350, 'eat'],
['rice', 310, 130, 1, 'eat']],
110, 2],
{'kcal': 262, 'kcal_per_100g': 48, 'serving_g': 547, 'sodium_mg': 898}],
['repair check: discarded aromatics',
[[['bay leaf', 27, 313, 23, 'discard'], ['rice', 310, 130, 1, 'eat'], ['onion', 150, 40, 4, 'eat']], 70,
2],
{'kcal': 232, 'kcal_per_100g': 144, 'serving_g': 161, 'sodium_mg': 5}],
['generated control 1',
[[['oil', 30, 884, 0, 'eat'], ['rice', 310, 130, 1, 'eat'], ['onion', 160, 40, 4, 'eat']], 90, 5],
{'kcal': 146, 'kcal_per_100g': 163, 'serving_g': 90, 'sodium_mg': 2}],
['generated control 2',
[[['chicken', 625, 165, 70, 'eat'], ['soy marinade', 200, 60, 5500, 'marinade']], 75, 6],
{'kcal': 176, 'kcal_per_100g': 212, 'serving_g': 83, 'sodium_mg': 440}],
['generated control 3',
[[['bay leaf', 12, 313, 23, 'discard'], ['onion', 160, 40, 4, 'eat'],
['soy marinade', 200, 60, 5500, 'marinade'], ['stock', 525, 10, 350, 'marinade'],
['oil', 30, 884, 0, 'eat']],
70, 2],
{'kcal': 182, 'kcal_per_100g': 155, 'serving_g': 117, 'sodium_mg': 1287}]]]
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: discarded aromatics | {'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039} | {'kcal': 134, 'kcal_per_100g': 57, 'serving_g': 234, 'sodium_mg': 1039} | Passed |
| repair check: discarded aromatics | {'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0} | {'kcal': 27, 'kcal_per_100g': 1179, 'serving_g': 2, 'sodium_mg': 0} | Passed |
| generated control 1 | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | {'kcal': 388, 'kcal_per_100g': 53, 'serving_g': 730, 'sodium_mg': 1845} | Passed |
| generated control 2 | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | {'kcal': 59, 'kcal_per_100g': 94, 'serving_g': 62, 'sodium_mg': 3} | Passed |
| generated control 3 | {'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87} | {'kcal': 294, 'kcal_per_100g': 183, 'serving_g': 161, 'sodium_mg': 87} | Passed |
SHA-256 / cd24f10cffb95e6e1a77e61a07bd51569185e7da7a131d759b2f0efcd1f3b200
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.606821+00:00.
Case digest / 07d29edac874b6f1292deac816c38d4cf627a4c2dc3448e268041e0ca8f06f88