{"abstract":"Every pitch in octave -1 (C-1 through B-1) is rejected even though keys 0..11 are valid.","category":"Music interval and transposition theory","checks":8,"contract":"Input a spelled pitch string: uppercase letter A-G, any run of accidentals (# = +1, b = -1, x = +2), then a signed integer octave where C4 = 60 and C-1 = 0. Return the MIDI key number, or None for malformed text or results outside 0..127.","evaluation_group":"w2-music-interval-spelled-midi","failed_approach":"Requiring more than one digit after the minus sign still rejects the single-digit octave -1.","family":"w2-music-interval-spelled-midi-negative-octave-sign","id":"FA-80851","implementations":{"attempt":{"sha256":"f59f75253790af9e6d9a295bb03df695da2f5be8edf3a5dc4d664937da1ef7bb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = tail.startswith('-') and len(tail) > 2\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + names[x[0]] + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G9', 127), ('G#9', None), ('Ab9', None), ('Cx-1', 2), ('Bx-1', 13)], [('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('B-1', 11), ('Bx-1', 13), ('G-1', 7)], [('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Cb-1', None), ('Cx-1', 2), ('G-1', 7), ('Ab-1', 8)], [('C-1', 0), ('Dbbb4', 59), ('Cb-1', None), ('E4', 64), ('F4', 65), ('B4', 71), ('Bx-1', 13), ('Ab-1', 8)], [('C-1', 0), ('B-1', 11), ('F4', 65), ('B4', 71), ('Bb3', 58), ('C0', 12), ('D#0', 15), ('G-1', 7)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, 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":"d2d62220551803e8a309fe4ee682821a642469de0a3ba91e898802f28dd43c61","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = False\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + names[x[0]] + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G9', 127), ('G#9', None), ('Ab9', None), ('Cx-1', 2), ('Bx-1', 13)], [('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('B-1', 11), ('Bx-1', 13), ('G-1', 7)], [('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Cb-1', None), ('Cx-1', 2), ('G-1', 7), ('Ab-1', 8)], [('C-1', 0), ('Dbbb4', 59), ('Cb-1', None), ('E4', 64), ('F4', 65), ('B4', 71), ('Bx-1', 13), ('Ab-1', 8)], [('C-1', 0), ('B-1', 11), ('F4', 65), ('B4', 71), ('Bb3', 58), ('C0', 12), ('D#0', 15), ('G-1', 7)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, 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":"c2a0249a59573f5e093bc303a749c12d6fee0dfd49b0a5dbd74009eb82d2b44a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    names = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}\n    if not isinstance(x, str) or len(x) < 2 or x[0] not in names:\n        return None\n    i = 1\n    acc = 0\n    while i < len(x) and x[i] in '#bx':\n        acc += {'#': 1, 'b': -1, 'x': 2}[x[i]]\n        i += 1\n    tail = x[i:]\n    neg = tail.startswith('-')\n    digits = tail[1:] if neg else tail\n    if not digits.isdigit():\n        return None\n    octave = -int(digits) if neg else int(digits)\n    midi = (octave + 1) * 12 + names[x[0]] + acc\n    if midi < 0 or midi > 127:\n        return None\n    return midi\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('C4', 60), ('A4', 69), ('C-1', 0), ('G9', 127), ('G#9', None), ('Ab9', None), ('Cx-1', 2), ('Bx-1', 13)], [('G#9', None), ('Ab9', None), ('B#3', 60), ('Cb4', 59), ('Fx4', 67), ('B-1', 11), ('Bx-1', 13), ('G-1', 7)], [('Cb4', 59), ('Fx4', 67), ('Ebb4', 62), ('Dbbb4', 59), ('Cb-1', None), ('Cx-1', 2), ('G-1', 7), ('Ab-1', 8)], [('C-1', 0), ('Dbbb4', 59), ('Cb-1', None), ('E4', 64), ('F4', 65), ('B4', 71), ('Bx-1', 13), ('Ab-1', 8)], [('C-1', 0), ('B-1', 11), ('F4', 65), ('B4', 71), ('Bb3', 58), ('C0', 12), ('D#0', 15), ('G-1', 7)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"oracle %d\" % i, 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":"A deterministic bounded teaching model with a stipulated toy contract; it is not a complete music notation or theory engine. 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-music-interval-spelled-midi-negative-octave-sign","generated_at":"2026-09-29T14:49:57.605022+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Pitch spelling and interval arithmetic decide the notes that notation, transposition and analysis tools display or play.","repair":"Restore the negative octave sign step so that it reads `neg = tail.startswith('-')`.","root_cause":"The octave parser never recognises a leading minus sign, so the digit check fails on \"-1\".","sha256":"93234b63c18421275cd9526787449b659063a7cae5cdc4ebed21a57696a80c1d","title":"Spelled pitch to MIDI key number: octave minus one rejected as malformed · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.4,"exit_code":1,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":69,"check":"oracle 1","expected":69,"passed":true},{"actual":null,"check":"oracle 2","expected":0,"passed":false},{"actual":127,"check":"oracle 3","expected":127,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":null,"check":"oracle 5","expected":null,"passed":true},{"actual":null,"check":"oracle 6","expected":2,"passed":false},{"actual":null,"check":"oracle 7","expected":13,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 69, \"expected\": 69, \"passed\": true}, {\"check\": \"oracle 2\", \"actual\": null, \"expected\": 0, \"passed\": false}, {\"check\": \"oracle 3\", \"actual\": 127, \"expected\": 127, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 6\", \"actual\": null, \"expected\": 2, \"passed\": false}, {\"check\": \"oracle 7\", \"actual\": null, \"expected\": 13, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.26,"exit_code":1,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":69,"check":"oracle 1","expected":69,"passed":true},{"actual":null,"check":"oracle 2","expected":0,"passed":false},{"actual":127,"check":"oracle 3","expected":127,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":null,"check":"oracle 5","expected":null,"passed":true},{"actual":null,"check":"oracle 6","expected":2,"passed":false},{"actual":null,"check":"oracle 7","expected":13,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 69, \"expected\": 69, \"passed\": true}, {\"check\": \"oracle 2\", \"actual\": null, \"expected\": 0, \"passed\": false}, {\"check\": \"oracle 3\", \"actual\": 127, \"expected\": 127, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 6\", \"actual\": null, \"expected\": 2, \"passed\": false}, {\"check\": \"oracle 7\", \"actual\": null, \"expected\": 13, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.974,"exit_code":0,"observations":[{"actual":60,"check":"oracle 0","expected":60,"passed":true},{"actual":69,"check":"oracle 1","expected":69,"passed":true},{"actual":0,"check":"oracle 2","expected":0,"passed":true},{"actual":127,"check":"oracle 3","expected":127,"passed":true},{"actual":null,"check":"oracle 4","expected":null,"passed":true},{"actual":null,"check":"oracle 5","expected":null,"passed":true},{"actual":2,"check":"oracle 6","expected":2,"passed":true},{"actual":13,"check":"oracle 7","expected":13,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"oracle 0\", \"actual\": 60, \"expected\": 60, \"passed\": true}, {\"check\": \"oracle 1\", \"actual\": 69, \"expected\": 69, \"passed\": true}, {\"check\": \"oracle 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"oracle 3\", \"actual\": 127, \"expected\": 127, \"passed\": true}, {\"check\": \"oracle 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"oracle 6\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"oracle 7\", \"actual\": 13, \"expected\": 13, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}