{"abstract":"4.5 eggs becomes 4 eggs and 2.75 limes becomes 2 limes.","category":"Recipe scaling and nutrition","checks":8,"contract":"Scale [name, qty, unit, kind] rows from base to target servings. Factor f=target/base (both must be positive, else an error string). Seasoning rows scale by 1+(f-1)*3/4 (damped); other rows by f. Unit \"each\" rounds half-up to an integer with a floor of 1. Other units round half-up to the nearest 1/8 and print as reduced kitchen fractions (\"1 1/2\", \"3/4\", \"2\"); a zero result prints \"pinch\".","evaluation_group":"w2-recipe_scaling_and_nutrition-servings-scaler","failed_approach":"A strict greater-than rounds exact halves down, so 4.5 eggs still becomes 4.","family":"w2-recipe_scaling_and_nutrition-servings-scaler-count-half-up-rounding","id":"FA-96851","implementations":{"attempt":{"sha256":"08b2cf97f6040272f914a95f62886e9e66aa3a64c79de452531c36dadf9265ca","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(items, base, target):\n    if base <= 0 or target <= 0:\n        return 'error: servings must be positive'\n    f = Fraction(target, base)\n    def fmt(e):\n        if e == 0:\n            return 'pinch'\n        whole, rem = divmod(e, 8)\n        if rem == 0:\n            return str(whole)\n        g = math.gcd(rem, 8)\n        frac = '%d/%d' % (rem // g, 8 // g)\n        return frac if whole == 0 else '%d %s' % (whole, frac)\n    out = []\n    for name, qty, unit, kind in items:\n        q = Fraction(qty)\n        if kind == 'seasoning':\n            s = q * (1 + (f - 1) * Fraction(3, 4))\n        else:\n            s = q * f\n        if unit == 'each':\n            n = int(s) + (1 if s - int(s) > Fraction(1, 2) else 0)\n            out.append([name, str(max(1, n)), unit])\n        else:\n            e = int(s * 8 + Fraction(1, 2))\n            out.append([name, fmt(e), unit])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['regression: count half-up rounding',\n   [[['lime', '3', 'each', 'base'], ['butter', '1', 'tbsp', 'base'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['milk', '1', 'cup', 'base']],\n    8, 12],\n   [['lime', '5', 'each'], ['butter', '1 1/2', 'tbsp'], ['salt', '3 1/8', 'tsp'], ['cumin', '1', 'tsp'],\n    ['milk', '1 1/2', 'cup']]],\n  ['repair check: count half-up rounding',\n   [[['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '2', 'each', 'base'],\n     ['pepper', '3/2', 'tsp', 'seasoning'], ['milk', '1/2', 'cup', 'base']],\n    4, 7],\n   [['cumin', '1 1/8', 'tsp'], ['lime', '4', 'each'], ['pepper', '2 3/8', 'tsp'], ['milk', '7/8', 'cup']]],\n  ['generated control 1', [[['milk', '2', 'cup', 'base'], ['cumin', '1/4', 'tsp', 'seasoning']], 4, 5],\n   [['milk', '2 1/2', 'cup'], ['cumin', '1/4', 'tsp']]],\n  ['generated control 2', [[['flour', '3/4', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning']], 6, 12],\n   [['flour', '1 1/2', 'cup'], ['salt', '4 3/8', 'tsp']]],\n  ['generated control 3',\n   [[['butter', '1/2', 'tbsp', 'base'], ['lime', '1/2', 'each', 'base'], ['flour', '1/8', 'cup', 'base'],\n     ['garlic clove', '1', 'each', 'base']],\n    5, 6],\n   [['butter', '5/8', 'tbsp'], ['lime', '1', 'each'], ['flour', '1/8', 'cup'],\n    ['garlic clove', '1', 'each']]]],\n [['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['regression: count half-up rounding',\n   [[['egg', '5', 'each', 'base'], ['lime', '4', 'each', 'base']], 6, 9],\n   [['egg', '8', 'each'], ['lime', '6', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['pepper', '3/4', 'tsp', 'seasoning'], ['milk', '2/3', 'cup', 'base'],\n     ['cumin', '2', 'tsp', 'seasoning']],\n    2, 9],\n   [['lime', '23', 'each'], ['pepper', '2 3/4', 'tsp'], ['milk', '3', 'cup'], ['cumin', '7 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['pepper', '3/4', 'tsp', 'seasoning'], ['egg', '2', 'each', 'base'], ['lime', '1/2', 'each', 'base'],\n     ['flour', '1/3', 'cup', 'base'], ['butter', '1/3', 'tbsp', 'base']],\n    6, 1],\n   [['pepper', '1/4', 'tsp'], ['egg', '1', 'each'], ['lime', '1', 'each'], ['flour', 'pinch', 'cup'],\n    ['butter', 'pinch', 'tbsp']]],\n  ['generated control 2',\n   [[['salt', '1/2', 'tsp', 'seasoning'], ['pepper', '1/2', 'tsp', 'seasoning'],\n     ['cumin', '3/2', 'tsp', 'seasoning']],\n    3, 12],\n   [['salt', '1 5/8', 'tsp'], ['pepper', '1 5/8', 'tsp'], ['cumin', '4 7/8', 'tsp']]],\n  ['generated control 3',\n   [[['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '1/4', 'tbsp', 'base'], ['egg', '1', 'each', 'base']],\n    5, 8],\n   [['cumin', '2 1/8', 'tsp'], ['butter', '3/8', 'tbsp'], ['egg', '2', 'each']]]],\n [['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['cumin', '1', 'tsp', 'seasoning'], ['pepper', '3', 'tsp', 'seasoning'], ['milk', '3/4', 'cup', 'base'],\n     ['salt', '1', 'tsp', 'seasoning'], ['garlic clove', '3', 'each', 'base']],\n    4, 9],\n   [['cumin', '2', 'tsp'], ['pepper', '5 7/8', 'tsp'], ['milk', '1 3/4', 'cup'], ['salt', '2', 'tsp'],\n    ['garlic clove', '7', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['milk', '2/3', 'cup', 'base'], ['lime', '5', 'each', 'base'], ['egg', '1/2', 'each', 'base'],\n     ['flour', '1/2', 'cup', 'base'], ['garlic clove', '1', 'each', 'base']],\n    2, 3],\n   [['milk', '1', 'cup'], ['lime', '8', 'each'], ['egg', '1', 'each'], ['flour', '3/4', 'cup'],\n    ['garlic clove', '2', 'each']]],\n  ['generated control 1',\n   [[['flour', '1/2', 'cup', 'base'], ['pepper', '2/3', 'tsp', 'seasoning'],\n     ['butter', '1/3', 'tbsp', 'base'], ['salt', '1/3', 'tsp', 'seasoning']],\n    8, 7],\n   [['flour', '1/2', 'cup'], ['pepper', '5/8', 'tsp'], ['butter', '1/4', 'tbsp'], ['salt', '1/4', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '1/3', 'tsp', 'seasoning'], ['milk', '3', 'cup', 'base'],\n     ['pepper', '9/4', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    1, 9],\n   [['cumin', '2 3/8', 'tsp'], ['milk', '27', 'cup'], ['pepper', '15 3/4', 'tsp'], ['butter', '6', 'tbsp']]],\n  ['generated control 3',\n   [[['garlic clove', '2', 'each', 'base'], ['pepper', '1/8', 'tsp', 'seasoning']], 4, 1],\n   [['garlic clove', '1', 'each'], ['pepper', 'pinch', 'tsp']]]],\n [['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['butter', '1/4', 'tbsp', 'base'], ['garlic clove', '3', 'each', 'base'],\n     ['egg', '1/2', 'each', 'base']],\n    7, 6],\n   [['butter', '1/4', 'tbsp'], ['garlic clove', '3', 'each'], ['egg', '1', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '2', 'each', 'base'], ['butter', '3', 'tbsp', 'base'], ['garlic clove', '5', 'each', 'base'],\n     ['salt', '3/2', 'tsp', 'seasoning']],\n    2, 5],\n   [['lime', '5', 'each'], ['butter', '7 1/2', 'tbsp'], ['garlic clove', '13', 'each'],\n    ['salt', '3 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['egg', '3', 'each', 'base'], ['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base'],\n     ['flour', '3', 'cup', 'base'], ['salt', '2', 'tsp', 'seasoning']],\n    4, 11],\n   [['egg', '8', 'each'], ['cumin', '3 1/2', 'tsp'], ['butter', '1 7/8', 'tbsp'], ['flour', '8 1/4', 'cup'],\n    ['salt', '4 5/8', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '9/4', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base'], ['butter', '1/3', 'tbsp', 'base'],\n     ['flour', '1/2', 'cup', 'base']],\n    8, 1],\n   [['cumin', '3/4', 'tsp'], ['egg', '1', 'each'], ['butter', 'pinch', 'tbsp'], ['flour', '1/8', 'cup']]],\n  ['generated control 3', [[['egg', '1', 'each', 'base'], ['milk', '1/4', 'cup', 'base']], 5, 2],\n   [['egg', '1', 'each'], ['milk', '1/8', 'cup']]]],\n [['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['regression: count half-up rounding',\n   [[['cumin', '5/2', 'tsp', 'seasoning'], ['garlic clove', '2', 'each', 'base'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    8, 7],\n   [['cumin', '2 1/4', 'tsp'], ['garlic clove', '2', 'each'], ['pepper', '1/4', 'tsp'],\n    ['butter', '5/8', 'tbsp']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['egg', '4', 'each', 'base'], ['flour', '1', 'cup', 'base'],\n     ['milk', '2/3', 'cup', 'base']],\n    2, 3],\n   [['lime', '8', 'each'], ['egg', '6', 'each'], ['flour', '1 1/2', 'cup'], ['milk', '1', 'cup']]],\n  ['generated control 1',\n   [[['pepper', '1/2', 'tsp', 'seasoning'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['garlic clove', '5', 'each', 'base'], ['cumin', '1', 'tsp', 'seasoning'],\n     ['flour', '2/3', 'cup', 'base']],\n    5, 7],\n   [['pepper', '5/8', 'tsp'], ['salt', '2 7/8', 'tsp'], ['garlic clove', '7', 'each'],\n    ['cumin', '1 1/4', 'tsp'], ['flour', '7/8', 'cup']]],\n  ['generated control 2',\n   [[['flour', '3', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '3/4', 'tbsp', 'base'], ['milk', '1', 'cup', 'base']],\n    2, 6],\n   [['flour', '9', 'cup'], ['salt', '6 1/4', 'tsp'], ['pepper', '7/8', 'tsp'], ['butter', '2 1/4', 'tbsp'],\n    ['milk', '3', 'cup']]],\n  ['generated control 3',\n   [[['garlic clove', '4', 'each', 'base'], ['salt', '1/8', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '5', 'each', 'base']],\n    4, 4],\n   [['garlic clove', '4', 'each'], ['salt', '1/8', 'tsp'], ['cumin', '3/4', 'tsp'], ['lime', '5', 'each']]]]]\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":"3f37d8e90d3d69a619ee220fd0a954b09a4eb1cd319b65a170c5fb2efe3f660f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(items, base, target):\n    if base <= 0 or target <= 0:\n        return 'error: servings must be positive'\n    f = Fraction(target, base)\n    def fmt(e):\n        if e == 0:\n            return 'pinch'\n        whole, rem = divmod(e, 8)\n        if rem == 0:\n            return str(whole)\n        g = math.gcd(rem, 8)\n        frac = '%d/%d' % (rem // g, 8 // g)\n        return frac if whole == 0 else '%d %s' % (whole, frac)\n    out = []\n    for name, qty, unit, kind in items:\n        q = Fraction(qty)\n        if kind == 'seasoning':\n            s = q * (1 + (f - 1) * Fraction(3, 4))\n        else:\n            s = q * f\n        if unit == 'each':\n            n = int(s)\n            out.append([name, str(max(1, n)), unit])\n        else:\n            e = int(s * 8 + Fraction(1, 2))\n            out.append([name, fmt(e), unit])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['regression: count half-up rounding',\n   [[['lime', '3', 'each', 'base'], ['butter', '1', 'tbsp', 'base'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['milk', '1', 'cup', 'base']],\n    8, 12],\n   [['lime', '5', 'each'], ['butter', '1 1/2', 'tbsp'], ['salt', '3 1/8', 'tsp'], ['cumin', '1', 'tsp'],\n    ['milk', '1 1/2', 'cup']]],\n  ['repair check: count half-up rounding',\n   [[['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '2', 'each', 'base'],\n     ['pepper', '3/2', 'tsp', 'seasoning'], ['milk', '1/2', 'cup', 'base']],\n    4, 7],\n   [['cumin', '1 1/8', 'tsp'], ['lime', '4', 'each'], ['pepper', '2 3/8', 'tsp'], ['milk', '7/8', 'cup']]],\n  ['generated control 1', [[['milk', '2', 'cup', 'base'], ['cumin', '1/4', 'tsp', 'seasoning']], 4, 5],\n   [['milk', '2 1/2', 'cup'], ['cumin', '1/4', 'tsp']]],\n  ['generated control 2', [[['flour', '3/4', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning']], 6, 12],\n   [['flour', '1 1/2', 'cup'], ['salt', '4 3/8', 'tsp']]],\n  ['generated control 3',\n   [[['butter', '1/2', 'tbsp', 'base'], ['lime', '1/2', 'each', 'base'], ['flour', '1/8', 'cup', 'base'],\n     ['garlic clove', '1', 'each', 'base']],\n    5, 6],\n   [['butter', '5/8', 'tbsp'], ['lime', '1', 'each'], ['flour', '1/8', 'cup'],\n    ['garlic clove', '1', 'each']]]],\n [['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['regression: count half-up rounding',\n   [[['egg', '5', 'each', 'base'], ['lime', '4', 'each', 'base']], 6, 9],\n   [['egg', '8', 'each'], ['lime', '6', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['pepper', '3/4', 'tsp', 'seasoning'], ['milk', '2/3', 'cup', 'base'],\n     ['cumin', '2', 'tsp', 'seasoning']],\n    2, 9],\n   [['lime', '23', 'each'], ['pepper', '2 3/4', 'tsp'], ['milk', '3', 'cup'], ['cumin', '7 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['pepper', '3/4', 'tsp', 'seasoning'], ['egg', '2', 'each', 'base'], ['lime', '1/2', 'each', 'base'],\n     ['flour', '1/3', 'cup', 'base'], ['butter', '1/3', 'tbsp', 'base']],\n    6, 1],\n   [['pepper', '1/4', 'tsp'], ['egg', '1', 'each'], ['lime', '1', 'each'], ['flour', 'pinch', 'cup'],\n    ['butter', 'pinch', 'tbsp']]],\n  ['generated control 2',\n   [[['salt', '1/2', 'tsp', 'seasoning'], ['pepper', '1/2', 'tsp', 'seasoning'],\n     ['cumin', '3/2', 'tsp', 'seasoning']],\n    3, 12],\n   [['salt', '1 5/8', 'tsp'], ['pepper', '1 5/8', 'tsp'], ['cumin', '4 7/8', 'tsp']]],\n  ['generated control 3',\n   [[['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '1/4', 'tbsp', 'base'], ['egg', '1', 'each', 'base']],\n    5, 8],\n   [['cumin', '2 1/8', 'tsp'], ['butter', '3/8', 'tbsp'], ['egg', '2', 'each']]]],\n [['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['cumin', '1', 'tsp', 'seasoning'], ['pepper', '3', 'tsp', 'seasoning'], ['milk', '3/4', 'cup', 'base'],\n     ['salt', '1', 'tsp', 'seasoning'], ['garlic clove', '3', 'each', 'base']],\n    4, 9],\n   [['cumin', '2', 'tsp'], ['pepper', '5 7/8', 'tsp'], ['milk', '1 3/4', 'cup'], ['salt', '2', 'tsp'],\n    ['garlic clove', '7', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['milk', '2/3', 'cup', 'base'], ['lime', '5', 'each', 'base'], ['egg', '1/2', 'each', 'base'],\n     ['flour', '1/2', 'cup', 'base'], ['garlic clove', '1', 'each', 'base']],\n    2, 3],\n   [['milk', '1', 'cup'], ['lime', '8', 'each'], ['egg', '1', 'each'], ['flour', '3/4', 'cup'],\n    ['garlic clove', '2', 'each']]],\n  ['generated control 1',\n   [[['flour', '1/2', 'cup', 'base'], ['pepper', '2/3', 'tsp', 'seasoning'],\n     ['butter', '1/3', 'tbsp', 'base'], ['salt', '1/3', 'tsp', 'seasoning']],\n    8, 7],\n   [['flour', '1/2', 'cup'], ['pepper', '5/8', 'tsp'], ['butter', '1/4', 'tbsp'], ['salt', '1/4', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '1/3', 'tsp', 'seasoning'], ['milk', '3', 'cup', 'base'],\n     ['pepper', '9/4', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    1, 9],\n   [['cumin', '2 3/8', 'tsp'], ['milk', '27', 'cup'], ['pepper', '15 3/4', 'tsp'], ['butter', '6', 'tbsp']]],\n  ['generated control 3',\n   [[['garlic clove', '2', 'each', 'base'], ['pepper', '1/8', 'tsp', 'seasoning']], 4, 1],\n   [['garlic clove', '1', 'each'], ['pepper', 'pinch', 'tsp']]]],\n [['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['butter', '1/4', 'tbsp', 'base'], ['garlic clove', '3', 'each', 'base'],\n     ['egg', '1/2', 'each', 'base']],\n    7, 6],\n   [['butter', '1/4', 'tbsp'], ['garlic clove', '3', 'each'], ['egg', '1', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '2', 'each', 'base'], ['butter', '3', 'tbsp', 'base'], ['garlic clove', '5', 'each', 'base'],\n     ['salt', '3/2', 'tsp', 'seasoning']],\n    2, 5],\n   [['lime', '5', 'each'], ['butter', '7 1/2', 'tbsp'], ['garlic clove', '13', 'each'],\n    ['salt', '3 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['egg', '3', 'each', 'base'], ['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base'],\n     ['flour', '3', 'cup', 'base'], ['salt', '2', 'tsp', 'seasoning']],\n    4, 11],\n   [['egg', '8', 'each'], ['cumin', '3 1/2', 'tsp'], ['butter', '1 7/8', 'tbsp'], ['flour', '8 1/4', 'cup'],\n    ['salt', '4 5/8', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '9/4', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base'], ['butter', '1/3', 'tbsp', 'base'],\n     ['flour', '1/2', 'cup', 'base']],\n    8, 1],\n   [['cumin', '3/4', 'tsp'], ['egg', '1', 'each'], ['butter', 'pinch', 'tbsp'], ['flour', '1/8', 'cup']]],\n  ['generated control 3', [[['egg', '1', 'each', 'base'], ['milk', '1/4', 'cup', 'base']], 5, 2],\n   [['egg', '1', 'each'], ['milk', '1/8', 'cup']]]],\n [['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['regression: count half-up rounding',\n   [[['cumin', '5/2', 'tsp', 'seasoning'], ['garlic clove', '2', 'each', 'base'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    8, 7],\n   [['cumin', '2 1/4', 'tsp'], ['garlic clove', '2', 'each'], ['pepper', '1/4', 'tsp'],\n    ['butter', '5/8', 'tbsp']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['egg', '4', 'each', 'base'], ['flour', '1', 'cup', 'base'],\n     ['milk', '2/3', 'cup', 'base']],\n    2, 3],\n   [['lime', '8', 'each'], ['egg', '6', 'each'], ['flour', '1 1/2', 'cup'], ['milk', '1', 'cup']]],\n  ['generated control 1',\n   [[['pepper', '1/2', 'tsp', 'seasoning'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['garlic clove', '5', 'each', 'base'], ['cumin', '1', 'tsp', 'seasoning'],\n     ['flour', '2/3', 'cup', 'base']],\n    5, 7],\n   [['pepper', '5/8', 'tsp'], ['salt', '2 7/8', 'tsp'], ['garlic clove', '7', 'each'],\n    ['cumin', '1 1/4', 'tsp'], ['flour', '7/8', 'cup']]],\n  ['generated control 2',\n   [[['flour', '3', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '3/4', 'tbsp', 'base'], ['milk', '1', 'cup', 'base']],\n    2, 6],\n   [['flour', '9', 'cup'], ['salt', '6 1/4', 'tsp'], ['pepper', '7/8', 'tsp'], ['butter', '2 1/4', 'tbsp'],\n    ['milk', '3', 'cup']]],\n  ['generated control 3',\n   [[['garlic clove', '4', 'each', 'base'], ['salt', '1/8', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '5', 'each', 'base']],\n    4, 4],\n   [['garlic clove', '4', 'each'], ['salt', '1/8', 'tsp'], ['cumin', '3/4', 'tsp'], ['lime', '5', 'each']]]]]\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":"cbc06b60d1b5bbdc1c2b35c2eb2ac4ae9dd6dc99e376c1eca30ee558031b33b1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(items, base, target):\n    if base <= 0 or target <= 0:\n        return 'error: servings must be positive'\n    f = Fraction(target, base)\n    def fmt(e):\n        if e == 0:\n            return 'pinch'\n        whole, rem = divmod(e, 8)\n        if rem == 0:\n            return str(whole)\n        g = math.gcd(rem, 8)\n        frac = '%d/%d' % (rem // g, 8 // g)\n        return frac if whole == 0 else '%d %s' % (whole, frac)\n    out = []\n    for name, qty, unit, kind in items:\n        q = Fraction(qty)\n        if kind == 'seasoning':\n            s = q * (1 + (f - 1) * Fraction(3, 4))\n        else:\n            s = q * f\n        if unit == 'each':\n            n = int(s) + (1 if s - int(s) >= Fraction(1, 2) else 0)\n            out.append([name, str(max(1, n)), unit])\n        else:\n            e = int(s * 8 + Fraction(1, 2))\n            out.append([name, fmt(e), unit])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['regression: count half-up rounding',\n   [[['lime', '3', 'each', 'base'], ['butter', '1', 'tbsp', 'base'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['milk', '1', 'cup', 'base']],\n    8, 12],\n   [['lime', '5', 'each'], ['butter', '1 1/2', 'tbsp'], ['salt', '3 1/8', 'tsp'], ['cumin', '1', 'tsp'],\n    ['milk', '1 1/2', 'cup']]],\n  ['repair check: count half-up rounding',\n   [[['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '2', 'each', 'base'],\n     ['pepper', '3/2', 'tsp', 'seasoning'], ['milk', '1/2', 'cup', 'base']],\n    4, 7],\n   [['cumin', '1 1/8', 'tsp'], ['lime', '4', 'each'], ['pepper', '2 3/8', 'tsp'], ['milk', '7/8', 'cup']]],\n  ['generated control 1', [[['milk', '2', 'cup', 'base'], ['cumin', '1/4', 'tsp', 'seasoning']], 4, 5],\n   [['milk', '2 1/2', 'cup'], ['cumin', '1/4', 'tsp']]],\n  ['generated control 2', [[['flour', '3/4', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning']], 6, 12],\n   [['flour', '1 1/2', 'cup'], ['salt', '4 3/8', 'tsp']]],\n  ['generated control 3',\n   [[['butter', '1/2', 'tbsp', 'base'], ['lime', '1/2', 'each', 'base'], ['flour', '1/8', 'cup', 'base'],\n     ['garlic clove', '1', 'each', 'base']],\n    5, 6],\n   [['butter', '5/8', 'tbsp'], ['lime', '1', 'each'], ['flour', '1/8', 'cup'],\n    ['garlic clove', '1', 'each']]]],\n [['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['regression: count half-up rounding',\n   [[['egg', '5', 'each', 'base'], ['lime', '4', 'each', 'base']], 6, 9],\n   [['egg', '8', 'each'], ['lime', '6', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['pepper', '3/4', 'tsp', 'seasoning'], ['milk', '2/3', 'cup', 'base'],\n     ['cumin', '2', 'tsp', 'seasoning']],\n    2, 9],\n   [['lime', '23', 'each'], ['pepper', '2 3/4', 'tsp'], ['milk', '3', 'cup'], ['cumin', '7 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['pepper', '3/4', 'tsp', 'seasoning'], ['egg', '2', 'each', 'base'], ['lime', '1/2', 'each', 'base'],\n     ['flour', '1/3', 'cup', 'base'], ['butter', '1/3', 'tbsp', 'base']],\n    6, 1],\n   [['pepper', '1/4', 'tsp'], ['egg', '1', 'each'], ['lime', '1', 'each'], ['flour', 'pinch', 'cup'],\n    ['butter', 'pinch', 'tbsp']]],\n  ['generated control 2',\n   [[['salt', '1/2', 'tsp', 'seasoning'], ['pepper', '1/2', 'tsp', 'seasoning'],\n     ['cumin', '3/2', 'tsp', 'seasoning']],\n    3, 12],\n   [['salt', '1 5/8', 'tsp'], ['pepper', '1 5/8', 'tsp'], ['cumin', '4 7/8', 'tsp']]],\n  ['generated control 3',\n   [[['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '1/4', 'tbsp', 'base'], ['egg', '1', 'each', 'base']],\n    5, 8],\n   [['cumin', '2 1/8', 'tsp'], ['butter', '3/8', 'tbsp'], ['egg', '2', 'each']]]],\n [['double batch with seasoning', [[['salt', '1', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base']], 4, 8],\n   [['salt', '1 3/4', 'tsp'], ['egg', '6', 'each']]],\n  ['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['cumin', '1', 'tsp', 'seasoning'], ['pepper', '3', 'tsp', 'seasoning'], ['milk', '3/4', 'cup', 'base'],\n     ['salt', '1', 'tsp', 'seasoning'], ['garlic clove', '3', 'each', 'base']],\n    4, 9],\n   [['cumin', '2', 'tsp'], ['pepper', '5 7/8', 'tsp'], ['milk', '1 3/4', 'cup'], ['salt', '2', 'tsp'],\n    ['garlic clove', '7', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['milk', '2/3', 'cup', 'base'], ['lime', '5', 'each', 'base'], ['egg', '1/2', 'each', 'base'],\n     ['flour', '1/2', 'cup', 'base'], ['garlic clove', '1', 'each', 'base']],\n    2, 3],\n   [['milk', '1', 'cup'], ['lime', '8', 'each'], ['egg', '1', 'each'], ['flour', '3/4', 'cup'],\n    ['garlic clove', '2', 'each']]],\n  ['generated control 1',\n   [[['flour', '1/2', 'cup', 'base'], ['pepper', '2/3', 'tsp', 'seasoning'],\n     ['butter', '1/3', 'tbsp', 'base'], ['salt', '1/3', 'tsp', 'seasoning']],\n    8, 7],\n   [['flour', '1/2', 'cup'], ['pepper', '5/8', 'tsp'], ['butter', '1/4', 'tbsp'], ['salt', '1/4', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '1/3', 'tsp', 'seasoning'], ['milk', '3', 'cup', 'base'],\n     ['pepper', '9/4', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    1, 9],\n   [['cumin', '2 3/8', 'tsp'], ['milk', '27', 'cup'], ['pepper', '15 3/4', 'tsp'], ['butter', '6', 'tbsp']]],\n  ['generated control 3',\n   [[['garlic clove', '2', 'each', 'base'], ['pepper', '1/8', 'tsp', 'seasoning']], 4, 1],\n   [['garlic clove', '1', 'each'], ['pepper', 'pinch', 'tsp']]]],\n [['tiny scale-down to pinch', [[['cumin', '1/8', 'tsp', 'base'], ['egg', '1', 'each', 'base']], 8, 1],\n   [['cumin', 'pinch', 'tsp'], ['egg', '1', 'each']]],\n  ['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['regression: count half-up rounding',\n   [[['butter', '1/4', 'tbsp', 'base'], ['garlic clove', '3', 'each', 'base'],\n     ['egg', '1/2', 'each', 'base']],\n    7, 6],\n   [['butter', '1/4', 'tbsp'], ['garlic clove', '3', 'each'], ['egg', '1', 'each']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '2', 'each', 'base'], ['butter', '3', 'tbsp', 'base'], ['garlic clove', '5', 'each', 'base'],\n     ['salt', '3/2', 'tsp', 'seasoning']],\n    2, 5],\n   [['lime', '5', 'each'], ['butter', '7 1/2', 'tbsp'], ['garlic clove', '13', 'each'],\n    ['salt', '3 1/4', 'tsp']]],\n  ['generated control 1',\n   [[['egg', '3', 'each', 'base'], ['cumin', '3/2', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base'],\n     ['flour', '3', 'cup', 'base'], ['salt', '2', 'tsp', 'seasoning']],\n    4, 11],\n   [['egg', '8', 'each'], ['cumin', '3 1/2', 'tsp'], ['butter', '1 7/8', 'tbsp'], ['flour', '8 1/4', 'cup'],\n    ['salt', '4 5/8', 'tsp']]],\n  ['generated control 2',\n   [[['cumin', '9/4', 'tsp', 'seasoning'], ['egg', '3', 'each', 'base'], ['butter', '1/3', 'tbsp', 'base'],\n     ['flour', '1/2', 'cup', 'base']],\n    8, 1],\n   [['cumin', '3/4', 'tsp'], ['egg', '1', 'each'], ['butter', 'pinch', 'tbsp'], ['flour', '1/8', 'cup']]],\n  ['generated control 3', [[['egg', '1', 'each', 'base'], ['milk', '1/4', 'cup', 'base']], 5, 2],\n   [['egg', '1', 'each'], ['milk', '1/8', 'cup']]]],\n [['half egg rounds up', [[['egg', '3', 'each', 'base'], ['milk', '1/2', 'cup', 'base']], 4, 6],\n   [['egg', '5', 'each'], ['milk', '3/4', 'cup']]],\n  ['identity scaling control', [[['egg', '2', 'each', 'base'], ['flour', '3/2', 'cup', 'base']], 4, 4],\n   [['egg', '2', 'each'], ['flour', '1 1/2', 'cup']]],\n  ['zero servings rejected', [[['egg', '2', 'each', 'base']], 0, 4], 'error: servings must be positive'],\n  ['regression: count half-up rounding',\n   [[['cumin', '5/2', 'tsp', 'seasoning'], ['garlic clove', '2', 'each', 'base'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '2/3', 'tbsp', 'base']],\n    8, 7],\n   [['cumin', '2 1/4', 'tsp'], ['garlic clove', '2', 'each'], ['pepper', '1/4', 'tsp'],\n    ['butter', '5/8', 'tbsp']]],\n  ['repair check: count half-up rounding',\n   [[['lime', '5', 'each', 'base'], ['egg', '4', 'each', 'base'], ['flour', '1', 'cup', 'base'],\n     ['milk', '2/3', 'cup', 'base']],\n    2, 3],\n   [['lime', '8', 'each'], ['egg', '6', 'each'], ['flour', '1 1/2', 'cup'], ['milk', '1', 'cup']]],\n  ['generated control 1',\n   [[['pepper', '1/2', 'tsp', 'seasoning'], ['salt', '9/4', 'tsp', 'seasoning'],\n     ['garlic clove', '5', 'each', 'base'], ['cumin', '1', 'tsp', 'seasoning'],\n     ['flour', '2/3', 'cup', 'base']],\n    5, 7],\n   [['pepper', '5/8', 'tsp'], ['salt', '2 7/8', 'tsp'], ['garlic clove', '7', 'each'],\n    ['cumin', '1 1/4', 'tsp'], ['flour', '7/8', 'cup']]],\n  ['generated control 2',\n   [[['flour', '3', 'cup', 'base'], ['salt', '5/2', 'tsp', 'seasoning'],\n     ['pepper', '1/3', 'tsp', 'seasoning'], ['butter', '3/4', 'tbsp', 'base'], ['milk', '1', 'cup', 'base']],\n    2, 6],\n   [['flour', '9', 'cup'], ['salt', '6 1/4', 'tsp'], ['pepper', '7/8', 'tsp'], ['butter', '2 1/4', 'tbsp'],\n    ['milk', '3', 'cup']]],\n  ['generated control 3',\n   [[['garlic clove', '4', 'each', 'base'], ['salt', '1/8', 'tsp', 'seasoning'],\n     ['cumin', '3/4', 'tsp', 'seasoning'], ['lime', '5', 'each', 'base']],\n    4, 4],\n   [['garlic clove', '4', 'each'], ['salt', '1/8', 'tsp'], ['cumin', '3/4', 'tsp'], ['lime', '5', 'each']]]]]\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-servings-scaler-count-half-up-rounding","generated_at":"2026-09-29T14:52:26.461596+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Home and commercial recipe scalers must keep countable items whole and print measurable fractions cooks can actually portion.","repair":"Round countable rows half-up: add one when the fractional part is at least 1/2.","root_cause":"Countable rows truncate the scaled count instead of rounding half-up.","sha256":"21297c8c0f1b4f8efe386fb15811c6ed4d056ef7c06b6522c7ecf75287db7e53","title":"Servings scaler: count half-up rounding · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":48.57,"exit_code":1,"observations":[{"actual":[["egg","2","each"],["flour","1 1/2","cup"]],"check":"identity scaling control","expected":[["egg","2","each"],["flour","1 1/2","cup"]],"passed":true},{"actual":"error: servings must be positive","check":"zero servings rejected","expected":"error: servings must be positive","passed":true},{"actual":[["salt","1 3/4","tsp"],["egg","6","each"]],"check":"double batch with seasoning","expected":[["salt","1 3/4","tsp"],["egg","6","each"]],"passed":true},{"actual":[["lime","4","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"check":"regression: count half-up rounding","expected":[["lime","5","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"passed":false},{"actual":[["cumin","1 1/8","tsp"],["lime","3","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"check":"repair check: count half-up rounding","expected":[["cumin","1 1/8","tsp"],["lime","4","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"passed":false},{"actual":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"check":"generated control 1","expected":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"passed":true},{"actual":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"check":"generated control 2","expected":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"passed":true},{"actual":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"check":"generated control 3","expected":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"identity scaling control\", \"actual\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"expected\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"passed\": true}, {\"check\": \"zero servings rejected\", \"actual\": \"error: servings must be positive\", \"expected\": \"error: servings must be positive\", \"passed\": true}, {\"check\": \"double batch with seasoning\", \"actual\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"expected\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"passed\": true}, {\"check\": \"regression: count half-up rounding\", \"actual\": [[\"lime\", \"4\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"expected\": [[\"lime\", \"5\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"passed\": false}, {\"check\": \"repair check: count half-up rounding\", \"actual\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"3\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"expected\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"4\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"expected\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"expected\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"expected\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.384,"exit_code":1,"observations":[{"actual":[["egg","2","each"],["flour","1 1/2","cup"]],"check":"identity scaling control","expected":[["egg","2","each"],["flour","1 1/2","cup"]],"passed":true},{"actual":"error: servings must be positive","check":"zero servings rejected","expected":"error: servings must be positive","passed":true},{"actual":[["salt","1 3/4","tsp"],["egg","6","each"]],"check":"double batch with seasoning","expected":[["salt","1 3/4","tsp"],["egg","6","each"]],"passed":true},{"actual":[["lime","4","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"check":"regression: count half-up rounding","expected":[["lime","5","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"passed":false},{"actual":[["cumin","1 1/8","tsp"],["lime","3","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"check":"repair check: count half-up rounding","expected":[["cumin","1 1/8","tsp"],["lime","4","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"passed":false},{"actual":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"check":"generated control 1","expected":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"passed":true},{"actual":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"check":"generated control 2","expected":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"passed":true},{"actual":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"check":"generated control 3","expected":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"identity scaling control\", \"actual\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"expected\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"passed\": true}, {\"check\": \"zero servings rejected\", \"actual\": \"error: servings must be positive\", \"expected\": \"error: servings must be positive\", \"passed\": true}, {\"check\": \"double batch with seasoning\", \"actual\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"expected\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"passed\": true}, {\"check\": \"regression: count half-up rounding\", \"actual\": [[\"lime\", \"4\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"expected\": [[\"lime\", \"5\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"passed\": false}, {\"check\": \"repair check: count half-up rounding\", \"actual\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"3\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"expected\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"4\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"passed\": false}, {\"check\": \"generated control 1\", \"actual\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"expected\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"expected\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"expected\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.372,"exit_code":0,"observations":[{"actual":[["egg","2","each"],["flour","1 1/2","cup"]],"check":"identity scaling control","expected":[["egg","2","each"],["flour","1 1/2","cup"]],"passed":true},{"actual":"error: servings must be positive","check":"zero servings rejected","expected":"error: servings must be positive","passed":true},{"actual":[["salt","1 3/4","tsp"],["egg","6","each"]],"check":"double batch with seasoning","expected":[["salt","1 3/4","tsp"],["egg","6","each"]],"passed":true},{"actual":[["lime","5","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"check":"regression: count half-up rounding","expected":[["lime","5","each"],["butter","1 1/2","tbsp"],["salt","3 1/8","tsp"],["cumin","1","tsp"],["milk","1 1/2","cup"]],"passed":true},{"actual":[["cumin","1 1/8","tsp"],["lime","4","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"check":"repair check: count half-up rounding","expected":[["cumin","1 1/8","tsp"],["lime","4","each"],["pepper","2 3/8","tsp"],["milk","7/8","cup"]],"passed":true},{"actual":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"check":"generated control 1","expected":[["milk","2 1/2","cup"],["cumin","1/4","tsp"]],"passed":true},{"actual":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"check":"generated control 2","expected":[["flour","1 1/2","cup"],["salt","4 3/8","tsp"]],"passed":true},{"actual":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"check":"generated control 3","expected":[["butter","5/8","tbsp"],["lime","1","each"],["flour","1/8","cup"],["garlic clove","1","each"]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"identity scaling control\", \"actual\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"expected\": [[\"egg\", \"2\", \"each\"], [\"flour\", \"1 1/2\", \"cup\"]], \"passed\": true}, {\"check\": \"zero servings rejected\", \"actual\": \"error: servings must be positive\", \"expected\": \"error: servings must be positive\", \"passed\": true}, {\"check\": \"double batch with seasoning\", \"actual\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"expected\": [[\"salt\", \"1 3/4\", \"tsp\"], [\"egg\", \"6\", \"each\"]], \"passed\": true}, {\"check\": \"regression: count half-up rounding\", \"actual\": [[\"lime\", \"5\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"expected\": [[\"lime\", \"5\", \"each\"], [\"butter\", \"1 1/2\", \"tbsp\"], [\"salt\", \"3 1/8\", \"tsp\"], [\"cumin\", \"1\", \"tsp\"], [\"milk\", \"1 1/2\", \"cup\"]], \"passed\": true}, {\"check\": \"repair check: count half-up rounding\", \"actual\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"4\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"expected\": [[\"cumin\", \"1 1/8\", \"tsp\"], [\"lime\", \"4\", \"each\"], [\"pepper\", \"2 3/8\", \"tsp\"], [\"milk\", \"7/8\", \"cup\"]], \"passed\": true}, {\"check\": \"generated control 1\", \"actual\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"expected\": [[\"milk\", \"2 1/2\", \"cup\"], [\"cumin\", \"1/4\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 2\", \"actual\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"expected\": [[\"flour\", \"1 1/2\", \"cup\"], [\"salt\", \"4 3/8\", \"tsp\"]], \"passed\": true}, {\"check\": \"generated control 3\", \"actual\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"expected\": [[\"butter\", \"5/8\", \"tbsp\"], [\"lime\", \"1\", \"each\"], [\"flour\", \"1/8\", \"cup\"], [\"garlic clove\", \"1\", \"each\"]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}