FAILURE MAP
← Case archive

FA-21616 / Assistive announcements / Open access

Negative pause duration reaches speech output · case 01

The announcement trace violates the stated speech-markup contract.

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

ROOT CAUSE

Fault site: elif op=='pause': out.append(['pause',max(0,e[1])]) is implemented as elif op=='pause': out.append(['pause',e[1]])

VERIFIED REPAIR

Restore the stated transition: elif op=='pause': out.append(['pause',max(0,e[1])])

Unsuccessful approach: The attempted repair substitutes elif op=='pause': out.append(['pause',abs(e[1])]) and still violates a regression oracle.

Case contract

Bounded token renderer has independent language and emphasis stacks. Text emits [language,emphasis,text]. Push/pop scopes restore prior values; unmatched pops are ignored. Spell emits characters separated by spaces; digits uses fixed English digit words preserving zeros. Pause emits [pause,nonnegative duration] without text. Mark emits named bookmark and current spoken-text count. Break emits newline. Reset restores base en/normal without deleting output. Empty text emits nothing.

Why this case matters

Deterministic controlled model of assistive announcement delivery.

1 / The failure

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

N = 1
observations = []
def solve(events):
    languages=['en']; emphasis=['normal']; out=[]; count=0
    for e in events:
        op=e[0]
        if op=='language': languages.append(e[1])
        elif op=='end-language':
            if len(languages)>1: languages.pop()
        elif op=='emphasis': emphasis.append(e[1])
        elif op=='end-emphasis':
            if len(emphasis)>1: emphasis.pop()
        elif op=='reset': languages=['en']; emphasis=['normal']
        elif op=='pause': out.append(['pause',e[1]])
        elif op=='mark': out.append(['mark',e[1],count])
        else:
            if op=='spell': text=' '.join(e[1])
            elif op=='digits': text=' '.join(['zero','one','two','three','four','five','six','seven','eight','nine'][int(c)] for c in e[1])
            elif op=='break': text='\n'
            else: text=e[1]
            if text: out.append([languages[-1],emphasis[-1],text]); count+=1
    return [out,languages,emphasis,count]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['language','fr'],['language','de'],['text','hallo'*N],['end-language'],['text','salut'],['end-language'],['text','hello']]", "[['emphasis','strong'],['emphasis','soft'],['text','word'*N],['end-emphasis'],['text','more'],['end-emphasis']]", "[['text','x'*N],['pause',-N],['pause',N],['mark','here'],['spell','AB'],['digits','00'+str(N)]]", "[['emphasis','strong'],['text','before'*N],['reset'],['text','after']]", "[['text',''],['break'],['mark','after']]", "[['end-language'],['end-emphasis'],['digits','0']]", '[]']
