{"abstract":"The upload checker mispredicts mirrored photos that were baked and then rotated again by the browser.","category":"Image orientation metadata","checks":8,"contract":"Predict what a browser shows for a photo that went through an upload pipeline. Input {tag, baked, reset, stripped, css, cross_origin}. Baking applies the tag to the pixels; the remaining tag is 1 if metadata was stripped or if baking also reset the tag, else the original tag. The renderer applies the remaining tag when css is \"from-image\" or the image is cross-origin (image-orientation: none is ignored cross-origin). Finally the viewer applies its own extra orientation (default 1). Orientations are (k clockwise quarter turns after m mirrors), with applying B after A giving k = k2 + (-k1 if m2 else k1). Invalid tags count as 1. Return [shown_tag, shown == tag].","contract_signature":"p","evaluation_group":"w2-image-orientation-metadata-render-pipeline-composition","failed_approach":"Adding quarter-turn counts ignores that a mirror reverses the direction of earlier rotations.","family":"w2-image-orientation-metadata-render-pipeline-composition-compose-order","id":"FA-79236","implementations":{"attempt":{"sha256":"c944db8b53d4d4f817ff1a063669b718d71a964b76fd396ccbf09b88864311de","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(p):\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    def compose(first, second):\n        k1, m1 = to_km[first]\n        k2, m2 = to_km[second]\n        k = (k2 + k1) % 4\n        return from_km[(k, m1 ^ m2)]\n    tag = p['tag'] if p['tag'] in to_km else 1\n    pixels = tag if p['baked'] else 1\n    if p['stripped']:\n        meta = 1\n    elif p['baked'] and p['reset']:\n        meta = 1\n    else:\n        meta = tag\n    honored = p['css'] == 'from-image' or p['cross_origin']\n    shown = compose(compose(pixels, meta if honored else 1), p.get('extra', 1))\n    return [shown, shown == tag]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 6}, [2, False]], [{'tag': 7, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [1, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 2}, [8, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 3}, [5, False]], [{'tag': 2, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 6}, [6, False]], [{'tag': 2, 'baked': True, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [2, True]], [{'tag': 1, 'baked': False, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 8}, [8, False]], [{'tag': 8, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 2}, [7, False]]], [[{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [2, False]], [{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 2}, [7, False]], [{'tag': 6, 'baked': True, 'reset': False, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 8}, [1, False]], [{'tag': 6, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 8}, [1, False]], [{'tag': 0, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [1, True]], [{'tag': 0, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 1}, [1, True]], [{'tag': 4, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [3, False]], [{'tag': 5, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 6}, [2, False]]], [[{'tag': 2, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 6}, [7, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [1, False]], [{'tag': 5, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [6, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 1}, [5, True]], [{'tag': 4, 'baked': True, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 3}, [2, False]], [{'tag': 1, 'baked': False, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': True, 'extra': 3}, [3, False]], [{'tag': 6, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 3}, [3, False]], [{'tag': 4, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 6}, [5, False]]], [[{'tag': 4, 'baked': True, 'reset': False, 'stripped': True, 'css': 'none', 'cross_origin': True, 'extra': 7}, [8, False]], [{'tag': 5, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 5}, [5, True]], [{'tag': 8, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 2}, [7, False]], [{'tag': 7, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 2}, [2, False]], [{'tag': 2, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 8}, [8, False]], [{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 1}, [8, True]], [{'tag': 6, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 5}, [7, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': True, 'css': 'none', 'cross_origin': False, 'extra': 8}, [2, False]]], [[{'tag': 6, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [4, False]], [{'tag': 7, 'baked': False, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 7}, [1, False]], [{'tag': 5, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [6, False]], [{'tag': 0, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [5, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 1}, [5, True]], [{'tag': 8, 'baked': False, 'reset': False, 'stripped': True, 'css': 'none', 'cross_origin': True, 'extra': 2}, [2, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 1}, [5, True]], [{'tag': 5, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 6}, [2, False]]]]\nlabels = [\"regression: composition order\", \"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":"4b545a22fc7483d39a5eec39966201207fa656d71953f618fd35111a1eacca37","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(p):\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    def compose(first, second):\n        k1, m1 = to_km[first]\n        k2, m2 = to_km[second]\n        k = (k1 + (-k2 if m1 else k2)) % 4\n        return from_km[(k, m1 ^ m2)]\n    tag = p['tag'] if p['tag'] in to_km else 1\n    pixels = tag if p['baked'] else 1\n    if p['stripped']:\n        meta = 1\n    elif p['baked'] and p['reset']:\n        meta = 1\n    else:\n        meta = tag\n    honored = p['css'] == 'from-image' or p['cross_origin']\n    shown = compose(compose(pixels, meta if honored else 1), p.get('extra', 1))\n    return [shown, shown == tag]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 6}, [2, False]], [{'tag': 7, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [1, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 2}, [8, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 3}, [5, False]], [{'tag': 2, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 6}, [6, False]], [{'tag': 2, 'baked': True, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [2, True]], [{'tag': 1, 'baked': False, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 8}, [8, False]], [{'tag': 8, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 2}, [7, False]]], [[{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [2, False]], [{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 2}, [7, False]], [{'tag': 6, 'baked': True, 'reset': False, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 8}, [1, False]], [{'tag': 6, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 8}, [1, False]], [{'tag': 0, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 1}, [1, True]], [{'tag': 0, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 1}, [1, True]], [{'tag': 4, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [3, False]], [{'tag': 5, 'baked': False, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 6}, [2, False]]], [[{'tag': 2, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 6}, [7, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [1, False]], [{'tag': 5, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [6, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 1}, [5, True]], [{'tag': 4, 'baked': True, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': False, 'extra': 3}, [2, False]], [{'tag': 1, 'baked': False, 'reset': True, 'stripped': True, 'css': 'from-image', 'cross_origin': True, 'extra': 3}, [3, False]], [{'tag': 6, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 3}, [3, False]], [{'tag': 4, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 6}, [5, False]]], [[{'tag': 4, 'baked': True, 'reset': False, 'stripped': True, 'css': 'none', 'cross_origin': True, 'extra': 7}, [8, False]], [{'tag': 5, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 5}, [5, True]], [{'tag': 8, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 2}, [7, False]], [{'tag': 7, 'baked': False, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 2}, [2, False]], [{'tag': 2, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 8}, [8, False]], [{'tag': 8, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 1}, [8, True]], [{'tag': 6, 'baked': True, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': False, 'extra': 5}, [7, False]], [{'tag': 7, 'baked': True, 'reset': True, 'stripped': True, 'css': 'none', 'cross_origin': False, 'extra': 8}, [2, False]]], [[{'tag': 6, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [4, False]], [{'tag': 7, 'baked': False, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 7}, [1, False]], [{'tag': 5, 'baked': False, 'reset': False, 'stripped': False, 'css': 'from-image', 'cross_origin': True, 'extra': 2}, [6, False]], [{'tag': 0, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 5}, [5, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': True, 'extra': 1}, [5, True]], [{'tag': 8, 'baked': False, 'reset': False, 'stripped': True, 'css': 'none', 'cross_origin': True, 'extra': 2}, [2, False]], [{'tag': 5, 'baked': True, 'reset': True, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 1}, [5, True]], [{'tag': 5, 'baked': True, 'reset': False, 'stripped': False, 'css': 'none', 'cross_origin': False, 'extra': 6}, [2, False]]]]\nlabels = [\"regression: composition order\", \"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-render-pipeline-composition-compose-order","generated_at":"2026-09-29T14:49:42.519358+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":"The metadata transform is applied before the baked one when composing.","sha256":"a4302dc58d128d5f9b01d84df78d3b42ec2ea4ab7eafbe78d8a925e468f1ecd8","title":"Double-rotation prediction composes transforms in reverse order · 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":39.299,"exit_code":1,"observations":[{"actual":[2,false],"check":"regression: composition order 0","expected":[2,false],"passed":true},{"actual":[3,false],"check":"repair trap 1","expected":[1,false],"passed":false},{"actual":[6,false],"check":"combined fault 2","expected":[8,false],"passed":false},{"actual":[5,false],"check":"control 3","expected":[5,false],"passed":true},{"actual":[6,false],"check":"control 4","expected":[6,false],"passed":true},{"actual":[2,true],"check":"boundary 5","expected":[2,true],"passed":true},{"actual":[8,false],"check":"boundary 6","expected":[8,false],"passed":true},{"actual":[5,false],"check":"control 7","expected":[7,false],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: composition order 0\", \"actual\": [2, false], \"expected\": [2, false], \"passed\": true}, {\"check\": \"repair trap 1\", \"actual\": [3, false], \"expected\": [1, false], \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": [6, false], \"expected\": [8, false], \"passed\": false}, {\"check\": \"control 3\", \"actual\": [5, false], \"expected\": [5, false], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [6, false], \"expected\": [6, false], \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": [8, false], \"expected\": [8, false], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [5, false], \"expected\": [7, false], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.693,"exit_code":1,"observations":[{"actual":[4,false],"check":"regression: composition order 0","expected":[2,false],"passed":false},{"actual":[1,false],"check":"repair trap 1","expected":[1,false],"passed":true},{"actual":[6,false],"check":"combined fault 2","expected":[8,false],"passed":false},{"actual":[5,false],"check":"control 3","expected":[5,false],"passed":true},{"actual":[6,false],"check":"control 4","expected":[6,false],"passed":true},{"actual":[2,true],"check":"boundary 5","expected":[2,true],"passed":true},{"actual":[8,false],"check":"boundary 6","expected":[8,false],"passed":true},{"actual":[5,false],"check":"control 7","expected":[7,false],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: composition order 0\", \"actual\": [4, false], \"expected\": [2, false], \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"combined fault 2\", \"actual\": [6, false], \"expected\": [8, false], \"passed\": false}, {\"check\": \"control 3\", \"actual\": [5, false], \"expected\": [5, false], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [6, false], \"expected\": [6, false], \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": [8, false], \"expected\": [8, false], \"passed\": true}, {\"check\": \"control 7\", \"actual\": [5, false], \"expected\": [7, false], \"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."}}