FA-24281 / Client state / Open access
Local upload task presentation: Sent vs accepted indicator · case 01
Sent vs accepted indicator.
ROOT CAUSE
The sent-vs-accepted-indicator client decision evaluates `len(sent)` instead of `len(sent)-len(accepted)`.
VERIFIED REPAIR
Apply the modeled sent-vs-accepted-indicator rule: `len(sent)-len(accepted)`.
Unsuccessful approach: The partial repair `int(len(sent)>len(accepted))` 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 sent-vs-accepted-indicator 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 '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)
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| accepted-progress-not-sent scenario 1 | 1 | 1 | Passed |
| accepted-progress-not-sent scenario 2 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 3 | 2 | 2 | Passed |
| accepted-progress-not-sent scenario 4 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 5 | 3 | 3 | Passed |
| accepted-progress-not-sent scenario 6 | 5 | 5 | Passed |
| 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 1 | uploading | uploading | Passed |
| cancel-overrides-upload-status scenario 2 | done | done | Passed |
| cancel-overrides-upload-status scenario 3 | done | done | Passed |
| cancel-overrides-upload-status scenario 4 | cancelled | cancelled | Passed |
| cancel-overrides-upload-status scenario 5 | failed | failed | Passed |
| cancel-overrides-upload-status scenario 6 | done | done | Passed |
| preview-revoke-on-detach scenario 1 | None | None | Passed |
| preview-revoke-on-detach scenario 2 | None | None | Passed |
| preview-revoke-on-detach scenario 3 | None | None | Passed |
| preview-revoke-on-detach scenario 4 | blob:c | blob:c | Passed |
| preview-revoke-on-detach scenario 5 | None | None | Passed |
| preview-revoke-on-detach scenario 6 | blob:e | blob:e | Passed |
| zero-size-part-completion scenario 1 | False | False | Passed |
| zero-size-part-completion scenario 2 | True | True | Passed |
| zero-size-part-completion scenario 3 | True | True | Passed |
| zero-size-part-completion scenario 4 | False | False | Passed |
| zero-size-part-completion scenario 5 | False | False | Passed |
| zero-size-part-completion scenario 6 | True | True | Passed |
| 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 1 | 2 | 1 | Failed |
| sent-vs-accepted-indicator scenario 2 | 0 | 0 | Passed |
| sent-vs-accepted-indicator scenario 3 | 2 | 0 | Failed |
| sent-vs-accepted-indicator scenario 4 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 5 | 2 | 1 | Failed |
| sent-vs-accepted-indicator scenario 6 | 2 | 0 | Failed |
| terminal-task-retention scenario 1 | True | True | Passed |
| terminal-task-retention scenario 2 | False | False | Passed |
| terminal-task-retention scenario 3 | True | True | Passed |
| terminal-task-retention scenario 4 | False | False | Passed |
| terminal-task-retention scenario 5 | True | True | Passed |
| terminal-task-retention scenario 6 | False | False | Passed |
| preview-while-incomplete scenario 1 | blob:a | blob:a | Passed |
| preview-while-incomplete scenario 2 | None | None | Passed |
| preview-while-incomplete scenario 3 | blob:b | blob:b | Passed |
| preview-while-incomplete scenario 4 | None | None | Passed |
| preview-while-incomplete scenario 5 | blob:d | blob:d | Passed |
| preview-while-incomplete scenario 6 | None | None | Passed |
| cancel after one accepted and two inflight parts: accepted-progress-not-sent | 2 | 2 | Passed |
| 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-status | cancelled | cancelled | Passed |
| cancel after one accepted and two inflight parts: preview-revoke-on-detach | blob:z | blob:z | Passed |
| cancel after one accepted and two inflight parts: zero-size-part-completion | False | False | Passed |
| 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-indicator | 3 | 2 | Failed |
| cancel after one accepted and two inflight parts: terminal-task-retention | False | False | Passed |
| cancel after one accepted and two inflight parts: preview-while-incomplete | None | None | Passed |
| background upload survives detached preview: accepted-progress-not-sent | 0 | 0 | Passed |
| background upload survives detached preview: remaining-local-parts | [0] | [0] | Passed |
| background upload survives detached preview: cancel-overrides-upload-status | uploading | uploading | Passed |
| background upload survives detached preview: preview-revoke-on-detach | None | None | Passed |
| background upload survives detached preview: zero-size-part-completion | False | False | Passed |
| 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-indicator | 0 | 0 | Passed |
| background upload survives detached preview: terminal-task-retention | True | True | Passed |
| background upload survives detached preview: preview-while-incomplete | None | None | Passed |
SHA-256 / 76795d0c2c26bb59beffb60f3671831c731ec6f827d287732850d648fb438073
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 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 int(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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| accepted-progress-not-sent scenario 1 | 1 | 1 | Passed |
| accepted-progress-not-sent scenario 2 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 3 | 2 | 2 | Passed |
| accepted-progress-not-sent scenario 4 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 5 | 3 | 3 | Passed |
| accepted-progress-not-sent scenario 6 | 5 | 5 | Passed |
| 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 1 | uploading | uploading | Passed |
| cancel-overrides-upload-status scenario 2 | done | done | Passed |
| cancel-overrides-upload-status scenario 3 | done | done | Passed |
| cancel-overrides-upload-status scenario 4 | cancelled | cancelled | Passed |
| cancel-overrides-upload-status scenario 5 | failed | failed | Passed |
| cancel-overrides-upload-status scenario 6 | done | done | Passed |
| preview-revoke-on-detach scenario 1 | None | None | Passed |
| preview-revoke-on-detach scenario 2 | None | None | Passed |
| preview-revoke-on-detach scenario 3 | None | None | Passed |
| preview-revoke-on-detach scenario 4 | blob:c | blob:c | Passed |
| preview-revoke-on-detach scenario 5 | None | None | Passed |
| preview-revoke-on-detach scenario 6 | blob:e | blob:e | Passed |
| zero-size-part-completion scenario 1 | False | False | Passed |
| zero-size-part-completion scenario 2 | True | True | Passed |
| zero-size-part-completion scenario 3 | True | True | Passed |
| zero-size-part-completion scenario 4 | False | False | Passed |
| zero-size-part-completion scenario 5 | False | False | Passed |
| zero-size-part-completion scenario 6 | True | True | Passed |
| 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 1 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 2 | 0 | 0 | Passed |
| sent-vs-accepted-indicator scenario 3 | 0 | 0 | Passed |
| sent-vs-accepted-indicator scenario 4 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 5 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 6 | 0 | 0 | Passed |
| terminal-task-retention scenario 1 | True | True | Passed |
| terminal-task-retention scenario 2 | False | False | Passed |
| terminal-task-retention scenario 3 | True | True | Passed |
| terminal-task-retention scenario 4 | False | False | Passed |
| terminal-task-retention scenario 5 | True | True | Passed |
| terminal-task-retention scenario 6 | False | False | Passed |
| preview-while-incomplete scenario 1 | blob:a | blob:a | Passed |
| preview-while-incomplete scenario 2 | None | None | Passed |
| preview-while-incomplete scenario 3 | blob:b | blob:b | Passed |
| preview-while-incomplete scenario 4 | None | None | Passed |
| preview-while-incomplete scenario 5 | blob:d | blob:d | Passed |
| preview-while-incomplete scenario 6 | None | None | Passed |
| cancel after one accepted and two inflight parts: accepted-progress-not-sent | 2 | 2 | Passed |
| 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-status | cancelled | cancelled | Passed |
| cancel after one accepted and two inflight parts: preview-revoke-on-detach | blob:z | blob:z | Passed |
| cancel after one accepted and two inflight parts: zero-size-part-completion | False | False | Passed |
| 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-indicator | 1 | 2 | Failed |
| cancel after one accepted and two inflight parts: terminal-task-retention | False | False | Passed |
| cancel after one accepted and two inflight parts: preview-while-incomplete | None | None | Passed |
| background upload survives detached preview: accepted-progress-not-sent | 0 | 0 | Passed |
| background upload survives detached preview: remaining-local-parts | [0] | [0] | Passed |
| background upload survives detached preview: cancel-overrides-upload-status | uploading | uploading | Passed |
| background upload survives detached preview: preview-revoke-on-detach | None | None | Passed |
| background upload survives detached preview: zero-size-part-completion | False | False | Passed |
| 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-indicator | 0 | 0 | Passed |
| background upload survives detached preview: terminal-task-retention | True | True | Passed |
| background upload survives detached preview: preview-while-incomplete | None | None | Passed |
SHA-256 / f49659206fc30570167d08106a07acf989b2b2c5e499abaf32d3f5a0dd74b05b
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| accepted-progress-not-sent scenario 1 | 1 | 1 | Passed |
| accepted-progress-not-sent scenario 2 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 3 | 2 | 2 | Passed |
| accepted-progress-not-sent scenario 4 | 0 | 0 | Passed |
| accepted-progress-not-sent scenario 5 | 3 | 3 | Passed |
| accepted-progress-not-sent scenario 6 | 5 | 5 | Passed |
| 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 1 | uploading | uploading | Passed |
| cancel-overrides-upload-status scenario 2 | done | done | Passed |
| cancel-overrides-upload-status scenario 3 | done | done | Passed |
| cancel-overrides-upload-status scenario 4 | cancelled | cancelled | Passed |
| cancel-overrides-upload-status scenario 5 | failed | failed | Passed |
| cancel-overrides-upload-status scenario 6 | done | done | Passed |
| preview-revoke-on-detach scenario 1 | None | None | Passed |
| preview-revoke-on-detach scenario 2 | None | None | Passed |
| preview-revoke-on-detach scenario 3 | None | None | Passed |
| preview-revoke-on-detach scenario 4 | blob:c | blob:c | Passed |
| preview-revoke-on-detach scenario 5 | None | None | Passed |
| preview-revoke-on-detach scenario 6 | blob:e | blob:e | Passed |
| zero-size-part-completion scenario 1 | False | False | Passed |
| zero-size-part-completion scenario 2 | True | True | Passed |
| zero-size-part-completion scenario 3 | True | True | Passed |
| zero-size-part-completion scenario 4 | False | False | Passed |
| zero-size-part-completion scenario 5 | False | False | Passed |
| zero-size-part-completion scenario 6 | True | True | Passed |
| 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 1 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 2 | 0 | 0 | Passed |
| sent-vs-accepted-indicator scenario 3 | 0 | 0 | Passed |
| sent-vs-accepted-indicator scenario 4 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 5 | 1 | 1 | Passed |
| sent-vs-accepted-indicator scenario 6 | 0 | 0 | Passed |
| terminal-task-retention scenario 1 | True | True | Passed |
| terminal-task-retention scenario 2 | False | False | Passed |
| terminal-task-retention scenario 3 | True | True | Passed |
| terminal-task-retention scenario 4 | False | False | Passed |
| terminal-task-retention scenario 5 | True | True | Passed |
| terminal-task-retention scenario 6 | False | False | Passed |
| preview-while-incomplete scenario 1 | blob:a | blob:a | Passed |
| preview-while-incomplete scenario 2 | None | None | Passed |
| preview-while-incomplete scenario 3 | blob:b | blob:b | Passed |
| preview-while-incomplete scenario 4 | None | None | Passed |
| preview-while-incomplete scenario 5 | blob:d | blob:d | Passed |
| preview-while-incomplete scenario 6 | None | None | Passed |
| cancel after one accepted and two inflight parts: accepted-progress-not-sent | 2 | 2 | Passed |
| 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-status | cancelled | cancelled | Passed |
| cancel after one accepted and two inflight parts: preview-revoke-on-detach | blob:z | blob:z | Passed |
| cancel after one accepted and two inflight parts: zero-size-part-completion | False | False | Passed |
| 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-indicator | 2 | 2 | Passed |
| cancel after one accepted and two inflight parts: terminal-task-retention | False | False | Passed |
| cancel after one accepted and two inflight parts: preview-while-incomplete | None | None | Passed |
| background upload survives detached preview: accepted-progress-not-sent | 0 | 0 | Passed |
| background upload survives detached preview: remaining-local-parts | [0] | [0] | Passed |
| background upload survives detached preview: cancel-overrides-upload-status | uploading | uploading | Passed |
| background upload survives detached preview: preview-revoke-on-detach | None | None | Passed |
| background upload survives detached preview: zero-size-part-completion | False | False | Passed |
| 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-indicator | 0 | 0 | Passed |
| background upload survives detached preview: terminal-task-retention | True | True | Passed |
| background upload survives detached preview: preview-while-incomplete | None | None | Passed |
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.773724+00:00.
Case digest / 3568705de8841991182d8d3cff5da73dfe43ee4efdd0e4883f876aa158926fd6