FAILURE MAP
← Case archive

FA-51766 / Raster clipping / Open access

Guard band triangle clip: reject right boundary · case 01

Triangles touching the right viewport edge are rejected even though boundary points are inside.

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

ROOT CAUSE

Triangles touching the right viewport edge are rejected even though boundary points are inside.

VERIFIED REPAIR

Restore the specified clipping decision at reject right boundary. Each command is a triangle of three exact vertices in continuous raster coordinates. The viewport is [0,size]x[0,size] and the guard band extends one viewport size beyond each side. A triangle is rejected when all vertices lie strictly beyond the same viewport edge; accepted when all vertices are inside the closed viewport; guard-banded when all vertices are inside the closed guard band; otherwise it requires geometric clipping. Accepted and guard-banded triangles report the pixel bounding box [floor(min x),floor(min y),ceil(max x),ceil(max y)) clamped to the viewport, or None if empty.

Unsuccessful approach: Moving the threshold a whole pixel out stops rejecting triangles just beyond the right edge.

Case contract

Each command is a triangle of three exact vertices in continuous raster coordinates. The viewport is [0,size]x[0,size] and the guard band extends one viewport size beyond each side. A triangle is rejected when all vertices lie strictly beyond the same viewport edge; accepted when all vertices are inside the closed viewport; guard-banded when all vertices are inside the closed guard band; otherwise it requires geometric clipping. Accepted and guard-banded triangles report the pixel bounding box [floor(min x),floor(min y),ceil(max x),ceil(max y)) clamped to the viewport, or None if empty.

Why this case matters

Raster clipping decides which pixels a primitive may touch; a single wrong clip decision writes outside the target or scissor, or silently drops visible coverage.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    g=size
    for tri in commands:
        xs=[Fraction(v[0]) for v in tri]
        ys=[Fraction(v[1]) for v in tri]
        if max(xs)<0 or min(xs)>=size or max(ys)<0 or min(ys)>size:
            out.append(['reject',None])
            continue
        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'
        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'
        else:
            out.append(['clip',None])
            continue
        x0=max(math.floor(min(xs)),0)
        x1=min(math.ceil(max(xs)),size)
        y0=max(math.floor(min(ys)),0)
        y1=min(math.ceil(max(ys)),size)
        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])
    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])
    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])
    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])
    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])
    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])
    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])
    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])
    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])
    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])
    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])
    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])
    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])
    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])
    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])
    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])
    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])
    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])
    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])
    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])
    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])
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
explicit case 0[['accept', [1, 1, 5, 5]]][['accept', [1, 1, 5, 5]]]Passed
explicit case 1[['reject', None]][['reject', None]]Passed
explicit case 2[['clip', None]][['clip', None]]Passed
explicit case 3[['reject', None]][['guard', None]]Failed
explicit case 4[['reject', None]][['reject', None]]Passed
explicit case 5[['clip', None]][['clip', None]]Passed
explicit case 6[['accept', [1, 1, 3, 3]]][['accept', [1, 1, 3, 3]]]Passed
explicit case 7[['guard', [0, 1, 2, 3]]][['guard', [0, 1, 2, 3]]]Passed
explicit case 8[['guard', [1, 1, 6, 3]]][['guard', [1, 1, 6, 3]]]Passed
explicit case 9[['guard', [0, 1, 5, 6]]][['guard', [0, 1, 5, 6]]]Passed
explicit case 10[['clip', None]][['clip', None]]Passed
explicit case 11[['clip', None]][['clip', None]]Passed
explicit case 12[['reject', None]][['reject', None]]Passed

