{"abstract":"Triangles touching the right viewport edge are rejected even though boundary points are inside.","category":"Raster clipping","checks":13,"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.","evaluation_group":"s3-raster-clipping-guard-band-triangle-clip","failed_approach":"Moving the threshold a whole pixel out stops rejecting triangles just beyond the right edge.","family":"s3-raster-clipping-guard-band-triangle-clip-reject-right-boundary","id":"FA-51766","implementations":{"attempt":{"sha256":"7a7e34978aa9aff4bef5cad4ff4bab0c697873b1ca814013feb72c2e8b85dfd6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    out=[]\n    g=size\n    for tri in commands:\n        xs=[Fraction(v[0]) for v in tri]\n        ys=[Fraction(v[1]) for v in tri]\n        if max(xs)<0 or min(xs)>=size+1 or max(ys)<0 or min(ys)>size:\n            out.append(['reject',None])\n            continue\n        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'\n        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'\n        else:\n            out.append(['clip',None])\n            continue\n        x0=max(math.floor(min(xs)),0)\n        x1=min(math.ceil(max(xs)),size)\n        y0=max(math.floor(min(ys)),0)\n        y1=min(math.ceil(max(ys)),size)\n        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])\n    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])\n    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])\n    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])\n    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])\nif N == 2:\n    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])\n    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])\n    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])\n    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])\n    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])\nif N == 3:\n    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])\n    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])\n    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])\n    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])\n    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])\nif N == 4:\n    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])\n    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])\n    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])\n    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])\n    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])\nif N == 5:\n    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])\n    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])\n    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])\n    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])\n    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])\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":"5af44728e2927b6d670696b081d0f427baafc1925cbb70e60f9d66afdcbcf7e3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    out=[]\n    g=size\n    for tri in commands:\n        xs=[Fraction(v[0]) for v in tri]\n        ys=[Fraction(v[1]) for v in tri]\n        if max(xs)<0 or min(xs)>=size or max(ys)<0 or min(ys)>size:\n            out.append(['reject',None])\n            continue\n        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'\n        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'\n        else:\n            out.append(['clip',None])\n            continue\n        x0=max(math.floor(min(xs)),0)\n        x1=min(math.ceil(max(xs)),size)\n        y0=max(math.floor(min(ys)),0)\n        y1=min(math.ceil(max(ys)),size)\n        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])\n    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])\n    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])\n    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])\n    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])\nif N == 2:\n    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])\n    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])\n    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])\n    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])\n    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])\nif N == 3:\n    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])\n    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])\n    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])\n    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])\n    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])\nif N == 4:\n    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])\n    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])\n    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])\n    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])\n    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])\nif N == 5:\n    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])\n    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])\n    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])\n    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])\n    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])\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"},"fixed":{"sha256":"e4fbf57f5557b498f263aa7e9765509d855973830e43bbfbf65115d910ddd620","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(commands, size):\n    out=[]\n    g=size\n    for tri in commands:\n        xs=[Fraction(v[0]) for v in tri]\n        ys=[Fraction(v[1]) for v in tri]\n        if max(xs)<0 or min(xs)>size or max(ys)<0 or min(ys)>size:\n            out.append(['reject',None])\n            continue\n        if min(xs)>=0 and max(xs)<=size and min(ys)>=0 and max(ys)<=size: kind='accept'\n        elif min(xs)>=-g and max(xs)<=size+g and min(ys)>=-g and max(ys)<=size+g: kind='guard'\n        else:\n            out.append(['clip',None])\n            continue\n        x0=max(math.floor(min(xs)),0)\n        x1=min(math.ceil(max(xs)),size)\n        y0=max(math.floor(min(ys)),0)\n        y1=min(math.ceil(max(ys)),size)\n        out.append([kind,[x0,y0,x1,y1] if x0<x1 and y0<y1 else None])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('explicit case 0', solve([[[1, 1], [5, 1], [2, 5]]], 6), [['accept', [1, 1, 5, 5]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 6]]], 6), [['reject', None]])\n    check('explicit case 2', solve([[[-12, -12], [24, -12], [3, 24]]], 6), [['clip', None]])\n    check('explicit case 3', solve([[[6, 0], [8, 1], [7, 3]]], 6), [['guard', None]])\n    check('explicit case 4', solve([[['13/2', 0], [9, 1], [7, 3]]], 6), [['reject', None]])\n    check('explicit case 5', solve([[[1, -18], [2, 3], [3, 3]]], 6), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 6), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-5, 1], [2, 2], [1, 3]]], 6), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [8, 1], [2, 3]]], 6), [['guard', [1, 1, 6, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 7], [5, 2]]], 6), [['guard', [0, 1, 5, 6]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 13]]], 6), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 30]]], 6), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 6), [['reject', None]])\nif N == 2:\n    check('explicit case 0', solve([[[1, 1], [6, 1], [2, 6]]], 7), [['accept', [1, 1, 6, 6]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 7]]], 7), [['reject', None]])\n    check('explicit case 2', solve([[[-14, -14], [28, -14], [3, 28]]], 7), [['clip', None]])\n    check('explicit case 3', solve([[[7, 0], [9, 1], [8, 3]]], 7), [['guard', None]])\n    check('explicit case 4', solve([[['15/2', 0], [10, 1], [8, 3]]], 7), [['reject', None]])\n    check('explicit case 5', solve([[[1, -21], [2, 3], [3, 3]]], 7), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 7), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-6, 1], [2, 2], [1, 3]]], 7), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [9, 1], [2, 3]]], 7), [['guard', [1, 1, 7, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 8], [6, 2]]], 7), [['guard', [0, 1, 6, 7]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 15]]], 7), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 35]]], 7), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 7), [['reject', None]])\nif N == 3:\n    check('explicit case 0', solve([[[1, 1], [7, 1], [2, 7]]], 8), [['accept', [1, 1, 7, 7]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 8]]], 8), [['reject', None]])\n    check('explicit case 2', solve([[[-16, -16], [32, -16], [4, 32]]], 8), [['clip', None]])\n    check('explicit case 3', solve([[[8, 0], [10, 1], [9, 3]]], 8), [['guard', None]])\n    check('explicit case 4', solve([[['17/2', 0], [11, 1], [9, 3]]], 8), [['reject', None]])\n    check('explicit case 5', solve([[[1, -24], [2, 3], [3, 3]]], 8), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 8), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-7, 1], [2, 2], [1, 3]]], 8), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [10, 1], [2, 3]]], 8), [['guard', [1, 1, 8, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 9], [7, 2]]], 8), [['guard', [0, 1, 7, 8]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 17]]], 8), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 40]]], 8), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 8), [['reject', None]])\nif N == 4:\n    check('explicit case 0', solve([[[1, 1], [8, 1], [2, 8]]], 9), [['accept', [1, 1, 8, 8]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 9]]], 9), [['reject', None]])\n    check('explicit case 2', solve([[[-18, -18], [36, -18], [4, 36]]], 9), [['clip', None]])\n    check('explicit case 3', solve([[[9, 0], [11, 1], [10, 3]]], 9), [['guard', None]])\n    check('explicit case 4', solve([[['19/2', 0], [12, 1], [10, 3]]], 9), [['reject', None]])\n    check('explicit case 5', solve([[[1, -27], [2, 3], [3, 3]]], 9), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 9), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-8, 1], [2, 2], [1, 3]]], 9), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [11, 1], [2, 3]]], 9), [['guard', [1, 1, 9, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 10], [8, 2]]], 9), [['guard', [0, 1, 8, 9]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 19]]], 9), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 45]]], 9), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 9), [['reject', None]])\nif N == 5:\n    check('explicit case 0', solve([[[1, 1], [9, 1], [2, 9]]], 10), [['accept', [1, 1, 9, 9]]])\n    check('explicit case 1', solve([[[-1, -1], [-3, 2], [-2, 10]]], 10), [['reject', None]])\n    check('explicit case 2', solve([[[-20, -20], [40, -20], [5, 40]]], 10), [['clip', None]])\n    check('explicit case 3', solve([[[10, 0], [12, 1], [11, 3]]], 10), [['guard', None]])\n    check('explicit case 4', solve([[['21/2', 0], [13, 1], [11, 3]]], 10), [['reject', None]])\n    check('explicit case 5', solve([[[1, -30], [2, 3], [3, 3]]], 10), [['clip', None]])\n    check('explicit case 6', solve([[[1, 1], ['5/2', 1], [2, 3]]], 10), [['accept', [1, 1, 3, 3]]])\n    check('explicit case 7', solve([[[-9, 1], [2, 2], [1, 3]]], 10), [['guard', [0, 1, 2, 3]]])\n    check('explicit case 8', solve([[[1, 1], [12, 1], [2, 3]]], 10), [['guard', [1, 1, 10, 3]]])\n    check('explicit case 9', solve([[[-1, 1], [1, 11], [9, 2]]], 10), [['guard', [0, 1, 9, 10]]])\n    check('explicit case 10', solve([[[1, 1], [3, 1], [2, 21]]], 10), [['clip', None]])\n    check('explicit case 11', solve([[[1, 1], [2, 1], [2, 50]]], 10), [['clip', None]])\n    check('explicit case 12', solve([[[1, -3], [3, -2], [2, -5]]], 10), [['reject', None]])\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":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-raster-clipping-guard-band-triangle-clip-reject-right-boundary","generated_at":"2026-09-29T14:45:22.264956+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","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.","root_cause":"Triangles touching the right viewport edge are rejected even though boundary points are inside.","sha256":"9c3fd233d191a560be269a54ed5e148375f2b571bb5826a610d3ea1665c8ebba","title":"Guard band triangle clip: reject right boundary · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.496,"exit_code":1,"observations":[{"actual":[["accept",[1,1,5,5]]],"check":"explicit case 0","expected":[["accept",[1,1,5,5]]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 1","expected":[["reject",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 2","expected":[["clip",null]],"passed":true},{"actual":[["guard",null]],"check":"explicit case 3","expected":[["guard",null]],"passed":true},{"actual":[["guard",null]],"check":"explicit case 4","expected":[["reject",null]],"passed":false},{"actual":[["clip",null]],"check":"explicit case 5","expected":[["clip",null]],"passed":true},{"actual":[["accept",[1,1,3,3]]],"check":"explicit case 6","expected":[["accept",[1,1,3,3]]],"passed":true},{"actual":[["guard",[0,1,2,3]]],"check":"explicit case 7","expected":[["guard",[0,1,2,3]]],"passed":true},{"actual":[["guard",[1,1,6,3]]],"check":"explicit case 8","expected":[["guard",[1,1,6,3]]],"passed":true},{"actual":[["guard",[0,1,5,6]]],"check":"explicit case 9","expected":[["guard",[0,1,5,6]]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 10","expected":[["clip",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 11","expected":[["clip",null]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 12","expected":[["reject",null]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[\"accept\", [1, 1, 5, 5]]], \"expected\": [[\"accept\", [1, 1, 5, 5]]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [[\"guard\", null]], \"expected\": [[\"guard\", null]], \"passed\": true}, {\"check\": \"explicit case 4\", \"actual\": [[\"guard\", null]], \"expected\": [[\"reject\", null]], \"passed\": false}, {\"check\": \"explicit case 5\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [[\"accept\", [1, 1, 3, 3]]], \"expected\": [[\"accept\", [1, 1, 3, 3]]], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [[\"guard\", [0, 1, 2, 3]]], \"expected\": [[\"guard\", [0, 1, 2, 3]]], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[\"guard\", [1, 1, 6, 3]]], \"expected\": [[\"guard\", [1, 1, 6, 3]]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[\"guard\", [0, 1, 5, 6]]], \"expected\": [[\"guard\", [0, 1, 5, 6]]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":46.994,"exit_code":1,"observations":[{"actual":[["accept",[1,1,5,5]]],"check":"explicit case 0","expected":[["accept",[1,1,5,5]]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 1","expected":[["reject",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 2","expected":[["clip",null]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 3","expected":[["guard",null]],"passed":false},{"actual":[["reject",null]],"check":"explicit case 4","expected":[["reject",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 5","expected":[["clip",null]],"passed":true},{"actual":[["accept",[1,1,3,3]]],"check":"explicit case 6","expected":[["accept",[1,1,3,3]]],"passed":true},{"actual":[["guard",[0,1,2,3]]],"check":"explicit case 7","expected":[["guard",[0,1,2,3]]],"passed":true},{"actual":[["guard",[1,1,6,3]]],"check":"explicit case 8","expected":[["guard",[1,1,6,3]]],"passed":true},{"actual":[["guard",[0,1,5,6]]],"check":"explicit case 9","expected":[["guard",[0,1,5,6]]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 10","expected":[["clip",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 11","expected":[["clip",null]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 12","expected":[["reject",null]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[\"accept\", [1, 1, 5, 5]]], \"expected\": [[\"accept\", [1, 1, 5, 5]]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [[\"reject\", null]], \"expected\": [[\"guard\", null]], \"passed\": false}, {\"check\": \"explicit case 4\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}, {\"check\": \"explicit case 5\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [[\"accept\", [1, 1, 3, 3]]], \"expected\": [[\"accept\", [1, 1, 3, 3]]], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [[\"guard\", [0, 1, 2, 3]]], \"expected\": [[\"guard\", [0, 1, 2, 3]]], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[\"guard\", [1, 1, 6, 3]]], \"expected\": [[\"guard\", [1, 1, 6, 3]]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[\"guard\", [0, 1, 5, 6]]], \"expected\": [[\"guard\", [0, 1, 5, 6]]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":49.041,"exit_code":0,"observations":[{"actual":[["accept",[1,1,5,5]]],"check":"explicit case 0","expected":[["accept",[1,1,5,5]]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 1","expected":[["reject",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 2","expected":[["clip",null]],"passed":true},{"actual":[["guard",null]],"check":"explicit case 3","expected":[["guard",null]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 4","expected":[["reject",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 5","expected":[["clip",null]],"passed":true},{"actual":[["accept",[1,1,3,3]]],"check":"explicit case 6","expected":[["accept",[1,1,3,3]]],"passed":true},{"actual":[["guard",[0,1,2,3]]],"check":"explicit case 7","expected":[["guard",[0,1,2,3]]],"passed":true},{"actual":[["guard",[1,1,6,3]]],"check":"explicit case 8","expected":[["guard",[1,1,6,3]]],"passed":true},{"actual":[["guard",[0,1,5,6]]],"check":"explicit case 9","expected":[["guard",[0,1,5,6]]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 10","expected":[["clip",null]],"passed":true},{"actual":[["clip",null]],"check":"explicit case 11","expected":[["clip",null]],"passed":true},{"actual":[["reject",null]],"check":"explicit case 12","expected":[["reject",null]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"explicit case 0\", \"actual\": [[\"accept\", [1, 1, 5, 5]]], \"expected\": [[\"accept\", [1, 1, 5, 5]]], \"passed\": true}, {\"check\": \"explicit case 1\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}, {\"check\": \"explicit case 2\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 3\", \"actual\": [[\"guard\", null]], \"expected\": [[\"guard\", null]], \"passed\": true}, {\"check\": \"explicit case 4\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}, {\"check\": \"explicit case 5\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 6\", \"actual\": [[\"accept\", [1, 1, 3, 3]]], \"expected\": [[\"accept\", [1, 1, 3, 3]]], \"passed\": true}, {\"check\": \"explicit case 7\", \"actual\": [[\"guard\", [0, 1, 2, 3]]], \"expected\": [[\"guard\", [0, 1, 2, 3]]], \"passed\": true}, {\"check\": \"explicit case 8\", \"actual\": [[\"guard\", [1, 1, 6, 3]]], \"expected\": [[\"guard\", [1, 1, 6, 3]]], \"passed\": true}, {\"check\": \"explicit case 9\", \"actual\": [[\"guard\", [0, 1, 5, 6]]], \"expected\": [[\"guard\", [0, 1, 5, 6]]], \"passed\": true}, {\"check\": \"explicit case 10\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 11\", \"actual\": [[\"clip\", null]], \"expected\": [[\"clip\", null]], \"passed\": true}, {\"check\": \"explicit case 12\", \"actual\": [[\"reject\", null]], \"expected\": [[\"reject\", null]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}