FAILURE MAP
← Case archive

FA-29491 / HTTP retries / Open access

Nested client retry ownership: Successful nested requests retain retry scopes · case 01

Successful nested requests retain retry scopes

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

ROOT CAUSE

Successful nested requests retain retry scopes

VERIFIED REPAIR

Restore the specified transition stack.clear().

Unsuccessful approach: The attempted repair changes the faulty site to stack[:]=stack[:-1] but still violates a regression oracle.

Case contract

enter(layer, allowance) pushes a retry scope. A child with any ancestor delegates retry to the oldest scope and never spends its local cap. fail returns retry/exhausted charged to oldest scope. leave pops the current scope; success clears every scope. Return decision pairs and remaining scope budgets.

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):
    stack=[]; out=[]
    for e in events:
        if e[0]=='enter':
            stack.append([e[1],e[2],0])
        elif e[0]=='leave':
            if stack: stack.pop()
        elif e[0]=='success':
            stack[:]=stack[:1]
        elif e[0]=='fail':
            if not stack:
                out.append(['unowned',None]); continue
            owner=stack[0]
            if owner[2]>=owner[1]:
                out.append(['exhausted',owner[0]])
            else:
                owner[2]+=1
                out.append(['retry',owner[0]])
    return [out,stack]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [[],[]])
check('1', solve([('fail',)]), [[['unowned',None]],[]])
check('2', solve([('enter','outer',2),('enter','inner',9),('fail',),('fail',),('fail',)]), [[['retry','outer'],['retry','outer'],['exhausted','outer']],[['outer',2,2],['inner',9,0]]])
check('3', solve([('enter','only',N),('fail',)]), [[['retry','only']],[['only',N,1]]])
check('4', solve([('enter','outer',1),('enter','inner',1),('leave',),('fail',)]), [[['retry','outer']],[['outer',1,1]]])
check('5', solve([('enter','a',0),('enter','b',N),('success',),('fail',)]), [[['unowned',None]],[]])
check('6', solve([('enter','a',0),('fail',),('leave',),('leave',)]), [[['exhausted','a']],[]])
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[[['unowned', None]], []][[['unowned', None]], []]Passed
2[[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]][[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]]Passed
3[[['retry', 'only']], [['only', 1, 1]]][[['retry', 'only']], [['only', 1, 1]]]Passed
4[[['retry', 'outer']], [['outer', 1, 1]]][[['retry', 'outer']], [['outer', 1, 1]]]Passed
5[[['exhausted', 'a']], [['a', 0, 0]]][[['unowned', None]], []]Failed
6[[['exhausted', 'a']], []][[['exhausted', 'a']], []]Passed

SHA-256 / b400435433780235456e0318e0fbfe84d1d91e2811384be625f5a02b6cdc6c24

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(events):
    stack=[]; out=[]
    for e in events:
        if e[0]=='enter':
            stack.append([e[1],e[2],0])
        elif e[0]=='leave':
            if stack: stack.pop()
        elif e[0]=='success':
            stack[:]=stack[:-1]
        elif e[0]=='fail':
            if not stack:
                out.append(['unowned',None]); continue
            owner=stack[0]
            if owner[2]>=owner[1]:
                out.append(['exhausted',owner[0]])
            else:
                owner[2]+=1
                out.append(['retry',owner[0]])
    return [out,stack]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [[],[]])
check('1', solve([('fail',)]), [[['unowned',None]],[]])
check('2', solve([('enter','outer',2),('enter','inner',9),('fail',),('fail',),('fail',)]), [[['retry','outer'],['retry','outer'],['exhausted','outer']],[['outer',2,2],['inner',9,0]]])
check('3', solve([('enter','only',N),('fail',)]), [[['retry','only']],[['only',N,1]]])
check('4', solve([('enter','outer',1),('enter','inner',1),('leave',),('fail',)]), [[['retry','outer']],[['outer',1,1]]])
check('5', solve([('enter','a',0),('enter','b',N),('success',),('fail',)]), [[['unowned',None]],[]])
check('6', solve([('enter','a',0),('fail',),('leave',),('leave',)]), [[['exhausted','a']],[]])
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[[['unowned', None]], []][[['unowned', None]], []]Passed
2[[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]][[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]]Passed
3[[['retry', 'only']], [['only', 1, 1]]][[['retry', 'only']], [['only', 1, 1]]]Passed
4[[['retry', 'outer']], [['outer', 1, 1]]][[['retry', 'outer']], [['outer', 1, 1]]]Passed
5[[['exhausted', 'a']], [['a', 0, 0]]][[['unowned', None]], []]Failed
6[[['exhausted', 'a']], []][[['exhausted', 'a']], []]Passed

SHA-256 / d22903f2a0ec9533f0c293059d74eb14aae41b01ba476e5c8cb9ec76ce66627e

3 / The verified repair

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

N = 1
observations = []
def solve(events):
    stack=[]; out=[]
    for e in events:
        if e[0]=='enter':
            stack.append([e[1],e[2],0])
        elif e[0]=='leave':
            if stack: stack.pop()
        elif e[0]=='success':
            stack.clear()
        elif e[0]=='fail':
            if not stack:
                out.append(['unowned',None]); continue
            owner=stack[0]
            if owner[2]>=owner[1]:
                out.append(['exhausted',owner[0]])
            else:
                owner[2]+=1
                out.append(['retry',owner[0]])
    return [out,stack]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([]), [[],[]])
check('1', solve([('fail',)]), [[['unowned',None]],[]])
check('2', solve([('enter','outer',2),('enter','inner',9),('fail',),('fail',),('fail',)]), [[['retry','outer'],['retry','outer'],['exhausted','outer']],[['outer',2,2],['inner',9,0]]])
check('3', solve([('enter','only',N),('fail',)]), [[['retry','only']],[['only',N,1]]])
check('4', solve([('enter','outer',1),('enter','inner',1),('leave',),('fail',)]), [[['retry','outer']],[['outer',1,1]]])
check('5', solve([('enter','a',0),('enter','b',N),('success',),('fail',)]), [[['unowned',None]],[]])
check('6', solve([('enter','a',0),('fail',),('leave',),('leave',)]), [[['exhausted','a']],[]])
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[[['unowned', None]], []][[['unowned', None]], []]Passed
2[[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]][[['retry', 'outer'], ['retry', 'outer'], ['exhausted', 'outer']], [['outer', 2, 2], ['inner', 9, 0]]]Passed
3[[['retry', 'only']], [['only', 1, 1]]][[['retry', 'only']], [['only', 1, 1]]]Passed
4[[['retry', 'outer']], [['outer', 1, 1]]][[['retry', 'outer']], [['outer', 1, 1]]]Passed
5[[['unowned', None]], []][[['unowned', None]], []]Passed
6[[['exhausted', 'a']], []][[['exhausted', 'a']], []]Passed

SHA-256 / 048e1a057db3094c6f347897dd4e56eb50b6e8fc629d0b04d5de6513b1857145

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

Case digest / f7587df7531a688bd14ca78464d66b309f4f739f999adb40270bff75cf09520e