FAILURE MAP
← Case archive

FA-30211 / HTTP retries / Open access

In-flight retry policy capture: Status membership violates retry transition semantics · case 01

Status membership violates retry transition semantics

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

ROOT CAUSE

Status membership violates retry transition semantics

VERIFIED REPAIR

Restore the specified transition if e[2] not in statuses:.

Unsuccessful approach: The attempted repair changes the faulty site to if e[2]<500: but still violates a regression oracle.

Case contract

configure(version,cap,statuses) sets current policy. begin(request) snapshots it with zero retries used; failure(request,status) uses that request snapshot and admits retry only for configured statuses below cap. update configuration affects later requests only. finish removes request; unknown failures report unknown. Return retry decisions with pinned policy version.

Why this case matters

Offline deterministic model of HTTP request retries.

1 / The failure

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

N = 1
observations = []
def solve(events):
    current=(0,0,()); requests={}; out=[]
    for e in events:
        if e[0]=='configure':
            current=(e[1],e[2],tuple(e[3]))
        elif e[0]=='begin':
            if e[1] in requests: out.append('duplicate'); continue
            requests[e[1]]=[current,0]
        elif e[0]=='finish': requests.pop(e[1],None)
        elif e[0]=='failure':
            if e[1] not in requests: out.append('unknown'); continue
            policy,used=requests[e[1]]
            version,cap,statuses=policy
            if e[2] in statuses: out.append(['stop',version]); continue
            if used>=cap: out.append(['exhausted',version]); continue
            requests[e[1]][1]+=1
            out.append(['retry',version])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('failure','x',503)]), ['unknown'])
check('2', solve([('configure',N,2,[503,429]),('begin','a'),('failure','a',503),('failure','a',429),('failure','a',503)]), [['retry',N],['retry',N],['exhausted',N]])
check('3', solve([('configure',N,1,[503]),('begin','a'),('configure',N+1,0,[429]),('failure','a',429),('failure','a',503),('failure','a',503),('begin','b'),('failure','b',429)]), [['stop',N],['retry',N],['exhausted',N],['exhausted',N+1]])
check('4', solve([('configure',N,1,[503]),('begin','a'),('failure','a',503),('begin','a'),('failure','a',503)]), [['retry',N],'duplicate',['exhausted',N]])
check('5', solve([('configure',N,1,[503]),('begin','a'),('begin','b'),('finish','a'),('failure','a',503),('failure','b',503)]), ['unknown',['retry',N]])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
0[][]Passed
1['unknown']['unknown']Passed
2[['stop', 1], ['stop', 1], ['stop', 1]][['retry', 1], ['retry', 1], ['exhausted', 1]]Failed
3[['retry', 1], ['stop', 1], ['stop', 1], ['stop', 2]][['stop', 1], ['retry', 1], ['exhausted', 1], ['exhausted', 2]]Failed
4[['stop', 1], 'duplicate', ['stop', 1]][['retry', 1], 'duplicate', ['exhausted', 1]]Failed
5['unknown', ['stop', 1]]['unknown', ['retry', 1]]Failed

SHA-256 / 9f6452a5285a4ff8bf578c62a35f8ad79ebbcbb0205b87ce6eacc9d142e8489f

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(events):
    current=(0,0,()); requests={}; out=[]
    for e in events:
        if e[0]=='configure':
            current=(e[1],e[2],tuple(e[3]))
        elif e[0]=='begin':
            if e[1] in requests: out.append('duplicate'); continue
            requests[e[1]]=[current,0]
        elif e[0]=='finish': requests.pop(e[1],None)
        elif e[0]=='failure':
            if e[1] not in requests: out.append('unknown'); continue
            policy,used=requests[e[1]]
            version,cap,statuses=policy
            if e[2]<500: out.append(['stop',version]); continue
            if used>=cap: out.append(['exhausted',version]); continue
            requests[e[1]][1]+=1
            out.append(['retry',version])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('failure','x',503)]), ['unknown'])
