{"abstract":"A media player maps a seek time to keyframe-aligned byte range requests around cached spans: the decoder starts at the last keyframe at or before the seek time.","category":"HTTP ranges","checks":18,"contract":"x has a time-sorted keyframe index [time,byte-offset], total length, init header length H (bytes 0..H-1), seek time, byte window and cached inclusive spans (unordered). Request the header unless one cached span covers all of it. Start at the last keyframe with time<=seek, or the first keyframe when seeking earlier. A start offset at or beyond total, an empty index or nonpositive total returns null. The media window is [start,min(total-1,start+window-1)]; request only its uncached gaps in ascending order, as inclusive bytes=a-b values after any header request.","evaluation_group":"s3-http_ranges-media-seek-range-plan","failed_approach":"The partial repair uses idx=x['index']\nT=x['total']\nif not idx or T<=0: return None\nreqs=[]\nH=x['header_end']\nif H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\nk=-1\nfor i,(tm,off) in enumerate(idx):\n    if tm<=x['seek']+1: k=i\no=idx[max(k,0)][1]\nif o>=T: return None\ne=min(T-1,o+x['window']-1)\ncur=o\nfor a,b in sorted(x['cached']):\n    if b<cur or a>e: continue\n    if a>cur: reqs.append([cur,a-1])\n    cur=max(cur,b+1)\nif cur<=e: reqs.append([cur,e])\nreturn ['bytes=%d-%d'%(a,b) for a,b in reqs], which still violates the stated contract.","family":"s3-http_ranges-media-seek-range-plan-keyframe-not-after-seek","id":"FA-27631","implementations":{"attempt":{"sha256":"0be800f2cc1c55d84104ff580b93ca3409ef8491cc6a18ccade031c0ac205005","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    idx=x['index']\n    T=x['total']\n    if not idx or T<=0: return None\n    reqs=[]\n    H=x['header_end']\n    if H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\n    k=-1\n    for i,(tm,off) in enumerate(idx):\n        if tm<=x['seek']+1: k=i\n    o=idx[max(k,0)][1]\n    if o>=T: return None\n    e=min(T-1,o+x['window']-1)\n    cur=o\n    for a,b in sorted(x['cached']):\n        if b<cur or a>e: continue\n        if a>cur: reqs.append([cur,a-1])\n        cur=max(cur,b+1)\n    if cur<=e: reqs.append([cur,e])\n    return ['bytes=%d-%d'%(a,b) for a,b in reqs]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('keyframe-not-after-seek fixture 0', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 1', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2000,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 2', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':3999,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 3', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[1000,100],[3000,600]],'seek':500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 4', json.loads(json.dumps(solve({'cached':[[0,49]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 5', json.loads(json.dumps(solve({'cached':[[50,200]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 6', json.loads(json.dumps(solve({'cached':[[0,150]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 7', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':4500,'total':1200,'window':400}))), json.loads(json.dumps(['bytes=0-99','bytes=900-1199'])))\ncheck('keyframe-not-after-seek fixture 8', json.loads(json.dumps(solve({'cached':[[0,99],[600,649]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-599','bytes=650-799'])))\ncheck('keyframe-not-after-seek fixture 9', json.loads(json.dumps(solve({'cached':[[0,99],[900,950]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 10', json.loads(json.dumps(solve({'cached':[[0,99],[799,850]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-798'])))\ncheck('keyframe-not-after-seek fixture 11', json.loads(json.dumps(solve({'cached':[[0,99],[600,610],[540,700]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-539','bytes=701-799'])))\ncheck('keyframe-not-after-seek fixture 12', json.loads(json.dumps(solve({'cached':[[0,99],[500,798]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=799-799'])))\ncheck('keyframe-not-after-seek fixture 13', json.loads(json.dumps(solve({'cached':[[0,99],[500,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 14', json.loads(json.dumps(solve({'cached':[[0,99],[501,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-500','bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 15', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,1300]],'seek':3000,'total':1200,'window':300}))), json.loads(json.dumps(None)))\ncheck('keyframe-not-after-seek fixture 16', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':10,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 17', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[1000,200],[2000,300],[3000,400],[4000,500],[5000,600]],'seek':1000*N,'total':2000,'window':50}))), json.loads(json.dumps(['bytes=0-99',\"bytes=%d-%d\"%(100*N+100,100*N+149)])))\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"1acabdeb65cfca248e9a22d52cf3a8f3b3f6902b60a9261eeb58bb1c6912556b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    idx=x['index']\n    T=x['total']\n    if not idx or T<=0: return None\n    reqs=[]\n    H=x['header_end']\n    if H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\n    k=-1\n    for i,(tm,off) in enumerate(idx):\n        if tm<x['seek']: k=i\n    o=idx[max(k,0)][1]\n    if o>=T: return None\n    e=min(T-1,o+x['window']-1)\n    cur=o\n    for a,b in sorted(x['cached']):\n        if b<cur or a>e: continue\n        if a>cur: reqs.append([cur,a-1])\n        cur=max(cur,b+1)\n    if cur<=e: reqs.append([cur,e])\n    return ['bytes=%d-%d'%(a,b) for a,b in reqs]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('keyframe-not-after-seek fixture 0', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 1', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2000,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 2', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':3999,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 3', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[1000,100],[3000,600]],'seek':500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 4', json.loads(json.dumps(solve({'cached':[[0,49]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 5', json.loads(json.dumps(solve({'cached':[[50,200]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 6', json.loads(json.dumps(solve({'cached':[[0,150]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 7', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':4500,'total':1200,'window':400}))), json.loads(json.dumps(['bytes=0-99','bytes=900-1199'])))\ncheck('keyframe-not-after-seek fixture 8', json.loads(json.dumps(solve({'cached':[[0,99],[600,649]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-599','bytes=650-799'])))\ncheck('keyframe-not-after-seek fixture 9', json.loads(json.dumps(solve({'cached':[[0,99],[900,950]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 10', json.loads(json.dumps(solve({'cached':[[0,99],[799,850]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-798'])))\ncheck('keyframe-not-after-seek fixture 11', json.loads(json.dumps(solve({'cached':[[0,99],[600,610],[540,700]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-539','bytes=701-799'])))\ncheck('keyframe-not-after-seek fixture 12', json.loads(json.dumps(solve({'cached':[[0,99],[500,798]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=799-799'])))\ncheck('keyframe-not-after-seek fixture 13', json.loads(json.dumps(solve({'cached':[[0,99],[500,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 14', json.loads(json.dumps(solve({'cached':[[0,99],[501,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-500','bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 15', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,1300]],'seek':3000,'total':1200,'window':300}))), json.loads(json.dumps(None)))\ncheck('keyframe-not-after-seek fixture 16', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':10,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 17', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[1000,200],[2000,300],[3000,400],[4000,500],[5000,600]],'seek':1000*N,'total':2000,'window':50}))), json.loads(json.dumps(['bytes=0-99',\"bytes=%d-%d\"%(100*N+100,100*N+149)])))\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"a4ef17874f1934883400fc802748e4cd58f908deea7f80058c9db79d79cae4d9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    idx=x['index']\n    T=x['total']\n    if not idx or T<=0: return None\n    reqs=[]\n    H=x['header_end']\n    if H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\n    k=-1\n    for i,(tm,off) in enumerate(idx):\n        if tm<=x['seek']: k=i\n    o=idx[max(k,0)][1]\n    if o>=T: return None\n    e=min(T-1,o+x['window']-1)\n    cur=o\n    for a,b in sorted(x['cached']):\n        if b<cur or a>e: continue\n        if a>cur: reqs.append([cur,a-1])\n        cur=max(cur,b+1)\n    if cur<=e: reqs.append([cur,e])\n    return ['bytes=%d-%d'%(a,b) for a,b in reqs]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('keyframe-not-after-seek fixture 0', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 1', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2000,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 2', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':3999,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 3', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[1000,100],[3000,600]],'seek':500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 4', json.loads(json.dumps(solve({'cached':[[0,49]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 5', json.loads(json.dumps(solve({'cached':[[50,200]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 6', json.loads(json.dumps(solve({'cached':[[0,150]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 7', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':4500,'total':1200,'window':400}))), json.loads(json.dumps(['bytes=0-99','bytes=900-1199'])))\ncheck('keyframe-not-after-seek fixture 8', json.loads(json.dumps(solve({'cached':[[0,99],[600,649]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-599','bytes=650-799'])))\ncheck('keyframe-not-after-seek fixture 9', json.loads(json.dumps(solve({'cached':[[0,99],[900,950]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-799'])))\ncheck('keyframe-not-after-seek fixture 10', json.loads(json.dumps(solve({'cached':[[0,99],[799,850]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-798'])))\ncheck('keyframe-not-after-seek fixture 11', json.loads(json.dumps(solve({'cached':[[0,99],[600,610],[540,700]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-539','bytes=701-799'])))\ncheck('keyframe-not-after-seek fixture 12', json.loads(json.dumps(solve({'cached':[[0,99],[500,798]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=799-799'])))\ncheck('keyframe-not-after-seek fixture 13', json.loads(json.dumps(solve({'cached':[[0,99],[500,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 14', json.loads(json.dumps(solve({'cached':[[0,99],[501,510]],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':2500,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=500-500','bytes=511-799'])))\ncheck('keyframe-not-after-seek fixture 15', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,1300]],'seek':3000,'total':1200,'window':300}))), json.loads(json.dumps(None)))\ncheck('keyframe-not-after-seek fixture 16', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[2000,500],[4000,900]],'seek':10,'total':1200,'window':300}))), json.loads(json.dumps(['bytes=0-99','bytes=100-399'])))\ncheck('keyframe-not-after-seek fixture 17', json.loads(json.dumps(solve({'cached':[],'header_end':100,'index':[[0,100],[1000,200],[2000,300],[3000,400],[4000,500],[5000,600]],'seek':1000*N,'total':2000,'window':50}))), json.loads(json.dumps(['bytes=0-99',\"bytes=%d-%d\"%(100*N+100,100*N+149)])))\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Deterministic simplified range service, with stipulated local policies and already parsed trusted inputs; not a complete HTTP implementation. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-http_ranges-media-seek-range-plan-keyframe-not-after-seek","generated_at":"2026-09-29T14:41:26.801031+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Range responses combine representation identity, conditional requests, framing, and partial-object state.","repair":"Apply the bounded decision exactly: idx=x['index']\nT=x['total']\nif not idx or T<=0: return None\nreqs=[]\nH=x['header_end']\nif H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\nk=-1\nfor i,(tm,off) in enumerate(idx):\n    if tm<=x['seek']: k=i\no=idx[max(k,0)][1]\nif o>=T: return None\ne=min(T-1,o+x['window']-1)\ncur=o\nfor a,b in sorted(x['cached']):\n    if b<cur or a>e: continue\n    if a>cur: reqs.append([cur,a-1])\n    cur=max(cur,b+1)\nif cur<=e: reqs.append([cur,e])\nreturn ['bytes=%d-%d'%(a,b) for a,b in reqs]","root_cause":"The media-seek-range-plan-keyframe-not-after-seek decision uses idx=x['index']\nT=x['total']\nif not idx or T<=0: return None\nreqs=[]\nH=x['header_end']\nif H>0 and not any(a<=0 and H-1<=b for a,b in x['cached']): reqs.append([0,H-1])\nk=-1\nfor i,(tm,off) in enumerate(idx):\n    if tm<x['seek']: k=i\no=idx[max(k,0)][1]\nif o>=T: return None\ne=min(T-1,o+x['window']-1)\ncur=o\nfor a,b in sorted(x['cached']):\n    if b<cur or a>e: continue\n    if a>cur: reqs.append([cur,a-1])\n    cur=max(cur,b+1)\nif cur<=e: reqs.append([cur,e])\nreturn ['bytes=%d-%d'%(a,b) for a,b in reqs].","sha256":"c3396f84e8eafebf3e4a5b4e6d02a2cefef64ffba53bce52e24183c45b346a40","title":"A media player maps a seek time to keyframe-aligned byte range requests around cached spans: the decoder starts at the last keyframe at or before the seek time · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.768,"exit_code":1,"observations":[{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 0","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 1","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=900-1199"],"check":"keyframe-not-after-seek fixture 2","expected":["bytes=0-99","bytes=500-799"],"passed":false},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 3","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 4","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 5","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 6","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=900-1199"],"check":"keyframe-not-after-seek fixture 7","expected":["bytes=0-99","bytes=900-1199"],"passed":true},{"actual":["bytes=500-599","bytes=650-799"],"check":"keyframe-not-after-seek fixture 8","expected":["bytes=500-599","bytes=650-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 9","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=500-798"],"check":"keyframe-not-after-seek fixture 10","expected":["bytes=500-798"],"passed":true},{"actual":["bytes=500-539","bytes=701-799"],"check":"keyframe-not-after-seek fixture 11","expected":["bytes=500-539","bytes=701-799"],"passed":true},{"actual":["bytes=799-799"],"check":"keyframe-not-after-seek fixture 12","expected":["bytes=799-799"],"passed":true},{"actual":["bytes=511-799"],"check":"keyframe-not-after-seek fixture 13","expected":["bytes=511-799"],"passed":true},{"actual":["bytes=500-500","bytes=511-799"],"check":"keyframe-not-after-seek fixture 14","expected":["bytes=500-500","bytes=511-799"],"passed":true},{"actual":null,"check":"keyframe-not-after-seek fixture 15","expected":null,"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 16","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=200-249"],"check":"keyframe-not-after-seek fixture 17","expected":["bytes=0-99","bytes=200-249"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"keyframe-not-after-seek fixture 0\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 1\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 2\", \"actual\": [\"bytes=0-99\", \"bytes=900-1199\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": false}, {\"check\": \"keyframe-not-after-seek fixture 3\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 4\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 5\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 6\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 7\", \"actual\": [\"bytes=0-99\", \"bytes=900-1199\"], \"expected\": [\"bytes=0-99\", \"bytes=900-1199\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 8\", \"actual\": [\"bytes=500-599\", \"bytes=650-799\"], \"expected\": [\"bytes=500-599\", \"bytes=650-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 9\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 10\", \"actual\": [\"bytes=500-798\"], \"expected\": [\"bytes=500-798\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 11\", \"actual\": [\"bytes=500-539\", \"bytes=701-799\"], \"expected\": [\"bytes=500-539\", \"bytes=701-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 12\", \"actual\": [\"bytes=799-799\"], \"expected\": [\"bytes=799-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 13\", \"actual\": [\"bytes=511-799\"], \"expected\": [\"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 14\", \"actual\": [\"bytes=500-500\", \"bytes=511-799\"], \"expected\": [\"bytes=500-500\", \"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 15\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 16\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 17\", \"actual\": [\"bytes=0-99\", \"bytes=200-249\"], \"expected\": [\"bytes=0-99\", \"bytes=200-249\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":36.15,"exit_code":1,"observations":[{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 0","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 1","expected":["bytes=0-99","bytes=500-799"],"passed":false},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 2","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 3","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 4","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 5","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 6","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=900-1199"],"check":"keyframe-not-after-seek fixture 7","expected":["bytes=0-99","bytes=900-1199"],"passed":true},{"actual":["bytes=500-599","bytes=650-799"],"check":"keyframe-not-after-seek fixture 8","expected":["bytes=500-599","bytes=650-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 9","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=500-798"],"check":"keyframe-not-after-seek fixture 10","expected":["bytes=500-798"],"passed":true},{"actual":["bytes=500-539","bytes=701-799"],"check":"keyframe-not-after-seek fixture 11","expected":["bytes=500-539","bytes=701-799"],"passed":true},{"actual":["bytes=799-799"],"check":"keyframe-not-after-seek fixture 12","expected":["bytes=799-799"],"passed":true},{"actual":["bytes=511-799"],"check":"keyframe-not-after-seek fixture 13","expected":["bytes=511-799"],"passed":true},{"actual":["bytes=500-500","bytes=511-799"],"check":"keyframe-not-after-seek fixture 14","expected":["bytes=500-500","bytes=511-799"],"passed":true},{"actual":null,"check":"keyframe-not-after-seek fixture 15","expected":null,"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 16","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=100-149"],"check":"keyframe-not-after-seek fixture 17","expected":["bytes=0-99","bytes=200-249"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"keyframe-not-after-seek fixture 0\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 1\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": false}, {\"check\": \"keyframe-not-after-seek fixture 2\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 3\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 4\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 5\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 6\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 7\", \"actual\": [\"bytes=0-99\", \"bytes=900-1199\"], \"expected\": [\"bytes=0-99\", \"bytes=900-1199\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 8\", \"actual\": [\"bytes=500-599\", \"bytes=650-799\"], \"expected\": [\"bytes=500-599\", \"bytes=650-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 9\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 10\", \"actual\": [\"bytes=500-798\"], \"expected\": [\"bytes=500-798\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 11\", \"actual\": [\"bytes=500-539\", \"bytes=701-799\"], \"expected\": [\"bytes=500-539\", \"bytes=701-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 12\", \"actual\": [\"bytes=799-799\"], \"expected\": [\"bytes=799-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 13\", \"actual\": [\"bytes=511-799\"], \"expected\": [\"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 14\", \"actual\": [\"bytes=500-500\", \"bytes=511-799\"], \"expected\": [\"bytes=500-500\", \"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 15\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 16\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 17\", \"actual\": [\"bytes=0-99\", \"bytes=100-149\"], \"expected\": [\"bytes=0-99\", \"bytes=200-249\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.228,"exit_code":0,"observations":[{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 0","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 1","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 2","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 3","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 4","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=500-799"],"check":"keyframe-not-after-seek fixture 5","expected":["bytes=0-99","bytes=500-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 6","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=0-99","bytes=900-1199"],"check":"keyframe-not-after-seek fixture 7","expected":["bytes=0-99","bytes=900-1199"],"passed":true},{"actual":["bytes=500-599","bytes=650-799"],"check":"keyframe-not-after-seek fixture 8","expected":["bytes=500-599","bytes=650-799"],"passed":true},{"actual":["bytes=500-799"],"check":"keyframe-not-after-seek fixture 9","expected":["bytes=500-799"],"passed":true},{"actual":["bytes=500-798"],"check":"keyframe-not-after-seek fixture 10","expected":["bytes=500-798"],"passed":true},{"actual":["bytes=500-539","bytes=701-799"],"check":"keyframe-not-after-seek fixture 11","expected":["bytes=500-539","bytes=701-799"],"passed":true},{"actual":["bytes=799-799"],"check":"keyframe-not-after-seek fixture 12","expected":["bytes=799-799"],"passed":true},{"actual":["bytes=511-799"],"check":"keyframe-not-after-seek fixture 13","expected":["bytes=511-799"],"passed":true},{"actual":["bytes=500-500","bytes=511-799"],"check":"keyframe-not-after-seek fixture 14","expected":["bytes=500-500","bytes=511-799"],"passed":true},{"actual":null,"check":"keyframe-not-after-seek fixture 15","expected":null,"passed":true},{"actual":["bytes=0-99","bytes=100-399"],"check":"keyframe-not-after-seek fixture 16","expected":["bytes=0-99","bytes=100-399"],"passed":true},{"actual":["bytes=0-99","bytes=200-249"],"check":"keyframe-not-after-seek fixture 17","expected":["bytes=0-99","bytes=200-249"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"keyframe-not-after-seek fixture 0\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 1\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 2\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 3\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 4\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 5\", \"actual\": [\"bytes=0-99\", \"bytes=500-799\"], \"expected\": [\"bytes=0-99\", \"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 6\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 7\", \"actual\": [\"bytes=0-99\", \"bytes=900-1199\"], \"expected\": [\"bytes=0-99\", \"bytes=900-1199\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 8\", \"actual\": [\"bytes=500-599\", \"bytes=650-799\"], \"expected\": [\"bytes=500-599\", \"bytes=650-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 9\", \"actual\": [\"bytes=500-799\"], \"expected\": [\"bytes=500-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 10\", \"actual\": [\"bytes=500-798\"], \"expected\": [\"bytes=500-798\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 11\", \"actual\": [\"bytes=500-539\", \"bytes=701-799\"], \"expected\": [\"bytes=500-539\", \"bytes=701-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 12\", \"actual\": [\"bytes=799-799\"], \"expected\": [\"bytes=799-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 13\", \"actual\": [\"bytes=511-799\"], \"expected\": [\"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 14\", \"actual\": [\"bytes=500-500\", \"bytes=511-799\"], \"expected\": [\"bytes=500-500\", \"bytes=511-799\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 15\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 16\", \"actual\": [\"bytes=0-99\", \"bytes=100-399\"], \"expected\": [\"bytes=0-99\", \"bytes=100-399\"], \"passed\": true}, {\"check\": \"keyframe-not-after-seek fixture 17\", \"actual\": [\"bytes=0-99\", \"bytes=200-249\"], \"expected\": [\"bytes=0-99\", \"bytes=200-249\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}