FAILURE MAP
← Case archive

FA-87411 / Collision detection broadphase / Open access

Oversized fat boxes are never rebuilt · case 01

After a fast move stops, the huge fat box keeps generating false pairs.

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

ROOT CAUSE

The area ratio test is missing; containment alone keeps the box.

VERIFIED REPAIR

Rebuild when the fat box is more than 4x a fresh one.

Unsuccessful approach: Comparing against 4x the tight box area rebuilds too eagerly.

Case contract

solve(tight, fat, disp, margin, mult): dynamic-tree proxy update. If the stored fat box contains the new tight box (inclusive) and its area is at most 4x that of a freshly built fat box, keep it: [False, fat]. Otherwise rebuild: tight expanded by margin on all sides, then extended by mult*disp on the side the motion points to; return [True, rebuilt box rounded to 6].

Why this case matters

Broadphase stages decide which object pairs ever reach narrowphase; a wrong boundary, ordering or bookkeeping rule silently drops real contacts or floods the solver with false candidates.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(tight, fat, disp, margin, mult):
    def fatten():
        f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
        dx, dy = mult * disp[0], mult * disp[1]
        if dx < 0:
            f[0] += dx
        else:
            f[2] += dx
        if dy < 0:
            f[1] += dy
        else:
            f[3] += dy
        return [round(c, 6) for c in f]
    def area(b):
        return (b[2] - b[0]) * (b[3] - b[1])
    inside = fat[0] <= tight[0] and fat[1] <= tight[1] and tight[2] <= fat[2] and tight[3] <= fat[3]
    fresh = fatten()
    if inside:
        return [False, fat]
    return [True, fresh]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.4, 2.3, 2.0, 5.3], [-1.5, 2.0, 2.6, 8.5], [-0.1, -0.2], 0.5, 4.0], [False, [-1.5, 2.0, 2.6, 8.5]]], [[[-0.8, -0.8, 0.3, 0.9], [-1.8, -1.1, 0.8, 1.6], [0, -0.2], 0.5, 1.0], [False, [-1.8, -1.1, 0.8, 1.6]]], [[[0.6, -5.6, 2.3, -4.3], [0.0, -4.8, 3.1, -2.9], [0.4, -1.0], 0.2, 1.0], [True, [0.4, -6.8, 2.9, -4.1]]], [[[-3.5, -2.0, -2.1, -0.4], [-7.5, -4.0, -0.1, 3.6], [1.0, -1.0], 0.5, 1.0], [True, [-4.0, -3.5, -0.6, 0.1]]], [[[-3.0, 1.8, -2.5, 3.2], [-4.0, 1.3, -1.5, 4.2], [0, 0], 0.2, 1.0], [True, [-3.2, 1.6, -2.3, 3.4]]], [[[-4.4, 1.1, -2.1, 2.8], [-5.5, -0.9, 0.8, 4.3], [0.1, -1.0], 0.5, 1.0], [False, [-5.5, -0.9, 0.8, 4.3]]], [[[-0.3, 2.0, 2.2, 4.9], [-1.8, 0.9, 1.7, 5.3], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 1.5, 3.7, 5.5]]], [[[2.1, -3.5, 4.0, -3.0], [-1.0, -6.3, 6.9, -2.3], [0.1, -0.2], 0.5, 1.0], [True, [1.6, -4.2, 4.6, -2.5]]]], [[[[-1.5, -2.0, -0.7, -0.2], [-1.8, -2.15, -0.4, 0.1], [-0.1, 0.2], 0.1, 1.0], [False, [-1.8, -2.15, -0.4, 0.1]]], [[[-2.6, 2.3, -0.6, 5.3], [-5.0, 1.5, 0.5, 6.0], [-0.6, -0.2], 0.5, 2.0], [False, [-5.0, 1.5, 0.5, 6.0]]], [[[-2.0, 2.3, -1.0, 3.7], [-4.0, 1.3, 1.0, 5.7], [-0.1, 0], 0.1, 1.0], [True, [-2.2, 2.2, -0.9, 3.8]]], [[[4.6, 1.5, 5.6, 2.9], [4.5, 1.4, 6.3, 3.0], [-0.1, 0], 0.1, 4.0], [False, [4.5, 1.4, 6.3, 3.0]]], [[[-4.2, -4.5, -3.8, -3.9], [-4.8, -5.1, -3.2, -3.3], [0, 0], 0.1, 1.0], [True, [-4.3, -4.6, -3.7, -3.8]]], [[[-4.4, -4.5, -3.2, -2.6], [-5.4, -5.0, -2.2, -1.6], [-0.1, 0.2], 0.1, 1.0], [False, [-5.4, -5.0, -2.2, -1.6]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[-1.7, -1.8, 0.6, 0.4], [-1.7, -2.1, 0.9, 0.9], [-0.1, 0.1], 0.1, 2.0], [False, [-1.7, -2.1, 0.9, 0.9]]]], [[[[-1.2, 2.9, 0.8, 3.3], [-2.2, -0.1, 1.8, 4.3], [0.1, 0], 0.2, 1.0], [True, [-1.4, 2.7, 1.1, 3.5]]], [[[1.8, 4.4, 3.3, 5.7], [0.2, 4.2, 2.4, 5.9], [1.0, 0], 0.1, 1.0], [True, [1.7, 4.3, 4.4, 5.8]]], [[[0.5, -1.0, 2.9, 0.8], [-2.4, -2.0, 6.0, 3.8], [-0.1, 0], 0.5, 2.0], [True, [-0.2, -1.5, 3.4, 1.3]]], [[[5.1, 1.0, 5.7, 2.0], [3.7, 0.2, 6.3, 3.2], [0.4, -0.2], 0.5, 1.0], [False, [3.7, 0.2, 6.3, 3.2]]], [[[-0.6, 3.3, 0.2, 3.6], [-1.6, 2.3, 1.2, 4.6], [0.1, 0.2], 0.1, 1.0], [True, [-0.7, 3.2, 0.4, 3.9]]], [[[-3.8, 3.7, -1.0, 4.9], [-6.9, 0.2, -0.1, 7.4], [0.1, 0.5], 0.5, 2.0], [False, [-6.9, 0.2, -0.1, 7.4]]], [[[-3.1, -1.2, -1.7, 0.6], [-3.7, -3.0, -1.1, 1.2], [0, 0.2], 0.1, 1.0], [False, [-3.7, -3.0, -1.1, 1.2]]], [[[-2.2, 1.4, -1.4, 1.7], [-2.8, 0.8, -0.8, 2.3], [0.1, 0], 0.2, 1.0], [False, [-2.8, 0.8, -0.8, 2.3]]]], [[[[-3.1, -1.6, -2.5, 1.2], [-3.0, -2.2, 1.1, 1.6], [-0.6, 0.1], 0.5, 2.0], [True, [-4.8, -2.1, -2.0, 1.9]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[-0.8, -3.1, 0.9, -1.9], [-4.8, -6.2, 2.9, -1.5], [1.0, 0.1], 0.5, 4.0], [False, [-4.8, -6.2, 2.9, -1.5]]], [[[1.8, 4.2, 3.2, 4.7], [2.2, 4.0, 4.2, 5.9], [-0.6, 0], 0.2, 1.0], [True, [1.0, 4.0, 3.4, 4.9]]], [[[-4.4, -0.8, -3.4, 0.6], [-7.3, -4.3, -0.3, 3.1], [-0.1, 0.5], 0.5, 4.0], [True, [-5.3, -1.3, -2.9, 3.1]]], [[[-0.1, -1.9, 1.0, -0.6], [-1.1, -2.4, 2.0, 0.4], [0.1, 0], 0.1, 1.0], [True, [-0.2, -2.0, 1.2, -0.5]]], [[[-4.4, 0.2, -2.9, 2.4], [-5.4, -2.8, -2.4, 5.4], [0, 0], 0.5, 2.0], [False, [-5.4, -2.8, -2.4, 5.4]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]]], [[[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[0.1, -2.7, 0.5, -2.0], [-0.9, -3.2, 1.5, -1.0], [0, 0], 0.1, 1.0], [True, [0.0, -2.8, 0.6, -1.9]]], [[[-0.2, -2.3, 1.0, -2.0], [-0.5, -3.2, 1.3, -1.7], [0.1, 0.2], 0.2, 1.0], [False, [-0.5, -3.2, 1.3, -1.7]]], [[[3.5, -3.3, 4.8, -0.6], [4.0, -4.4, 5.5, -0.9], [-0.6, 0.5], 0.1, 1.0], [True, [2.8, -3.4, 4.9, 0.0]]], [[[4.2, 3.7, 5.9, 4.3], [2.2, 1.7, 7.9, 6.3], [0.1, 0], 0.2, 1.0], [True, [4.0, 3.5, 6.2, 4.5]]], [[[-3.1, 3.5, -2.4, 4.0], [-3.7, 1.7, -1.8, 4.6], [0, 0], 0.1, 1.0], [True, [-3.2, 3.4, -2.3, 4.1]]], [[[-2.4, 0.9, -1.5, 1.9], [-4.8, -2.6, 2.1, 2.4], [-0.6, 0.5], 0.5, 4.0], [False, [-4.8, -2.6, 2.1, 2.4]]], [[[2.3, -3.0, 3.5, -2.7], [2.0, -3.3, 3.8, -2.4], [0.1, 0.2], 0.2, 1.0], [False, [2.0, -3.3, 3.8, -2.4]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %d" % 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
case 0[False, [-1.5, 2.0, 2.6, 8.5]][False, [-1.5, 2.0, 2.6, 8.5]]Passed
case 1[False, [-1.8, -1.1, 0.8, 1.6]][False, [-1.8, -1.1, 0.8, 1.6]]Passed
case 2[True, [0.4, -6.8, 2.9, -4.1]][True, [0.4, -6.8, 2.9, -4.1]]Passed
case 3[False, [-7.5, -4.0, -0.1, 3.6]][True, [-4.0, -3.5, -0.6, 0.1]]Failed
case 4[False, [-4.0, 1.3, -1.5, 4.2]][True, [-3.2, 1.6, -2.3, 3.4]]Failed
case 5[False, [-5.5, -0.9, 0.8, 4.3]][False, [-5.5, -0.9, 0.8, 4.3]]Passed
case 6[True, [-0.8, 1.5, 3.7, 5.5]][True, [-0.8, 1.5, 3.7, 5.5]]Passed
case 7[False, [-1.0, -6.3, 6.9, -2.3]][True, [1.6, -4.2, 4.6, -2.5]]Failed

SHA-256 / 4e165e4686a3748dd58e51619d98d95aea832f77b591d09dcc01da91ea24be68

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(tight, fat, disp, margin, mult):
    def fatten():
        f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
        dx, dy = mult * disp[0], mult * disp[1]
        if dx < 0:
            f[0] += dx
        else:
            f[2] += dx
        if dy < 0:
            f[1] += dy
        else:
            f[3] += dy
        return [round(c, 6) for c in f]
    def area(b):
        return (b[2] - b[0]) * (b[3] - b[1])
    inside = fat[0] <= tight[0] and fat[1] <= tight[1] and tight[2] <= fat[2] and tight[3] <= fat[3]
    fresh = fatten()
    if inside and area(fat) <= 4 * area(tight):
        return [False, fat]
    return [True, fresh]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.4, 2.3, 2.0, 5.3], [-1.5, 2.0, 2.6, 8.5], [-0.1, -0.2], 0.5, 4.0], [False, [-1.5, 2.0, 2.6, 8.5]]], [[[-0.8, -0.8, 0.3, 0.9], [-1.8, -1.1, 0.8, 1.6], [0, -0.2], 0.5, 1.0], [False, [-1.8, -1.1, 0.8, 1.6]]], [[[0.6, -5.6, 2.3, -4.3], [0.0, -4.8, 3.1, -2.9], [0.4, -1.0], 0.2, 1.0], [True, [0.4, -6.8, 2.9, -4.1]]], [[[-3.5, -2.0, -2.1, -0.4], [-7.5, -4.0, -0.1, 3.6], [1.0, -1.0], 0.5, 1.0], [True, [-4.0, -3.5, -0.6, 0.1]]], [[[-3.0, 1.8, -2.5, 3.2], [-4.0, 1.3, -1.5, 4.2], [0, 0], 0.2, 1.0], [True, [-3.2, 1.6, -2.3, 3.4]]], [[[-4.4, 1.1, -2.1, 2.8], [-5.5, -0.9, 0.8, 4.3], [0.1, -1.0], 0.5, 1.0], [False, [-5.5, -0.9, 0.8, 4.3]]], [[[-0.3, 2.0, 2.2, 4.9], [-1.8, 0.9, 1.7, 5.3], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 1.5, 3.7, 5.5]]], [[[2.1, -3.5, 4.0, -3.0], [-1.0, -6.3, 6.9, -2.3], [0.1, -0.2], 0.5, 1.0], [True, [1.6, -4.2, 4.6, -2.5]]]], [[[[-1.5, -2.0, -0.7, -0.2], [-1.8, -2.15, -0.4, 0.1], [-0.1, 0.2], 0.1, 1.0], [False, [-1.8, -2.15, -0.4, 0.1]]], [[[-2.6, 2.3, -0.6, 5.3], [-5.0, 1.5, 0.5, 6.0], [-0.6, -0.2], 0.5, 2.0], [False, [-5.0, 1.5, 0.5, 6.0]]], [[[-2.0, 2.3, -1.0, 3.7], [-4.0, 1.3, 1.0, 5.7], [-0.1, 0], 0.1, 1.0], [True, [-2.2, 2.2, -0.9, 3.8]]], [[[4.6, 1.5, 5.6, 2.9], [4.5, 1.4, 6.3, 3.0], [-0.1, 0], 0.1, 4.0], [False, [4.5, 1.4, 6.3, 3.0]]], [[[-4.2, -4.5, -3.8, -3.9], [-4.8, -5.1, -3.2, -3.3], [0, 0], 0.1, 1.0], [True, [-4.3, -4.6, -3.7, -3.8]]], [[[-4.4, -4.5, -3.2, -2.6], [-5.4, -5.0, -2.2, -1.6], [-0.1, 0.2], 0.1, 1.0], [False, [-5.4, -5.0, -2.2, -1.6]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[-1.7, -1.8, 0.6, 0.4], [-1.7, -2.1, 0.9, 0.9], [-0.1, 0.1], 0.1, 2.0], [False, [-1.7, -2.1, 0.9, 0.9]]]], [[[[-1.2, 2.9, 0.8, 3.3], [-2.2, -0.1, 1.8, 4.3], [0.1, 0], 0.2, 1.0], [True, [-1.4, 2.7, 1.1, 3.5]]], [[[1.8, 4.4, 3.3, 5.7], [0.2, 4.2, 2.4, 5.9], [1.0, 0], 0.1, 1.0], [True, [1.7, 4.3, 4.4, 5.8]]], [[[0.5, -1.0, 2.9, 0.8], [-2.4, -2.0, 6.0, 3.8], [-0.1, 0], 0.5, 2.0], [True, [-0.2, -1.5, 3.4, 1.3]]], [[[5.1, 1.0, 5.7, 2.0], [3.7, 0.2, 6.3, 3.2], [0.4, -0.2], 0.5, 1.0], [False, [3.7, 0.2, 6.3, 3.2]]], [[[-0.6, 3.3, 0.2, 3.6], [-1.6, 2.3, 1.2, 4.6], [0.1, 0.2], 0.1, 1.0], [True, [-0.7, 3.2, 0.4, 3.9]]], [[[-3.8, 3.7, -1.0, 4.9], [-6.9, 0.2, -0.1, 7.4], [0.1, 0.5], 0.5, 2.0], [False, [-6.9, 0.2, -0.1, 7.4]]], [[[-3.1, -1.2, -1.7, 0.6], [-3.7, -3.0, -1.1, 1.2], [0, 0.2], 0.1, 1.0], [False, [-3.7, -3.0, -1.1, 1.2]]], [[[-2.2, 1.4, -1.4, 1.7], [-2.8, 0.8, -0.8, 2.3], [0.1, 0], 0.2, 1.0], [False, [-2.8, 0.8, -0.8, 2.3]]]], [[[[-3.1, -1.6, -2.5, 1.2], [-3.0, -2.2, 1.1, 1.6], [-0.6, 0.1], 0.5, 2.0], [True, [-4.8, -2.1, -2.0, 1.9]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[-0.8, -3.1, 0.9, -1.9], [-4.8, -6.2, 2.9, -1.5], [1.0, 0.1], 0.5, 4.0], [False, [-4.8, -6.2, 2.9, -1.5]]], [[[1.8, 4.2, 3.2, 4.7], [2.2, 4.0, 4.2, 5.9], [-0.6, 0], 0.2, 1.0], [True, [1.0, 4.0, 3.4, 4.9]]], [[[-4.4, -0.8, -3.4, 0.6], [-7.3, -4.3, -0.3, 3.1], [-0.1, 0.5], 0.5, 4.0], [True, [-5.3, -1.3, -2.9, 3.1]]], [[[-0.1, -1.9, 1.0, -0.6], [-1.1, -2.4, 2.0, 0.4], [0.1, 0], 0.1, 1.0], [True, [-0.2, -2.0, 1.2, -0.5]]], [[[-4.4, 0.2, -2.9, 2.4], [-5.4, -2.8, -2.4, 5.4], [0, 0], 0.5, 2.0], [False, [-5.4, -2.8, -2.4, 5.4]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]]], [[[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[0.1, -2.7, 0.5, -2.0], [-0.9, -3.2, 1.5, -1.0], [0, 0], 0.1, 1.0], [True, [0.0, -2.8, 0.6, -1.9]]], [[[-0.2, -2.3, 1.0, -2.0], [-0.5, -3.2, 1.3, -1.7], [0.1, 0.2], 0.2, 1.0], [False, [-0.5, -3.2, 1.3, -1.7]]], [[[3.5, -3.3, 4.8, -0.6], [4.0, -4.4, 5.5, -0.9], [-0.6, 0.5], 0.1, 1.0], [True, [2.8, -3.4, 4.9, 0.0]]], [[[4.2, 3.7, 5.9, 4.3], [2.2, 1.7, 7.9, 6.3], [0.1, 0], 0.2, 1.0], [True, [4.0, 3.5, 6.2, 4.5]]], [[[-3.1, 3.5, -2.4, 4.0], [-3.7, 1.7, -1.8, 4.6], [0, 0], 0.1, 1.0], [True, [-3.2, 3.4, -2.3, 4.1]]], [[[-2.4, 0.9, -1.5, 1.9], [-4.8, -2.6, 2.1, 2.4], [-0.6, 0.5], 0.5, 4.0], [False, [-4.8, -2.6, 2.1, 2.4]]], [[[2.3, -3.0, 3.5, -2.7], [2.0, -3.3, 3.8, -2.4], [0.1, 0.2], 0.2, 1.0], [False, [2.0, -3.3, 3.8, -2.4]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %d" % 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
case 0[True, [0.5, 1.0, 2.5, 5.8]][False, [-1.5, 2.0, 2.6, 8.5]]Failed
case 1[False, [-1.8, -1.1, 0.8, 1.6]][False, [-1.8, -1.1, 0.8, 1.6]]Passed
case 2[True, [0.4, -6.8, 2.9, -4.1]][True, [0.4, -6.8, 2.9, -4.1]]Passed
case 3[True, [-4.0, -3.5, -0.6, 0.1]][True, [-4.0, -3.5, -0.6, 0.1]]Passed
case 4[True, [-3.2, 1.6, -2.3, 3.4]][True, [-3.2, 1.6, -2.3, 3.4]]Passed
case 5[True, [-4.9, -0.4, -1.5, 3.3]][False, [-5.5, -0.9, 0.8, 4.3]]Failed
case 6[True, [-0.8, 1.5, 3.7, 5.5]][True, [-0.8, 1.5, 3.7, 5.5]]Passed
case 7[True, [1.6, -4.2, 4.6, -2.5]][True, [1.6, -4.2, 4.6, -2.5]]Passed

SHA-256 / 1c30cc817c2a530e05d55ec91c46de57573a9515080ed470a460300de6674cdc

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(tight, fat, disp, margin, mult):
    def fatten():
        f = [tight[0] - margin, tight[1] - margin, tight[2] + margin, tight[3] + margin]
        dx, dy = mult * disp[0], mult * disp[1]
        if dx < 0:
            f[0] += dx
        else:
            f[2] += dx
        if dy < 0:
            f[1] += dy
        else:
            f[3] += dy
        return [round(c, 6) for c in f]
    def area(b):
        return (b[2] - b[0]) * (b[3] - b[1])
    inside = fat[0] <= tight[0] and fat[1] <= tight[1] and tight[2] <= fat[2] and tight[3] <= fat[3]
    fresh = fatten()
    if inside and area(fat) <= 4 * area(fresh):
        return [False, fat]
    return [True, fresh]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.4, 2.3, 2.0, 5.3], [-1.5, 2.0, 2.6, 8.5], [-0.1, -0.2], 0.5, 4.0], [False, [-1.5, 2.0, 2.6, 8.5]]], [[[-0.8, -0.8, 0.3, 0.9], [-1.8, -1.1, 0.8, 1.6], [0, -0.2], 0.5, 1.0], [False, [-1.8, -1.1, 0.8, 1.6]]], [[[0.6, -5.6, 2.3, -4.3], [0.0, -4.8, 3.1, -2.9], [0.4, -1.0], 0.2, 1.0], [True, [0.4, -6.8, 2.9, -4.1]]], [[[-3.5, -2.0, -2.1, -0.4], [-7.5, -4.0, -0.1, 3.6], [1.0, -1.0], 0.5, 1.0], [True, [-4.0, -3.5, -0.6, 0.1]]], [[[-3.0, 1.8, -2.5, 3.2], [-4.0, 1.3, -1.5, 4.2], [0, 0], 0.2, 1.0], [True, [-3.2, 1.6, -2.3, 3.4]]], [[[-4.4, 1.1, -2.1, 2.8], [-5.5, -0.9, 0.8, 4.3], [0.1, -1.0], 0.5, 1.0], [False, [-5.5, -0.9, 0.8, 4.3]]], [[[-0.3, 2.0, 2.2, 4.9], [-1.8, 0.9, 1.7, 5.3], [1.0, 0.1], 0.5, 1.0], [True, [-0.8, 1.5, 3.7, 5.5]]], [[[2.1, -3.5, 4.0, -3.0], [-1.0, -6.3, 6.9, -2.3], [0.1, -0.2], 0.5, 1.0], [True, [1.6, -4.2, 4.6, -2.5]]]], [[[[-1.5, -2.0, -0.7, -0.2], [-1.8, -2.15, -0.4, 0.1], [-0.1, 0.2], 0.1, 1.0], [False, [-1.8, -2.15, -0.4, 0.1]]], [[[-2.6, 2.3, -0.6, 5.3], [-5.0, 1.5, 0.5, 6.0], [-0.6, -0.2], 0.5, 2.0], [False, [-5.0, 1.5, 0.5, 6.0]]], [[[-2.0, 2.3, -1.0, 3.7], [-4.0, 1.3, 1.0, 5.7], [-0.1, 0], 0.1, 1.0], [True, [-2.2, 2.2, -0.9, 3.8]]], [[[4.6, 1.5, 5.6, 2.9], [4.5, 1.4, 6.3, 3.0], [-0.1, 0], 0.1, 4.0], [False, [4.5, 1.4, 6.3, 3.0]]], [[[-4.2, -4.5, -3.8, -3.9], [-4.8, -5.1, -3.2, -3.3], [0, 0], 0.1, 1.0], [True, [-4.3, -4.6, -3.7, -3.8]]], [[[-4.4, -4.5, -3.2, -2.6], [-5.4, -5.0, -2.2, -1.6], [-0.1, 0.2], 0.1, 1.0], [False, [-5.4, -5.0, -2.2, -1.6]]], [[[2.2, 3.9, 3.8, 4.6], [-1.8, -0.1, 7.8, 8.6], [0.1, 0.2], 0.2, 1.0], [True, [2.0, 3.7, 4.1, 5.0]]], [[[-1.7, -1.8, 0.6, 0.4], [-1.7, -2.1, 0.9, 0.9], [-0.1, 0.1], 0.1, 2.0], [False, [-1.7, -2.1, 0.9, 0.9]]]], [[[[-1.2, 2.9, 0.8, 3.3], [-2.2, -0.1, 1.8, 4.3], [0.1, 0], 0.2, 1.0], [True, [-1.4, 2.7, 1.1, 3.5]]], [[[1.8, 4.4, 3.3, 5.7], [0.2, 4.2, 2.4, 5.9], [1.0, 0], 0.1, 1.0], [True, [1.7, 4.3, 4.4, 5.8]]], [[[0.5, -1.0, 2.9, 0.8], [-2.4, -2.0, 6.0, 3.8], [-0.1, 0], 0.5, 2.0], [True, [-0.2, -1.5, 3.4, 1.3]]], [[[5.1, 1.0, 5.7, 2.0], [3.7, 0.2, 6.3, 3.2], [0.4, -0.2], 0.5, 1.0], [False, [3.7, 0.2, 6.3, 3.2]]], [[[-0.6, 3.3, 0.2, 3.6], [-1.6, 2.3, 1.2, 4.6], [0.1, 0.2], 0.1, 1.0], [True, [-0.7, 3.2, 0.4, 3.9]]], [[[-3.8, 3.7, -1.0, 4.9], [-6.9, 0.2, -0.1, 7.4], [0.1, 0.5], 0.5, 2.0], [False, [-6.9, 0.2, -0.1, 7.4]]], [[[-3.1, -1.2, -1.7, 0.6], [-3.7, -3.0, -1.1, 1.2], [0, 0.2], 0.1, 1.0], [False, [-3.7, -3.0, -1.1, 1.2]]], [[[-2.2, 1.4, -1.4, 1.7], [-2.8, 0.8, -0.8, 2.3], [0.1, 0], 0.2, 1.0], [False, [-2.8, 0.8, -0.8, 2.3]]]], [[[[-3.1, -1.6, -2.5, 1.2], [-3.0, -2.2, 1.1, 1.6], [-0.6, 0.1], 0.5, 2.0], [True, [-4.8, -2.1, -2.0, 1.9]]], [[[3.4, 1.4, 4.5, 3.4], [0.4, 1.4, 5.5, 4.9], [0, -1.0], 0.5, 2.0], [False, [0.4, 1.4, 5.5, 4.9]]], [[[-0.8, -3.1, 0.9, -1.9], [-4.8, -6.2, 2.9, -1.5], [1.0, 0.1], 0.5, 4.0], [False, [-4.8, -6.2, 2.9, -1.5]]], [[[1.8, 4.2, 3.2, 4.7], [2.2, 4.0, 4.2, 5.9], [-0.6, 0], 0.2, 1.0], [True, [1.0, 4.0, 3.4, 4.9]]], [[[-4.4, -0.8, -3.4, 0.6], [-7.3, -4.3, -0.3, 3.1], [-0.1, 0.5], 0.5, 4.0], [True, [-5.3, -1.3, -2.9, 3.1]]], [[[-0.1, -1.9, 1.0, -0.6], [-1.1, -2.4, 2.0, 0.4], [0.1, 0], 0.1, 1.0], [True, [-0.2, -2.0, 1.2, -0.5]]], [[[-4.4, 0.2, -2.9, 2.4], [-5.4, -2.8, -2.4, 5.4], [0, 0], 0.5, 2.0], [False, [-5.4, -2.8, -2.4, 5.4]]], [[[3.8, 0.5, 4.7, 2.1], [-0.2, -3.5, 8.7, 6.1], [-0.1, 0], 0.2, 1.0], [True, [3.5, 0.3, 4.9, 2.3]]]], [[[[4.7, -1.7, 5.8, -1.1], [3.2, -2.2, 5.8, -0.1], [1.0, 0], 0.5, 4.0], [False, [3.2, -2.2, 5.8, -0.1]]], [[[0.1, -2.7, 0.5, -2.0], [-0.9, -3.2, 1.5, -1.0], [0, 0], 0.1, 1.0], [True, [0.0, -2.8, 0.6, -1.9]]], [[[-0.2, -2.3, 1.0, -2.0], [-0.5, -3.2, 1.3, -1.7], [0.1, 0.2], 0.2, 1.0], [False, [-0.5, -3.2, 1.3, -1.7]]], [[[3.5, -3.3, 4.8, -0.6], [4.0, -4.4, 5.5, -0.9], [-0.6, 0.5], 0.1, 1.0], [True, [2.8, -3.4, 4.9, 0.0]]], [[[4.2, 3.7, 5.9, 4.3], [2.2, 1.7, 7.9, 6.3], [0.1, 0], 0.2, 1.0], [True, [4.0, 3.5, 6.2, 4.5]]], [[[-3.1, 3.5, -2.4, 4.0], [-3.7, 1.7, -1.8, 4.6], [0, 0], 0.1, 1.0], [True, [-3.2, 3.4, -2.3, 4.1]]], [[[-2.4, 0.9, -1.5, 1.9], [-4.8, -2.6, 2.1, 2.4], [-0.6, 0.5], 0.5, 4.0], [False, [-4.8, -2.6, 2.1, 2.4]]], [[[2.3, -3.0, 3.5, -2.7], [2.0, -3.3, 3.8, -2.4], [0.1, 0.2], 0.2, 1.0], [False, [2.0, -3.3, 3.8, -2.4]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("case %d" % 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
case 0[False, [-1.5, 2.0, 2.6, 8.5]][False, [-1.5, 2.0, 2.6, 8.5]]Passed
case 1[False, [-1.8, -1.1, 0.8, 1.6]][False, [-1.8, -1.1, 0.8, 1.6]]Passed
case 2[True, [0.4, -6.8, 2.9, -4.1]][True, [0.4, -6.8, 2.9, -4.1]]Passed
case 3[True, [-4.0, -3.5, -0.6, 0.1]][True, [-4.0, -3.5, -0.6, 0.1]]Passed
case 4[True, [-3.2, 1.6, -2.3, 3.4]][True, [-3.2, 1.6, -2.3, 3.4]]Passed
case 5[False, [-5.5, -0.9, 0.8, 4.3]][False, [-5.5, -0.9, 0.8, 4.3]]Passed
case 6[True, [-0.8, 1.5, 3.7, 5.5]][True, [-0.8, 1.5, 3.7, 5.5]]Passed
case 7[True, [1.6, -4.2, 4.6, -2.5]][True, [1.6, -4.2, 4.6, -2.5]]Passed

SHA-256 / 5000b1b35632896f0cbdc94d52d0a10deb9dde172a79a2b8366e7a2d135e4ef3

Verification & scope

A deterministic bounded teaching model with stipulated toy conventions; not a production physics engine or spatial index. 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:50:58.531808+00:00.

Case digest / 73d92892fe2f1bc7b5ede91f7aef76c2add5944adb35d3120062ad151bac0a1b