{"abstract":"Capture probability falls as depletion gets stronger.","category":"Ecological population dynamics","checks":7,"contract":"N = c1^2/(c1-c2), p = (c1-c2)/c1, var = c1^2*c2^2*(c1+c2)/(c1-c2)^4 rounded [2, 4, 2]; [None, None, None] when c1<=c2; None for negative catches.","evaluation_group":"w2-ecopop-removal-sampling","failed_approach":"Dividing by the total catch understates capture probability.","family":"w2-ecopop-removal-sampling-catchability","id":"FA-65721","implementations":{"attempt":{"sha256":"2e8881d56f96beb6050508e8d51bbaf93137aa02478b9b9feeaba5e50d10662d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(c1, c2):\n    if c1 < 0 or c2 < 0:\n        return None\n    if c1 <= c2:\n        return [None, None, None]\n    n_hat = c1 * c1 / (c1 - c2)\n    p_hat = (c1 - c2) / (c1 + c2)\n    var = c1 ** 2 * c2 ** 2 * (c1 + c2) / (c1 - c2) ** 4\n    return [round(n_hat, 2), round(p_hat, 4), round(var, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])]]\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":"7873d21ed6f50aeb0207525868eda335596f365e36b85cb3786fbf02df139dec","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(c1, c2):\n    if c1 < 0 or c2 < 0:\n        return None\n    if c1 <= c2:\n        return [None, None, None]\n    n_hat = c1 * c1 / (c1 - c2)\n    p_hat = c2 / c1\n    var = c1 ** 2 * c2 ** 2 * (c1 + c2) / (c1 - c2) ** 4\n    return [round(n_hat, 2), round(p_hat, 4), round(var, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])]]\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":"8718f700c7658999930b884ee484febf3cd7abb453718809b4eb3faf4e7f6fbe","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(c1, c2):\n    if c1 < 0 or c2 < 0:\n        return None\n    if c1 <= c2:\n        return [None, None, None]\n    n_hat = c1 * c1 / (c1 - c2)\n    p_hat = (c1 - c2) / c1\n    var = c1 ** 2 * c2 ** 2 * (c1 + c2) / (c1 - c2) ** 4\n    return [round(n_hat, 2), round(p_hat, 4), round(var, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('regression: efficient first pass', (90, 10), [101.25, 0.8889, 1.98]),\n  ('regression: weak depletion', (40, 32), [200.0, 0.2, 28800.0]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None])],\n [('regression: stream electrofishing', (60, 25), [102.86, 0.5833, 127.45]),\n  ('control: no depletion', (30, 30), [None, None, None]),\n  ('regression: second pass empty', (45, 0), [45.0, 1.0, 0.0]),\n  ('control: negative catch', (-1, 3), None),\n  ('control: increasing catch', (20, 25), [None, None, None]),\n  ('regression: small stream', (12, 5), [20.57, 0.5833, 25.49]),\n  ('regression: large lake', (300, 140), [562.5, 0.5333, 1184.33])]]\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-removal-sampling-catchability","generated_at":"2026-09-29T14:47:36.616348+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 catchability rule: `p_hat = (c1 - c2) / c1`.","root_cause":"The ratio of passes is reported as capture probability.","sha256":"395f0f19bb1cf10a74bbe175a3eebc378dff0c8087d889b66c88c7d67ce3032c","title":"Two-pass removal abundance estimate: catchability · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.396,"exit_code":1,"observations":[{"actual":[102.86,0.4118,127.45],"check":"regression: stream electrofishing","expected":[102.86,0.5833,127.45],"passed":false},{"actual":[101.25,0.8,1.98],"check":"regression: efficient first pass","expected":[101.25,0.8889,1.98],"passed":false},{"actual":[200.0,0.1111,28800.0],"check":"regression: weak depletion","expected":[200.0,0.2,28800.0],"passed":false},{"actual":[null,null,null],"check":"control: no depletion","expected":[null,null,null],"passed":true},{"actual":[45.0,1.0,0.0],"check":"regression: second pass empty","expected":[45.0,1.0,0.0],"passed":true},{"actual":null,"check":"control: negative catch","expected":null,"passed":true},{"actual":[null,null,null],"check":"control: increasing catch","expected":[null,null,null],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: stream electrofishing\", \"actual\": [102.86, 0.4118, 127.45], \"expected\": [102.86, 0.5833, 127.45], \"passed\": false}, {\"check\": \"regression: efficient first pass\", \"actual\": [101.25, 0.8, 1.98], \"expected\": [101.25, 0.8889, 1.98], \"passed\": false}, {\"check\": \"regression: weak depletion\", \"actual\": [200.0, 0.1111, 28800.0], \"expected\": [200.0, 0.2, 28800.0], \"passed\": false}, {\"check\": \"control: no depletion\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}, {\"check\": \"regression: second pass empty\", \"actual\": [45.0, 1.0, 0.0], \"expected\": [45.0, 1.0, 0.0], \"passed\": true}, {\"check\": \"control: negative catch\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control: increasing catch\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.339,"exit_code":1,"observations":[{"actual":[102.86,0.4167,127.45],"check":"regression: stream electrofishing","expected":[102.86,0.5833,127.45],"passed":false},{"actual":[101.25,0.1111,1.98],"check":"regression: efficient first pass","expected":[101.25,0.8889,1.98],"passed":false},{"actual":[200.0,0.8,28800.0],"check":"regression: weak depletion","expected":[200.0,0.2,28800.0],"passed":false},{"actual":[null,null,null],"check":"control: no depletion","expected":[null,null,null],"passed":true},{"actual":[45.0,0.0,0.0],"check":"regression: second pass empty","expected":[45.0,1.0,0.0],"passed":false},{"actual":null,"check":"control: negative catch","expected":null,"passed":true},{"actual":[null,null,null],"check":"control: increasing catch","expected":[null,null,null],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: stream electrofishing\", \"actual\": [102.86, 0.4167, 127.45], \"expected\": [102.86, 0.5833, 127.45], \"passed\": false}, {\"check\": \"regression: efficient first pass\", \"actual\": [101.25, 0.1111, 1.98], \"expected\": [101.25, 0.8889, 1.98], \"passed\": false}, {\"check\": \"regression: weak depletion\", \"actual\": [200.0, 0.8, 28800.0], \"expected\": [200.0, 0.2, 28800.0], \"passed\": false}, {\"check\": \"control: no depletion\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}, {\"check\": \"regression: second pass empty\", \"actual\": [45.0, 0.0, 0.0], \"expected\": [45.0, 1.0, 0.0], \"passed\": false}, {\"check\": \"control: negative catch\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control: increasing catch\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.257,"exit_code":0,"observations":[{"actual":[102.86,0.5833,127.45],"check":"regression: stream electrofishing","expected":[102.86,0.5833,127.45],"passed":true},{"actual":[101.25,0.8889,1.98],"check":"regression: efficient first pass","expected":[101.25,0.8889,1.98],"passed":true},{"actual":[200.0,0.2,28800.0],"check":"regression: weak depletion","expected":[200.0,0.2,28800.0],"passed":true},{"actual":[null,null,null],"check":"control: no depletion","expected":[null,null,null],"passed":true},{"actual":[45.0,1.0,0.0],"check":"regression: second pass empty","expected":[45.0,1.0,0.0],"passed":true},{"actual":null,"check":"control: negative catch","expected":null,"passed":true},{"actual":[null,null,null],"check":"control: increasing catch","expected":[null,null,null],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: stream electrofishing\", \"actual\": [102.86, 0.5833, 127.45], \"expected\": [102.86, 0.5833, 127.45], \"passed\": true}, {\"check\": \"regression: efficient first pass\", \"actual\": [101.25, 0.8889, 1.98], \"expected\": [101.25, 0.8889, 1.98], \"passed\": true}, {\"check\": \"regression: weak depletion\", \"actual\": [200.0, 0.2, 28800.0], \"expected\": [200.0, 0.2, 28800.0], \"passed\": true}, {\"check\": \"control: no depletion\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}, {\"check\": \"regression: second pass empty\", \"actual\": [45.0, 1.0, 0.0], \"expected\": [45.0, 1.0, 0.0], \"passed\": true}, {\"check\": \"control: negative catch\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control: increasing catch\", \"actual\": [null, null, null], \"expected\": [null, null, null], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}