{"abstract":"Converting a joined result into an object overwrites one table's identifier with another table's identifier.","category":"Storage and queries","checks":7,"contract":"Each projection entry is [relation_alias,column_name] and has a matching value. Pairs are unique; components contain no dots. Return a map keyed by relation_alias + '.' + column_name, retaining every value including NULL and zero.","evaluation_group":"model-12df697bfac3b3a8","failed_approach":"Appending ordinal suffixes to duplicate bare names depends on projection order and does not preserve the client's qualified schema.","family":"store-duplicate-projection-label","id":"FA-141","implementations":{"attempt":{"sha256":"8ad2aaac49cc4ec84ec9741c45e436935048a8b1a90e4030f7f418dda1cf866e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(columns, values):\n    result = {}\n    for column, value in zip(columns, values):\n        name = column[1]\n        suffix = 2\n        while name in result:\n            name = column[1] + '_' + str(suffix)\n            suffix += 1\n        result[name] = value\n    return result\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('joined identifiers both survive', solve([['orders', 'id'], ['users', 'id']], [N, N+1]), {'orders.id': N, 'users.id': N+1})\ncheck('reversing projection preserves qualified schema', solve([['users', 'id'], ['orders', 'id']], [N+1, N]), {'orders.id': N, 'users.id': N+1})\ncheck('nullable outer-join field is retained', solve([['left', 'id'], ['right', 'id']], [N, None]), {'left.id': N, 'right.id': None})\ncheck('zero identifier is retained', solve([['left', 'id'], ['right', 'id']], [0, N]), {'left.id': 0, 'right.id': N})\ncheck('ordinary names are qualified consistently', solve([['a', 'name'], ['b', 'amount']], ['case-'+str(N), N*3]), {'a.name': 'case-'+str(N), 'b.amount': N*3})\ncheck('ordinal-looking source name cannot collide', solve([['a', 'id'], ['b', 'id'], ['c', 'id_2']], [N, N+1, N+2]), {'a.id': N, 'b.id': N+1, 'c.id_2': N+2})\ncheck('empty projection', solve([], []), {})\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":"a218b40ae86ccdfce146d7a8cbedcae8a486a102bd26552c51a35c30d813c04e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(columns, values):\n    return {column[1]: value for column, value in zip(columns, values)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('joined identifiers both survive', solve([['orders', 'id'], ['users', 'id']], [N, N+1]), {'orders.id': N, 'users.id': N+1})\ncheck('reversing projection preserves qualified schema', solve([['users', 'id'], ['orders', 'id']], [N+1, N]), {'orders.id': N, 'users.id': N+1})\ncheck('nullable outer-join field is retained', solve([['left', 'id'], ['right', 'id']], [N, None]), {'left.id': N, 'right.id': None})\ncheck('zero identifier is retained', solve([['left', 'id'], ['right', 'id']], [0, N]), {'left.id': 0, 'right.id': N})\ncheck('ordinary names are qualified consistently', solve([['a', 'name'], ['b', 'amount']], ['case-'+str(N), N*3]), {'a.name': 'case-'+str(N), 'b.amount': N*3})\ncheck('ordinal-looking source name cannot collide', solve([['a', 'id'], ['b', 'id'], ['c', 'id_2']], [N, N+1, N+2]), {'a.id': N, 'b.id': N+1, 'c.id_2': N+2})\ncheck('empty projection', solve([], []), {})\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":"8e51f411b046737b0307aeec5e43aecfadb4a55431672439a249880f1b79167d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(columns, values):\n    return {column[0] + '.' + column[1]: value for column, value in zip(columns, values)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('joined identifiers both survive', solve([['orders', 'id'], ['users', 'id']], [N, N+1]), {'orders.id': N, 'users.id': N+1})\ncheck('reversing projection preserves qualified schema', solve([['users', 'id'], ['orders', 'id']], [N+1, N]), {'orders.id': N, 'users.id': N+1})\ncheck('nullable outer-join field is retained', solve([['left', 'id'], ['right', 'id']], [N, None]), {'left.id': N, 'right.id': None})\ncheck('zero identifier is retained', solve([['left', 'id'], ['right', 'id']], [0, N]), {'left.id': 0, 'right.id': N})\ncheck('ordinary names are qualified consistently', solve([['a', 'name'], ['b', 'amount']], ['case-'+str(N), N*3]), {'a.name': 'case-'+str(N), 'b.amount': N*3})\ncheck('ordinal-looking source name cannot collide', solve([['a', 'id'], ['b', 'id'], ['c', 'id_2']], [N, N+1, N+2]), {'a.id': N, 'b.id': N+1, 'c.id_2': N+2})\ncheck('empty projection', solve([], []), {})\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":" 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":"store-duplicate-projection-label","generated_at":"2026-09-29T14:36:50.954302+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Models client-side hydration of relational join results. It illustrates loss of provenance and stable field names when mapping column arrays into objects; it does not infer table names from database drivers.","repair":"Use the explicit relation alias and column name as a qualified output key for every selected column.","root_cause":"Bare column labels are not unique across joined relations, but the row-to-object mapper treats them as stable keys.","sha256":"9ace37763a3e1837fd8c7a4e1995120daddba28c36dfe27b013b388bb00ff783","title":"A joined row loses a field when two columns share a label · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":31.622,"exit_code":1,"observations":[{"actual":{"id":1,"id_2":2},"check":"joined identifiers both survive","expected":{"orders.id":1,"users.id":2},"passed":false},{"actual":{"id":2,"id_2":1},"check":"reversing projection preserves qualified schema","expected":{"orders.id":1,"users.id":2},"passed":false},{"actual":{"id":1,"id_2":null},"check":"nullable outer-join field is retained","expected":{"left.id":1,"right.id":null},"passed":false},{"actual":{"id":0,"id_2":1},"check":"zero identifier is retained","expected":{"left.id":0,"right.id":1},"passed":false},{"actual":{"amount":3,"name":"case-1"},"check":"ordinary names are qualified consistently","expected":{"a.name":"case-1","b.amount":3},"passed":false},{"actual":{"id":1,"id_2":2,"id_2_2":3},"check":"ordinal-looking source name cannot collide","expected":{"a.id":1,"b.id":2,"c.id_2":3},"passed":false},{"actual":{},"check":"empty projection","expected":{},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"joined identifiers both survive\", \"actual\": {\"id\": 1, \"id_2\": 2}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": false}, {\"check\": \"reversing projection preserves qualified schema\", \"actual\": {\"id\": 2, \"id_2\": 1}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": false}, {\"check\": \"nullable outer-join field is retained\", \"actual\": {\"id\": 1, \"id_2\": null}, \"expected\": {\"left.id\": 1, \"right.id\": null}, \"passed\": false}, {\"check\": \"zero identifier is retained\", \"actual\": {\"id\": 0, \"id_2\": 1}, \"expected\": {\"left.id\": 0, \"right.id\": 1}, \"passed\": false}, {\"check\": \"ordinary names are qualified consistently\", \"actual\": {\"name\": \"case-1\", \"amount\": 3}, \"expected\": {\"a.name\": \"case-1\", \"b.amount\": 3}, \"passed\": false}, {\"check\": \"ordinal-looking source name cannot collide\", \"actual\": {\"id\": 1, \"id_2\": 2, \"id_2_2\": 3}, \"expected\": {\"a.id\": 1, \"b.id\": 2, \"c.id_2\": 3}, \"passed\": false}, {\"check\": \"empty projection\", \"actual\": {}, \"expected\": {}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":33.254,"exit_code":1,"observations":[{"actual":{"id":2},"check":"joined identifiers both survive","expected":{"orders.id":1,"users.id":2},"passed":false},{"actual":{"id":1},"check":"reversing projection preserves qualified schema","expected":{"orders.id":1,"users.id":2},"passed":false},{"actual":{"id":null},"check":"nullable outer-join field is retained","expected":{"left.id":1,"right.id":null},"passed":false},{"actual":{"id":1},"check":"zero identifier is retained","expected":{"left.id":0,"right.id":1},"passed":false},{"actual":{"amount":3,"name":"case-1"},"check":"ordinary names are qualified consistently","expected":{"a.name":"case-1","b.amount":3},"passed":false},{"actual":{"id":2,"id_2":3},"check":"ordinal-looking source name cannot collide","expected":{"a.id":1,"b.id":2,"c.id_2":3},"passed":false},{"actual":{},"check":"empty projection","expected":{},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"joined identifiers both survive\", \"actual\": {\"id\": 2}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": false}, {\"check\": \"reversing projection preserves qualified schema\", \"actual\": {\"id\": 1}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": false}, {\"check\": \"nullable outer-join field is retained\", \"actual\": {\"id\": null}, \"expected\": {\"left.id\": 1, \"right.id\": null}, \"passed\": false}, {\"check\": \"zero identifier is retained\", \"actual\": {\"id\": 1}, \"expected\": {\"left.id\": 0, \"right.id\": 1}, \"passed\": false}, {\"check\": \"ordinary names are qualified consistently\", \"actual\": {\"name\": \"case-1\", \"amount\": 3}, \"expected\": {\"a.name\": \"case-1\", \"b.amount\": 3}, \"passed\": false}, {\"check\": \"ordinal-looking source name cannot collide\", \"actual\": {\"id\": 2, \"id_2\": 3}, \"expected\": {\"a.id\": 1, \"b.id\": 2, \"c.id_2\": 3}, \"passed\": false}, {\"check\": \"empty projection\", \"actual\": {}, \"expected\": {}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":32.599,"exit_code":0,"observations":[{"actual":{"orders.id":1,"users.id":2},"check":"joined identifiers both survive","expected":{"orders.id":1,"users.id":2},"passed":true},{"actual":{"orders.id":1,"users.id":2},"check":"reversing projection preserves qualified schema","expected":{"orders.id":1,"users.id":2},"passed":true},{"actual":{"left.id":1,"right.id":null},"check":"nullable outer-join field is retained","expected":{"left.id":1,"right.id":null},"passed":true},{"actual":{"left.id":0,"right.id":1},"check":"zero identifier is retained","expected":{"left.id":0,"right.id":1},"passed":true},{"actual":{"a.name":"case-1","b.amount":3},"check":"ordinary names are qualified consistently","expected":{"a.name":"case-1","b.amount":3},"passed":true},{"actual":{"a.id":1,"b.id":2,"c.id_2":3},"check":"ordinal-looking source name cannot collide","expected":{"a.id":1,"b.id":2,"c.id_2":3},"passed":true},{"actual":{},"check":"empty projection","expected":{},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"joined identifiers both survive\", \"actual\": {\"orders.id\": 1, \"users.id\": 2}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": true}, {\"check\": \"reversing projection preserves qualified schema\", \"actual\": {\"users.id\": 2, \"orders.id\": 1}, \"expected\": {\"orders.id\": 1, \"users.id\": 2}, \"passed\": true}, {\"check\": \"nullable outer-join field is retained\", \"actual\": {\"left.id\": 1, \"right.id\": null}, \"expected\": {\"left.id\": 1, \"right.id\": null}, \"passed\": true}, {\"check\": \"zero identifier is retained\", \"actual\": {\"left.id\": 0, \"right.id\": 1}, \"expected\": {\"left.id\": 0, \"right.id\": 1}, \"passed\": true}, {\"check\": \"ordinary names are qualified consistently\", \"actual\": {\"a.name\": \"case-1\", \"b.amount\": 3}, \"expected\": {\"a.name\": \"case-1\", \"b.amount\": 3}, \"passed\": true}, {\"check\": \"ordinal-looking source name cannot collide\", \"actual\": {\"a.id\": 1, \"b.id\": 2, \"c.id_2\": 3}, \"expected\": {\"a.id\": 1, \"b.id\": 2, \"c.id_2\": 3}, \"passed\": true}, {\"check\": \"empty projection\", \"actual\": {}, \"expected\": {}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}