{"abstract":"Excess recruits above the ceiling disperse into the other patch.","category":"Ecological population dynamics","checks":7,"contract":"Each year each patch grows by its lambda and is capped at its own ceiling, then fraction disperse of each post-growth patch moves to the other simultaneously; return yearly [N1, N2] rounded 4.","evaluation_group":"w2-ecopop-source-sink","failed_approach":"Applying ceilings after dispersal lets surplus from a full patch rescue the sink.","family":"w2-ecopop-source-sink-ceiling-ordering","id":"FA-65701","implementations":{"attempt":{"sha256":"ec9f18e7f95e6bbf33b9dbcad9905a767ab1db714f80a91d682ec6e5e3fd5375","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [n[j] * lambdas[j] for j in range(2)]\n        out = [grown[j] * disperse for j in range(2)]\n        n = [min(grown[0] - out[0] + out[1], caps[0]), min(grown[1] - out[1] + out[0], caps[1])]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\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":"01165a77cdbcf7b37b223799629b479cefb84d1a82c684adebf7de266908129d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [n[j] * lambdas[j] for j in range(2)]\n        out = [grown[j] * disperse for j in range(2)]\n        n = [grown[0] - out[0] + out[1], grown[1] - out[1] + out[0]]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\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":"4163838221b080713a4d61cd6e0290b37763a26b8d93731342954e2552564adc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [min(n[j] * lambdas[j], caps[j]) for j in range(2)]\n        out = [grown[j] * disperse for j in range(2)]\n        n = [grown[0] - out[0] + out[1], grown[1] - out[1] + out[0]]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('control: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('control: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\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":"Deterministic bounded teaching model with a stipulated contract; not a validated scientific or public-health modelling library. 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-ecopop-source-sink-ceiling-ordering","generated_at":"2026-09-29T14:47:36.579881+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Population projections set harvest quotas, conservation status and pest-control timing; a wrong update order, boundary or rate conversion silently changes management advice.","repair":"Restore the ceiling ordering rule: `grown = [min(n[j] * lambdas[j], caps[j]) for j in range(2)]`.","root_cause":"The ceiling is never applied.","sha256":"e24d2eb54e3a016debd606aa0db32d9d58e84d0e7c00adbe9dc694cf1afd1377","title":"Two-patch source-sink dispersal with ceilings: ceiling ordering · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.557,"exit_code":1,"observations":[{"actual":[[122.8,41.2],[153.128,59.912],[192.1413,79.4891],[200,102.1563],[200,117.2075]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":false},{"actual":[[200,32.4],[200,50],[200,50],[200,50]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":false},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"check":"control: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":true},{"actual":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"check":"control: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":true},{"actual":[[45.75,100],[74.6063,100],[102.7411,100],[130.1726,100]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":false},{"actual":[[120,60],[120,60],[120,60],[120,60],[120,60]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[122.8, 41.2], [153.128, 59.912], [192.1413, 79.4891], [200, 102.1563], [200, 117.2075]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": false}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[200, 32.4], [200, 50], [200, 50], [200, 50]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": false}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"control: full exchange\", \"actual\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": true}, {\"check\": \"control: both sinks\", \"actual\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": true}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[45.75, 100], [74.6063, 100], [102.7411, 100], [130.1726, 100]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": false}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[120, 60], [120, 60], [120, 60], [120, 60], [120, 60]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.486,"exit_code":1,"observations":[{"actual":[[122.8,41.2],[153.128,59.912],[192.1413,79.4891],[241.698,102.1563],[304.3395,129.7169]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":false},{"actual":[[227.6,32.4],[289.368,55.192],[369.019,80.2498],[471.384,109.4425]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":false},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"check":"control: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":true},{"actual":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"check":"control: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":true},{"actual":[[45.75,111.25],[77.9813,114.9938],[110.5298,128.8383],[146.4181,151.8767]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":false},{"actual":[[174.0,66.0],[335.55,111.45],[645.9038,192.3713],[1241.645,338.7194],[2384.5294,606.8397]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[122.8, 41.2], [153.128, 59.912], [192.1413, 79.4891], [241.698, 102.1563], [304.3395, 129.7169]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": false}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[227.6, 32.4], [289.368, 55.192], [369.019, 80.2498], [471.384, 109.4425]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": false}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"control: full exchange\", \"actual\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": true}, {\"check\": \"control: both sinks\", \"actual\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": true}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[45.75, 111.25], [77.9813, 114.9938], [110.5298, 128.8383], [146.4181, 151.8767]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": false}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[174.0, 66.0], [335.55, 111.45], [645.9038, 192.3713], [1241.645, 338.7194], [2384.5294, 606.8397]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.971,"exit_code":0,"observations":[{"actual":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":true},{"actual":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":true},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"check":"control: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":true},{"actual":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"check":"control: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":true},{"actual":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":true},{"actual":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": true}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": true}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"control: full exchange\", \"actual\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": true}, {\"check\": \"control: both sinks\", \"actual\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": true}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": true}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}