{"abstract":"A stock harvested to exactly zero keeps a trajectory of zeros instead of stopping.","category":"Ecological population dynamics","checks":7,"contract":"Each year the quota is removed first; if the stock is then <= 0 the trajectory records 0.0 and stops; otherwise the survivors grow by r*N*(1-N/K); the trajectory starts with the unharvested N0; values rounded to 4; None for K<=0 or negative N0.","contract_signature":"n0, r, k, harvest, years","evaluation_group":"w2-ecopop-harvested-logistic","failed_approach":"Excluding exactly zero from the test still misses the exact-quota collapse.","family":"w2-ecopop-harvested-logistic-extinction-boundary","id":"FA-65351","implementations":{"attempt":{"sha256":"dc833fc1e236a7fdd57677a6082fa5424e40d0ddfcfcc9cf719b79a4de24560d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0, r, k, harvest, years):\n    if k <= 0 or n0 < 0:\n        return None\n    n = float(n0)\n    traj = [round(n, 4)]\n    for _ in range(years):\n        n -= harvest\n        if n < 1e-9 and n != 0:\n            traj.append(0.0)\n            break\n        n = n + r * n * (1 - n / k)\n        traj.append(round(n, 4))\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0])],\n [('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0])],\n [('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.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":"b54e75edada4001ce59be9be1dea4a9821f61e7513e9e818115e2cbe69dded87","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0, r, k, harvest, years):\n    if k <= 0 or n0 < 0:\n        return None\n    n = float(n0)\n    traj = [round(n, 4)]\n    for _ in range(years):\n        n -= harvest\n        if n < 0:\n            traj.append(0.0)\n            break\n        n = n + r * n * (1 - n / k)\n        traj.append(round(n, 4))\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0])],\n [('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('control: cod-like stock light quota',\n   (500, 0.4, 1000, 20, 8),\n   [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772]),\n  ('control: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0])],\n [('regression: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('control: no harvest recovery',\n   (100, 0.6, 800, 0, 7),\n   [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084]),\n  ('control: above carrying capacity',\n   (1200, 0.5, 1000, 10, 6),\n   [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131]),\n  ('control: invalid carrying capacity', (100, 0.5, 0, 10, 5), None),\n  ('control: zero years', (100, 0.5, 500, 10, 0), [100.0]),\n  ('control: slow grower',\n   (800, 0.1, 1000, 15, 9),\n   [800.0, 801.8775, 803.6476, 805.3159, 806.8876, 808.3677, 809.7613, 811.0728, 812.3069, 813.4678]),\n  ('control: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.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-harvested-logistic-extinction-boundary","generated_at":"2026-09-29T14:47:33.306459+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":"Extinction is only declared for strictly negative stock.","sha256":"ada5c84c470db6d9165d49d51d21a11825a4b20416c8ccff137ff74b9a967e81","title":"Discrete logistic population with constant quota harvest: extinction boundary · 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.751,"exit_code":1,"observations":[{"actual":[500.0,579.84,658.4077,730.745,792.9796,843.1725,881.3963,909.1534,928.5772],"check":"control: cod-like stock light quota","expected":[500.0,579.84,658.4077,730.745,792.9796,843.1725,881.3963,909.1534,928.5772],"passed":true},{"actual":[300.0,224.28,132.3017,15.9468,0.0],"check":"control: quota exceeds growth collapse","expected":[300.0,224.28,132.3017,15.9468,0.0],"passed":true},{"actual":[50.0,0.0,0.0],"check":"regression: quota equals stock exactly","expected":[50.0,0.0],"passed":false},{"actual":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"check":"control: no harvest recovery","expected":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"passed":true},{"actual":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"check":"control: above carrying capacity","expected":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"passed":true},{"actual":null,"check":"control: invalid carrying capacity","expected":null,"passed":true},{"actual":[100.0],"check":"control: zero years","expected":[100.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control: cod-like stock light quota\", \"actual\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"expected\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"passed\": true}, {\"check\": \"control: quota exceeds growth collapse\", \"actual\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"expected\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"passed\": true}, {\"check\": \"regression: quota equals stock exactly\", \"actual\": [50.0, 0.0, 0.0], \"expected\": [50.0, 0.0], \"passed\": false}, {\"check\": \"control: no harvest recovery\", \"actual\": [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084], \"expected\": [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084], \"passed\": true}, {\"check\": \"control: above carrying capacity\", \"actual\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"expected\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"passed\": true}, {\"check\": \"control: invalid carrying capacity\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control: zero years\", \"actual\": [100.0], \"expected\": [100.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.144,"exit_code":1,"observations":[{"actual":[500.0,579.84,658.4077,730.745,792.9796,843.1725,881.3963,909.1534,928.5772],"check":"control: cod-like stock light quota","expected":[500.0,579.84,658.4077,730.745,792.9796,843.1725,881.3963,909.1534,928.5772],"passed":true},{"actual":[300.0,224.28,132.3017,15.9468,0.0],"check":"control: quota exceeds growth collapse","expected":[300.0,224.28,132.3017,15.9468,0.0],"passed":true},{"actual":[50.0,0.0,0.0],"check":"regression: quota equals stock exactly","expected":[50.0,0.0],"passed":false},{"actual":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"check":"control: no harvest recovery","expected":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"passed":true},{"actual":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"check":"control: above carrying capacity","expected":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"passed":true},{"actual":null,"check":"control: invalid carrying capacity","expected":null,"passed":true},{"actual":[100.0],"check":"control: zero years","expected":[100.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control: cod-like stock light quota\", \"actual\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"expected\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"passed\": true}, {\"check\": \"control: quota exceeds growth collapse\", \"actual\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"expected\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"passed\": true}, {\"check\": \"regression: quota equals stock exactly\", \"actual\": [50.0, 0.0, 0.0], \"expected\": [50.0, 0.0], \"passed\": false}, {\"check\": \"control: no harvest recovery\", \"actual\": [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084], \"expected\": [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084], \"passed\": true}, {\"check\": \"control: above carrying capacity\", \"actual\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"expected\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"passed\": true}, {\"check\": \"control: invalid carrying capacity\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control: zero years\", \"actual\": [100.0], \"expected\": [100.0], \"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."}}