FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 servingserror: servingserror: servingsPassed
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 fixtureActualExpectedOutcome
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 servingserror: servingserror: servingsPassed
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 fixtureActualExpectedOutcome
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 servingserror: servingserror: servingsPassed
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