check('2', solve([('configure',N,2,[503,429]),('begin','a'),('failure','a',503),('failure','a',429),('failure','a',503)]), [['retry',N],['retry',N],['exhausted',N]])
check('3', solve([('configure',N,1,[503]),('begin','a'),('configure',N+1,0,[429]),('failure','a',429),('failure','a',503),('failure','a',503),('begin','b'),('failure','b',429)]), [['stop',N],['retry',N],['exhausted',N],['exhausted',N+1]])
check('4', solve([('configure',N,1,[503]),('begin','a'),('failure','a',503),('begin','a'),('failure','a',503)]), [['retry',N],'duplicate',['exhausted',N]])
check('5', solve([('configure',N,1,[503]),('begin','a'),('begin','b'),('finish','a'),('failure','a',503),('failure','b',503)]), ['unknown',['retry',N]])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
0[][]Passed
1['unknown']['unknown']Passed
2[['retry', 1], ['stop', 1], ['retry', 1]][['retry', 1], ['retry', 1], ['exhausted', 1]]Failed
3[['stop', 1], ['retry', 1], ['exhausted', 1], ['stop', 2]][['stop', 1], ['retry', 1], ['exhausted', 1], ['exhausted', 2]]Failed
4[['retry', 1], 'duplicate', ['exhausted', 1]][['retry', 1], 'duplicate', ['exhausted', 1]]Passed
5['unknown', ['retry', 1]]['unknown', ['retry', 1]]Passed

SHA-256 / 2ccff50d7983f3b8161868e7a3339b47db9d0f02f37b857669ff4dca2bc47a00

3 / The verified repair

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

N = 1
observations = []
def solve(events):
    current=(0,0,()); requests={}; out=[]
    for e in events:
        if e[0]=='configure':
            current=(e[1],e[2],tuple(e[3]))
        elif e[0]=='begin':
            if e[1] in requests: out.append('duplicate'); continue
            requests[e[1]]=[current,0]
        elif e[0]=='finish': requests.pop(e[1],None)
        elif e[0]=='failure':
            if e[1] not in requests: out.append('unknown'); continue
            policy,used=requests[e[1]]
            version,cap,statuses=policy
            if e[2] not in statuses: out.append(['stop',version]); continue
            if used>=cap: out.append(['exhausted',version]); continue
            requests[e[1]][1]+=1
            out.append(['retry',version])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('failure','x',503)]), ['unknown'])
check('2', solve([('configure',N,2,[503,429]),('begin','a'),('failure','a',503),('failure','a',429),('failure','a',503)]), [['retry',N],['retry',N],['exhausted',N]])
check('3', solve([('configure',N,1,[503]),('begin','a'),('configure',N+1,0,[429]),('failure','a',429),('failure','a',503),('failure','a',503),('begin','b'),('failure','b',429)]), [['stop',N],['retry',N],['exhausted',N],['exhausted',N+1]])
check('4', solve([('configure',N,1,[503]),('begin','a'),('failure','a',503),('begin','a'),('failure','a',503)]), [['retry',N],'duplicate',['exhausted',N]])
check('5', solve([('configure',N,1,[503]),('begin','a'),('begin','b'),('finish','a'),('failure','a',503),('failure','b',503)]), ['unknown',['retry',N]])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
0[][]Passed
1['unknown']['unknown']Passed
2[['retry', 1], ['retry', 1], ['exhausted', 1]][['retry', 1], ['retry', 1], ['exhausted', 1]]Passed
3[['stop', 1], ['retry', 1], ['exhausted', 1], ['exhausted', 2]][['stop', 1], ['retry', 1], ['exhausted', 1], ['exhausted', 2]]Passed
4[['retry', 1], 'duplicate', ['exhausted', 1]][['retry', 1], 'duplicate', ['exhausted', 1]]Passed
5['unknown', ['retry', 1]]['unknown', ['retry', 1]]Passed

SHA-256 / ef0063d52199105b42db9c5816556244f148a133a7741b8fe8ee38704441b572

Verification & scope

Stipulated bounded simulator, not a complete HTTP implementation or a standards conformance claim. 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:41:50.664117+00:00.

Case digest / 63ed8dfd02b0a65a3fcff0a48ab8c1f2c2f9078ce1ae1217c2ec1386d634f20b