FAILURE MAP
← Case archive

FA-80586 / Bidirectional text layout / Open access

Bracket pair identification: mismatched closer search · case 01

A closer that does not match the top opener is dropped although its opener is deeper.

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

ROOT CAUSE

Only the top of the stack is compared with the closer.

VERIFIED REPAIR

Search down the stack and discard entries above the match.

Unsuccessful approach: Deleting only the matched entry leaves stale openers above it.

Case contract

Input [text, classes, stack limit]. Only characters of class ON take part. Openers ( [ { are pushed; on overflow of the stack limit stop and keep pairs found so far. A closer searches the stack from the top for its opener; if found it pairs and discards that entry and everything above; otherwise it is ignored. Return pairs sorted by opener.

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):
    text, classes, limit = x
    OPEN = {'(': ')', '[': ']', '{': '}'}
    CLOSE = {')', ']', '}'}
    stack = []
    pairs = []
    for i, ch in enumerate(text):
        if classes[i] != 'ON':
            continue
        if ch in OPEN:
            if len(stack) >= limit:
                break
            stack.append((OPEN[ch], i))
        elif ch in CLOSE:
            if stack and stack[-1][0] == ch:
                pairs.append([stack[-1][1], i])
                stack.pop()
    return sorted(pairs)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['(][}([())}}(]', ['ON', 'ON', 'L', 'ON', 'R', 'ON', 'L', 'R', 'ON', 'ON', 'R', 'ON', 'ON'], 3], [[0, 8]]), ('regression: mismatched closer search', ['a([{][[}()]()(', ['R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON'], 4], [[1, 12], [2, 4], [8, 9]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['a](((', ['L', 'L', 'ON', 'R', 'ON'], 3], []), ('control layout', ['a([([', ['R', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['(a)a)[(]{(]}a)', ['ON', 'R', 'ON', 'R', 'L', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'L', 'L', 'ON'], 3], [[0, 2], [5, 7]]), ('regression: mismatched closer search', ['{][{(a}([{(({', ['ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON'], 4], [[3, 6]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['[a[(}](][(){)', ['L', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'ON'], 1], []), ('control layout', ['{}]]a(', ['ON', 'ON', 'R', 'ON', 'R', 'ON'], 4], [[0, 1]])], [('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['{[(]aa)a][', ['ON', 'ON', 'ON', 'ON', 'R', 'R', 'ON', 'R', 'ON', 'L'], 3], [[1, 3]]), ('regression: mismatched closer search', ['{(}){aa{(', ['ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON', 'ON'], 3], [[0, 2]]), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['(a', ['ON', 'L'], 3], []), ('control layout', ['[(', ['ON', 'ON'], 2], [])], [('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['[a{({)', ['ON', 'L', 'ON', 'ON', 'ON', 'ON'], 4], [[3, 5]]), ('regression: mismatched closer search', ['{a([a)([()][)]', ['L', 'R', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 4], [[2, 5], [6, 12], [7, 10], [8, 9]]), ('regression: mismatched closer search', ['a{({[}}]]((', ['L', 'R', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[3, 5]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['(}(', ['ON', 'ON', 'L'], 1], []), ('control layout', [')([()[]a((})', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['}(}}[))}', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON'], 4], [[1, 5]]), ('regression: mismatched closer search', ['{(}{(', ['ON', 'ON', 'ON', 'R', 'ON'], 3], [[0, 2]]), ('regression: mismatched closer search', ['}[(]]([aa()(}]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON'], 3], [[1, 3], [6, 13], [9, 10]]), ('regression: mismatched closer search', [']({(}{()a}(})a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'L', 'ON', 'ON', 'ON', 'R'], 4], [[1, 12], [2, 4], [5, 11]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('control layout', ['{({{{{}a((a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'L'], 2], []), ('control layout', [')a(', ['ON', 'R', 'ON'], 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
mismatched inner bracket[[1, 3]][[0, 2]]Failed
regression: mismatched closer search[][[0, 2], [3, 7], [8, 9]]Failed
regression: mismatched closer search[][[0, 8]]Failed
regression: mismatched closer search[][[1, 12], [2, 4], [8, 9]]Failed
stack overflow stops[][]Passed
overridden bracket ignored[][]Passed
control layout[][]Passed
control layout[][]Passed

SHA-256 / 33de3930bcc0c2e79f77d5e2f939199aeaad2864d08a9f69857a3c2d93455860

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    text, classes, limit = x
    OPEN = {'(': ')', '[': ']', '{': '}'}
    CLOSE = {')', ']', '}'}
    stack = []
    pairs = []
    for i, ch in enumerate(text):
        if classes[i] != 'ON':
            continue
        if ch in OPEN:
            if len(stack) >= limit:
                break
            stack.append((OPEN[ch], i))
        elif ch in CLOSE:
            for k in range(len(stack) - 1, -1, -1):
                if stack[k][0] == ch:
                    pairs.append([stack[k][1], i])
                    del stack[k]
                    break
    return sorted(pairs)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['(][}([())}}(]', ['ON', 'ON', 'L', 'ON', 'R', 'ON', 'L', 'R', 'ON', 'ON', 'R', 'ON', 'ON'], 3], [[0, 8]]), ('regression: mismatched closer search', ['a([{][[}()]()(', ['R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON'], 4], [[1, 12], [2, 4], [8, 9]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['a](((', ['L', 'L', 'ON', 'R', 'ON'], 3], []), ('control layout', ['a([([', ['R', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['(a)a)[(]{(]}a)', ['ON', 'R', 'ON', 'R', 'L', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'L', 'L', 'ON'], 3], [[0, 2], [5, 7]]), ('regression: mismatched closer search', ['{][{(a}([{(({', ['ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON'], 4], [[3, 6]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['[a[(}](][(){)', ['L', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'ON'], 1], []), ('control layout', ['{}]]a(', ['ON', 'ON', 'R', 'ON', 'R', 'ON'], 4], [[0, 1]])], [('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['{[(]aa)a][', ['ON', 'ON', 'ON', 'ON', 'R', 'R', 'ON', 'R', 'ON', 'L'], 3], [[1, 3]]), ('regression: mismatched closer search', ['{(}){aa{(', ['ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON', 'ON'], 3], [[0, 2]]), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['(a', ['ON', 'L'], 3], []), ('control layout', ['[(', ['ON', 'ON'], 2], [])], [('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['[a{({)', ['ON', 'L', 'ON', 'ON', 'ON', 'ON'], 4], [[3, 5]]), ('regression: mismatched closer search', ['{a([a)([()][)]', ['L', 'R', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 4], [[2, 5], [6, 12], [7, 10], [8, 9]]), ('regression: mismatched closer search', ['a{({[}}]]((', ['L', 'R', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[3, 5]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['(}(', ['ON', 'ON', 'L'], 1], []), ('control layout', [')([()[]a((})', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['}(}}[))}', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON'], 4], [[1, 5]]), ('regression: mismatched closer search', ['{(}{(', ['ON', 'ON', 'ON', 'R', 'ON'], 3], [[0, 2]]), ('regression: mismatched closer search', ['}[(]]([aa()(}]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON'], 3], [[1, 3], [6, 13], [9, 10]]), ('regression: mismatched closer search', [']({(}{()a}(})a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'L', 'ON', 'ON', 'ON', 'R'], 4], [[1, 12], [2, 4], [5, 11]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('control layout', ['{({{{{}a((a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'L'], 2], []), ('control layout', [')a(', ['ON', 'R', 'ON'], 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
mismatched inner bracket[[0, 2], [1, 3]][[0, 2]]Failed
regression: mismatched closer search[[0, 2], [1, 4], [3, 7], [8, 9]][[0, 2], [3, 7], [8, 9]]Failed
regression: mismatched closer search[[0, 8], [5, 12]][[0, 8]]Failed
regression: mismatched closer search[[1, 12], [2, 4], [3, 7], [8, 9]][[1, 12], [2, 4], [8, 9]]Failed
stack overflow stops[][]Passed
overridden bracket ignored[][]Passed
control layout[][]Passed
control layout[][]Passed

SHA-256 / dd4e8b9fcc567f0c90314e58b659543d0e576586815b99b527be72f9ae4c14ed

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    text, classes, limit = x
    OPEN = {'(': ')', '[': ']', '{': '}'}
    CLOSE = {')', ']', '}'}
    stack = []
    pairs = []
    for i, ch in enumerate(text):
        if classes[i] != 'ON':
            continue
        if ch in OPEN:
            if len(stack) >= limit:
                break
            stack.append((OPEN[ch], i))
        elif ch in CLOSE:
            for k in range(len(stack) - 1, -1, -1):
                if stack[k][0] == ch:
                    pairs.append([stack[k][1], i])
                    del stack[k:]
                    break
    return sorted(pairs)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['(][}([())}}(]', ['ON', 'ON', 'L', 'ON', 'R', 'ON', 'L', 'R', 'ON', 'ON', 'R', 'ON', 'ON'], 3], [[0, 8]]), ('regression: mismatched closer search', ['a([{][[}()]()(', ['R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON'], 4], [[1, 12], [2, 4], [8, 9]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['a](((', ['L', 'L', 'ON', 'R', 'ON'], 3], []), ('control layout', ['a([([', ['R', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['(a)a)[(]{(]}a)', ['ON', 'R', 'ON', 'R', 'L', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'L', 'L', 'ON'], 3], [[0, 2], [5, 7]]), ('regression: mismatched closer search', ['{][{(a}([{(({', ['ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'ON', 'ON'], 4], [[3, 6]]), ('regression: mismatched closer search', ['[(]{)][}()(', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], [[0, 2], [3, 7], [8, 9]]), ('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['[a[(}](][(){)', ['L', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'L', 'ON'], 1], []), ('control layout', ['{}]]a(', ['ON', 'ON', 'R', 'ON', 'R', 'ON'], 4], [[0, 1]])], [('regression: mismatched closer search', ['{({]{{()(}[', ['R', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'ON', 'ON', 'ON', 'R'], 4], [[1, 7]]), ('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['{[(]aa)a][', ['ON', 'ON', 'ON', 'ON', 'R', 'R', 'ON', 'R', 'ON', 'L'], 3], [[1, 3]]), ('regression: mismatched closer search', ['{(}){aa{(', ['ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'ON', 'ON'], 3], [[0, 2]]), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('control layout', ['(a', ['ON', 'L'], 3], []), ('control layout', ['[(', ['ON', 'ON'], 2], [])], [('regression: mismatched closer search', [']}))]{(}]))]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[5, 7]]), ('regression: mismatched closer search', ['[a{({)', ['ON', 'L', 'ON', 'ON', 'ON', 'ON'], 4], [[3, 5]]), ('regression: mismatched closer search', ['{a([a)([()][)]', ['L', 'R', 'ON', 'ON', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 4], [[2, 5], [6, 12], [7, 10], [8, 9]]), ('regression: mismatched closer search', ['a{({[}}]]((', ['L', 'R', 'R', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON', 'ON'], 4], [[3, 5]]), ('stack overflow stops', ['((()))', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON'], 2], []), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('control layout', ['(}(', ['ON', 'ON', 'L'], 1], []), ('control layout', [')([()[]a((})', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'ON', 'ON'], 1], [])], [('regression: mismatched closer search', ['}(}}[))}', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'R', 'ON'], 4], [[1, 5]]), ('regression: mismatched closer search', ['{(}{(', ['ON', 'ON', 'ON', 'R', 'ON'], 3], [[0, 2]]), ('regression: mismatched closer search', ['}[(]]([aa()(}]', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON'], 3], [[1, 3], [6, 13], [9, 10]]), ('regression: mismatched closer search', [']({(}{()a}(})a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'R', 'L', 'ON', 'ON', 'ON', 'R'], 4], [[1, 12], [2, 4], [5, 11]]), ('overridden bracket ignored', ['(a)', ['R', 'L', 'ON'], 4], []), ('mismatched inner bracket', ['([)]', ['ON', 'ON', 'ON', 'ON'], 4], [[0, 2]]), ('control layout', ['{({{{{}a((a', ['ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'R', 'L'], 2], []), ('control layout', [')a(', ['ON', 'R', 'ON'], 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
mismatched inner bracket[[0, 2]][[0, 2]]Passed
regression: mismatched closer search[[0, 2], [3, 7], [8, 9]][[0, 2], [3, 7], [8, 9]]Passed
regression: mismatched closer search[[0, 8]][[0, 8]]Passed
regression: mismatched closer search[[1, 12], [2, 4], [8, 9]][[1, 12], [2, 4], [8, 9]]Passed
stack overflow stops[][]Passed
overridden bracket ignored[][]Passed
control layout[][]Passed
control layout[][]Passed

SHA-256 / 119751443ca62baf17980210dce2cc0c62d4b46de55ae08676f6da311edae15e

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

Case digest / fdc738c6dd11f51c8d694bc252f0618d50b60475af76beb377bf2ff63007dff0