expected = {1: [[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3], [[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 2: [[[['de', 'normal', 'hallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xx'], ['pause', 0], ['pause', 2], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero two']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 3: [[[['de', 'normal', 'hallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxx'], ['pause', 0], ['pause', 3], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero three']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 4: [[[['de', 'normal', 'hallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxx'], ['pause', 0], ['pause', 4], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero four']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 5: [[[['de', 'normal', 'hallohallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxxx'], ['pause', 0], ['pause', 5], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero five']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]]}[N]
for i, expression in enumerate(fixtures):
    check("trace-"+str(i+1), solve(eval(expression)), expected[i])
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
trace-1[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3][[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3]Passed
trace-2[[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2][[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2]Passed
trace-3[[['en', 'normal', 'x'], ['pause', -1], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3][[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3]Failed
trace-4[[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2][[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2]Passed
trace-5[[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1][[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1]Passed
trace-6[[['en', 'normal', 'zero']], ['en'], ['normal'], 1][[['en', 'normal', 'zero']], ['en'], ['normal'], 1]Passed
trace-7[[], ['en'], ['normal'], 0][[], ['en'], ['normal'], 0]Passed

SHA-256 / 140d6ed865a9c3df8125fed18df0e7d55fa8472d0fe1533f7e7e9d04608c0fd0

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(events):
    languages=['en']; emphasis=['normal']; out=[]; count=0
    for e in events:
        op=e[0]
        if op=='language': languages.append(e[1])
        elif op=='end-language':
            if len(languages)>1: languages.pop()
        elif op=='emphasis': emphasis.append(e[1])
        elif op=='end-emphasis':
            if len(emphasis)>1: emphasis.pop()
        elif op=='reset': languages=['en']; emphasis=['normal']
        elif op=='pause': out.append(['pause',abs(e[1])])
        elif op=='mark': out.append(['mark',e[1],count])
        else:
            if op=='spell': text=' '.join(e[1])
            elif op=='digits': text=' '.join(['zero','one','two','three','four','five','six','seven','eight','nine'][int(c)] for c in e[1])
            elif op=='break': text='\n'
            else: text=e[1]
            if text: out.append([languages[-1],emphasis[-1],text]); count+=1
    return [out,languages,emphasis,count]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['language','fr'],['language','de'],['text','hallo'*N],['end-language'],['text','salut'],['end-language'],['text','hello']]", "[['emphasis','strong'],['emphasis','soft'],['text','word'*N],['end-emphasis'],['text','more'],['end-emphasis']]", "[['text','x'*N],['pause',-N],['pause',N],['mark','here'],['spell','AB'],['digits','00'+str(N)]]", "[['emphasis','strong'],['text','before'*N],['reset'],['text','after']]", "[['text',''],['break'],['mark','after']]", "[['end-language'],['end-emphasis'],['digits','0']]", '[]']
expected = {1: [[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3], [[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 2: [[[['de', 'normal', 'hallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xx'], ['pause', 0], ['pause', 2], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero two']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 3: [[[['de', 'normal', 'hallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxx'], ['pause', 0], ['pause', 3], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero three']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 4: [[[['de', 'normal', 'hallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxx'], ['pause', 0], ['pause', 4], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero four']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 5: [[[['de', 'normal', 'hallohallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxxx'], ['pause', 0], ['pause', 5], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero five']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]]}[N]
for i, expression in enumerate(fixtures):
    check("trace-"+str(i+1), solve(eval(expression)), expected[i])
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
trace-1[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3][[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3]Passed
trace-2[[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2][[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2]Passed
trace-3[[['en', 'normal', 'x'], ['pause', 1], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3][[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3]Failed
trace-4[[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2][[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2]Passed
trace-5[[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1][[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1]Passed
trace-6[[['en', 'normal', 'zero']], ['en'], ['normal'], 1][[['en', 'normal', 'zero']], ['en'], ['normal'], 1]Passed
trace-7[[], ['en'], ['normal'], 0][[], ['en'], ['normal'], 0]Passed

SHA-256 / 0be2e6f94641da205ecfeaf60ab97cf29904391085c57bc4e2cb00776be15123

3 / The verified repair

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

N = 1
observations = []
def solve(events):
    languages=['en']; emphasis=['normal']; out=[]; count=0
    for e in events:
        op=e[0]
        if op=='language': languages.append(e[1])
        elif op=='end-language':
            if len(languages)>1: languages.pop()
        elif op=='emphasis': emphasis.append(e[1])
        elif op=='end-emphasis':
            if len(emphasis)>1: emphasis.pop()
        elif op=='reset': languages=['en']; emphasis=['normal']
        elif op=='pause': out.append(['pause',max(0,e[1])])
        elif op=='mark': out.append(['mark',e[1],count])
        else:
            if op=='spell': text=' '.join(e[1])
            elif op=='digits': text=' '.join(['zero','one','two','three','four','five','six','seven','eight','nine'][int(c)] for c in e[1])
            elif op=='break': text='\n'
            else: text=e[1]
            if text: out.append([languages[-1],emphasis[-1],text]); count+=1
    return [out,languages,emphasis,count]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = ["[['language','fr'],['language','de'],['text','hallo'*N],['end-language'],['text','salut'],['end-language'],['text','hello']]", "[['emphasis','strong'],['emphasis','soft'],['text','word'*N],['end-emphasis'],['text','more'],['end-emphasis']]", "[['text','x'*N],['pause',-N],['pause',N],['mark','here'],['spell','AB'],['digits','00'+str(N)]]", "[['emphasis','strong'],['text','before'*N],['reset'],['text','after']]", "[['text',''],['break'],['mark','after']]", "[['end-language'],['end-emphasis'],['digits','0']]", '[]']
expected = {1: [[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3], [[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 2: [[[['de', 'normal', 'hallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xx'], ['pause', 0], ['pause', 2], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero two']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 3: [[[['de', 'normal', 'hallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxx'], ['pause', 0], ['pause', 3], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero three']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 4: [[[['de', 'normal', 'hallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxx'], ['pause', 0], ['pause', 4], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero four']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]], 5: [[[['de', 'normal', 'hallohallohallohallohallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3], [[['en', 'soft', 'wordwordwordwordword'], ['en', 'strong', 'more']], ['en'], ['normal'], 2], [[['en', 'normal', 'xxxxx'], ['pause', 0], ['pause', 5], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero five']], ['en'], ['normal'], 3], [[['en', 'strong', 'beforebeforebeforebeforebefore'], ['en', 'normal', 'after']], ['en'], ['normal'], 2], [[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1], [[['en', 'normal', 'zero']], ['en'], ['normal'], 1], [[], ['en'], ['normal'], 0]]}[N]
for i, expression in enumerate(fixtures):
    check("trace-"+str(i+1), solve(eval(expression)), expected[i])
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
trace-1[[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3][[['de', 'normal', 'hallo'], ['fr', 'normal', 'salut'], ['en', 'normal', 'hello']], ['en'], ['normal'], 3]Passed
trace-2[[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2][[['en', 'soft', 'word'], ['en', 'strong', 'more']], ['en'], ['normal'], 2]Passed
trace-3[[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3][[['en', 'normal', 'x'], ['pause', 0], ['pause', 1], ['mark', 'here', 1], ['en', 'normal', 'A B'], ['en', 'normal', 'zero zero one']], ['en'], ['normal'], 3]Passed
trace-4[[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2][[['en', 'strong', 'before'], ['en', 'normal', 'after']], ['en'], ['normal'], 2]Passed
trace-5[[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1][[['en', 'normal', '\n'], ['mark', 'after', 1]], ['en'], ['normal'], 1]Passed
trace-6[[['en', 'normal', 'zero']], ['en'], ['normal'], 1][[['en', 'normal', 'zero']], ['en'], ['normal'], 1]Passed
trace-7[[], ['en'], ['normal'], 0][[], ['en'], ['normal'], 0]Passed

SHA-256 / 689ecfea67653544fd886594e53d64a21552486326d6d9f2515c6414718315da

Verification & scope

Stipulated bounded policy, not a browser, speech engine, platform API, or standards conformance claim. 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:40:30.520454+00:00.

Case digest / a994a5f495ea876cbba282fe371ff3387fa28b38ea25ec63d973d04bdffb551c