FAILURE MAP
← Case archive

FA-24571 / Client state / Open access

Incremental client response projection: Completion event once drained · case 01

Completion event once drained.

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

ROOT CAUSE

The completion-event-once-drained client decision evaluates `finished` instead of `finished and cursor==len(chunks) and not cancelled`.

VERIFIED REPAIR

Apply the modeled completion-event-once-drained rule: `finished and cursor==len(chunks) and not cancelled`.

Unsuccessful approach: The partial repair `cursor==len(chunks)` still violates the explicit fixture contract.

Case contract

The client stream view tracks a chunk cursor independently from rendered text. Per-frame budgets consume chunks including empty chunks. Completion waits for drain, and cancellation preserves committed text but discards pending output. Operation completion-event-once-drained has the six explicit input/output oracles below.

Why this case matters

An offline client lifecycle model that isolates a state-management defect without DOM rendering or network services.

1 / The failure

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

N = 1
observations = []
def solve(operation, s):
    chunks, cursor, committed, finished, cancelled, limit = s
    if operation == 'append-only-unseen-chunks':
        return committed+''.join(chunks[cursor:])
    if operation == 'render-budget-prefix':
        return chunks[cursor:cursor+limit]
    if operation == 'cursor-advances-by-consumed-count':
        return cursor+len(chunks[cursor:cursor+limit])
    if operation == 'cancel-freezes-visible-text':
        return committed if cancelled else committed+''.join(chunks[cursor:])
    if operation == 'finished-but-buffered-state':
        return 'draining' if finished and cursor<len(chunks) else ('complete' if finished else 'streaming')
    if operation == 'empty-chunk-consumes-position':
        return len(chunks[cursor:])
    if operation == 'unconsumed-tail-after-frame':
        return chunks[cursor+limit:]
    if operation == 'completion-event-once-drained':
        return finished
    if operation == 'render-frame-needed':
        return not cancelled and cursor<len(chunks) and limit>0
    if operation == 'abort-discards-buffered-suffix':
        return [] if cancelled else chunks[cursor:]
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('append-only-unseen-chunks scenario 1', solve('append-only-unseen-chunks', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('append-only-unseen-chunks scenario 2', solve('append-only-unseen-chunks', ([],0,'',True,False,2)), '')
check('append-only-unseen-chunks scenario 3', solve('append-only-unseen-chunks', (['a','b'],2,'ab',True,False,2)), 'ab')
check('append-only-unseen-chunks scenario 4', solve('append-only-unseen-chunks', (['a','b'],0,'old',False,True,1)), 'oldab')
check('append-only-unseen-chunks scenario 5', solve('append-only-unseen-chunks', (['','x'],0,'',False,False,0)), 'x')
check('append-only-unseen-chunks scenario 6', solve('append-only-unseen-chunks', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('render-budget-prefix scenario 1', solve('render-budget-prefix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('render-budget-prefix scenario 2', solve('render-budget-prefix', ([],0,'',True,False,2)), [])
check('render-budget-prefix scenario 3', solve('render-budget-prefix', (['a','b'],2,'ab',True,False,2)), [])
check('render-budget-prefix scenario 4', solve('render-budget-prefix', (['a','b'],0,'old',False,True,1)), ['a'])
check('render-budget-prefix scenario 5', solve('render-budget-prefix', (['','x'],0,'',False,False,0)), [])
check('render-budget-prefix scenario 6', solve('render-budget-prefix', (['a','b','c'],1,'a',True,False,1)), ['b'])
check('cursor-advances-by-consumed-count scenario 1', solve('cursor-advances-by-consumed-count', (['a'*N,'b','c'],1,'old',False,False,2)), 3)
check('cursor-advances-by-consumed-count scenario 2', solve('cursor-advances-by-consumed-count', ([],0,'',True,False,2)), 0)
check('cursor-advances-by-consumed-count scenario 3', solve('cursor-advances-by-consumed-count', (['a','b'],2,'ab',True,False,2)), 2)
check('cursor-advances-by-consumed-count scenario 4', solve('cursor-advances-by-consumed-count', (['a','b'],0,'old',False,True,1)), 1)
check('cursor-advances-by-consumed-count scenario 5', solve('cursor-advances-by-consumed-count', (['','x'],0,'',False,False,0)), 0)
check('cursor-advances-by-consumed-count scenario 6', solve('cursor-advances-by-consumed-count', (['a','b','c'],1,'a',True,False,1)), 2)
check('cancel-freezes-visible-text scenario 1', solve('cancel-freezes-visible-text', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('cancel-freezes-visible-text scenario 2', solve('cancel-freezes-visible-text', ([],0,'',True,False,2)), '')
check('cancel-freezes-visible-text scenario 3', solve('cancel-freezes-visible-text', (['a','b'],2,'ab',True,False,2)), 'ab')
check('cancel-freezes-visible-text scenario 4', solve('cancel-freezes-visible-text', (['a','b'],0,'old',False,True,1)), 'old')
check('cancel-freezes-visible-text scenario 5', solve('cancel-freezes-visible-text', (['','x'],0,'',False,False,0)), 'x')
check('cancel-freezes-visible-text scenario 6', solve('cancel-freezes-visible-text', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('finished-but-buffered-state scenario 1', solve('finished-but-buffered-state', (['a'*N,'b','c'],1,'old',False,False,2)), 'streaming')
check('finished-but-buffered-state scenario 2', solve('finished-but-buffered-state', ([],0,'',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 3', solve('finished-but-buffered-state', (['a','b'],2,'ab',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 4', solve('finished-but-buffered-state', (['a','b'],0,'old',False,True,1)), 'streaming')
check('finished-but-buffered-state scenario 5', solve('finished-but-buffered-state', (['','x'],0,'',False,False,0)), 'streaming')
check('finished-but-buffered-state scenario 6', solve('finished-but-buffered-state', (['a','b','c'],1,'a',True,False,1)), 'draining')
check('empty-chunk-consumes-position scenario 1', solve('empty-chunk-consumes-position', (['a'*N,'b','c'],1,'old',False,False,2)), 2)
check('empty-chunk-consumes-position scenario 2', solve('empty-chunk-consumes-position', ([],0,'',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 3', solve('empty-chunk-consumes-position', (['a','b'],2,'ab',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 4', solve('empty-chunk-consumes-position', (['a','b'],0,'old',False,True,1)), 2)
check('empty-chunk-consumes-position scenario 5', solve('empty-chunk-consumes-position', (['','x'],0,'',False,False,0)), 2)
check('empty-chunk-consumes-position scenario 6', solve('empty-chunk-consumes-position', (['a','b','c'],1,'a',True,False,1)), 2)
check('unconsumed-tail-after-frame scenario 1', solve('unconsumed-tail-after-frame', (['a'*N,'b','c'],1,'old',False,False,2)), [])
check('unconsumed-tail-after-frame scenario 2', solve('unconsumed-tail-after-frame', ([],0,'',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 3', solve('unconsumed-tail-after-frame', (['a','b'],2,'ab',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 4', solve('unconsumed-tail-after-frame', (['a','b'],0,'old',False,True,1)), ['b'])
check('unconsumed-tail-after-frame scenario 5', solve('unconsumed-tail-after-frame', (['','x'],0,'',False,False,0)), ['','x'])
check('unconsumed-tail-after-frame scenario 6', solve('unconsumed-tail-after-frame', (['a','b','c'],1,'a',True,False,1)), ['c'])
check('completion-event-once-drained scenario 1', solve('completion-event-once-drained', (['a'*N,'b','c'],1,'old',False,False,2)), False)
check('completion-event-once-drained scenario 2', solve('completion-event-once-drained', ([],0,'',True,False,2)), True)
check('completion-event-once-drained scenario 3', solve('completion-event-once-drained', (['a','b'],2,'ab',True,False,2)), True)
check('completion-event-once-drained scenario 4', solve('completion-event-once-drained', (['a','b'],0,'old',False,True,1)), False)
check('completion-event-once-drained scenario 5', solve('completion-event-once-drained', (['','x'],0,'',False,False,0)), False)
check('completion-event-once-drained scenario 6', solve('completion-event-once-drained', (['a','b','c'],1,'a',True,False,1)), False)
check('render-frame-needed scenario 1', solve('render-frame-needed', (['a'*N,'b','c'],1,'old',False,False,2)), True)
check('render-frame-needed scenario 2', solve('render-frame-needed', ([],0,'',True,False,2)), False)
check('render-frame-needed scenario 3', solve('render-frame-needed', (['a','b'],2,'ab',True,False,2)), False)
check('render-frame-needed scenario 4', solve('render-frame-needed', (['a','b'],0,'old',False,True,1)), False)
check('render-frame-needed scenario 5', solve('render-frame-needed', (['','x'],0,'',False,False,0)), False)
check('render-frame-needed scenario 6', solve('render-frame-needed', (['a','b','c'],1,'a',True,False,1)), True)
check('abort-discards-buffered-suffix scenario 1', solve('abort-discards-buffered-suffix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('abort-discards-buffered-suffix scenario 2', solve('abort-discards-buffered-suffix', ([],0,'',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 3', solve('abort-discards-buffered-suffix', (['a','b'],2,'ab',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 4', solve('abort-discards-buffered-suffix', (['a','b'],0,'old',False,True,1)), [])
check('abort-discards-buffered-suffix scenario 5', solve('abort-discards-buffered-suffix', (['','x'],0,'',False,False,0)), ['','x'])
check('abort-discards-buffered-suffix scenario 6', solve('abort-discards-buffered-suffix', (['a','b','c'],1,'a',True,False,1)), ['b','c'])
check('empty response still streaming before end signal: append-only-unseen-chunks', solve('append-only-unseen-chunks', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: render-budget-prefix', solve('render-budget-prefix', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: cursor-advances-by-consumed-count', solve('cursor-advances-by-consumed-count', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: cancel-freezes-visible-text', solve('cancel-freezes-visible-text', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: finished-but-buffered-state', solve('finished-but-buffered-state', ([],0,'',False,False,1)), 'streaming')
check('empty response still streaming before end signal: empty-chunk-consumes-position', solve('empty-chunk-consumes-position', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: unconsumed-tail-after-frame', solve('unconsumed-tail-after-frame', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: completion-event-once-drained', solve('completion-event-once-drained', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: render-frame-needed', solve('render-frame-needed', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: abort-discards-buffered-suffix', solve('abort-discards-buffered-suffix', ([],0,'',False,False,1)), [])
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
append-only-unseen-chunks scenario 1oldbcoldbcPassed
append-only-unseen-chunks scenario 2Passed
append-only-unseen-chunks scenario 3ababPassed
append-only-unseen-chunks scenario 4oldaboldabPassed
append-only-unseen-chunks scenario 5xxPassed
append-only-unseen-chunks scenario 6abcabcPassed
render-budget-prefix scenario 1['b', 'c']['b', 'c']Passed
render-budget-prefix scenario 2[][]Passed
render-budget-prefix scenario 3[][]Passed
render-budget-prefix scenario 4['a']['a']Passed
render-budget-prefix scenario 5[][]Passed
render-budget-prefix scenario 6['b']['b']Passed
cursor-advances-by-consumed-count scenario 133Passed
cursor-advances-by-consumed-count scenario 200Passed
cursor-advances-by-consumed-count scenario 322Passed
cursor-advances-by-consumed-count scenario 411Passed
cursor-advances-by-consumed-count scenario 500Passed
cursor-advances-by-consumed-count scenario 622Passed
cancel-freezes-visible-text scenario 1oldbcoldbcPassed
cancel-freezes-visible-text scenario 2Passed
cancel-freezes-visible-text scenario 3ababPassed
cancel-freezes-visible-text scenario 4oldoldPassed
cancel-freezes-visible-text scenario 5xxPassed
cancel-freezes-visible-text scenario 6abcabcPassed
finished-but-buffered-state scenario 1streamingstreamingPassed
finished-but-buffered-state scenario 2completecompletePassed
finished-but-buffered-state scenario 3completecompletePassed
finished-but-buffered-state scenario 4streamingstreamingPassed
finished-but-buffered-state scenario 5streamingstreamingPassed
finished-but-buffered-state scenario 6drainingdrainingPassed
empty-chunk-consumes-position scenario 122Passed
empty-chunk-consumes-position scenario 200Passed
empty-chunk-consumes-position scenario 300Passed
empty-chunk-consumes-position scenario 422Passed
empty-chunk-consumes-position scenario 522Passed
empty-chunk-consumes-position scenario 622Passed
unconsumed-tail-after-frame scenario 1[][]Passed
unconsumed-tail-after-frame scenario 2[][]Passed
unconsumed-tail-after-frame scenario 3[][]Passed
unconsumed-tail-after-frame scenario 4['b']['b']Passed
unconsumed-tail-after-frame scenario 5['', 'x']['', 'x']Passed
unconsumed-tail-after-frame scenario 6['c']['c']Passed
completion-event-once-drained scenario 1FalseFalsePassed
completion-event-once-drained scenario 2TrueTruePassed
completion-event-once-drained scenario 3TrueTruePassed
completion-event-once-drained scenario 4FalseFalsePassed
completion-event-once-drained scenario 5FalseFalsePassed
completion-event-once-drained scenario 6TrueFalseFailed
render-frame-needed scenario 1TrueTruePassed
render-frame-needed scenario 2FalseFalsePassed
render-frame-needed scenario 3FalseFalsePassed
render-frame-needed scenario 4FalseFalsePassed
render-frame-needed scenario 5FalseFalsePassed
render-frame-needed scenario 6TrueTruePassed
abort-discards-buffered-suffix scenario 1['b', 'c']['b', 'c']Passed
abort-discards-buffered-suffix scenario 2[][]Passed
abort-discards-buffered-suffix scenario 3[][]Passed
abort-discards-buffered-suffix scenario 4[][]Passed
abort-discards-buffered-suffix scenario 5['', 'x']['', 'x']Passed
abort-discards-buffered-suffix scenario 6['b', 'c']['b', 'c']Passed
empty response still streaming before end signal: append-only-unseen-chunksPassed
empty response still streaming before end signal: render-budget-prefix[][]Passed
empty response still streaming before end signal: cursor-advances-by-consumed-count00Passed
empty response still streaming before end signal: cancel-freezes-visible-textPassed
empty response still streaming before end signal: finished-but-buffered-statestreamingstreamingPassed
empty response still streaming before end signal: empty-chunk-consumes-position00Passed
empty response still streaming before end signal: unconsumed-tail-after-frame[][]Passed
empty response still streaming before end signal: completion-event-once-drainedFalseFalsePassed
empty response still streaming before end signal: render-frame-neededFalseFalsePassed
empty response still streaming before end signal: abort-discards-buffered-suffix[][]Passed

SHA-256 / 13e8407dbce628d647766c7ee9aef37dabec440eb4e640cd19f6edd34ebb0937

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(operation, s):
    chunks, cursor, committed, finished, cancelled, limit = s
    if operation == 'append-only-unseen-chunks':
        return committed+''.join(chunks[cursor:])
    if operation == 'render-budget-prefix':
        return chunks[cursor:cursor+limit]
    if operation == 'cursor-advances-by-consumed-count':
        return cursor+len(chunks[cursor:cursor+limit])
    if operation == 'cancel-freezes-visible-text':
        return committed if cancelled else committed+''.join(chunks[cursor:])
    if operation == 'finished-but-buffered-state':
        return 'draining' if finished and cursor<len(chunks) else ('complete' if finished else 'streaming')
    if operation == 'empty-chunk-consumes-position':
        return len(chunks[cursor:])
    if operation == 'unconsumed-tail-after-frame':
        return chunks[cursor+limit:]
    if operation == 'completion-event-once-drained':
        return cursor==len(chunks)
    if operation == 'render-frame-needed':
        return not cancelled and cursor<len(chunks) and limit>0
    if operation == 'abort-discards-buffered-suffix':
        return [] if cancelled else chunks[cursor:]
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('append-only-unseen-chunks scenario 1', solve('append-only-unseen-chunks', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('append-only-unseen-chunks scenario 2', solve('append-only-unseen-chunks', ([],0,'',True,False,2)), '')
check('append-only-unseen-chunks scenario 3', solve('append-only-unseen-chunks', (['a','b'],2,'ab',True,False,2)), 'ab')
check('append-only-unseen-chunks scenario 4', solve('append-only-unseen-chunks', (['a','b'],0,'old',False,True,1)), 'oldab')
check('append-only-unseen-chunks scenario 5', solve('append-only-unseen-chunks', (['','x'],0,'',False,False,0)), 'x')
check('append-only-unseen-chunks scenario 6', solve('append-only-unseen-chunks', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('render-budget-prefix scenario 1', solve('render-budget-prefix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('render-budget-prefix scenario 2', solve('render-budget-prefix', ([],0,'',True,False,2)), [])
check('render-budget-prefix scenario 3', solve('render-budget-prefix', (['a','b'],2,'ab',True,False,2)), [])
check('render-budget-prefix scenario 4', solve('render-budget-prefix', (['a','b'],0,'old',False,True,1)), ['a'])
check('render-budget-prefix scenario 5', solve('render-budget-prefix', (['','x'],0,'',False,False,0)), [])
check('render-budget-prefix scenario 6', solve('render-budget-prefix', (['a','b','c'],1,'a',True,False,1)), ['b'])
check('cursor-advances-by-consumed-count scenario 1', solve('cursor-advances-by-consumed-count', (['a'*N,'b','c'],1,'old',False,False,2)), 3)
check('cursor-advances-by-consumed-count scenario 2', solve('cursor-advances-by-consumed-count', ([],0,'',True,False,2)), 0)
check('cursor-advances-by-consumed-count scenario 3', solve('cursor-advances-by-consumed-count', (['a','b'],2,'ab',True,False,2)), 2)
check('cursor-advances-by-consumed-count scenario 4', solve('cursor-advances-by-consumed-count', (['a','b'],0,'old',False,True,1)), 1)
check('cursor-advances-by-consumed-count scenario 5', solve('cursor-advances-by-consumed-count', (['','x'],0,'',False,False,0)), 0)
check('cursor-advances-by-consumed-count scenario 6', solve('cursor-advances-by-consumed-count', (['a','b','c'],1,'a',True,False,1)), 2)
check('cancel-freezes-visible-text scenario 1', solve('cancel-freezes-visible-text', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('cancel-freezes-visible-text scenario 2', solve('cancel-freezes-visible-text', ([],0,'',True,False,2)), '')
check('cancel-freezes-visible-text scenario 3', solve('cancel-freezes-visible-text', (['a','b'],2,'ab',True,False,2)), 'ab')
check('cancel-freezes-visible-text scenario 4', solve('cancel-freezes-visible-text', (['a','b'],0,'old',False,True,1)), 'old')
check('cancel-freezes-visible-text scenario 5', solve('cancel-freezes-visible-text', (['','x'],0,'',False,False,0)), 'x')
check('cancel-freezes-visible-text scenario 6', solve('cancel-freezes-visible-text', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('finished-but-buffered-state scenario 1', solve('finished-but-buffered-state', (['a'*N,'b','c'],1,'old',False,False,2)), 'streaming')
check('finished-but-buffered-state scenario 2', solve('finished-but-buffered-state', ([],0,'',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 3', solve('finished-but-buffered-state', (['a','b'],2,'ab',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 4', solve('finished-but-buffered-state', (['a','b'],0,'old',False,True,1)), 'streaming')
check('finished-but-buffered-state scenario 5', solve('finished-but-buffered-state', (['','x'],0,'',False,False,0)), 'streaming')
check('finished-but-buffered-state scenario 6', solve('finished-but-buffered-state', (['a','b','c'],1,'a',True,False,1)), 'draining')
check('empty-chunk-consumes-position scenario 1', solve('empty-chunk-consumes-position', (['a'*N,'b','c'],1,'old',False,False,2)), 2)
check('empty-chunk-consumes-position scenario 2', solve('empty-chunk-consumes-position', ([],0,'',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 3', solve('empty-chunk-consumes-position', (['a','b'],2,'ab',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 4', solve('empty-chunk-consumes-position', (['a','b'],0,'old',False,True,1)), 2)
check('empty-chunk-consumes-position scenario 5', solve('empty-chunk-consumes-position', (['','x'],0,'',False,False,0)), 2)
check('empty-chunk-consumes-position scenario 6', solve('empty-chunk-consumes-position', (['a','b','c'],1,'a',True,False,1)), 2)
check('unconsumed-tail-after-frame scenario 1', solve('unconsumed-tail-after-frame', (['a'*N,'b','c'],1,'old',False,False,2)), [])
check('unconsumed-tail-after-frame scenario 2', solve('unconsumed-tail-after-frame', ([],0,'',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 3', solve('unconsumed-tail-after-frame', (['a','b'],2,'ab',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 4', solve('unconsumed-tail-after-frame', (['a','b'],0,'old',False,True,1)), ['b'])
check('unconsumed-tail-after-frame scenario 5', solve('unconsumed-tail-after-frame', (['','x'],0,'',False,False,0)), ['','x'])
check('unconsumed-tail-after-frame scenario 6', solve('unconsumed-tail-after-frame', (['a','b','c'],1,'a',True,False,1)), ['c'])
check('completion-event-once-drained scenario 1', solve('completion-event-once-drained', (['a'*N,'b','c'],1,'old',False,False,2)), False)
check('completion-event-once-drained scenario 2', solve('completion-event-once-drained', ([],0,'',True,False,2)), True)
check('completion-event-once-drained scenario 3', solve('completion-event-once-drained', (['a','b'],2,'ab',True,False,2)), True)
check('completion-event-once-drained scenario 4', solve('completion-event-once-drained', (['a','b'],0,'old',False,True,1)), False)
check('completion-event-once-drained scenario 5', solve('completion-event-once-drained', (['','x'],0,'',False,False,0)), False)
check('completion-event-once-drained scenario 6', solve('completion-event-once-drained', (['a','b','c'],1,'a',True,False,1)), False)
check('render-frame-needed scenario 1', solve('render-frame-needed', (['a'*N,'b','c'],1,'old',False,False,2)), True)
check('render-frame-needed scenario 2', solve('render-frame-needed', ([],0,'',True,False,2)), False)
check('render-frame-needed scenario 3', solve('render-frame-needed', (['a','b'],2,'ab',True,False,2)), False)
check('render-frame-needed scenario 4', solve('render-frame-needed', (['a','b'],0,'old',False,True,1)), False)
check('render-frame-needed scenario 5', solve('render-frame-needed', (['','x'],0,'',False,False,0)), False)
check('render-frame-needed scenario 6', solve('render-frame-needed', (['a','b','c'],1,'a',True,False,1)), True)
check('abort-discards-buffered-suffix scenario 1', solve('abort-discards-buffered-suffix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('abort-discards-buffered-suffix scenario 2', solve('abort-discards-buffered-suffix', ([],0,'',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 3', solve('abort-discards-buffered-suffix', (['a','b'],2,'ab',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 4', solve('abort-discards-buffered-suffix', (['a','b'],0,'old',False,True,1)), [])
check('abort-discards-buffered-suffix scenario 5', solve('abort-discards-buffered-suffix', (['','x'],0,'',False,False,0)), ['','x'])
check('abort-discards-buffered-suffix scenario 6', solve('abort-discards-buffered-suffix', (['a','b','c'],1,'a',True,False,1)), ['b','c'])
check('empty response still streaming before end signal: append-only-unseen-chunks', solve('append-only-unseen-chunks', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: render-budget-prefix', solve('render-budget-prefix', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: cursor-advances-by-consumed-count', solve('cursor-advances-by-consumed-count', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: cancel-freezes-visible-text', solve('cancel-freezes-visible-text', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: finished-but-buffered-state', solve('finished-but-buffered-state', ([],0,'',False,False,1)), 'streaming')
check('empty response still streaming before end signal: empty-chunk-consumes-position', solve('empty-chunk-consumes-position', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: unconsumed-tail-after-frame', solve('unconsumed-tail-after-frame', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: completion-event-once-drained', solve('completion-event-once-drained', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: render-frame-needed', solve('render-frame-needed', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: abort-discards-buffered-suffix', solve('abort-discards-buffered-suffix', ([],0,'',False,False,1)), [])
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
append-only-unseen-chunks scenario 1oldbcoldbcPassed
append-only-unseen-chunks scenario 2Passed
append-only-unseen-chunks scenario 3ababPassed
append-only-unseen-chunks scenario 4oldaboldabPassed
append-only-unseen-chunks scenario 5xxPassed
append-only-unseen-chunks scenario 6abcabcPassed
render-budget-prefix scenario 1['b', 'c']['b', 'c']Passed
render-budget-prefix scenario 2[][]Passed
render-budget-prefix scenario 3[][]Passed
render-budget-prefix scenario 4['a']['a']Passed
render-budget-prefix scenario 5[][]Passed
render-budget-prefix scenario 6['b']['b']Passed
cursor-advances-by-consumed-count scenario 133Passed
cursor-advances-by-consumed-count scenario 200Passed
cursor-advances-by-consumed-count scenario 322Passed
cursor-advances-by-consumed-count scenario 411Passed
cursor-advances-by-consumed-count scenario 500Passed
cursor-advances-by-consumed-count scenario 622Passed
cancel-freezes-visible-text scenario 1oldbcoldbcPassed
cancel-freezes-visible-text scenario 2Passed
cancel-freezes-visible-text scenario 3ababPassed
cancel-freezes-visible-text scenario 4oldoldPassed
cancel-freezes-visible-text scenario 5xxPassed
cancel-freezes-visible-text scenario 6abcabcPassed
finished-but-buffered-state scenario 1streamingstreamingPassed
finished-but-buffered-state scenario 2completecompletePassed
finished-but-buffered-state scenario 3completecompletePassed
finished-but-buffered-state scenario 4streamingstreamingPassed
finished-but-buffered-state scenario 5streamingstreamingPassed
finished-but-buffered-state scenario 6drainingdrainingPassed
empty-chunk-consumes-position scenario 122Passed
empty-chunk-consumes-position scenario 200Passed
empty-chunk-consumes-position scenario 300Passed
empty-chunk-consumes-position scenario 422Passed
empty-chunk-consumes-position scenario 522Passed
empty-chunk-consumes-position scenario 622Passed
unconsumed-tail-after-frame scenario 1[][]Passed
unconsumed-tail-after-frame scenario 2[][]Passed
unconsumed-tail-after-frame scenario 3[][]Passed
unconsumed-tail-after-frame scenario 4['b']['b']Passed
unconsumed-tail-after-frame scenario 5['', 'x']['', 'x']Passed
unconsumed-tail-after-frame scenario 6['c']['c']Passed
completion-event-once-drained scenario 1FalseFalsePassed
completion-event-once-drained scenario 2TrueTruePassed
completion-event-once-drained scenario 3TrueTruePassed
completion-event-once-drained scenario 4FalseFalsePassed
completion-event-once-drained scenario 5FalseFalsePassed
completion-event-once-drained scenario 6FalseFalsePassed
render-frame-needed scenario 1TrueTruePassed
render-frame-needed scenario 2FalseFalsePassed
render-frame-needed scenario 3FalseFalsePassed
render-frame-needed scenario 4FalseFalsePassed
render-frame-needed scenario 5FalseFalsePassed
render-frame-needed scenario 6TrueTruePassed
abort-discards-buffered-suffix scenario 1['b', 'c']['b', 'c']Passed
abort-discards-buffered-suffix scenario 2[][]Passed
abort-discards-buffered-suffix scenario 3[][]Passed
abort-discards-buffered-suffix scenario 4[][]Passed
abort-discards-buffered-suffix scenario 5['', 'x']['', 'x']Passed
abort-discards-buffered-suffix scenario 6['b', 'c']['b', 'c']Passed
empty response still streaming before end signal: append-only-unseen-chunksPassed
empty response still streaming before end signal: render-budget-prefix[][]Passed
empty response still streaming before end signal: cursor-advances-by-consumed-count00Passed
empty response still streaming before end signal: cancel-freezes-visible-textPassed
empty response still streaming before end signal: finished-but-buffered-statestreamingstreamingPassed
empty response still streaming before end signal: empty-chunk-consumes-position00Passed
empty response still streaming before end signal: unconsumed-tail-after-frame[][]Passed
empty response still streaming before end signal: completion-event-once-drainedTrueFalseFailed
empty response still streaming before end signal: render-frame-neededFalseFalsePassed
empty response still streaming before end signal: abort-discards-buffered-suffix[][]Passed

SHA-256 / 13608ea507e376b916711dff0ceab124ee722131edea3575a6f6ff9c7bd08478

3 / The verified repair

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

N = 1
observations = []
def solve(operation, s):
    chunks, cursor, committed, finished, cancelled, limit = s
    if operation == 'append-only-unseen-chunks':
        return committed+''.join(chunks[cursor:])
    if operation == 'render-budget-prefix':
        return chunks[cursor:cursor+limit]
    if operation == 'cursor-advances-by-consumed-count':
        return cursor+len(chunks[cursor:cursor+limit])
    if operation == 'cancel-freezes-visible-text':
        return committed if cancelled else committed+''.join(chunks[cursor:])
    if operation == 'finished-but-buffered-state':
        return 'draining' if finished and cursor<len(chunks) else ('complete' if finished else 'streaming')
    if operation == 'empty-chunk-consumes-position':
        return len(chunks[cursor:])
    if operation == 'unconsumed-tail-after-frame':
        return chunks[cursor+limit:]
    if operation == 'completion-event-once-drained':
        return finished and cursor==len(chunks) and not cancelled
    if operation == 'render-frame-needed':
        return not cancelled and cursor<len(chunks) and limit>0
    if operation == 'abort-discards-buffered-suffix':
        return [] if cancelled else chunks[cursor:]
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('append-only-unseen-chunks scenario 1', solve('append-only-unseen-chunks', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('append-only-unseen-chunks scenario 2', solve('append-only-unseen-chunks', ([],0,'',True,False,2)), '')
check('append-only-unseen-chunks scenario 3', solve('append-only-unseen-chunks', (['a','b'],2,'ab',True,False,2)), 'ab')
check('append-only-unseen-chunks scenario 4', solve('append-only-unseen-chunks', (['a','b'],0,'old',False,True,1)), 'oldab')
check('append-only-unseen-chunks scenario 5', solve('append-only-unseen-chunks', (['','x'],0,'',False,False,0)), 'x')
check('append-only-unseen-chunks scenario 6', solve('append-only-unseen-chunks', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('render-budget-prefix scenario 1', solve('render-budget-prefix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('render-budget-prefix scenario 2', solve('render-budget-prefix', ([],0,'',True,False,2)), [])
check('render-budget-prefix scenario 3', solve('render-budget-prefix', (['a','b'],2,'ab',True,False,2)), [])
check('render-budget-prefix scenario 4', solve('render-budget-prefix', (['a','b'],0,'old',False,True,1)), ['a'])
check('render-budget-prefix scenario 5', solve('render-budget-prefix', (['','x'],0,'',False,False,0)), [])
check('render-budget-prefix scenario 6', solve('render-budget-prefix', (['a','b','c'],1,'a',True,False,1)), ['b'])
check('cursor-advances-by-consumed-count scenario 1', solve('cursor-advances-by-consumed-count', (['a'*N,'b','c'],1,'old',False,False,2)), 3)
check('cursor-advances-by-consumed-count scenario 2', solve('cursor-advances-by-consumed-count', ([],0,'',True,False,2)), 0)
check('cursor-advances-by-consumed-count scenario 3', solve('cursor-advances-by-consumed-count', (['a','b'],2,'ab',True,False,2)), 2)
check('cursor-advances-by-consumed-count scenario 4', solve('cursor-advances-by-consumed-count', (['a','b'],0,'old',False,True,1)), 1)
check('cursor-advances-by-consumed-count scenario 5', solve('cursor-advances-by-consumed-count', (['','x'],0,'',False,False,0)), 0)
check('cursor-advances-by-consumed-count scenario 6', solve('cursor-advances-by-consumed-count', (['a','b','c'],1,'a',True,False,1)), 2)
check('cancel-freezes-visible-text scenario 1', solve('cancel-freezes-visible-text', (['a'*N,'b','c'],1,'old',False,False,2)), 'oldbc')
check('cancel-freezes-visible-text scenario 2', solve('cancel-freezes-visible-text', ([],0,'',True,False,2)), '')
check('cancel-freezes-visible-text scenario 3', solve('cancel-freezes-visible-text', (['a','b'],2,'ab',True,False,2)), 'ab')
check('cancel-freezes-visible-text scenario 4', solve('cancel-freezes-visible-text', (['a','b'],0,'old',False,True,1)), 'old')
check('cancel-freezes-visible-text scenario 5', solve('cancel-freezes-visible-text', (['','x'],0,'',False,False,0)), 'x')
check('cancel-freezes-visible-text scenario 6', solve('cancel-freezes-visible-text', (['a','b','c'],1,'a',True,False,1)), 'abc')
check('finished-but-buffered-state scenario 1', solve('finished-but-buffered-state', (['a'*N,'b','c'],1,'old',False,False,2)), 'streaming')
check('finished-but-buffered-state scenario 2', solve('finished-but-buffered-state', ([],0,'',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 3', solve('finished-but-buffered-state', (['a','b'],2,'ab',True,False,2)), 'complete')
check('finished-but-buffered-state scenario 4', solve('finished-but-buffered-state', (['a','b'],0,'old',False,True,1)), 'streaming')
check('finished-but-buffered-state scenario 5', solve('finished-but-buffered-state', (['','x'],0,'',False,False,0)), 'streaming')
check('finished-but-buffered-state scenario 6', solve('finished-but-buffered-state', (['a','b','c'],1,'a',True,False,1)), 'draining')
check('empty-chunk-consumes-position scenario 1', solve('empty-chunk-consumes-position', (['a'*N,'b','c'],1,'old',False,False,2)), 2)
check('empty-chunk-consumes-position scenario 2', solve('empty-chunk-consumes-position', ([],0,'',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 3', solve('empty-chunk-consumes-position', (['a','b'],2,'ab',True,False,2)), 0)
check('empty-chunk-consumes-position scenario 4', solve('empty-chunk-consumes-position', (['a','b'],0,'old',False,True,1)), 2)
check('empty-chunk-consumes-position scenario 5', solve('empty-chunk-consumes-position', (['','x'],0,'',False,False,0)), 2)
check('empty-chunk-consumes-position scenario 6', solve('empty-chunk-consumes-position', (['a','b','c'],1,'a',True,False,1)), 2)
check('unconsumed-tail-after-frame scenario 1', solve('unconsumed-tail-after-frame', (['a'*N,'b','c'],1,'old',False,False,2)), [])
check('unconsumed-tail-after-frame scenario 2', solve('unconsumed-tail-after-frame', ([],0,'',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 3', solve('unconsumed-tail-after-frame', (['a','b'],2,'ab',True,False,2)), [])
check('unconsumed-tail-after-frame scenario 4', solve('unconsumed-tail-after-frame', (['a','b'],0,'old',False,True,1)), ['b'])
check('unconsumed-tail-after-frame scenario 5', solve('unconsumed-tail-after-frame', (['','x'],0,'',False,False,0)), ['','x'])
check('unconsumed-tail-after-frame scenario 6', solve('unconsumed-tail-after-frame', (['a','b','c'],1,'a',True,False,1)), ['c'])
check('completion-event-once-drained scenario 1', solve('completion-event-once-drained', (['a'*N,'b','c'],1,'old',False,False,2)), False)
check('completion-event-once-drained scenario 2', solve('completion-event-once-drained', ([],0,'',True,False,2)), True)
check('completion-event-once-drained scenario 3', solve('completion-event-once-drained', (['a','b'],2,'ab',True,False,2)), True)
check('completion-event-once-drained scenario 4', solve('completion-event-once-drained', (['a','b'],0,'old',False,True,1)), False)
check('completion-event-once-drained scenario 5', solve('completion-event-once-drained', (['','x'],0,'',False,False,0)), False)
check('completion-event-once-drained scenario 6', solve('completion-event-once-drained', (['a','b','c'],1,'a',True,False,1)), False)
check('render-frame-needed scenario 1', solve('render-frame-needed', (['a'*N,'b','c'],1,'old',False,False,2)), True)
check('render-frame-needed scenario 2', solve('render-frame-needed', ([],0,'',True,False,2)), False)
check('render-frame-needed scenario 3', solve('render-frame-needed', (['a','b'],2,'ab',True,False,2)), False)
check('render-frame-needed scenario 4', solve('render-frame-needed', (['a','b'],0,'old',False,True,1)), False)
check('render-frame-needed scenario 5', solve('render-frame-needed', (['','x'],0,'',False,False,0)), False)
check('render-frame-needed scenario 6', solve('render-frame-needed', (['a','b','c'],1,'a',True,False,1)), True)
check('abort-discards-buffered-suffix scenario 1', solve('abort-discards-buffered-suffix', (['a'*N,'b','c'],1,'old',False,False,2)), ['b','c'])
check('abort-discards-buffered-suffix scenario 2', solve('abort-discards-buffered-suffix', ([],0,'',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 3', solve('abort-discards-buffered-suffix', (['a','b'],2,'ab',True,False,2)), [])
check('abort-discards-buffered-suffix scenario 4', solve('abort-discards-buffered-suffix', (['a','b'],0,'old',False,True,1)), [])
check('abort-discards-buffered-suffix scenario 5', solve('abort-discards-buffered-suffix', (['','x'],0,'',False,False,0)), ['','x'])
check('abort-discards-buffered-suffix scenario 6', solve('abort-discards-buffered-suffix', (['a','b','c'],1,'a',True,False,1)), ['b','c'])
check('empty response still streaming before end signal: append-only-unseen-chunks', solve('append-only-unseen-chunks', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: render-budget-prefix', solve('render-budget-prefix', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: cursor-advances-by-consumed-count', solve('cursor-advances-by-consumed-count', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: cancel-freezes-visible-text', solve('cancel-freezes-visible-text', ([],0,'',False,False,1)), '')
check('empty response still streaming before end signal: finished-but-buffered-state', solve('finished-but-buffered-state', ([],0,'',False,False,1)), 'streaming')
check('empty response still streaming before end signal: empty-chunk-consumes-position', solve('empty-chunk-consumes-position', ([],0,'',False,False,1)), 0)
check('empty response still streaming before end signal: unconsumed-tail-after-frame', solve('unconsumed-tail-after-frame', ([],0,'',False,False,1)), [])
check('empty response still streaming before end signal: completion-event-once-drained', solve('completion-event-once-drained', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: render-frame-needed', solve('render-frame-needed', ([],0,'',False,False,1)), False)
check('empty response still streaming before end signal: abort-discards-buffered-suffix', solve('abort-discards-buffered-suffix', ([],0,'',False,False,1)), [])
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
append-only-unseen-chunks scenario 1oldbcoldbcPassed
append-only-unseen-chunks scenario 2Passed
append-only-unseen-chunks scenario 3ababPassed
append-only-unseen-chunks scenario 4oldaboldabPassed
append-only-unseen-chunks scenario 5xxPassed
append-only-unseen-chunks scenario 6abcabcPassed
render-budget-prefix scenario 1['b', 'c']['b', 'c']Passed
render-budget-prefix scenario 2[][]Passed
render-budget-prefix scenario 3[][]Passed
render-budget-prefix scenario 4['a']['a']Passed
render-budget-prefix scenario 5[][]Passed
render-budget-prefix scenario 6['b']['b']Passed
cursor-advances-by-consumed-count scenario 133Passed
cursor-advances-by-consumed-count scenario 200Passed
cursor-advances-by-consumed-count scenario 322Passed
cursor-advances-by-consumed-count scenario 411Passed
cursor-advances-by-consumed-count scenario 500Passed
cursor-advances-by-consumed-count scenario 622Passed
cancel-freezes-visible-text scenario 1oldbcoldbcPassed
cancel-freezes-visible-text scenario 2Passed
cancel-freezes-visible-text scenario 3ababPassed
cancel-freezes-visible-text scenario 4oldoldPassed
cancel-freezes-visible-text scenario 5xxPassed
cancel-freezes-visible-text scenario 6abcabcPassed
finished-but-buffered-state scenario 1streamingstreamingPassed
finished-but-buffered-state scenario 2completecompletePassed
finished-but-buffered-state scenario 3completecompletePassed
finished-but-buffered-state scenario 4streamingstreamingPassed
finished-but-buffered-state scenario 5streamingstreamingPassed
finished-but-buffered-state scenario 6drainingdrainingPassed
empty-chunk-consumes-position scenario 122Passed
empty-chunk-consumes-position scenario 200Passed
empty-chunk-consumes-position scenario 300Passed
empty-chunk-consumes-position scenario 422Passed
empty-chunk-consumes-position scenario 522Passed
empty-chunk-consumes-position scenario 622Passed
unconsumed-tail-after-frame scenario 1[][]Passed
unconsumed-tail-after-frame scenario 2[][]Passed
unconsumed-tail-after-frame scenario 3[][]Passed
unconsumed-tail-after-frame scenario 4['b']['b']Passed
unconsumed-tail-after-frame scenario 5['', 'x']['', 'x']Passed
unconsumed-tail-after-frame scenario 6['c']['c']Passed
completion-event-once-drained scenario 1FalseFalsePassed
completion-event-once-drained scenario 2TrueTruePassed
completion-event-once-drained scenario 3TrueTruePassed
completion-event-once-drained scenario 4FalseFalsePassed
completion-event-once-drained scenario 5FalseFalsePassed
completion-event-once-drained scenario 6FalseFalsePassed
render-frame-needed scenario 1TrueTruePassed
render-frame-needed scenario 2FalseFalsePassed
render-frame-needed scenario 3FalseFalsePassed
render-frame-needed scenario 4FalseFalsePassed
render-frame-needed scenario 5FalseFalsePassed
render-frame-needed scenario 6TrueTruePassed
abort-discards-buffered-suffix scenario 1['b', 'c']['b', 'c']Passed
abort-discards-buffered-suffix scenario 2[][]Passed
abort-discards-buffered-suffix scenario 3[][]Passed
abort-discards-buffered-suffix scenario 4[][]Passed
abort-discards-buffered-suffix scenario 5['', 'x']['', 'x']Passed
abort-discards-buffered-suffix scenario 6['b', 'c']['b', 'c']Passed
empty response still streaming before end signal: append-only-unseen-chunksPassed
empty response still streaming before end signal: render-budget-prefix[][]Passed
empty response still streaming before end signal: cursor-advances-by-consumed-count00Passed
empty response still streaming before end signal: cancel-freezes-visible-textPassed
empty response still streaming before end signal: finished-but-buffered-statestreamingstreamingPassed
empty response still streaming before end signal: empty-chunk-consumes-position00Passed
empty response still streaming before end signal: unconsumed-tail-after-frame[][]Passed
empty response still streaming before end signal: completion-event-once-drainedFalseFalsePassed
empty response still streaming before end signal: render-frame-neededFalseFalsePassed
empty response still streaming before end signal: abort-discards-buffered-suffix[][]Passed

SHA-256 / 1c05943e7d39e5c3733fa37346728bb4b19de2e99180f4d9e9427ed3b873528e

Verification & scope

Only the explicitly specified operations and finite deterministic records are modeled; no browser or framework conformance is claimed. 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:58.669531+00:00.

Case digest / acecc62de8dbe2fdd733171864fe513cb31d71d7f89e8bf653998cf814e5445f