FA-30196 / HTTP retries / Open access
In-flight retry policy capture: Finish removal violates retry transition semantics · case 01
Finish removal violates retry transition semantics
ROOT CAUSE
Finish removal violates retry transition semantics
VERIFIED REPAIR
Restore the specified transition requests.pop(e[1],None).
Unsuccessful approach: The attempted repair changes the faulty site to requests.clear() 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("global",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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 | [['retry', 1], ['retry', 1]] | ['unknown', ['retry', 1]] | Failed |
SHA-256 / 02af962eb2e8501ac8b5f653e30ffe22fd3c46a203d865ce3e135f92539042f5
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.clear()
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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', 'unknown'] | ['unknown', ['retry', 1]] | Failed |
SHA-256 / 3dabdcfd7757b9b6d9d7e2360097b8cd2cf83b78199a462e45de710bb004a42c
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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.561054+00:00.
Case digest / c413a19caeb6dcddbfbf72608ec0bb11d744cb2784545f232b78370955f15509