{"abstract":"Clockwise polygons are always reported as degenerate.","category":"GIS polygon topology","checks":8,"contract":"Input [rings, threshold]: exterior then holes, closed rings in any orientation. Area = |exterior area| minus the sum of |hole areas|; perimeter = total length of all rings. If area <= 0 or perimeter == 0 return [\"degenerate\", 0.0]. Thinness t = 4*pi*area/perimeter**2; return [\"sliver\" if t < threshold else \"ok\", t rounded to 6 decimals].","evaluation_group":"w2-gis-polygon-topology-sliver-thinness","failed_approach":"The absolute value is applied to the whole difference, so clockwise exteriors add their hole areas.","family":"w2-gis-polygon-topology-sliver-thinness-exterior-orientation","id":"FA-70621","implementations":{"attempt":{"sha256":"b838222c733d0e29da87e3974a80af6b358cef2ee7d92223607a926a7d47e920","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    rings, thresh = x\n    def a2(r):\n        return sum(p[0] * q[1] - q[0] * p[1] for p, q in zip(r, r[1:]))\n    def per(r):\n        return sum(math.hypot(q[0] - p[0], q[1] - p[1]) for p, q in zip(r, r[1:]))\n    area = abs(a2(rings[0]) / 2 - sum(abs(a2(h)) / 2 for h in rings[1:]))\n    perim = sum(per(r) for r in rings)\n    if area <= 0 or perim == 0:\n        return ['degenerate', 0.0]\n    t = 4 * math.pi * area / perim ** 2\n    return ['sliver' if t < thresh else 'ok', round(t, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #2', [[[[0, 0], [20, 0], [20, 20], [0, 20], [0, 0]], [[1, 1], [1, 19], [19, 19], [19, 1], [1, 1]]], 0.3], ['sliver', 0.041337]), ('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655])], [('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655]), ('regression #17', [[[[0, 0], [30, 0], [30, 10], [0, 10], [0, 0]]], 0.587], ['ok', 0.589049])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\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":"caf9741c517f3f0e79145dfa6832969cc23a1b3d4373cbc81dde5ebdbe1f8e28","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    rings, thresh = x\n    def a2(r):\n        return sum(p[0] * q[1] - q[0] * p[1] for p, q in zip(r, r[1:]))\n    def per(r):\n        return sum(math.hypot(q[0] - p[0], q[1] - p[1]) for p, q in zip(r, r[1:]))\n    area = a2(rings[0]) / 2 - sum(abs(a2(h)) / 2 for h in rings[1:])\n    perim = sum(per(r) for r in rings)\n    if area <= 0 or perim == 0:\n        return ['degenerate', 0.0]\n    t = 4 * math.pi * area / perim ** 2\n    return ['sliver' if t < thresh else 'ok', round(t, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #2', [[[[0, 0], [20, 0], [20, 20], [0, 20], [0, 0]], [[1, 1], [1, 19], [19, 19], [19, 1], [1, 1]]], 0.3], ['sliver', 0.041337]), ('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655])], [('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655]), ('regression #17', [[[[0, 0], [30, 0], [30, 10], [0, 10], [0, 0]]], 0.587], ['ok', 0.589049])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\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":"e4f75fd5e5f693d5efb9d58235183ac7dd435993bae7bd8915c4c566f9803942","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    rings, thresh = x\n    def a2(r):\n        return sum(p[0] * q[1] - q[0] * p[1] for p, q in zip(r, r[1:]))\n    def per(r):\n        return sum(math.hypot(q[0] - p[0], q[1] - p[1]) for p, q in zip(r, r[1:]))\n    area = abs(a2(rings[0])) / 2 - sum(abs(a2(h)) / 2 for h in rings[1:])\n    perim = sum(per(r) for r in rings)\n    if area <= 0 or perim == 0:\n        return ['degenerate', 0.0]\n    t = 4 * math.pi * area / perim ** 2\n    return ['sliver' if t < thresh else 'ok', round(t, 6)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #2', [[[[0, 0], [20, 0], [20, 20], [0, 20], [0, 0]], [[1, 1], [1, 19], [19, 19], [19, 1], [1, 1]]], 0.3], ['sliver', 0.041337]), ('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('boundary #5', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.7853981633974483], ['ok', 0.785398]), ('boundary #6', [[[[0, 0], [10, 0], [20, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #7', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], 0.3], ['degenerate', 0.0]), ('control #8', [[[[0, 0], [30, 0], [15, 26], [0, 0]]], 0.5], ['ok', 0.6046]), ('regression #9', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [25, 25], [25, 5], [5, 5]]], 0.2], ['sliver', 0.15708]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668])], [('regression #3', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]]], 0.3], ['ok', 0.785398]), ('regression #10', [[[[0, 0], [30, 0], [30, 30], [0, 30], [0, 0]], [[5, 5], [5, 25], [10, 25], [10, 5], [5, 5]], [[15, 5], [15, 25], [25, 25], [25, 5], [15, 5]]], 0.2], ['sliver', 0.14253]), ('control #11', [[[[0, 0], [40, 0], [40, 5], [0, 5], [0, 0]]], 0.5], ['sliver', 0.310281]), ('boundary #12', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.5], ['ok', 0.502655]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655])], [('control #0', [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], 0.3], ['ok', 0.785398]), ('control #1', [[[[0, 0], [100, 0], [100, 2], [0, 2], [0, 0]]], 0.3], ['sliver', 0.060392]), ('regression #4', [[[[0, 0], [0, 20], [20, 20], [20, 0], [0, 0]], [[2, 2], [6, 2], [6, 6], [2, 6], [2, 2]]], 0.3], ['ok', 0.523599]), ('regression #13', [[[[0, 0], [12, 0], [12, 12], [0, 12], [0, 0]], [[1, 1], [1, 2], [11, 2], [11, 1], [1, 1]]], 0.6], ['sliver', 0.343652]), ('control #14', [[[[0, 0], [8, 1], [9, 9], [1, 8], [0, 0]]], 0.4], ['ok', 0.761232]), ('regression #15', [[[[0, 0], [1, 8], [9, 9], [8, 1], [0, 0]], [[3, 3], [5, 3], [5, 5], [3, 5], [3, 3]]], 0.4], ['ok', 0.457668]), ('regression #16', [[[[0, 0], [40, 0], [40, 10], [0, 10], [0, 0]]], 0.502], ['ok', 0.502655]), ('regression #17', [[[[0, 0], [30, 0], [30, 10], [0, 10], [0, 0]]], 0.587], ['ok', 0.589049])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\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":"Stipulated deterministic toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library 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":"w2-gis-polygon-topology-sliver-thinness-exterior-orientation","generated_at":"2026-09-29T14:48:22.396540+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Overlay operations leave thin slivers along near-coincident boundaries; QA jobs flag them by compactness.","repair":"Take the absolute exterior area before subtracting the absolute hole areas.","root_cause":"The exterior uses the signed area, negative for clockwise rings.","sha256":"1e8278dcd80a66da798c7883184879e25223529bd2b66c477858bc24df20dc78","title":"Sliver polygon detection by thinness ratio: exterior orientation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.229,"exit_code":1,"observations":[{"actual":["ok",0.785398],"check":"control #0","expected":["ok",0.785398],"passed":true},{"actual":["sliver",0.060392],"check":"control #1","expected":["sliver",0.060392],"passed":true},{"actual":["sliver",0.041337],"check":"regression #2","expected":["sliver",0.041337],"passed":true},{"actual":["ok",0.785398],"check":"regression #3","expected":["ok",0.785398],"passed":true},{"actual":["ok",0.567232],"check":"regression #4","expected":["ok",0.523599],"passed":false},{"actual":["ok",0.785398],"check":"boundary #5","expected":["ok",0.785398],"passed":true},{"actual":["degenerate",0.0],"check":"boundary #6","expected":["degenerate",0.0],"passed":true},{"actual":["degenerate",0.0],"check":"regression #7","expected":["degenerate",0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [\"sliver\", 0.060392], \"expected\": [\"sliver\", 0.060392], \"passed\": true}, {\"check\": \"regression #2\", \"actual\": [\"sliver\", 0.041337], \"expected\": [\"sliver\", 0.041337], \"passed\": true}, {\"check\": \"regression #3\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"regression #4\", \"actual\": [\"ok\", 0.567232], \"expected\": [\"ok\", 0.523599], \"passed\": false}, {\"check\": \"boundary #5\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}, {\"check\": \"regression #7\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.105,"exit_code":1,"observations":[{"actual":["ok",0.785398],"check":"control #0","expected":["ok",0.785398],"passed":true},{"actual":["sliver",0.060392],"check":"control #1","expected":["sliver",0.060392],"passed":true},{"actual":["sliver",0.041337],"check":"regression #2","expected":["sliver",0.041337],"passed":true},{"actual":["degenerate",0.0],"check":"regression #3","expected":["ok",0.785398],"passed":false},{"actual":["degenerate",0.0],"check":"regression #4","expected":["ok",0.523599],"passed":false},{"actual":["ok",0.785398],"check":"boundary #5","expected":["ok",0.785398],"passed":true},{"actual":["degenerate",0.0],"check":"boundary #6","expected":["degenerate",0.0],"passed":true},{"actual":["degenerate",0.0],"check":"regression #7","expected":["degenerate",0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [\"sliver\", 0.060392], \"expected\": [\"sliver\", 0.060392], \"passed\": true}, {\"check\": \"regression #2\", \"actual\": [\"sliver\", 0.041337], \"expected\": [\"sliver\", 0.041337], \"passed\": true}, {\"check\": \"regression #3\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"ok\", 0.785398], \"passed\": false}, {\"check\": \"regression #4\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"ok\", 0.523599], \"passed\": false}, {\"check\": \"boundary #5\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}, {\"check\": \"regression #7\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.473,"exit_code":0,"observations":[{"actual":["ok",0.785398],"check":"control #0","expected":["ok",0.785398],"passed":true},{"actual":["sliver",0.060392],"check":"control #1","expected":["sliver",0.060392],"passed":true},{"actual":["sliver",0.041337],"check":"regression #2","expected":["sliver",0.041337],"passed":true},{"actual":["ok",0.785398],"check":"regression #3","expected":["ok",0.785398],"passed":true},{"actual":["ok",0.523599],"check":"regression #4","expected":["ok",0.523599],"passed":true},{"actual":["ok",0.785398],"check":"boundary #5","expected":["ok",0.785398],"passed":true},{"actual":["degenerate",0.0],"check":"boundary #6","expected":["degenerate",0.0],"passed":true},{"actual":["degenerate",0.0],"check":"regression #7","expected":["degenerate",0.0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [\"sliver\", 0.060392], \"expected\": [\"sliver\", 0.060392], \"passed\": true}, {\"check\": \"regression #2\", \"actual\": [\"sliver\", 0.041337], \"expected\": [\"sliver\", 0.041337], \"passed\": true}, {\"check\": \"regression #3\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"regression #4\", \"actual\": [\"ok\", 0.523599], \"expected\": [\"ok\", 0.523599], \"passed\": true}, {\"check\": \"boundary #5\", \"actual\": [\"ok\", 0.785398], \"expected\": [\"ok\", 0.785398], \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}, {\"check\": \"regression #7\", \"actual\": [\"degenerate\", 0.0], \"expected\": [\"degenerate\", 0.0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}