{"abstract":"Effort reference points ignore gear catchability.","category":"Ecological population dynamics","checks":7,"contract":"MSY = rK/4 at B=K/2 and E_msy = r/(2q); equilibrium biomass under effort E is K(1-qE/r) when qE<r else 0; yield = qEB; status 'overfished' when E>E_msy, 'at-msy' when equal, else 'sustainable'; return [MSY, Bmsy, Emsy, B, yield, status] rounded; None for invalid inputs.","contract_signature":"r, k, effort, q","evaluation_group":"w2-ecopop-schaefer-msy","failed_approach":"Using 4q halves the effort that achieves MSY.","family":"w2-ecopop-schaefer-msy-effort-at-msy","id":"FA-65556","implementations":{"attempt":{"sha256":"e7ef0e31aafd195e74de76d92e5938781c49364f2b3a4c0350a741c889ece8b6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(r, k, effort, q):\n    if r <= 0 or k <= 0 or q <= 0 or effort < 0:\n        return None\n    msy = r * k / 4\n    bmsy = k / 2\n    emsy = r / (4 * q)\n    b = k * (1 - q * effort / r) if q * effort < r else 0.0\n    y = q * effort * b\n    if effort > emsy:\n        status = 'overfished'\n    elif effort == emsy:\n        status = 'at-msy'\n    else:\n        status = 'sustainable'\n    return [round(msy, 4), round(bmsy, 4), round(emsy, 6), round(b, 4), round(y, 4), status]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None)],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None)],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])]]\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":"9c0a1507380f44b99a713d1c23a6403ccd8c0864842e7efdf6e781cbda264a24","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(r, k, effort, q):\n    if r <= 0 or k <= 0 or q <= 0 or effort < 0:\n        return None\n    msy = r * k / 4\n    bmsy = k / 2\n    emsy = r / 2\n    b = k * (1 - q * effort / r) if q * effort < r else 0.0\n    y = q * effort * b\n    if effort > emsy:\n        status = 'overfished'\n    elif effort == emsy:\n        status = 'at-msy'\n    else:\n        status = 'sustainable'\n    return [round(msy, 4), round(bmsy, 4), round(emsy, 6), round(b, 4), round(y, 4), status]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None)],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: effort at msy', (0.5, 2000, 250, 0.001), [250.0, 1000.0, 250.0, 1000.0, 250.0, 'at-msy']),\n  ('regression: overfished',\n   (0.3, 5000, 250, 0.001),\n   [375.0, 2500.0, 150.0, 833.3333, 208.3333, 'overfished']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None)],\n [('regression: tuna fishery moderate effort',\n   (0.4, 10000, 100, 0.001),\n   [1000.0, 5000.0, 200.0, 7500.0, 750.0, 'sustainable']),\n  ('regression: collapse effort', (0.2, 3000, 300, 0.001), [150.0, 1500.0, 100.0, 0.0, 0.0, 'overfished']),\n  ('regression: no fishing', (0.6, 800, 0, 0.002), [120.0, 400.0, 150.0, 800.0, 0.0, 'sustainable']),\n  ('regression: high catchability', (0.8, 1500, 50, 0.01), [300.0, 750.0, 40.0, 562.5, 281.25, 'overfished']),\n  ('regression: slightly over msy',\n   (0.5, 2000, 250.4, 0.001),\n   [250.0, 1000.0, 250.0, 998.4, 249.9994, 'overfished']),\n  ('control: invalid q', (0.5, 2000, 100, 0.0), None),\n  ('regression: light fishing',\n   (1.2, 400, 20, 0.005),\n   [120.0, 200.0, 120.0, 366.6667, 36.6667, 'sustainable'])]]\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-schaefer-msy-effort-at-msy","generated_at":"2026-09-29T14:47:35.185743+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.","root_cause":"E_msy omits the catchability coefficient.","sha256":"a4990a9a209cc8d0fbbd5856eaeda34bf8e9b40235cf78c23342baaba3e81c4d","title":"Schaefer surplus-production harvest reference points: effort at MSY · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.666,"exit_code":1,"observations":[{"actual":[1000.0,5000.0,100.0,7500.0,750.0,"at-msy"],"check":"regression: tuna fishery moderate effort","expected":[1000.0,5000.0,200.0,7500.0,750.0,"sustainable"],"passed":false},{"actual":[250.0,1000.0,125.0,1000.0,250.0,"overfished"],"check":"regression: effort at msy","expected":[250.0,1000.0,250.0,1000.0,250.0,"at-msy"],"passed":false},{"actual":[375.0,2500.0,75.0,833.3333,208.3333,"overfished"],"check":"regression: overfished","expected":[375.0,2500.0,150.0,833.3333,208.3333,"overfished"],"passed":false},{"actual":[150.0,1500.0,50.0,0.0,0.0,"overfished"],"check":"regression: collapse effort","expected":[150.0,1500.0,100.0,0.0,0.0,"overfished"],"passed":false},{"actual":[120.0,400.0,75.0,800.0,0.0,"sustainable"],"check":"regression: no fishing","expected":[120.0,400.0,150.0,800.0,0.0,"sustainable"],"passed":false},{"actual":[300.0,750.0,20.0,562.5,281.25,"overfished"],"check":"regression: high catchability","expected":[300.0,750.0,40.0,562.5,281.25,"overfished"],"passed":false},{"actual":null,"check":"control: invalid q","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: tuna fishery moderate effort\", \"actual\": [1000.0, 5000.0, 100.0, 7500.0, 750.0, \"at-msy\"], \"expected\": [1000.0, 5000.0, 200.0, 7500.0, 750.0, \"sustainable\"], \"passed\": false}, {\"check\": \"regression: effort at msy\", \"actual\": [250.0, 1000.0, 125.0, 1000.0, 250.0, \"overfished\"], \"expected\": [250.0, 1000.0, 250.0, 1000.0, 250.0, \"at-msy\"], \"passed\": false}, {\"check\": \"regression: overfished\", \"actual\": [375.0, 2500.0, 75.0, 833.3333, 208.3333, \"overfished\"], \"expected\": [375.0, 2500.0, 150.0, 833.3333, 208.3333, \"overfished\"], \"passed\": false}, {\"check\": \"regression: collapse effort\", \"actual\": [150.0, 1500.0, 50.0, 0.0, 0.0, \"overfished\"], \"expected\": [150.0, 1500.0, 100.0, 0.0, 0.0, \"overfished\"], \"passed\": false}, {\"check\": \"regression: no fishing\", \"actual\": [120.0, 400.0, 75.0, 800.0, 0.0, \"sustainable\"], \"expected\": [120.0, 400.0, 150.0, 800.0, 0.0, \"sustainable\"], \"passed\": false}, {\"check\": \"regression: high catchability\", \"actual\": [300.0, 750.0, 20.0, 562.5, 281.25, \"overfished\"], \"expected\": [300.0, 750.0, 40.0, 562.5, 281.25, \"overfished\"], \"passed\": false}, {\"check\": \"control: invalid q\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.406,"exit_code":1,"observations":[{"actual":[1000.0,5000.0,0.2,7500.0,750.0,"overfished"],"check":"regression: tuna fishery moderate effort","expected":[1000.0,5000.0,200.0,7500.0,750.0,"sustainable"],"passed":false},{"actual":[250.0,1000.0,0.25,1000.0,250.0,"overfished"],"check":"regression: effort at msy","expected":[250.0,1000.0,250.0,1000.0,250.0,"at-msy"],"passed":false},{"actual":[375.0,2500.0,0.15,833.3333,208.3333,"overfished"],"check":"regression: overfished","expected":[375.0,2500.0,150.0,833.3333,208.3333,"overfished"],"passed":false},{"actual":[150.0,1500.0,0.1,0.0,0.0,"overfished"],"check":"regression: collapse effort","expected":[150.0,1500.0,100.0,0.0,0.0,"overfished"],"passed":false},{"actual":[120.0,400.0,0.3,800.0,0.0,"sustainable"],"check":"regression: no fishing","expected":[120.0,400.0,150.0,800.0,0.0,"sustainable"],"passed":false},{"actual":[300.0,750.0,0.4,562.5,281.25,"overfished"],"check":"regression: high catchability","expected":[300.0,750.0,40.0,562.5,281.25,"overfished"],"passed":false},{"actual":null,"check":"control: invalid q","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: tuna fishery moderate effort\", \"actual\": [1000.0, 5000.0, 0.2, 7500.0, 750.0, \"overfished\"], \"expected\": [1000.0, 5000.0, 200.0, 7500.0, 750.0, \"sustainable\"], \"passed\": false}, {\"check\": \"regression: effort at msy\", \"actual\": [250.0, 1000.0, 0.25, 1000.0, 250.0, \"overfished\"], \"expected\": [250.0, 1000.0, 250.0, 1000.0, 250.0, \"at-msy\"], \"passed\": false}, {\"check\": \"regression: overfished\", \"actual\": [375.0, 2500.0, 0.15, 833.3333, 208.3333, \"overfished\"], \"expected\": [375.0, 2500.0, 150.0, 833.3333, 208.3333, \"overfished\"], \"passed\": false}, {\"check\": \"regression: collapse effort\", \"actual\": [150.0, 1500.0, 0.1, 0.0, 0.0, \"overfished\"], \"expected\": [150.0, 1500.0, 100.0, 0.0, 0.0, \"overfished\"], \"passed\": false}, {\"check\": \"regression: no fishing\", \"actual\": [120.0, 400.0, 0.3, 800.0, 0.0, \"sustainable\"], \"expected\": [120.0, 400.0, 150.0, 800.0, 0.0, \"sustainable\"], \"passed\": false}, {\"check\": \"regression: high catchability\", \"actual\": [300.0, 750.0, 0.4, 562.5, 281.25, \"overfished\"], \"expected\": [300.0, 750.0, 40.0, 562.5, 281.25, \"overfished\"], \"passed\": false}, {\"check\": \"control: invalid q\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}