FAILURE MAP
← Case archive

FA-86491 / Procedural level generation constraints / Open access

Strip wave-function propagation: Domains keep duplicates and input order · case 01

Duplicate tiles skew weighted collapse later.

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

ROOT CAUSE

Input domains are copied without deduplication or sorting.

VERIFIED REPAIR

Restore `sorted(set(d))` at the domain normalisation step.

Unsuccessful approach: Sorting alone keeps duplicate tiles.

Case 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).

Why this case matters

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.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(domains, rules):
    dom = [list(d) for d in domains]
    changed = True
    while changed:
        changed = False
        for i in range(len(dom)):
            keep = []
            for t in dom[i]:
                ok_left = i == 0 or any(t in rules.get(l, []) for l in dom[i - 1])
                ok_right = i == len(dom) - 1 or any(r in rules.get(t, []) for r in dom[i + 1])
                if ok_left and ok_right:
                    keep.append(t)
            if keep != dom[i]:
                dom[i] = keep
                changed = True
    return {'domains': dom, 'contradiction': any(not d for d in dom)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'grass', 'sand', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill'], ['sand', 'hill'], ['sea'], ['grass', 'sand', 'sea', 'hill'], ['sea']],
    {'sea': ['hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill', 'sea'],
     'hill': ['sand', 'sea']}],
   {'domains': [['hill'], ['sand'], ['sea'], ['hill', 'sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill', 'sea'],
     ['sand', 'grass'],
     ['sea', 'hill', 'grass', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'sea'], ['sea', 'hill', 'sand'], ['hill', 'sea'], ['hill', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['sea'], ['sand', 'sea'], ['sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'hill', 'sand', 'sea', 'sand'],
     ['sea', 'grass', 'hill', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['sand', 'sea', 'grass'], ['sand', 'sea', 'grass'], ['hill', 'sand', 'grass', 'hill']],
    {'sea': ['grass', 'hill', 'sand'],
     'sand': ['grass', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand']}],
   {'domains': [['grass', 'sand', 'sea'], ['grass', 'sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'hill']],
    {'sea': ['hill'], 'sand': ['grass', 'sand', 'sea'], 'grass': ['sea'], 'hill': ['grass', 'hill']}],
   {'domains': [['hill', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['sea', 'sand', 'grass'],
     ['sea', 'sand', 'hill', 'grass'],
     ['sea', 'grass', 'hill', 'sand', 'sand'],
     ['hill', 'sand', 'sea', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['grass', 'sand'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sea', 'grass', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand', 'grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'grass', 'sand']],
    {'sea': ['hill'], 'sand': ['sea'], 'grass': ['grass', 'sand', 'sea'], 'hill': ['hill']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill', 'sea', 'grass', 'sand'], ['sea', 'grass', 'sand']],
    {'sea': ['hill', 'sand'], 'sand': ['grass', 'hill', 'sand'], 'grass': ['grass'], 'hill': ['sea']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'], ['grass', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['sea', 'sea']],
    {'sea': ['grass', 'hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill'],
     'hill': ['grass', 'sand']}],
   {'domains': [['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass', 'sea', 'hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['sand']],
    {'sea': ['sea'],
     'sand': ['hill', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sea'],
     'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['sand']], 'contradiction': False})]]
for label, args, expected in cases[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
duplicate domain entries #1{'contradiction': False, 'domains': [['grass', 'grass', 'sand']]}{'contradiction': False, 'domains': [['grass', 'sand']]}Failed
fault site domain normalisation #1{'contradiction': False, 'domains': [['hill', 'grass', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'hill', 'sand', 'sea']]}Failed
fault site domain normalisation #2{'contradiction': False, 'domains': [['sand', 'hill', 'sea']]}{'contradiction': False, 'domains': [['hill', 'sand', 'sea']]}Failed
regression domain normalisation #1{'contradiction': False, 'domains': [['hill', 'sea', 'sea'], ['sand', 'grass', 'hill'], ['sand', 'sea'], ['sand', 'hill', 'grass']]}{'contradiction': False, 'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']]}Failed
regression domain normalisation #2{'contradiction': False, 'domains': [['hill', 'hill'], ['grass'], ['grass']]}{'contradiction': False, 'domains': [['hill'], ['grass'], ['grass']]}Failed
coast gradient #1{'contradiction': True, 'domains': [[], [], []]}{'contradiction': True, 'domains': [[], [], []]}Passed
asymmetric rule #1{'contradiction': False, 'domains': [['sand'], ['grass']]}{'contradiction': False, 'domains': [['sand'], ['grass']]}Passed
control #1{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}Passed

SHA-256 / 957359e37336ad8105aab1cfb5dfdb08145a44f9c2da20098de858dc275adbef

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(domains, rules):
    dom = [sorted(d) for d in domains]
    changed = True
    while changed:
        changed = False
        for i in range(len(dom)):
            keep = []
            for t in dom[i]:
                ok_left = i == 0 or any(t in rules.get(l, []) for l in dom[i - 1])
                ok_right = i == len(dom) - 1 or any(r in rules.get(t, []) for r in dom[i + 1])
                if ok_left and ok_right:
                    keep.append(t)
            if keep != dom[i]:
                dom[i] = keep
                changed = True
    return {'domains': dom, 'contradiction': any(not d for d in dom)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'grass', 'sand', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill'], ['sand', 'hill'], ['sea'], ['grass', 'sand', 'sea', 'hill'], ['sea']],
    {'sea': ['hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill', 'sea'],
     'hill': ['sand', 'sea']}],
   {'domains': [['hill'], ['sand'], ['sea'], ['hill', 'sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill', 'sea'],
     ['sand', 'grass'],
     ['sea', 'hill', 'grass', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'sea'], ['sea', 'hill', 'sand'], ['hill', 'sea'], ['hill', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['sea'], ['sand', 'sea'], ['sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'hill', 'sand', 'sea', 'sand'],
     ['sea', 'grass', 'hill', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['sand', 'sea', 'grass'], ['sand', 'sea', 'grass'], ['hill', 'sand', 'grass', 'hill']],
    {'sea': ['grass', 'hill', 'sand'],
     'sand': ['grass', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand']}],
   {'domains': [['grass', 'sand', 'sea'], ['grass', 'sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'hill']],
    {'sea': ['hill'], 'sand': ['grass', 'sand', 'sea'], 'grass': ['sea'], 'hill': ['grass', 'hill']}],
   {'domains': [['hill', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['sea', 'sand', 'grass'],
     ['sea', 'sand', 'hill', 'grass'],
     ['sea', 'grass', 'hill', 'sand', 'sand'],
     ['hill', 'sand', 'sea', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['grass', 'sand'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sea', 'grass', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand', 'grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'grass', 'sand']],
    {'sea': ['hill'], 'sand': ['sea'], 'grass': ['grass', 'sand', 'sea'], 'hill': ['hill']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill', 'sea', 'grass', 'sand'], ['sea', 'grass', 'sand']],
    {'sea': ['hill', 'sand'], 'sand': ['grass', 'hill', 'sand'], 'grass': ['grass'], 'hill': ['sea']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'], ['grass', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['sea', 'sea']],
    {'sea': ['grass', 'hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill'],
     'hill': ['grass', 'sand']}],
   {'domains': [['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass', 'sea', 'hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['sand']],
    {'sea': ['sea'],
     'sand': ['hill', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sea'],
     'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['sand']], 'contradiction': False})]]
for label, args, expected in cases[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
duplicate domain entries #1{'contradiction': False, 'domains': [['grass', 'grass', 'sand']]}{'contradiction': False, 'domains': [['grass', 'sand']]}Failed
fault site domain normalisation #1{'contradiction': False, 'domains': [['grass', 'hill', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'hill', 'sand', 'sea']]}Passed
fault site domain normalisation #2{'contradiction': False, 'domains': [['hill', 'sand', 'sea']]}{'contradiction': False, 'domains': [['hill', 'sand', 'sea']]}Passed
regression domain normalisation #1{'contradiction': False, 'domains': [['hill', 'sea', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']]}{'contradiction': False, 'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']]}Failed
regression domain normalisation #2{'contradiction': False, 'domains': [['hill', 'hill'], ['grass'], ['grass']]}{'contradiction': False, 'domains': [['hill'], ['grass'], ['grass']]}Failed
coast gradient #1{'contradiction': True, 'domains': [[], [], []]}{'contradiction': True, 'domains': [[], [], []]}Passed
asymmetric rule #1{'contradiction': False, 'domains': [['sand'], ['grass']]}{'contradiction': False, 'domains': [['sand'], ['grass']]}Passed
control #1{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}Passed

SHA-256 / 1d7b329a35c38e440a2262ee91d88bcc2dbfe4f5419a57ddf24bb774cebac8c0

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(domains, rules):
    dom = [sorted(set(d)) for d in domains]
    changed = True
    while changed:
        changed = False
        for i in range(len(dom)):
            keep = []
            for t in dom[i]:
                ok_left = i == 0 or any(t in rules.get(l, []) for l in dom[i - 1])
                ok_right = i == len(dom) - 1 or any(r in rules.get(t, []) for r in dom[i + 1])
                if ok_left and ok_right:
                    keep.append(t)
            if keep != dom[i]:
                dom[i] = keep
                changed = True
    return {'domains': dom, 'contradiction': any(not d for d in dom)}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'grass', 'sand', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sand', 'hill', 'sea']],
    {'sea': ['sand', 'sea'],
     'sand': ['grass', 'hill'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand', 'sea']}],
   {'domains': [['hill', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill'], ['sand', 'hill'], ['sea'], ['grass', 'sand', 'sea', 'hill'], ['sea']],
    {'sea': ['hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill', 'sea'],
     'hill': ['sand', 'sea']}],
   {'domains': [['hill'], ['sand'], ['sea'], ['hill', 'sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill', 'sea'],
     ['sand', 'grass'],
     ['sea', 'hill', 'grass', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'sea', 'grass', 'sea'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sand', 'sea'],
     ['sand', 'hill', 'sea', 'grass']],
    {'sea': ['grass', 'hill'], 'sand': ['hill', 'sand'], 'grass': ['sea'], 'hill': ['sand']}],
   {'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['hill', 'sea'], ['sea', 'hill', 'sand'], ['hill', 'sea'], ['hill', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['sea'], ['sand', 'sea'], ['sea'], ['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['grass', 'hill', 'sand', 'sea', 'sand'],
     ['sea', 'grass', 'hill', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['sand', 'sea', 'grass'], ['sand', 'sea', 'grass'], ['hill', 'sand', 'grass', 'hill']],
    {'sea': ['grass', 'hill', 'sand'],
     'sand': ['grass', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sand'],
     'hill': ['hill', 'sand']}],
   {'domains': [['grass', 'sand', 'sea'], ['grass', 'sand', 'sea'], ['grass', 'hill', 'sand']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sand', 'sea']],
    {'sea': ['grass', 'sand'], 'sand': ['hill'], 'grass': ['hill'], 'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['hill', 'hill'], ['grass'], ['grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass'], ['grass']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'hill']],
    {'sea': ['hill'], 'sand': ['grass', 'sand', 'sea'], 'grass': ['sea'], 'hill': ['grass', 'hill']}],
   {'domains': [['hill', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['sea', 'sand', 'grass'],
     ['sea', 'sand', 'hill', 'grass'],
     ['sea', 'grass', 'hill', 'sand', 'sand'],
     ['hill', 'sand', 'sea', 'grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('regression domain normalisation #3',
   [[['grass', 'sand'],
     ['sea', 'sand', 'grass', 'hill'],
     ['sea', 'grass', 'sand', 'hill'],
     ['sea', 'grass', 'hill', 'sand', 'grass']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sand'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea'],
                ['grass', 'hill', 'sand', 'sea']],
    'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['grass', 'sea']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['grass', 'sea']], 'contradiction': False})],
 [('duplicate domain entries #1',
   [[['grass', 'grass', 'sand']], {'grass': []}],
   {'domains': [['grass', 'sand']], 'contradiction': False}),
  ('fault site domain normalisation #1',
   [[['sea', 'grass', 'sand']],
    {'sea': ['hill'], 'sand': ['sea'], 'grass': ['grass', 'sand', 'sea'], 'hill': ['hill']}],
   {'domains': [['grass', 'sand', 'sea']], 'contradiction': False}),
  ('fault site domain normalisation #2',
   [[['hill', 'sea', 'grass', 'sand'], ['sea', 'grass', 'sand']],
    {'sea': ['hill', 'sand'], 'sand': ['grass', 'hill', 'sand'], 'grass': ['grass'], 'hill': ['sea']}],
   {'domains': [['grass', 'hill', 'sand', 'sea'], ['grass', 'sand', 'sea']], 'contradiction': False}),
  ('regression domain normalisation #1',
   [[['sea', 'sea']],
    {'sea': ['grass', 'hill', 'sea'],
     'sand': ['grass', 'hill', 'sea'],
     'grass': ['hill'],
     'hill': ['grass', 'sand']}],
   {'domains': [['sea']], 'contradiction': False}),
  ('regression domain normalisation #2',
   [[['hill', 'hill'], ['grass', 'sea', 'hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [['hill'], ['grass']], 'contradiction': False}),
  ('coast gradient #1',
   [[['sea'], ['sea', 'sand', 'grass', 'hill'], ['hill']],
    {'sea': ['sea', 'sand'],
     'sand': ['sea', 'sand', 'grass'],
     'grass': ['sand', 'grass', 'hill'],
     'hill': ['grass']}],
   {'domains': [[], [], []], 'contradiction': True}),
  ('asymmetric rule #1',
   [[['sand'], ['hill', 'grass']], {'sand': ['grass'], 'grass': ['sand'], 'hill': ['sand']}],
   {'domains': [['sand'], ['grass']], 'contradiction': False}),
  ('control #1',
   [[['sand']],
    {'sea': ['sea'],
     'sand': ['hill', 'sand', 'sea'],
     'grass': ['grass', 'hill', 'sea'],
     'hill': ['grass', 'hill', 'sea']}],
   {'domains': [['sand']], 'contradiction': False})]]
for label, args, expected in cases[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
duplicate domain entries #1{'contradiction': False, 'domains': [['grass', 'sand']]}{'contradiction': False, 'domains': [['grass', 'sand']]}Passed
fault site domain normalisation #1{'contradiction': False, 'domains': [['grass', 'hill', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'hill', 'sand', 'sea']]}Passed
fault site domain normalisation #2{'contradiction': False, 'domains': [['hill', 'sand', 'sea']]}{'contradiction': False, 'domains': [['hill', 'sand', 'sea']]}Passed
regression domain normalisation #1{'contradiction': False, 'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']]}{'contradiction': False, 'domains': [['hill', 'sea'], ['grass', 'hill', 'sand'], ['sand', 'sea'], ['grass', 'hill', 'sand']]}Passed
regression domain normalisation #2{'contradiction': False, 'domains': [['hill'], ['grass'], ['grass']]}{'contradiction': False, 'domains': [['hill'], ['grass'], ['grass']]}Passed
coast gradient #1{'contradiction': True, 'domains': [[], [], []]}{'contradiction': True, 'domains': [[], [], []]}Passed
asymmetric rule #1{'contradiction': False, 'domains': [['sand'], ['grass']]}{'contradiction': False, 'domains': [['sand'], ['grass']]}Passed
control #1{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}{'contradiction': False, 'domains': [['grass', 'sand', 'sea']]}Passed

SHA-256 / 918875d5ca7e4c336e4d4f516cd3bffa0f610319894bcbe22440b26967221063

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:50:50.114237+00:00.

Case digest / ac0ae3fdc2770fab877a85f8a5a589094f97a4f1129253452058517b1e8dd825