FAILURE MAP
← Case archive

FA-78226 / Subtitle cue timing / Open access

Karaoke syllable timing: empty syllable time · case 01

Syllables after a pause marker highlight too early.

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

ROOT CAUSE

Empty syllables do not advance the running time.

VERIFIED REPAIR

Advance time for every tag, including empty syllables.

Unsuccessful approach: Skipping whitespace-only syllables still loses their pause duration.

Case contract

Karaoke text is a sequence of {\k|\K|\kf|\ko<cs>}syllable with durations in centiseconds. Syllable i starts at cue start plus the sum of all previous durations (empty syllables still consume time). Syllables starting at or after the cue end are dropped; others are clipped to the cue end. Output [syllable,start_ms,end_ms].

Why this case matters

Subtitle timing defects shift, hide or overlap captions that viewers depend on for comprehension and accessibility.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import re
N = 1
observations = []
def solve(cue, text):
    cs,ce=cue
    out=[]
    t=cs
    for m in re.finditer(r'\{\\(kf|ko|k|K)(\d+)\}([^{]*)',text):
        d=int(m.group(2))*10
        syl=m.group(3)
        if syl and t<ce:
            out.append([syl,t,min(t+d,ce)])
        t+=d if syl else 0
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: empty syllable time', [[1000, 1800], '{\\ko50}{\\kf25}{\\k50} '], [[' ', 1750, 1800]]), ('regression variant: empty syllable time', [[0, 2000], '{\\ko50}{\\k50}la'], [['la', 500, 1000]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('partial repair variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 2000], '{\\K25}la{\\ko25}Hel{\\K0}Hel{\\ko25}'], [['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]), ('normal control', [[0, 300], '{\\k10}la{\\k5}la{\\k50}lo{\\ko25}lo'], [['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]])], [('regression: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('regression variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('partial repair probe: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('normal control', [[0, 300], '{\\ko25}la{\\k25}o {\\kf5}la'], [['la', 0, 250], ['o ', 250, 300]]), ('normal control', [[0, 800], '{\\kf25}o '], [['o ', 0, 250]]), ('normal control', [[0, 500], '{\\ko30}Hel{\\K5}Hel{\\k50}lo{\\K30}{\\k30}lo'], [['Hel', 0, 300], ['Hel', 300, 350], ['lo', 350, 500]])], [('regression: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('regression variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('partial repair probe: empty syllable time', [[1000, 1100], '{\\k0}Hel{\\K10} {\\k5}o {\\k5} {\\k10}'], [['Hel', 1000, 1000], [' ', 1000, 1100]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\kf0}{\\k30} {\\k0}o {\\ko5}Hel{\\k10} '], [[' ', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 300], '{\\kf5}lo{\\k5} '], [['lo', 0, 50], [' ', 50, 100]]), ('normal control', [[1000, 1800], '{\\k25}la{\\ko5}la{\\K5} '], [['la', 1000, 1250], ['la', 1250, 1300], [' ', 1300, 1350]]), ('normal control', [[1000, 1800], '{\\k0}Hel{\\ko0}Hel{\\K25}o '], [['Hel', 1000, 1000], ['Hel', 1000, 1000], ['o ', 1000, 1250]])], [('regression: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('regression variant: empty syllable time', [[1000, 1800], '{\\k0}la{\\k30}{\\k0}lo{\\ko30}lo'], [['la', 1000, 1000], ['lo', 1300, 1300], ['lo', 1300, 1600]]), ('partial repair probe: empty syllable time', [[0, 500], '{\\kf30}Hel{\\k50} {\\k0}lo'], [['Hel', 0, 300], [' ', 300, 500]]), ('partial repair variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('normal control', [[1000, 1300], '{\\K50}la{\\ko30}Hel{\\k50}Hel{\\K25} '], [['la', 1000, 1300]]), ('normal control', [[1000, 1500], '{\\k5}lo{\\K30}o '], [['lo', 1000, 1050], ['o ', 1050, 1350]]), ('normal control', [[1000, 1500], '{\\k0}{\\kf5}lo{\\K25} '], [['lo', 1000, 1050], [' ', 1050, 1300]])], [('regression: empty syllable time', [[0, 800], '{\\k5}{\\k0} {\\k10}o {\\kf30}Hel{\\kf30}Hel'], [[' ', 50, 50], ['o ', 50, 150], ['Hel', 150, 450], ['Hel', 450, 750]]), ('regression variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('partial repair variant: empty syllable time', [[1000, 1100], '{\\k50}{\\kf50}Hel{\\kf50}lo{\\k30}la{\\K50}Hel'], []), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[1000, 1800], '{\\K25}'], []), ('normal control', [[1000, 3000], '{\\ko5}Hel{\\K50}la{\\k0} {\\kf5}lo'], [['Hel', 1000, 1050], ['la', 1050, 1550], [' ', 1550, 1550], ['lo', 1550, 1600]]), ('normal control', [[0, 500], '{\\k0}o '], [['o ', 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
regression: empty syllable time[[' ', 1000, 1500]][[' ', 1750, 1800]]Failed
regression variant: empty syllable time[['la', 0, 500]][['la', 500, 1000]]Failed
partial repair probe: empty syllable time[['Hel', 1000, 1250]][['Hel', 1500, 1750]]Failed
partial repair variant: empty syllable time[[' ', 0, 250], ['o ', 250, 350]][[' ', 100, 350], ['o ', 350, 450]]Failed
boundary control[['Hel', 0, 500], ['lo', 500, 1000]][['Hel', 0, 500], ['lo', 500, 1000]]Passed
boundary control[['x', 0, 100]][['x', 0, 100]]Passed
normal control[['a', 0, 200], ['b', 200, 300]][['a', 0, 200], ['b', 200, 300]]Passed
normal control[['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]][['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]Passed
normal control[['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]][['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]]Passed

SHA-256 / a11c4c568b21ba4dbaa7d0e81523fd09b6a533eef8fbfa3ec9087dbd4b3fab9f

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import re
N = 1
observations = []
def solve(cue, text):
    cs,ce=cue
    out=[]
    t=cs
    for m in re.finditer(r'\{\\(kf|ko|k|K)(\d+)\}([^{]*)',text):
        d=int(m.group(2))*10
        syl=m.group(3)
        if syl and t<ce:
            out.append([syl,t,min(t+d,ce)])
        t+=d if syl.strip() else 0
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: empty syllable time', [[1000, 1800], '{\\ko50}{\\kf25}{\\k50} '], [[' ', 1750, 1800]]), ('regression variant: empty syllable time', [[0, 2000], '{\\ko50}{\\k50}la'], [['la', 500, 1000]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('partial repair variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 2000], '{\\K25}la{\\ko25}Hel{\\K0}Hel{\\ko25}'], [['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]), ('normal control', [[0, 300], '{\\k10}la{\\k5}la{\\k50}lo{\\ko25}lo'], [['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]])], [('regression: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('regression variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('partial repair probe: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('normal control', [[0, 300], '{\\ko25}la{\\k25}o {\\kf5}la'], [['la', 0, 250], ['o ', 250, 300]]), ('normal control', [[0, 800], '{\\kf25}o '], [['o ', 0, 250]]), ('normal control', [[0, 500], '{\\ko30}Hel{\\K5}Hel{\\k50}lo{\\K30}{\\k30}lo'], [['Hel', 0, 300], ['Hel', 300, 350], ['lo', 350, 500]])], [('regression: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('regression variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('partial repair probe: empty syllable time', [[1000, 1100], '{\\k0}Hel{\\K10} {\\k5}o {\\k5} {\\k10}'], [['Hel', 1000, 1000], [' ', 1000, 1100]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\kf0}{\\k30} {\\k0}o {\\ko5}Hel{\\k10} '], [[' ', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 300], '{\\kf5}lo{\\k5} '], [['lo', 0, 50], [' ', 50, 100]]), ('normal control', [[1000, 1800], '{\\k25}la{\\ko5}la{\\K5} '], [['la', 1000, 1250], ['la', 1250, 1300], [' ', 1300, 1350]]), ('normal control', [[1000, 1800], '{\\k0}Hel{\\ko0}Hel{\\K25}o '], [['Hel', 1000, 1000], ['Hel', 1000, 1000], ['o ', 1000, 1250]])], [('regression: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('regression variant: empty syllable time', [[1000, 1800], '{\\k0}la{\\k30}{\\k0}lo{\\ko30}lo'], [['la', 1000, 1000], ['lo', 1300, 1300], ['lo', 1300, 1600]]), ('partial repair probe: empty syllable time', [[0, 500], '{\\kf30}Hel{\\k50} {\\k0}lo'], [['Hel', 0, 300], [' ', 300, 500]]), ('partial repair variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('normal control', [[1000, 1300], '{\\K50}la{\\ko30}Hel{\\k50}Hel{\\K25} '], [['la', 1000, 1300]]), ('normal control', [[1000, 1500], '{\\k5}lo{\\K30}o '], [['lo', 1000, 1050], ['o ', 1050, 1350]]), ('normal control', [[1000, 1500], '{\\k0}{\\kf5}lo{\\K25} '], [['lo', 1000, 1050], [' ', 1050, 1300]])], [('regression: empty syllable time', [[0, 800], '{\\k5}{\\k0} {\\k10}o {\\kf30}Hel{\\kf30}Hel'], [[' ', 50, 50], ['o ', 50, 150], ['Hel', 150, 450], ['Hel', 450, 750]]), ('regression variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('partial repair variant: empty syllable time', [[1000, 1100], '{\\k50}{\\kf50}Hel{\\kf50}lo{\\k30}la{\\K50}Hel'], []), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[1000, 1800], '{\\K25}'], []), ('normal control', [[1000, 3000], '{\\ko5}Hel{\\K50}la{\\k0} {\\kf5}lo'], [['Hel', 1000, 1050], ['la', 1050, 1550], [' ', 1550, 1550], ['lo', 1550, 1600]]), ('normal control', [[0, 500], '{\\k0}o '], [['o ', 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
regression: empty syllable time[[' ', 1000, 1500]][[' ', 1750, 1800]]Failed
regression variant: empty syllable time[['la', 0, 500]][['la', 500, 1000]]Failed
partial repair probe: empty syllable time[['Hel', 1000, 1250]][['Hel', 1500, 1750]]Failed
partial repair variant: empty syllable time[[' ', 0, 250], ['o ', 0, 100]][[' ', 100, 350], ['o ', 350, 450]]Failed
boundary control[['Hel', 0, 500], ['lo', 500, 1000]][['Hel', 0, 500], ['lo', 500, 1000]]Passed
boundary control[['x', 0, 100]][['x', 0, 100]]Passed
normal control[['a', 0, 200], ['b', 200, 300]][['a', 0, 200], ['b', 200, 300]]Passed
normal control[['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]][['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]Passed
normal control[['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]][['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]]Passed

SHA-256 / 00697def6b565c0e63db78d2a0ee5db51dd69e4d8adc41d83445e145e106aeaa

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import re
N = 1
observations = []
def solve(cue, text):
    cs,ce=cue
    out=[]
    t=cs
    for m in re.finditer(r'\{\\(kf|ko|k|K)(\d+)\}([^{]*)',text):
        d=int(m.group(2))*10
        syl=m.group(3)
        if syl and t<ce:
            out.append([syl,t,min(t+d,ce)])
        t+=d
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: empty syllable time', [[1000, 1800], '{\\ko50}{\\kf25}{\\k50} '], [[' ', 1750, 1800]]), ('regression variant: empty syllable time', [[0, 2000], '{\\ko50}{\\k50}la'], [['la', 500, 1000]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('partial repair variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 2000], '{\\K25}la{\\ko25}Hel{\\K0}Hel{\\ko25}'], [['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]), ('normal control', [[0, 300], '{\\k10}la{\\k5}la{\\k50}lo{\\ko25}lo'], [['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]])], [('regression: empty syllable time', [[1000, 3000], '{\\kf50}{\\k25}Hel'], [['Hel', 1500, 1750]]), ('regression variant: empty syllable time', [[0, 500], '{\\kf10}{\\ko25} {\\k10}o '], [[' ', 100, 350], ['o ', 350, 450]]), ('partial repair probe: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('normal control', [[0, 300], '{\\ko25}la{\\k25}o {\\kf5}la'], [['la', 0, 250], ['o ', 250, 300]]), ('normal control', [[0, 800], '{\\kf25}o '], [['o ', 0, 250]]), ('normal control', [[0, 500], '{\\ko30}Hel{\\K5}Hel{\\k50}lo{\\K30}{\\k30}lo'], [['Hel', 0, 300], ['Hel', 300, 350], ['lo', 350, 500]])], [('regression: empty syllable time', [[1000, 1500], '{\\ko5} {\\ko25}{\\k5}o {\\k0} '], [[' ', 1000, 1050], ['o ', 1300, 1350], [' ', 1350, 1350]]), ('regression variant: empty syllable time', [[0, 100], '{\\ko10}{\\kf0}o {\\kf0} {\\kf30}lo'], []), ('partial repair probe: empty syllable time', [[1000, 1100], '{\\k0}Hel{\\K10} {\\k5}o {\\k5} {\\k10}'], [['Hel', 1000, 1000], [' ', 1000, 1100]]), ('partial repair variant: empty syllable time', [[0, 100], '{\\kf0}{\\k30} {\\k0}o {\\ko5}Hel{\\k10} '], [[' ', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('boundary control', [[0, 300], '{\\k20}a{\\kf20}b'], [['a', 0, 200], ['b', 200, 300]]), ('normal control', [[0, 300], '{\\kf5}lo{\\k5} '], [['lo', 0, 50], [' ', 50, 100]]), ('normal control', [[1000, 1800], '{\\k25}la{\\ko5}la{\\K5} '], [['la', 1000, 1250], ['la', 1250, 1300], [' ', 1300, 1350]]), ('normal control', [[1000, 1800], '{\\k0}Hel{\\ko0}Hel{\\K25}o '], [['Hel', 1000, 1000], ['Hel', 1000, 1000], ['o ', 1000, 1250]])], [('regression: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('regression variant: empty syllable time', [[1000, 1800], '{\\k0}la{\\k30}{\\k0}lo{\\ko30}lo'], [['la', 1000, 1000], ['lo', 1300, 1300], ['lo', 1300, 1600]]), ('partial repair probe: empty syllable time', [[0, 500], '{\\kf30}Hel{\\k50} {\\k0}lo'], [['Hel', 0, 300], [' ', 300, 500]]), ('partial repair variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('boundary control', [[0, 200], '{\\k20}a{\\k10}{\\k5}b'], [['a', 0, 200]]), ('normal control', [[1000, 1300], '{\\K50}la{\\ko30}Hel{\\k50}Hel{\\K25} '], [['la', 1000, 1300]]), ('normal control', [[1000, 1500], '{\\k5}lo{\\K30}o '], [['lo', 1000, 1050], ['o ', 1050, 1350]]), ('normal control', [[1000, 1500], '{\\k0}{\\kf5}lo{\\K25} '], [['lo', 1000, 1050], [' ', 1050, 1300]])], [('regression: empty syllable time', [[0, 800], '{\\k5}{\\k0} {\\k10}o {\\kf30}Hel{\\kf30}Hel'], [[' ', 50, 50], ['o ', 50, 150], ['Hel', 150, 450], ['Hel', 450, 750]]), ('regression variant: empty syllable time', [[0, 300], '{\\kf10}{\\kf25}la{\\K10}{\\ko10}o {\\K0}o '], [['la', 100, 300]]), ('partial repair probe: empty syllable time', [[1000, 3000], '{\\k30}{\\ko0}Hel{\\kf50}la'], [['Hel', 1300, 1300], ['la', 1300, 1800]]), ('partial repair variant: empty syllable time', [[1000, 1100], '{\\k50}{\\kf50}Hel{\\kf50}lo{\\k30}la{\\K50}Hel'], []), ('boundary control', [[0, 1000], '{\\k50}Hel{\\k50}lo'], [['Hel', 0, 500], ['lo', 500, 1000]]), ('boundary control', [[0, 100], '{\\ko10}x{\\k1}y'], [['x', 0, 100]]), ('normal control', [[1000, 1800], '{\\K25}'], []), ('normal control', [[1000, 3000], '{\\ko5}Hel{\\K50}la{\\k0} {\\kf5}lo'], [['Hel', 1000, 1050], ['la', 1050, 1550], [' ', 1550, 1550], ['lo', 1550, 1600]]), ('normal control', [[0, 500], '{\\k0}o '], [['o ', 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
regression: empty syllable time[[' ', 1750, 1800]][[' ', 1750, 1800]]Passed
regression variant: empty syllable time[['la', 500, 1000]][['la', 500, 1000]]Passed
partial repair probe: empty syllable time[['Hel', 1500, 1750]][['Hel', 1500, 1750]]Passed
partial repair variant: empty syllable time[[' ', 100, 350], ['o ', 350, 450]][[' ', 100, 350], ['o ', 350, 450]]Passed
boundary control[['Hel', 0, 500], ['lo', 500, 1000]][['Hel', 0, 500], ['lo', 500, 1000]]Passed
boundary control[['x', 0, 100]][['x', 0, 100]]Passed
normal control[['a', 0, 200], ['b', 200, 300]][['a', 0, 200], ['b', 200, 300]]Passed
normal control[['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]][['la', 0, 250], ['Hel', 250, 500], ['Hel', 500, 500]]Passed
normal control[['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]][['la', 0, 100], ['la', 100, 150], ['lo', 150, 300]]Passed

SHA-256 / 58859661022f36aac358dbc1dc0fbf098bc40da4aebe21214f35414bc156906c

Verification & scope

A deterministic bounded teaching model with a stipulated toy contract; it does not claim conformance to any subtitle standard. 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:33.364761+00:00.

Case digest / 1af4129681438a853529483550178cd00b6824b6d902f30e0414db53d121abba