FAILURE MAP
← Case archive

FA-78896 / Image orientation metadata / Open access

Zero-area regions survive orientation mapping · case 01

Boxes entirely outside the image or of zero width are returned as degenerate rectangles.

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

ROOT CAUSE

The emptiness test uses strict comparisons, so a zero-width half-open interval is kept.

VERIFIED REPAIR

Reject when either clipped extent is zero or negative (x1 <= x0 or y1 <= y0).

Unsuccessful approach: Requiring both axes to be empty keeps regions that are empty along only one axis.

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

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(size, tag, box):
    w, h = size
    x0, y0, bw, bh = box
    x1 = min(x0 + bw, w)
    y1 = min(y0 + bh, h)
    x0 = max(x0, 0)
    y0 = max(y0, 0)
    if x1 < x0 or y1 < y0:
        return None
    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)}
    if tag not in table:
        return None
    fx, fy, tr = table[tag]
    if fx:
        x0, x1 = w - x1, w - x0
    if fy:
        y0, y1 = h - y1, h - y0
    if tr:
        x0, y0, x1, y1 = y0, x0, y1, x1
    return [x0, y0, x1 - x0, y1 - y0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[([2, 4], 8, [2, 1, 3, 3]), None], [([7, 5], 1, [6, -1, 4, 0]), None], [([4, 6], 6, [4, 2, 3, 5]), None], [([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 2], 9, [2, 6, 3, 4]), None], [([2, 7], 0, [-2, 5, 5, 3]), None], [([1, 3], 5, [0, 2, 1, 3]), [2, 0, 1, 1]], [([2, 4], 7, [1, -3, 3, 3]), None]], [[([5, 7], 5, [-1, -1, 1, 5]), None], [([6, 4], 7, [4, 3, 0, 4]), None], [([6, 7], 5, [6, 1, 5, 5]), None], [([3, 5], 0, [-3, -2, 2, 4]), 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, 4], 5, [4, 3, 2, 4]), None]], [[([6, 1], 2, [2, 1, 3, 0]), None], [([5, 3], 6, [-3, 3, 4, 1]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([6, 2], 0, [5, 1, 3, 3]), None], [([3, 2], 5, [5, 6, 1, 3]), None], [([4, 5], 5, [-1, 1, 3, 5]), [1, 0, 4, 2]], [([4, 5], 8, [2, -2, 0, 2]), None]], [[([3, 7], 8, [3, 3, 4, 1]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([6, 5], 5, [4, -2, 2, 2]), None], [([5, 1], 8, [1, 4, 0, 2]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]], [([3, 4], 6, [0, 3, 4, 4]), [0, 0, 1, 3]], [([4, 5], 7, [4, 6, 3, 3]), None], [([5, 1], 8, [-2, 1, 4, 3]), None]], [[([3, 2], 8, [-2, -1, 5, 1]), None], [([7, 2], 5, [6, 2, 2, 4]), None], [([4, 4], 8, [3, -3, 4, 3]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 3], 7, [0, -3, 1, 4]), [2, 5, 1, 1]], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]], [([4, 2], 7, [0, -1, 5, 4]), [0, 0, 2, 4]], [([4, 5], 6, [1, 3, 0, 5]), None]]]
labels = ["regression: empty clipped region test", "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: empty clipped region test 0[1, 0, 3, 0]NoneFailed
repair trap 1NoneNonePassed
combined fault 2[0, 4, 4, 0]NoneFailed
control 3[0, 0, 1, 2][0, 0, 1, 2]Passed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6[2, 0, 1, 1][2, 0, 1, 1]Passed
control 7[4, 0, 0, 1]NoneFailed

SHA-256 / 2825213337d82b9c3450d055737dbbd073bc56d207a541884b456adfc921547c

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(size, tag, box):
    w, h = size
    x0, y0, bw, bh = box
    x1 = min(x0 + bw, w)
    y1 = min(y0 + bh, h)
    x0 = max(x0, 0)
    y0 = max(y0, 0)
    if x1 <= x0 and y1 <= y0:
        return None
    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)}
    if tag not in table:
        return None
    fx, fy, tr = table[tag]
    if fx:
        x0, x1 = w - x1, w - x0
    if fy:
        y0, y1 = h - y1, h - y0
    if tr:
        x0, y0, x1, y1 = y0, x0, y1, x1
    return [x0, y0, x1 - x0, y1 - y0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[([2, 4], 8, [2, 1, 3, 3]), None], [([7, 5], 1, [6, -1, 4, 0]), None], [([4, 6], 6, [4, 2, 3, 5]), None], [([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 2], 9, [2, 6, 3, 4]), None], [([2, 7], 0, [-2, 5, 5, 3]), None], [([1, 3], 5, [0, 2, 1, 3]), [2, 0, 1, 1]], [([2, 4], 7, [1, -3, 3, 3]), None]], [[([5, 7], 5, [-1, -1, 1, 5]), None], [([6, 4], 7, [4, 3, 0, 4]), None], [([6, 7], 5, [6, 1, 5, 5]), None], [([3, 5], 0, [-3, -2, 2, 4]), 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, 4], 5, [4, 3, 2, 4]), None]], [[([6, 1], 2, [2, 1, 3, 0]), None], [([5, 3], 6, [-3, 3, 4, 1]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([6, 2], 0, [5, 1, 3, 3]), None], [([3, 2], 5, [5, 6, 1, 3]), None], [([4, 5], 5, [-1, 1, 3, 5]), [1, 0, 4, 2]], [([4, 5], 8, [2, -2, 0, 2]), None]], [[([3, 7], 8, [3, 3, 4, 1]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([6, 5], 5, [4, -2, 2, 2]), None], [([5, 1], 8, [1, 4, 0, 2]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]], [([3, 4], 6, [0, 3, 4, 4]), [0, 0, 1, 3]], [([4, 5], 7, [4, 6, 3, 3]), None], [([5, 1], 8, [-2, 1, 4, 3]), None]], [[([3, 2], 8, [-2, -1, 5, 1]), None], [([7, 2], 5, [6, 2, 2, 4]), None], [([4, 4], 8, [3, -3, 4, 3]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 3], 7, [0, -3, 1, 4]), [2, 5, 1, 1]], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]], [([4, 2], 7, [0, -1, 5, 4]), [0, 0, 2, 4]], [([4, 5], 6, [1, 3, 0, 5]), None]]]
