{"abstract":"Boxes on rotated photos are mirrored or pushed outside the displayed frame.","category":"Image orientation metadata","checks":8,"contract":"Map a half-open face/crop region [x, y, width, height] given in stored pixel space of an image of size [w, h] into displayed space for orientation tag 1..8. The region is first clipped to the stored image; an empty clipped region returns None, and an unknown tag returns None. Mirroring a half-open interval [a, b) over extent e gives [e-b, e-a); tags 5..8 exchange axes after the flips.","evaluation_group":"w2-image-orientation-metadata-region-box","failed_approach":"Swapping the extents after an early transpose flips in display space, which turns tag 6 into tag 8 and vice versa.","family":"w2-image-orientation-metadata-region-box-transpose-order","id":"FA-78886","implementations":{"attempt":{"sha256":"b5e558e8f49e053455c8dd2a844ab608b5f47d129285366fff96349fcdc9308c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(size, tag, box):\n    w, h = size\n    x0, y0, bw, bh = box\n    x1 = min(x0 + bw, w)\n    y1 = min(y0 + bh, h)\n    x0 = max(x0, 0)\n    y0 = max(y0, 0)\n    if x1 <= x0 or y1 <= y0:\n        return None\n    table = {1: (0, 0, 0), 2: (1, 0, 0), 3: (1, 1, 0), 4: (0, 1, 0), 5: (0, 0, 1), 6: (0, 1, 1), 7: (1, 1, 1), 8: (1, 0, 1)}\n    if tag not in table:\n        return None\n    fx, fy, tr = table[tag]\n    if tr:\n        x0, y0, x1, y1 = y0, x0, y1, x1\n        w, h = h, w\n    if fx:\n        x0, x1 = w - x1, w - x0\n    if fy:\n        y0, y1 = h - y1, h - y0\n    return [x0, y0, x1 - x0, y1 - y0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 3], 6, [-1, 0, 2, 1]), [2, 0, 1, 1]], [([7, 5], 1, [6, -1, 4, 0]), None], [([3, 4], 3, [-2, 3, 0, 2]), None], [([2, 4], 8, [2, 1, 3, 3]), None], [([2, 4], 7, [1, -3, 3, 3]), None], [([2, 6], 6, [4, -1, 1, 4]), None], [([5, 6], 8, [-2, 0, 4, 1]), [0, 3, 1, 2]]], [[([3, 5], 8, [0, 4, 2, 2]), [4, 1, 1, 2]], [([4, 1], 8, [2, -3, 3, 5]), [0, 0, 1, 2]], [([3, 5], 0, [-3, -2, 2, 4]), None], [([3, 1], 1, [2, 2, 2, 0]), None], [([4, 1], 3, [6, 3, 2, 4]), None], [([5, 5], 6, [6, 3, 5, 0]), None], [([4, 5], 1, [1, 2, 5, 4]), [1, 2, 3, 3]], [([4, 7], 6, [2, 6, 5, 3]), [0, 2, 1, 2]]], [[([5, 2], 8, [1, 1, 5, 1]), [1, 0, 1, 4]], [([6, 4], 6, [-2, 1, 5, 5]), [0, 0, 3, 3]], [([4, 5], 8, [2, -2, 0, 2]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([6, 1], 2, [2, 1, 3, 0]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([5, 1], 8, [5, 0, 5, 0]), None], [([6, 4], 6, [2, 1, 3, 4]), [0, 2, 3, 3]]], [[([4, 6], 7, [2, 4, 1, 5]), [0, 1, 2, 1]], [([6, 3], 8, [3, 2, 2, 5]), [2, 1, 1, 2]], [([4, 3], 6, [-2, 2, 5, 1]), [0, 0, 1, 3]], [([3, 6], 8, [6, -2, 2, 3]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([2, 5], 1, [1, 6, 5, 2]), None], [([5, 5], 1, [6, 1, 5, 4]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]]], [[([7, 3], 6, [4, -2, 1, 3]), [2, 4, 1, 1]], [([1, 4], 6, [0, 2, 4, 1]), [1, 0, 1, 1]], [([7, 4], 6, [2, 1, 5, 2]), [1, 2, 2, 5]], [([1, 1], 7, [1, -3, 2, 0]), None], [([4, 5], 6, [1, 3, 0, 5]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 7], 7, [6, 0, 3, 1]), None], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]]]]\nlabels = [\"regression: transpose before flips\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], 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":"426493423471c8897edfde7070b35adb74c85e7fde4a1382de7bdf9d733256d1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(size, tag, box):\n    w, h = size\n    x0, y0, bw, bh = box\n    x1 = min(x0 + bw, w)\n    y1 = min(y0 + bh, h)\n    x0 = max(x0, 0)\n    y0 = max(y0, 0)\n    if x1 <= x0 or y1 <= y0:\n        return None\n    table = {1: (0, 0, 0), 2: (1, 0, 0), 3: (1, 1, 0), 4: (0, 1, 0), 5: (0, 0, 1), 6: (0, 1, 1), 7: (1, 1, 1), 8: (1, 0, 1)}\n    if tag not in table:\n        return None\n    fx, fy, tr = table[tag]\n    if tr:\n        x0, y0, x1, y1 = y0, x0, y1, x1\n    if fx:\n        x0, x1 = w - x1, w - x0\n    if fy:\n        y0, y1 = h - y1, h - y0\n    return [x0, y0, x1 - x0, y1 - y0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 3], 6, [-1, 0, 2, 1]), [2, 0, 1, 1]], [([7, 5], 1, [6, -1, 4, 0]), None], [([3, 4], 3, [-2, 3, 0, 2]), None], [([2, 4], 8, [2, 1, 3, 3]), None], [([2, 4], 7, [1, -3, 3, 3]), None], [([2, 6], 6, [4, -1, 1, 4]), None], [([5, 6], 8, [-2, 0, 4, 1]), [0, 3, 1, 2]]], [[([3, 5], 8, [0, 4, 2, 2]), [4, 1, 1, 2]], [([4, 1], 8, [2, -3, 3, 5]), [0, 0, 1, 2]], [([3, 5], 0, [-3, -2, 2, 4]), None], [([3, 1], 1, [2, 2, 2, 0]), None], [([4, 1], 3, [6, 3, 2, 4]), None], [([5, 5], 6, [6, 3, 5, 0]), None], [([4, 5], 1, [1, 2, 5, 4]), [1, 2, 3, 3]], [([4, 7], 6, [2, 6, 5, 3]), [0, 2, 1, 2]]], [[([5, 2], 8, [1, 1, 5, 1]), [1, 0, 1, 4]], [([6, 4], 6, [-2, 1, 5, 5]), [0, 0, 3, 3]], [([4, 5], 8, [2, -2, 0, 2]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([6, 1], 2, [2, 1, 3, 0]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([5, 1], 8, [5, 0, 5, 0]), None], [([6, 4], 6, [2, 1, 3, 4]), [0, 2, 3, 3]]], [[([4, 6], 7, [2, 4, 1, 5]), [0, 1, 2, 1]], [([6, 3], 8, [3, 2, 2, 5]), [2, 1, 1, 2]], [([4, 3], 6, [-2, 2, 5, 1]), [0, 0, 1, 3]], [([3, 6], 8, [6, -2, 2, 3]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([2, 5], 1, [1, 6, 5, 2]), None], [([5, 5], 1, [6, 1, 5, 4]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]]], [[([7, 3], 6, [4, -2, 1, 3]), [2, 4, 1, 1]], [([1, 4], 6, [0, 2, 4, 1]), [1, 0, 1, 1]], [([7, 4], 6, [2, 1, 5, 2]), [1, 2, 2, 5]], [([1, 1], 7, [1, -3, 2, 0]), None], [([4, 5], 6, [1, 3, 0, 5]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 7], 7, [6, 0, 3, 1]), None], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]]]]\nlabels = [\"regression: transpose before flips\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], 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":"7063ecdb0c11892b7fa63801389b931f33e33de7ffc43399b9ba1e77e2e0c77c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(size, tag, box):\n    w, h = size\n    x0, y0, bw, bh = box\n    x1 = min(x0 + bw, w)\n    y1 = min(y0 + bh, h)\n    x0 = max(x0, 0)\n    y0 = max(y0, 0)\n    if x1 <= x0 or y1 <= y0:\n        return None\n    table = {1: (0, 0, 0), 2: (1, 0, 0), 3: (1, 1, 0), 4: (0, 1, 0), 5: (0, 0, 1), 6: (0, 1, 1), 7: (1, 1, 1), 8: (1, 0, 1)}\n    if tag not in table:\n        return None\n    fx, fy, tr = table[tag]\n    if fx:\n        x0, x1 = w - x1, w - x0\n    if fy:\n        y0, y1 = h - y1, h - y0\n    if tr:\n        x0, y0, x1, y1 = y0, x0, y1, x1\n    return [x0, y0, x1 - x0, y1 - y0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 3], 6, [-1, 0, 2, 1]), [2, 0, 1, 1]], [([7, 5], 1, [6, -1, 4, 0]), None], [([3, 4], 3, [-2, 3, 0, 2]), None], [([2, 4], 8, [2, 1, 3, 3]), None], [([2, 4], 7, [1, -3, 3, 3]), None], [([2, 6], 6, [4, -1, 1, 4]), None], [([5, 6], 8, [-2, 0, 4, 1]), [0, 3, 1, 2]]], [[([3, 5], 8, [0, 4, 2, 2]), [4, 1, 1, 2]], [([4, 1], 8, [2, -3, 3, 5]), [0, 0, 1, 2]], [([3, 5], 0, [-3, -2, 2, 4]), None], [([3, 1], 1, [2, 2, 2, 0]), None], [([4, 1], 3, [6, 3, 2, 4]), None], [([5, 5], 6, [6, 3, 5, 0]), None], [([4, 5], 1, [1, 2, 5, 4]), [1, 2, 3, 3]], [([4, 7], 6, [2, 6, 5, 3]), [0, 2, 1, 2]]], [[([5, 2], 8, [1, 1, 5, 1]), [1, 0, 1, 4]], [([6, 4], 6, [-2, 1, 5, 5]), [0, 0, 3, 3]], [([4, 5], 8, [2, -2, 0, 2]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([6, 1], 2, [2, 1, 3, 0]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([5, 1], 8, [5, 0, 5, 0]), None], [([6, 4], 6, [2, 1, 3, 4]), [0, 2, 3, 3]]], [[([4, 6], 7, [2, 4, 1, 5]), [0, 1, 2, 1]], [([6, 3], 8, [3, 2, 2, 5]), [2, 1, 1, 2]], [([4, 3], 6, [-2, 2, 5, 1]), [0, 0, 1, 3]], [([3, 6], 8, [6, -2, 2, 3]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([2, 5], 1, [1, 6, 5, 2]), None], [([5, 5], 1, [6, 1, 5, 4]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]]], [[([7, 3], 6, [4, -2, 1, 3]), [2, 4, 1, 1]], [([1, 4], 6, [0, 2, 4, 1]), [1, 0, 1, 1]], [([7, 4], 6, [2, 1, 5, 2]), [1, 2, 2, 5]], [([1, 1], 7, [1, -3, 2, 0]), None], [([4, 5], 6, [1, 3, 0, 5]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 7], 7, [6, 0, 3, 1]), None], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]]]]\nlabels = [\"regression: transpose before flips\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], 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 contract; it makes no claim of conformance to any published specification. 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-image-orientation-metadata-region-box-transpose-order","generated_at":"2026-09-29T14:49:39.292219+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Camera, phone and scanner images carry an orientation hint separately from the stored pixels; galleries, thumbnailers, editors and upload pipelines must interpret it consistently or photos appear sideways, mirrored or doubly rotated.","repair":"Apply the stored-space flips first, then exchange the axes.","root_cause":"The decomposition table describes flips in stored space followed by a transpose, but the code transposes first and then flips with stored extents.","sha256":"4d3e9cc9332cd1d253f52665d26bb2ed801e5d40aaf86491220443159375b5e4","title":"Region mapping transposes before applying stored-space flips · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.826,"exit_code":1,"observations":[{"actual":[0,3,1,2],"check":"regression: transpose before flips 0","expected":[0,0,1,2],"passed":false},{"actual":[0,2,1,1],"check":"repair trap 1","expected":[2,0,1,1],"passed":false},{"actual":null,"check":"combined fault 2","expected":null,"passed":true},{"actual":null,"check":"control 3","expected":null,"passed":true},{"actual":null,"check":"control 4","expected":null,"passed":true},{"actual":null,"check":"boundary 5","expected":null,"passed":true},{"actual":null,"check":"boundary 6","expected":null,"passed":true},{"actual":[5,0,1,2],"check":"control 7","expected":[0,3,1,2],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: transpose before flips 0\", \"actual\": [0, 3, 1, 2], \"expected\": [0, 0, 1, 2], \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": [0, 2, 1, 1], \"expected\": [2, 0, 1, 1], \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [5, 0, 1, 2], \"expected\": [0, 3, 1, 2], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.232,"exit_code":1,"observations":[{"actual":[0,-1,1,2],"check":"regression: transpose before flips 0","expected":[0,0,1,2],"passed":false},{"actual":[0,2,1,1],"check":"repair trap 1","expected":[2,0,1,1],"passed":false},{"actual":null,"check":"combined fault 2","expected":null,"passed":true},{"actual":null,"check":"control 3","expected":null,"passed":true},{"actual":null,"check":"control 4","expected":null,"passed":true},{"actual":null,"check":"boundary 5","expected":null,"passed":true},{"actual":null,"check":"boundary 6","expected":null,"passed":true},{"actual":[4,0,1,2],"check":"control 7","expected":[0,3,1,2],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: transpose before flips 0\", \"actual\": [0, -1, 1, 2], \"expected\": [0, 0, 1, 2], \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": [0, 2, 1, 1], \"expected\": [2, 0, 1, 1], \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [4, 0, 1, 2], \"expected\": [0, 3, 1, 2], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.06,"exit_code":0,"observations":[{"actual":[0,0,1,2],"check":"regression: transpose before flips 0","expected":[0,0,1,2],"passed":true},{"actual":[2,0,1,1],"check":"repair trap 1","expected":[2,0,1,1],"passed":true},{"actual":null,"check":"combined fault 2","expected":null,"passed":true},{"actual":null,"check":"control 3","expected":null,"passed":true},{"actual":null,"check":"control 4","expected":null,"passed":true},{"actual":null,"check":"boundary 5","expected":null,"passed":true},{"actual":null,"check":"boundary 6","expected":null,"passed":true},{"actual":[0,3,1,2],"check":"control 7","expected":[0,3,1,2],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: transpose before flips 0\", \"actual\": [0, 0, 1, 2], \"expected\": [0, 0, 1, 2], \"passed\": true}, {\"check\": \"repair trap 1\", \"actual\": [2, 0, 1, 1], \"expected\": [2, 0, 1, 1], \"passed\": true}, {\"check\": \"combined fault 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [0, 3, 1, 2], \"expected\": [0, 3, 1, 2], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}