FAILURE MAP
← Case archive

FA-78966 / Image orientation metadata / Open access

Unknown editor operations are silently skipped · case 01

A typo in a batch edit script produces a plausible but wrong orientation with no error.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The fallback branch continues the loop instead of reporting the unknown operation.

VERIFIED REPAIR

Return the unknown-op error naming the operation.

Unsuccessful approach: Returning the partial result hides the error and skips the remaining operations.

Case 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.

Why this case matters

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.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(tag, ops):
    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)}
    from_km = {v: t for t, v in to_km.items()}
    if tag not in to_km:
        tag = 1
    k, m = to_km[tag]
    for op in ops:
        if op == 'cw':
            k = (k + 1) % 4
        elif op == 'ccw':
            k = (k + 3) % 4
        elif op == 'r180':
            k = (k + 2) % 4
        elif op == 'flip_h':
            k, m = (-k) % 4, 1 - m
        elif op == 'flip_v':
            k, m = (2 - k) % 4, 1 - m
        else:
            continue
    return from_km[(k, m)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[(3, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(1, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(8, ['ccw', 'flip_h', 'ccw']), 7], [(7, ['flip_v', 'ccw', 'r180']), 3], [(8, ['ccw', 'cw']), 8], [(1, ['cw', 'ccw', 'r180', 'cw']), 8], [(6, []), 6], [(0, ['cw', 'flip_v', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(4, ['mirror', 'flip_v', 'cw', 'r180']), {'error': 'unknown-op', 'op': 'mirror'}], [(9, ['mirror', 'flip_h']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, []), 1], [(8, ['ccw', 'r180']), 1], [(2, ['flip_v', 'ccw', 'cw']), 3], [(7, ['cw', 'r180', 'flip_h']), 1], [(9, ['cw', 'flip_v', 'flip_v']), 6], [(5, ['ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}]], [[(4, ['flip_h', 'r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}], [(0, ['mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, ['cw', 'r180']), 8], [(1, ['ccw', 'ccw', 'r180']), 1], [(11, ['r180', 'cw', 'flip_v', 'cw']), 2], [(9, ['cw', 'r180', 'flip_h']), 7], [(11, ['cw', 'flip_v', 'flip_h']), 8], [(9, ['cw', 'ccw', 'r180', 'flip_h', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(2, ['cw', 'ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(2, ['flip_v', 'r180', 'rotate', 'flip_v', 'r180']), {'error': 'unknown-op', 'op': 'rotate'}], [(0, ['r180', 'ccw', 'cw', 'cw']), 8], [(0, ['flip_v']), 4], [(2, ['ccw', 'r180', 'flip_h', 'flip_v']), 5], [(4, ['ccw']), 7], [(9, ['ccw', 'flip_h', 'flip_v']), 6], [(7, ['cw', 'ccw', 'rotate', 'cw']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(7, ['rotate', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['flip_v', 'ccw', 'rotate', 'flip_h', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['cw', 'cw', 'ccw']), 6], [(5, ['r180']), 7], [(6, ['ccw']), 1], [(0, ['ccw', 'cw']), 1], [(9, ['flip_v']), 4], [(1, ['r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}]]]
labels = ["regression: unknown operation", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: unknown operation 03{'error': 'unknown-op', 'op': 'rotate'}Failed
repair trap 11{'error': 'unknown-op', 'op': 'rotate'}Failed
combined fault 277Passed
control 333Passed
control 488Passed
boundary 588Passed
boundary 666Passed
control 77{'error': 'unknown-op', 'op': 'rotate'}Failed

SHA-256 / 194947cd6c3ad1bc39b4778a27de2b1844af27a2f89c8a8260e0d5a4cbd1f8c2

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(tag, ops):
    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)}
    from_km = {v: t for t, v in to_km.items()}
    if tag not in to_km:
        tag = 1
    k, m = to_km[tag]
    for op in ops:
        if op == 'cw':
            k = (k + 1) % 4
        elif op == 'ccw':
            k = (k + 3) % 4
        elif op == 'r180':
            k = (k + 2) % 4
        elif op == 'flip_h':
            k, m = (-k) % 4, 1 - m
        elif op == 'flip_v':
            k, m = (2 - k) % 4, 1 - m
        else:
            return from_km[(k, m)]
    return from_km[(k, m)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[(3, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(1, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(8, ['ccw', 'flip_h', 'ccw']), 7], [(7, ['flip_v', 'ccw', 'r180']), 3], [(8, ['ccw', 'cw']), 8], [(1, ['cw', 'ccw', 'r180', 'cw']), 8], [(6, []), 6], [(0, ['cw', 'flip_v', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(4, ['mirror', 'flip_v', 'cw', 'r180']), {'error': 'unknown-op', 'op': 'mirror'}], [(9, ['mirror', 'flip_h']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, []), 1], [(8, ['ccw', 'r180']), 1], [(2, ['flip_v', 'ccw', 'cw']), 3], [(7, ['cw', 'r180', 'flip_h']), 1], [(9, ['cw', 'flip_v', 'flip_v']), 6], [(5, ['ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}]], [[(4, ['flip_h', 'r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}], [(0, ['mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, ['cw', 'r180']), 8], [(1, ['ccw', 'ccw', 'r180']), 1], [(11, ['r180', 'cw', 'flip_v', 'cw']), 2], [(9, ['cw', 'r180', 'flip_h']), 7], [(11, ['cw', 'flip_v', 'flip_h']), 8], [(9, ['cw', 'ccw', 'r180', 'flip_h', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(2, ['cw', 'ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(2, ['flip_v', 'r180', 'rotate', 'flip_v', 'r180']), {'error': 'unknown-op', 'op': 'rotate'}], [(0, ['r180', 'ccw', 'cw', 'cw']), 8], [(0, ['flip_v']), 4], [(2, ['ccw', 'r180', 'flip_h', 'flip_v']), 5], [(4, ['ccw']), 7], [(9, ['ccw', 'flip_h', 'flip_v']), 6], [(7, ['cw', 'ccw', 'rotate', 'cw']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(7, ['rotate', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['flip_v', 'ccw', 'rotate', 'flip_h', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['cw', 'cw', 'ccw']), 6], [(5, ['r180']), 7], [(6, ['ccw']), 1], [(0, ['ccw', 'cw']), 1], [(9, ['flip_v']), 4], [(1, ['r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}]]]
labels = ["regression: unknown operation", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: unknown operation 03{'error': 'unknown-op', 'op': 'rotate'}Failed
repair trap 11{'error': 'unknown-op', 'op': 'rotate'}Failed
combined fault 277Passed
control 333Passed
control 488Passed
boundary 588Passed
boundary 666Passed
control 77{'error': 'unknown-op', 'op': 'rotate'}Failed

SHA-256 / 6a3ef203cfa04689ba91060725e160703d69e3330c3c593711fc3e5714be1219

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(tag, ops):
    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)}
    from_km = {v: t for t, v in to_km.items()}
    if tag not in to_km:
        tag = 1
    k, m = to_km[tag]
    for op in ops:
        if op == 'cw':
            k = (k + 1) % 4
        elif op == 'ccw':
            k = (k + 3) % 4
        elif op == 'r180':
            k = (k + 2) % 4
        elif op == 'flip_h':
            k, m = (-k) % 4, 1 - m
        elif op == 'flip_v':
            k, m = (2 - k) % 4, 1 - m
        else:
            return {'error': 'unknown-op', 'op': op}
    return from_km[(k, m)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[(3, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(1, ['rotate']), {'error': 'unknown-op', 'op': 'rotate'}], [(8, ['ccw', 'flip_h', 'ccw']), 7], [(7, ['flip_v', 'ccw', 'r180']), 3], [(8, ['ccw', 'cw']), 8], [(1, ['cw', 'ccw', 'r180', 'cw']), 8], [(6, []), 6], [(0, ['cw', 'flip_v', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(4, ['mirror', 'flip_v', 'cw', 'r180']), {'error': 'unknown-op', 'op': 'mirror'}], [(9, ['mirror', 'flip_h']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, []), 1], [(8, ['ccw', 'r180']), 1], [(2, ['flip_v', 'ccw', 'cw']), 3], [(7, ['cw', 'r180', 'flip_h']), 1], [(9, ['cw', 'flip_v', 'flip_v']), 6], [(5, ['ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}]], [[(4, ['flip_h', 'r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}], [(0, ['mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(0, ['cw', 'r180']), 8], [(1, ['ccw', 'ccw', 'r180']), 1], [(11, ['r180', 'cw', 'flip_v', 'cw']), 2], [(9, ['cw', 'r180', 'flip_h']), 7], [(11, ['cw', 'flip_v', 'flip_h']), 8], [(9, ['cw', 'ccw', 'r180', 'flip_h', 'rotate']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(2, ['cw', 'ccw', 'mirror']), {'error': 'unknown-op', 'op': 'mirror'}], [(2, ['flip_v', 'r180', 'rotate', 'flip_v', 'r180']), {'error': 'unknown-op', 'op': 'rotate'}], [(0, ['r180', 'ccw', 'cw', 'cw']), 8], [(0, ['flip_v']), 4], [(2, ['ccw', 'r180', 'flip_h', 'flip_v']), 5], [(4, ['ccw']), 7], [(9, ['ccw', 'flip_h', 'flip_v']), 6], [(7, ['cw', 'ccw', 'rotate', 'cw']), {'error': 'unknown-op', 'op': 'rotate'}]], [[(7, ['rotate', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['flip_v', 'ccw', 'rotate', 'flip_h', 'ccw']), {'error': 'unknown-op', 'op': 'rotate'}], [(11, ['cw', 'cw', 'ccw']), 6], [(5, ['r180']), 7], [(6, ['ccw']), 1], [(0, ['ccw', 'cw']), 1], [(9, ['flip_v']), 4], [(1, ['r180', 'CW']), {'error': 'unknown-op', 'op': 'CW'}]]]
labels = ["regression: unknown operation", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: unknown operation 0{'error': 'unknown-op', 'op': 'rotate'}{'error': 'unknown-op', 'op': 'rotate'}Passed
repair trap 1{'error': 'unknown-op', 'op': 'rotate'}{'error': 'unknown-op', 'op': 'rotate'}Passed
combined fault 277Passed
control 333Passed
control 488Passed
boundary 588Passed
boundary 666Passed
control 7{'error': 'unknown-op', 'op': 'rotate'}{'error': 'unknown-op', 'op': 'rotate'}Passed

SHA-256 / 339c66aedf9a49360a03fd944461b0fd5e9f6b0e0842a84f4619068201204c4e

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:49:40.220233+00:00.

Case digest / 99812c7b4bcc081cbcd82260c15c3bcd94349108606a7eab6a4bf06f5abccfa1