FAILURE MAP
← Case archive

FA-24256 / Client state / Open access

Local upload task presentation: Cancel overrides upload status · case 01

Cancel overrides upload status.

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

ROOT CAUSE

The cancel-overrides-upload-status client decision evaluates `status` instead of `'cancelled' if cancelled else status`.

VERIFIED REPAIR

Apply the modeled cancel-overrides-upload-status rule: `'cancelled' if cancelled else status`.

Unsuccessful approach: The partial repair `'cancelled' if cancelled and not sent else status` still violates the explicit fixture contract.

Case contract

This local upload view tracks parts and blob preview ownership, not a wire protocol. Accepted parts alone advance durable progress; cancellation aborts unaccepted sends; zero-byte parts still require acknowledgment; detached previews are released. Operation cancel-overrides-upload-status 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):
    sizes, accepted, sent, cancelled, status, preview, attached = s
    if operation == 'accepted-progress-not-sent':
        return sum(sizes[i] for i in accepted)
    if operation == 'remaining-local-parts':
        return [i for i in range(len(sizes)) if i not in accepted]
    if operation == 'cancel-overrides-upload-status':
        return status
    if operation == 'preview-revoke-on-detach':
        return preview if not attached and preview is not None else None
    if operation == 'zero-size-part-completion':
        return len(accepted)==len(sizes)
    if operation == 'inflight-abort-handles':
        return [i for i in sent if i not in accepted] if cancelled else []
    if operation == 'retry-eligible-parts':
        return [i for i in range(len(sizes)) if i not in accepted] if status=='failed' and not cancelled else []
    if operation == 'sent-vs-accepted-indicator':
        return len(sent)-len(accepted)
    if operation == 'terminal-task-retention':
        return attached or status not in ('done','failed') and not cancelled
    if operation == 'preview-while-incomplete':
        return preview if attached else None
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('accepted-progress-not-sent scenario 1', solve('accepted-progress-not-sent', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), N)
check('accepted-progress-not-sent scenario 2', solve('accepted-progress-not-sent', ([],[],[],False,'done',None,False)), 0)
check('accepted-progress-not-sent scenario 3', solve('accepted-progress-not-sent', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 2)
check('accepted-progress-not-sent scenario 4', solve('accepted-progress-not-sent', ([2,3],[],[0],True,'uploading','blob:c',False)), 0)
check('accepted-progress-not-sent scenario 5', solve('accepted-progress-not-sent', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 3)
check('accepted-progress-not-sent scenario 6', solve('accepted-progress-not-sent', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 5)
check('remaining-local-parts scenario 1', solve('remaining-local-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [1,2])
check('remaining-local-parts scenario 2', solve('remaining-local-parts', ([],[],[],False,'done',None,False)), [])
check('remaining-local-parts scenario 3', solve('remaining-local-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('remaining-local-parts scenario 4', solve('remaining-local-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [0,1])
check('remaining-local-parts scenario 5', solve('remaining-local-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('remaining-local-parts scenario 6', solve('remaining-local-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('cancel-overrides-upload-status scenario 1', solve('cancel-overrides-upload-status', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'uploading')
check('cancel-overrides-upload-status scenario 2', solve('cancel-overrides-upload-status', ([],[],[],False,'done',None,False)), 'done')
check('cancel-overrides-upload-status scenario 3', solve('cancel-overrides-upload-status', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'done')
check('cancel-overrides-upload-status scenario 4', solve('cancel-overrides-upload-status', ([2,3],[],[0],True,'uploading','blob:c',False)), 'cancelled')
check('cancel-overrides-upload-status scenario 5', solve('cancel-overrides-upload-status', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'failed')
check('cancel-overrides-upload-status scenario 6', solve('cancel-overrides-upload-status', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'done')
check('preview-revoke-on-detach scenario 1', solve('preview-revoke-on-detach', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), None)
check('preview-revoke-on-detach scenario 2', solve('preview-revoke-on-detach', ([],[],[],False,'done',None,False)), None)
check('preview-revoke-on-detach scenario 3', solve('preview-revoke-on-detach', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), None)
check('preview-revoke-on-detach scenario 4', solve('preview-revoke-on-detach', ([2,3],[],[0],True,'uploading','blob:c',False)), 'blob:c')
check('preview-revoke-on-detach scenario 5', solve('preview-revoke-on-detach', ([2,3],[1],[0,1],False,'failed','blob:d',True)), None)
check('preview-revoke-on-detach scenario 6', solve('preview-revoke-on-detach', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'blob:e')
check('zero-size-part-completion scenario 1', solve('zero-size-part-completion', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), False)
check('zero-size-part-completion scenario 2', solve('zero-size-part-completion', ([],[],[],False,'done',None,False)), True)
check('zero-size-part-completion scenario 3', solve('zero-size-part-completion', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('zero-size-part-completion scenario 4', solve('zero-size-part-completion', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('zero-size-part-completion scenario 5', solve('zero-size-part-completion', ([2,3],[1],[0,1],False,'failed','blob:d',True)), False)
check('zero-size-part-completion scenario 6', solve('zero-size-part-completion', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), True)
check('inflight-abort-handles scenario 1', solve('inflight-abort-handles', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('inflight-abort-handles scenario 2', solve('inflight-abort-handles', ([],[],[],False,'done',None,False)), [])
check('inflight-abort-handles scenario 3', solve('inflight-abort-handles', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('inflight-abort-handles scenario 4', solve('inflight-abort-handles', ([2,3],[],[0],True,'uploading','blob:c',False)), [0])
check('inflight-abort-handles scenario 5', solve('inflight-abort-handles', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [])
check('inflight-abort-handles scenario 6', solve('inflight-abort-handles', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('retry-eligible-parts scenario 1', solve('retry-eligible-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('retry-eligible-parts scenario 2', solve('retry-eligible-parts', ([],[],[],False,'done',None,False)), [])
check('retry-eligible-parts scenario 3', solve('retry-eligible-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('retry-eligible-parts scenario 4', solve('retry-eligible-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [])
check('retry-eligible-parts scenario 5', solve('retry-eligible-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('retry-eligible-parts scenario 6', solve('retry-eligible-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('sent-vs-accepted-indicator scenario 1', solve('sent-vs-accepted-indicator', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 1)
check('sent-vs-accepted-indicator scenario 2', solve('sent-vs-accepted-indicator', ([],[],[],False,'done',None,False)), 0)
check('sent-vs-accepted-indicator scenario 3', solve('sent-vs-accepted-indicator', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 0)
check('sent-vs-accepted-indicator scenario 4', solve('sent-vs-accepted-indicator', ([2,3],[],[0],True,'uploading','blob:c',False)), 1)
check('sent-vs-accepted-indicator scenario 5', solve('sent-vs-accepted-indicator', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 1)
check('sent-vs-accepted-indicator scenario 6', solve('sent-vs-accepted-indicator', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 0)
check('terminal-task-retention scenario 1', solve('terminal-task-retention', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), True)
check('terminal-task-retention scenario 2', solve('terminal-task-retention', ([],[],[],False,'done',None,False)), False)
check('terminal-task-retention scenario 3', solve('terminal-task-retention', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('terminal-task-retention scenario 4', solve('terminal-task-retention', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('terminal-task-retention scenario 5', solve('terminal-task-retention', ([2,3],[1],[0,1],False,'failed','blob:d',True)), True)
check('terminal-task-retention scenario 6', solve('terminal-task-retention', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), False)
check('preview-while-incomplete scenario 1', solve('preview-while-incomplete', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'blob:a')
check('preview-while-incomplete scenario 2', solve('preview-while-incomplete', ([],[],[],False,'done',None,False)), None)
check('preview-while-incomplete scenario 3', solve('preview-while-incomplete', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'blob:b')
check('preview-while-incomplete scenario 4', solve('preview-while-incomplete', ([2,3],[],[0],True,'uploading','blob:c',False)), None)
check('preview-while-incomplete scenario 5', solve('preview-while-incomplete', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'blob:d')
check('preview-while-incomplete scenario 6', solve('preview-while-incomplete', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), None)
check('cancel after one accepted and two inflight parts: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: remaining-local-parts', solve('remaining-local-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'cancelled')
check('cancel after one accepted and two inflight parts: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'blob:z')
check('cancel after one accepted and two inflight parts: zero-size-part-completion', solve('zero-size-part-completion', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: inflight-abort-handles', solve('inflight-abort-handles', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: retry-eligible-parts', solve('retry-eligible-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [])
check('cancel after one accepted and two inflight parts: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: terminal-task-retention', solve('terminal-task-retention', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: preview-while-incomplete', solve('preview-while-incomplete', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), None)
check('background upload survives detached preview: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: remaining-local-parts', solve('remaining-local-parts', ([N],[],[],False,'uploading',None,False)), [0])
check('background upload survives detached preview: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([N],[],[],False,'uploading',None,False)), 'uploading')
check('background upload survives detached preview: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([N],[],[],False,'uploading',None,False)), None)
check('background upload survives detached preview: zero-size-part-completion', solve('zero-size-part-completion', ([N],[],[],False,'uploading',None,False)), False)
check('background upload survives detached preview: inflight-abort-handles', solve('inflight-abort-handles', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: retry-eligible-parts', solve('retry-eligible-parts', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: terminal-task-retention', solve('terminal-task-retention', ([N],[],[],False,'uploading',None,False)), True)
check('background upload survives detached preview: preview-while-incomplete', solve('preview-while-incomplete', ([N],[],[],False,'uploading',None,False)), None)
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
accepted-progress-not-sent scenario 111Passed
accepted-progress-not-sent scenario 200Passed
accepted-progress-not-sent scenario 322Passed
accepted-progress-not-sent scenario 400Passed
accepted-progress-not-sent scenario 533Passed
accepted-progress-not-sent scenario 655Passed
remaining-local-parts scenario 1[1, 2][1, 2]Passed
remaining-local-parts scenario 2[][]Passed
remaining-local-parts scenario 3[][]Passed
remaining-local-parts scenario 4[0, 1][0, 1]Passed
remaining-local-parts scenario 5[0][0]Passed
remaining-local-parts scenario 6[][]Passed
cancel-overrides-upload-status scenario 1uploadinguploadingPassed
cancel-overrides-upload-status scenario 2donedonePassed
cancel-overrides-upload-status scenario 3donedonePassed
cancel-overrides-upload-status scenario 4uploadingcancelledFailed
cancel-overrides-upload-status scenario 5failedfailedPassed
cancel-overrides-upload-status scenario 6donedonePassed
preview-revoke-on-detach scenario 1NoneNonePassed
preview-revoke-on-detach scenario 2NoneNonePassed
preview-revoke-on-detach scenario 3NoneNonePassed
preview-revoke-on-detach scenario 4blob:cblob:cPassed
preview-revoke-on-detach scenario 5NoneNonePassed
preview-revoke-on-detach scenario 6blob:eblob:ePassed
zero-size-part-completion scenario 1FalseFalsePassed
zero-size-part-completion scenario 2TrueTruePassed
zero-size-part-completion scenario 3TrueTruePassed
zero-size-part-completion scenario 4FalseFalsePassed
zero-size-part-completion scenario 5FalseFalsePassed
zero-size-part-completion scenario 6TrueTruePassed
inflight-abort-handles scenario 1[][]Passed
inflight-abort-handles scenario 2[][]Passed
inflight-abort-handles scenario 3[][]Passed
inflight-abort-handles scenario 4[0][0]Passed
inflight-abort-handles scenario 5[][]Passed
inflight-abort-handles scenario 6[][]Passed
retry-eligible-parts scenario 1[][]Passed
retry-eligible-parts scenario 2[][]Passed
retry-eligible-parts scenario 3[][]Passed
retry-eligible-parts scenario 4[][]Passed
retry-eligible-parts scenario 5[0][0]Passed
retry-eligible-parts scenario 6[][]Passed
sent-vs-accepted-indicator scenario 111Passed
sent-vs-accepted-indicator scenario 200Passed
sent-vs-accepted-indicator scenario 300Passed
sent-vs-accepted-indicator scenario 411Passed
sent-vs-accepted-indicator scenario 511Passed
sent-vs-accepted-indicator scenario 600Passed
terminal-task-retention scenario 1TrueTruePassed
terminal-task-retention scenario 2FalseFalsePassed
terminal-task-retention scenario 3TrueTruePassed
terminal-task-retention scenario 4FalseFalsePassed
terminal-task-retention scenario 5TrueTruePassed
terminal-task-retention scenario 6FalseFalsePassed
preview-while-incomplete scenario 1blob:ablob:aPassed
preview-while-incomplete scenario 2NoneNonePassed
preview-while-incomplete scenario 3blob:bblob:bPassed
preview-while-incomplete scenario 4NoneNonePassed
preview-while-incomplete scenario 5blob:dblob:dPassed
preview-while-incomplete scenario 6NoneNonePassed
cancel after one accepted and two inflight parts: accepted-progress-not-sent22Passed
cancel after one accepted and two inflight parts: remaining-local-parts[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: cancel-overrides-upload-statusuploadingcancelledFailed
cancel after one accepted and two inflight parts: preview-revoke-on-detachblob:zblob:zPassed
cancel after one accepted and two inflight parts: zero-size-part-completionFalseFalsePassed
cancel after one accepted and two inflight parts: inflight-abort-handles[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: retry-eligible-parts[][]Passed
cancel after one accepted and two inflight parts: sent-vs-accepted-indicator22Passed
cancel after one accepted and two inflight parts: terminal-task-retentionFalseFalsePassed
cancel after one accepted and two inflight parts: preview-while-incompleteNoneNonePassed
background upload survives detached preview: accepted-progress-not-sent00Passed
background upload survives detached preview: remaining-local-parts[0][0]Passed
background upload survives detached preview: cancel-overrides-upload-statusuploadinguploadingPassed
background upload survives detached preview: preview-revoke-on-detachNoneNonePassed
background upload survives detached preview: zero-size-part-completionFalseFalsePassed
background upload survives detached preview: inflight-abort-handles[][]Passed
background upload survives detached preview: retry-eligible-parts[][]Passed
background upload survives detached preview: sent-vs-accepted-indicator00Passed
background upload survives detached preview: terminal-task-retentionTrueTruePassed
background upload survives detached preview: preview-while-incompleteNoneNonePassed

SHA-256 / 8c6a9a6789712679d7489c48bb577d5fcee760ca53f7ee6d4a6e33c2cf7f285c

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(operation, s):
    sizes, accepted, sent, cancelled, status, preview, attached = s
    if operation == 'accepted-progress-not-sent':
        return sum(sizes[i] for i in accepted)
    if operation == 'remaining-local-parts':
        return [i for i in range(len(sizes)) if i not in accepted]
    if operation == 'cancel-overrides-upload-status':
        return 'cancelled' if cancelled and not sent else status
    if operation == 'preview-revoke-on-detach':
        return preview if not attached and preview is not None else None
    if operation == 'zero-size-part-completion':
        return len(accepted)==len(sizes)
    if operation == 'inflight-abort-handles':
        return [i for i in sent if i not in accepted] if cancelled else []
    if operation == 'retry-eligible-parts':
        return [i for i in range(len(sizes)) if i not in accepted] if status=='failed' and not cancelled else []
    if operation == 'sent-vs-accepted-indicator':
        return len(sent)-len(accepted)
    if operation == 'terminal-task-retention':
        return attached or status not in ('done','failed') and not cancelled
    if operation == 'preview-while-incomplete':
        return preview if attached else None
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('accepted-progress-not-sent scenario 1', solve('accepted-progress-not-sent', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), N)
check('accepted-progress-not-sent scenario 2', solve('accepted-progress-not-sent', ([],[],[],False,'done',None,False)), 0)
check('accepted-progress-not-sent scenario 3', solve('accepted-progress-not-sent', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 2)
check('accepted-progress-not-sent scenario 4', solve('accepted-progress-not-sent', ([2,3],[],[0],True,'uploading','blob:c',False)), 0)
check('accepted-progress-not-sent scenario 5', solve('accepted-progress-not-sent', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 3)
check('accepted-progress-not-sent scenario 6', solve('accepted-progress-not-sent', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 5)
check('remaining-local-parts scenario 1', solve('remaining-local-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [1,2])
check('remaining-local-parts scenario 2', solve('remaining-local-parts', ([],[],[],False,'done',None,False)), [])
check('remaining-local-parts scenario 3', solve('remaining-local-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('remaining-local-parts scenario 4', solve('remaining-local-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [0,1])
check('remaining-local-parts scenario 5', solve('remaining-local-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('remaining-local-parts scenario 6', solve('remaining-local-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('cancel-overrides-upload-status scenario 1', solve('cancel-overrides-upload-status', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'uploading')
check('cancel-overrides-upload-status scenario 2', solve('cancel-overrides-upload-status', ([],[],[],False,'done',None,False)), 'done')
check('cancel-overrides-upload-status scenario 3', solve('cancel-overrides-upload-status', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'done')
check('cancel-overrides-upload-status scenario 4', solve('cancel-overrides-upload-status', ([2,3],[],[0],True,'uploading','blob:c',False)), 'cancelled')
check('cancel-overrides-upload-status scenario 5', solve('cancel-overrides-upload-status', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'failed')
check('cancel-overrides-upload-status scenario 6', solve('cancel-overrides-upload-status', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'done')
check('preview-revoke-on-detach scenario 1', solve('preview-revoke-on-detach', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), None)
check('preview-revoke-on-detach scenario 2', solve('preview-revoke-on-detach', ([],[],[],False,'done',None,False)), None)
check('preview-revoke-on-detach scenario 3', solve('preview-revoke-on-detach', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), None)
check('preview-revoke-on-detach scenario 4', solve('preview-revoke-on-detach', ([2,3],[],[0],True,'uploading','blob:c',False)), 'blob:c')
check('preview-revoke-on-detach scenario 5', solve('preview-revoke-on-detach', ([2,3],[1],[0,1],False,'failed','blob:d',True)), None)
check('preview-revoke-on-detach scenario 6', solve('preview-revoke-on-detach', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'blob:e')
check('zero-size-part-completion scenario 1', solve('zero-size-part-completion', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), False)
check('zero-size-part-completion scenario 2', solve('zero-size-part-completion', ([],[],[],False,'done',None,False)), True)
check('zero-size-part-completion scenario 3', solve('zero-size-part-completion', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('zero-size-part-completion scenario 4', solve('zero-size-part-completion', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('zero-size-part-completion scenario 5', solve('zero-size-part-completion', ([2,3],[1],[0,1],False,'failed','blob:d',True)), False)
check('zero-size-part-completion scenario 6', solve('zero-size-part-completion', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), True)
check('inflight-abort-handles scenario 1', solve('inflight-abort-handles', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('inflight-abort-handles scenario 2', solve('inflight-abort-handles', ([],[],[],False,'done',None,False)), [])
check('inflight-abort-handles scenario 3', solve('inflight-abort-handles', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('inflight-abort-handles scenario 4', solve('inflight-abort-handles', ([2,3],[],[0],True,'uploading','blob:c',False)), [0])
check('inflight-abort-handles scenario 5', solve('inflight-abort-handles', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [])
check('inflight-abort-handles scenario 6', solve('inflight-abort-handles', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('retry-eligible-parts scenario 1', solve('retry-eligible-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('retry-eligible-parts scenario 2', solve('retry-eligible-parts', ([],[],[],False,'done',None,False)), [])
check('retry-eligible-parts scenario 3', solve('retry-eligible-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('retry-eligible-parts scenario 4', solve('retry-eligible-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [])
check('retry-eligible-parts scenario 5', solve('retry-eligible-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('retry-eligible-parts scenario 6', solve('retry-eligible-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('sent-vs-accepted-indicator scenario 1', solve('sent-vs-accepted-indicator', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 1)
check('sent-vs-accepted-indicator scenario 2', solve('sent-vs-accepted-indicator', ([],[],[],False,'done',None,False)), 0)
check('sent-vs-accepted-indicator scenario 3', solve('sent-vs-accepted-indicator', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 0)
check('sent-vs-accepted-indicator scenario 4', solve('sent-vs-accepted-indicator', ([2,3],[],[0],True,'uploading','blob:c',False)), 1)
check('sent-vs-accepted-indicator scenario 5', solve('sent-vs-accepted-indicator', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 1)
check('sent-vs-accepted-indicator scenario 6', solve('sent-vs-accepted-indicator', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 0)
check('terminal-task-retention scenario 1', solve('terminal-task-retention', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), True)
check('terminal-task-retention scenario 2', solve('terminal-task-retention', ([],[],[],False,'done',None,False)), False)
check('terminal-task-retention scenario 3', solve('terminal-task-retention', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('terminal-task-retention scenario 4', solve('terminal-task-retention', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('terminal-task-retention scenario 5', solve('terminal-task-retention', ([2,3],[1],[0,1],False,'failed','blob:d',True)), True)
check('terminal-task-retention scenario 6', solve('terminal-task-retention', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), False)
check('preview-while-incomplete scenario 1', solve('preview-while-incomplete', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'blob:a')
check('preview-while-incomplete scenario 2', solve('preview-while-incomplete', ([],[],[],False,'done',None,False)), None)
check('preview-while-incomplete scenario 3', solve('preview-while-incomplete', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'blob:b')
check('preview-while-incomplete scenario 4', solve('preview-while-incomplete', ([2,3],[],[0],True,'uploading','blob:c',False)), None)
check('preview-while-incomplete scenario 5', solve('preview-while-incomplete', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'blob:d')
check('preview-while-incomplete scenario 6', solve('preview-while-incomplete', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), None)
check('cancel after one accepted and two inflight parts: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: remaining-local-parts', solve('remaining-local-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'cancelled')
check('cancel after one accepted and two inflight parts: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'blob:z')
check('cancel after one accepted and two inflight parts: zero-size-part-completion', solve('zero-size-part-completion', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: inflight-abort-handles', solve('inflight-abort-handles', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: retry-eligible-parts', solve('retry-eligible-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [])
check('cancel after one accepted and two inflight parts: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: terminal-task-retention', solve('terminal-task-retention', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: preview-while-incomplete', solve('preview-while-incomplete', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), None)
check('background upload survives detached preview: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: remaining-local-parts', solve('remaining-local-parts', ([N],[],[],False,'uploading',None,False)), [0])
check('background upload survives detached preview: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([N],[],[],False,'uploading',None,False)), 'uploading')
check('background upload survives detached preview: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([N],[],[],False,'uploading',None,False)), None)
check('background upload survives detached preview: zero-size-part-completion', solve('zero-size-part-completion', ([N],[],[],False,'uploading',None,False)), False)
check('background upload survives detached preview: inflight-abort-handles', solve('inflight-abort-handles', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: retry-eligible-parts', solve('retry-eligible-parts', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: terminal-task-retention', solve('terminal-task-retention', ([N],[],[],False,'uploading',None,False)), True)
check('background upload survives detached preview: preview-while-incomplete', solve('preview-while-incomplete', ([N],[],[],False,'uploading',None,False)), None)
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
accepted-progress-not-sent scenario 111Passed
accepted-progress-not-sent scenario 200Passed
accepted-progress-not-sent scenario 322Passed
accepted-progress-not-sent scenario 400Passed
accepted-progress-not-sent scenario 533Passed
accepted-progress-not-sent scenario 655Passed
remaining-local-parts scenario 1[1, 2][1, 2]Passed
remaining-local-parts scenario 2[][]Passed
remaining-local-parts scenario 3[][]Passed
remaining-local-parts scenario 4[0, 1][0, 1]Passed
remaining-local-parts scenario 5[0][0]Passed
remaining-local-parts scenario 6[][]Passed
cancel-overrides-upload-status scenario 1uploadinguploadingPassed
cancel-overrides-upload-status scenario 2donedonePassed
cancel-overrides-upload-status scenario 3donedonePassed
cancel-overrides-upload-status scenario 4uploadingcancelledFailed
cancel-overrides-upload-status scenario 5failedfailedPassed
cancel-overrides-upload-status scenario 6donedonePassed
preview-revoke-on-detach scenario 1NoneNonePassed
preview-revoke-on-detach scenario 2NoneNonePassed
preview-revoke-on-detach scenario 3NoneNonePassed
preview-revoke-on-detach scenario 4blob:cblob:cPassed
preview-revoke-on-detach scenario 5NoneNonePassed
preview-revoke-on-detach scenario 6blob:eblob:ePassed
zero-size-part-completion scenario 1FalseFalsePassed
zero-size-part-completion scenario 2TrueTruePassed
zero-size-part-completion scenario 3TrueTruePassed
zero-size-part-completion scenario 4FalseFalsePassed
zero-size-part-completion scenario 5FalseFalsePassed
zero-size-part-completion scenario 6TrueTruePassed
inflight-abort-handles scenario 1[][]Passed
inflight-abort-handles scenario 2[][]Passed
inflight-abort-handles scenario 3[][]Passed
inflight-abort-handles scenario 4[0][0]Passed
inflight-abort-handles scenario 5[][]Passed
inflight-abort-handles scenario 6[][]Passed
retry-eligible-parts scenario 1[][]Passed
retry-eligible-parts scenario 2[][]Passed
retry-eligible-parts scenario 3[][]Passed
retry-eligible-parts scenario 4[][]Passed
retry-eligible-parts scenario 5[0][0]Passed
retry-eligible-parts scenario 6[][]Passed
sent-vs-accepted-indicator scenario 111Passed
sent-vs-accepted-indicator scenario 200Passed
sent-vs-accepted-indicator scenario 300Passed
sent-vs-accepted-indicator scenario 411Passed
sent-vs-accepted-indicator scenario 511Passed
sent-vs-accepted-indicator scenario 600Passed
terminal-task-retention scenario 1TrueTruePassed
terminal-task-retention scenario 2FalseFalsePassed
terminal-task-retention scenario 3TrueTruePassed
terminal-task-retention scenario 4FalseFalsePassed
terminal-task-retention scenario 5TrueTruePassed
terminal-task-retention scenario 6FalseFalsePassed
preview-while-incomplete scenario 1blob:ablob:aPassed
preview-while-incomplete scenario 2NoneNonePassed
preview-while-incomplete scenario 3blob:bblob:bPassed
preview-while-incomplete scenario 4NoneNonePassed
preview-while-incomplete scenario 5blob:dblob:dPassed
preview-while-incomplete scenario 6NoneNonePassed
cancel after one accepted and two inflight parts: accepted-progress-not-sent22Passed
cancel after one accepted and two inflight parts: remaining-local-parts[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: cancel-overrides-upload-statusuploadingcancelledFailed
cancel after one accepted and two inflight parts: preview-revoke-on-detachblob:zblob:zPassed
cancel after one accepted and two inflight parts: zero-size-part-completionFalseFalsePassed
cancel after one accepted and two inflight parts: inflight-abort-handles[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: retry-eligible-parts[][]Passed
cancel after one accepted and two inflight parts: sent-vs-accepted-indicator22Passed
cancel after one accepted and two inflight parts: terminal-task-retentionFalseFalsePassed
cancel after one accepted and two inflight parts: preview-while-incompleteNoneNonePassed
background upload survives detached preview: accepted-progress-not-sent00Passed
background upload survives detached preview: remaining-local-parts[0][0]Passed
background upload survives detached preview: cancel-overrides-upload-statusuploadinguploadingPassed
background upload survives detached preview: preview-revoke-on-detachNoneNonePassed
background upload survives detached preview: zero-size-part-completionFalseFalsePassed
background upload survives detached preview: inflight-abort-handles[][]Passed
background upload survives detached preview: retry-eligible-parts[][]Passed
background upload survives detached preview: sent-vs-accepted-indicator00Passed
background upload survives detached preview: terminal-task-retentionTrueTruePassed
background upload survives detached preview: preview-while-incompleteNoneNonePassed

SHA-256 / 1dde49ed07ccb7e7ccb49fc8552da075a069bf32a309b851a4c7efb547d14fce

3 / The verified repair

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

N = 1
observations = []
def solve(operation, s):
    sizes, accepted, sent, cancelled, status, preview, attached = s
    if operation == 'accepted-progress-not-sent':
        return sum(sizes[i] for i in accepted)
    if operation == 'remaining-local-parts':
        return [i for i in range(len(sizes)) if i not in accepted]
    if operation == 'cancel-overrides-upload-status':
        return 'cancelled' if cancelled else status
    if operation == 'preview-revoke-on-detach':
        return preview if not attached and preview is not None else None
    if operation == 'zero-size-part-completion':
        return len(accepted)==len(sizes)
    if operation == 'inflight-abort-handles':
        return [i for i in sent if i not in accepted] if cancelled else []
    if operation == 'retry-eligible-parts':
        return [i for i in range(len(sizes)) if i not in accepted] if status=='failed' and not cancelled else []
    if operation == 'sent-vs-accepted-indicator':
        return len(sent)-len(accepted)
    if operation == 'terminal-task-retention':
        return attached or status not in ('done','failed') and not cancelled
    if operation == 'preview-while-incomplete':
        return preview if attached else None
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('accepted-progress-not-sent scenario 1', solve('accepted-progress-not-sent', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), N)
check('accepted-progress-not-sent scenario 2', solve('accepted-progress-not-sent', ([],[],[],False,'done',None,False)), 0)
check('accepted-progress-not-sent scenario 3', solve('accepted-progress-not-sent', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 2)
check('accepted-progress-not-sent scenario 4', solve('accepted-progress-not-sent', ([2,3],[],[0],True,'uploading','blob:c',False)), 0)
check('accepted-progress-not-sent scenario 5', solve('accepted-progress-not-sent', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 3)
check('accepted-progress-not-sent scenario 6', solve('accepted-progress-not-sent', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 5)
check('remaining-local-parts scenario 1', solve('remaining-local-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [1,2])
check('remaining-local-parts scenario 2', solve('remaining-local-parts', ([],[],[],False,'done',None,False)), [])
check('remaining-local-parts scenario 3', solve('remaining-local-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('remaining-local-parts scenario 4', solve('remaining-local-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [0,1])
check('remaining-local-parts scenario 5', solve('remaining-local-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('remaining-local-parts scenario 6', solve('remaining-local-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('cancel-overrides-upload-status scenario 1', solve('cancel-overrides-upload-status', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'uploading')
check('cancel-overrides-upload-status scenario 2', solve('cancel-overrides-upload-status', ([],[],[],False,'done',None,False)), 'done')
check('cancel-overrides-upload-status scenario 3', solve('cancel-overrides-upload-status', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'done')
check('cancel-overrides-upload-status scenario 4', solve('cancel-overrides-upload-status', ([2,3],[],[0],True,'uploading','blob:c',False)), 'cancelled')
check('cancel-overrides-upload-status scenario 5', solve('cancel-overrides-upload-status', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'failed')
check('cancel-overrides-upload-status scenario 6', solve('cancel-overrides-upload-status', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'done')
check('preview-revoke-on-detach scenario 1', solve('preview-revoke-on-detach', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), None)
check('preview-revoke-on-detach scenario 2', solve('preview-revoke-on-detach', ([],[],[],False,'done',None,False)), None)
check('preview-revoke-on-detach scenario 3', solve('preview-revoke-on-detach', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), None)
check('preview-revoke-on-detach scenario 4', solve('preview-revoke-on-detach', ([2,3],[],[0],True,'uploading','blob:c',False)), 'blob:c')
check('preview-revoke-on-detach scenario 5', solve('preview-revoke-on-detach', ([2,3],[1],[0,1],False,'failed','blob:d',True)), None)
check('preview-revoke-on-detach scenario 6', solve('preview-revoke-on-detach', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 'blob:e')
check('zero-size-part-completion scenario 1', solve('zero-size-part-completion', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), False)
check('zero-size-part-completion scenario 2', solve('zero-size-part-completion', ([],[],[],False,'done',None,False)), True)
check('zero-size-part-completion scenario 3', solve('zero-size-part-completion', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('zero-size-part-completion scenario 4', solve('zero-size-part-completion', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('zero-size-part-completion scenario 5', solve('zero-size-part-completion', ([2,3],[1],[0,1],False,'failed','blob:d',True)), False)
check('zero-size-part-completion scenario 6', solve('zero-size-part-completion', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), True)
check('inflight-abort-handles scenario 1', solve('inflight-abort-handles', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('inflight-abort-handles scenario 2', solve('inflight-abort-handles', ([],[],[],False,'done',None,False)), [])
check('inflight-abort-handles scenario 3', solve('inflight-abort-handles', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('inflight-abort-handles scenario 4', solve('inflight-abort-handles', ([2,3],[],[0],True,'uploading','blob:c',False)), [0])
check('inflight-abort-handles scenario 5', solve('inflight-abort-handles', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [])
check('inflight-abort-handles scenario 6', solve('inflight-abort-handles', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('retry-eligible-parts scenario 1', solve('retry-eligible-parts', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), [])
check('retry-eligible-parts scenario 2', solve('retry-eligible-parts', ([],[],[],False,'done',None,False)), [])
check('retry-eligible-parts scenario 3', solve('retry-eligible-parts', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), [])
check('retry-eligible-parts scenario 4', solve('retry-eligible-parts', ([2,3],[],[0],True,'uploading','blob:c',False)), [])
check('retry-eligible-parts scenario 5', solve('retry-eligible-parts', ([2,3],[1],[0,1],False,'failed','blob:d',True)), [0])
check('retry-eligible-parts scenario 6', solve('retry-eligible-parts', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), [])
check('sent-vs-accepted-indicator scenario 1', solve('sent-vs-accepted-indicator', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 1)
check('sent-vs-accepted-indicator scenario 2', solve('sent-vs-accepted-indicator', ([],[],[],False,'done',None,False)), 0)
check('sent-vs-accepted-indicator scenario 3', solve('sent-vs-accepted-indicator', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 0)
check('sent-vs-accepted-indicator scenario 4', solve('sent-vs-accepted-indicator', ([2,3],[],[0],True,'uploading','blob:c',False)), 1)
check('sent-vs-accepted-indicator scenario 5', solve('sent-vs-accepted-indicator', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 1)
check('sent-vs-accepted-indicator scenario 6', solve('sent-vs-accepted-indicator', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), 0)
check('terminal-task-retention scenario 1', solve('terminal-task-retention', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), True)
check('terminal-task-retention scenario 2', solve('terminal-task-retention', ([],[],[],False,'done',None,False)), False)
check('terminal-task-retention scenario 3', solve('terminal-task-retention', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), True)
check('terminal-task-retention scenario 4', solve('terminal-task-retention', ([2,3],[],[0],True,'uploading','blob:c',False)), False)
check('terminal-task-retention scenario 5', solve('terminal-task-retention', ([2,3],[1],[0,1],False,'failed','blob:d',True)), True)
check('terminal-task-retention scenario 6', solve('terminal-task-retention', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), False)
check('preview-while-incomplete scenario 1', solve('preview-while-incomplete', ([N,2,3],[0],[0,1],False,'uploading','blob:a',True)), 'blob:a')
check('preview-while-incomplete scenario 2', solve('preview-while-incomplete', ([],[],[],False,'done',None,False)), None)
check('preview-while-incomplete scenario 3', solve('preview-while-incomplete', ([2,0],[0,1],[0,1],False,'done','blob:b',True)), 'blob:b')
check('preview-while-incomplete scenario 4', solve('preview-while-incomplete', ([2,3],[],[0],True,'uploading','blob:c',False)), None)
check('preview-while-incomplete scenario 5', solve('preview-while-incomplete', ([2,3],[1],[0,1],False,'failed','blob:d',True)), 'blob:d')
check('preview-while-incomplete scenario 6', solve('preview-while-incomplete', ([2,3],[0,1],[0,1],False,'done','blob:e',False)), None)
check('cancel after one accepted and two inflight parts: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: remaining-local-parts', solve('remaining-local-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'cancelled')
check('cancel after one accepted and two inflight parts: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 'blob:z')
check('cancel after one accepted and two inflight parts: zero-size-part-completion', solve('zero-size-part-completion', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: inflight-abort-handles', solve('inflight-abort-handles', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [1,2])
check('cancel after one accepted and two inflight parts: retry-eligible-parts', solve('retry-eligible-parts', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), [])
check('cancel after one accepted and two inflight parts: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), 2)
check('cancel after one accepted and two inflight parts: terminal-task-retention', solve('terminal-task-retention', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), False)
check('cancel after one accepted and two inflight parts: preview-while-incomplete', solve('preview-while-incomplete', ([2,3,4],[0],[0,1,2],True,'uploading','blob:z',False)), None)
check('background upload survives detached preview: accepted-progress-not-sent', solve('accepted-progress-not-sent', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: remaining-local-parts', solve('remaining-local-parts', ([N],[],[],False,'uploading',None,False)), [0])
check('background upload survives detached preview: cancel-overrides-upload-status', solve('cancel-overrides-upload-status', ([N],[],[],False,'uploading',None,False)), 'uploading')
check('background upload survives detached preview: preview-revoke-on-detach', solve('preview-revoke-on-detach', ([N],[],[],False,'uploading',None,False)), None)
check('background upload survives detached preview: zero-size-part-completion', solve('zero-size-part-completion', ([N],[],[],False,'uploading',None,False)), False)
check('background upload survives detached preview: inflight-abort-handles', solve('inflight-abort-handles', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: retry-eligible-parts', solve('retry-eligible-parts', ([N],[],[],False,'uploading',None,False)), [])
check('background upload survives detached preview: sent-vs-accepted-indicator', solve('sent-vs-accepted-indicator', ([N],[],[],False,'uploading',None,False)), 0)
check('background upload survives detached preview: terminal-task-retention', solve('terminal-task-retention', ([N],[],[],False,'uploading',None,False)), True)
check('background upload survives detached preview: preview-while-incomplete', solve('preview-while-incomplete', ([N],[],[],False,'uploading',None,False)), None)
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
accepted-progress-not-sent scenario 111Passed
accepted-progress-not-sent scenario 200Passed
accepted-progress-not-sent scenario 322Passed
accepted-progress-not-sent scenario 400Passed
accepted-progress-not-sent scenario 533Passed
accepted-progress-not-sent scenario 655Passed
remaining-local-parts scenario 1[1, 2][1, 2]Passed
remaining-local-parts scenario 2[][]Passed
remaining-local-parts scenario 3[][]Passed
remaining-local-parts scenario 4[0, 1][0, 1]Passed
remaining-local-parts scenario 5[0][0]Passed
remaining-local-parts scenario 6[][]Passed
cancel-overrides-upload-status scenario 1uploadinguploadingPassed
cancel-overrides-upload-status scenario 2donedonePassed
cancel-overrides-upload-status scenario 3donedonePassed
cancel-overrides-upload-status scenario 4cancelledcancelledPassed
cancel-overrides-upload-status scenario 5failedfailedPassed
cancel-overrides-upload-status scenario 6donedonePassed
preview-revoke-on-detach scenario 1NoneNonePassed
preview-revoke-on-detach scenario 2NoneNonePassed
preview-revoke-on-detach scenario 3NoneNonePassed
preview-revoke-on-detach scenario 4blob:cblob:cPassed
preview-revoke-on-detach scenario 5NoneNonePassed
preview-revoke-on-detach scenario 6blob:eblob:ePassed
zero-size-part-completion scenario 1FalseFalsePassed
zero-size-part-completion scenario 2TrueTruePassed
zero-size-part-completion scenario 3TrueTruePassed
zero-size-part-completion scenario 4FalseFalsePassed
zero-size-part-completion scenario 5FalseFalsePassed
zero-size-part-completion scenario 6TrueTruePassed
inflight-abort-handles scenario 1[][]Passed
inflight-abort-handles scenario 2[][]Passed
inflight-abort-handles scenario 3[][]Passed
inflight-abort-handles scenario 4[0][0]Passed
inflight-abort-handles scenario 5[][]Passed
inflight-abort-handles scenario 6[][]Passed
retry-eligible-parts scenario 1[][]Passed
retry-eligible-parts scenario 2[][]Passed
retry-eligible-parts scenario 3[][]Passed
retry-eligible-parts scenario 4[][]Passed
retry-eligible-parts scenario 5[0][0]Passed
retry-eligible-parts scenario 6[][]Passed
sent-vs-accepted-indicator scenario 111Passed
sent-vs-accepted-indicator scenario 200Passed
sent-vs-accepted-indicator scenario 300Passed
sent-vs-accepted-indicator scenario 411Passed
sent-vs-accepted-indicator scenario 511Passed
sent-vs-accepted-indicator scenario 600Passed
terminal-task-retention scenario 1TrueTruePassed
terminal-task-retention scenario 2FalseFalsePassed
terminal-task-retention scenario 3TrueTruePassed
terminal-task-retention scenario 4FalseFalsePassed
terminal-task-retention scenario 5TrueTruePassed
terminal-task-retention scenario 6FalseFalsePassed
preview-while-incomplete scenario 1blob:ablob:aPassed
preview-while-incomplete scenario 2NoneNonePassed
preview-while-incomplete scenario 3blob:bblob:bPassed
preview-while-incomplete scenario 4NoneNonePassed
preview-while-incomplete scenario 5blob:dblob:dPassed
preview-while-incomplete scenario 6NoneNonePassed
cancel after one accepted and two inflight parts: accepted-progress-not-sent22Passed
cancel after one accepted and two inflight parts: remaining-local-parts[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: cancel-overrides-upload-statuscancelledcancelledPassed
cancel after one accepted and two inflight parts: preview-revoke-on-detachblob:zblob:zPassed
cancel after one accepted and two inflight parts: zero-size-part-completionFalseFalsePassed
cancel after one accepted and two inflight parts: inflight-abort-handles[1, 2][1, 2]Passed
cancel after one accepted and two inflight parts: retry-eligible-parts[][]Passed
cancel after one accepted and two inflight parts: sent-vs-accepted-indicator22Passed
cancel after one accepted and two inflight parts: terminal-task-retentionFalseFalsePassed
cancel after one accepted and two inflight parts: preview-while-incompleteNoneNonePassed
background upload survives detached preview: accepted-progress-not-sent00Passed
background upload survives detached preview: remaining-local-parts[0][0]Passed
background upload survives detached preview: cancel-overrides-upload-statusuploadinguploadingPassed
background upload survives detached preview: preview-revoke-on-detachNoneNonePassed
background upload survives detached preview: zero-size-part-completionFalseFalsePassed
background upload survives detached preview: inflight-abort-handles[][]Passed
background upload survives detached preview: retry-eligible-parts[][]Passed
background upload survives detached preview: sent-vs-accepted-indicator00Passed
background upload survives detached preview: terminal-task-retentionTrueTruePassed
background upload survives detached preview: preview-while-incompleteNoneNonePassed

SHA-256 / e4420e3cd08513bf22768a773bad5a61cba11925402c2e8392c08c9e850fab85

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

Case digest / e0b2dd64f36c1d28e18e0ef6f4766bd088048aaa43858bdd3989f213729b4f80