FAILURE MAP
← Case archive

FA-80616 / Bidirectional text layout / Open access

Paired bracket direction: embedding match test · case 01

A pair containing both directions resolves to the opposite direction.

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

ROOT CAUSE

Only the first strong type inside is compared with the embedding direction.

VERIFIED REPAIR

Resolve to the embedding direction if any inside strong type matches it.

Unsuccessful approach: A majority vote is still not the rule.

Case contract

Input [classes, bracket pairs, embedding level, sos]. Process pairs in opener order. Strong types inside (EN/AN count as R) matching the embedding direction set both brackets to it; if only the opposite direction is inside, use the first strong type before the opener (checking already-updated brackets; sos if none); with no strong type inside leave them. Return classes.

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, pairs, level, sos = x
    t = list(types)
    e = 'L' if level % 2 == 0 else 'R'
    def dirof(c):
        if c == 'L':
            return 'L'
        if c in ('R', 'EN', 'AN'):
            return 'R'
        return None
    for o, c in sorted(pairs):
        inside = [dirof(t[k]) for k in range(o + 1, c)]
        inside = [d for d in inside if d]
        if not inside:
            continue
        if inside[0] == e:
            new = e
        else:
            ctx = sos
            for k in range(o - 1, -1, -1):
                d = dirof(t[k])
                if d:
                    ctx = d
                    break
            new = ctx
        t[o] = new
        t[c] = new
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'L', 'ON', 'ON', 'R', 'ON'], [[1, 8], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']), ('regression: embedding match test', [['ON', 'R', 'ON', 'L', 'ON', 'ON', 'L', 'ON', 'ON', 'R', 'R'], [[2, 4], [0, 5]], 2, 'R'], ['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'R', 'ON', 'EN', 'L', 'ON', 'L', 'L'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('control layout', [['L', 'ON', 'ON', 'R', 'ON', 'ON', 'R', 'R'], [[1, 5], [2, 4]], 1, 'L'], ['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']), ('control layout', [['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'], [[10, 11]], 0, 'R'], ['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'])], [('regression: embedding match test', [['EN', 'ON', 'ON', 'ON', 'ON', 'R', 'L', 'ON', 'L', 'R'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'ON', 'ON', 'ON', 'R', 'L', 'L', 'L', 'R']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'AN', 'ON', 'ON', 'L', 'ON', 'ON', 'L', 'ON'], [[5, 7], [2, 8]], 0, 'R'], ['ON', 'ON', 'L', 'AN', 'ON', 'L', 'L', 'L', 'L', 'L', 'ON']), ('regression: embedding match test', [['L', 'ON', 'ON', 'L', 'ON', 'EN', 'ON', 'R', 'L'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'EN', 'R', 'R', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 2, 'L'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'ON', 'ON', 'R', 'L'], [[1, 7], [2, 5]], 1, 'R'], ['R', 'R', 'R', 'AN', 'L', 'R', 'ON', 'R', 'R', 'L']), ('control layout', [['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'], [], 2, 'R'], ['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'R', 'ON', 'ON', 'L', 'ON'], [[1, 7], [2, 4]], 2, 'R'], ['ON', 'L', 'L', 'R', 'L', 'ON', 'L', 'L']), ('partial-repair probe', [['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON'], [[8, 11]], 2, 'R'], ['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'L', 'L', 'R', 'L']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R'], [[4, 6]], 2, 'R'], ['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R']), ('control layout', [['ON', 'EN', 'R'], [], 2, 'R'], ['ON', 'EN', 'R'])], [('regression: embedding match test', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'ON', 'R'], [[1, 8], [2, 5]], 0, 'L'], ['R', 'L', 'L', 'AN', 'L', 'L', 'L', 'ON', 'L', 'R']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON', 'L'], [[1, 6], [2, 4]], 2, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'L', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('partial-repair probe', [['ON', 'L', 'R', 'ON', 'ON', 'L', 'L', 'R', 'R', 'ON', 'R', 'L'], [[0, 4]], 2, 'R'], ['L', 'L', 'R', 'ON', 'L', 'L', 'L', 'R', 'R', 'ON', 'R', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['L', 'AN', 'L', 'ON'], [], 0, 'L'], ['L', 'AN', 'L', 'ON']), ('control layout', [['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'], [], 2, 'L'], ['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('regression: embedding match test', [['L', 'ON', 'R', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'EN', 'L', 'AN'], [[3, 6]], 2, 'R'], ['L', 'ON', 'R', 'L', 'AN', 'L', 'L', 'L', 'ON', 'EN', 'L', 'AN']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'R', 'ON', 'L', 'L', 'ON', 'L'], [[1, 8], [2, 5]], 2, 'R'], ['R', 'L', 'L', 'R', 'R', 'L', 'L', 'L', 'L', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('control layout', [['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L'], [], 0, 'R'], ['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L']), ('control layout', [['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'], [], 1, 'R'], ['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'])]]
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
nested pair uses updated outer bracket['R', 'R', 'R', 'R', 'R', 'L', 'R']['R', 'L', 'L', 'R', 'L', 'L', 'L']Failed
regression: embedding match test['R', 'R', 'R', 'R', 'L', 'R', 'ON', 'R', 'R']['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']Failed
regression: embedding match test['R', 'R', 'L', 'L', 'L', 'R', 'L', 'ON', 'ON', 'R', 'R']['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']Failed
regression: embedding match test['EN', 'R', 'R', 'R', 'R', 'EN', 'L', 'R', 'L', 'L']['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']Failed
number inside brackets in RTL context['R', 'R', 'EN', 'R']['R', 'R', 'EN', 'R']Passed
nested pair in RTL embedding['L', 'L', 'L', 'L', 'L', 'R', 'L']['L', 'R', 'R', 'L', 'R', 'R', 'R']Failed
control layout['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']Passed
control layout['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']Passed

SHA-256 / 9a57e385ff2135923b6f875444dc71ebb8e7daad9131298e2655c1491591b442

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    types, pairs, level, sos = x
    t = list(types)
    e = 'L' if level % 2 == 0 else 'R'
    def dirof(c):
        if c == 'L':
            return 'L'
        if c in ('R', 'EN', 'AN'):
            return 'R'
        return None
    for o, c in sorted(pairs):
        inside = [dirof(t[k]) for k in range(o + 1, c)]
        inside = [d for d in inside if d]
        if not inside:
            continue
        if inside.count(e) > len(inside) // 2:
            new = e
        else:
            ctx = sos
            for k in range(o - 1, -1, -1):
                d = dirof(t[k])
                if d:
                    ctx = d
                    break
            new = ctx
        t[o] = new
        t[c] = new
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'L', 'ON', 'ON', 'R', 'ON'], [[1, 8], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']), ('regression: embedding match test', [['ON', 'R', 'ON', 'L', 'ON', 'ON', 'L', 'ON', 'ON', 'R', 'R'], [[2, 4], [0, 5]], 2, 'R'], ['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'R', 'ON', 'EN', 'L', 'ON', 'L', 'L'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('control layout', [['L', 'ON', 'ON', 'R', 'ON', 'ON', 'R', 'R'], [[1, 5], [2, 4]], 1, 'L'], ['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']), ('control layout', [['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'], [[10, 11]], 0, 'R'], ['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'])], [('regression: embedding match test', [['EN', 'ON', 'ON', 'ON', 'ON', 'R', 'L', 'ON', 'L', 'R'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'ON', 'ON', 'ON', 'R', 'L', 'L', 'L', 'R']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'AN', 'ON', 'ON', 'L', 'ON', 'ON', 'L', 'ON'], [[5, 7], [2, 8]], 0, 'R'], ['ON', 'ON', 'L', 'AN', 'ON', 'L', 'L', 'L', 'L', 'L', 'ON']), ('regression: embedding match test', [['L', 'ON', 'ON', 'L', 'ON', 'EN', 'ON', 'R', 'L'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'EN', 'R', 'R', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 2, 'L'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'ON', 'ON', 'R', 'L'], [[1, 7], [2, 5]], 1, 'R'], ['R', 'R', 'R', 'AN', 'L', 'R', 'ON', 'R', 'R', 'L']), ('control layout', [['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'], [], 2, 'R'], ['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'R', 'ON', 'ON', 'L', 'ON'], [[1, 7], [2, 4]], 2, 'R'], ['ON', 'L', 'L', 'R', 'L', 'ON', 'L', 'L']), ('partial-repair probe', [['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON'], [[8, 11]], 2, 'R'], ['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'L', 'L', 'R', 'L']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R'], [[4, 6]], 2, 'R'], ['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R']), ('control layout', [['ON', 'EN', 'R'], [], 2, 'R'], ['ON', 'EN', 'R'])], [('regression: embedding match test', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'ON', 'R'], [[1, 8], [2, 5]], 0, 'L'], ['R', 'L', 'L', 'AN', 'L', 'L', 'L', 'ON', 'L', 'R']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON', 'L'], [[1, 6], [2, 4]], 2, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'L', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('partial-repair probe', [['ON', 'L', 'R', 'ON', 'ON', 'L', 'L', 'R', 'R', 'ON', 'R', 'L'], [[0, 4]], 2, 'R'], ['L', 'L', 'R', 'ON', 'L', 'L', 'L', 'R', 'R', 'ON', 'R', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['L', 'AN', 'L', 'ON'], [], 0, 'L'], ['L', 'AN', 'L', 'ON']), ('control layout', [['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'], [], 2, 'L'], ['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('regression: embedding match test', [['L', 'ON', 'R', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'EN', 'L', 'AN'], [[3, 6]], 2, 'R'], ['L', 'ON', 'R', 'L', 'AN', 'L', 'L', 'L', 'ON', 'EN', 'L', 'AN']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'R', 'ON', 'L', 'L', 'ON', 'L'], [[1, 8], [2, 5]], 2, 'R'], ['R', 'L', 'L', 'R', 'R', 'L', 'L', 'L', 'L', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('control layout', [['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L'], [], 0, 'R'], ['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L']), ('control layout', [['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'], [], 1, 'R'], ['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'])]]
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
nested pair uses updated outer bracket['R', 'R', 'R', 'R', 'R', 'L', 'R']['R', 'L', 'L', 'R', 'L', 'L', 'L']Failed
regression: embedding match test['R', 'R', 'R', 'R', 'L', 'R', 'ON', 'R', 'R']['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']Failed
regression: embedding match test['R', 'R', 'L', 'L', 'L', 'R', 'L', 'ON', 'ON', 'R', 'R']['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']Failed
regression: embedding match test['EN', 'R', 'R', 'R', 'R', 'EN', 'L', 'R', 'L', 'L']['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']Failed
number inside brackets in RTL context['R', 'R', 'EN', 'R']['R', 'R', 'EN', 'R']Passed
nested pair in RTL embedding['L', 'L', 'L', 'L', 'L', 'R', 'L']['L', 'R', 'R', 'L', 'R', 'R', 'R']Failed
control layout['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']Passed
control layout['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']Passed

SHA-256 / 95dff106afc195e9ead91cf74c285ec2dc200454abf7ff7d41d057d07190c1d9

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    types, pairs, level, sos = x
    t = list(types)
    e = 'L' if level % 2 == 0 else 'R'
    def dirof(c):
        if c == 'L':
            return 'L'
        if c in ('R', 'EN', 'AN'):
            return 'R'
        return None
    for o, c in sorted(pairs):
        inside = [dirof(t[k]) for k in range(o + 1, c)]
        inside = [d for d in inside if d]
        if not inside:
            continue
        if e in inside:
            new = e
        else:
            ctx = sos
            for k in range(o - 1, -1, -1):
                d = dirof(t[k])
                if d:
                    ctx = d
                    break
            new = ctx
        t[o] = new
        t[c] = new
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'L', 'ON', 'ON', 'R', 'ON'], [[1, 8], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']), ('regression: embedding match test', [['ON', 'R', 'ON', 'L', 'ON', 'ON', 'L', 'ON', 'ON', 'R', 'R'], [[2, 4], [0, 5]], 2, 'R'], ['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'R', 'ON', 'EN', 'L', 'ON', 'L', 'L'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('control layout', [['L', 'ON', 'ON', 'R', 'ON', 'ON', 'R', 'R'], [[1, 5], [2, 4]], 1, 'L'], ['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']), ('control layout', [['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'], [[10, 11]], 0, 'R'], ['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON'])], [('regression: embedding match test', [['EN', 'ON', 'ON', 'ON', 'ON', 'R', 'L', 'ON', 'L', 'R'], [[1, 7], [2, 4]], 0, 'R'], ['EN', 'L', 'ON', 'ON', 'ON', 'R', 'L', 'L', 'L', 'R']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'AN', 'ON', 'ON', 'L', 'ON', 'ON', 'L', 'ON'], [[5, 7], [2, 8]], 0, 'R'], ['ON', 'ON', 'L', 'AN', 'ON', 'L', 'L', 'L', 'L', 'L', 'ON']), ('regression: embedding match test', [['L', 'ON', 'ON', 'L', 'ON', 'EN', 'ON', 'R', 'L'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'EN', 'R', 'R', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 2, 'L'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'ON', 'ON', 'R', 'L'], [[1, 7], [2, 5]], 1, 'R'], ['R', 'R', 'R', 'AN', 'L', 'R', 'ON', 'R', 'R', 'L']), ('control layout', [['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'], [], 2, 'R'], ['R', 'R', 'EN', 'R', 'L', 'EN', 'ON', 'AN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['ON', 'ON', 'ON', 'R', 'ON', 'ON', 'L', 'ON'], [[1, 7], [2, 4]], 2, 'R'], ['ON', 'L', 'L', 'R', 'L', 'ON', 'L', 'L']), ('partial-repair probe', [['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON'], [[8, 11]], 2, 'R'], ['L', 'ON', 'ON', 'R', 'EN', 'ON', 'ON', 'ON', 'L', 'L', 'R', 'L']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R'], [[4, 6]], 2, 'R'], ['R', 'AN', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'R', 'R']), ('control layout', [['ON', 'EN', 'R'], [], 2, 'R'], ['ON', 'EN', 'R'])], [('regression: embedding match test', [['R', 'ON', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'ON', 'R'], [[1, 8], [2, 5]], 0, 'L'], ['R', 'L', 'L', 'AN', 'L', 'L', 'L', 'ON', 'L', 'R']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON', 'L'], [[1, 6], [2, 4]], 2, 'R'], ['R', 'L', 'L', 'R', 'L', 'L', 'L', 'L']), ('partial-repair probe', [['R', 'ON', 'ON', 'L', 'R', 'ON', 'ON', 'ON'], [[1, 7], [2, 5]], 0, 'R'], ['R', 'L', 'L', 'L', 'R', 'L', 'ON', 'L']), ('partial-repair probe', [['ON', 'L', 'R', 'ON', 'ON', 'L', 'L', 'R', 'R', 'ON', 'R', 'L'], [[0, 4]], 2, 'R'], ['L', 'L', 'R', 'ON', 'L', 'L', 'L', 'R', 'R', 'ON', 'R', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('nested pair uses updated outer bracket', [['R', 'ON', 'ON', 'R', 'ON', 'L', 'ON'], [[1, 6], [2, 4]], 0, 'L'], ['R', 'L', 'L', 'R', 'L', 'L', 'L']), ('control layout', [['L', 'AN', 'L', 'ON'], [], 0, 'L'], ['L', 'AN', 'L', 'ON']), ('control layout', [['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'], [], 2, 'L'], ['ON', 'R', 'R', 'AN', 'L', 'AN', 'EN', 'ON'])], [('regression: embedding match test', [['R', 'AN', 'L', 'ON', 'L', 'R', 'L', 'L', 'ON', 'AN'], [[3, 8]], 1, 'R'], ['R', 'AN', 'L', 'R', 'L', 'R', 'L', 'L', 'R', 'AN']), ('regression: embedding match test', [['EN', 'ON', 'ON', 'AN', 'L', 'ON', 'R', 'L', 'ON', 'R', 'R'], [[1, 8], [2, 5]], 2, 'R'], ['EN', 'L', 'L', 'AN', 'L', 'L', 'R', 'L', 'L', 'R', 'R']), ('regression: embedding match test', [['L', 'ON', 'R', 'ON', 'AN', 'L', 'ON', 'L', 'ON', 'EN', 'L', 'AN'], [[3, 6]], 2, 'R'], ['L', 'ON', 'R', 'L', 'AN', 'L', 'L', 'L', 'ON', 'EN', 'L', 'AN']), ('regression: embedding match test', [['R', 'ON', 'ON', 'R', 'R', 'ON', 'L', 'L', 'ON', 'L'], [[1, 8], [2, 5]], 2, 'R'], ['R', 'L', 'L', 'R', 'R', 'L', 'L', 'L', 'L', 'L']), ('nested pair in RTL embedding', [['L', 'ON', 'ON', 'L', 'ON', 'R', 'ON'], [[1, 6], [2, 4]], 1, 'R'], ['L', 'R', 'R', 'L', 'R', 'R', 'R']), ('number inside brackets in RTL context', [['R', 'ON', 'EN', 'ON'], [[1, 3]], 0, 'L'], ['R', 'R', 'EN', 'R']), ('control layout', [['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L'], [], 0, 'R'], ['R', 'L', 'L', 'ON', 'AN', 'ON', 'R', 'ON', 'ON', 'R', 'ON', 'R', 'L']), ('control layout', [['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'], [], 1, 'R'], ['ON', 'ON', 'R', 'L', 'R', 'EN', 'R', 'ON', 'ON', 'L', 'ON'])]]
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
nested pair uses updated outer bracket['R', 'L', 'L', 'R', 'L', 'L', 'L']['R', 'L', 'L', 'R', 'L', 'L', 'L']Passed
regression: embedding match test['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']['R', 'L', 'L', 'R', 'L', 'L', 'ON', 'R', 'L']Passed
regression: embedding match test['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']['L', 'R', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'R', 'R']Passed
regression: embedding match test['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']['EN', 'L', 'L', 'R', 'L', 'EN', 'L', 'L', 'L', 'L']Passed
number inside brackets in RTL context['R', 'R', 'EN', 'R']['R', 'R', 'EN', 'R']Passed
nested pair in RTL embedding['L', 'R', 'R', 'L', 'R', 'R', 'R']['L', 'R', 'R', 'L', 'R', 'R', 'R']Passed
control layout['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']['L', 'R', 'R', 'R', 'R', 'R', 'R', 'R']Passed
control layout['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']['R', 'R', 'AN', 'R', 'L', 'L', 'L', 'L', 'EN', 'L', 'ON', 'ON', 'ON']Passed

SHA-256 / 954f78ffa8ff6ea6e7d1c912b4d9f34afa38fbf9fc9b93c57785517e241df1f8

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:55.501344+00:00.

Case digest / ffb1ca720669d01bec1a3a1ba781c3422d0d50ba374ee0e5f2241bfdca9c773e