FAILURE MAP
← Case archive

FA-97071 / Recipe scaling and nutrition / Open access

Yeast type converter: teaspoon quantity source · case 01

Teaspoons shown for converted active dry yeast match the original instant amount.

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

ROOT CAUSE

The spoon count is derived from the input grams instead of converted grams.

VERIFIED REPAIR

Derive teaspoons from converted grams.

Unsuccessful approach: Instant-equivalent grams still miss the target ratio for active dry.

Case contract

Types (trimmed, case-insensitive) instant, active dry, fresh with grams per 1 g instant: 1, 5/4, 3. Unknown -> "error: yeast type". grams = amount/ratio[from]*ratio[to], printed half-up to 0.1 (float). tsp: None for fresh; else grams/3.1 in quarter teaspoons half-up: 0 -> "less than 1/4", <4 quarters -> "q/4", whole -> "n", else "n q/4" (quarters not reduced). bloom is True only when converting to active dry.

Why this case matters

Bakers substitute yeast forms and need both weight and spoon measures.

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(amount_g, from_type, to_type):
    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}
    f, t = from_type.strip().lower(), to_type.strip().lower()
    if f not in R or t not in R:
        return 'error: yeast type'
    g = Fraction(str(amount_g)) / R[f] * R[t]
    grams = math.floor(g * 10 + Fraction(1, 2)) / 10
    out = {'grams': grams}
    if t == 'fresh':
        out['tsp'] = None
    else:
        q = math.floor(Fraction(str(amount_g)) / Fraction(31, 10) * 4 + Fraction(1, 2))
        if q == 0:
            out['tsp'] = 'less than 1/4'
        elif q < 4:
            out['tsp'] = '%d/4' % q
        elif q % 4 == 0:
            out['tsp'] = '%d' % (q // 4)
        else:
            out['tsp'] = '%d %d/4' % divmod(q, 4)
    out['bloom'] = t == 'active dry'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['regression: teaspoon quantity source', [2.5, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 1.0, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['generated control 1', [4, ' Instant', 'fresh'], {'bloom': False, 'grams': 12.0, 'tsp': None}],
  ['generated control 2', [0.3, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],
  ['generated control 3', [14, 'instant', ' Instant'], {'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}]],
 [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['regression: teaspoon quantity source', [2, 'fresh', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['generated control 1', [14, ' Instant', 'fresh'], {'bloom': False, 'grams': 42.0, 'tsp': None}],
  ['generated control 2', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],
  ['generated control 3', [6.2, 'active dry', 'instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],
 [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['regression: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['repair check: teaspoon quantity source', [1, ' Instant', 'active dry'],
   {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],
  ['generated control 1', [21, 'active dry', 'FRESH'], {'bloom': False, 'grams': 50.4, 'tsp': None}],
  ['generated control 2', [5, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'rapid', 'rapid'], 'error: yeast type']],
 [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['regression: teaspoon quantity source', [10, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 4.2, 'tsp': '1 1/4'}],
  ['repair check: teaspoon quantity source', [10, 'active dry', 'active dry'],
   {'bloom': True, 'grams': 10.0, 'tsp': '3 1/4'}],
  ['generated control 1', [14, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 2', [5, ' Instant', 'fresh'], {'bloom': False, 'grams': 15.0, 'tsp': None}],
  ['generated control 3', [12.4, 'rapid', ' Instant'], 'error: yeast type']],
 [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['regression: teaspoon quantity source', [2, 'FRESH', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [3, 'instant', 'active dry'],
   {'bloom': True, 'grams': 3.8, 'tsp': '1 1/4'}],
  ['generated control 1', [5, 'fresh', 'fresh'], {'bloom': False, 'grams': 5.0, 'tsp': None}],
  ['generated control 2', [1, 'rapid', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'FRESH', 'instant'], {'bloom': False, 'grams': 2.3, 'tsp': '3/4'}]]]
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
instant to active dry{'bloom': True, 'grams': 8.8, 'tsp': '2 1/4'}{'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}Failed
fresh to instant{'bloom': False, 'grams': 7.0, 'tsp': '6 3/4'}{'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}Failed
unknown typeerror: yeast typeerror: yeast typePassed
regression: teaspoon quantity source{'bloom': True, 'grams': 1.0, 'tsp': '3/4'}{'bloom': True, 'grams': 1.0, 'tsp': '1/4'}Failed
repair check: teaspoon quantity source{'bloom': True, 'grams': 26.3, 'tsp': '6 3/4'}{'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}Failed
generated control 1{'bloom': False, 'grams': 12.0, 'tsp': None}{'bloom': False, 'grams': 12.0, 'tsp': None}Passed
generated control 2{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}Passed
generated control 3{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}Passed

SHA-256 / 94d34f600130f1288237567014dba634221dd2da32c70418645da699c5261ac6

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(amount_g, from_type, to_type):
    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}
    f, t = from_type.strip().lower(), to_type.strip().lower()
    if f not in R or t not in R:
        return 'error: yeast type'
    g = Fraction(str(amount_g)) / R[f] * R[t]
    grams = math.floor(g * 10 + Fraction(1, 2)) / 10
    out = {'grams': grams}
    if t == 'fresh':
        out['tsp'] = None
    else:
        q = math.floor(Fraction(str(amount_g)) / R[f] / Fraction(31, 10) * 4 + Fraction(1, 2))
        if q == 0:
            out['tsp'] = 'less than 1/4'
        elif q < 4:
            out['tsp'] = '%d/4' % q
        elif q % 4 == 0:
            out['tsp'] = '%d' % (q // 4)
        else:
            out['tsp'] = '%d %d/4' % divmod(q, 4)
    out['bloom'] = t == 'active dry'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['regression: teaspoon quantity source', [2.5, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 1.0, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['generated control 1', [4, ' Instant', 'fresh'], {'bloom': False, 'grams': 12.0, 'tsp': None}],
  ['generated control 2', [0.3, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],
  ['generated control 3', [14, 'instant', ' Instant'], {'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}]],
 [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['regression: teaspoon quantity source', [2, 'fresh', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['generated control 1', [14, ' Instant', 'fresh'], {'bloom': False, 'grams': 42.0, 'tsp': None}],
  ['generated control 2', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],
  ['generated control 3', [6.2, 'active dry', 'instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],
 [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['regression: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['repair check: teaspoon quantity source', [1, ' Instant', 'active dry'],
   {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],
  ['generated control 1', [21, 'active dry', 'FRESH'], {'bloom': False, 'grams': 50.4, 'tsp': None}],
  ['generated control 2', [5, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'rapid', 'rapid'], 'error: yeast type']],
 [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['regression: teaspoon quantity source', [10, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 4.2, 'tsp': '1 1/4'}],
  ['repair check: teaspoon quantity source', [10, 'active dry', 'active dry'],
   {'bloom': True, 'grams': 10.0, 'tsp': '3 1/4'}],
  ['generated control 1', [14, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 2', [5, ' Instant', 'fresh'], {'bloom': False, 'grams': 15.0, 'tsp': None}],
  ['generated control 3', [12.4, 'rapid', ' Instant'], 'error: yeast type']],
 [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['regression: teaspoon quantity source', [2, 'FRESH', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [3, 'instant', 'active dry'],
   {'bloom': True, 'grams': 3.8, 'tsp': '1 1/4'}],
  ['generated control 1', [5, 'fresh', 'fresh'], {'bloom': False, 'grams': 5.0, 'tsp': None}],
  ['generated control 2', [1, 'rapid', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'FRESH', 'instant'], {'bloom': False, 'grams': 2.3, 'tsp': '3/4'}]]]
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
instant to active dry{'bloom': True, 'grams': 8.8, 'tsp': '2 1/4'}{'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}Failed
fresh to instant{'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}{'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}Passed
unknown typeerror: yeast typeerror: yeast typePassed
regression: teaspoon quantity source{'bloom': True, 'grams': 1.0, 'tsp': '1/4'}{'bloom': True, 'grams': 1.0, 'tsp': '1/4'}Passed
repair check: teaspoon quantity source{'bloom': True, 'grams': 26.3, 'tsp': '6 3/4'}{'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}Failed
generated control 1{'bloom': False, 'grams': 12.0, 'tsp': None}{'bloom': False, 'grams': 12.0, 'tsp': None}Passed
generated control 2{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}Passed
generated control 3{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}Passed

SHA-256 / 95b6a9acc77e4bba6a11744536d3d7251ab1e138d8a46b2d814b0918da3d4d7b

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(amount_g, from_type, to_type):
    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}
    f, t = from_type.strip().lower(), to_type.strip().lower()
    if f not in R or t not in R:
        return 'error: yeast type'
    g = Fraction(str(amount_g)) / R[f] * R[t]
    grams = math.floor(g * 10 + Fraction(1, 2)) / 10
    out = {'grams': grams}
    if t == 'fresh':
        out['tsp'] = None
    else:
        q = math.floor(g / Fraction(31, 10) * 4 + Fraction(1, 2))
        if q == 0:
            out['tsp'] = 'less than 1/4'
        elif q < 4:
            out['tsp'] = '%d/4' % q
        elif q % 4 == 0:
            out['tsp'] = '%d' % (q // 4)
        else:
            out['tsp'] = '%d %d/4' % divmod(q, 4)
    out['bloom'] = t == 'active dry'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['regression: teaspoon quantity source', [2.5, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 1.0, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['generated control 1', [4, ' Instant', 'fresh'], {'bloom': False, 'grams': 12.0, 'tsp': None}],
  ['generated control 2', [0.3, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],
  ['generated control 3', [14, 'instant', ' Instant'], {'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}]],
 [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['regression: teaspoon quantity source', [2, 'fresh', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [21, 'FRESH', 'active dry'],
   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['generated control 1', [14, ' Instant', 'fresh'], {'bloom': False, 'grams': 42.0, 'tsp': None}],
  ['generated control 2', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],
  ['generated control 3', [6.2, 'active dry', 'instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],
 [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],
  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['regression: teaspoon quantity source', [21, 'instant', 'active dry'],
   {'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}],
  ['repair check: teaspoon quantity source', [1, ' Instant', 'active dry'],
   {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],
  ['generated control 1', [21, 'active dry', 'FRESH'], {'bloom': False, 'grams': 50.4, 'tsp': None}],
  ['generated control 2', [5, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'rapid', 'rapid'], 'error: yeast type']],
 [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],
  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['regression: teaspoon quantity source', [10, 'fresh', 'active dry'],
   {'bloom': True, 'grams': 4.2, 'tsp': '1 1/4'}],
  ['repair check: teaspoon quantity source', [10, 'active dry', 'active dry'],
   {'bloom': True, 'grams': 10.0, 'tsp': '3 1/4'}],
  ['generated control 1', [14, 'active dry', 'rapid'], 'error: yeast type'],
  ['generated control 2', [5, ' Instant', 'fresh'], {'bloom': False, 'grams': 15.0, 'tsp': None}],
  ['generated control 3', [12.4, 'rapid', ' Instant'], 'error: yeast type']],
 [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],
  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],
  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],
  ['regression: teaspoon quantity source', [2, 'FRESH', ' Instant'],
   {'bloom': False, 'grams': 0.7, 'tsp': '1/4'}],
  ['repair check: teaspoon quantity source', [3, 'instant', 'active dry'],
   {'bloom': True, 'grams': 3.8, 'tsp': '1 1/4'}],
  ['generated control 1', [5, 'fresh', 'fresh'], {'bloom': False, 'grams': 5.0, 'tsp': None}],
  ['generated control 2', [1, 'rapid', 'rapid'], 'error: yeast type'],
  ['generated control 3', [7, 'FRESH', 'instant'], {'bloom': False, 'grams': 2.3, 'tsp': '3/4'}]]]
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
instant to active dry{'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}{'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}Passed
fresh to instant{'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}{'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}Passed
unknown typeerror: yeast typeerror: yeast typePassed
regression: teaspoon quantity source{'bloom': True, 'grams': 1.0, 'tsp': '1/4'}{'bloom': True, 'grams': 1.0, 'tsp': '1/4'}Passed
repair check: teaspoon quantity source{'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}{'bloom': True, 'grams': 26.3, 'tsp': '8 2/4'}Passed
generated control 1{'bloom': False, 'grams': 12.0, 'tsp': None}{'bloom': False, 'grams': 12.0, 'tsp': None}Passed
generated control 2{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}{'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}Passed
generated control 3{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}{'bloom': False, 'grams': 14.0, 'tsp': '4 2/4'}Passed

SHA-256 / 391410a4f3dd993922570f5380e02dcf2c01f110ddb53f52aad8891cb9af78f7

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:28.595267+00:00.

Case digest / 61774a37e879e3f133d2daf74a92c68631bedb694836c19c296fdd4f860cf5c7