FAILURE MAP
← Case archive

FA-87716 / Collision detection broadphase / Open access

Moved-moved pairs are tested from both sides · case 01

Overlap tests double for moving crowds.

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

ROOT CAUSE

The ownership skip is missing.

VERIFIED REPAIR

Skip the pair from the smaller id when both moved.

Unsuccessful approach: Skipping after counting the test still pays for the duplicate test.

Case contract

solve(proxies, moved): dynamic-tree pair update. For each distinct moved proxy q (first occurrence order) test every other proxy p; skip p when p also moved and p>q (that pair is found from p). Count every overlap test performed; closed intervals. Return [sorted unique [min,max] pairs, test count].

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(proxies, moved):
    box = {p[0]: p for p in proxies}
    mv = set(moved)
    seen = set()
    raw = []
    tests = 0
    for q in moved:
        if q in seen:
            continue
        seen.add(q)
        a = box[q]
        for p in proxies:
            if p[0] == q:
                continue
            tests += 1
            if a[1] <= p[3] and p[1] <= a[3] and a[2] <= p[4] and p[2] <= a[4]:
                raw.append((min(q, p[0]), max(q, p[0])))
    pairs = sorted(set(raw))
    return [[list(x) for x in pairs], tests]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[36, 4.0, 5.0, 5.0, 6.0], [35, 3.0, 4.0, 4.0, 6.0]], [36, 36]], [[[35, 36]], 1]], [[[[8, 2.0, -1.0, 5.0, 1.0], [18, 5.0, 1.0, 6.0, 3.0], [6, 0.0, -5.0, 3.0, -4.0], [22, -4.0, 2.0, -1.0, 3.0], [13, -5.0, 4.0, -3.0, 7.0], [1, 2.0, -5.0, 4.0, -3.0]], [6, 6, 22]], [[[1, 6]], 9]], [[[[18, 3.0, 5.0, 3.0, 6.0], [29, 3.0, -2.0, 5.0, -1.0], [13, 1.0, -5.0, 1.0, -5.0], [31, 0.0, -5.0, 0.0, -2.0], [22, 4.0, 4.0, 6.0, 4.0], [12, 2.0, 3.0, 2.0, 5.0], [6, -4.0, -5.0, -4.0, -4.0]], [6, 6, 31, 18, 18]], [[], 15]], [[[[10, -2.0, 4.0, -2.0, 4.0], [9, 1.0, -4.0, 3.0, -2.0]], [10, 9, 9]], [[], 1]], [[[[9, -5.0, 4.0, -2.0, 5.0], [31, -1.0, 5.0, 1.0, 7.0], [28, -3.0, 3.0, -1.0, 4.0]], [28]], [[[9, 28]], 2]], [[[[9, -5.0, -2.0, -3.0, 0.0], [7, 4.0, 5.0, 4.0, 6.0], [37, -1.0, 2.0, -1.0, 4.0], [14, -5.0, -5.0, -4.0, -2.0], [31, 1.0, -4.0, 4.0, -1.0], [24, 2.0, -2.0, 3.0, -1.0]], [9, 37, 9, 7, 14]], [[[9, 14]], 14]], [[[[38, -2.0, 3.0, -1.0, 4.0], [17, 1.0, 3.0, 1.0, 3.0], [6, -3.0, -2.0, -2.0, -2.0], [7, 0.0, 1.0, 3.0, 4.0], [37, -5.0, -1.0, -3.0, 1.0], [2, 1.0, -5.0, 3.0, -4.0]], [38, 17, 6, 7]], [[[7, 17]], 14]], [[[[30, 5.0, 4.0, 8.0, 4.0], [39, 4.0, 1.0, 7.0, 2.0], [2, 5.0, -3.0, 6.0, -1.0], [3, 0.0, -5.0, 2.0, -5.0]], [3]], [[], 3]]], [[[[[26, -4.0, 4.0, -3.0, 6.0], [2, -1.0, -4.0, 0.0, -1.0]], [26]], [[], 1]], [[[[28, 4.0, -3.0, 4.0, 0.0], [27, -4.0, -5.0, -2.0, -5.0], [11, 1.0, 1.0, 3.0, 3.0]], [11]], [[], 2]], [[[[23, -5.0, 0.0, -5.0, 1.0], [1, -3.0, 2.0, 0.0, 5.0]], [23, 1, 23, 1, 23]], [[], 1]], [[[[37, 3.0, 0.0, 3.0, 1.0], [1, 1.0, -4.0, 2.0, -2.0]], [37, 37, 1, 37]], [[], 1]], [[[[6, 0.0, -1.0, 3.0, 2.0], [2, -3.0, 4.0, -1.0, 5.0], [37, 1.0, 4.0, 2.0, 7.0], [4, -4.0, -2.0, -2.0, -1.0], [17, 4.0, -1.0, 5.0, 2.0], [34, -1.0, -3.0, -1.0, -1.0]], [4, 2]], [[], 9]], [[[[26, 4.0, -2.0, 6.0, -1.0], [12, 4.0, -1.0, 6.0, 1.0], [20, -3.0, 4.0, -1.0, 4.0], [1, 4.0, 4.0, 4.0, 5.0]], [20, 20, 26, 1, 26]], [[[12, 26]], 6]], [[[[4, -4.0, -3.0, -3.0, -3.0], [13, 1.0, -4.0, 1.0, -2.0], [37, -3.0, -4.0, -3.0, -4.0]], [37]], [[], 2]], [[[[21, -1.0, 4.0, 2.0, 4.0], [11, -4.0, 2.0, -4.0, 2.0]], [21, 11]], [[], 1]]], [[[[[10, -5.0, 4.0, -4.0, 7.0], [32, 2.0, 5.0, 4.0, 8.0], [31, 5.0, 2.0, 5.0, 4.0], [18, -4.0, 0.0, -1.0, 3.0], [30, -3.0, -1.0, -1.0, 1.0], [2, -5.0, 5.0, -4.0, 7.0]], [2, 2, 18, 2, 2]], [[[2, 10], [18, 30]], 9]], [[[[30, 3.0, 3.0, 3.0, 6.0], [29, -4.0, 0.0, -3.0, 0.0], [36, 5.0, -4.0, 8.0, -4.0], [35, 2.0, 2.0, 4.0, 3.0], [31, 2.0, 4.0, 5.0, 5.0], [9, 3.0, 2.0, 4.0, 3.0], [14, 1.0, 1.0, 2.0, 4.0], [12, -4.0, -3.0, -2.0, 0.0]], [29, 36, 31, 14]], [[[12, 29], [14, 31], [14, 35], [30, 31]], 22]], [[[[20, -5.0, 1.0, -3.0, 2.0], [7, 1.0, 0.0, 2.0, 1.0], [8, 1.0, -3.0, 2.0, -1.0], [3, -4.0, -1.0, -4.0, 2.0], [19, 2.0, -4.0, 3.0, -2.0], [32, 1.0, 0.0, 3.0, 3.0], [35, -2.0, -1.0, 1.0, 0.0], [18, -5.0, -2.0, -4.0, -1.0]], [32]], [[[7, 32], [32, 35]], 7]], [[[[2, -3.0, 5.0, -2.0, 6.0], [7, 4.0, -1.0, 7.0, -1.0]], [7, 2]], [[], 1]], [[[[5, 5.0, 5.0, 8.0, 7.0], [26, 4.0, -4.0, 6.0, -4.0], [1, 0.0, 2.0, 2.0, 4.0]], [1]], [[], 2]], [[[[4, 4.0, -5.0, 6.0, -4.0], [38, -3.0, -3.0, -3.0, 0.0], [31, 4.0, 4.0, 5.0, 7.0], [28, 4.0, 3.0, 7.0, 3.0], [30, -4.0, 0.0, -1.0, 1.0], [3, 3.0, -5.0, 3.0, -5.0], [36, -4.0, -5.0, -2.0, -3.0], [10, 2.0, 1.0, 2.0, 3.0], [6, -5.0, 1.0, -4.0, 2.0]], [31, 10, 30, 10]], [[[6, 30], [30, 38]], 21]], [[[[28, -2.0, -4.0, 1.0, -4.0], [6, 4.0, 3.0, 5.0, 3.0], [3, -1.0, 3.0, 2.0, 5.0], [26, 3.0, 0.0, 4.0, 2.0], [21, -5.0, -3.0, -2.0, -3.0], [22, -5.0, -3.0, -2.0, -2.0], [36, -3.0, -1.0, -2.0, 2.0]], [3, 28, 6, 21, 21]], [[[21, 22]], 18]], [[[[3, -2.0, -2.0, 1.0, 0.0], [8, 2.0, -3.0, 5.0, -2.0], [24, -1.0, -2.0, 0.0, 1.0], [38, -4.0, -1.0, -4.0, 2.0]], [3]], [[[3, 24]], 3]]], [[[[[13, -2.0, 3.0, 0.0, 3.0], [16, 4.0, -5.0, 4.0, -3.0]], [16, 13, 13, 13]], [[], 1]], [[[[23, 2.0, -2.0, 5.0, -2.0], [27, 2.0, 4.0, 2.0, 7.0], [5, 4.0, 2.0, 5.0, 2.0], [7, -2.0, 1.0, -2.0, 3.0], [35, 0.0, 0.0, 3.0, 3.0], [2, 5.0, -4.0, 7.0, -1.0], [26, -2.0, 4.0, -1.0, 7.0]], [26, 27, 23, 27, 7]], [[[2, 23]], 18]], [[[[20, -1.0, -2.0, 1.0, -2.0], [26, 4.0, -4.0, 6.0, -1.0], [28, 4.0, -3.0, 4.0, -3.0], [10, 4.0, -5.0, 5.0, -5.0], [13, 4.0, 3.0, 5.0, 6.0], [17, -4.0, -5.0, -4.0, -5.0], [29, 5.0, -4.0, 8.0, -4.0], [32, 3.0, -4.0, 4.0, -3.0]], [28]], [[[26, 28], [28, 32]], 7]], [[[[35, 5.0, 5.0, 8.0, 6.0], [39, -4.0, -4.0, -3.0, -4.0], [32, 1.0, 1.0, 2.0, 3.0], [26, -5.0, 0.0, -5.0, 1.0], [23, -2.0, 1.0, -2.0, 2.0], [13, -3.0, -3.0, -1.0, 0.0], [1, 5.0, 0.0, 5.0, 3.0], [34, 3.0, -2.0, 5.0, -1.0]], [39]], [[], 7]], [[[[8, 2.0, 4.0, 5.0, 4.0], [26, -1.0, 2.0, -1.0, 2.0], [5, 4.0, 3.0, 4.0, 4.0], [16, -3.0, 0.0, -1.0, 1.0], [4, 0.0, 1.0, 3.0, 4.0], [34, 3.0, -3.0, 5.0, -2.0], [17, 4.0, -1.0, 5.0, -1.0], [31, 0.0, 1.0, 0.0, 4.0], [3, -4.0, -5.0, -1.0, -4.0]], [5]], [[[5, 8]], 8]], [[[[9, 2.0, 4.0, 2.0, 5.0], [16, 3.0, -4.0, 3.0, -1.0], [37, 0.0, -5.0, 2.0, -5.0], [23, -5.0, -1.0, -5.0, 1.0], [33, 0.0, -3.0, 1.0, -3.0], [12, 1.0, 3.0, 1.0, 5.0], [17, 1.0, -3.0, 3.0, -2.0], [7, 1.0, 0.0, 1.0, 2.0]], [33, 37, 7]], [[[17, 33]], 18]], [[[[23, -2.0, -4.0, 1.0, -1.0], [16, -3.0, -4.0, -2.0, -2.0], [25, 5.0, 1.0, 8.0, 2.0], [3, 3.0, 4.0, 4.0, 5.0], [8, 0.0, 0.0, 0.0, 2.0], [13, -1.0, -3.0, 1.0, 0.0], [19, -1.0, -3.0, 2.0, -3.0], [28, -2.0, 2.0, -2.0, 4.0], [29, -5.0, 2.0, -3.0, 2.0]], [8]], [[[8, 13]], 8]], [[[[9, 1.0, -4.0, 2.0, -1.0], [14, 1.0, -5.0, 4.0, -2.0], [4, -2.0, 4.0, 0.0, 6.0], [29, 3.0, 1.0, 3.0, 2.0], [23, 1.0, 2.0, 3.0, 4.0]], [29, 29, 23, 4, 14]], [[[9, 14], [23, 29]], 10]]], [[[[[10, -3.0, -1.0, -2.0, 2.0], [9, 3.0, -3.0, 5.0, 0.0], [30, -1.0, 5.0, 1.0, 7.0], [14, -5.0, -2.0, -4.0, 1.0], [18, 5.0, 4.0, 7.0, 5.0], [7, 4.0, 5.0, 5.0, 5.0], [11, 3.0, 0.0, 5.0, 1.0], [22, -2.0, -4.0, -2.0, -1.0], [21, -1.0, 2.0, 2.0, 2.0]], [11, 7, 10, 10]], [[[7, 18], [9, 11], [10, 22]], 21]], [[[[35, -3.0, -1.0, -2.0, 0.0], [39, 3.0, -3.0, 6.0, 0.0], [20, 1.0, 0.0, 3.0, 0.0], [33, 1.0, 2.0, 2.0, 5.0], [18, 2.0, 3.0, 5.0, 3.0], [14, -1.0, 2.0, 2.0, 2.0]], [33, 14]], [[[14, 33], [18, 33]], 9]], [[[[5, -2.0, -5.0, -2.0, -2.0], [19, 0.0, 5.0, 2.0, 6.0], [13, 4.0, -5.0, 5.0, -3.0], [15, -4.0, 2.0, -4.0, 4.0], [27, 5.0, -3.0, 8.0, 0.0], [25, -3.0, -3.0, 0.0, -1.0], [4, 1.0, -5.0, 2.0, -2.0]], [5, 4]], [[[5, 25]], 11]], [[[[35, 2.0, -2.0, 3.0, 1.0], [31, -3.0, -1.0, -2.0, -1.0], [3, -1.0, 0.0, 2.0, 0.0], [6, 5.0, 0.0, 8.0, 1.0], [27, 0.0, -4.0, 0.0, -2.0], [34, 4.0, 1.0, 4.0, 1.0], [5, -1.0, 4.0, -1.0, 5.0], [8, -2.0, 5.0, -2.0, 8.0]], [3]], [[[3, 35]], 7]], [[[[6, 2.0, -3.0, 4.0, -1.0], [25, 3.0, 4.0, 3.0, 6.0], [34, 2.0, 3.0, 2.0, 6.0], [1, 0.0, -3.0, 2.0, -1.0], [7, 1.0, 5.0, 1.0, 6.0], [16, -3.0, -2.0, -1.0, 1.0]], [6]], [[[1, 6]], 5]], [[[[17, 1.0, -1.0, 4.0, 0.0], [1, -3.0, 3.0, -2.0, 5.0], [38, 0.0, 4.0, 1.0, 6.0], [20, -5.0, -5.0, -3.0, -3.0], [27, 0.0, -4.0, 3.0, -4.0], [28, -4.0, 4.0, -2.0, 5.0], [3, -2.0, -5.0, -1.0, -2.0], [35, -1.0, 3.0, 2.0, 5.0]], [28, 28, 27, 27, 35]], [[[1, 28], [35, 38]], 18]], [[[[2, 1.0, 1.0, 4.0, 3.0], [4, -3.0, -2.0, -1.0, -2.0], [15, 5.0, -3.0, 7.0, 0.0], [27, -2.0, 3.0, -1.0, 6.0]], [15]], [[], 3]], [[[[24, 5.0, 3.0, 6.0, 5.0], [36, -4.0, -5.0, -3.0, -5.0]], [36, 24, 24, 36, 24]], [[], 1]]]]
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[[[35, 36]], 1][[[35, 36]], 1]Passed
case 1[[[1, 6]], 10][[[1, 6]], 9]Failed
case 2[[], 18][[], 15]Failed
case 3[[], 2][[], 1]Failed
case 4[[[9, 28]], 2][[[9, 28]], 2]Passed
case 5[[[9, 14]], 20][[[9, 14]], 14]Failed
case 6[[[7, 17]], 20][[[7, 17]], 14]Failed
case 7[[], 3][[], 3]Passed

