FA-12541 / Genomic coordinate mapping / Open access
Negative-strand transcript offsets visit exons in reference order · case 01
Negative-strand transcript offsets visit exons in reference order.
ROOT CAUSE
Exons are traversed in increasing reference order for both strands.
VERIFIED REPAIR
Reverse exon traversal on the negative strand before consuming transcript offsets.
Unsuccessful approach: Reversing bases within each exon leaves exon traversal wrong.
Case contract
Map zero-based transcript offset across disjoint half-open exons to a reference base; return None outside transcript.
Why this case matters
An abstract offline coordinate model isolates this software mapping defect; it does not model biological interpretation.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(exons, strand, offset):
for a,b in sorted(exons):
if 0 <= offset < b-a: return a+offset
offset -= b-a
return None
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
e=[(10*N,10*N+2),(10*N+10,10*N+13)]
check('minus first',solve(e,'-',0),10*N+12)
check('minus junction',solve(e,'-',3),10*N+1)
check('minus last',solve(e,'-',4),10*N)
check('plus first',solve(e,'+',0),10*N)
check('plus junction',solve(e,'+',2),10*N+10)
check('past end',solve(e,'-',5),None)
check('negative',solve(e,'+',-1),None)
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 |
|---|---|---|---|
| minus first | 10 | 22 | Failed |
| minus junction | 21 | 11 | Failed |
| minus last | 22 | 10 | Failed |
| plus first | 10 | 10 | Passed |
| plus junction | 20 | 20 | Passed |
| past end | None | None | Passed |
| negative | None | None | Passed |
SHA-256 / 098a95cf174c5a5e2afb5175f872250cedb156d47336ce83e699c02bbbf78216
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(exons, strand, offset):
for a,b in sorted(exons):
if 0 <= offset < b-a: return a+offset if strand=='+' else b-1-offset
offset -= b-a
return None
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
e=[(10*N,10*N+2),(10*N+10,10*N+13)]
check('minus first',solve(e,'-',0),10*N+12)
check('minus junction',solve(e,'-',3),10*N+1)
check('minus last',solve(e,'-',4),10*N)
check('plus first',solve(e,'+',0),10*N)
check('plus junction',solve(e,'+',2),10*N+10)
check('past end',solve(e,'-',5),None)
check('negative',solve(e,'+',-1),None)
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 |
|---|---|---|---|
| minus first | 11 | 22 | Failed |
| minus junction | 21 | 11 | Failed |
| minus last | 20 | 10 | Failed |
| plus first | 10 | 10 | Passed |
| plus junction | 20 | 20 | Passed |
| past end | None | None | Passed |
| negative | None | None | Passed |
SHA-256 / 31c69ece09aff0504918f5f12d15a271ceaf2bfa16def2fd43ca0cd67c5e5a72
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(exons, strand, offset):
for a,b in sorted(exons, reverse=strand=='-'):
if 0 <= offset < b-a: return a+offset if strand=='+' else b-1-offset
offset -= b-a
return None
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
e=[(10*N,10*N+2),(10*N+10,10*N+13)]
check('minus first',solve(e,'-',0),10*N+12)
check('minus junction',solve(e,'-',3),10*N+1)
check('minus last',solve(e,'-',4),10*N)
check('plus first',solve(e,'+',0),10*N)
check('plus junction',solve(e,'+',2),10*N+10)
check('past end',solve(e,'-',5),None)
check('negative',solve(e,'+',-1),None)
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 |
|---|---|---|---|
| minus first | 22 | 22 | Passed |
| minus junction | 11 | 11 | Passed |
| minus last | 10 | 10 | Passed |
| plus first | 10 | 10 | Passed |
| plus junction | 20 | 20 | Passed |
| past end | None | None | Passed |
| negative | None | None | Passed |
SHA-256 / 54abb47e9905e1d02af4e0ce186389801312d0fecd18bc2b8b8b57aaafd2fd2a
Verification & scope
Synthetic coordinate fixtures only; not a production annotation or alignment implementation. 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.881697+00:00.
Case digest / fd9e4991bba62b265c5968d07b9546183639d8ce98492baafacd17c7a1764bea