{"abstract":"Column binding emits display names instead of stable field IDs.","category":"Data systems","checks":7,"contract":"Resolve query references [qualifier-or-None,name] against schema entries [relation,name,field-id]. Unqualified names bind only when exactly one matching column exists. Qualified names use both relation and name; no candidates yields MISSING and several yield AMBIGUOUS. Return stable field IDs.","evaluation_group":"s3-data-systems-qualified-column-binding","failed_approach":"Relation aliases cannot identify individual bound fields.","family":"s3-data-systems-qualified-column-binding-field-id","id":"FA-45291","implementations":{"attempt":{"sha256":"041e029ebafe022542b42771cae86fd19f32699874cca62f6ef0f877686a45a6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    try:\n        schema,references=d\n        out=[]\n        for qualifier,name in references:\n            matches=[field for rel,col,field in schema if col==name and (qualifier is None or rel==qualifier)]\n            if not matches: out.append('MISSING')\n            elif len(matches)>1: out.append('AMBIGUOUS')\n            else: out.append(qualifier)\n        return out\n    except (IndexError, KeyError, ValueError, StopIteration) as exc:\n        return {\"representation_error\": type(exc).__name__}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('qualified same name', solve([[['a', 'x', 1], ['b', 'x', 2]], [['b', 'x'], ['a', 'x']]]), [2, 1])\n    check('ambiguous', solve([[['a', 'x', 1], ['b', 'x', 2]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 1]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 1]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 1]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 1]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 1]], [['a', 'x'], ['a', 'x']]]), [1, 1])\nelif N == 2:\n    check('qualified same name', solve([[['a', 'x', 2], ['b', 'x', 3]], [['b', 'x'], ['a', 'x']]]), [3, 2])\n    check('ambiguous', solve([[['a', 'x', 2], ['b', 'x', 3]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 2]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 2]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 2]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 2]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 2]], [['a', 'x'], ['a', 'x']]]), [2, 2])\nelif N == 3:\n    check('qualified same name', solve([[['a', 'x', 3], ['b', 'x', 4]], [['b', 'x'], ['a', 'x']]]), [4, 3])\n    check('ambiguous', solve([[['a', 'x', 3], ['b', 'x', 4]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 3]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 3]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 3]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 3]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 3]], [['a', 'x'], ['a', 'x']]]), [3, 3])\nelif N == 4:\n    check('qualified same name', solve([[['a', 'x', 4], ['b', 'x', 5]], [['b', 'x'], ['a', 'x']]]), [5, 4])\n    check('ambiguous', solve([[['a', 'x', 4], ['b', 'x', 5]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 4]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 4]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 4]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 4]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 4]], [['a', 'x'], ['a', 'x']]]), [4, 4])\nelif N == 5:\n    check('qualified same name', solve([[['a', 'x', 5], ['b', 'x', 6]], [['b', 'x'], ['a', 'x']]]), [6, 5])\n    check('ambiguous', solve([[['a', 'x', 5], ['b', 'x', 6]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 5]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 5]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 5]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 5]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 5]], [['a', 'x'], ['a', 'x']]]), [5, 5])\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":"2559a09ea331a432e7fb8531a7eb2fcd4dff5f873ee3b988a975b93bf0cd85f0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    try:\n        schema,references=d\n        out=[]\n        for qualifier,name in references:\n            matches=[field for rel,col,field in schema if col==name and (qualifier is None or rel==qualifier)]\n            if not matches: out.append('MISSING')\n            elif len(matches)>1: out.append('AMBIGUOUS')\n            else: out.append(name)\n        return out\n    except (IndexError, KeyError, ValueError, StopIteration) as exc:\n        return {\"representation_error\": type(exc).__name__}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('qualified same name', solve([[['a', 'x', 1], ['b', 'x', 2]], [['b', 'x'], ['a', 'x']]]), [2, 1])\n    check('ambiguous', solve([[['a', 'x', 1], ['b', 'x', 2]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 1]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 1]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 1]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 1]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 1]], [['a', 'x'], ['a', 'x']]]), [1, 1])\nelif N == 2:\n    check('qualified same name', solve([[['a', 'x', 2], ['b', 'x', 3]], [['b', 'x'], ['a', 'x']]]), [3, 2])\n    check('ambiguous', solve([[['a', 'x', 2], ['b', 'x', 3]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 2]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 2]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 2]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 2]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 2]], [['a', 'x'], ['a', 'x']]]), [2, 2])\nelif N == 3:\n    check('qualified same name', solve([[['a', 'x', 3], ['b', 'x', 4]], [['b', 'x'], ['a', 'x']]]), [4, 3])\n    check('ambiguous', solve([[['a', 'x', 3], ['b', 'x', 4]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 3]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 3]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 3]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 3]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 3]], [['a', 'x'], ['a', 'x']]]), [3, 3])\nelif N == 4:\n    check('qualified same name', solve([[['a', 'x', 4], ['b', 'x', 5]], [['b', 'x'], ['a', 'x']]]), [5, 4])\n    check('ambiguous', solve([[['a', 'x', 4], ['b', 'x', 5]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 4]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 4]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 4]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 4]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 4]], [['a', 'x'], ['a', 'x']]]), [4, 4])\nelif N == 5:\n    check('qualified same name', solve([[['a', 'x', 5], ['b', 'x', 6]], [['b', 'x'], ['a', 'x']]]), [6, 5])\n    check('ambiguous', solve([[['a', 'x', 5], ['b', 'x', 6]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 5]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 5]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 5]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 5]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 5]], [['a', 'x'], ['a', 'x']]]), [5, 5])\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":"172e34efddeffbd867c2dd0e7f09a95ed7a78df4da9d281b336dbf148c81c1b1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(d):\n    try:\n        schema,references=d\n        out=[]\n        for qualifier,name in references:\n            matches=[field for rel,col,field in schema if col==name and (qualifier is None or rel==qualifier)]\n            if not matches: out.append('MISSING')\n            elif len(matches)>1: out.append('AMBIGUOUS')\n            else: out.append(matches[0])\n        return out\n    except (IndexError, KeyError, ValueError, StopIteration) as exc:\n        return {\"representation_error\": type(exc).__name__}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('qualified same name', solve([[['a', 'x', 1], ['b', 'x', 2]], [['b', 'x'], ['a', 'x']]]), [2, 1])\n    check('ambiguous', solve([[['a', 'x', 1], ['b', 'x', 2]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 1]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 1]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 1]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 1]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 1]], [['a', 'x'], ['a', 'x']]]), [1, 1])\nelif N == 2:\n    check('qualified same name', solve([[['a', 'x', 2], ['b', 'x', 3]], [['b', 'x'], ['a', 'x']]]), [3, 2])\n    check('ambiguous', solve([[['a', 'x', 2], ['b', 'x', 3]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 2]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 2]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 2]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 2]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 2]], [['a', 'x'], ['a', 'x']]]), [2, 2])\nelif N == 3:\n    check('qualified same name', solve([[['a', 'x', 3], ['b', 'x', 4]], [['b', 'x'], ['a', 'x']]]), [4, 3])\n    check('ambiguous', solve([[['a', 'x', 3], ['b', 'x', 4]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 3]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 3]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 3]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 3]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 3]], [['a', 'x'], ['a', 'x']]]), [3, 3])\nelif N == 4:\n    check('qualified same name', solve([[['a', 'x', 4], ['b', 'x', 5]], [['b', 'x'], ['a', 'x']]]), [5, 4])\n    check('ambiguous', solve([[['a', 'x', 4], ['b', 'x', 5]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 4]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 4]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 4]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 4]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 4]], [['a', 'x'], ['a', 'x']]]), [4, 4])\nelif N == 5:\n    check('qualified same name', solve([[['a', 'x', 5], ['b', 'x', 6]], [['b', 'x'], ['a', 'x']]]), [6, 5])\n    check('ambiguous', solve([[['a', 'x', 5], ['b', 'x', 6]], [[None, 'x']]]), ['AMBIGUOUS'])\n    check('missing', solve([[['a', 'x', 5]], [['a', 'z']]]), ['MISSING'])\n    check('case-sensitive', solve([[['a', 'X', 5]], [[None, 'x']]]), ['MISSING'])\n    check('alias-prefix', solve([[['ab', 'x', 5]], [['a', 'x']]]), ['MISSING'])\n    check('literal-space', solve([[['a', ' x ', 5]], [[None, 'x']]]), ['MISSING'])\n    check('repeat ref', solve([[['a', 'x', 5]], [['a', 'x'], ['a', 'x']]]), [5, 5])\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":"Offline stipulated semantics over valid small inputs; no performance, concurrency, or production-engine conformance claim. 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":"s3-data-systems-qualified-column-binding-field-id","generated_at":"2026-09-29T14:44:20.756112+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A bounded deterministic data engine model makes representation and changelog faults reproducible.","repair":"Preserve the stated physical representation and operation order: Resolve query references [qualifier-or-None,name] against schema entries [relation,name,field-id]. Unqualified names bind only when exactly one matching column exists. Qualified names use both relation and name; no candidates yields MISSING and several yield AMBIGUOUS. Return stable field IDs.","root_cause":"qualified-column-binding: Column binding emits display names instead of stable field IDs.","sha256":"5049815457dbcaf05b2b04ea7a3a53a6d21ffa2d536c99bcbd7668c864992893","title":"Column binding emits display names instead of stable field IDs · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.756,"exit_code":1,"observations":[{"actual":["b","a"],"check":"qualified same name","expected":[2,1],"passed":false},{"actual":["AMBIGUOUS"],"check":"ambiguous","expected":["AMBIGUOUS"],"passed":true},{"actual":["MISSING"],"check":"missing","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"case-sensitive","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"alias-prefix","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"literal-space","expected":["MISSING"],"passed":true},{"actual":["a","a"],"check":"repeat ref","expected":[1,1],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"qualified same name\", \"actual\": [\"b\", \"a\"], \"expected\": [2, 1], \"passed\": false}, {\"check\": \"ambiguous\", \"actual\": [\"AMBIGUOUS\"], \"expected\": [\"AMBIGUOUS\"], \"passed\": true}, {\"check\": \"missing\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"case-sensitive\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"alias-prefix\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"literal-space\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"repeat ref\", \"actual\": [\"a\", \"a\"], \"expected\": [1, 1], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":46.261,"exit_code":1,"observations":[{"actual":["x","x"],"check":"qualified same name","expected":[2,1],"passed":false},{"actual":["AMBIGUOUS"],"check":"ambiguous","expected":["AMBIGUOUS"],"passed":true},{"actual":["MISSING"],"check":"missing","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"case-sensitive","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"alias-prefix","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"literal-space","expected":["MISSING"],"passed":true},{"actual":["x","x"],"check":"repeat ref","expected":[1,1],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"qualified same name\", \"actual\": [\"x\", \"x\"], \"expected\": [2, 1], \"passed\": false}, {\"check\": \"ambiguous\", \"actual\": [\"AMBIGUOUS\"], \"expected\": [\"AMBIGUOUS\"], \"passed\": true}, {\"check\": \"missing\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"case-sensitive\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"alias-prefix\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"literal-space\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"repeat ref\", \"actual\": [\"x\", \"x\"], \"expected\": [1, 1], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":49.712,"exit_code":0,"observations":[{"actual":[2,1],"check":"qualified same name","expected":[2,1],"passed":true},{"actual":["AMBIGUOUS"],"check":"ambiguous","expected":["AMBIGUOUS"],"passed":true},{"actual":["MISSING"],"check":"missing","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"case-sensitive","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"alias-prefix","expected":["MISSING"],"passed":true},{"actual":["MISSING"],"check":"literal-space","expected":["MISSING"],"passed":true},{"actual":[1,1],"check":"repeat ref","expected":[1,1],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"qualified same name\", \"actual\": [2, 1], \"expected\": [2, 1], \"passed\": true}, {\"check\": \"ambiguous\", \"actual\": [\"AMBIGUOUS\"], \"expected\": [\"AMBIGUOUS\"], \"passed\": true}, {\"check\": \"missing\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"case-sensitive\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"alias-prefix\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"literal-space\", \"actual\": [\"MISSING\"], \"expected\": [\"MISSING\"], \"passed\": true}, {\"check\": \"repeat ref\", \"actual\": [1, 1], \"expected\": [1, 1], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}