SHA-256 / 5af44728e2927b6d670696b081d0f427baafc1925cbb70e60f9d66afdcbcf7e3

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    g=size
    for tri in commands:
        xs=[Fraction(v[0]) for v in tri]
        ys=[Fraction(v[1]) for v in tri]
        if max(xs)<0 or min(xs)>=size+1 or max(ys)<0 or min(ys)>size:
            out.append(['reject',None])
            continue
        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'
        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'
        else:
            out.append(['clip',None])
            continue
        x0=max(math.floor(min(xs)),0)
        x1=min(math.ceil(max(xs)),size)
        y0=max(math.floor(min(ys)),0)
        y1=min(math.ceil(max(ys)),size)
        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])
    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])
    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])
    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])
    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])
    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])
    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])
    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])
    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])
    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])
    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])
    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])
    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])
    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])
    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])
    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])
    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])
    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])
    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])
    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])
    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])
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
explicit case 0[['accept', [1, 1, 5, 5]]][['accept', [1, 1, 5, 5]]]Passed
explicit case 1[['reject', None]][['reject', None]]Passed
explicit case 2[['clip', None]][['clip', None]]Passed
explicit case 3[['guard', None]][['guard', None]]Passed
explicit case 4[['guard', None]][['reject', None]]Failed
explicit case 5[['clip', None]][['clip', None]]Passed
explicit case 6[['accept', [1, 1, 3, 3]]][['accept', [1, 1, 3, 3]]]Passed
explicit case 7[['guard', [0, 1, 2, 3]]][['guard', [0, 1, 2, 3]]]Passed
explicit case 8[['guard', [1, 1, 6, 3]]][['guard', [1, 1, 6, 3]]]Passed
explicit case 9[['guard', [0, 1, 5, 6]]][['guard', [0, 1, 5, 6]]]Passed
explicit case 10[['clip', None]][['clip', None]]Passed
explicit case 11[['clip', None]][['clip', None]]Passed
explicit case 12[['reject', None]][['reject', None]]Passed

SHA-256 / 7a7e34978aa9aff4bef5cad4ff4bab0c697873b1ca814013feb72c2e8b85dfd6

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    out=[]
    g=size
    for tri in commands:
        xs=[Fraction(v[0]) for v in tri]
        ys=[Fraction(v[1]) for v in tri]
        if max(xs)<0 or min(xs)>size or max(ys)<0 or min(ys)>size:
            out.append(['reject',None])
            continue
        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'
        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'
        else:
            out.append(['clip',None])
            continue
        x0=max(math.floor(min(xs)),0)
        x1=min(math.ceil(max(xs)),size)
        y0=max(math.floor(min(ys)),0)
        y1=min(math.ceil(max(ys)),size)
        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])
    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])
    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])
    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])
    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])
    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])
    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])
    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])
    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])
    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])
    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])
    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])
    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])
    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])
    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])
    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])
    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])
    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])
    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])
    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])
    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])
    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])
    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])
    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])
    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])
    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])
    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])
    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])
    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])
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
explicit case 0[['accept', [1, 1, 5, 5]]][['accept', [1, 1, 5, 5]]]Passed
explicit case 1[['reject', None]][['reject', None]]Passed
explicit case 2[['clip', None]][['clip', None]]Passed
explicit case 3[['guard', None]][['guard', None]]Passed
explicit case 4[['reject', None]][['reject', None]]Passed
explicit case 5[['clip', None]][['clip', None]]Passed
explicit case 6[['accept', [1, 1, 3, 3]]][['accept', [1, 1, 3, 3]]]Passed
explicit case 7[['guard', [0, 1, 2, 3]]][['guard', [0, 1, 2, 3]]]Passed
explicit case 8[['guard', [1, 1, 6, 3]]][['guard', [1, 1, 6, 3]]]Passed
explicit case 9[['guard', [0, 1, 5, 6]]][['guard', [0, 1, 5, 6]]]Passed
explicit case 10[['clip', None]][['clip', None]]Passed
explicit case 11[['clip', None]][['clip', None]]Passed
explicit case 12[['reject', None]][['reject', None]]Passed

SHA-256 / e4fbf57f5557b498f263aa7e9765509d855973830e43bbfbf65115d910ddd620

Verification & scope

Exact integer/rational arithmetic on small stipulated fixtures models the clipping decision only; no memory layout, GPU pipeline, graphics API or standards conformance is claimed. 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:45:22.264956+00:00.

Case digest / 9c3fd233d191a560be269a54ed5e148375f2b571bb5826a610d3ea1665c8ebba