{"abstract":"Every valid ring is reported as self-intersecting.","category":"GIS polygon topology","checks":8,"contract":"Input: one ring as a list of integer [x, y]. Report the first failing check in this order: fewer than 4 positions \"too_few_points\"; first != last \"not_closed\"; two cyclically consecutive equal vertices \"repeated_point\"; a vertex where the boundary reverses direction along a line (collinear with a negative dot product of the incoming and outgoing edge, checked cyclically) \"spike\"; any two non-adjacent edges sharing a point (crossing, touching or collinear overlap) \"self_intersection\"; otherwise \"valid\".","evaluation_group":"w2-gis-polygon-topology-simple-ring-validator","failed_approach":"Skipping every pair involving the last edge also hides genuine crossings of the closing edge.","family":"w2-gis-polygon-topology-simple-ring-validator-closing-edge-adjacency","id":"FA-70516","implementations":{"attempt":{"sha256":"241e54dd227a64f2db6e539bb8f1ef1dbe3fa64fec3a678e9900b1140bad94a8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ring = x\n    if len(ring) < 4:\n        return 'too_few_points'\n    if ring[0] != ring[-1]:\n        return 'not_closed'\n    pts = ring[:-1]\n    n = len(pts)\n    for i in range(n):\n        if pts[i] == pts[(i + 1) % n]:\n            return 'repeated_point'\n    for i in range(n):\n        a, b, c = pts[i - 1], pts[i], pts[(i + 1) % n]\n        cross = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0])\n        dot = (b[0] - a[0]) * (c[0] - b[0]) + (b[1] - a[1]) * (c[1] - b[1])\n        if cross == 0 and dot < 0:\n            return 'spike'\n    def orient(p, q, r):\n        v = (q[0] - p[0]) * (r[1] - p[1]) - (q[1] - p[1]) * (r[0] - p[0])\n        return (v > 0) - (v < 0)\n    def within(p, q, r):\n        return min(p[0], r[0]) <= q[0] <= max(p[0], r[0]) and min(p[1], r[1]) <= q[1] <= max(p[1], r[1])\n    def hit(p1, p2, p3, p4):\n        o1, o2, o3, o4 = orient(p1, p2, p3), orient(p1, p2, p4), orient(p3, p4, p1), orient(p3, p4, p2)\n        if o1 * o2 < 0 and o3 * o4 < 0:\n            return True\n        return (o1 == 0 and within(p1, p3, p2)) or (o2 == 0 and within(p1, p4, p2)) or (o3 == 0 and within(p3, p1, p4)) or (o4 == 0 and within(p3, p2, p4))\n    for i in range(n):\n        for j in range(i + 1, n):\n            if j == i + 1 or j == n - 1:\n                continue\n            if hit(pts[i], pts[(i + 1) % n], pts[j], pts[(j + 1) % n]):\n                return 'self_intersection'\n    return 'valid'\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]], 'valid'), ('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('regression #3', [[0, 0], [10, 10], [10, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('control #16', [[0, 0], [6, 0], [6, 6], [3, 3], [0, 6], [0, 0]], 'valid'), ('regression #17', [[0, 0], [10, 0], [10, 10], [0, 10], [4, 10], [0, 0]], 'spike'), ('control #18', [[1, 1], [9, 2], [8, 9], [2, 7], [1, 1]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')]]\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":"140f9b6626ebc45348e258c83a8ab184c764820ae5e0d8c1aa2298e65152d48d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ring = x\n    if len(ring) < 4:\n        return 'too_few_points'\n    if ring[0] != ring[-1]:\n        return 'not_closed'\n    pts = ring[:-1]\n    n = len(pts)\n    for i in range(n):\n        if pts[i] == pts[(i + 1) % n]:\n            return 'repeated_point'\n    for i in range(n):\n        a, b, c = pts[i - 1], pts[i], pts[(i + 1) % n]\n        cross = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0])\n        dot = (b[0] - a[0]) * (c[0] - b[0]) + (b[1] - a[1]) * (c[1] - b[1])\n        if cross == 0 and dot < 0:\n            return 'spike'\n    def orient(p, q, r):\n        v = (q[0] - p[0]) * (r[1] - p[1]) - (q[1] - p[1]) * (r[0] - p[0])\n        return (v > 0) - (v < 0)\n    def within(p, q, r):\n        return min(p[0], r[0]) <= q[0] <= max(p[0], r[0]) and min(p[1], r[1]) <= q[1] <= max(p[1], r[1])\n    def hit(p1, p2, p3, p4):\n        o1, o2, o3, o4 = orient(p1, p2, p3), orient(p1, p2, p4), orient(p3, p4, p1), orient(p3, p4, p2)\n        if o1 * o2 < 0 and o3 * o4 < 0:\n            return True\n        return (o1 == 0 and within(p1, p3, p2)) or (o2 == 0 and within(p1, p4, p2)) or (o3 == 0 and within(p3, p1, p4)) or (o4 == 0 and within(p3, p2, p4))\n    for i in range(n):\n        for j in range(i + 1, n):\n            if j == i + 1:\n                continue\n            if hit(pts[i], pts[(i + 1) % n], pts[j], pts[(j + 1) % n]):\n                return 'self_intersection'\n    return 'valid'\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]], 'valid'), ('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('regression #3', [[0, 0], [10, 10], [10, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('control #16', [[0, 0], [6, 0], [6, 6], [3, 3], [0, 6], [0, 0]], 'valid'), ('regression #17', [[0, 0], [10, 0], [10, 10], [0, 10], [4, 10], [0, 0]], 'spike'), ('control #18', [[1, 1], [9, 2], [8, 9], [2, 7], [1, 1]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')]]\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":"03738e615dd353bda5bc50063aa6b2026cfadbb3bf793af4af31a34e3862ae61","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ring = x\n    if len(ring) < 4:\n        return 'too_few_points'\n    if ring[0] != ring[-1]:\n        return 'not_closed'\n    pts = ring[:-1]\n    n = len(pts)\n    for i in range(n):\n        if pts[i] == pts[(i + 1) % n]:\n            return 'repeated_point'\n    for i in range(n):\n        a, b, c = pts[i - 1], pts[i], pts[(i + 1) % n]\n        cross = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0])\n        dot = (b[0] - a[0]) * (c[0] - b[0]) + (b[1] - a[1]) * (c[1] - b[1])\n        if cross == 0 and dot < 0:\n            return 'spike'\n    def orient(p, q, r):\n        v = (q[0] - p[0]) * (r[1] - p[1]) - (q[1] - p[1]) * (r[0] - p[0])\n        return (v > 0) - (v < 0)\n    def within(p, q, r):\n        return min(p[0], r[0]) <= q[0] <= max(p[0], r[0]) and min(p[1], r[1]) <= q[1] <= max(p[1], r[1])\n    def hit(p1, p2, p3, p4):\n        o1, o2, o3, o4 = orient(p1, p2, p3), orient(p1, p2, p4), orient(p3, p4, p1), orient(p3, p4, p2)\n        if o1 * o2 < 0 and o3 * o4 < 0:\n            return True\n        return (o1 == 0 and within(p1, p3, p2)) or (o2 == 0 and within(p1, p4, p2)) or (o3 == 0 and within(p3, p1, p4)) or (o4 == 0 and within(p3, p2, p4))\n    for i in range(n):\n        for j in range(i + 1, n):\n            if j == i + 1 or (i == 0 and j == n - 1):\n                continue\n            if hit(pts[i], pts[(i + 1) % n], pts[j], pts[(j + 1) % n]):\n                return 'self_intersection'\n    return 'valid'\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]], 'valid'), ('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('regression #3', [[0, 0], [10, 10], [10, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('control #1', [[0, 0], [10, 0], [5, 8], [0, 0]], 'valid'), ('regression #4', [[0, 0], [10, 0], [10, 10], [10, 5], [0, 5], [0, 0]], 'spike'), ('regression #5', [[5, 0], [10, 0], [10, 10], [0, 10], [0, 0], [5, 0], [0, 0]], 'not_closed'), ('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('control #2', [[0, 0], [5, 0], [10, 0], [10, 10], [0, 10], [0, 0]], 'valid'), ('boundary #7', [[0, 0], [10, 0], [10, 10]], 'too_few_points'), ('boundary #8', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 1]], 'not_closed'), ('boundary #9', [[0, 0], [10, 0], [10, 0], [10, 10], [0, 0]], 'repeated_point'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')], [('boundary #6', [[0, 0], [10, 0], [10, 10], [0, 0]], 'valid'), ('regression #10', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0], [0, 0]], 'repeated_point'), ('regression #11', [[0, 0], [10, 0], [10, 10], [0, 10], [0, 5], [0, 12], [0, 0]], 'spike'), ('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('regression #28', [[2, 0], [1, 0], [0, 3], [2, 1], [4, 1], [2, 2], [2, 0]], 'self_intersection')], [('regression #12', [[0, 5], [0, 0], [10, 0], [10, 10], [0, 10], [0, 12], [0, 5]], 'spike'), ('regression #13', [[0, 0], [4, 0], [4, 4], [8, 4], [8, 8], [4, 8], [4, 4], [0, 4], [0, 0]], 'self_intersection'), ('regression #14', [[0, 0], [10, 0], [10, 10], [5, 0], [0, 10], [0, 0]], 'self_intersection'), ('regression #15', [[0, 0], [10, 0], [10, 5], [2, 5], [6, 5], [6, 8], [0, 8], [0, 0]], 'spike'), ('control #16', [[0, 0], [6, 0], [6, 6], [3, 3], [0, 6], [0, 0]], 'valid'), ('regression #17', [[0, 0], [10, 0], [10, 10], [0, 10], [4, 10], [0, 0]], 'spike'), ('control #18', [[1, 1], [9, 2], [8, 9], [2, 7], [1, 1]], 'valid'), ('regression #22', [[0, 0], [10, 0], [0, 10], [10, 10], [0, 0]], 'self_intersection')]]\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-simple-ring-validator-closing-edge-adjacency","generated_at":"2026-09-29T14:48:21.438956+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Topology validators run before editing, overlay and publishing; a wrong diagnosis sends users to fix the wrong vertex or lets broken rings through.","repair":"At the closing edge adjacency step restore `if j == i + 1 or (i == 0 and j == n - 1):`, leaving the rest of the model unchanged.","root_cause":"The first and last edges share the start vertex but are not excluded as adjacent, so their common vertex counts as an intersection.","sha256":"a3a9e8a8a2463819b4be91bf31d90b1e1381b6dd45968e268a5a66809bba3129","title":"Simple ring validity diagnosis: closing edge adjacency · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.518,"exit_code":1,"observations":[{"actual":"valid","check":"control #0","expected":"valid","passed":true},{"actual":"valid","check":"control #1","expected":"valid","passed":true},{"actual":"valid","check":"control #2","expected":"valid","passed":true},{"actual":"self_intersection","check":"regression #3","expected":"self_intersection","passed":true},{"actual":"spike","check":"regression #4","expected":"spike","passed":true},{"actual":"not_closed","check":"regression #5","expected":"not_closed","passed":true},{"actual":"valid","check":"boundary #6","expected":"valid","passed":true},{"actual":"valid","check":"regression #22","expected":"self_intersection","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"control #1\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"control #2\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"regression #3\", \"actual\": \"self_intersection\", \"expected\": \"self_intersection\", \"passed\": true}, {\"check\": \"regression #4\", \"actual\": \"spike\", \"expected\": \"spike\", \"passed\": true}, {\"check\": \"regression #5\", \"actual\": \"not_closed\", \"expected\": \"not_closed\", \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"regression #22\", \"actual\": \"valid\", \"expected\": \"self_intersection\", \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.887,"exit_code":1,"observations":[{"actual":"self_intersection","check":"control #0","expected":"valid","passed":false},{"actual":"self_intersection","check":"control #1","expected":"valid","passed":false},{"actual":"self_intersection","check":"control #2","expected":"valid","passed":false},{"actual":"self_intersection","check":"regression #3","expected":"self_intersection","passed":true},{"actual":"spike","check":"regression #4","expected":"spike","passed":true},{"actual":"not_closed","check":"regression #5","expected":"not_closed","passed":true},{"actual":"self_intersection","check":"boundary #6","expected":"valid","passed":false},{"actual":"self_intersection","check":"regression #22","expected":"self_intersection","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": \"self_intersection\", \"expected\": \"valid\", \"passed\": false}, {\"check\": \"control #1\", \"actual\": \"self_intersection\", \"expected\": \"valid\", \"passed\": false}, {\"check\": \"control #2\", \"actual\": \"self_intersection\", \"expected\": \"valid\", \"passed\": false}, {\"check\": \"regression #3\", \"actual\": \"self_intersection\", \"expected\": \"self_intersection\", \"passed\": true}, {\"check\": \"regression #4\", \"actual\": \"spike\", \"expected\": \"spike\", \"passed\": true}, {\"check\": \"regression #5\", \"actual\": \"not_closed\", \"expected\": \"not_closed\", \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": \"self_intersection\", \"expected\": \"valid\", \"passed\": false}, {\"check\": \"regression #22\", \"actual\": \"self_intersection\", \"expected\": \"self_intersection\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.524,"exit_code":0,"observations":[{"actual":"valid","check":"control #0","expected":"valid","passed":true},{"actual":"valid","check":"control #1","expected":"valid","passed":true},{"actual":"valid","check":"control #2","expected":"valid","passed":true},{"actual":"self_intersection","check":"regression #3","expected":"self_intersection","passed":true},{"actual":"spike","check":"regression #4","expected":"spike","passed":true},{"actual":"not_closed","check":"regression #5","expected":"not_closed","passed":true},{"actual":"valid","check":"boundary #6","expected":"valid","passed":true},{"actual":"self_intersection","check":"regression #22","expected":"self_intersection","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"control #1\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"control #2\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"regression #3\", \"actual\": \"self_intersection\", \"expected\": \"self_intersection\", \"passed\": true}, {\"check\": \"regression #4\", \"actual\": \"spike\", \"expected\": \"spike\", \"passed\": true}, {\"check\": \"regression #5\", \"actual\": \"not_closed\", \"expected\": \"not_closed\", \"passed\": true}, {\"check\": \"boundary #6\", \"actual\": \"valid\", \"expected\": \"valid\", \"passed\": true}, {\"check\": \"regression #22\", \"actual\": \"self_intersection\", \"expected\": \"self_intersection\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}