SHA-256 / ae261f012fefca84e28b2592c21c5bfb7a0592a262547992d2451cd7869f93b0

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(proxies, moved):
    box = {p[0]: p for p in proxies}
    mv = set(moved)
    seen = set()
    raw = []
    tests = 0
    for q in moved:
        if q in seen:
            continue
        seen.add(q)
        a = box[q]
        for p in proxies:
            if p[0] == q:
                continue
            tests += 1
            if p[0] in mv and p[0] > q:
                continue
            if a[1] <= p[3] and p[1] <= a[3] and a[2] <= p[4] and p[2] <= a[4]:
                raw.append((min(q, p[0]), max(q, p[0])))
    pairs = sorted(set(raw))
    return [[list(x) for x in pairs], tests]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[36, 4.0, 5.0, 5.0, 6.0], [35, 3.0, 4.0, 4.0, 6.0]], [36, 36]], [[[35, 36]], 1]], [[[[8, 2.0, -1.0, 5.0, 1.0], [18, 5.0, 1.0, 6.0, 3.0], [6, 0.0, -5.0, 3.0, -4.0], [22, -4.0, 2.0, -1.0, 3.0], [13, -5.0, 4.0, -3.0, 7.0], [1, 2.0, -5.0, 4.0, -3.0]], [6, 6, 22]], [[[1, 6]], 9]], [[[[18, 3.0, 5.0, 3.0, 6.0], [29, 3.0, -2.0, 5.0, -1.0], [13, 1.0, -5.0, 1.0, -5.0], [31, 0.0, -5.0, 0.0, -2.0], [22, 4.0, 4.0, 6.0, 4.0], [12, 2.0, 3.0, 2.0, 5.0], [6, -4.0, -5.0, -4.0, -4.0]], [6, 6, 31, 18, 18]], [[], 15]], [[[[10, -2.0, 4.0, -2.0, 4.0], [9, 1.0, -4.0, 3.0, -2.0]], [10, 9, 9]], [[], 1]], [[[[9, -5.0, 4.0, -2.0, 5.0], [31, -1.0, 5.0, 1.0, 7.0], [28, -3.0, 3.0, -1.0, 4.0]], [28]], [[[9, 28]], 2]], [[[[9, -5.0, -2.0, -3.0, 0.0], [7, 4.0, 5.0, 4.0, 6.0], [37, -1.0, 2.0, -1.0, 4.0], [14, -5.0, -5.0, -4.0, -2.0], [31, 1.0, -4.0, 4.0, -1.0], [24, 2.0, -2.0, 3.0, -1.0]], [9, 37, 9, 7, 14]], [[[9, 14]], 14]], [[[[38, -2.0, 3.0, -1.0, 4.0], [17, 1.0, 3.0, 1.0, 3.0], [6, -3.0, -2.0, -2.0, -2.0], [7, 0.0, 1.0, 3.0, 4.0], [37, -5.0, -1.0, -3.0, 1.0], [2, 1.0, -5.0, 3.0, -4.0]], [38, 17, 6, 7]], [[[7, 17]], 14]], [[[[30, 5.0, 4.0, 8.0, 4.0], [39, 4.0, 1.0, 7.0, 2.0], [2, 5.0, -3.0, 6.0, -1.0], [3, 0.0, -5.0, 2.0, -5.0]], [3]], [[], 3]]], [[[[[26, -4.0, 4.0, -3.0, 6.0], [2, -1.0, -4.0, 0.0, -1.0]], [26]], [[], 1]], [[[[28, 4.0, -3.0, 4.0, 0.0], [27, -4.0, -5.0, -2.0, -5.0], [11, 1.0, 1.0, 3.0, 3.0]], [11]], [[], 2]], [[[[23, -5.0, 0.0, -5.0, 1.0], [1, -3.0, 2.0, 0.0, 5.0]], [23, 1, 23, 1, 23]], [[], 1]], [[[[37, 3.0, 0.0, 3.0, 1.0], [1, 1.0, -4.0, 2.0, -2.0]], [37, 37, 1, 37]], [[], 1]], [[[[6, 0.0, -1.0, 3.0, 2.0], [2, -3.0, 4.0, -1.0, 5.0], [37, 1.0, 4.0, 2.0, 7.0], [4, -4.0, -2.0, -2.0, -1.0], [17, 4.0, -1.0, 5.0, 2.0], [34, -1.0, -3.0, -1.0, -1.0]], [4, 2]], [[], 9]], [[[[26, 4.0, -2.0, 6.0, -1.0], [12, 4.0, -1.0, 6.0, 1.0], [20, -3.0, 4.0, -1.0, 4.0], [1, 4.0, 4.0, 4.0, 5.0]], [20, 20, 26, 1, 26]], [[[12, 26]], 6]], [[[[4, -4.0, -3.0, -3.0, -3.0], [13, 1.0, -4.0, 1.0, -2.0], [37, -3.0, -4.0, -3.0, -4.0]], [37]], [[], 2]], [[[[21, -1.0, 4.0, 2.0, 4.0], [11, -4.0, 2.0, -4.0, 2.0]], [21, 11]], [[], 1]]], [[[[[10, -5.0, 4.0, -4.0, 7.0], [32, 2.0, 5.0, 4.0, 8.0], [31, 5.0, 2.0, 5.0, 4.0], [18, -4.0, 0.0, -1.0, 3.0], [30, -3.0, -1.0, -1.0, 1.0], [2, -5.0, 5.0, -4.0, 7.0]], [2, 2, 18, 2, 2]], [[[2, 10], [18, 30]], 9]], [[[[30, 3.0, 3.0, 3.0, 6.0], [29, -4.0, 0.0, -3.0, 0.0], [36, 5.0, -4.0, 8.0, -4.0], [35, 2.0, 2.0, 4.0, 3.0], [31, 2.0, 4.0, 5.0, 5.0], [9, 3.0, 2.0, 4.0, 3.0], [14, 1.0, 1.0, 2.0, 4.0], [12, -4.0, -3.0, -2.0, 0.0]], [29, 36, 31, 14]], [[[12, 29], [14, 31], [14, 35], [30, 31]], 22]], [[[[20, -5.0, 1.0, -3.0, 2.0], [7, 1.0, 0.0, 2.0, 1.0], [8, 1.0, -3.0, 2.0, -1.0], [3, -4.0, -1.0, -4.0, 2.0], [19, 2.0, -4.0, 3.0, -2.0], [32, 1.0, 0.0, 3.0, 3.0], [35, -2.0, -1.0, 1.0, 0.0], [18, -5.0, -2.0, -4.0, -1.0]], [32]], [[[7, 32], [32, 35]], 7]], [[[[2, -3.0, 5.0, -2.0, 6.0], [7, 4.0, -1.0, 7.0, -1.0]], [7, 2]], [[], 1]], [[[[5, 5.0, 5.0, 8.0, 7.0], [26, 4.0, -4.0, 6.0, -4.0], [1, 0.0, 2.0, 2.0, 4.0]], [1]], [[], 2]], [[[[4, 4.0, -5.0, 6.0, -4.0], [38, -3.0, -3.0, -3.0, 0.0], [31, 4.0, 4.0, 5.0, 7.0], [28, 4.0, 3.0, 7.0, 3.0], [30, -4.0, 0.0, -1.0, 1.0], [3, 3.0, -5.0, 3.0, -5.0], [36, -4.0, -5.0, -2.0, -3.0], [10, 2.0, 1.0, 2.0, 3.0], [6, -5.0, 1.0, -4.0, 2.0]], [31, 10, 30, 10]], [[[6, 30], [30, 38]], 21]], [[[[28, -2.0, -4.0, 1.0, -4.0], [6, 4.0, 3.0, 5.0, 3.0], [3, -1.0, 3.0, 2.0, 5.0], [26, 3.0, 0.0, 4.0, 2.0], [21, -5.0, -3.0, -2.0, -3.0], [22, -5.0, -3.0, -2.0, -2.0], [36, -3.0, -1.0, -2.0, 2.0]], [3, 28, 6, 21, 21]], [[[21, 22]], 18]], [[[[3, -2.0, -2.0, 1.0, 0.0], [8, 2.0, -3.0, 5.0, -2.0], [24, -1.0, -2.0, 0.0, 1.0], [38, -4.0, -1.0, -4.0, 2.0]], [3]], [[[3, 24]], 3]]], [[[[[13, -2.0, 3.0, 0.0, 3.0], [16, 4.0, -5.0, 4.0, -3.0]], [16, 13, 13, 13]], [[], 1]], [[[[23, 2.0, -2.0, 5.0, -2.0], [27, 2.0, 4.0, 2.0, 7.0], [5, 4.0, 2.0, 5.0, 2.0], [7, -2.0, 1.0, -2.0, 3.0], [35, 0.0, 0.0, 3.0, 3.0], [2, 5.0, -4.0, 7.0, -1.0], [26, -2.0, 4.0, -1.0, 7.0]], [26, 27, 23, 27, 7]], [[[2, 23]], 18]], [[[[20, -1.0, -2.0, 1.0, -2.0], [26, 4.0, -4.0, 6.0, -1.0], [28, 4.0, -3.0, 4.0, -3.0], [10, 4.0, -5.0, 5.0, -5.0], [13, 4.0, 3.0, 5.0, 6.0], [17, -4.0, -5.0, -4.0, -5.0], [29, 5.0, -4.0, 8.0, -4.0], [32, 3.0, -4.0, 4.0, -3.0]], [28]], [[[26, 28], [28, 32]], 7]], [[[[35, 5.0, 5.0, 8.0, 6.0], [39, -4.0, -4.0, -3.0, -4.0], [32, 1.0, 1.0, 2.0, 3.0], [26, -5.0, 0.0, -5.0, 1.0], [23, -2.0, 1.0, -2.0, 2.0], [13, -3.0, -3.0, -1.0, 0.0], [1, 5.0, 0.0, 5.0, 3.0], [34, 3.0, -2.0, 5.0, -1.0]], [39]], [[], 7]], [[[[8, 2.0, 4.0, 5.0, 4.0], [26, -1.0, 2.0, -1.0, 2.0], [5, 4.0, 3.0, 4.0, 4.0], [16, -3.0, 0.0, -1.0, 1.0], [4, 0.0, 1.0, 3.0, 4.0], [34, 3.0, -3.0, 5.0, -2.0], [17, 4.0, -1.0, 5.0, -1.0], [31, 0.0, 1.0, 0.0, 4.0], [3, -4.0, -5.0, -1.0, -4.0]], [5]], [[[5, 8]], 8]], [[[[9, 2.0, 4.0, 2.0, 5.0], [16, 3.0, -4.0, 3.0, -1.0], [37, 0.0, -5.0, 2.0, -5.0], [23, -5.0, -1.0, -5.0, 1.0], [33, 0.0, -3.0, 1.0, -3.0], [12, 1.0, 3.0, 1.0, 5.0], [17, 1.0, -3.0, 3.0, -2.0], [7, 1.0, 0.0, 1.0, 2.0]], [33, 37, 7]], [[[17, 33]], 18]], [[[[23, -2.0, -4.0, 1.0, -1.0], [16, -3.0, -4.0, -2.0, -2.0], [25, 5.0, 1.0, 8.0, 2.0], [3, 3.0, 4.0, 4.0, 5.0], [8, 0.0, 0.0, 0.0, 2.0], [13, -1.0, -3.0, 1.0, 0.0], [19, -1.0, -3.0, 2.0, -3.0], [28, -2.0, 2.0, -2.0, 4.0], [29, -5.0, 2.0, -3.0, 2.0]], [8]], [[[8, 13]], 8]], [[[[9, 1.0, -4.0, 2.0, -1.0], [14, 1.0, -5.0, 4.0, -2.0], [4, -2.0, 4.0, 0.0, 6.0], [29, 3.0, 1.0, 3.0, 2.0], [23, 1.0, 2.0, 3.0, 4.0]], [29, 29, 23, 4, 14]], [[[9, 14], [23, 29]], 10]]], [[[[[10, -3.0, -1.0, -2.0, 2.0], [9, 3.0, -3.0, 5.0, 0.0], [30, -1.0, 5.0, 1.0, 7.0], [14, -5.0, -2.0, -4.0, 1.0], [18, 5.0, 4.0, 7.0, 5.0], [7, 4.0, 5.0, 5.0, 5.0], [11, 3.0, 0.0, 5.0, 1.0], [22, -2.0, -4.0, -2.0, -1.0], [21, -1.0, 2.0, 2.0, 2.0]], [11, 7, 10, 10]], [[[7, 18], [9, 11], [10, 22]], 21]], [[[[35, -3.0, -1.0, -2.0, 0.0], [39, 3.0, -3.0, 6.0, 0.0], [20, 1.0, 0.0, 3.0, 0.0], [33, 1.0, 2.0, 2.0, 5.0], [18, 2.0, 3.0, 5.0, 3.0], [14, -1.0, 2.0, 2.0, 2.0]], [33, 14]], [[[14, 33], [18, 33]], 9]], [[[[5, -2.0, -5.0, -2.0, -2.0], [19, 0.0, 5.0, 2.0, 6.0], [13, 4.0, -5.0, 5.0, -3.0], [15, -4.0, 2.0, -4.0, 4.0], [27, 5.0, -3.0, 8.0, 0.0], [25, -3.0, -3.0, 0.0, -1.0], [4, 1.0, -5.0, 2.0, -2.0]], [5, 4]], [[[5, 25]], 11]], [[[[35, 2.0, -2.0, 3.0, 1.0], [31, -3.0, -1.0, -2.0, -1.0], [3, -1.0, 0.0, 2.0, 0.0], [6, 5.0, 0.0, 8.0, 1.0], [27, 0.0, -4.0, 0.0, -2.0], [34, 4.0, 1.0, 4.0, 1.0], [5, -1.0, 4.0, -1.0, 5.0], [8, -2.0, 5.0, -2.0, 8.0]], [3]], [[[3, 35]], 7]], [[[[6, 2.0, -3.0, 4.0, -1.0], [25, 3.0, 4.0, 3.0, 6.0], [34, 2.0, 3.0, 2.0, 6.0], [1, 0.0, -3.0, 2.0, -1.0], [7, 1.0, 5.0, 1.0, 6.0], [16, -3.0, -2.0, -1.0, 1.0]], [6]], [[[1, 6]], 5]], [[[[17, 1.0, -1.0, 4.0, 0.0], [1, -3.0, 3.0, -2.0, 5.0], [38, 0.0, 4.0, 1.0, 6.0], [20, -5.0, -5.0, -3.0, -3.0], [27, 0.0, -4.0, 3.0, -4.0], [28, -4.0, 4.0, -2.0, 5.0], [3, -2.0, -5.0, -1.0, -2.0], [35, -1.0, 3.0, 2.0, 5.0]], [28, 28, 27, 27, 35]], [[[1, 28], [35, 38]], 18]], [[[[2, 1.0, 1.0, 4.0, 3.0], [4, -3.0, -2.0, -1.0, -2.0], [15, 5.0, -3.0, 7.0, 0.0], [27, -2.0, 3.0, -1.0, 6.0]], [15]], [[], 3]], [[[[24, 5.0, 3.0, 6.0, 5.0], [36, -4.0, -5.0, -3.0, -5.0]], [36, 24, 24, 36, 24]], [[], 1]]]]
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[[[35, 36]], 1][[[35, 36]], 1]Passed
case 1[[[1, 6]], 10][[[1, 6]], 9]Failed
case 2[[], 18][[], 15]Failed
case 3[[], 2][[], 1]Failed
case 4[[[9, 28]], 2][[[9, 28]], 2]Passed
case 5[[[9, 14]], 20][[[9, 14]], 14]Failed
case 6[[[7, 17]], 20][[[7, 17]], 14]Failed
case 7[[], 3][[], 3]Passed

