FAILURE MAP
← Case archive

FA-30201 / HTTP retries / Open access

In-flight retry policy capture: Unknown failure violates retry transition semantics · case 01

Unknown failure violates retry transition semantics

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

ROOT CAUSE

Unknown failure violates retry transition semantics

VERIFIED REPAIR

Restore the specified transition out.append('unknown'); continue.

Unsuccessful approach: The attempted repair changes the faulty site to out.append(['stop',current[0]]); continue 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(['retry',current[0]]); 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[['retry', 0]]['unknown']Failed
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[['retry', 1], ['retry', 1]]['unknown', ['retry', 1]]Failed

SHA-256 / 675bc237a79c20d57c89ec1b44e4e78c2e13dcd492a197823a23f99b683d773b

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(['stop',current[0]]); 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[['stop', 0]]['unknown']Failed
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[['stop', 1], ['retry', 1]]['unknown', ['retry', 1]]Failed

SHA-256 / bfaf038b339ce59ebf643af182d558e4ffeaaf2439d188fb01dfe087b9f022a9

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

Case digest / 7f3ab97d40de974e7bcca2a599fafcc941068d40bc4a96078099c0c99d5ebeee