FAILURE MAP
← Case archive

FA-12471 / Molecular graph representation / Open access

Reaction atom map labels contaminate structural keys · case 01

Reaction atom map labels contaminate structural keys.

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

ROOT CAUSE

Mapping correspondence metadata is included in an atom structural key.

VERIFIED REPAIR

Implement the explicit toy representation contract: Return [element,isotope,charge] from an atom record; map is a reaction correspondence label and is excluded. Isotope and formal charge remain exact.

Unsuccessful approach: Dropping all annotations also drops charge and isotope identity fields.

Case contract

Return [element,isotope,charge] from an atom record; map is a reaction correspondence label and is excluded. Isotope and formal charge remain exact.

Why this case matters

Controlled molecular graph interchange model; tests isolate atom or bond representation errors without claiming chemical validity or production toolkit equivalence.

1 / The failure

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

N = 1
observations = []
def solve(atom):
    return [atom["element"],atom["isotope"],atom["charge"],atom["map"]]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('mapped ion', solve(dict(element='N',isotope=None,charge=1,map=N)), ['N',None,1])
check('isotope', solve(dict(element='C',isotope=12+N,charge=0,map=0)), ['C',12+N,0])
check('neutral', solve(dict(element='C',isotope=None,charge=0,map=N)), ['C',None,0])
check('negative', solve(dict(element='O',isotope=None,charge=-1,map=N)), ['O',None,-1])
check('unmapped', solve(dict(element='H',isotope=2,charge=0,map=None)), ['H',2,0])
check('both fields', solve(dict(element='X',isotope=N,charge=-2,map=N+9)), ['X',N,-2])
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
mapped ion['N', None, 1, 1]['N', None, 1]Failed
isotope['C', 13, 0, 0]['C', 13, 0]Failed
neutral['C', None, 0, 1]['C', None, 0]Failed
negative['O', None, -1, 1]['O', None, -1]Failed
unmapped['H', 2, 0, None]['H', 2, 0]Failed
both fields['X', 1, -2, 10]['X', 1, -2]Failed

SHA-256 / 35b93757077cb41dbd166b911f1ed7363b12d8c12869cf715449ad2c308262ca

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(atom):
    return [atom["element"],None,0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('mapped ion', solve(dict(element='N',isotope=None,charge=1,map=N)), ['N',None,1])
check('isotope', solve(dict(element='C',isotope=12+N,charge=0,map=0)), ['C',12+N,0])
check('neutral', solve(dict(element='C',isotope=None,charge=0,map=N)), ['C',None,0])
check('negative', solve(dict(element='O',isotope=None,charge=-1,map=N)), ['O',None,-1])
check('unmapped', solve(dict(element='H',isotope=2,charge=0,map=None)), ['H',2,0])
check('both fields', solve(dict(element='X',isotope=N,charge=-2,map=N+9)), ['X',N,-2])
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
mapped ion['N', None, 0]['N', None, 1]Failed
isotope['C', None, 0]['C', 13, 0]Failed
neutral['C', None, 0]['C', None, 0]Passed
negative['O', None, 0]['O', None, -1]Failed
unmapped['H', None, 0]['H', 2, 0]Failed
both fields['X', None, 0]['X', 1, -2]Failed

SHA-256 / d9f5102dec7cdade520aef016ec80becef1e953c0a8d5c0a71c13b8c421ac5c1

3 / The verified repair

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

N = 1
observations = []
def solve(atom):
    return [atom["element"],atom["isotope"],atom["charge"]]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('mapped ion', solve(dict(element='N',isotope=None,charge=1,map=N)), ['N',None,1])
check('isotope', solve(dict(element='C',isotope=12+N,charge=0,map=0)), ['C',12+N,0])
check('neutral', solve(dict(element='C',isotope=None,charge=0,map=N)), ['C',None,0])
check('negative', solve(dict(element='O',isotope=None,charge=-1,map=N)), ['O',None,-1])
check('unmapped', solve(dict(element='H',isotope=2,charge=0,map=None)), ['H',2,0])
check('both fields', solve(dict(element='X',isotope=N,charge=-2,map=N+9)), ['X',N,-2])
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
mapped ion['N', None, 1]['N', None, 1]Passed
isotope['C', 13, 0]['C', 13, 0]Passed
neutral['C', None, 0]['C', None, 0]Passed
negative['O', None, -1]['O', None, -1]Passed
unmapped['H', 2, 0]['H', 2, 0]Passed
both fields['X', 1, -2]['X', 1, -2]Passed

SHA-256 / cd10626cd04c245606bf87134bca955c1f0190095b6a0a7f4ae34bd39abdea44

Verification & scope

Toy representation only; no valence inference, chemical sanitization, synthesis, or real molecular identity determination. 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:38:57.232778+00:00.

Case digest / ebe1ec8d154c2752b7b9dec45422ae4f624e32c16c264831f5ce548f44d07de3