{"abstract":"Force 8 winds only raise a small-craft advisory instead of a gale warning.","category":"Weather index computation","checks":8,"contract":"Convert knots to m/s (x0.514444) and round to 0.1 m/s. Beaufort force n is the first n with speed < bounds[n], bounds=[0.5,1.6,3.4,5.5,8.0,10.8,13.9,17.2,20.8,24.5,28.5,32.7], else 12. If the gust force is at least sustained force + 2 (and force < 12) upgrade by one. Warning: <6 none, <8 small craft, <10 gale, <12 storm, 12 hurricane force. Return [force, warning].","contract_signature":"sustained_kt, gust_kt","evaluation_group":"w2-weather_index_computation-beaufort-warning","failed_approach":"Banding on the gust force instead of the (possibly upgraded) sustained force mislabels gusty force 6-7 winds as gale.","family":"w2-weather_index_computation-beaufort-warning-small-craft-upper-edge","id":"FA-71126","implementations":{"attempt":{"sha256":"bd0c52b9e5ca092b42f8ceb7d5410bad13dbf1efbeda94f986c5bf1bb2456de4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sustained_kt, gust_kt):\n    bounds = [0.5, 1.6, 3.4, 5.5, 8.0, 10.8, 13.9, 17.2, 20.8, 24.5, 28.5, 32.7]\n    def force(kt):\n        ms = round(kt * 0.514444, 1)\n        for n, upper in enumerate(bounds):\n            if ms < upper:\n                return n\n        return 12\n    b = force(sustained_kt)\n    g = force(gust_kt)\n    if g >= b + 2 and b < 12:\n        b += 1\n    if b < 6:\n        warn = \"none\"\n    elif g < 8:\n        warn = \"small craft\"\n    elif b < 10:\n        warn = \"gale\"\n    elif b < 12:\n        warn = \"storm\"\n    else:\n        warn = \"hurricane force\"\n    return [b, warn]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['sustained 0 kt gust +0', [0, 0], [0, 'none']], ['sustained 0 kt gust +2', [0, 2], [0, 'none']], ['sustained 0 kt gust +8', [0, 8], [1, 'none']], ['sustained 0 kt gust +16', [0, 16], [1, 'none']], ['sustained 0.9 kt gust +0', [0.9, 0.9], [1, 'none']], ['sustained 0.9 kt gust +2', [0.9, 2.9], [1, 'none']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 27 kt gust +16', [27, 43], [8, 'gale']]], [['sustained 0.9 kt gust +16', [0.9, 16.9], [2, 'none']], ['sustained 1 kt gust +0', [1, 1], [1, 'none']], ['sustained 1 kt gust +2', [1, 3], [1, 'none']], ['sustained 1 kt gust +8', [1, 9], [2, 'none']], ['sustained 1 kt gust +16', [1, 17], [2, 'none']], ['sustained 3 kt gust +0', [3, 3], [1, 'none']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 33.4 kt gust +8', [33.4, 41.4], [8, 'gale']]], [['sustained 3 kt gust +8', [3, 11], [2, 'none']], ['sustained 3 kt gust +16', [3, 19], [2, 'none']], ['sustained 6.6 kt gust +0', [6.6, 6.6], [3, 'none']], ['sustained 6.6 kt gust +2', [6.6, 8.6], [3, 'none']], ['sustained 6.6 kt gust +8', [6.6, 14.6], [3, 'none']], ['sustained 6.6 kt gust +16', [6.6, 22.6], [4, 'none']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 34 kt gust +8', [34, 42], [8, 'gale']]], [['sustained 10.7 kt gust +2', [10.7, 12.7], [4, 'none']], ['sustained 10.7 kt gust +8', [10.7, 18.7], [4, 'none']], ['sustained 10.7 kt gust +16', [10.7, 26.7], [5, 'none']], ['sustained 16 kt gust +0', [16, 16], [5, 'none']], ['sustained 16 kt gust +2', [16, 18], [5, 'none']], ['sustained 16 kt gust +8', [16, 24], [5, 'none']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 33.4 kt gust +2', [33.4, 35.4], [8, 'gale']]], [['sustained 21 kt gust +0', [21, 21], [6, 'small craft']], ['sustained 21 kt gust +2', [21, 23], [6, 'small craft']], ['sustained 21 kt gust +8', [21, 29], [6, 'small craft']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 27 kt gust +0', [27, 27], [7, 'small craft']], ['sustained 27 kt gust +2', [27, 29], [7, 'small craft']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 34 kt gust +2', [34, 36], [8, 'gale']]]]\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":"d5f66a9e124272b35d06fb23f8f7ae84cd7ff2bf103878d56ff60c1060fd3095","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sustained_kt, gust_kt):\n    bounds = [0.5, 1.6, 3.4, 5.5, 8.0, 10.8, 13.9, 17.2, 20.8, 24.5, 28.5, 32.7]\n    def force(kt):\n        ms = round(kt * 0.514444, 1)\n        for n, upper in enumerate(bounds):\n            if ms < upper:\n                return n\n        return 12\n    b = force(sustained_kt)\n    g = force(gust_kt)\n    if g >= b + 2 and b < 12:\n        b += 1\n    if b < 6:\n        warn = \"none\"\n    elif b <= 8:\n        warn = \"small craft\"\n    elif b < 10:\n        warn = \"gale\"\n    elif b < 12:\n        warn = \"storm\"\n    else:\n        warn = \"hurricane force\"\n    return [b, warn]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['sustained 0 kt gust +0', [0, 0], [0, 'none']], ['sustained 0 kt gust +2', [0, 2], [0, 'none']], ['sustained 0 kt gust +8', [0, 8], [1, 'none']], ['sustained 0 kt gust +16', [0, 16], [1, 'none']], ['sustained 0.9 kt gust +0', [0.9, 0.9], [1, 'none']], ['sustained 0.9 kt gust +2', [0.9, 2.9], [1, 'none']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 27 kt gust +16', [27, 43], [8, 'gale']]], [['sustained 0.9 kt gust +16', [0.9, 16.9], [2, 'none']], ['sustained 1 kt gust +0', [1, 1], [1, 'none']], ['sustained 1 kt gust +2', [1, 3], [1, 'none']], ['sustained 1 kt gust +8', [1, 9], [2, 'none']], ['sustained 1 kt gust +16', [1, 17], [2, 'none']], ['sustained 3 kt gust +0', [3, 3], [1, 'none']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 33.4 kt gust +8', [33.4, 41.4], [8, 'gale']]], [['sustained 3 kt gust +8', [3, 11], [2, 'none']], ['sustained 3 kt gust +16', [3, 19], [2, 'none']], ['sustained 6.6 kt gust +0', [6.6, 6.6], [3, 'none']], ['sustained 6.6 kt gust +2', [6.6, 8.6], [3, 'none']], ['sustained 6.6 kt gust +8', [6.6, 14.6], [3, 'none']], ['sustained 6.6 kt gust +16', [6.6, 22.6], [4, 'none']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 34 kt gust +8', [34, 42], [8, 'gale']]], [['sustained 10.7 kt gust +2', [10.7, 12.7], [4, 'none']], ['sustained 10.7 kt gust +8', [10.7, 18.7], [4, 'none']], ['sustained 10.7 kt gust +16', [10.7, 26.7], [5, 'none']], ['sustained 16 kt gust +0', [16, 16], [5, 'none']], ['sustained 16 kt gust +2', [16, 18], [5, 'none']], ['sustained 16 kt gust +8', [16, 24], [5, 'none']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 33.4 kt gust +2', [33.4, 35.4], [8, 'gale']]], [['sustained 21 kt gust +0', [21, 21], [6, 'small craft']], ['sustained 21 kt gust +2', [21, 23], [6, 'small craft']], ['sustained 21 kt gust +8', [21, 29], [6, 'small craft']], ['sustained 21 kt gust +16', [21, 37], [7, 'small craft']], ['sustained 27 kt gust +0', [27, 27], [7, 'small craft']], ['sustained 27 kt gust +2', [27, 29], [7, 'small craft']], ['sustained 27 kt gust +8', [27, 35], [7, 'small craft']], ['sustained 34 kt gust +2', [34, 36], [8, 'gale']]]]\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":"Stipulated deterministic teaching model of an operational weather index; coefficients and thresholds are fixed by the contract and no claim of standards conformance is made. 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-weather_index_computation-beaufort-warning-small-craft-upper-edge","generated_at":"2026-09-29T14:48:26.852479+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Coastal marine forecasts issue small-craft, gale and storm warnings from Beaufort force.","root_cause":"The small-craft band includes force 8.","sha256":"24380de2c4ad3115e991fab67da6eec8d851d45fbfdedf90825a5b3d3392feb3","title":"Beaufort force and marine warning: small craft upper edge · 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":36.817,"exit_code":1,"observations":[{"actual":[0,"none"],"check":"sustained 0 kt gust +0","expected":[0,"none"],"passed":true},{"actual":[0,"none"],"check":"sustained 0 kt gust +2","expected":[0,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0 kt gust +8","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0 kt gust +16","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0.9 kt gust +0","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0.9 kt gust +2","expected":[1,"none"],"passed":true},{"actual":[7,"gale"],"check":"sustained 27 kt gust +8","expected":[7,"small craft"],"passed":false},{"actual":[8,"gale"],"check":"sustained 27 kt gust +16","expected":[8,"gale"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"sustained 0 kt gust +0\", \"actual\": [0, \"none\"], \"expected\": [0, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +2\", \"actual\": [0, \"none\"], \"expected\": [0, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +8\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +16\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0.9 kt gust +0\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0.9 kt gust +2\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 27 kt gust +8\", \"actual\": [7, \"gale\"], \"expected\": [7, \"small craft\"], \"passed\": false}, {\"check\": \"sustained 27 kt gust +16\", \"actual\": [8, \"gale\"], \"expected\": [8, \"gale\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.1,"exit_code":1,"observations":[{"actual":[0,"none"],"check":"sustained 0 kt gust +0","expected":[0,"none"],"passed":true},{"actual":[0,"none"],"check":"sustained 0 kt gust +2","expected":[0,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0 kt gust +8","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0 kt gust +16","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0.9 kt gust +0","expected":[1,"none"],"passed":true},{"actual":[1,"none"],"check":"sustained 0.9 kt gust +2","expected":[1,"none"],"passed":true},{"actual":[7,"small craft"],"check":"sustained 27 kt gust +8","expected":[7,"small craft"],"passed":true},{"actual":[8,"small craft"],"check":"sustained 27 kt gust +16","expected":[8,"gale"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"sustained 0 kt gust +0\", \"actual\": [0, \"none\"], \"expected\": [0, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +2\", \"actual\": [0, \"none\"], \"expected\": [0, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +8\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0 kt gust +16\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0.9 kt gust +0\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 0.9 kt gust +2\", \"actual\": [1, \"none\"], \"expected\": [1, \"none\"], \"passed\": true}, {\"check\": \"sustained 27 kt gust +8\", \"actual\": [7, \"small craft\"], \"expected\": [7, \"small craft\"], \"passed\": true}, {\"check\": \"sustained 27 kt gust +16\", \"actual\": [8, \"small craft\"], \"expected\": [8, \"gale\"], \"passed\": false}], \"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."}}