{"abstract":"Adjacent minterms sharing a consensus term are still reported as hazards.","category":"Digital logic simulation","checks":8,"contract":"Input [nv, terms]: product terms are strings over '0','1','-' with character 0 the most significant variable. Minterm m is covered by a term when every non-'-' position matches bit (m >> (nv-1-k)) & 1. A static-1 hazard is a pair of adjacent minterms (differing in one bit), both in the on-set, that no single term covers together. Return sorted [low, high] pairs.","evaluation_group":"w2-digital-logic-simulation-static-hazards","failed_approach":"Requiring identical covering sets flags pairs that share a term but are also covered by others.","family":"w2-digital-logic-simulation-static-hazards-common-cover-test","id":"FA-89176","implementations":{"attempt":{"sha256":"6c74424921ac14b21719289e87a18ccbc44d1b11863033f22bd20472d0c6cde5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    nv, terms = args\n    def covers(t, m):\n        for k, ch in enumerate(t):\n            bit = (m >> (nv - 1 - k)) & 1\n            if ch != '-' and int(ch) != bit:\n                return False\n        return True\n    ones = [m for m in range(2 ** nv) if any(covers(t, m) for t in terms)]\n    out = []\n    for m in ones:\n        for k in range(nv):\n            p = m ^ (1 << k)\n            if p > m and p in ones and {t for t in terms if covers(t, m)} != {t for t in terms if covers(t, p)}:\n                out.append([m, p])\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('cover 0', [3, ['1-0', '-11', '11-']], []), ('cover 1', [2, ['1-', '-1']], []), ('cover 2', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 3', [3, ['0-0', '1-1']], []), ('cover 4', [4, ['11--', '--11']], []), ('cover 5', [3, ['00-', '-01', '1-1']], []), ('cover 6', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [2, ['1-', '-1']], []), ('cover 1', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 2', [3, ['0-0', '1-1']], []), ('cover 3', [4, ['11--', '--11']], []), ('cover 4', [3, ['00-', '-01', '1-1']], []), ('cover 5', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 6', [3, ['1--', '-1-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 1', [3, ['0-0', '1-1']], []), ('cover 2', [4, ['11--', '--11']], []), ('cover 3', [3, ['00-', '-01', '1-1']], []), ('cover 4', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 5', [3, ['1--', '-1-']], []), ('cover 6', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [3, ['0-0', '1-1']], []), ('cover 1', [4, ['11--', '--11']], []), ('cover 2', [3, ['00-', '-01', '1-1']], []), ('cover 3', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 4', [3, ['1--', '-1-']], []), ('cover 5', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 6', [3, ['10-', '-11']], [[5, 7]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['11--', '--11']], []), ('cover 1', [3, ['00-', '-01', '1-1']], []), ('cover 2', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 3', [3, ['1--', '-1-']], []), ('cover 4', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 5', [3, ['10-', '-11']], [[5, 7]]), ('cover 6', [3, ['1-0', '-11', '11-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])]]\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":"fd261da87919cad4943bc1e11a0dce5fd4a614a4351310068efe41da2d187ded","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    nv, terms = args\n    def covers(t, m):\n        for k, ch in enumerate(t):\n            bit = (m >> (nv - 1 - k)) & 1\n            if ch != '-' and int(ch) != bit:\n                return False\n        return True\n    ones = [m for m in range(2 ** nv) if any(covers(t, m) for t in terms)]\n    out = []\n    for m in ones:\n        for k in range(nv):\n            p = m ^ (1 << k)\n            if p > m and p in ones and [t for t in terms if covers(t, m)][0] != [t for t in terms if covers(t, p)][0]:\n                out.append([m, p])\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('cover 0', [3, ['1-0', '-11', '11-']], []), ('cover 1', [2, ['1-', '-1']], []), ('cover 2', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 3', [3, ['0-0', '1-1']], []), ('cover 4', [4, ['11--', '--11']], []), ('cover 5', [3, ['00-', '-01', '1-1']], []), ('cover 6', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [2, ['1-', '-1']], []), ('cover 1', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 2', [3, ['0-0', '1-1']], []), ('cover 3', [4, ['11--', '--11']], []), ('cover 4', [3, ['00-', '-01', '1-1']], []), ('cover 5', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 6', [3, ['1--', '-1-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 1', [3, ['0-0', '1-1']], []), ('cover 2', [4, ['11--', '--11']], []), ('cover 3', [3, ['00-', '-01', '1-1']], []), ('cover 4', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 5', [3, ['1--', '-1-']], []), ('cover 6', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [3, ['0-0', '1-1']], []), ('cover 1', [4, ['11--', '--11']], []), ('cover 2', [3, ['00-', '-01', '1-1']], []), ('cover 3', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 4', [3, ['1--', '-1-']], []), ('cover 5', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 6', [3, ['10-', '-11']], [[5, 7]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['11--', '--11']], []), ('cover 1', [3, ['00-', '-01', '1-1']], []), ('cover 2', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 3', [3, ['1--', '-1-']], []), ('cover 4', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 5', [3, ['10-', '-11']], [[5, 7]]), ('cover 6', [3, ['1-0', '-11', '11-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])]]\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"},"fixed":{"sha256":"d19ab8ba60a0de1be74a6425b09582dd5ff6c04608ba891f8bd5b189e80f915c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    nv, terms = args\n    def covers(t, m):\n        for k, ch in enumerate(t):\n            bit = (m >> (nv - 1 - k)) & 1\n            if ch != '-' and int(ch) != bit:\n                return False\n        return True\n    ones = [m for m in range(2 ** nv) if any(covers(t, m) for t in terms)]\n    out = []\n    for m in ones:\n        for k in range(nv):\n            p = m ^ (1 << k)\n            if p > m and p in ones and not any(covers(t, m) and covers(t, p) for t in terms):\n                out.append([m, p])\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('cover 0', [3, ['1-0', '-11', '11-']], []), ('cover 1', [2, ['1-', '-1']], []), ('cover 2', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 3', [3, ['0-0', '1-1']], []), ('cover 4', [4, ['11--', '--11']], []), ('cover 5', [3, ['00-', '-01', '1-1']], []), ('cover 6', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [2, ['1-', '-1']], []), ('cover 1', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 2', [3, ['0-0', '1-1']], []), ('cover 3', [4, ['11--', '--11']], []), ('cover 4', [3, ['00-', '-01', '1-1']], []), ('cover 5', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 6', [3, ['1--', '-1-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['1--0', '-1-1', '0-1-']], [[2, 10], [6, 14], [12, 13], [14, 15]]), ('cover 1', [3, ['0-0', '1-1']], []), ('cover 2', [4, ['11--', '--11']], []), ('cover 3', [3, ['00-', '-01', '1-1']], []), ('cover 4', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 5', [3, ['1--', '-1-']], []), ('cover 6', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [3, ['0-0', '1-1']], []), ('cover 1', [4, ['11--', '--11']], []), ('cover 2', [3, ['00-', '-01', '1-1']], []), ('cover 3', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 4', [3, ['1--', '-1-']], []), ('cover 5', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 6', [3, ['10-', '-11']], [[5, 7]]), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])], [('cover 0', [4, ['11--', '--11']], []), ('cover 1', [3, ['00-', '-01', '1-1']], []), ('cover 2', [4, ['0--1', '-10-', '1-1-']], [[3, 11], [7, 15], [12, 14], [13, 15]]), ('cover 3', [3, ['1--', '-1-']], []), ('cover 4', [4, ['1-00', '0-11', '-1-1', '10--']], [[3, 11], [9, 13], [11, 15], [12, 13]]), ('cover 5', [3, ['10-', '-11']], [[5, 7]]), ('cover 6', [3, ['1-0', '-11', '11-']], []), ('msb only term', [3, ['1--', '0-1']], [[1, 5], [3, 7]])]]\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":"A deterministic bounded teaching model of one simulator rule set; the contract is stipulated and is not a claim of conformance to any HDL standard or commercial simulator. 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-digital-logic-simulation-static-hazards-common-cover-test","generated_at":"2026-09-29T14:51:14.901741+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Glitch analysis in logic simulators flags transitions that may pulse when two product terms hand off.","repair":"A pair is hazard-free if some term covers both minterms.","root_cause":"The check compares the first covering term of each minterm instead of asking whether any single term covers both.","sha256":"b9dacefb2b27c692f86a0aa63363afbb77617190608bb803b71edaf7a1ed1115","title":"Hazard judged by first covering term only · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.407,"exit_code":1,"observations":[{"actual":[[3,7],[4,6],[6,7]],"check":"cover 0","expected":[],"passed":false},{"actual":[[1,3],[2,3]],"check":"cover 1","expected":[],"passed":false},{"actual":[[2,10],[3,7],[5,7],[6,7],[6,14],[7,15],[12,13],[14,15]],"check":"cover 2","expected":[[2,10],[6,14],[12,13],[14,15]],"passed":false},{"actual":[],"check":"cover 3","expected":[],"passed":true},{"actual":[[7,15],[11,15],[13,15],[14,15]],"check":"cover 4","expected":[],"passed":false},{"actual":[[0,1],[1,5],[5,7]],"check":"cover 5","expected":[],"passed":false},{"actual":[[1,5],[3,11],[4,5],[5,7],[5,13],[7,15],[12,14],[13,15]],"check":"cover 6","expected":[[3,11],[7,15],[12,14],[13,15]],"passed":false},{"actual":[[1,5],[3,7]],"check":"msb only term","expected":[[1,5],[3,7]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cover 0\", \"actual\": [[3, 7], [4, 6], [6, 7]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 1\", \"actual\": [[1, 3], [2, 3]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 2\", \"actual\": [[2, 10], [3, 7], [5, 7], [6, 7], [6, 14], [7, 15], [12, 13], [14, 15]], \"expected\": [[2, 10], [6, 14], [12, 13], [14, 15]], \"passed\": false}, {\"check\": \"cover 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 4\", \"actual\": [[7, 15], [11, 15], [13, 15], [14, 15]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 5\", \"actual\": [[0, 1], [1, 5], [5, 7]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 6\", \"actual\": [[1, 5], [3, 11], [4, 5], [5, 7], [5, 13], [7, 15], [12, 14], [13, 15]], \"expected\": [[3, 11], [7, 15], [12, 14], [13, 15]], \"passed\": false}, {\"check\": \"msb only term\", \"actual\": [[1, 5], [3, 7]], \"expected\": [[1, 5], [3, 7]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.812,"exit_code":1,"observations":[{"actual":[[6,7]],"check":"cover 0","expected":[],"passed":false},{"actual":[[1,3]],"check":"cover 1","expected":[],"passed":false},{"actual":[[2,10],[3,7],[6,7],[6,14],[12,13],[14,15]],"check":"cover 2","expected":[[2,10],[6,14],[12,13],[14,15]],"passed":false},{"actual":[],"check":"cover 3","expected":[],"passed":true},{"actual":[[7,15],[11,15]],"check":"cover 4","expected":[],"passed":false},{"actual":[[1,5],[5,7]],"check":"cover 5","expected":[],"passed":false},{"actual":[[3,11],[4,5],[5,13],[7,15],[12,14],[13,15]],"check":"cover 6","expected":[[3,11],[7,15],[12,14],[13,15]],"passed":false},{"actual":[[1,5],[3,7]],"check":"msb only term","expected":[[1,5],[3,7]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cover 0\", \"actual\": [[6, 7]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 1\", \"actual\": [[1, 3]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 2\", \"actual\": [[2, 10], [3, 7], [6, 7], [6, 14], [12, 13], [14, 15]], \"expected\": [[2, 10], [6, 14], [12, 13], [14, 15]], \"passed\": false}, {\"check\": \"cover 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 4\", \"actual\": [[7, 15], [11, 15]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 5\", \"actual\": [[1, 5], [5, 7]], \"expected\": [], \"passed\": false}, {\"check\": \"cover 6\", \"actual\": [[3, 11], [4, 5], [5, 13], [7, 15], [12, 14], [13, 15]], \"expected\": [[3, 11], [7, 15], [12, 14], [13, 15]], \"passed\": false}, {\"check\": \"msb only term\", \"actual\": [[1, 5], [3, 7]], \"expected\": [[1, 5], [3, 7]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.331,"exit_code":0,"observations":[{"actual":[],"check":"cover 0","expected":[],"passed":true},{"actual":[],"check":"cover 1","expected":[],"passed":true},{"actual":[[2,10],[6,14],[12,13],[14,15]],"check":"cover 2","expected":[[2,10],[6,14],[12,13],[14,15]],"passed":true},{"actual":[],"check":"cover 3","expected":[],"passed":true},{"actual":[],"check":"cover 4","expected":[],"passed":true},{"actual":[],"check":"cover 5","expected":[],"passed":true},{"actual":[[3,11],[7,15],[12,14],[13,15]],"check":"cover 6","expected":[[3,11],[7,15],[12,14],[13,15]],"passed":true},{"actual":[[1,5],[3,7]],"check":"msb only term","expected":[[1,5],[3,7]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cover 0\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 2\", \"actual\": [[2, 10], [6, 14], [12, 13], [14, 15]], \"expected\": [[2, 10], [6, 14], [12, 13], [14, 15]], \"passed\": true}, {\"check\": \"cover 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"cover 6\", \"actual\": [[3, 11], [7, 15], [12, 14], [13, 15]], \"expected\": [[3, 11], [7, 15], [12, 14], [13, 15]], \"passed\": true}, {\"check\": \"msb only term\", \"actual\": [[1, 5], [3, 7]], \"expected\": [[1, 5], [3, 7]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}