FA-12471 / Molecular graph representation / Open access
Reaction atom map labels contaminate structural keys · case 01
Reaction atom map labels contaminate structural keys.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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