{"abstract":"21 g of fresh yeast converts to 63 g of instant.","category":"Recipe scaling and nutrition","checks":8,"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.","evaluation_group":"w2-recipe_scaling_and_nutrition-yeast-conversion","failed_approach":"Stopping at instant-equivalent grams ignores the target yeast form.","family":"w2-recipe_scaling_and_nutrition-yeast-conversion-conversion-direction","id":"FA-97061","implementations":{"attempt":{"sha256":"3d4fff9c6093caf96c78b0ab1d1f6b4bfffe4951ca8fcf33445b5d4b68e44871","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(amount_g, from_type, to_type):\n    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}\n    f, t = from_type.strip().lower(), to_type.strip().lower()\n    if f not in R or t not in R:\n        return 'error: yeast type'\n    g = Fraction(str(amount_g)) / R[f]\n    grams = math.floor(g * 10 + Fraction(1, 2)) / 10\n    out = {'grams': grams}\n    if t == 'fresh':\n        out['tsp'] = None\n    else:\n        q = math.floor(g / Fraction(31, 10) * 4 + Fraction(1, 2))\n        if q == 0:\n            out['tsp'] = 'less than 1/4'\n        elif q < 4:\n            out['tsp'] = '%d/4' % q\n        elif q % 4 == 0:\n            out['tsp'] = '%d' % (q // 4)\n        else:\n            out['tsp'] = '%d %d/4' % divmod(q, 4)\n    out['bloom'] = t == 'active dry'\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['regression: conversion direction', [2.5, 'active dry', ' Instant'],\n   {'bloom': False, 'grams': 2.0, 'tsp': '3/4'}],\n  ['repair check: conversion direction', [0.5, 'active dry', 'active dry'],\n   {'bloom': True, 'grams': 0.5, 'tsp': '1/4'}],\n  ['generated control 1', [21, 'rapid', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [12.4, 'active dry', 'fresh'], {'bloom': False, 'grams': 29.8, 'tsp': None}],\n  ['generated control 3', [6.2, 'instant', 'instant'], {'bloom': False, 'grams': 6.2, 'tsp': '2'}]],\n [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['regression: conversion direction', [0.3, 'active dry', 'fresh'],\n   {'bloom': False, 'grams': 0.7, 'tsp': None}],\n  ['repair check: conversion direction', [1, ' Instant', 'fresh'],\n   {'bloom': False, 'grams': 3.0, 'tsp': None}],\n  ['generated control 1', [12.4, ' Instant', ' Instant'], {'bloom': False, 'grams': 12.4, 'tsp': '4'}],\n  ['generated control 2', [6.2, 'FRESH', 'fresh'], {'bloom': False, 'grams': 6.2, 'tsp': None}],\n  ['generated control 3', [2.5, 'FRESH', ' Instant'], {'bloom': False, 'grams': 0.8, 'tsp': '1/4'}]],\n [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['regression: conversion direction', [0.3, 'fresh', 'active dry'],\n   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],\n  ['repair check: conversion direction', [7, ' Instant', 'active dry'],\n   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['generated control 1', [4, 'active dry', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [1, 'rapid', 'FRESH'], 'error: yeast type'],\n  ['generated control 3', [6.2, 'active dry', ' Instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],\n [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['regression: conversion direction', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],\n  ['repair check: conversion direction', [10, 'fresh', 'FRESH'],\n   {'bloom': False, 'grams': 10.0, 'tsp': None}],\n  ['generated control 1', [6.2, 'FRESH', ' Instant'], {'bloom': False, 'grams': 2.1, 'tsp': '3/4'}],\n  ['generated control 2', [12.4, 'FRESH', 'fresh'], {'bloom': False, 'grams': 12.4, 'tsp': None}],\n  ['generated control 3', [10, 'active dry', 'FRESH'], {'bloom': False, 'grams': 24.0, 'tsp': None}]],\n [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['regression: conversion direction', [6.2, 'instant', 'fresh'],\n   {'bloom': False, 'grams': 18.6, 'tsp': None}],\n  ['repair check: conversion direction', [0.5, 'FRESH', 'FRESH'],\n   {'bloom': False, 'grams': 0.5, 'tsp': None}],\n  ['generated control 1', [1, 'rapid', 'instant'], 'error: yeast type'],\n  ['generated control 2', [1, ' Instant', 'active dry'], {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],\n  ['generated control 3', [2.5, 'instant', 'active dry'], {'bloom': True, 'grams': 3.1, 'tsp': '1'}]]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"881fb7c6811212ec2fa43c3067573965f6e342667be41c8c2b2165e6c5604b9d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(amount_g, from_type, to_type):\n    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}\n    f, t = from_type.strip().lower(), to_type.strip().lower()\n    if f not in R or t not in R:\n        return 'error: yeast type'\n    g = Fraction(str(amount_g)) * R[f] / R[t]\n    grams = math.floor(g * 10 + Fraction(1, 2)) / 10\n    out = {'grams': grams}\n    if t == 'fresh':\n        out['tsp'] = None\n    else:\n        q = math.floor(g / Fraction(31, 10) * 4 + Fraction(1, 2))\n        if q == 0:\n            out['tsp'] = 'less than 1/4'\n        elif q < 4:\n            out['tsp'] = '%d/4' % q\n        elif q % 4 == 0:\n            out['tsp'] = '%d' % (q // 4)\n        else:\n            out['tsp'] = '%d %d/4' % divmod(q, 4)\n    out['bloom'] = t == 'active dry'\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['regression: conversion direction', [2.5, 'active dry', ' Instant'],\n   {'bloom': False, 'grams': 2.0, 'tsp': '3/4'}],\n  ['repair check: conversion direction', [0.5, 'active dry', 'active dry'],\n   {'bloom': True, 'grams': 0.5, 'tsp': '1/4'}],\n  ['generated control 1', [21, 'rapid', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [12.4, 'active dry', 'fresh'], {'bloom': False, 'grams': 29.8, 'tsp': None}],\n  ['generated control 3', [6.2, 'instant', 'instant'], {'bloom': False, 'grams': 6.2, 'tsp': '2'}]],\n [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['regression: conversion direction', [0.3, 'active dry', 'fresh'],\n   {'bloom': False, 'grams': 0.7, 'tsp': None}],\n  ['repair check: conversion direction', [1, ' Instant', 'fresh'],\n   {'bloom': False, 'grams': 3.0, 'tsp': None}],\n  ['generated control 1', [12.4, ' Instant', ' Instant'], {'bloom': False, 'grams': 12.4, 'tsp': '4'}],\n  ['generated control 2', [6.2, 'FRESH', 'fresh'], {'bloom': False, 'grams': 6.2, 'tsp': None}],\n  ['generated control 3', [2.5, 'FRESH', ' Instant'], {'bloom': False, 'grams': 0.8, 'tsp': '1/4'}]],\n [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['regression: conversion direction', [0.3, 'fresh', 'active dry'],\n   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],\n  ['repair check: conversion direction', [7, ' Instant', 'active dry'],\n   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['generated control 1', [4, 'active dry', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [1, 'rapid', 'FRESH'], 'error: yeast type'],\n  ['generated control 3', [6.2, 'active dry', ' Instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],\n [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['regression: conversion direction', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],\n  ['repair check: conversion direction', [10, 'fresh', 'FRESH'],\n   {'bloom': False, 'grams': 10.0, 'tsp': None}],\n  ['generated control 1', [6.2, 'FRESH', ' Instant'], {'bloom': False, 'grams': 2.1, 'tsp': '3/4'}],\n  ['generated control 2', [12.4, 'FRESH', 'fresh'], {'bloom': False, 'grams': 12.4, 'tsp': None}],\n  ['generated control 3', [10, 'active dry', 'FRESH'], {'bloom': False, 'grams': 24.0, 'tsp': None}]],\n [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['regression: conversion direction', [6.2, 'instant', 'fresh'],\n   {'bloom': False, 'grams': 18.6, 'tsp': None}],\n  ['repair check: conversion direction', [0.5, 'FRESH', 'FRESH'],\n   {'bloom': False, 'grams': 0.5, 'tsp': None}],\n  ['generated control 1', [1, 'rapid', 'instant'], 'error: yeast type'],\n  ['generated control 2', [1, ' Instant', 'active dry'], {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],\n  ['generated control 3', [2.5, 'instant', 'active dry'], {'bloom': True, 'grams': 3.1, 'tsp': '1'}]]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"7af696f920c605d45895483770d4684babd0d32fd8f58063e784699ec3dc4d78","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(amount_g, from_type, to_type):\n    R = {'instant': Fraction(1), 'active dry': Fraction(5, 4), 'fresh': Fraction(3)}\n    f, t = from_type.strip().lower(), to_type.strip().lower()\n    if f not in R or t not in R:\n        return 'error: yeast type'\n    g = Fraction(str(amount_g)) / R[f] * R[t]\n    grams = math.floor(g * 10 + Fraction(1, 2)) / 10\n    out = {'grams': grams}\n    if t == 'fresh':\n        out['tsp'] = None\n    else:\n        q = math.floor(g / Fraction(31, 10) * 4 + Fraction(1, 2))\n        if q == 0:\n            out['tsp'] = 'less than 1/4'\n        elif q < 4:\n            out['tsp'] = '%d/4' % q\n        elif q % 4 == 0:\n            out['tsp'] = '%d' % (q // 4)\n        else:\n            out['tsp'] = '%d %d/4' % divmod(q, 4)\n    out['bloom'] = t == 'active dry'\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['regression: conversion direction', [2.5, 'active dry', ' Instant'],\n   {'bloom': False, 'grams': 2.0, 'tsp': '3/4'}],\n  ['repair check: conversion direction', [0.5, 'active dry', 'active dry'],\n   {'bloom': True, 'grams': 0.5, 'tsp': '1/4'}],\n  ['generated control 1', [21, 'rapid', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [12.4, 'active dry', 'fresh'], {'bloom': False, 'grams': 29.8, 'tsp': None}],\n  ['generated control 3', [6.2, 'instant', 'instant'], {'bloom': False, 'grams': 6.2, 'tsp': '2'}]],\n [['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['regression: conversion direction', [0.3, 'active dry', 'fresh'],\n   {'bloom': False, 'grams': 0.7, 'tsp': None}],\n  ['repair check: conversion direction', [1, ' Instant', 'fresh'],\n   {'bloom': False, 'grams': 3.0, 'tsp': None}],\n  ['generated control 1', [12.4, ' Instant', ' Instant'], {'bloom': False, 'grams': 12.4, 'tsp': '4'}],\n  ['generated control 2', [6.2, 'FRESH', 'fresh'], {'bloom': False, 'grams': 6.2, 'tsp': None}],\n  ['generated control 3', [2.5, 'FRESH', ' Instant'], {'bloom': False, 'grams': 0.8, 'tsp': '1/4'}]],\n [['unknown type', [7, 'rapid', 'instant'], 'error: yeast type'],\n  ['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['regression: conversion direction', [0.3, 'fresh', 'active dry'],\n   {'bloom': True, 'grams': 0.1, 'tsp': 'less than 1/4'}],\n  ['repair check: conversion direction', [7, ' Instant', 'active dry'],\n   {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['generated control 1', [4, 'active dry', 'rapid'], 'error: yeast type'],\n  ['generated control 2', [1, 'rapid', 'FRESH'], 'error: yeast type'],\n  ['generated control 3', [6.2, 'active dry', ' Instant'], {'bloom': False, 'grams': 5.0, 'tsp': '1 2/4'}]],\n [['same type', [3.1, 'instant', 'instant'], {'bloom': False, 'grams': 3.1, 'tsp': '1'}],\n  ['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['regression: conversion direction', [10, 'FRESH', ' Instant'], {'bloom': False, 'grams': 3.3, 'tsp': '1'}],\n  ['repair check: conversion direction', [10, 'fresh', 'FRESH'],\n   {'bloom': False, 'grams': 10.0, 'tsp': None}],\n  ['generated control 1', [6.2, 'FRESH', ' Instant'], {'bloom': False, 'grams': 2.1, 'tsp': '3/4'}],\n  ['generated control 2', [12.4, 'FRESH', 'fresh'], {'bloom': False, 'grams': 12.4, 'tsp': None}],\n  ['generated control 3', [10, 'active dry', 'FRESH'], {'bloom': False, 'grams': 24.0, 'tsp': None}]],\n [['tiny amount', [0.3, 'instant', 'instant'], {'bloom': False, 'grams': 0.3, 'tsp': 'less than 1/4'}],\n  ['instant to active dry', [7, 'instant', 'active dry'], {'bloom': True, 'grams': 8.8, 'tsp': '2 3/4'}],\n  ['fresh to instant', [21, 'fresh', 'instant'], {'bloom': False, 'grams': 7.0, 'tsp': '2 1/4'}],\n  ['regression: conversion direction', [6.2, 'instant', 'fresh'],\n   {'bloom': False, 'grams': 18.6, 'tsp': None}],\n  ['repair check: conversion direction', [0.5, 'FRESH', 'FRESH'],\n   {'bloom': False, 'grams': 0.5, 'tsp': None}],\n  ['generated control 1', [1, 'rapid', 'instant'], 'error: yeast type'],\n  ['generated control 2', [1, ' Instant', 'active dry'], {'bloom': True, 'grams': 1.3, 'tsp': '2/4'}],\n  ['generated control 3', [2.5, 'instant', 'active dry'], {'bloom': True, 'grams': 3.1, 'tsp': '1'}]]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-recipe_scaling_and_nutrition-yeast-conversion-conversion-direction","generated_at":"2026-09-29T14:52:28.458095+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Bakers substitute yeast forms and need both weight and spoon measures.","repair":"Divide by the source ratio, multiply by the target ratio.","root_cause":"The source ratio multiplies and the target ratio divides, inverting the conversion.","sha256":"dc8e4c776ea2d2e5c9f8a1411b2428ec6b60ac9b21bbf031cd597c702c57a869","title":"Yeast type converter: conversion direction · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.755,"exit_code":1,"observations":[{"actual":{"bloom":true,"grams":7.0,"tsp":"2 1/4"},"check":"instant to active dry","expected":{"bloom":true,"grams":8.8,"tsp":"2 3/4"},"passed":false},{"actual":{"bloom":false,"grams":7.0,"tsp":"2 1/4"},"check":"fresh to instant","expected":{"bloom":false,"grams":7.0,"tsp":"2 1/4"},"passed":true},{"actual":"error: yeast type","check":"unknown type","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":2.0,"tsp":"3/4"},"check":"regression: conversion direction","expected":{"bloom":false,"grams":2.0,"tsp":"3/4"},"passed":true},{"actual":{"bloom":true,"grams":0.4,"tsp":"1/4"},"check":"repair check: conversion direction","expected":{"bloom":true,"grams":0.5,"tsp":"1/4"},"passed":false},{"actual":"error: yeast type","check":"generated control 1","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":9.9,"tsp":null},"check":"generated control 2","expected":{"bloom":false,"grams":29.8,"tsp":null},"passed":false},{"actual":{"bloom":false,"grams":6.2,"tsp":"2"},"check":"generated control 3","expected":{"bloom":false,"grams":6.2,"tsp":"2"},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"instant to active dry\", \"actual\": {\"grams\": 7.0, \"tsp\": \"2 1/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 8.8, \"tsp\": \"2 3/4\"}, \"passed\": false}, {\"check\": \"fresh to instant\", \"actual\": {\"grams\": 7.0, \"tsp\": \"2 1/4\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 7.0, \"tsp\": \"2 1/4\"}, \"passed\": true}, {\"check\": \"unknown type\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"regression: conversion direction\", \"actual\": {\"grams\": 2.0, \"tsp\": \"3/4\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 2.0, \"tsp\": \"3/4\"}, \"passed\": true}, {\"check\": \"repair check: conversion direction\", \"actual\": {\"grams\": 0.4, \"tsp\": \"1/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 0.5, \"tsp\": \"1/4\"}, \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": {\"grams\": 9.9, \"tsp\": null, \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 29.8, \"tsp\": null}, \"passed\": false}, {\"check\": \"generated control 3\", \"actual\": {\"grams\": 6.2, \"tsp\": \"2\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 6.2, \"tsp\": \"2\"}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.886,"exit_code":1,"observations":[{"actual":{"bloom":true,"grams":5.6,"tsp":"1 3/4"},"check":"instant to active dry","expected":{"bloom":true,"grams":8.8,"tsp":"2 3/4"},"passed":false},{"actual":{"bloom":false,"grams":63.0,"tsp":"20 1/4"},"check":"fresh to instant","expected":{"bloom":false,"grams":7.0,"tsp":"2 1/4"},"passed":false},{"actual":"error: yeast type","check":"unknown type","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":3.1,"tsp":"1"},"check":"regression: conversion direction","expected":{"bloom":false,"grams":2.0,"tsp":"3/4"},"passed":false},{"actual":{"bloom":true,"grams":0.5,"tsp":"1/4"},"check":"repair check: conversion direction","expected":{"bloom":true,"grams":0.5,"tsp":"1/4"},"passed":true},{"actual":"error: yeast type","check":"generated control 1","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":5.2,"tsp":null},"check":"generated control 2","expected":{"bloom":false,"grams":29.8,"tsp":null},"passed":false},{"actual":{"bloom":false,"grams":6.2,"tsp":"2"},"check":"generated control 3","expected":{"bloom":false,"grams":6.2,"tsp":"2"},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"instant to active dry\", \"actual\": {\"grams\": 5.6, \"tsp\": \"1 3/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 8.8, \"tsp\": \"2 3/4\"}, \"passed\": false}, {\"check\": \"fresh to instant\", \"actual\": {\"grams\": 63.0, \"tsp\": \"20 1/4\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 7.0, \"tsp\": \"2 1/4\"}, \"passed\": false}, {\"check\": \"unknown type\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"regression: conversion direction\", \"actual\": {\"grams\": 3.1, \"tsp\": \"1\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 2.0, \"tsp\": \"3/4\"}, \"passed\": false}, {\"check\": \"repair check: conversion direction\", \"actual\": {\"grams\": 0.5, \"tsp\": \"1/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 0.5, \"tsp\": \"1/4\"}, \"passed\": true}, {\"check\": \"generated control 1\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": {\"grams\": 5.2, \"tsp\": null, \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 29.8, \"tsp\": null}, \"passed\": false}, {\"check\": \"generated control 3\", \"actual\": {\"grams\": 6.2, \"tsp\": \"2\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 6.2, \"tsp\": \"2\"}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.309,"exit_code":0,"observations":[{"actual":{"bloom":true,"grams":8.8,"tsp":"2 3/4"},"check":"instant to active dry","expected":{"bloom":true,"grams":8.8,"tsp":"2 3/4"},"passed":true},{"actual":{"bloom":false,"grams":7.0,"tsp":"2 1/4"},"check":"fresh to instant","expected":{"bloom":false,"grams":7.0,"tsp":"2 1/4"},"passed":true},{"actual":"error: yeast type","check":"unknown type","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":2.0,"tsp":"3/4"},"check":"regression: conversion direction","expected":{"bloom":false,"grams":2.0,"tsp":"3/4"},"passed":true},{"actual":{"bloom":true,"grams":0.5,"tsp":"1/4"},"check":"repair check: conversion direction","expected":{"bloom":true,"grams":0.5,"tsp":"1/4"},"passed":true},{"actual":"error: yeast type","check":"generated control 1","expected":"error: yeast type","passed":true},{"actual":{"bloom":false,"grams":29.8,"tsp":null},"check":"generated control 2","expected":{"bloom":false,"grams":29.8,"tsp":null},"passed":true},{"actual":{"bloom":false,"grams":6.2,"tsp":"2"},"check":"generated control 3","expected":{"bloom":false,"grams":6.2,"tsp":"2"},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"instant to active dry\", \"actual\": {\"grams\": 8.8, \"tsp\": \"2 3/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 8.8, \"tsp\": \"2 3/4\"}, \"passed\": true}, {\"check\": \"fresh to instant\", \"actual\": {\"grams\": 7.0, \"tsp\": \"2 1/4\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 7.0, \"tsp\": \"2 1/4\"}, \"passed\": true}, {\"check\": \"unknown type\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"regression: conversion direction\", \"actual\": {\"grams\": 2.0, \"tsp\": \"3/4\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 2.0, \"tsp\": \"3/4\"}, \"passed\": true}, {\"check\": \"repair check: conversion direction\", \"actual\": {\"grams\": 0.5, \"tsp\": \"1/4\", \"bloom\": true}, \"expected\": {\"bloom\": true, \"grams\": 0.5, \"tsp\": \"1/4\"}, \"passed\": true}, {\"check\": \"generated control 1\", \"actual\": \"error: yeast type\", \"expected\": \"error: yeast type\", \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": {\"grams\": 29.8, \"tsp\": null, \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 29.8, \"tsp\": null}, \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": {\"grams\": 6.2, \"tsp\": \"2\", \"bloom\": false}, \"expected\": {\"bloom\": false, \"grams\": 6.2, \"tsp\": \"2\"}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}