SHA-256 / 2e7587d5b438e10486faf2fe8a1eb3d72e01caef66dc14323031b1230f2a7a35

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(proxies, moved):
    box = {p[0]: p for p in proxies}
    mv = set(moved)
    seen = set()
    raw = []
    tests = 0
    for q in moved:
        if q in seen:
            continue
        seen.add(q)
        a = box[q]
        for p in proxies:
            if p[0] == q:
                continue
            if p[0] in mv and p[0] > q:
                continue
            tests += 1
            if a[1] <= p[3] and p[1] <= a[3] and a[2] <= p[4] and p[2] <= a[4]:
                raw.append((min(q, p[0]), max(q, p[0])))
    pairs = sorted(set(raw))
    return [[list(x) for x in pairs], tests]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[36, 4.0, 5.0, 5.0, 6.0], [35, 3.0, 4.0, 4.0, 6.0]], [36, 36]], [[[35, 36]], 1]], [[[[8, 2.0, -1.0, 5.0, 1.0], [18, 5.0, 1.0, 6.0, 3.0], [6, 0.0, -5.0, 3.0, -4.0], [22, -4.0, 2.0, -1.0, 3.0], [13, -5.0, 4.0, -3.0, 7.0], [1, 2.0, -5.0, 4.0, -3.0]], [6, 6, 22]], [[[1, 6]], 9]], [[[[18, 3.0, 5.0, 3.0, 6.0], [29, 3.0, -2.0, 5.0, -1.0], [13, 1.0, -5.0, 1.0, -5.0], [31, 0.0, -5.0, 0.0, -2.0], [22, 4.0, 4.0, 6.0, 4.0], [12, 2.0, 3.0, 2.0, 5.0], [6, -4.0, -5.0, -4.0, -4.0]], [6, 6, 31, 18, 18]], [[], 15]], [[[[10, -2.0, 4.0, -2.0, 4.0], [9, 1.0, -4.0, 3.0, -2.0]], [10, 9, 9]], [[], 1]], [[[[9, -5.0, 4.0, -2.0, 5.0], [31, -1.0, 5.0, 1.0, 7.0], [28, -3.0, 3.0, -1.0, 4.0]], [28]], [[[9, 28]], 2]], [[[[9, -5.0, -2.0, -3.0, 0.0], [7, 4.0, 5.0, 4.0, 6.0], [37, -1.0, 2.0, -1.0, 4.0], [14, -5.0, -5.0, -4.0, -2.0], [31, 1.0, -4.0, 4.0, -1.0], [24, 2.0, -2.0, 3.0, -1.0]], [9, 37, 9, 7, 14]], [[[9, 14]], 14]], [[[[38, -2.0, 3.0, -1.0, 4.0], [17, 1.0, 3.0, 1.0, 3.0], [6, -3.0, -2.0, -2.0, -2.0], [7, 0.0, 1.0, 3.0, 4.0], [37, -5.0, -1.0, -3.0, 1.0], [2, 1.0, -5.0, 3.0, -4.0]], [38, 17, 6, 7]], [[[7, 17]], 14]], [[[[30, 5.0, 4.0, 8.0, 4.0], [39, 4.0, 1.0, 7.0, 2.0], [2, 5.0, -3.0, 6.0, -1.0], [3, 0.0, -5.0, 2.0, -5.0]], [3]], [[], 3]]], [[[[[26, -4.0, 4.0, -3.0, 6.0], [2, -1.0, -4.0, 0.0, -1.0]], [26]], [[], 1]], [[[[28, 4.0, -3.0, 4.0, 0.0], [27, -4.0, -5.0, -2.0, -5.0], [11, 1.0, 1.0, 3.0, 3.0]], [11]], [[], 2]], [[[[23, -5.0, 0.0, -5.0, 1.0], [1, -3.0, 2.0, 0.0, 5.0]], [23, 1, 23, 1, 23]], [[], 1]], [[[[37, 3.0, 0.0, 3.0, 1.0], [1, 1.0, -4.0, 2.0, -2.0]], [37, 37, 1, 37]], [[], 1]], [[[[6, 0.0, -1.0, 3.0, 2.0], [2, -3.0, 4.0, -1.0, 5.0], [37, 1.0, 4.0, 2.0, 7.0], [4, -4.0, -2.0, -2.0, -1.0], [17, 4.0, -1.0, 5.0, 2.0], [34, -1.0, -3.0, -1.0, -1.0]], [4, 2]], [[], 9]], [[[[26, 4.0, -2.0, 6.0, -1.0], [12, 4.0, -1.0, 6.0, 1.0], [20, -3.0, 4.0, -1.0, 4.0], [1, 4.0, 4.0, 4.0, 5.0]], [20, 20, 26, 1, 26]], [[[12, 26]], 6]], [[[[4, -4.0, -3.0, -3.0, -3.0], [13, 1.0, -4.0, 1.0, -2.0], [37, -3.0, -4.0, -3.0, -4.0]], [37]], [[], 2]], [[[[21, -1.0, 4.0, 2.0, 4.0], [11, -4.0, 2.0, -4.0, 2.0]], [21, 11]], [[], 1]]], [[[[[10, -5.0, 4.0, -4.0, 7.0], [32, 2.0, 5.0, 4.0, 8.0], [31, 5.0, 2.0, 5.0, 4.0], [18, -4.0, 0.0, -1.0, 3.0], [30, -3.0, -1.0, -1.0, 1.0], [2, -5.0, 5.0, -4.0, 7.0]], [2, 2, 18, 2, 2]], [[[2, 10], [18, 30]], 9]], [[[[30, 3.0, 3.0, 3.0, 6.0], [29, -4.0, 0.0, -3.0, 0.0], [36, 5.0, -4.0, 8.0, -4.0], [35, 2.0, 2.0, 4.0, 3.0], [31, 2.0, 4.0, 5.0, 5.0], [9, 3.0, 2.0, 4.0, 3.0], [14, 1.0, 1.0, 2.0, 4.0], [12, -4.0, -3.0, -2.0, 0.0]], [29, 36, 31, 14]], [[[12, 29], [14, 31], [14, 35], [30, 31]], 22]], [[[[20, -5.0, 1.0, -3.0, 2.0], [7, 1.0, 0.0, 2.0, 1.0], [8, 1.0, -3.0, 2.0, -1.0], [3, -4.0, -1.0, -4.0, 2.0], [19, 2.0, -4.0, 3.0, -2.0], [32, 1.0, 0.0, 3.0, 3.0], [35, -2.0, -1.0, 1.0, 0.0], [18, -5.0, -2.0, -4.0, -1.0]], [32]], [[[7, 32], [32, 35]], 7]], [[[[2, -3.0, 5.0, -2.0, 6.0], [7, 4.0, -1.0, 7.0, -1.0]], [7, 2]], [[], 1]], [[[[5, 5.0, 5.0, 8.0, 7.0], [26, 4.0, -4.0, 6.0, -4.0], [1, 0.0, 2.0, 2.0, 4.0]], [1]], [[], 2]], [[[[4, 4.0, -5.0, 6.0, -4.0], [38, -3.0, -3.0, -3.0, 0.0], [31, 4.0, 4.0, 5.0, 7.0], [28, 4.0, 3.0, 7.0, 3.0], [30, -4.0, 0.0, -1.0, 1.0], [3, 3.0, -5.0, 3.0, -5.0], [36, -4.0, -5.0, -2.0, -3.0], [10, 2.0, 1.0, 2.0, 3.0], [6, -5.0, 1.0, -4.0, 2.0]], [31, 10, 30, 10]], [[[6, 30], [30, 38]], 21]], [[[[28, -2.0, -4.0, 1.0, -4.0], [6, 4.0, 3.0, 5.0, 3.0], [3, -1.0, 3.0, 2.0, 5.0], [26, 3.0, 0.0, 4.0, 2.0], [21, -5.0, -3.0, -2.0, -3.0], [22, -5.0, -3.0, -2.0, -2.0], [36, -3.0, -1.0, -2.0, 2.0]], [3, 28, 6, 21, 21]], [[[21, 22]], 18]], [[[[3, -2.0, -2.0, 1.0, 0.0], [8, 2.0, -3.0, 5.0, -2.0], [24, -1.0, -2.0, 0.0, 1.0], [38, -4.0, -1.0, -4.0, 2.0]], [3]], [[[3, 24]], 3]]], [[[[[13, -2.0, 3.0, 0.0, 3.0], [16, 4.0, -5.0, 4.0, -3.0]], [16, 13, 13, 13]], [[], 1]], [[[[23, 2.0, -2.0, 5.0, -2.0], [27, 2.0, 4.0, 2.0, 7.0], [5, 4.0, 2.0, 5.0, 2.0], [7, -2.0, 1.0, -2.0, 3.0], [35, 0.0, 0.0, 3.0, 3.0], [2, 5.0, -4.0, 7.0, -1.0], [26, -2.0, 4.0, -1.0, 7.0]], [26, 27, 23, 27, 7]], [[[2, 23]], 18]], [[[[20, -1.0, -2.0, 1.0, -2.0], [26, 4.0, -4.0, 6.0, -1.0], [28, 4.0, -3.0, 4.0, -3.0], [10, 4.0, -5.0, 5.0, -5.0], [13, 4.0, 3.0, 5.0, 6.0], [17, -4.0, -5.0, -4.0, -5.0], [29, 5.0, -4.0, 8.0, -4.0], [32, 3.0, -4.0, 4.0, -3.0]], [28]], [[[26, 28], [28, 32]], 7]], [[[[35, 5.0, 5.0, 8.0, 6.0], [39, -4.0, -4.0, -3.0, -4.0], [32, 1.0, 1.0, 2.0, 3.0], [26, -5.0, 0.0, -5.0, 1.0], [23, -2.0, 1.0, -2.0, 2.0], [13, -3.0, -3.0, -1.0, 0.0], [1, 5.0, 0.0, 5.0, 3.0], [34, 3.0, -2.0, 5.0, -1.0]], [39]], [[], 7]], [[[[8, 2.0, 4.0, 5.0, 4.0], [26, -1.0, 2.0, -1.0, 2.0], [5, 4.0, 3.0, 4.0, 4.0], [16, -3.0, 0.0, -1.0, 1.0], [4, 0.0, 1.0, 3.0, 4.0], [34, 3.0, -3.0, 5.0, -2.0], [17, 4.0, -1.0, 5.0, -1.0], [31, 0.0, 1.0, 0.0, 4.0], [3, -4.0, -5.0, -1.0, -4.0]], [5]], [[[5, 8]], 8]], [[[[9, 2.0, 4.0, 2.0, 5.0], [16, 3.0, -4.0, 3.0, -1.0], [37, 0.0, -5.0, 2.0, -5.0], [23, -5.0, -1.0, -5.0, 1.0], [33, 0.0, -3.0, 1.0, -3.0], [12, 1.0, 3.0, 1.0, 5.0], [17, 1.0, -3.0, 3.0, -2.0], [7, 1.0, 0.0, 1.0, 2.0]], [33, 37, 7]], [[[17, 33]], 18]], [[[[23, -2.0, -4.0, 1.0, -1.0], [16, -3.0, -4.0, -2.0, -2.0], [25, 5.0, 1.0, 8.0, 2.0], [3, 3.0, 4.0, 4.0, 5.0], [8, 0.0, 0.0, 0.0, 2.0], [13, -1.0, -3.0, 1.0, 0.0], [19, -1.0, -3.0, 2.0, -3.0], [28, -2.0, 2.0, -2.0, 4.0], [29, -5.0, 2.0, -3.0, 2.0]], [8]], [[[8, 13]], 8]], [[[[9, 1.0, -4.0, 2.0, -1.0], [14, 1.0, -5.0, 4.0, -2.0], [4, -2.0, 4.0, 0.0, 6.0], [29, 3.0, 1.0, 3.0, 2.0], [23, 1.0, 2.0, 3.0, 4.0]], [29, 29, 23, 4, 14]], [[[9, 14], [23, 29]], 10]]], [[[[[10, -3.0, -1.0, -2.0, 2.0], [9, 3.0, -3.0, 5.0, 0.0], [30, -1.0, 5.0, 1.0, 7.0], [14, -5.0, -2.0, -4.0, 1.0], [18, 5.0, 4.0, 7.0, 5.0], [7, 4.0, 5.0, 5.0, 5.0], [11, 3.0, 0.0, 5.0, 1.0], [22, -2.0, -4.0, -2.0, -1.0], [21, -1.0, 2.0, 2.0, 2.0]], [11, 7, 10, 10]], [[[7, 18], [9, 11], [10, 22]], 21]], [[[[35, -3.0, -1.0, -2.0, 0.0], [39, 3.0, -3.0, 6.0, 0.0], [20, 1.0, 0.0, 3.0, 0.0], [33, 1.0, 2.0, 2.0, 5.0], [18, 2.0, 3.0, 5.0, 3.0], [14, -1.0, 2.0, 2.0, 2.0]], [33, 14]], [[[14, 33], [18, 33]], 9]], [[[[5, -2.0, -5.0, -2.0, -2.0], [19, 0.0, 5.0, 2.0, 6.0], [13, 4.0, -5.0, 5.0, -3.0], [15, -4.0, 2.0, -4.0, 4.0], [27, 5.0, -3.0, 8.0, 0.0], [25, -3.0, -3.0, 0.0, -1.0], [4, 1.0, -5.0, 2.0, -2.0]], [5, 4]], [[[5, 25]], 11]], [[[[35, 2.0, -2.0, 3.0, 1.0], [31, -3.0, -1.0, -2.0, -1.0], [3, -1.0, 0.0, 2.0, 0.0], [6, 5.0, 0.0, 8.0, 1.0], [27, 0.0, -4.0, 0.0, -2.0], [34, 4.0, 1.0, 4.0, 1.0], [5, -1.0, 4.0, -1.0, 5.0], [8, -2.0, 5.0, -2.0, 8.0]], [3]], [[[3, 35]], 7]], [[[[6, 2.0, -3.0, 4.0, -1.0], [25, 3.0, 4.0, 3.0, 6.0], [34, 2.0, 3.0, 2.0, 6.0], [1, 0.0, -3.0, 2.0, -1.0], [7, 1.0, 5.0, 1.0, 6.0], [16, -3.0, -2.0, -1.0, 1.0]], [6]], [[[1, 6]], 5]], [[[[17, 1.0, -1.0, 4.0, 0.0], [1, -3.0, 3.0, -2.0, 5.0], [38, 0.0, 4.0, 1.0, 6.0], [20, -5.0, -5.0, -3.0, -3.0], [27, 0.0, -4.0, 3.0, -4.0], [28, -4.0, 4.0, -2.0, 5.0], [3, -2.0, -5.0, -1.0, -2.0], [35, -1.0, 3.0, 2.0, 5.0]], [28, 28, 27, 27, 35]], [[[1, 28], [35, 38]], 18]], [[[[2, 1.0, 1.0, 4.0, 3.0], [4, -3.0, -2.0, -1.0, -2.0], [15, 5.0, -3.0, 7.0, 0.0], [27, -2.0, 3.0, -1.0, 6.0]], [15]], [[], 3]], [[[[24, 5.0, 3.0, 6.0, 5.0], [36, -4.0, -5.0, -3.0, -5.0]], [36, 24, 24, 36, 24]], [[], 1]]]]
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[[[35, 36]], 1][[[35, 36]], 1]Passed
case 1[[[1, 6]], 9][[[1, 6]], 9]Passed
case 2[[], 15][[], 15]Passed
case 3[[], 1][[], 1]Passed
case 4[[[9, 28]], 2][[[9, 28]], 2]Passed
case 5[[[9, 14]], 14][[[9, 14]], 14]Passed
case 6[[[7, 17]], 14][[[7, 17]], 14]Passed
case 7[[], 3][[], 3]Passed

SHA-256 / 5c84335350a8021e2971ce505083a1ad734a3c828ae6fed32254edfc4097e554

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

Case digest / 64e7fb113674302e3d7d267e47bdb468590846f63f1b9ec1c5d295b6adbf4a97