FAILURE MAP
← Case archive

FA-80836 / Bidirectional text layout / Open access

Paragraph separation and direction: strong character test · case 01

Paragraphs starting with digits or punctuation are forced LTR.

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

ROOT CAUSE

Digits are accepted as strong characters.

VERIFIED REPAIR

Only letters decide the paragraph level.

Unsuccessful approach: Accepting any non-space character lets punctuation decide.

Case contract

Input [text, default level]. Paragraph separators (\n, \r, U+2029; \r\n counts once) end a paragraph and stay with it. A trailing non-empty remainder is a paragraph. Each paragraph takes level 1 if its first letter is uppercase (stand-in for RTL), 0 if lowercase, else the default. Return [[paragraph, level]].

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, default = x
    paras = []
    cur = ''
    i = 0
    while i < len(text):
        ch = text[i]
        if ch == '\r' and text[i + 1:i + 2] == '\n':
            cur += '\r\n'
            paras.append(cur)
            cur = ''
            i += 2
            continue
        cur += ch
        if ch in '\n\r\u2029':
            paras.append(cur)
            cur = ''
        i += 1
    if cur:
        paras.append(cur)
    out = []
    for p in paras:
        level = default
        for ch in p:
            if ch.isalnum():
                level = 1 if ch.isupper() else 0
                break
        out.append([p, level])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('regression: strong character test', [' ,.1ZaYZ,,2ca1', 1], [[' ,.1ZaYZ,,2ca1', 1]]), ('regression: strong character test', ['b  \r\nc2,\u202911\na,', 1], [['b  \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]), ('partial-repair probe', ['\ncZ2.\na..X!\n!Z,.', 0], [['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('control layout', ['YX\na\r\n \naZa', 0], [['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]), ('control layout', ['\n\r\nb\n', 1], [['\n', 1], ['\r\n', 1], ['b\n', 0]])], [('regression: strong character test', ['\r\n1,X1 \r\n.b,', 1], [['\r\n', 1], ['1,X1 \r\n', 1], ['.b,', 0]]), ('regression: strong character test', ['2\nX\r\n\naX\r\nb\nY', 1], [['2\n', 1], ['X\r\n', 1], ['\n', 1], ['aX\r\n', 0], ['b\n', 0], ['Y', 1]]), ('partial-repair probe', ['Xac!\nZ2\u2029aYa.\r,Z!', 0], [['Xac!\n', 1], ['Z2\u2029', 1], ['aYa.\r', 0], [',Z!', 1]]), ('regression: strong character test', ['1!X\r\n', 1], [['1!X\r\n', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['\n.! 1!b!,21Z\n1', 0], [['\n', 0], ['.! 1!b!,21Z\n', 0], ['1', 0]]), ('control layout', ['a\r\n\nY1X111,2Z', 1], [['a\r\n', 0], ['\n', 1], ['Y1X111,2Z', 1]])], [('regression: strong character test', ['2X1aXb 2!Z2,\rX', 1], [['2X1aXb 2!Z2,\r', 1], ['X', 1]]), ('regression: strong character test', ['12. \r\n', 1], [['12. \r\n', 1]]), ('partial-repair probe', ['\r,cb\r\u2029a\n.Z\r', 1], [['\r', 1], [',cb\r', 0], ['\u2029', 1], ['a\n', 0], ['.Z\r', 1]]), ('regression: strong character test', ['!c\r\n2bb\n22', 1], [['!c\r\n', 0], ['2bb\n', 0], ['22', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['Z.1bYYb!ZYXZ\rZ', 1], [['Z.1bYYb!ZYXZ\r', 1], ['Z', 1]]), ('control layout', ['cZ!', 0], [['cZ!', 0]])], [('regression: strong character test', ['1XZ. ', 0], [['1XZ. ', 1]]), ('regression: strong character test', ['a \n\n,\n,1\r\n\ncXccZX', 1], [['a \n', 0], ['\n', 1], [',\n', 1], [',1\r\n', 1], ['\n', 1], ['cXccZX', 0]]), ('partial-repair probe', ['\r\nc2\r.\nXY!Z\u2029Xa', 1], [['\r\n', 1], ['c2\r', 0], ['.\n', 1], ['XY!Z\u2029', 1], ['Xa', 1]]), ('regression: strong character test', ['2\r\n\r\n!,!Y\u2029', 1], [['2\r\n', 1], ['\r\n', 1], ['!,!Y\u2029', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['aXb\u2029 b\na1b\n', 0], [['aXb\u2029', 0], [' b\n', 0], ['a1b\n', 0]]), ('control layout', ['aXXa,\n\r\n\n\n ,', 0], [['aXXa,\n', 0], ['\r\n', 0], ['\n', 0], ['\n', 0], [' ,', 0]])], [('regression: strong character test', ['Z.,\n\n2Y\r!b,', 1], [['Z.,\n', 1], ['\n', 1], ['2Y\r', 1], ['!b,', 0]]), ('regression: strong character test', ['Y\n c\u20291 ', 1], [['Y\n', 1], [' c\u2029', 0], ['1 ', 1]]), ('regression: strong character test', ['XX\r\nc!,,1\n.1,Y', 0], [['XX\r\n', 1], ['c!,,1\n', 0], ['.1,Y', 1]]), ('regression: strong character test', ['.\r! \n22,\n.XYb', 1], [['.\r', 1], ['! \n', 1], ['22,\n', 1], ['.XYb', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['ZZc!,Z ', 1], [['ZZc!,Z ', 1]]), ('control layout', ['!\r,', 0], [['!\r', 0], [',', 0]])]]
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
digits then letter[['12 X\n', 0]][['12 X\n', 1]]Failed
regression: strong character test[[' ,.1ZaYZ,,2ca1', 0]][[' ,.1ZaYZ,,2ca1', 1]]Failed
regression: strong character test[['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 0], ['a,', 0]][['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]Failed
partial-repair probe[['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]][['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]Passed
CRLF is one separator[['ab\r\n', 0], ['XY', 1]][['ab\r\n', 0], ['XY', 1]]Passed
separator only paragraph[['a\n', 0], ['\n', 1], ['Z', 1]][['a\n', 0], ['\n', 1], ['Z', 1]]Passed
control layout[['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]][['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]Passed
control layout[['\n', 1], ['\r\n', 1], ['b\n', 0]][['\n', 1], ['\r\n', 1], ['b\n', 0]]Passed

SHA-256 / 52e8c3d31a023df3e1ca48169ddad23ebbdb1d225176297a68f00f2240a43d0c

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    text, default = x
    paras = []
    cur = ''
    i = 0
    while i < len(text):
        ch = text[i]
        if ch == '\r' and text[i + 1:i + 2] == '\n':
            cur += '\r\n'
            paras.append(cur)
            cur = ''
            i += 2
            continue
        cur += ch
        if ch in '\n\r\u2029':
            paras.append(cur)
            cur = ''
        i += 1
    if cur:
        paras.append(cur)
    out = []
    for p in paras:
        level = default
        for ch in p:
            if not ch.isspace():
                level = 1 if ch.isupper() else 0
                break
        out.append([p, level])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('regression: strong character test', [' ,.1ZaYZ,,2ca1', 1], [[' ,.1ZaYZ,,2ca1', 1]]), ('regression: strong character test', ['b  \r\nc2,\u202911\na,', 1], [['b  \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]), ('partial-repair probe', ['\ncZ2.\na..X!\n!Z,.', 0], [['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('control layout', ['YX\na\r\n \naZa', 0], [['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]), ('control layout', ['\n\r\nb\n', 1], [['\n', 1], ['\r\n', 1], ['b\n', 0]])], [('regression: strong character test', ['\r\n1,X1 \r\n.b,', 1], [['\r\n', 1], ['1,X1 \r\n', 1], ['.b,', 0]]), ('regression: strong character test', ['2\nX\r\n\naX\r\nb\nY', 1], [['2\n', 1], ['X\r\n', 1], ['\n', 1], ['aX\r\n', 0], ['b\n', 0], ['Y', 1]]), ('partial-repair probe', ['Xac!\nZ2\u2029aYa.\r,Z!', 0], [['Xac!\n', 1], ['Z2\u2029', 1], ['aYa.\r', 0], [',Z!', 1]]), ('regression: strong character test', ['1!X\r\n', 1], [['1!X\r\n', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['\n.! 1!b!,21Z\n1', 0], [['\n', 0], ['.! 1!b!,21Z\n', 0], ['1', 0]]), ('control layout', ['a\r\n\nY1X111,2Z', 1], [['a\r\n', 0], ['\n', 1], ['Y1X111,2Z', 1]])], [('regression: strong character test', ['2X1aXb 2!Z2,\rX', 1], [['2X1aXb 2!Z2,\r', 1], ['X', 1]]), ('regression: strong character test', ['12. \r\n', 1], [['12. \r\n', 1]]), ('partial-repair probe', ['\r,cb\r\u2029a\n.Z\r', 1], [['\r', 1], [',cb\r', 0], ['\u2029', 1], ['a\n', 0], ['.Z\r', 1]]), ('regression: strong character test', ['!c\r\n2bb\n22', 1], [['!c\r\n', 0], ['2bb\n', 0], ['22', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['Z.1bYYb!ZYXZ\rZ', 1], [['Z.1bYYb!ZYXZ\r', 1], ['Z', 1]]), ('control layout', ['cZ!', 0], [['cZ!', 0]])], [('regression: strong character test', ['1XZ. ', 0], [['1XZ. ', 1]]), ('regression: strong character test', ['a \n\n,\n,1\r\n\ncXccZX', 1], [['a \n', 0], ['\n', 1], [',\n', 1], [',1\r\n', 1], ['\n', 1], ['cXccZX', 0]]), ('partial-repair probe', ['\r\nc2\r.\nXY!Z\u2029Xa', 1], [['\r\n', 1], ['c2\r', 0], ['.\n', 1], ['XY!Z\u2029', 1], ['Xa', 1]]), ('regression: strong character test', ['2\r\n\r\n!,!Y\u2029', 1], [['2\r\n', 1], ['\r\n', 1], ['!,!Y\u2029', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['aXb\u2029 b\na1b\n', 0], [['aXb\u2029', 0], [' b\n', 0], ['a1b\n', 0]]), ('control layout', ['aXXa,\n\r\n\n\n ,', 0], [['aXXa,\n', 0], ['\r\n', 0], ['\n', 0], ['\n', 0], [' ,', 0]])], [('regression: strong character test', ['Z.,\n\n2Y\r!b,', 1], [['Z.,\n', 1], ['\n', 1], ['2Y\r', 1], ['!b,', 0]]), ('regression: strong character test', ['Y\n c\u20291 ', 1], [['Y\n', 1], [' c\u2029', 0], ['1 ', 1]]), ('regression: strong character test', ['XX\r\nc!,,1\n.1,Y', 0], [['XX\r\n', 1], ['c!,,1\n', 0], ['.1,Y', 1]]), ('regression: strong character test', ['.\r! \n22,\n.XYb', 1], [['.\r', 1], ['! \n', 1], ['22,\n', 1], ['.XYb', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['ZZc!,Z ', 1], [['ZZc!,Z ', 1]]), ('control layout', ['!\r,', 0], [['!\r', 0], [',', 0]])]]
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
digits then letter[['12 X\n', 0]][['12 X\n', 1]]Failed
regression: strong character test[[' ,.1ZaYZ,,2ca1', 0]][[' ,.1ZaYZ,,2ca1', 1]]Failed
regression: strong character test[['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 0], ['a,', 0]][['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]Failed
partial-repair probe[['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 0]][['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]Failed
CRLF is one separator[['ab\r\n', 0], ['XY', 1]][['ab\r\n', 0], ['XY', 1]]Passed
separator only paragraph[['a\n', 0], ['\n', 1], ['Z', 1]][['a\n', 0], ['\n', 1], ['Z', 1]]Passed
control layout[['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]][['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]Passed
control layout[['\n', 1], ['\r\n', 1], ['b\n', 0]][['\n', 1], ['\r\n', 1], ['b\n', 0]]Passed

SHA-256 / 8310ebf18b8c10d93bd47d562ecc7a201d011776f0053c7a2e13df2d73507b88

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    text, default = x
    paras = []
    cur = ''
    i = 0
    while i < len(text):
        ch = text[i]
        if ch == '\r' and text[i + 1:i + 2] == '\n':
            cur += '\r\n'
            paras.append(cur)
            cur = ''
            i += 2
            continue
        cur += ch
        if ch in '\n\r\u2029':
            paras.append(cur)
            cur = ''
        i += 1
    if cur:
        paras.append(cur)
    out = []
    for p in paras:
        level = default
        for ch in p:
            if ch.isalpha():
                level = 1 if ch.isupper() else 0
                break
        out.append([p, level])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('regression: strong character test', [' ,.1ZaYZ,,2ca1', 1], [[' ,.1ZaYZ,,2ca1', 1]]), ('regression: strong character test', ['b  \r\nc2,\u202911\na,', 1], [['b  \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]), ('partial-repair probe', ['\ncZ2.\na..X!\n!Z,.', 0], [['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('control layout', ['YX\na\r\n \naZa', 0], [['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]), ('control layout', ['\n\r\nb\n', 1], [['\n', 1], ['\r\n', 1], ['b\n', 0]])], [('regression: strong character test', ['\r\n1,X1 \r\n.b,', 1], [['\r\n', 1], ['1,X1 \r\n', 1], ['.b,', 0]]), ('regression: strong character test', ['2\nX\r\n\naX\r\nb\nY', 1], [['2\n', 1], ['X\r\n', 1], ['\n', 1], ['aX\r\n', 0], ['b\n', 0], ['Y', 1]]), ('partial-repair probe', ['Xac!\nZ2\u2029aYa.\r,Z!', 0], [['Xac!\n', 1], ['Z2\u2029', 1], ['aYa.\r', 0], [',Z!', 1]]), ('regression: strong character test', ['1!X\r\n', 1], [['1!X\r\n', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['\n.! 1!b!,21Z\n1', 0], [['\n', 0], ['.! 1!b!,21Z\n', 0], ['1', 0]]), ('control layout', ['a\r\n\nY1X111,2Z', 1], [['a\r\n', 0], ['\n', 1], ['Y1X111,2Z', 1]])], [('regression: strong character test', ['2X1aXb 2!Z2,\rX', 1], [['2X1aXb 2!Z2,\r', 1], ['X', 1]]), ('regression: strong character test', ['12. \r\n', 1], [['12. \r\n', 1]]), ('partial-repair probe', ['\r,cb\r\u2029a\n.Z\r', 1], [['\r', 1], [',cb\r', 0], ['\u2029', 1], ['a\n', 0], ['.Z\r', 1]]), ('regression: strong character test', ['!c\r\n2bb\n22', 1], [['!c\r\n', 0], ['2bb\n', 0], ['22', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('digits then letter', ['12 X\n', 0], [['12 X\n', 1]]), ('control layout', ['Z.1bYYb!ZYXZ\rZ', 1], [['Z.1bYYb!ZYXZ\r', 1], ['Z', 1]]), ('control layout', ['cZ!', 0], [['cZ!', 0]])], [('regression: strong character test', ['1XZ. ', 0], [['1XZ. ', 1]]), ('regression: strong character test', ['a \n\n,\n,1\r\n\ncXccZX', 1], [['a \n', 0], ['\n', 1], [',\n', 1], [',1\r\n', 1], ['\n', 1], ['cXccZX', 0]]), ('partial-repair probe', ['\r\nc2\r.\nXY!Z\u2029Xa', 1], [['\r\n', 1], ['c2\r', 0], ['.\n', 1], ['XY!Z\u2029', 1], ['Xa', 1]]), ('regression: strong character test', ['2\r\n\r\n!,!Y\u2029', 1], [['2\r\n', 1], ['\r\n', 1], ['!,!Y\u2029', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['aXb\u2029 b\na1b\n', 0], [['aXb\u2029', 0], [' b\n', 0], ['a1b\n', 0]]), ('control layout', ['aXXa,\n\r\n\n\n ,', 0], [['aXXa,\n', 0], ['\r\n', 0], ['\n', 0], ['\n', 0], [' ,', 0]])], [('regression: strong character test', ['Z.,\n\n2Y\r!b,', 1], [['Z.,\n', 1], ['\n', 1], ['2Y\r', 1], ['!b,', 0]]), ('regression: strong character test', ['Y\n c\u20291 ', 1], [['Y\n', 1], [' c\u2029', 0], ['1 ', 1]]), ('regression: strong character test', ['XX\r\nc!,,1\n.1,Y', 0], [['XX\r\n', 1], ['c!,,1\n', 0], ['.1,Y', 1]]), ('regression: strong character test', ['.\r! \n22,\n.XYb', 1], [['.\r', 1], ['! \n', 1], ['22,\n', 1], ['.XYb', 1]]), ('separator only paragraph', ['a\n\nZ', 1], [['a\n', 0], ['\n', 1], ['Z', 1]]), ('CRLF is one separator', ['ab\r\nXY', 0], [['ab\r\n', 0], ['XY', 1]]), ('control layout', ['ZZc!,Z ', 1], [['ZZc!,Z ', 1]]), ('control layout', ['!\r,', 0], [['!\r', 0], [',', 0]])]]
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
digits then letter[['12 X\n', 1]][['12 X\n', 1]]Passed
regression: strong character test[[' ,.1ZaYZ,,2ca1', 1]][[' ,.1ZaYZ,,2ca1', 1]]Passed
regression: strong character test[['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]][['b \r\n', 0], ['c2,\u2029', 0], ['11\n', 1], ['a,', 0]]Passed
partial-repair probe[['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]][['\n', 0], ['cZ2.\n', 0], ['a..X!\n', 0], ['!Z,.', 1]]Passed
CRLF is one separator[['ab\r\n', 0], ['XY', 1]][['ab\r\n', 0], ['XY', 1]]Passed
separator only paragraph[['a\n', 0], ['\n', 1], ['Z', 1]][['a\n', 0], ['\n', 1], ['Z', 1]]Passed
control layout[['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]][['YX\n', 1], ['a\r\n', 0], [' \n', 0], ['aZa', 0]]Passed
control layout[['\n', 1], ['\r\n', 1], ['b\n', 0]][['\n', 1], ['\r\n', 1], ['b\n', 0]]Passed

SHA-256 / 4069f4bc92c8b4bd8d181f6780dd2148e871688f7d223cc7052d2f1d1981ed13

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

Case digest / 647f44932a89cc482a6db8101f8acda967492d6f2827a5f153fd048667cdba8c