{"abstract":"Land enemies appear on water tiles.","category":"Procedural level generation constraints","checks":8,"contract":"Candidates [row, col] are tried in order until count spawns are chosen. A spawn must be in bounds on a '.' tile, at Chebyshev distance >= min_dist from the player and at Chebyshev distance >= 2 from every chosen spawn (no touching spawns, diagonals included). Returns chosen cells.","evaluation_group":"w2-procedural-level-generation-constraints-spawn-points","failed_approach":"Explicitly allowing water keeps the defect.","family":"w2-procedural-level-generation-constraints-spawn-points-spawn-tile","id":"FA-86441","implementations":{"attempt":{"sha256":"1b0caddb47cfb8d8f88db31492f0424ec630126708054c65aabd260b246f4a54","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(grid, player, candidates, min_dist, count):\n    chosen = []\n    pr, pc = player\n    for r, c in candidates:\n        if len(chosen) >= count:\n            break\n        if not (0 <= r < len(grid) and 0 <= c < len(grid[0])) or grid[r][c] not in '.~':\n            continue\n        if max(abs(r - pr), abs(c - pc)) < min_dist:\n            continue\n        if any(max(abs(r - a), abs(c - b)) < 2 for a, b in chosen):\n            continue\n        chosen.append([r, c])\n    return chosen\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression spawn tile #1',\n   [['...#', '.#..', '#.#~', '~~.~', '~~#.', '~##.', '....', '...#'],\n    [1, 2],\n    [[0, 1], [6, 4], [5, 4], [4, 1], [4, 0], [6, 1], [0, 4], [7, 2], [5, 3], [-1, 1]],\n    3,\n    2],\n   [[6, 1], [5, 3]]),\n  ('regression spawn tile #2',\n   [['~......', '......~', '~#.~##.', '.#..~~.', '#..#~#.', '......#'],\n    [3, 2],\n    [[1, 0], [6, 3], [5, 2], [4, 0], [2, 3], [1, 4], [6, 7], [2, 7]],\n    0,\n    5],\n   [[1, 0], [5, 2], [1, 4]]),\n  ('regression spawn tile #3',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #4',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #2',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('regression spawn tile #3',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #4',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   []),\n  ('control #2',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]])],\n [('regression spawn tile #1',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #2',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('regression spawn tile #3',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #4',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]]),\n  ('control #2',\n   [['...#...', '......~', '~~.....', '..~....', '.~....~', '.....#.'], [5, 2], [[1, 5]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #2',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('regression spawn tile #3',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #4',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('control #1',\n   [['....', '.#.~', '..~~', '...#'], [2, 0], [[4, -1], [3, 3], [3, 1], [1, 0], [1, 3]], 0, 2],\n   [[3, 1], [1, 0]]),\n  ('control #2',\n   [['.#.', '...', '#..', '...', '#..', '#.~'], [5, 2], [[2, -1], [5, 2], [1, 3], [2, 0], [6, 0]], 3, 0],\n   [])],\n [('regression spawn tile #1',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #2',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('regression spawn tile #3',\n   [['..~.#', '..#~.', '.....', '.....', '~~~~.', '.#..#', '...#.', '#.~##'], [7, 1], [[4, 2]], 3, 2],\n   []),\n  ('regression spawn tile #4',\n   [['..~..', '..#..', '.#..~'],\n    [1, 0],\n    [[0, 2], [-1, -1], [0, 1], [3, 5], [-1, 3], [3, 4], [-1, 0], [2, 2], [2, 5], [2, 1]],\n    0,\n    1],\n   [[0, 1]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['.#.#~.', '~.....', '.~#...', '......', '..#.#.'], [0, 0], [[1, 1], [5, 0], [3, 3], [-1, 0]], 0, 5],\n   [[1, 1], [3, 3]]),\n  ('control #2',\n   [['...', '~..', '...', '..#', '...', '..~'],\n    [0, 0],\n    [[6, 1], [3, 2], [0, 3], [2, -1], [1, 1], [5, 1]],\n    3,\n    0],\n   [])]]\nfor label, args, expected in cases[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":"5af784b2dc8214905bdd599443438c5d81c3629a9b4815042bbed7ec06853c10","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(grid, player, candidates, min_dist, count):\n    chosen = []\n    pr, pc = player\n    for r, c in candidates:\n        if len(chosen) >= count:\n            break\n        if not (0 <= r < len(grid) and 0 <= c < len(grid[0])) or grid[r][c] == '#':\n            continue\n        if max(abs(r - pr), abs(c - pc)) < min_dist:\n            continue\n        if any(max(abs(r - a), abs(c - b)) < 2 for a, b in chosen):\n            continue\n        chosen.append([r, c])\n    return chosen\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression spawn tile #1',\n   [['...#', '.#..', '#.#~', '~~.~', '~~#.', '~##.', '....', '...#'],\n    [1, 2],\n    [[0, 1], [6, 4], [5, 4], [4, 1], [4, 0], [6, 1], [0, 4], [7, 2], [5, 3], [-1, 1]],\n    3,\n    2],\n   [[6, 1], [5, 3]]),\n  ('regression spawn tile #2',\n   [['~......', '......~', '~#.~##.', '.#..~~.', '#..#~#.', '......#'],\n    [3, 2],\n    [[1, 0], [6, 3], [5, 2], [4, 0], [2, 3], [1, 4], [6, 7], [2, 7]],\n    0,\n    5],\n   [[1, 0], [5, 2], [1, 4]]),\n  ('regression spawn tile #3',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #4',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #2',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('regression spawn tile #3',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #4',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   []),\n  ('control #2',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]])],\n [('regression spawn tile #1',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #2',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('regression spawn tile #3',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #4',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]]),\n  ('control #2',\n   [['...#...', '......~', '~~.....', '..~....', '.~....~', '.....#.'], [5, 2], [[1, 5]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #2',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('regression spawn tile #3',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #4',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('control #1',\n   [['....', '.#.~', '..~~', '...#'], [2, 0], [[4, -1], [3, 3], [3, 1], [1, 0], [1, 3]], 0, 2],\n   [[3, 1], [1, 0]]),\n  ('control #2',\n   [['.#.', '...', '#..', '...', '#..', '#.~'], [5, 2], [[2, -1], [5, 2], [1, 3], [2, 0], [6, 0]], 3, 0],\n   [])],\n [('regression spawn tile #1',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #2',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('regression spawn tile #3',\n   [['..~.#', '..#~.', '.....', '.....', '~~~~.', '.#..#', '...#.', '#.~##'], [7, 1], [[4, 2]], 3, 2],\n   []),\n  ('regression spawn tile #4',\n   [['..~..', '..#..', '.#..~'],\n    [1, 0],\n    [[0, 2], [-1, -1], [0, 1], [3, 5], [-1, 3], [3, 4], [-1, 0], [2, 2], [2, 5], [2, 1]],\n    0,\n    1],\n   [[0, 1]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['.#.#~.', '~.....', '.~#...', '......', '..#.#.'], [0, 0], [[1, 1], [5, 0], [3, 3], [-1, 0]], 0, 5],\n   [[1, 1], [3, 3]]),\n  ('control #2',\n   [['...', '~..', '...', '..#', '...', '..~'],\n    [0, 0],\n    [[6, 1], [3, 2], [0, 3], [2, -1], [1, 1], [5, 1]],\n    3,\n    0],\n   [])]]\nfor label, args, expected in cases[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":"98f7cbd51002ddb7068dd0524b0623ea81b0d96512d2f37a1e192c1851f4d3c0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(grid, player, candidates, min_dist, count):\n    chosen = []\n    pr, pc = player\n    for r, c in candidates:\n        if len(chosen) >= count:\n            break\n        if not (0 <= r < len(grid) and 0 <= c < len(grid[0])) or grid[r][c] != '.':\n            continue\n        if max(abs(r - pr), abs(c - pc)) < min_dist:\n            continue\n        if any(max(abs(r - a), abs(c - b)) < 2 for a, b in chosen):\n            continue\n        chosen.append([r, c])\n    return chosen\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression spawn tile #1',\n   [['...#', '.#..', '#.#~', '~~.~', '~~#.', '~##.', '....', '...#'],\n    [1, 2],\n    [[0, 1], [6, 4], [5, 4], [4, 1], [4, 0], [6, 1], [0, 4], [7, 2], [5, 3], [-1, 1]],\n    3,\n    2],\n   [[6, 1], [5, 3]]),\n  ('regression spawn tile #2',\n   [['~......', '......~', '~#.~##.', '.#..~~.', '#..#~#.', '......#'],\n    [3, 2],\n    [[1, 0], [6, 3], [5, 2], [4, 0], [2, 3], [1, 4], [6, 7], [2, 7]],\n    0,\n    5],\n   [[1, 0], [5, 2], [1, 4]]),\n  ('regression spawn tile #3',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #4',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#...~..', '~...~~#.', '~~.#.##~', '~.#.#~#.'],\n    [0, 5],\n    [[2, 8], [1, 0], [2, 1], [3, 7], [2, 1], [-1, 5], [3, 2], [0, 0]],\n    1,\n    3],\n   [[3, 7]]),\n  ('regression spawn tile #2',\n   [['#.#', '~..', '~.#', '.#~', '.#.', '#..', '##.', '~#.'], [7, 0], [[5, 0], [2, 0], [5, 3]], 3, 3],\n   []),\n  ('regression spawn tile #3',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #4',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['#.#', '...', '#.#', '.#.', '...', '...', '...', '##.'], [6, 2], [[2, -1], [7, 2]], 0, 0],\n   []),\n  ('control #2',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]])],\n [('regression spawn tile #1',\n   [['..~##.', '~..~..', '.~~#.~'], [0, 3], [[1, 4], [-1, 6], [1, 1], [2, 4], [2, 2], [1, 0]], 3, 5],\n   []),\n  ('regression spawn tile #2',\n   [['..##....', '~.#.#.~#', '##...#.~', '.....#~~', '#...#..~', '...#.~.~'],\n    [1, 0],\n    [[2, 2], [3, 8], [5, 7], [5, 5]],\n    0,\n    5],\n   [[2, 2]]),\n  ('regression spawn tile #3',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #4',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('control #1',\n   [['.#~', '...', '~.#', '#.~', '..#', '#~.'], [3, 1], [[5, 0], [1, 0], [6, -1], [6, -1]], 0, 5],\n   [[1, 0]]),\n  ('control #2',\n   [['...#...', '......~', '~~.....', '..~....', '.~....~', '.....#.'], [5, 2], [[1, 5]], 0, 0],\n   [])],\n [('regression spawn tile #1',\n   [['~#~~', '.~~.', '~.~.', '....', '.#.~'],\n    [1, 0],\n    [[-1, 2], [-1, 1], [1, 2], [5, 2], [-1, 4], [-1, 2], [2, 0]],\n    2,\n    3],\n   []),\n  ('regression spawn tile #2',\n   [['.~....##', '......#.', '~...#..#', '~......~'],\n    [2, 3],\n    [[-1, 3], [0, 1], [1, -1], [1, 2], [2, 5], [1, 3]],\n    2,\n    1],\n   [[2, 5]]),\n  ('regression spawn tile #3',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #4',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('exact safe radius #1', [['.....', '.....'], [0, 0], [[1, 1], [0, 2]], 2, 2], [[0, 2]]),\n  ('control #1',\n   [['....', '.#.~', '..~~', '...#'], [2, 0], [[4, -1], [3, 3], [3, 1], [1, 0], [1, 3]], 0, 2],\n   [[3, 1], [1, 0]]),\n  ('control #2',\n   [['.#.', '...', '#..', '...', '#..', '#.~'], [5, 2], [[2, -1], [5, 2], [1, 3], [2, 0], [6, 0]], 3, 0],\n   [])],\n [('regression spawn tile #1',\n   [['.#..#~..', '~...#.#~', '..~.~...'], [0, 4], [[3, 7], [2, 5], [3, -1], [1, 0], [3, 1], [-1, -1]], 2, 3],\n   [[2, 5]]),\n  ('regression spawn tile #2',\n   [['~...', '~~.~', '....', '#.~#', '..#~', '....', '#.~.'],\n    [6, 1],\n    [[1, 1], [-1, 0], [6, 1], [5, 3], [4, 1], [2, 1], [-1, 3], [1, -1], [6, 1]],\n    1,\n    1],\n   [[5, 3]]),\n  ('regression spawn tile #3',\n   [['..~.#', '..#~.', '.....', '.....', '~~~~.', '.#..#', '...#.', '#.~##'], [7, 1], [[4, 2]], 3, 2],\n   []),\n  ('regression spawn tile #4',\n   [['..~..', '..#..', '.#..~'],\n    [1, 0],\n    [[0, 2], [-1, -1], [0, 1], [3, 5], [-1, 3], [3, 4], [-1, 0], [2, 2], [2, 5], [2, 1]],\n    0,\n    1],\n   [[0, 1]]),\n  ('negative index candidate #1', [['...', '...', '..#'], [0, 0], [[-1, -1], [2, 0]], 1, 2], [[2, 0]]),\n  ('diagonal neighbour spawn #1', [['....', '....', '....'], [0, 0], [[1, 2], [2, 3]], 1, 3], [[1, 2]]),\n  ('control #1',\n   [['.#.#~.', '~.....', '.~#...', '......', '..#.#.'], [0, 0], [[1, 1], [5, 0], [3, 3], [-1, 0]], 0, 5],\n   [[1, 1], [3, 3]]),\n  ('control #2',\n   [['...', '~..', '...', '..#', '...', '..~'],\n    [0, 0],\n    [[6, 1], [3, 2], [0, 3], [2, -1], [1, 1], [5, 1]],\n    3,\n    0],\n   [])]]\nfor label, args, expected in cases[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":"Deterministic toy contract stipulated for this model; integer or exact arithmetic only, not a reproduction of any specific game engine. 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-procedural-level-generation-constraints-spawn-points-spawn-tile","generated_at":"2026-09-29T14:50:49.546296+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Procedural generators silently emit unplayable or unfair levels when a single constraint check uses the wrong boundary, axis, neighborhood or update order; the defect is visible in exact generated geometry.","repair":"Restore `grid[r][c] != '.'` at the spawn tile step.","root_cause":"Only walls are rejected, so any other tile type is spawnable.","sha256":"3de658c2f51a77f993e44ba208dae8fdc4af04145dfb9f2ae0f601ce1f79b71d","title":"Enemy spawn point selection: Enemies spawn in water · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.031,"exit_code":1,"observations":[{"actual":[[4,1],[6,1]],"check":"regression spawn tile #1","expected":[[6,1],[5,3]],"passed":false},{"actual":[[1,0],[5,2],[2,3]],"check":"regression spawn tile #2","expected":[[1,0],[5,2],[1,4]],"passed":false},{"actual":[[1,0],[3,7]],"check":"regression spawn tile #3","expected":[[3,7]],"passed":false},{"actual":[[2,0]],"check":"regression spawn tile #4","expected":[],"passed":false},{"actual":[[1,2]],"check":"diagonal neighbour spawn #1","expected":[[1,2]],"passed":true},{"actual":[[0,2]],"check":"exact safe radius #1","expected":[[0,2]],"passed":true},{"actual":[[2,0]],"check":"negative index candidate #1","expected":[[2,0]],"passed":true},{"actual":[],"check":"control #1","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression spawn tile #1\", \"actual\": [[4, 1], [6, 1]], \"expected\": [[6, 1], [5, 3]], \"passed\": false}, {\"check\": \"regression spawn tile #2\", \"actual\": [[1, 0], [5, 2], [2, 3]], \"expected\": [[1, 0], [5, 2], [1, 4]], \"passed\": false}, {\"check\": \"regression spawn tile #3\", \"actual\": [[1, 0], [3, 7]], \"expected\": [[3, 7]], \"passed\": false}, {\"check\": \"regression spawn tile #4\", \"actual\": [[2, 0]], \"expected\": [], \"passed\": false}, {\"check\": \"diagonal neighbour spawn #1\", \"actual\": [[1, 2]], \"expected\": [[1, 2]], \"passed\": true}, {\"check\": \"exact safe radius #1\", \"actual\": [[0, 2]], \"expected\": [[0, 2]], \"passed\": true}, {\"check\": \"negative index candidate #1\", \"actual\": [[2, 0]], \"expected\": [[2, 0]], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.589,"exit_code":1,"observations":[{"actual":[[4,1],[6,1]],"check":"regression spawn tile #1","expected":[[6,1],[5,3]],"passed":false},{"actual":[[1,0],[5,2],[2,3]],"check":"regression spawn tile #2","expected":[[1,0],[5,2],[1,4]],"passed":false},{"actual":[[1,0],[3,7]],"check":"regression spawn tile #3","expected":[[3,7]],"passed":false},{"actual":[[2,0]],"check":"regression spawn tile #4","expected":[],"passed":false},{"actual":[[1,2]],"check":"diagonal neighbour spawn #1","expected":[[1,2]],"passed":true},{"actual":[[0,2]],"check":"exact safe radius #1","expected":[[0,2]],"passed":true},{"actual":[[2,0]],"check":"negative index candidate #1","expected":[[2,0]],"passed":true},{"actual":[],"check":"control #1","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression spawn tile #1\", \"actual\": [[4, 1], [6, 1]], \"expected\": [[6, 1], [5, 3]], \"passed\": false}, {\"check\": \"regression spawn tile #2\", \"actual\": [[1, 0], [5, 2], [2, 3]], \"expected\": [[1, 0], [5, 2], [1, 4]], \"passed\": false}, {\"check\": \"regression spawn tile #3\", \"actual\": [[1, 0], [3, 7]], \"expected\": [[3, 7]], \"passed\": false}, {\"check\": \"regression spawn tile #4\", \"actual\": [[2, 0]], \"expected\": [], \"passed\": false}, {\"check\": \"diagonal neighbour spawn #1\", \"actual\": [[1, 2]], \"expected\": [[1, 2]], \"passed\": true}, {\"check\": \"exact safe radius #1\", \"actual\": [[0, 2]], \"expected\": [[0, 2]], \"passed\": true}, {\"check\": \"negative index candidate #1\", \"actual\": [[2, 0]], \"expected\": [[2, 0]], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.815,"exit_code":0,"observations":[{"actual":[[6,1],[5,3]],"check":"regression spawn tile #1","expected":[[6,1],[5,3]],"passed":true},{"actual":[[1,0],[5,2],[1,4]],"check":"regression spawn tile #2","expected":[[1,0],[5,2],[1,4]],"passed":true},{"actual":[[3,7]],"check":"regression spawn tile #3","expected":[[3,7]],"passed":true},{"actual":[],"check":"regression spawn tile #4","expected":[],"passed":true},{"actual":[[1,2]],"check":"diagonal neighbour spawn #1","expected":[[1,2]],"passed":true},{"actual":[[0,2]],"check":"exact safe radius #1","expected":[[0,2]],"passed":true},{"actual":[[2,0]],"check":"negative index candidate #1","expected":[[2,0]],"passed":true},{"actual":[],"check":"control #1","expected":[],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression spawn tile #1\", \"actual\": [[6, 1], [5, 3]], \"expected\": [[6, 1], [5, 3]], \"passed\": true}, {\"check\": \"regression spawn tile #2\", \"actual\": [[1, 0], [5, 2], [1, 4]], \"expected\": [[1, 0], [5, 2], [1, 4]], \"passed\": true}, {\"check\": \"regression spawn tile #3\", \"actual\": [[3, 7]], \"expected\": [[3, 7]], \"passed\": true}, {\"check\": \"regression spawn tile #4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"diagonal neighbour spawn #1\", \"actual\": [[1, 2]], \"expected\": [[1, 2]], \"passed\": true}, {\"check\": \"exact safe radius #1\", \"actual\": [[0, 2]], \"expected\": [[0, 2]], \"passed\": true}, {\"check\": \"negative index candidate #1\", \"actual\": [[2, 0]], \"expected\": [[2, 0]], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}