{"abstract":"Flip top-bottom on a rotated image flips it left-right on screen.","category":"Image orientation metadata","checks":8,"contract":"A photo editor rotates and flips losslessly by rewriting only the orientation tag. An orientation is modelled as (k, m): mirror horizontally m times, then rotate k quarter turns clockwise (tag table 1:(0,0) 2:(0,1) 3:(2,0) 4:(2,1) 5:(3,1) 6:(1,0) 7:(1,1) 8:(3,0)). Editor operations act on the displayed image: cw, ccw, r180, flip_h (mirror left-right) and flip_v (mirror top-bottom). Invalid starting tags count as 1; an unknown operation returns {\"error\": \"unknown-op\", \"op\": op}. Return the final tag.","contract_signature":"tag, ops","evaluation_group":"w2-image-orientation-metadata-editor-metadata-rotate","failed_approach":"Reusing the flip_h rule drops the extra half turn entirely.","family":"w2-image-orientation-metadata-editor-metadata-rotate-flip-v-conjugation","id":"FA-78951","implementations":{"attempt":{"sha256":"19abedddac71502c122f6b3848c1308577bd7a1319edd8bc24c6cea932da6cca","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(tag, ops):\n    to_km = {1: (0, 0), 2: (0, 1), 3: (2, 0), 4: (2, 1), 5: (3, 1), 6: (1, 0), 7: (1, 1), 8: (3, 0)}\n    from_km = {v: t for t, v in to_km.items()}\n    if tag not in to_km:\n        tag = 1\n    k, m = to_km[tag]\n    for op in ops:\n        if op == 'cw':\n            k = (k + 1) % 4\n        elif op == 'ccw':\n            k = (k + 3) % 4\n        elif op == 'r180':\n            k = (k + 2) % 4\n        elif op == 'flip_h':\n            k, m = (-k) % 4, 1 - m\n        elif op == 'flip_v':\n            k, m = (-k) % 4, 1 - m\n        else:\n            return {'error': 'unknown-op', 'op': op}\n    return from_km[(k, m)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[(7, ['flip_v', 'ccw', 'r180']), 3], [(0, ['ccw', 'flip_v', 'r180', 'cw']), 4], [(8, ['ccw', 'flip_h', 'ccw']), 7], [(8, ['ccw', 'cw']), 8], [(3, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(1, ['cw', 'ccw', 'r180', 'cw']), 8], [(6, []), 6], [(3, ['flip_h', 'cw', 'flip_v', 'flip_h']), 7]], [[(11, ['ccw', 'flip_v', 'ccw', 'ccw']), 7], [(7, ['r180', 'ccw', 'flip_v', 'cw']), 6], [(7, ['flip_h', 'flip_v']), 5], [(8, ['CW']), {'error': 'unknown-op', 'op': 'CW'}], [(0, []), 1], [(8, ['ccw', 'r180']), 1], [(4, ['mirror', 'flip_v', 'cw', 'r180']), {'error': 'unknown-op', 'op': 'mirror'}], [(3, ['ccw', 'flip_v', 'flip_h', 'flip_h']), 7]], [[(6, ['r180', 'flip_v', 'ccw']), 4], [(11, ['cw', 'flip_v', 'flip_h']), 8], [(2, ['ccw', 'cw', 'cw', 'flip_v']), 6], [(1, ['ccw', 'ccw', 'r180']), 1], [(9, ['cw', 'r180', 'flip_h']), 7], [(5, ['flip_h']), 6], [(6, ['flip_h', 'flip_h', 'ccw', 'r180']), 3], [(2, ['r180', 'ccw', 'flip_h', 'flip_v']), 5]], [[(5, ['flip_h', 'flip_v', 'r180']), 5], [(9, ['ccw', 'flip_h', 'flip_v']), 6], [(0, ['ccw', 'flip_v']), 5], [(4, ['ccw']), 7], [(8, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['r180']), 3], [(8, ['ccw', 'r180', 'ccw']), 8], [(1, ['r180', 'flip_h', 'cw', 'flip_v']), 8]], [[(7, ['r180', 'flip_v']), 8], [(0, ['flip_v', 'cw']), 5], [(8, ['flip_v', 'ccw', 'flip_h', 'ccw']), 6], [(11, ['cw', 'cw', 'ccw']), 6], [(5, ['r180']), 7], [(6, ['ccw']), 1], [(0, ['ccw', 'cw']), 1], [(6, ['flip_h', 'flip_v', 'flip_h']), 7]]]\nlabels = [\"regression: vertical flip of a rotated view\", \"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":"772b61b341fc3693999b6dbaf817e5d9676b577d890405ebca2e1b2ecb472b6f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(tag, ops):\n    to_km = {1: (0, 0), 2: (0, 1), 3: (2, 0), 4: (2, 1), 5: (3, 1), 6: (1, 0), 7: (1, 1), 8: (3, 0)}\n    from_km = {v: t for t, v in to_km.items()}\n    if tag not in to_km:\n        tag = 1\n    k, m = to_km[tag]\n    for op in ops:\n        if op == 'cw':\n            k = (k + 1) % 4\n        elif op == 'ccw':\n            k = (k + 3) % 4\n        elif op == 'r180':\n            k = (k + 2) % 4\n        elif op == 'flip_h':\n            k, m = (-k) % 4, 1 - m\n        elif op == 'flip_v':\n            k, m = (k + 2) % 4, 1 - m\n        else:\n            return {'error': 'unknown-op', 'op': op}\n    return from_km[(k, m)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[(7, ['flip_v', 'ccw', 'r180']), 3], [(0, ['ccw', 'flip_v', 'r180', 'cw']), 4], [(8, ['ccw', 'flip_h', 'ccw']), 7], [(8, ['ccw', 'cw']), 8], [(3, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(1, ['cw', 'ccw', 'r180', 'cw']), 8], [(6, []), 6], [(3, ['flip_h', 'cw', 'flip_v', 'flip_h']), 7]], [[(11, ['ccw', 'flip_v', 'ccw', 'ccw']), 7], [(7, ['r180', 'ccw', 'flip_v', 'cw']), 6], [(7, ['flip_h', 'flip_v']), 5], [(8, ['CW']), {'error': 'unknown-op', 'op': 'CW'}], [(0, []), 1], [(8, ['ccw', 'r180']), 1], [(4, ['mirror', 'flip_v', 'cw', 'r180']), {'error': 'unknown-op', 'op': 'mirror'}], [(3, ['ccw', 'flip_v', 'flip_h', 'flip_h']), 7]], [[(6, ['r180', 'flip_v', 'ccw']), 4], [(11, ['cw', 'flip_v', 'flip_h']), 8], [(2, ['ccw', 'cw', 'cw', 'flip_v']), 6], [(1, ['ccw', 'ccw', 'r180']), 1], [(9, ['cw', 'r180', 'flip_h']), 7], [(5, ['flip_h']), 6], [(6, ['flip_h', 'flip_h', 'ccw', 'r180']), 3], [(2, ['r180', 'ccw', 'flip_h', 'flip_v']), 5]], [[(5, ['flip_h', 'flip_v', 'r180']), 5], [(9, ['ccw', 'flip_h', 'flip_v']), 6], [(0, ['ccw', 'flip_v']), 5], [(4, ['ccw']), 7], [(8, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['r180']), 3], [(8, ['ccw', 'r180', 'ccw']), 8], [(1, ['r180', 'flip_h', 'cw', 'flip_v']), 8]], [[(7, ['r180', 'flip_v']), 8], [(0, ['flip_v', 'cw']), 5], [(8, ['flip_v', 'ccw', 'flip_h', 'ccw']), 6], [(11, ['cw', 'cw', 'ccw']), 6], [(5, ['r180']), 7], [(6, ['ccw']), 1], [(0, ['ccw', 'cw']), 1], [(6, ['flip_h', 'flip_v', 'flip_h']), 7]]]\nlabels = [\"regression: vertical flip of a rotated view\", \"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-editor-metadata-rotate-flip-v-conjugation","generated_at":"2026-09-29T14:49:39.925045+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.","root_cause":"flip_v adds a half turn without reversing the existing rotation.","sha256":"ae5a2c9d999144e280220441626629cea248662f1f73acade196e0710d48bdf3","title":"Vertical flip is applied in stored rather than displayed orientation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.265,"exit_code":1,"observations":[{"actual":1,"check":"regression: vertical flip of a rotated view 0","expected":3,"passed":false},{"actual":2,"check":"repair trap 1","expected":4,"passed":false},{"actual":7,"check":"combined fault 2","expected":7,"passed":true},{"actual":8,"check":"control 3","expected":8,"passed":true},{"actual":{"error":"unknown-op","op":"rotate"},"check":"control 4","expected":{"error":"unknown-op","op":"rotate"},"passed":true},{"actual":8,"check":"boundary 5","expected":8,"passed":true},{"actual":6,"check":"boundary 6","expected":6,"passed":true},{"actual":5,"check":"control 7","expected":7,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: vertical flip of a rotated view 0\", \"actual\": 1, \"expected\": 3, \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": 2, \"expected\": 4, \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": 7, \"expected\": 7, \"passed\": true}, {\"check\": \"control 3\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"error\": \"unknown-op\", \"op\": \"rotate\"}, \"expected\": {\"error\": \"unknown-op\", \"op\": \"rotate\"}, \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": 6, \"expected\": 6, \"passed\": true}, {\"check\": \"control 7\", \"actual\": 5, \"expected\": 7, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.579,"exit_code":1,"observations":[{"actual":1,"check":"regression: vertical flip of a rotated view 0","expected":3,"passed":false},{"actual":2,"check":"repair trap 1","expected":4,"passed":false},{"actual":7,"check":"combined fault 2","expected":7,"passed":true},{"actual":8,"check":"control 3","expected":8,"passed":true},{"actual":{"error":"unknown-op","op":"rotate"},"check":"control 4","expected":{"error":"unknown-op","op":"rotate"},"passed":true},{"actual":8,"check":"boundary 5","expected":8,"passed":true},{"actual":6,"check":"boundary 6","expected":6,"passed":true},{"actual":5,"check":"control 7","expected":7,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: vertical flip of a rotated view 0\", \"actual\": 1, \"expected\": 3, \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": 2, \"expected\": 4, \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": 7, \"expected\": 7, \"passed\": true}, {\"check\": \"control 3\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"control 4\", \"actual\": {\"error\": \"unknown-op\", \"op\": \"rotate\"}, \"expected\": {\"error\": \"unknown-op\", \"op\": \"rotate\"}, \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": 6, \"expected\": 6, \"passed\": true}, {\"check\": \"control 7\", \"actual\": 5, \"expected\": 7, \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}