{"abstract":"Stocks never settle at carrying capacity; growth follows the initial density forever.","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":"Inflating K by the quota shifts the equilibrium above the true capacity.","family":"w2-ecopop-harvested-logistic-crowding-feedback","id":"FA-65341","implementations":{"attempt":{"sha256":"e2052ba7a171be8a158f28e24a0448d580eeffab890e202b5c08230af6740061","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 + harvest))\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 = [[('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: 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  ('regression: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\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: 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  ('regression: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: 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  ('regression: 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":"0c8bc189879779d91c14a61130cf4ac71d8e23e3b24aabf36d31ebf67b8b91f8","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 - n0 / 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 = [[('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: 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  ('regression: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\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: 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  ('regression: two-year collapse', (60, 0.2, 500, 40, 6), [60.0, 23.84, 0.0])],\n [('regression: 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  ('regression: quota exceeds growth collapse',\n   (300, 0.3, 1000, 120, 10),\n   [300.0, 224.28, 132.3017, 15.9468, 0.0]),\n  ('control: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: quota equals stock exactly', (50, 0.5, 400, 50, 5), [50.0, 0.0]),\n  ('regression: 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  ('regression: 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: 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  ('regression: 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-crowding-feedback","generated_at":"2026-09-29T14:47:33.167440+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":"Density dependence uses the initial stock N0 instead of the current stock.","sha256":"736d8f68bc26df82854ceaf2da4e6e9c4d455d74b4001756521ee1e45202ab63","title":"Discrete logistic population with constant quota harvest: crowding feedback · 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":42.399,"exit_code":1,"observations":[{"actual":[500.0,581.6471,662.601,737.7057,802.7874,855.6059,896.0297,925.4894,946.1514],"check":"regression: 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":false},{"actual":[300.0,225.3214,133.9466,18.0785,0.0],"check":"regression: quota exceeds growth collapse","expected":[300.0,224.28,132.3017,15.9468,0.0],"passed":false},{"actual":[50.0,0.0],"check":"control: quota equals stock exactly","expected":[50.0,0.0],"passed":true},{"actual":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"check":"regression: 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,1083.9604,1039.955,1019.7804,1009.8902,1004.8945,1002.3343],"check":"regression: above carrying capacity","expected":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"passed":false},{"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\": \"regression: cod-like stock light quota\", \"actual\": [500.0, 581.6471, 662.601, 737.7057, 802.7874, 855.6059, 896.0297, 925.4894, 946.1514], \"expected\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"passed\": false}, {\"check\": \"regression: quota exceeds growth collapse\", \"actual\": [300.0, 225.3214, 133.9466, 18.0785, 0.0], \"expected\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"passed\": false}, {\"check\": \"control: quota equals stock exactly\", \"actual\": [50.0, 0.0], \"expected\": [50.0, 0.0], \"passed\": true}, {\"check\": \"regression: 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\": \"regression: above carrying capacity\", \"actual\": [1200.0, 1083.9604, 1039.955, 1019.7804, 1009.8902, 1004.8945, 1002.3343], \"expected\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"passed\": false}, {\"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":40.974,"exit_code":1,"observations":[{"actual":[500.0,576.0,667.2,776.64,907.968,1065.5616,1254.6739,1481.6087,1753.9304],"check":"regression: 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":false},{"actual":[300.0,217.8,118.338,0.0],"check":"regression: quota exceeds growth collapse","expected":[300.0,224.28,132.3017,15.9468,0.0],"passed":false},{"actual":[50.0,0.0],"check":"control: quota equals stock exactly","expected":[50.0,0.0],"passed":true},{"actual":[100.0,152.5,232.5625,354.6578,540.8532,824.8011,1257.8216,1918.178],"check":"regression: no harvest recovery","expected":[100.0,152.5,226.5578,323.9962,439.6637,558.4838,659.646,729.084],"passed":false},{"actual":[1200.0,1071.0,954.9,850.41,756.369,671.7321,595.5589],"check":"regression: above carrying capacity","expected":[1200.0,1076.95,1031.2338,1010.3915,1000.1957,995.0498,992.4131],"passed":false},{"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\": \"regression: cod-like stock light quota\", \"actual\": [500.0, 576.0, 667.2, 776.64, 907.968, 1065.5616, 1254.6739, 1481.6087, 1753.9304], \"expected\": [500.0, 579.84, 658.4077, 730.745, 792.9796, 843.1725, 881.3963, 909.1534, 928.5772], \"passed\": false}, {\"check\": \"regression: quota exceeds growth collapse\", \"actual\": [300.0, 217.8, 118.338, 0.0], \"expected\": [300.0, 224.28, 132.3017, 15.9468, 0.0], \"passed\": false}, {\"check\": \"control: quota equals stock exactly\", \"actual\": [50.0, 0.0], \"expected\": [50.0, 0.0], \"passed\": true}, {\"check\": \"regression: no harvest recovery\", \"actual\": [100.0, 152.5, 232.5625, 354.6578, 540.8532, 824.8011, 1257.8216, 1918.178], \"expected\": [100.0, 152.5, 226.5578, 323.9962, 439.6637, 558.4838, 659.646, 729.084], \"passed\": false}, {\"check\": \"regression: above carrying capacity\", \"actual\": [1200.0, 1071.0, 954.9, 850.41, 756.369, 671.7321, 595.5589], \"expected\": [1200.0, 1076.95, 1031.2338, 1010.3915, 1000.1957, 995.0498, 992.4131], \"passed\": false}, {\"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."}}