FA-45911 / Bounded deques / Open access
Growth exposes backing capacity as live length · case 01
Growth exposes backing capacity as live length.
ROOT CAUSE
The logical size field is overwritten by the new allocation length.
VERIFIED REPAIR
Restore the documented count preservation invariant in ring-grow.
Unsuccessful approach: The partial repair still applies the incorrect transition to an admitted boundary or multi-element case.
Case contract
Grow a ring to larger positive capacity. Linearize occupied slots in logical order, clear unused storage, reset head and report next insertion index and unchanged logical count.
Why this case matters
Controlled bounded deque implementation model with explicit storage and lifecycle observations.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
slots, head, size, capacity = x
old = len(slots)
live = [slots[(head + i) % old] for i in range(size)]
new = live + [None] * (capacity - size)
new_head = 0
write = size % capacity
return [new, new_head, write, capacity]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('wrapped live data', solve([[N,None,None,N+1,N+2],3,3,7]), [[N+1,N+2,N,None,None,None,None],0,3,3])
check('empty shifted ring', solve([[None]*4,3,0,6]), [[None]*6,0,0,0])
check('one shifted value', solve([[None,N,None],1,1,5]), [[N,None,None,None,None],0,1,1])
check('full old ring', solve([[N,N+1,N+2],1,3,5]), [[N+1,N+2,N,None,None],0,3,3])
check('head zero', solve([[N,N+1,None],0,2,6]), [[N,N+1,None,None,None,None],0,2,2])
check('two wrapped values', solve([[N,None,None,N+1],3,2,8]), [[N+1,N,None,None,None,None,None,None],0,2,2])
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 |
|---|---|---|---|
| wrapped live data | [[2, 3, 1, None, None, None, None], 0, 3, 7] | [[2, 3, 1, None, None, None, None], 0, 3, 3] | Failed |
| empty shifted ring | [[None, None, None, None, None, None], 0, 0, 6] | [[None, None, None, None, None, None], 0, 0, 0] | Failed |
| one shifted value | [[1, None, None, None, None], 0, 1, 5] | [[1, None, None, None, None], 0, 1, 1] | Failed |
| full old ring | [[2, 3, 1, None, None], 0, 3, 5] | [[2, 3, 1, None, None], 0, 3, 3] | Failed |
| head zero | [[1, 2, None, None, None, None], 0, 2, 6] | [[1, 2, None, None, None, None], 0, 2, 2] | Failed |
| two wrapped values | [[2, 1, None, None, None, None, None, None], 0, 2, 8] | [[2, 1, None, None, None, None, None, None], 0, 2, 2] | Failed |
SHA-256 / 49bd8c05d72660f3f16caf9502b6f03b0115d7e1e8d35917e745d2d0a402257c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
slots, head, size, capacity = x
old = len(slots)
live = [slots[(head + i) % old] for i in range(size)]
new = live + [None] * (capacity - size)
new_head = 0
write = size % capacity
return [new, new_head, write, 0 if size == 0 else capacity]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('wrapped live data', solve([[N,None,None,N+1,N+2],3,3,7]), [[N+1,N+2,N,None,None,None,None],0,3,3])
check('empty shifted ring', solve([[None]*4,3,0,6]), [[None]*6,0,0,0])
check('one shifted value', solve([[None,N,None],1,1,5]), [[N,None,None,None,None],0,1,1])
check('full old ring', solve([[N,N+1,N+2],1,3,5]), [[N+1,N+2,N,None,None],0,3,3])
check('head zero', solve([[N,N+1,None],0,2,6]), [[N,N+1,None,None,None,None],0,2,2])
check('two wrapped values', solve([[N,None,None,N+1],3,2,8]), [[N+1,N,None,None,None,None,None,None],0,2,2])
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 |
|---|---|---|---|
| wrapped live data | [[2, 3, 1, None, None, None, None], 0, 3, 7] | [[2, 3, 1, None, None, None, None], 0, 3, 3] | Failed |
| empty shifted ring | [[None, None, None, None, None, None], 0, 0, 0] | [[None, None, None, None, None, None], 0, 0, 0] | Passed |
| one shifted value | [[1, None, None, None, None], 0, 1, 5] | [[1, None, None, None, None], 0, 1, 1] | Failed |
| full old ring | [[2, 3, 1, None, None], 0, 3, 5] | [[2, 3, 1, None, None], 0, 3, 3] | Failed |
| head zero | [[1, 2, None, None, None, None], 0, 2, 6] | [[1, 2, None, None, None, None], 0, 2, 2] | Failed |
| two wrapped values | [[2, 1, None, None, None, None, None, None], 0, 2, 8] | [[2, 1, None, None, None, None, None, None], 0, 2, 2] | Failed |
SHA-256 / 49a6e8c7d28d7974f91e090becd00c651c87113fcdee11796171753d4edad29e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
slots, head, size, capacity = x
old = len(slots)
live = [slots[(head + i) % old] for i in range(size)]
new = live + [None] * (capacity - size)
new_head = 0
write = size % capacity
return [new, new_head, write, size]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('wrapped live data', solve([[N,None,None,N+1,N+2],3,3,7]), [[N+1,N+2,N,None,None,None,None],0,3,3])
check('empty shifted ring', solve([[None]*4,3,0,6]), [[None]*6,0,0,0])
check('one shifted value', solve([[None,N,None],1,1,5]), [[N,None,None,None,None],0,1,1])
check('full old ring', solve([[N,N+1,N+2],1,3,5]), [[N+1,N+2,N,None,None],0,3,3])
check('head zero', solve([[N,N+1,None],0,2,6]), [[N,N+1,None,None,None,None],0,2,2])
check('two wrapped values', solve([[N,None,None,N+1],3,2,8]), [[N+1,N,None,None,None,None,None,None],0,2,2])
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 |
|---|---|---|---|
| wrapped live data | [[2, 3, 1, None, None, None, None], 0, 3, 3] | [[2, 3, 1, None, None, None, None], 0, 3, 3] | Passed |
| empty shifted ring | [[None, None, None, None, None, None], 0, 0, 0] | [[None, None, None, None, None, None], 0, 0, 0] | Passed |
| one shifted value | [[1, None, None, None, None], 0, 1, 1] | [[1, None, None, None, None], 0, 1, 1] | Passed |
| full old ring | [[2, 3, 1, None, None], 0, 3, 3] | [[2, 3, 1, None, None], 0, 3, 3] | Passed |
| head zero | [[1, 2, None, None, None, None], 0, 2, 2] | [[1, 2, None, None, None, None], 0, 2, 2] | Passed |
| two wrapped values | [[2, 1, None, None, None, None, None, None], 0, 2, 2] | [[2, 1, None, None, None, None, None, None], 0, 2, 2] | Passed |
SHA-256 / 74e399d4194544c3749facf917a06f10515584a78a0bebc7a6ac1ed75537ed07
Verification & scope
Offline finite deterministic model; no claim of production implementation or concurrent memory-model conformance. 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:44:26.983422+00:00.
Case digest / 359f7dbb7f4d56a30c67edc577f68cf55b5c1dda0cfe18f37e66ea41e3051bbe