FAILURE MAP
← Case archive

FA-80451 / Bidirectional text layout / Open access

Implicit level runs: numbers at odd level · case 01

Numbers inside RTL text read right-to-left digit by digit.

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

ROOT CAUSE

At odd levels only L is raised; numbers stay at the odd level.

VERIFIED REPAIR

Raise L, EN and AN by one at odd levels.

Unsuccessful approach: Raising EN but not AN mishandles Arabic-Indic digits.

Case contract

Input [resolved classes L/R/EN/AN, embedding levels]. At even levels R goes up one and AN/EN up two; at odd levels L, EN and AN go up one. Return level runs [start, end exclusive, level] of equal final levels.

Why this case matters

Mixed right-to-left and left-to-right text must resolve levels and visual order exactly, or words, numbers and carets land in the wrong place.

1 / The failure

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

N = 1
observations = []
def solve(x):
    types, levels = x
    out = []
    for c, lv in zip(types, levels):
        if lv % 2 == 0:
            if c == 'R':
                out.append(lv + 1)
            elif c in ('AN', 'EN'):
                out.append(lv + 2)
            else:
                out.append(lv)
        else:
            if c in ('L',):
                out.append(lv + 1)
            else:
                out.append(lv)
    runs = []
    for i, lv in enumerate(out):
        if runs and runs[-1][2] == lv:
            runs[-1][1] = i + 1
        else:
            runs.append([i, i + 1, lv])
    return runs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('regression: numbers at odd level', [['AN', 'R', 'EN'], [1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2]]), ('regression: numbers at odd level', [['EN', 'EN', 'L', 'L', 'L', 'AN', 'EN', 'R', 'R', 'L', 'AN', 'R'], [2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2]], [[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]), ('regression: numbers at odd level', [['L', 'R', 'AN', 'AN'], [3, 3, 3, 3]], [[0, 1, 4], [1, 2, 3], [2, 4, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]]), ('control layout', [['R', 'AN'], [2, 2]], [[0, 1, 3], [1, 2, 4]])], [('regression: numbers at odd level', [['AN', 'R', 'R', 'L', 'R', 'AN', 'EN', 'AN', 'R', 'EN'], [1, 1, 2, 2, 2, 2, 2, 2, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 3], [3, 4, 2], [4, 5, 3], [5, 8, 4], [8, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['AN', 'R', 'R', 'EN', 'L', 'R'], [1, 1, 1, 1, 0, 1]], [[0, 1, 2], [1, 3, 1], [3, 4, 2], [4, 5, 0], [5, 6, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'AN', 'R', 'EN', 'AN', 'R', 'R', 'AN'], [1, 1, 1, 1, 0, 0, 0, 0, 1, 1]], [[0, 4, 2], [4, 5, 1], [5, 7, 2], [7, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'L', 'AN', 'L', 'EN', 'AN', 'L', 'L', 'L'], [3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 1]], [[0, 2, 3], [2, 3, 4], [3, 6, 2], [6, 9, 4], [9, 11, 2]]), ('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['R', 'AN'], [3, 4]], [[0, 1, 3], [1, 2, 6]]), ('control layout', [['R', 'AN', 'L', 'L', 'EN', 'L', 'EN', 'AN'], [4, 4, 4, 4, 4, 4, 4, 2]], [[0, 1, 5], [1, 2, 6], [2, 4, 4], [4, 5, 6], [5, 6, 4], [6, 7, 6], [7, 8, 4]])], [('regression: numbers at odd level', [['R', 'L', 'EN', 'L', 'AN', 'AN'], [2, 2, 2, 2, 2, 1]], [[0, 1, 3], [1, 2, 2], [2, 3, 4], [3, 4, 2], [4, 5, 4], [5, 6, 2]]), ('regression: numbers at odd level', [['EN', 'R', 'AN', 'R'], [1, 1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('regression: numbers at odd level', [['AN', 'EN', 'EN', 'EN', 'EN', 'AN', 'R'], [2, 2, 2, 1, 1, 1, 1]], [[0, 3, 4], [3, 6, 2], [6, 7, 1]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['L', 'EN', 'AN', 'L', 'R', 'R', 'R', 'L', 'EN'], [0, 0, 0, 1, 1, 1, 0, 0, 0]], [[0, 1, 0], [1, 4, 2], [4, 7, 1], [7, 8, 0], [8, 9, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]])], [('regression: numbers at odd level', [['L', 'L', 'R', 'R', 'R', 'AN'], [4, 4, 2, 2, 2, 3]], [[0, 2, 4], [2, 5, 3], [5, 6, 4]]), ('regression: numbers at odd level', [['R', 'EN', 'R', 'EN', 'R', 'R', 'L', 'AN'], [3, 3, 1, 1, 1, 0, 0, 0]], [[0, 1, 3], [1, 2, 4], [2, 3, 1], [3, 4, 2], [4, 6, 1], [6, 7, 0], [7, 8, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'L', 'EN', 'EN', 'AN', 'R', 'AN', 'R'], [1, 1, 1, 1, 1, 1, 2, 2, 2]], [[0, 6, 2], [6, 7, 3], [7, 8, 4], [8, 9, 3]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['AN', 'L', 'AN', 'L', 'L'], [0, 0, 0, 1, 1]], [[0, 1, 2], [1, 2, 0], [2, 5, 2]]), ('control layout', [['AN', 'L', 'R'], [2, 2, 2]], [[0, 1, 4], [1, 2, 2], [2, 3, 3]])], [('regression: numbers at odd level', [['EN', 'L', 'L', 'R', 'R', 'L', 'R', 'AN', 'L', 'R', 'AN'], [3, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1]], [[0, 1, 4], [1, 3, 2], [3, 5, 3], [5, 6, 2], [6, 7, 1], [7, 9, 2], [9, 10, 1], [10, 11, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'EN', 'AN'], [0, 0, 0, 1, 1]], [[0, 2, 1], [2, 3, 0], [3, 5, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'EN', 'EN', 'EN', 'AN', 'L'], [1, 1, 1, 1, 2, 2, 2]], [[0, 4, 2], [4, 6, 4], [6, 7, 2]]), ('regression: numbers at odd level', [['L', 'EN', 'L', 'EN', 'AN', 'AN', 'L', 'R', 'AN', 'L'], [2, 2, 2, 2, 1, 1, 1, 1, 2, 3]], [[0, 1, 2], [1, 2, 4], [2, 3, 2], [3, 4, 4], [4, 7, 2], [7, 8, 1], [8, 10, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['EN', 'R', 'AN', 'R'], [0, 0, 0, 0]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('control layout', [['EN', 'L', 'EN', 'R', 'EN', 'AN', 'R', 'AN', 'L'], [0, 2, 2, 2, 2, 2, 0, 0, 3]], [[0, 2, 2], [2, 3, 4], [3, 4, 3], [4, 6, 4], [6, 7, 1], [7, 8, 2], [8, 9, 4]])]]
for label, args, expected in fixtures[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
number in RTL text[[0, 3, 1]][[0, 1, 1], [1, 2, 2], [2, 3, 1]]Failed
regression: numbers at odd level[[0, 3, 1]][[0, 1, 2], [1, 2, 1], [2, 3, 2]]Failed
regression: numbers at odd level[[0, 2, 4], [2, 5, 2], [5, 9, 1], [9, 11, 4], [11, 12, 3]][[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]Failed
regression: numbers at odd level[[0, 1, 4], [1, 4, 3]][[0, 1, 4], [1, 2, 3], [2, 4, 4]]Failed
number in LTR text[[0, 1, 0], [1, 2, 2], [2, 3, 0]][[0, 1, 0], [1, 2, 2], [2, 3, 0]]Passed
level two embedding[[0, 1, 3], [1, 2, 2]][[0, 1, 3], [1, 2, 2]]Passed
control layout[[0, 1, 3]][[0, 1, 3]]Passed
control layout[[0, 1, 3], [1, 2, 4]][[0, 1, 3], [1, 2, 4]]Passed

SHA-256 / c1c43817ec1760b9a474e25afdf2afcd95ffd73e0aed16479634367a71c4c9d8

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    types, levels = x
    out = []
    for c, lv in zip(types, levels):
        if lv % 2 == 0:
            if c == 'R':
                out.append(lv + 1)
            elif c in ('AN', 'EN'):
                out.append(lv + 2)
            else:
                out.append(lv)
        else:
            if c in ('L', 'EN'):
                out.append(lv + 1)
            else:
                out.append(lv)
    runs = []
    for i, lv in enumerate(out):
        if runs and runs[-1][2] == lv:
            runs[-1][1] = i + 1
        else:
            runs.append([i, i + 1, lv])
    return runs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('regression: numbers at odd level', [['AN', 'R', 'EN'], [1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2]]), ('regression: numbers at odd level', [['EN', 'EN', 'L', 'L', 'L', 'AN', 'EN', 'R', 'R', 'L', 'AN', 'R'], [2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2]], [[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]), ('regression: numbers at odd level', [['L', 'R', 'AN', 'AN'], [3, 3, 3, 3]], [[0, 1, 4], [1, 2, 3], [2, 4, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]]), ('control layout', [['R', 'AN'], [2, 2]], [[0, 1, 3], [1, 2, 4]])], [('regression: numbers at odd level', [['AN', 'R', 'R', 'L', 'R', 'AN', 'EN', 'AN', 'R', 'EN'], [1, 1, 2, 2, 2, 2, 2, 2, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 3], [3, 4, 2], [4, 5, 3], [5, 8, 4], [8, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['AN', 'R', 'R', 'EN', 'L', 'R'], [1, 1, 1, 1, 0, 1]], [[0, 1, 2], [1, 3, 1], [3, 4, 2], [4, 5, 0], [5, 6, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'AN', 'R', 'EN', 'AN', 'R', 'R', 'AN'], [1, 1, 1, 1, 0, 0, 0, 0, 1, 1]], [[0, 4, 2], [4, 5, 1], [5, 7, 2], [7, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'L', 'AN', 'L', 'EN', 'AN', 'L', 'L', 'L'], [3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 1]], [[0, 2, 3], [2, 3, 4], [3, 6, 2], [6, 9, 4], [9, 11, 2]]), ('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['R', 'AN'], [3, 4]], [[0, 1, 3], [1, 2, 6]]), ('control layout', [['R', 'AN', 'L', 'L', 'EN', 'L', 'EN', 'AN'], [4, 4, 4, 4, 4, 4, 4, 2]], [[0, 1, 5], [1, 2, 6], [2, 4, 4], [4, 5, 6], [5, 6, 4], [6, 7, 6], [7, 8, 4]])], [('regression: numbers at odd level', [['R', 'L', 'EN', 'L', 'AN', 'AN'], [2, 2, 2, 2, 2, 1]], [[0, 1, 3], [1, 2, 2], [2, 3, 4], [3, 4, 2], [4, 5, 4], [5, 6, 2]]), ('regression: numbers at odd level', [['EN', 'R', 'AN', 'R'], [1, 1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('regression: numbers at odd level', [['AN', 'EN', 'EN', 'EN', 'EN', 'AN', 'R'], [2, 2, 2, 1, 1, 1, 1]], [[0, 3, 4], [3, 6, 2], [6, 7, 1]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['L', 'EN', 'AN', 'L', 'R', 'R', 'R', 'L', 'EN'], [0, 0, 0, 1, 1, 1, 0, 0, 0]], [[0, 1, 0], [1, 4, 2], [4, 7, 1], [7, 8, 0], [8, 9, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]])], [('regression: numbers at odd level', [['L', 'L', 'R', 'R', 'R', 'AN'], [4, 4, 2, 2, 2, 3]], [[0, 2, 4], [2, 5, 3], [5, 6, 4]]), ('regression: numbers at odd level', [['R', 'EN', 'R', 'EN', 'R', 'R', 'L', 'AN'], [3, 3, 1, 1, 1, 0, 0, 0]], [[0, 1, 3], [1, 2, 4], [2, 3, 1], [3, 4, 2], [4, 6, 1], [6, 7, 0], [7, 8, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'L', 'EN', 'EN', 'AN', 'R', 'AN', 'R'], [1, 1, 1, 1, 1, 1, 2, 2, 2]], [[0, 6, 2], [6, 7, 3], [7, 8, 4], [8, 9, 3]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['AN', 'L', 'AN', 'L', 'L'], [0, 0, 0, 1, 1]], [[0, 1, 2], [1, 2, 0], [2, 5, 2]]), ('control layout', [['AN', 'L', 'R'], [2, 2, 2]], [[0, 1, 4], [1, 2, 2], [2, 3, 3]])], [('regression: numbers at odd level', [['EN', 'L', 'L', 'R', 'R', 'L', 'R', 'AN', 'L', 'R', 'AN'], [3, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1]], [[0, 1, 4], [1, 3, 2], [3, 5, 3], [5, 6, 2], [6, 7, 1], [7, 9, 2], [9, 10, 1], [10, 11, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'EN', 'AN'], [0, 0, 0, 1, 1]], [[0, 2, 1], [2, 3, 0], [3, 5, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'EN', 'EN', 'EN', 'AN', 'L'], [1, 1, 1, 1, 2, 2, 2]], [[0, 4, 2], [4, 6, 4], [6, 7, 2]]), ('regression: numbers at odd level', [['L', 'EN', 'L', 'EN', 'AN', 'AN', 'L', 'R', 'AN', 'L'], [2, 2, 2, 2, 1, 1, 1, 1, 2, 3]], [[0, 1, 2], [1, 2, 4], [2, 3, 2], [3, 4, 4], [4, 7, 2], [7, 8, 1], [8, 10, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['EN', 'R', 'AN', 'R'], [0, 0, 0, 0]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('control layout', [['EN', 'L', 'EN', 'R', 'EN', 'AN', 'R', 'AN', 'L'], [0, 2, 2, 2, 2, 2, 0, 0, 3]], [[0, 2, 2], [2, 3, 4], [3, 4, 3], [4, 6, 4], [6, 7, 1], [7, 8, 2], [8, 9, 4]])]]
for label, args, expected in fixtures[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
number in RTL text[[0, 3, 1]][[0, 1, 1], [1, 2, 2], [2, 3, 1]]Failed
regression: numbers at odd level[[0, 2, 1], [2, 3, 2]][[0, 1, 2], [1, 2, 1], [2, 3, 2]]Failed
regression: numbers at odd level[[0, 2, 4], [2, 5, 2], [5, 6, 1], [6, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]][[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]Failed
regression: numbers at odd level[[0, 1, 4], [1, 4, 3]][[0, 1, 4], [1, 2, 3], [2, 4, 4]]Failed
number in LTR text[[0, 1, 0], [1, 2, 2], [2, 3, 0]][[0, 1, 0], [1, 2, 2], [2, 3, 0]]Passed
level two embedding[[0, 1, 3], [1, 2, 2]][[0, 1, 3], [1, 2, 2]]Passed
control layout[[0, 1, 3]][[0, 1, 3]]Passed
control layout[[0, 1, 3], [1, 2, 4]][[0, 1, 3], [1, 2, 4]]Passed

SHA-256 / bb17fec852e39cf7c0712d6b85049b8496dc029fcc247fa021b5bdec24199c6a

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    types, levels = x
    out = []
    for c, lv in zip(types, levels):
        if lv % 2 == 0:
            if c == 'R':
                out.append(lv + 1)
            elif c in ('AN', 'EN'):
                out.append(lv + 2)
            else:
                out.append(lv)
        else:
            if c in ('L', 'EN', 'AN'):
                out.append(lv + 1)
            else:
                out.append(lv)
    runs = []
    for i, lv in enumerate(out):
        if runs and runs[-1][2] == lv:
            runs[-1][1] = i + 1
        else:
            runs.append([i, i + 1, lv])
    return runs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('regression: numbers at odd level', [['AN', 'R', 'EN'], [1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2]]), ('regression: numbers at odd level', [['EN', 'EN', 'L', 'L', 'L', 'AN', 'EN', 'R', 'R', 'L', 'AN', 'R'], [2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2]], [[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]), ('regression: numbers at odd level', [['L', 'R', 'AN', 'AN'], [3, 3, 3, 3]], [[0, 1, 4], [1, 2, 3], [2, 4, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]]), ('control layout', [['R', 'AN'], [2, 2]], [[0, 1, 3], [1, 2, 4]])], [('regression: numbers at odd level', [['AN', 'R', 'R', 'L', 'R', 'AN', 'EN', 'AN', 'R', 'EN'], [1, 1, 2, 2, 2, 2, 2, 2, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 3], [3, 4, 2], [4, 5, 3], [5, 8, 4], [8, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['AN', 'R', 'R', 'EN', 'L', 'R'], [1, 1, 1, 1, 0, 1]], [[0, 1, 2], [1, 3, 1], [3, 4, 2], [4, 5, 0], [5, 6, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'AN', 'R', 'EN', 'AN', 'R', 'R', 'AN'], [1, 1, 1, 1, 0, 0, 0, 0, 1, 1]], [[0, 4, 2], [4, 5, 1], [5, 7, 2], [7, 9, 1], [9, 10, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'L', 'AN', 'L', 'EN', 'AN', 'L', 'L', 'L'], [3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 1]], [[0, 2, 3], [2, 3, 4], [3, 6, 2], [6, 9, 4], [9, 11, 2]]), ('number in RTL text', [['R', 'AN', 'R'], [1, 1, 1]], [[0, 1, 1], [1, 2, 2], [2, 3, 1]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['R', 'AN'], [3, 4]], [[0, 1, 3], [1, 2, 6]]), ('control layout', [['R', 'AN', 'L', 'L', 'EN', 'L', 'EN', 'AN'], [4, 4, 4, 4, 4, 4, 4, 2]], [[0, 1, 5], [1, 2, 6], [2, 4, 4], [4, 5, 6], [5, 6, 4], [6, 7, 6], [7, 8, 4]])], [('regression: numbers at odd level', [['R', 'L', 'EN', 'L', 'AN', 'AN'], [2, 2, 2, 2, 2, 1]], [[0, 1, 3], [1, 2, 2], [2, 3, 4], [3, 4, 2], [4, 5, 4], [5, 6, 2]]), ('regression: numbers at odd level', [['EN', 'R', 'AN', 'R'], [1, 1, 1, 1]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('regression: numbers at odd level', [['AN', 'EN', 'EN', 'EN', 'EN', 'AN', 'R'], [2, 2, 2, 1, 1, 1, 1]], [[0, 3, 4], [3, 6, 2], [6, 7, 1]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('control layout', [['L', 'EN', 'AN', 'L', 'R', 'R', 'R', 'L', 'EN'], [0, 0, 0, 1, 1, 1, 0, 0, 0]], [[0, 1, 0], [1, 4, 2], [4, 7, 1], [7, 8, 0], [8, 9, 2]]), ('control layout', [['R'], [3]], [[0, 1, 3]])], [('regression: numbers at odd level', [['L', 'L', 'R', 'R', 'R', 'AN'], [4, 4, 2, 2, 2, 3]], [[0, 2, 4], [2, 5, 3], [5, 6, 4]]), ('regression: numbers at odd level', [['R', 'EN', 'R', 'EN', 'R', 'R', 'L', 'AN'], [3, 3, 1, 1, 1, 0, 0, 0]], [[0, 1, 3], [1, 2, 4], [2, 3, 1], [3, 4, 2], [4, 6, 1], [6, 7, 0], [7, 8, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'L', 'EN', 'EN', 'AN', 'R', 'AN', 'R'], [1, 1, 1, 1, 1, 1, 2, 2, 2]], [[0, 6, 2], [6, 7, 3], [7, 8, 4], [8, 9, 3]]), ('regression: numbers at odd level', [['L', 'AN', 'L', 'EN', 'AN', 'EN', 'R'], [3, 3, 3, 4, 4, 4, 4]], [[0, 3, 4], [3, 6, 6], [6, 7, 5]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['AN', 'L', 'AN', 'L', 'L'], [0, 0, 0, 1, 1]], [[0, 1, 2], [1, 2, 0], [2, 5, 2]]), ('control layout', [['AN', 'L', 'R'], [2, 2, 2]], [[0, 1, 4], [1, 2, 2], [2, 3, 3]])], [('regression: numbers at odd level', [['EN', 'L', 'L', 'R', 'R', 'L', 'R', 'AN', 'L', 'R', 'AN'], [3, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1]], [[0, 1, 4], [1, 3, 2], [3, 5, 3], [5, 6, 2], [6, 7, 1], [7, 9, 2], [9, 10, 1], [10, 11, 2]]), ('regression: numbers at odd level', [['R', 'R', 'L', 'EN', 'AN'], [0, 0, 0, 1, 1]], [[0, 2, 1], [2, 3, 0], [3, 5, 2]]), ('regression: numbers at odd level', [['AN', 'L', 'EN', 'EN', 'EN', 'AN', 'L'], [1, 1, 1, 1, 2, 2, 2]], [[0, 4, 2], [4, 6, 4], [6, 7, 2]]), ('regression: numbers at odd level', [['L', 'EN', 'L', 'EN', 'AN', 'AN', 'L', 'R', 'AN', 'L'], [2, 2, 2, 2, 1, 1, 1, 1, 2, 3]], [[0, 1, 2], [1, 2, 4], [2, 3, 2], [3, 4, 4], [4, 7, 2], [7, 8, 1], [8, 10, 4]]), ('number in LTR text', [['L', 'EN', 'L'], [0, 0, 0]], [[0, 1, 0], [1, 2, 2], [2, 3, 0]]), ('level two embedding', [['R', 'L'], [2, 2]], [[0, 1, 3], [1, 2, 2]]), ('control layout', [['EN', 'R', 'AN', 'R'], [0, 0, 0, 0]], [[0, 1, 2], [1, 2, 1], [2, 3, 2], [3, 4, 1]]), ('control layout', [['EN', 'L', 'EN', 'R', 'EN', 'AN', 'R', 'AN', 'L'], [0, 2, 2, 2, 2, 2, 0, 0, 3]], [[0, 2, 2], [2, 3, 4], [3, 4, 3], [4, 6, 4], [6, 7, 1], [7, 8, 2], [8, 9, 4]])]]
for label, args, expected in fixtures[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
number in RTL text[[0, 1, 1], [1, 2, 2], [2, 3, 1]][[0, 1, 1], [1, 2, 2], [2, 3, 1]]Passed
regression: numbers at odd level[[0, 1, 2], [1, 2, 1], [2, 3, 2]][[0, 1, 2], [1, 2, 1], [2, 3, 2]]Passed
regression: numbers at odd level[[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]][[0, 2, 4], [2, 7, 2], [7, 9, 1], [9, 11, 4], [11, 12, 3]]Passed
regression: numbers at odd level[[0, 1, 4], [1, 2, 3], [2, 4, 4]][[0, 1, 4], [1, 2, 3], [2, 4, 4]]Passed
number in LTR text[[0, 1, 0], [1, 2, 2], [2, 3, 0]][[0, 1, 0], [1, 2, 2], [2, 3, 0]]Passed
level two embedding[[0, 1, 3], [1, 2, 2]][[0, 1, 3], [1, 2, 2]]Passed
control layout[[0, 1, 3]][[0, 1, 3]]Passed
control layout[[0, 1, 3], [1, 2, 4]][[0, 1, 3], [1, 2, 4]]Passed

SHA-256 / 80862e933e7058d34c9dd0137f9953a14491260dd7fac8de0359f6d9402e1e81

Verification & scope

A deterministic toy bidi model over stipulated class labels and integer levels; it is inspired by, but does not claim conformance to, any published algorithm. 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:49:54.104558+00:00.

Case digest / c8ddfe66fefcce0a3118449061c1bb9256bd251b27424fb86558bab7b736fd13