FA-30221 / HTTP retries / Open access
In-flight retry policy capture: Charge request violates retry transition semantics · case 01
Charge request violates retry transition semantics
ROOT CAUSE
Charge request violates retry transition semantics
VERIFIED REPAIR
Restore the specified transition requests[e[1]][1]+=1.
Unsuccessful approach: The attempted repair changes the faulty site to requests[e[1]][1]+=2 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] 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], ['retry', 1]] | [['retry', 1], ['retry', 1], ['exhausted', 1]] | Failed |
| 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 / 5163d6b03e44174b26c7cfc6932fbfc329da16d6ea299999cd1edee741a474d8
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] not in statuses: out.append(['stop',version]); continue
if used>=cap: out.append(['exhausted',version]); continue
requests[e[1]][1]+=2
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], ['exhausted', 1], ['exhausted', 1]] | [['retry', 1], ['retry', 1], ['exhausted', 1]] | Failed |
| 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 / 370c0058b7b8ef6ce73ef2b9aafd7a2044c4b127603dcc7d0912c8e6a9efca30
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.831104+00:00.
Case digest / cacf712e4f852f47d35f4a7086350576e776ea6e5a080a6cf6bcdc46c8022a2a