FAILURE MAP
← Case archive

FA-24296 / Client state / Open access

Client generated-file delivery state: Received byte accounting · case 01

Received byte accounting.

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

ROOT CAUSE

The received-byte-accounting client decision evaluates `len(received)` instead of `sum(len(chunks[i]) for i in received)`.

VERIFIED REPAIR

Apply the modeled received-byte-accounting rule: `sum(len(chunks[i]) for i in received)`.

Unsuccessful approach: The partial repair `sum(len(x) for x in chunks)` still violates the explicit fixture contract.

Case contract

The generated-file client tracks received chunk indexes, byte counts, blob readers and user gestures. Assembly uses chunk order, ready empty files remain valid, and save actions require a current gesture. Operation received-byte-accounting 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, received, expected, status, gesture, blob, readers, detached = s
    if operation == 'received-byte-accounting':
        return len(received)
    if operation == 'file-assembly-part-order':
        return ''.join(chunks[i] for i in sorted(received))
    if operation == 'save-requires-current-gesture':
        return status=='ready' and gesture
    if operation == 'size-mismatch-error':
        return status=='ready' and sum(len(chunks[i]) for i in received)!=expected
    if operation == 'blob-reader-reference-release':
        return blob if detached and not readers else None
    if operation == 'reader-registry-preservation':
        return list(readers)
    if operation == 'download-action-status':
        return 'save' if status=='ready' and gesture else ('retry' if status=='failed' else 'wait')
    if operation == 'missing-part-display':
        return [i for i in range(len(chunks)) if i not in received]
    if operation == 'remaining-download-bytes':
        return max(0,expected-sum(len(chunks[i]) for i in received))
    if operation == 'complete-empty-download':
        return status=='ready' and len(received)==len(chunks)
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received-byte-accounting scenario 1', solve('received-byte-accounting', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), N+2)
check('received-byte-accounting scenario 2', solve('received-byte-accounting', ([],[],0,'ready',False,None,[],False)), 0)
check('received-byte-accounting scenario 3', solve('received-byte-accounting', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('received-byte-accounting scenario 4', solve('received-byte-accounting', (['x'],[0],1,'ready',False,'blob:b',[],True)), 1)
check('received-byte-accounting scenario 5', solve('received-byte-accounting', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 2)
check('received-byte-accounting scenario 6', solve('received-byte-accounting', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 1)
check('file-assembly-part-order scenario 1', solve('file-assembly-part-order', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'a'*N+'bc')
check('file-assembly-part-order scenario 2', solve('file-assembly-part-order', ([],[],0,'ready',False,None,[],False)), '')
check('file-assembly-part-order scenario 3', solve('file-assembly-part-order', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'cd')
check('file-assembly-part-order scenario 4', solve('file-assembly-part-order', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'x')
check('file-assembly-part-order scenario 5', solve('file-assembly-part-order', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'ab')
check('file-assembly-part-order scenario 6', solve('file-assembly-part-order', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'z')
check('save-requires-current-gesture scenario 1', solve('save-requires-current-gesture', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('save-requires-current-gesture scenario 2', solve('save-requires-current-gesture', ([],[],0,'ready',False,None,[],False)), False)
check('save-requires-current-gesture scenario 3', solve('save-requires-current-gesture', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('save-requires-current-gesture scenario 4', solve('save-requires-current-gesture', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('save-requires-current-gesture scenario 5', solve('save-requires-current-gesture', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('save-requires-current-gesture scenario 6', solve('save-requires-current-gesture', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('size-mismatch-error scenario 1', solve('size-mismatch-error', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), False)
check('size-mismatch-error scenario 2', solve('size-mismatch-error', ([],[],0,'ready',False,None,[],False)), False)
check('size-mismatch-error scenario 3', solve('size-mismatch-error', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('size-mismatch-error scenario 4', solve('size-mismatch-error', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('size-mismatch-error scenario 5', solve('size-mismatch-error', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('size-mismatch-error scenario 6', solve('size-mismatch-error', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), False)
check('blob-reader-reference-release scenario 1', solve('blob-reader-reference-release', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), None)
check('blob-reader-reference-release scenario 2', solve('blob-reader-reference-release', ([],[],0,'ready',False,None,[],False)), None)
check('blob-reader-reference-release scenario 3', solve('blob-reader-reference-release', (['ab','cd'],[1],4,'loading',True,None,[],False)), None)
check('blob-reader-reference-release scenario 4', solve('blob-reader-reference-release', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'blob:b')
check('blob-reader-reference-release scenario 5', solve('blob-reader-reference-release', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), None)
check('blob-reader-reference-release scenario 6', solve('blob-reader-reference-release', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), None)
check('reader-registry-preservation scenario 1', solve('reader-registry-preservation', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), ['preview'])
check('reader-registry-preservation scenario 2', solve('reader-registry-preservation', ([],[],0,'ready',False,None,[],False)), [])
check('reader-registry-preservation scenario 3', solve('reader-registry-preservation', (['ab','cd'],[1],4,'loading',True,None,[],False)), [])
check('reader-registry-preservation scenario 4', solve('reader-registry-preservation', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('reader-registry-preservation scenario 5', solve('reader-registry-preservation', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), ['preview','save'])
check('reader-registry-preservation scenario 6', solve('reader-registry-preservation', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('download-action-status scenario 1', solve('download-action-status', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'save')
check('download-action-status scenario 2', solve('download-action-status', ([],[],0,'ready',False,None,[],False)), 'wait')
check('download-action-status scenario 3', solve('download-action-status', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'wait')
check('download-action-status scenario 4', solve('download-action-status', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'wait')
check('download-action-status scenario 5', solve('download-action-status', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'retry')
check('download-action-status scenario 6', solve('download-action-status', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'save')
check('missing-part-display scenario 1', solve('missing-part-display', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), [])
check('missing-part-display scenario 2', solve('missing-part-display', ([],[],0,'ready',False,None,[],False)), [])
check('missing-part-display scenario 3', solve('missing-part-display', (['ab','cd'],[1],4,'loading',True,None,[],False)), [0])
check('missing-part-display scenario 4', solve('missing-part-display', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('missing-part-display scenario 5', solve('missing-part-display', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), [])
check('missing-part-display scenario 6', solve('missing-part-display', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('remaining-download-bytes scenario 1', solve('remaining-download-bytes', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 0)
check('remaining-download-bytes scenario 2', solve('remaining-download-bytes', ([],[],0,'ready',False,None,[],False)), 0)
check('remaining-download-bytes scenario 3', solve('remaining-download-bytes', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('remaining-download-bytes scenario 4', solve('remaining-download-bytes', (['x'],[0],1,'ready',False,'blob:b',[],True)), 0)
check('remaining-download-bytes scenario 5', solve('remaining-download-bytes', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 1)
check('remaining-download-bytes scenario 6', solve('remaining-download-bytes', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 0)
check('complete-empty-download scenario 1', solve('complete-empty-download', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('complete-empty-download scenario 2', solve('complete-empty-download', ([],[],0,'ready',False,None,[],False)), True)
check('complete-empty-download scenario 3', solve('complete-empty-download', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('complete-empty-download scenario 4', solve('complete-empty-download', (['x'],[0],1,'ready',False,'blob:b',[],True)), True)
check('complete-empty-download scenario 5', solve('complete-empty-download', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('complete-empty-download scenario 6', solve('complete-empty-download', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('save reader outlives preview detachment: received-byte-accounting', solve('received-byte-accounting', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 1)
check('save reader outlives preview detachment: file-assembly-part-order', solve('file-assembly-part-order', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'x')
check('save reader outlives preview detachment: save-requires-current-gesture', solve('save-requires-current-gesture', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
check('save reader outlives preview detachment: size-mismatch-error', solve('size-mismatch-error', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), False)
check('save reader outlives preview detachment: blob-reader-reference-release', solve('blob-reader-reference-release', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), None)
check('save reader outlives preview detachment: reader-registry-preservation', solve('reader-registry-preservation', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), ['save'])
check('save reader outlives preview detachment: download-action-status', solve('download-action-status', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'save')
check('save reader outlives preview detachment: missing-part-display', solve('missing-part-display', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), [])
check('save reader outlives preview detachment: remaining-download-bytes', solve('remaining-download-bytes', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 0)
check('save reader outlives preview detachment: complete-empty-download', solve('complete-empty-download', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
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
received-byte-accounting scenario 123Failed
received-byte-accounting scenario 200Passed
received-byte-accounting scenario 312Failed
received-byte-accounting scenario 411Passed
received-byte-accounting scenario 512Failed
received-byte-accounting scenario 621Failed
file-assembly-part-order scenario 1abcabcPassed
file-assembly-part-order scenario 2Passed
file-assembly-part-order scenario 3cdcdPassed
file-assembly-part-order scenario 4xxPassed
file-assembly-part-order scenario 5ababPassed
file-assembly-part-order scenario 6zzPassed
save-requires-current-gesture scenario 1TrueTruePassed
save-requires-current-gesture scenario 2FalseFalsePassed
save-requires-current-gesture scenario 3FalseFalsePassed
save-requires-current-gesture scenario 4FalseFalsePassed
save-requires-current-gesture scenario 5FalseFalsePassed
save-requires-current-gesture scenario 6TrueTruePassed
size-mismatch-error scenario 1FalseFalsePassed
size-mismatch-error scenario 2FalseFalsePassed
size-mismatch-error scenario 3FalseFalsePassed
size-mismatch-error scenario 4FalseFalsePassed
size-mismatch-error scenario 5FalseFalsePassed
size-mismatch-error scenario 6FalseFalsePassed
blob-reader-reference-release scenario 1NoneNonePassed
blob-reader-reference-release scenario 2NoneNonePassed
blob-reader-reference-release scenario 3NoneNonePassed
blob-reader-reference-release scenario 4blob:bblob:bPassed
blob-reader-reference-release scenario 5NoneNonePassed
blob-reader-reference-release scenario 6NoneNonePassed
reader-registry-preservation scenario 1['preview']['preview']Passed
reader-registry-preservation scenario 2[][]Passed
reader-registry-preservation scenario 3[][]Passed
reader-registry-preservation scenario 4[][]Passed
reader-registry-preservation scenario 5['preview', 'save']['preview', 'save']Passed
reader-registry-preservation scenario 6[][]Passed
download-action-status scenario 1savesavePassed
download-action-status scenario 2waitwaitPassed
download-action-status scenario 3waitwaitPassed
download-action-status scenario 4waitwaitPassed
download-action-status scenario 5retryretryPassed
download-action-status scenario 6savesavePassed
missing-part-display scenario 1[][]Passed
missing-part-display scenario 2[][]Passed
missing-part-display scenario 3[0][0]Passed
missing-part-display scenario 4[][]Passed
missing-part-display scenario 5[][]Passed
missing-part-display scenario 6[][]Passed
remaining-download-bytes scenario 100Passed
remaining-download-bytes scenario 200Passed
remaining-download-bytes scenario 322Passed
remaining-download-bytes scenario 400Passed
remaining-download-bytes scenario 511Passed
remaining-download-bytes scenario 600Passed
complete-empty-download scenario 1TrueTruePassed
complete-empty-download scenario 2TrueTruePassed
complete-empty-download scenario 3FalseFalsePassed
complete-empty-download scenario 4TrueTruePassed
complete-empty-download scenario 5FalseFalsePassed
complete-empty-download scenario 6TrueTruePassed
save reader outlives preview detachment: received-byte-accounting11Passed
save reader outlives preview detachment: file-assembly-part-orderxxPassed
save reader outlives preview detachment: save-requires-current-gestureTrueTruePassed
save reader outlives preview detachment: size-mismatch-errorFalseFalsePassed
save reader outlives preview detachment: blob-reader-reference-releaseNoneNonePassed
save reader outlives preview detachment: reader-registry-preservation['save']['save']Passed
save reader outlives preview detachment: download-action-statussavesavePassed
save reader outlives preview detachment: missing-part-display[][]Passed
save reader outlives preview detachment: remaining-download-bytes00Passed
save reader outlives preview detachment: complete-empty-downloadTrueTruePassed

SHA-256 / c32584c393772a5f03281cd3efe4905f45e6a7c2814009b9c6e756df67e670fa

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(operation, s):
    chunks, received, expected, status, gesture, blob, readers, detached = s
    if operation == 'received-byte-accounting':
        return sum(len(x) for x in chunks)
    if operation == 'file-assembly-part-order':
        return ''.join(chunks[i] for i in sorted(received))
    if operation == 'save-requires-current-gesture':
        return status=='ready' and gesture
    if operation == 'size-mismatch-error':
        return status=='ready' and sum(len(chunks[i]) for i in received)!=expected
    if operation == 'blob-reader-reference-release':
        return blob if detached and not readers else None
    if operation == 'reader-registry-preservation':
        return list(readers)
    if operation == 'download-action-status':
        return 'save' if status=='ready' and gesture else ('retry' if status=='failed' else 'wait')
    if operation == 'missing-part-display':
        return [i for i in range(len(chunks)) if i not in received]
    if operation == 'remaining-download-bytes':
        return max(0,expected-sum(len(chunks[i]) for i in received))
    if operation == 'complete-empty-download':
        return status=='ready' and len(received)==len(chunks)
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received-byte-accounting scenario 1', solve('received-byte-accounting', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), N+2)
check('received-byte-accounting scenario 2', solve('received-byte-accounting', ([],[],0,'ready',False,None,[],False)), 0)
check('received-byte-accounting scenario 3', solve('received-byte-accounting', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('received-byte-accounting scenario 4', solve('received-byte-accounting', (['x'],[0],1,'ready',False,'blob:b',[],True)), 1)
check('received-byte-accounting scenario 5', solve('received-byte-accounting', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 2)
check('received-byte-accounting scenario 6', solve('received-byte-accounting', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 1)
check('file-assembly-part-order scenario 1', solve('file-assembly-part-order', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'a'*N+'bc')
check('file-assembly-part-order scenario 2', solve('file-assembly-part-order', ([],[],0,'ready',False,None,[],False)), '')
check('file-assembly-part-order scenario 3', solve('file-assembly-part-order', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'cd')
check('file-assembly-part-order scenario 4', solve('file-assembly-part-order', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'x')
check('file-assembly-part-order scenario 5', solve('file-assembly-part-order', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'ab')
check('file-assembly-part-order scenario 6', solve('file-assembly-part-order', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'z')
check('save-requires-current-gesture scenario 1', solve('save-requires-current-gesture', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('save-requires-current-gesture scenario 2', solve('save-requires-current-gesture', ([],[],0,'ready',False,None,[],False)), False)
check('save-requires-current-gesture scenario 3', solve('save-requires-current-gesture', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('save-requires-current-gesture scenario 4', solve('save-requires-current-gesture', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('save-requires-current-gesture scenario 5', solve('save-requires-current-gesture', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('save-requires-current-gesture scenario 6', solve('save-requires-current-gesture', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('size-mismatch-error scenario 1', solve('size-mismatch-error', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), False)
check('size-mismatch-error scenario 2', solve('size-mismatch-error', ([],[],0,'ready',False,None,[],False)), False)
check('size-mismatch-error scenario 3', solve('size-mismatch-error', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('size-mismatch-error scenario 4', solve('size-mismatch-error', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('size-mismatch-error scenario 5', solve('size-mismatch-error', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('size-mismatch-error scenario 6', solve('size-mismatch-error', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), False)
check('blob-reader-reference-release scenario 1', solve('blob-reader-reference-release', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), None)
check('blob-reader-reference-release scenario 2', solve('blob-reader-reference-release', ([],[],0,'ready',False,None,[],False)), None)
check('blob-reader-reference-release scenario 3', solve('blob-reader-reference-release', (['ab','cd'],[1],4,'loading',True,None,[],False)), None)
check('blob-reader-reference-release scenario 4', solve('blob-reader-reference-release', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'blob:b')
check('blob-reader-reference-release scenario 5', solve('blob-reader-reference-release', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), None)
check('blob-reader-reference-release scenario 6', solve('blob-reader-reference-release', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), None)
check('reader-registry-preservation scenario 1', solve('reader-registry-preservation', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), ['preview'])
check('reader-registry-preservation scenario 2', solve('reader-registry-preservation', ([],[],0,'ready',False,None,[],False)), [])
check('reader-registry-preservation scenario 3', solve('reader-registry-preservation', (['ab','cd'],[1],4,'loading',True,None,[],False)), [])
check('reader-registry-preservation scenario 4', solve('reader-registry-preservation', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('reader-registry-preservation scenario 5', solve('reader-registry-preservation', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), ['preview','save'])
check('reader-registry-preservation scenario 6', solve('reader-registry-preservation', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('download-action-status scenario 1', solve('download-action-status', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'save')
check('download-action-status scenario 2', solve('download-action-status', ([],[],0,'ready',False,None,[],False)), 'wait')
check('download-action-status scenario 3', solve('download-action-status', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'wait')
check('download-action-status scenario 4', solve('download-action-status', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'wait')
check('download-action-status scenario 5', solve('download-action-status', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'retry')
check('download-action-status scenario 6', solve('download-action-status', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'save')
check('missing-part-display scenario 1', solve('missing-part-display', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), [])
check('missing-part-display scenario 2', solve('missing-part-display', ([],[],0,'ready',False,None,[],False)), [])
check('missing-part-display scenario 3', solve('missing-part-display', (['ab','cd'],[1],4,'loading',True,None,[],False)), [0])
check('missing-part-display scenario 4', solve('missing-part-display', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('missing-part-display scenario 5', solve('missing-part-display', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), [])
check('missing-part-display scenario 6', solve('missing-part-display', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('remaining-download-bytes scenario 1', solve('remaining-download-bytes', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 0)
check('remaining-download-bytes scenario 2', solve('remaining-download-bytes', ([],[],0,'ready',False,None,[],False)), 0)
check('remaining-download-bytes scenario 3', solve('remaining-download-bytes', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('remaining-download-bytes scenario 4', solve('remaining-download-bytes', (['x'],[0],1,'ready',False,'blob:b',[],True)), 0)
check('remaining-download-bytes scenario 5', solve('remaining-download-bytes', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 1)
check('remaining-download-bytes scenario 6', solve('remaining-download-bytes', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 0)
check('complete-empty-download scenario 1', solve('complete-empty-download', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('complete-empty-download scenario 2', solve('complete-empty-download', ([],[],0,'ready',False,None,[],False)), True)
check('complete-empty-download scenario 3', solve('complete-empty-download', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('complete-empty-download scenario 4', solve('complete-empty-download', (['x'],[0],1,'ready',False,'blob:b',[],True)), True)
check('complete-empty-download scenario 5', solve('complete-empty-download', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('complete-empty-download scenario 6', solve('complete-empty-download', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('save reader outlives preview detachment: received-byte-accounting', solve('received-byte-accounting', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 1)
check('save reader outlives preview detachment: file-assembly-part-order', solve('file-assembly-part-order', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'x')
check('save reader outlives preview detachment: save-requires-current-gesture', solve('save-requires-current-gesture', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
check('save reader outlives preview detachment: size-mismatch-error', solve('size-mismatch-error', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), False)
check('save reader outlives preview detachment: blob-reader-reference-release', solve('blob-reader-reference-release', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), None)
check('save reader outlives preview detachment: reader-registry-preservation', solve('reader-registry-preservation', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), ['save'])
check('save reader outlives preview detachment: download-action-status', solve('download-action-status', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'save')
check('save reader outlives preview detachment: missing-part-display', solve('missing-part-display', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), [])
check('save reader outlives preview detachment: remaining-download-bytes', solve('remaining-download-bytes', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 0)
check('save reader outlives preview detachment: complete-empty-download', solve('complete-empty-download', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
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
received-byte-accounting scenario 133Passed
received-byte-accounting scenario 200Passed
received-byte-accounting scenario 342Failed
received-byte-accounting scenario 411Passed
received-byte-accounting scenario 522Passed
received-byte-accounting scenario 611Passed
file-assembly-part-order scenario 1abcabcPassed
file-assembly-part-order scenario 2Passed
file-assembly-part-order scenario 3cdcdPassed
file-assembly-part-order scenario 4xxPassed
file-assembly-part-order scenario 5ababPassed
file-assembly-part-order scenario 6zzPassed
save-requires-current-gesture scenario 1TrueTruePassed
save-requires-current-gesture scenario 2FalseFalsePassed
save-requires-current-gesture scenario 3FalseFalsePassed
save-requires-current-gesture scenario 4FalseFalsePassed
save-requires-current-gesture scenario 5FalseFalsePassed
save-requires-current-gesture scenario 6TrueTruePassed
size-mismatch-error scenario 1FalseFalsePassed
size-mismatch-error scenario 2FalseFalsePassed
size-mismatch-error scenario 3FalseFalsePassed
size-mismatch-error scenario 4FalseFalsePassed
size-mismatch-error scenario 5FalseFalsePassed
size-mismatch-error scenario 6FalseFalsePassed
blob-reader-reference-release scenario 1NoneNonePassed
blob-reader-reference-release scenario 2NoneNonePassed
blob-reader-reference-release scenario 3NoneNonePassed
blob-reader-reference-release scenario 4blob:bblob:bPassed
blob-reader-reference-release scenario 5NoneNonePassed
blob-reader-reference-release scenario 6NoneNonePassed
reader-registry-preservation scenario 1['preview']['preview']Passed
reader-registry-preservation scenario 2[][]Passed
reader-registry-preservation scenario 3[][]Passed
reader-registry-preservation scenario 4[][]Passed
reader-registry-preservation scenario 5['preview', 'save']['preview', 'save']Passed
reader-registry-preservation scenario 6[][]Passed
download-action-status scenario 1savesavePassed
download-action-status scenario 2waitwaitPassed
download-action-status scenario 3waitwaitPassed
download-action-status scenario 4waitwaitPassed
download-action-status scenario 5retryretryPassed
download-action-status scenario 6savesavePassed
missing-part-display scenario 1[][]Passed
missing-part-display scenario 2[][]Passed
missing-part-display scenario 3[0][0]Passed
missing-part-display scenario 4[][]Passed
missing-part-display scenario 5[][]Passed
missing-part-display scenario 6[][]Passed
remaining-download-bytes scenario 100Passed
remaining-download-bytes scenario 200Passed
remaining-download-bytes scenario 322Passed
remaining-download-bytes scenario 400Passed
remaining-download-bytes scenario 511Passed
remaining-download-bytes scenario 600Passed
complete-empty-download scenario 1TrueTruePassed
complete-empty-download scenario 2TrueTruePassed
complete-empty-download scenario 3FalseFalsePassed
complete-empty-download scenario 4TrueTruePassed
complete-empty-download scenario 5FalseFalsePassed
complete-empty-download scenario 6TrueTruePassed
save reader outlives preview detachment: received-byte-accounting11Passed
save reader outlives preview detachment: file-assembly-part-orderxxPassed
save reader outlives preview detachment: save-requires-current-gestureTrueTruePassed
save reader outlives preview detachment: size-mismatch-errorFalseFalsePassed
save reader outlives preview detachment: blob-reader-reference-releaseNoneNonePassed
save reader outlives preview detachment: reader-registry-preservation['save']['save']Passed
save reader outlives preview detachment: download-action-statussavesavePassed
save reader outlives preview detachment: missing-part-display[][]Passed
save reader outlives preview detachment: remaining-download-bytes00Passed
save reader outlives preview detachment: complete-empty-downloadTrueTruePassed

SHA-256 / 5e43c98e5dcd6dd2ff5f89ec2458e26c2f2e3cca8f06ff4f912d07c188e63ad7

3 / The verified repair

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

N = 1
observations = []
def solve(operation, s):
    chunks, received, expected, status, gesture, blob, readers, detached = s
    if operation == 'received-byte-accounting':
        return sum(len(chunks[i]) for i in received)
    if operation == 'file-assembly-part-order':
        return ''.join(chunks[i] for i in sorted(received))
    if operation == 'save-requires-current-gesture':
        return status=='ready' and gesture
    if operation == 'size-mismatch-error':
        return status=='ready' and sum(len(chunks[i]) for i in received)!=expected
    if operation == 'blob-reader-reference-release':
        return blob if detached and not readers else None
    if operation == 'reader-registry-preservation':
        return list(readers)
    if operation == 'download-action-status':
        return 'save' if status=='ready' and gesture else ('retry' if status=='failed' else 'wait')
    if operation == 'missing-part-display':
        return [i for i in range(len(chunks)) if i not in received]
    if operation == 'remaining-download-bytes':
        return max(0,expected-sum(len(chunks[i]) for i in received))
    if operation == 'complete-empty-download':
        return status=='ready' and len(received)==len(chunks)
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received-byte-accounting scenario 1', solve('received-byte-accounting', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), N+2)
check('received-byte-accounting scenario 2', solve('received-byte-accounting', ([],[],0,'ready',False,None,[],False)), 0)
check('received-byte-accounting scenario 3', solve('received-byte-accounting', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('received-byte-accounting scenario 4', solve('received-byte-accounting', (['x'],[0],1,'ready',False,'blob:b',[],True)), 1)
check('received-byte-accounting scenario 5', solve('received-byte-accounting', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 2)
check('received-byte-accounting scenario 6', solve('received-byte-accounting', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 1)
check('file-assembly-part-order scenario 1', solve('file-assembly-part-order', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'a'*N+'bc')
check('file-assembly-part-order scenario 2', solve('file-assembly-part-order', ([],[],0,'ready',False,None,[],False)), '')
check('file-assembly-part-order scenario 3', solve('file-assembly-part-order', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'cd')
check('file-assembly-part-order scenario 4', solve('file-assembly-part-order', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'x')
check('file-assembly-part-order scenario 5', solve('file-assembly-part-order', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'ab')
check('file-assembly-part-order scenario 6', solve('file-assembly-part-order', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'z')
check('save-requires-current-gesture scenario 1', solve('save-requires-current-gesture', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('save-requires-current-gesture scenario 2', solve('save-requires-current-gesture', ([],[],0,'ready',False,None,[],False)), False)
check('save-requires-current-gesture scenario 3', solve('save-requires-current-gesture', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('save-requires-current-gesture scenario 4', solve('save-requires-current-gesture', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('save-requires-current-gesture scenario 5', solve('save-requires-current-gesture', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('save-requires-current-gesture scenario 6', solve('save-requires-current-gesture', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('size-mismatch-error scenario 1', solve('size-mismatch-error', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), False)
check('size-mismatch-error scenario 2', solve('size-mismatch-error', ([],[],0,'ready',False,None,[],False)), False)
check('size-mismatch-error scenario 3', solve('size-mismatch-error', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('size-mismatch-error scenario 4', solve('size-mismatch-error', (['x'],[0],1,'ready',False,'blob:b',[],True)), False)
check('size-mismatch-error scenario 5', solve('size-mismatch-error', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('size-mismatch-error scenario 6', solve('size-mismatch-error', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), False)
check('blob-reader-reference-release scenario 1', solve('blob-reader-reference-release', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), None)
check('blob-reader-reference-release scenario 2', solve('blob-reader-reference-release', ([],[],0,'ready',False,None,[],False)), None)
check('blob-reader-reference-release scenario 3', solve('blob-reader-reference-release', (['ab','cd'],[1],4,'loading',True,None,[],False)), None)
check('blob-reader-reference-release scenario 4', solve('blob-reader-reference-release', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'blob:b')
check('blob-reader-reference-release scenario 5', solve('blob-reader-reference-release', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), None)
check('blob-reader-reference-release scenario 6', solve('blob-reader-reference-release', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), None)
check('reader-registry-preservation scenario 1', solve('reader-registry-preservation', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), ['preview'])
check('reader-registry-preservation scenario 2', solve('reader-registry-preservation', ([],[],0,'ready',False,None,[],False)), [])
check('reader-registry-preservation scenario 3', solve('reader-registry-preservation', (['ab','cd'],[1],4,'loading',True,None,[],False)), [])
check('reader-registry-preservation scenario 4', solve('reader-registry-preservation', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('reader-registry-preservation scenario 5', solve('reader-registry-preservation', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), ['preview','save'])
check('reader-registry-preservation scenario 6', solve('reader-registry-preservation', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('download-action-status scenario 1', solve('download-action-status', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 'save')
check('download-action-status scenario 2', solve('download-action-status', ([],[],0,'ready',False,None,[],False)), 'wait')
check('download-action-status scenario 3', solve('download-action-status', (['ab','cd'],[1],4,'loading',True,None,[],False)), 'wait')
check('download-action-status scenario 4', solve('download-action-status', (['x'],[0],1,'ready',False,'blob:b',[],True)), 'wait')
check('download-action-status scenario 5', solve('download-action-status', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 'retry')
check('download-action-status scenario 6', solve('download-action-status', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 'save')
check('missing-part-display scenario 1', solve('missing-part-display', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), [])
check('missing-part-display scenario 2', solve('missing-part-display', ([],[],0,'ready',False,None,[],False)), [])
check('missing-part-display scenario 3', solve('missing-part-display', (['ab','cd'],[1],4,'loading',True,None,[],False)), [0])
check('missing-part-display scenario 4', solve('missing-part-display', (['x'],[0],1,'ready',False,'blob:b',[],True)), [])
check('missing-part-display scenario 5', solve('missing-part-display', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), [])
check('missing-part-display scenario 6', solve('missing-part-display', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), [])
check('remaining-download-bytes scenario 1', solve('remaining-download-bytes', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), 0)
check('remaining-download-bytes scenario 2', solve('remaining-download-bytes', ([],[],0,'ready',False,None,[],False)), 0)
check('remaining-download-bytes scenario 3', solve('remaining-download-bytes', (['ab','cd'],[1],4,'loading',True,None,[],False)), 2)
check('remaining-download-bytes scenario 4', solve('remaining-download-bytes', (['x'],[0],1,'ready',False,'blob:b',[],True)), 0)
check('remaining-download-bytes scenario 5', solve('remaining-download-bytes', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), 1)
check('remaining-download-bytes scenario 6', solve('remaining-download-bytes', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), 0)
check('complete-empty-download scenario 1', solve('complete-empty-download', (['a'*N,'bc'],[0,1],N+2,'ready',True,'blob:a',['preview'],False)), True)
check('complete-empty-download scenario 2', solve('complete-empty-download', ([],[],0,'ready',False,None,[],False)), True)
check('complete-empty-download scenario 3', solve('complete-empty-download', (['ab','cd'],[1],4,'loading',True,None,[],False)), False)
check('complete-empty-download scenario 4', solve('complete-empty-download', (['x'],[0],1,'ready',False,'blob:b',[],True)), True)
check('complete-empty-download scenario 5', solve('complete-empty-download', (['ab'],[0],3,'failed',True,'blob:c',['preview','save'],False)), False)
check('complete-empty-download scenario 6', solve('complete-empty-download', (['','z'],[0,1],1,'ready',True,'blob:d',[],False)), True)
check('save reader outlives preview detachment: received-byte-accounting', solve('received-byte-accounting', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 1)
check('save reader outlives preview detachment: file-assembly-part-order', solve('file-assembly-part-order', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'x')
check('save reader outlives preview detachment: save-requires-current-gesture', solve('save-requires-current-gesture', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
check('save reader outlives preview detachment: size-mismatch-error', solve('size-mismatch-error', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), False)
check('save reader outlives preview detachment: blob-reader-reference-release', solve('blob-reader-reference-release', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), None)
check('save reader outlives preview detachment: reader-registry-preservation', solve('reader-registry-preservation', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), ['save'])
check('save reader outlives preview detachment: download-action-status', solve('download-action-status', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 'save')
check('save reader outlives preview detachment: missing-part-display', solve('missing-part-display', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), [])
check('save reader outlives preview detachment: remaining-download-bytes', solve('remaining-download-bytes', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), 0)
check('save reader outlives preview detachment: complete-empty-download', solve('complete-empty-download', (['x'],[0],1,'ready',True,'blob:z',['save'],True)), True)
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
received-byte-accounting scenario 133Passed
received-byte-accounting scenario 200Passed
received-byte-accounting scenario 322Passed
received-byte-accounting scenario 411Passed
received-byte-accounting scenario 522Passed
received-byte-accounting scenario 611Passed
file-assembly-part-order scenario 1abcabcPassed
file-assembly-part-order scenario 2Passed
file-assembly-part-order scenario 3cdcdPassed
file-assembly-part-order scenario 4xxPassed
file-assembly-part-order scenario 5ababPassed
file-assembly-part-order scenario 6zzPassed
save-requires-current-gesture scenario 1TrueTruePassed
save-requires-current-gesture scenario 2FalseFalsePassed
save-requires-current-gesture scenario 3FalseFalsePassed
save-requires-current-gesture scenario 4FalseFalsePassed
save-requires-current-gesture scenario 5FalseFalsePassed
save-requires-current-gesture scenario 6TrueTruePassed
size-mismatch-error scenario 1FalseFalsePassed
size-mismatch-error scenario 2FalseFalsePassed
size-mismatch-error scenario 3FalseFalsePassed
size-mismatch-error scenario 4FalseFalsePassed
size-mismatch-error scenario 5FalseFalsePassed
size-mismatch-error scenario 6FalseFalsePassed
blob-reader-reference-release scenario 1NoneNonePassed
blob-reader-reference-release scenario 2NoneNonePassed
blob-reader-reference-release scenario 3NoneNonePassed
blob-reader-reference-release scenario 4blob:bblob:bPassed
blob-reader-reference-release scenario 5NoneNonePassed
blob-reader-reference-release scenario 6NoneNonePassed
reader-registry-preservation scenario 1['preview']['preview']Passed
reader-registry-preservation scenario 2[][]Passed
reader-registry-preservation scenario 3[][]Passed
reader-registry-preservation scenario 4[][]Passed
reader-registry-preservation scenario 5['preview', 'save']['preview', 'save']Passed
reader-registry-preservation scenario 6[][]Passed
download-action-status scenario 1savesavePassed
download-action-status scenario 2waitwaitPassed
download-action-status scenario 3waitwaitPassed
download-action-status scenario 4waitwaitPassed
download-action-status scenario 5retryretryPassed
download-action-status scenario 6savesavePassed
missing-part-display scenario 1[][]Passed
missing-part-display scenario 2[][]Passed
missing-part-display scenario 3[0][0]Passed
missing-part-display scenario 4[][]Passed
missing-part-display scenario 5[][]Passed
missing-part-display scenario 6[][]Passed
remaining-download-bytes scenario 100Passed
remaining-download-bytes scenario 200Passed
remaining-download-bytes scenario 322Passed
remaining-download-bytes scenario 400Passed
remaining-download-bytes scenario 511Passed
remaining-download-bytes scenario 600Passed
complete-empty-download scenario 1TrueTruePassed
complete-empty-download scenario 2TrueTruePassed
complete-empty-download scenario 3FalseFalsePassed
complete-empty-download scenario 4TrueTruePassed
complete-empty-download scenario 5FalseFalsePassed
complete-empty-download scenario 6TrueTruePassed
save reader outlives preview detachment: received-byte-accounting11Passed
save reader outlives preview detachment: file-assembly-part-orderxxPassed
save reader outlives preview detachment: save-requires-current-gestureTrueTruePassed
save reader outlives preview detachment: size-mismatch-errorFalseFalsePassed
save reader outlives preview detachment: blob-reader-reference-releaseNoneNonePassed
save reader outlives preview detachment: reader-registry-preservation['save']['save']Passed
save reader outlives preview detachment: download-action-statussavesavePassed
save reader outlives preview detachment: missing-part-display[][]Passed
save reader outlives preview detachment: remaining-download-bytes00Passed
save reader outlives preview detachment: complete-empty-downloadTrueTruePassed

SHA-256 / 725e0e99bd6be4d31afee03f40d9a750e3c21560cc86455f8b0beaec42c87cf5

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

Case digest / 314b1bc99901b380f513454ab56d76243cda260d30395ea6452bb11c42008c01