{"abstract":"Duplicate tiles skew weighted collapse later.","category":"Procedural level generation constraints","checks":8,"contract":"A 1D strip of cells, each with a domain of tiles; rules[t] lists tiles allowed immediately to the right of t. Repeatedly remove tile t from cell i unless (i is first or some tile l in cell i-1 allows t on its right) and (i is last or t allows some tile in cell i+1), until stable. Domains are returned as sorted unique lists with a contradiction flag (any empty domain).","contract_signature":"domains, rules","evaluation_group":"w2-procedural-level-generation-constraints-strip-wfc","failed_approach":"Sorting alone keeps duplicate tiles.","family":"w2-procedural-level-generation-constraints-strip-wfc-domain-normalisation","id":"FA-86491","implementations":{"attempt":{"sha256":"1d7b329a35c38e440a2262ee91d88bcc2dbfe4f5419a57ddf24bb774cebac8c0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(domains, rules):\n    dom = [sorted(d) for d in domains]\n    changed = True\n    while changed:\n        changed = False\n        for i in range(len(dom)):\n            keep = []\n            for t in dom[i]:\n                ok_left = i == 0 or any(t in rules.get(l, []) for l in dom[i - 1])\n                ok_right = i == len(dom) - 1 or any(r in rules.get(t, []) for r in dom[i + 1])\n                if ok_left and ok_right:\n                    keep.append(t)\n            if keep != dom[i]:\n                dom[i] = keep\n                changed = True\n    return {'domains': dom, 'contradiction': any(not d for d in dom)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['hill', 'grass', 'sand', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['sand', 'hill', 'sea']],\n    {'sea': ['sand', 'sea'],\n     'sand': ['grass', 'hill'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand', 'sea']}],\n   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'sea', 'grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sand', 'sea'],\n     ['sand', 'hill', 'sea', 'grass']],\n    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],\n   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sand', 'hill', 'sea']],\n    {'sea': ['sand', 'sea'],\n     'sand': ['grass', 'hill'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand', 'sea']}],\n   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['hill'], ['sand', 'hill'], ['sea'], ['grass', 'sand', 'sea', 'hill'], ['sea']],\n    {'sea': ['hill', 'sea'],\n     'sand': ['grass', 'hill', 'sea'],\n     'grass': ['hill', 'sea'],\n     'hill': ['sand', 'sea']}],\n   {'domains': [['hill'], ['sand'], ['sea'], ['hill', 'sea'], ['sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill', 'sea'],\n     ['sand', 'grass'],\n     ['sea', 'hill', 'grass', 'sand']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'sand'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'sea', 'grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sand', 'sea'],\n     ['sand', 'hill', 'sea', 'grass']],\n    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],\n   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['hill', 'sea'], ['sea', 'hill', 'sand'], ['hill', 'sea'], ['hill', 'grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['sea'], ['sand', 'sea'], ['sea'], ['sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['grass', 'hill', 'sand', 'sea', 'sand'],\n     ['sea', 'grass', 'hill', 'sand', 'hill'],\n     ['sea', 'grass', 'hill', 'sand']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('regression domain normalisation #3',\n   [[['sand', 'sea', 'grass'], ['sand', 'sea', 'grass'], ['hill', 'sand', 'grass', 'hill']],\n    {'sea': ['grass', 'hill', 'sand'],\n     'sand': ['grass', 'sand', 'sea'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand']}],\n   {'domains': [['grass', 'sand', 'sea'], ['grass', 'sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sea', 'hill']],\n    {'sea': ['hill'], 'sand': ['grass', 'sand', 'sea'], 'grass': ['sea'], 'hill': ['grass', 'hill']}],\n   {'domains': [['hill', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['sea', 'sand', 'grass'],\n     ['sea', 'sand', 'hill', 'grass'],\n     ['sea', 'grass', 'hill', 'sand', 'sand'],\n     ['hill', 'sand', 'sea', 'grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('regression domain normalisation #3',\n   [[['grass', 'sand'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sea', 'grass', 'sand', 'hill'],\n     ['sea', 'grass', 'hill', 'sand', 'grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sand'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sea', 'grass', 'sand']],\n    {'sea': ['hill'], 'sand': ['sea'], 'grass': ['grass', 'sand', 'sea'], 'hill': ['hill']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['hill', 'sea', 'grass', 'sand'], ['sea', 'grass', 'sand']],\n    {'sea': ['hill', 'sand'], 'sand': ['grass', 'hill', 'sand'], 'grass': ['grass'], 'hill': ['sea']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea'], ['grass', 'sand', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['sea', 'sea']],\n    {'sea': ['grass', 'hill', 'sea'],\n     'sand': ['grass', 'hill', 'sea'],\n     'grass': ['hill'],\n     'hill': ['grass', 'sand']}],\n   {'domains': [['sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['hill', 'hill'], ['grass', 'sea', 'hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass']], 'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['sand']],\n    {'sea': ['sea'],\n     'sand': ['hill', 'sand', 'sea'],\n     'grass': ['grass', 'hill', 'sea'],\n     'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['sand']], 'contradiction': False})]]\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":"957359e37336ad8105aab1cfb5dfdb08145a44f9c2da20098de858dc275adbef","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(domains, rules):\n    dom = [list(d) for d in domains]\n    changed = True\n    while changed:\n        changed = False\n        for i in range(len(dom)):\n            keep = []\n            for t in dom[i]:\n                ok_left = i == 0 or any(t in rules.get(l, []) for l in dom[i - 1])\n                ok_right = i == len(dom) - 1 or any(r in rules.get(t, []) for r in dom[i + 1])\n                if ok_left and ok_right:\n                    keep.append(t)\n            if keep != dom[i]:\n                dom[i] = keep\n                changed = True\n    return {'domains': dom, 'contradiction': any(not d for d in dom)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['hill', 'grass', 'sand', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['sand', 'hill', 'sea']],\n    {'sea': ['sand', 'sea'],\n     'sand': ['grass', 'hill'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand', 'sea']}],\n   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'sea', 'grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sand', 'sea'],\n     ['sand', 'hill', 'sea', 'grass']],\n    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],\n   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sand', 'hill', 'sea']],\n    {'sea': ['sand', 'sea'],\n     'sand': ['grass', 'hill'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand', 'sea']}],\n   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['hill'], ['sand', 'hill'], ['sea'], ['grass', 'sand', 'sea', 'hill'], ['sea']],\n    {'sea': ['hill', 'sea'],\n     'sand': ['grass', 'hill', 'sea'],\n     'grass': ['hill', 'sea'],\n     'hill': ['sand', 'sea']}],\n   {'domains': [['hill'], ['sand'], ['sea'], ['hill', 'sea'], ['sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill', 'sea'],\n     ['sand', 'grass'],\n     ['sea', 'hill', 'grass', 'sand']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'sand'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'sea', 'grass', 'sea'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sand', 'sea'],\n     ['sand', 'hill', 'sea', 'grass']],\n    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],\n   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['hill', 'sea'], ['sea', 'hill', 'sand'], ['hill', 'sea'], ['hill', 'grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['sea'], ['sand', 'sea'], ['sea'], ['sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['grass', 'hill', 'sand', 'sea', 'sand'],\n     ['sea', 'grass', 'hill', 'sand', 'hill'],\n     ['sea', 'grass', 'hill', 'sand']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('regression domain normalisation #3',\n   [[['sand', 'sea', 'grass'], ['sand', 'sea', 'grass'], ['hill', 'sand', 'grass', 'hill']],\n    {'sea': ['grass', 'hill', 'sand'],\n     'sand': ['grass', 'sand', 'sea'],\n     'grass': ['grass', 'hill', 'sand'],\n     'hill': ['hill', 'sand']}],\n   {'domains': [['grass', 'sand', 'sea'], ['grass', 'sand', 'sea'], ['grass', 'hill', 'sand']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sand', 'sea']],\n    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['hill', 'hill'], ['grass'], ['grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sea', 'hill']],\n    {'sea': ['hill'], 'sand': ['grass', 'sand', 'sea'], 'grass': ['sea'], 'hill': ['grass', 'hill']}],\n   {'domains': [['hill', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['sea', 'sand', 'grass'],\n     ['sea', 'sand', 'hill', 'grass'],\n     ['sea', 'grass', 'hill', 'sand', 'sand'],\n     ['hill', 'sand', 'sea', 'grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('regression domain normalisation #3',\n   [[['grass', 'sand'],\n     ['sea', 'sand', 'grass', 'hill'],\n     ['sea', 'grass', 'sand', 'hill'],\n     ['sea', 'grass', 'hill', 'sand', 'grass']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sand'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea'],\n                ['grass', 'hill', 'sand', 'sea']],\n    'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['grass', 'sea']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['grass', 'sea']], 'contradiction': False})],\n [('duplicate domain entries #1',\n   [[['grass', 'grass', 'sand']], {'grass': []}],\n   {'domains': [['grass', 'sand']], 'contradiction': False}),\n  ('fault site domain normalisation #1',\n   [[['sea', 'grass', 'sand']],\n    {'sea': ['hill'], 'sand': ['sea'], 'grass': ['grass', 'sand', 'sea'], 'hill': ['hill']}],\n   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False}),\n  ('fault site domain normalisation #2',\n   [[['hill', 'sea', 'grass', 'sand'], ['sea', 'grass', 'sand']],\n    {'sea': ['hill', 'sand'], 'sand': ['grass', 'hill', 'sand'], 'grass': ['grass'], 'hill': ['sea']}],\n   {'domains': [['grass', 'hill', 'sand', 'sea'], ['grass', 'sand', 'sea']], 'contradiction': False}),\n  ('regression domain normalisation #1',\n   [[['sea', 'sea']],\n    {'sea': ['grass', 'hill', 'sea'],\n     'sand': ['grass', 'hill', 'sea'],\n     'grass': ['hill'],\n     'hill': ['grass', 'sand']}],\n   {'domains': [['sea']], 'contradiction': False}),\n  ('regression domain normalisation #2',\n   [[['hill', 'hill'], ['grass', 'sea', 'hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [['hill'], ['grass']], 'contradiction': False}),\n  ('coast gradient #1',\n   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],\n    {'sea': ['sea', 'sand'],\n     'sand': ['sea', 'sand', 'grass'],\n     'grass': ['sand', 'grass', 'hill'],\n     'hill': ['grass']}],\n   {'domains': [[], [], []], 'contradiction': True}),\n  ('asymmetric rule #1',\n   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],\n   {'domains': [['sand'], ['grass']], 'contradiction': False}),\n  ('control #1',\n   [[['sand']],\n    {'sea': ['sea'],\n     'sand': ['hill', 'sand', 'sea'],\n     'grass': ['grass', 'hill', 'sea'],\n     'hill': ['grass', 'hill', 'sea']}],\n   {'domains': [['sand']], 'contradiction': False})]]\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-strip-wfc-domain-normalisation","generated_at":"2026-09-29T14:50:50.114237+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.","root_cause":"Input domains are copied without deduplication or sorting.","sha256":"3bf9a305df42377de0c265a0c316967d7cd47ebf4a8f9f646fba22c9d18c8303","title":"Strip wave-function propagation: Domains keep duplicates and input order · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.5,"exit_code":1,"observations":[{"actual":{"contradiction":false,"domains":[["grass","grass","sand"]]},"check":"duplicate domain entries #1","expected":{"contradiction":false,"domains":[["grass","sand"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["grass","hill","sand","sea"]]},"check":"fault site domain normalisation #1","expected":{"contradiction":false,"domains":[["grass","hill","sand","sea"]]},"passed":true},{"actual":{"contradiction":false,"domains":[["hill","sand","sea"]]},"check":"fault site domain normalisation #2","expected":{"contradiction":false,"domains":[["hill","sand","sea"]]},"passed":true},{"actual":{"contradiction":false,"domains":[["hill","sea","sea"],["grass","hill","sand"],["sand","sea"],["grass","hill","sand"]]},"check":"regression domain normalisation #1","expected":{"contradiction":false,"domains":[["hill","sea"],["grass","hill","sand"],["sand","sea"],["grass","hill","sand"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["hill","hill"],["grass"],["grass"]]},"check":"regression domain normalisation #2","expected":{"contradiction":false,"domains":[["hill"],["grass"],["grass"]]},"passed":false},{"actual":{"contradiction":true,"domains":[[],[],[]]},"check":"coast gradient #1","expected":{"contradiction":true,"domains":[[],[],[]]},"passed":true},{"actual":{"contradiction":false,"domains":[["sand"],["grass"]]},"check":"asymmetric rule #1","expected":{"contradiction":false,"domains":[["sand"],["grass"]]},"passed":true},{"actual":{"contradiction":false,"domains":[["grass","sand","sea"]]},"check":"control #1","expected":{"contradiction":false,"domains":[["grass","sand","sea"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"duplicate domain entries #1\", \"actual\": {\"domains\": [[\"grass\", \"grass\", \"sand\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"sand\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"fault site domain normalisation #1\", \"actual\": {\"domains\": [[\"grass\", \"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": true}, {\"check\": \"fault site domain normalisation #2\", \"actual\": {\"domains\": [[\"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": true}, {\"check\": \"regression domain normalisation #1\", \"actual\": {\"domains\": [[\"hill\", \"sea\", \"sea\"], [\"grass\", \"hill\", \"sand\"], [\"sand\", \"sea\"], [\"grass\", \"hill\", \"sand\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\", \"sea\"], [\"grass\", \"hill\", \"sand\"], [\"sand\", \"sea\"], [\"grass\", \"hill\", \"sand\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"regression domain normalisation #2\", \"actual\": {\"domains\": [[\"hill\", \"hill\"], [\"grass\"], [\"grass\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\"], [\"grass\"], [\"grass\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"coast gradient #1\", \"actual\": {\"domains\": [[], [], []], \"contradiction\": true}, \"expected\": {\"domains\": [[], [], []], \"contradiction\": true}, \"passed\": true}, {\"check\": \"asymmetric rule #1\", \"actual\": {\"domains\": [[\"sand\"], [\"grass\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"sand\"], [\"grass\"]], \"contradiction\": false}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"domains\": [[\"grass\", \"sand\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.677,"exit_code":1,"observations":[{"actual":{"contradiction":false,"domains":[["grass","grass","sand"]]},"check":"duplicate domain entries #1","expected":{"contradiction":false,"domains":[["grass","sand"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["hill","grass","sand","sea"]]},"check":"fault site domain normalisation #1","expected":{"contradiction":false,"domains":[["grass","hill","sand","sea"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["sand","hill","sea"]]},"check":"fault site domain normalisation #2","expected":{"contradiction":false,"domains":[["hill","sand","sea"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["hill","sea","sea"],["sand","grass","hill"],["sand","sea"],["sand","hill","grass"]]},"check":"regression domain normalisation #1","expected":{"contradiction":false,"domains":[["hill","sea"],["grass","hill","sand"],["sand","sea"],["grass","hill","sand"]]},"passed":false},{"actual":{"contradiction":false,"domains":[["hill","hill"],["grass"],["grass"]]},"check":"regression domain normalisation #2","expected":{"contradiction":false,"domains":[["hill"],["grass"],["grass"]]},"passed":false},{"actual":{"contradiction":true,"domains":[[],[],[]]},"check":"coast gradient #1","expected":{"contradiction":true,"domains":[[],[],[]]},"passed":true},{"actual":{"contradiction":false,"domains":[["sand"],["grass"]]},"check":"asymmetric rule #1","expected":{"contradiction":false,"domains":[["sand"],["grass"]]},"passed":true},{"actual":{"contradiction":false,"domains":[["grass","sand","sea"]]},"check":"control #1","expected":{"contradiction":false,"domains":[["grass","sand","sea"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"duplicate domain entries #1\", \"actual\": {\"domains\": [[\"grass\", \"grass\", \"sand\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"sand\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"fault site domain normalisation #1\", \"actual\": {\"domains\": [[\"hill\", \"grass\", \"sand\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"fault site domain normalisation #2\", \"actual\": {\"domains\": [[\"sand\", \"hill\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"regression domain normalisation #1\", \"actual\": {\"domains\": [[\"hill\", \"sea\", \"sea\"], [\"sand\", \"grass\", \"hill\"], [\"sand\", \"sea\"], [\"sand\", \"hill\", \"grass\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\", \"sea\"], [\"grass\", \"hill\", \"sand\"], [\"sand\", \"sea\"], [\"grass\", \"hill\", \"sand\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"regression domain normalisation #2\", \"actual\": {\"domains\": [[\"hill\", \"hill\"], [\"grass\"], [\"grass\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"hill\"], [\"grass\"], [\"grass\"]], \"contradiction\": false}, \"passed\": false}, {\"check\": \"coast gradient #1\", \"actual\": {\"domains\": [[], [], []], \"contradiction\": true}, \"expected\": {\"domains\": [[], [], []], \"contradiction\": true}, \"passed\": true}, {\"check\": \"asymmetric rule #1\", \"actual\": {\"domains\": [[\"sand\"], [\"grass\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"sand\"], [\"grass\"]], \"contradiction\": false}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"domains\": [[\"grass\", \"sand\", \"sea\"]], \"contradiction\": false}, \"expected\": {\"domains\": [[\"grass\", \"sand\", \"sea\"]], \"contradiction\": false}, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}