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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 type | error: yeast type | error: yeast type | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 type | error: yeast type | error: yeast type | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 type | error: yeast type | error: yeast type | Passed |
| 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