labels = ["regression: empty clipped region test", "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: empty clipped region test 0[1, 0, 3, 0]NoneFailed
repair trap 1[6, 0, 1, -1]NoneFailed
combined fault 2[0, 4, 4, 0]NoneFailed
control 3[0, 0, 1, 2][0, 0, 1, 2]Passed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6[2, 0, 1, 1][2, 0, 1, 1]Passed
control 7[4, 0, 0, 1]NoneFailed

SHA-256 / 37ffe3b65828aaabc6ea231efe828800464bfbc1f0aa6de13a8f563a6fd98e89

3 / The verified repair

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

N = 1
observations = []
def solve(size, tag, box):
    w, h = size
    x0, y0, bw, bh = box
    x1 = min(x0 + bw, w)
    y1 = min(y0 + bh, h)
    x0 = max(x0, 0)
    y0 = max(y0, 0)
    if x1 <= x0 or y1 <= y0:
        return None
    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)}
    if tag not in table:
        return None
    fx, fy, tr = table[tag]
    if fx:
        x0, x1 = w - x1, w - x0
    if fy:
        y0, y1 = h - y1, h - y0
    if tr:
        x0, y0, x1, y1 = y0, x0, y1, x1
    return [x0, y0, x1 - x0, y1 - y0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[([2, 4], 8, [2, 1, 3, 3]), None], [([7, 5], 1, [6, -1, 4, 0]), None], [([4, 6], 6, [4, 2, 3, 5]), None], [([5, 1], 6, [-3, -2, 5, 4]), [0, 0, 1, 2]], [([3, 2], 9, [2, 6, 3, 4]), None], [([2, 7], 0, [-2, 5, 5, 3]), None], [([1, 3], 5, [0, 2, 1, 3]), [2, 0, 1, 1]], [([2, 4], 7, [1, -3, 3, 3]), None]], [[([5, 7], 5, [-1, -1, 1, 5]), None], [([6, 4], 7, [4, 3, 0, 4]), None], [([6, 7], 5, [6, 1, 5, 5]), None], [([3, 5], 0, [-3, -2, 2, 4]), 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, 4], 5, [4, 3, 2, 4]), None]], [[([6, 1], 2, [2, 1, 3, 0]), None], [([5, 3], 6, [-3, 3, 4, 1]), None], [([1, 5], 9, [2, 3, 4, 4]), None], [([1, 2], 9, [-2, 1, 1, 3]), None], [([6, 2], 0, [5, 1, 3, 3]), None], [([3, 2], 5, [5, 6, 1, 3]), None], [([4, 5], 5, [-1, 1, 3, 5]), [1, 0, 4, 2]], [([4, 5], 8, [2, -2, 0, 2]), None]], [[([3, 7], 8, [3, 3, 4, 1]), None], [([7, 7], 2, [-2, 0, 0, 4]), None], [([6, 5], 5, [4, -2, 2, 2]), None], [([5, 1], 8, [1, 4, 0, 2]), None], [([7, 5], 8, [0, 4, 5, 5]), [4, 2, 1, 5]], [([3, 4], 6, [0, 3, 4, 4]), [0, 0, 1, 3]], [([4, 5], 7, [4, 6, 3, 3]), None], [([5, 1], 8, [-2, 1, 4, 3]), None]], [[([3, 2], 8, [-2, -1, 5, 1]), None], [([7, 2], 5, [6, 2, 2, 4]), None], [([4, 4], 8, [3, -3, 4, 3]), None], [([4, 1], 0, [2, 4, 5, 5]), None], [([6, 3], 7, [0, -3, 1, 4]), [2, 5, 1, 1]], [([7, 1], 7, [0, -2, 5, 4]), [0, 2, 1, 5]], [([4, 2], 7, [0, -1, 5, 4]), [0, 0, 2, 4]], [([4, 5], 6, [1, 3, 0, 5]), None]]]
labels = ["regression: empty clipped region test", "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: empty clipped region test 0NoneNonePassed
repair trap 1NoneNonePassed
combined fault 2NoneNonePassed
control 3[0, 0, 1, 2][0, 0, 1, 2]Passed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6[2, 0, 1, 1][2, 0, 1, 1]Passed
control 7NoneNonePassed

SHA-256 / c04b372a1fede9e2a76100dc85321615b5ac7c6e0bfd8293a38cc5ffe11a78de

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:39.587706+00:00.

Case digest / b772b59cb4e684adce9f8221816bec41f5a13389f5d3d98c9095a857bfe1b495