FA-30716 / HTTP retries / Open access
Retry advice across wall and monotonic clocks: Relative base violates retry transition semantics · case 01
Relative base violates retry transition semantics
ROOT CAUSE
Relative base violates retry transition semantics
VERIFIED REPAIR
Restore the specified transition due=received+value.
Unsuccessful approach: The attempted repair changes the faulty site to due=value but still violates a regression oracle.
Case contract
Controlled decoded Retry-After model. response(server Date or None,Age,received monotonic,local wall at receive) resets advice. delta(nonnegative seconds) or date(absolute seconds) records one advice; multiple advice values are rejected. For date, estimate server time as Date+Age, or local wall if Date absent. Project remaining server delay onto receive monotonic clock. advance moves monotonic time forward. schedule returns remaining wait or missing/ambiguous; no network requests or full header parsing.
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):
server=None; age=0; received=0; wall=0; now=0; advice=[]; out=[]
for e in events:
if e[0]=='response':
server=e[1]; age=e[2]; received=e[3]; wall=e[4]; now=received; advice=[]
elif e[0] in ('delta','date'): advice.append((e[0],e[1]))
elif e[0]=='advance': now=max(now,e[1])
elif e[0]=='schedule':
if not advice: out.append('missing'); continue
if len(advice)!=1: out.append('ambiguous'); continue
kind,value=advice[0]
if kind=='delta': due=now+value
else:
reference=server+age if server is not None else wall
due=received+max(0,value-reference)
out.append(max(0,due-now))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('response',100,0,N,200),('schedule',)]), ['missing'])
check('2', solve([('response',100,5,N,200),('date',110),('schedule',),('advance',N+2),('schedule',)]), [5,3])
check('3', solve([('response',None,99,N,200),('date',207),('schedule',)]), [7])
check('4', solve([('response',100,0,N,200),('delta',5),('advance',N+2),('schedule',),('advance',N),('schedule',)]), [3,3])
check('5', solve([('response',100,0,N,200),('delta',5),('delta',5),('schedule',),('response',100,0,N+1,200),('schedule',)]), ['ambiguous','missing'])
check('6', solve([('response',100,0,N,200),('date',90),('schedule',),('advance',N+10),('schedule',)]), [0,0])
check('7', solve([('response',100,13,N,200),('date',120),('schedule',)]), [7])
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 | ['missing'] | ['missing'] | Passed |
| 2 | [5, 3] | [5, 3] | Passed |
| 3 | [7] | [7] | Passed |
| 4 | [5, 5] | [3, 3] | Failed |
| 5 | ['ambiguous', 'missing'] | ['ambiguous', 'missing'] | Passed |
| 6 | [0, 0] | [0, 0] | Passed |
| 7 | [7] | [7] | Passed |
SHA-256 / c91b6793c7d4c64450c4a4762827d02da31373c4970c818c56ff465e4ff73208
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
server=None; age=0; received=0; wall=0; now=0; advice=[]; out=[]
for e in events:
if e[0]=='response':
server=e[1]; age=e[2]; received=e[3]; wall=e[4]; now=received; advice=[]
elif e[0] in ('delta','date'): advice.append((e[0],e[1]))
elif e[0]=='advance': now=max(now,e[1])
elif e[0]=='schedule':
if not advice: out.append('missing'); continue
if len(advice)!=1: out.append('ambiguous'); continue
kind,value=advice[0]
if kind=='delta': due=value
else:
reference=server+age if server is not None else wall
due=received+max(0,value-reference)
out.append(max(0,due-now))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('response',100,0,N,200),('schedule',)]), ['missing'])
check('2', solve([('response',100,5,N,200),('date',110),('schedule',),('advance',N+2),('schedule',)]), [5,3])
check('3', solve([('response',None,99,N,200),('date',207),('schedule',)]), [7])
check('4', solve([('response',100,0,N,200),('delta',5),('advance',N+2),('schedule',),('advance',N),('schedule',)]), [3,3])
check('5', solve([('response',100,0,N,200),('delta',5),('delta',5),('schedule',),('response',100,0,N+1,200),('schedule',)]), ['ambiguous','missing'])
check('6', solve([('response',100,0,N,200),('date',90),('schedule',),('advance',N+10),('schedule',)]), [0,0])
check('7', solve([('response',100,13,N,200),('date',120),('schedule',)]), [7])
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 | ['missing'] | ['missing'] | Passed |
| 2 | [5, 3] | [5, 3] | Passed |
| 3 | [7] | [7] | Passed |
| 4 | [2, 2] | [3, 3] | Failed |
| 5 | ['ambiguous', 'missing'] | ['ambiguous', 'missing'] | Passed |
| 6 | [0, 0] | [0, 0] | Passed |
| 7 | [7] | [7] | Passed |
SHA-256 / 4a224414ed71ec7da8c7dd3fada86abcdac54fc1ee6f8de24ed2417e655b5418
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
server=None; age=0; received=0; wall=0; now=0; advice=[]; out=[]
for e in events:
if e[0]=='response':
server=e[1]; age=e[2]; received=e[3]; wall=e[4]; now=received; advice=[]
elif e[0] in ('delta','date'): advice.append((e[0],e[1]))
elif e[0]=='advance': now=max(now,e[1])
elif e[0]=='schedule':
if not advice: out.append('missing'); continue
if len(advice)!=1: out.append('ambiguous'); continue
kind,value=advice[0]
if kind=='delta': due=received+value
else:
reference=server+age if server is not None else wall
due=received+max(0,value-reference)
out.append(max(0,due-now))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [])
check('1', solve([('response',100,0,N,200),('schedule',)]), ['missing'])
check('2', solve([('response',100,5,N,200),('date',110),('schedule',),('advance',N+2),('schedule',)]), [5,3])
check('3', solve([('response',None,99,N,200),('date',207),('schedule',)]), [7])
check('4', solve([('response',100,0,N,200),('delta',5),('advance',N+2),('schedule',),('advance',N),('schedule',)]), [3,3])
check('5', solve([('response',100,0,N,200),('delta',5),('delta',5),('schedule',),('response',100,0,N+1,200),('schedule',)]), ['ambiguous','missing'])
check('6', solve([('response',100,0,N,200),('date',90),('schedule',),('advance',N+10),('schedule',)]), [0,0])
check('7', solve([('response',100,13,N,200),('date',120),('schedule',)]), [7])
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 | ['missing'] | ['missing'] | Passed |
| 2 | [5, 3] | [5, 3] | Passed |
| 3 | [7] | [7] | Passed |
| 4 | [3, 3] | [3, 3] | Passed |
| 5 | ['ambiguous', 'missing'] | ['ambiguous', 'missing'] | Passed |
| 6 | [0, 0] | [0, 0] | Passed |
| 7 | [7] | [7] | Passed |
SHA-256 / c5d80a71e09011e5b2da8d8167a3d9840c344a144bf963595ab2a32e4ff54905
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:55.462077+00:00.
Case digest / 540b1b054eb86d8a636c1bbb678eae894c73c9ff4cbe0a05f46a2791569bf9ea