FA-47216 / Bounded deques / Open access
Failed deque mutation leaves a committed-looking epoch bump · case 01
Failed deque mutation leaves a committed-looking epoch bump.
ROOT CAUSE
Failed deque mutation leaves a committed-looking epoch bump.
VERIFIED REPAIR
Restore the documented rollback version invariant in mutation-rollback.
Unsuccessful approach: The partial repair still applies the incorrect transition to an admitted boundary or multi-element case.
Case contract
Undo a failed bounded ring mutation from a before-image journal. Replay writes newest-first, restore captured head/size/epoch, release reserved capacity, reclaim newly allocated blocks newest-first and consume the journal.
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,journal,old_head,old_size,old_epoch,reserved,created=x
restored=slots[:]
for index,value in reversed(journal):restored[index]=value
head=old_head
size=old_size
epoch=old_epoch+1
permits=0
reclaimed=created[::-1]
remaining=[]
return [restored,head,size,epoch,permits,reclaimed,remaining]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([[N+2,None],[[0,N],[0,N+1]],1,1,3,2,[4,5]]), {1: [[1, None], 1, 1, 3, 0, [5, 4], []], 2: [[2, None], 1, 1, 3, 0, [5, 4], []], 3: [[3, None], 1, 1, 3, 0, [5, 4], []], 4: [[4, None], 1, 1, 3, 0, [5, 4], []], 5: [[5, None], 1, 1, 3, 0, [5, 4], []]}[N])
check('1', solve([[N,N+1,N+2],[[1,None],[2,None]],0,1,2,1,[7]]), {1: [[1, None, None], 0, 1, 2, 0, [7], []], 2: [[2, None, None], 0, 1, 2, 0, [7], []], 3: [[3, None, None], 0, 1, 2, 0, [7], []], 4: [[4, None, None], 0, 1, 2, 0, [7], []], 5: [[5, None, None], 0, 1, 2, 0, [7], []]}[N])
check('2', solve([[N],[],0,1,4,0,[]]), {1: [[1], 0, 1, 4, 0, [], []], 2: [[2], 0, 1, 4, 0, [], []], 3: [[3], 0, 1, 4, 0, [], []], 4: [[4], 0, 1, 4, 0, [], []], 5: [[5], 0, 1, 4, 0, [], []]}[N])
check('3', solve([[None,N+1,None],[[1,N]],1,1,0,1,[8,9,10]]), {1: [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []], 2: [[None, 2, None], 1, 1, 0, 0, [10, 9, 8], []], 3: [[None, 3, None], 1, 1, 0, 0, [10, 9, 8], []], 4: [[None, 4, None], 1, 1, 0, 0, [10, 9, 8], []], 5: [[None, 5, None], 1, 1, 0, 0, [10, 9, 8], []]}[N])
check('4', solve([[N,N+1],[[0,None],[1,None]],1,0,2,2,[3,6]]), {1: [[None, None], 1, 0, 2, 0, [6, 3], []], 2: [[None, None], 1, 0, 2, 0, [6, 3], []], 3: [[None, None], 1, 0, 2, 0, [6, 3], []], 4: [[None, None], 1, 0, 2, 0, [6, 3], []], 5: [[None, None], 1, 0, 2, 0, [6, 3], []]}[N])
check('5', solve([[N+3,N+1],[[0,N],[0,N+2]],0,2,7,3,[4,7]]), {1: [[1, 2], 0, 2, 7, 0, [7, 4], []], 2: [[2, 3], 0, 2, 7, 0, [7, 4], []], 3: [[3, 4], 0, 2, 7, 0, [7, 4], []], 4: [[4, 5], 0, 2, 7, 0, [7, 4], []], 5: [[5, 6], 0, 2, 7, 0, [7, 4], []]}[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 | [[1, None], 1, 1, 4, 0, [5, 4], []] | [[1, None], 1, 1, 3, 0, [5, 4], []] | Failed |
| 1 | [[1, None, None], 0, 1, 3, 0, [7], []] | [[1, None, None], 0, 1, 2, 0, [7], []] | Failed |
| 2 | [[1], 0, 1, 5, 0, [], []] | [[1], 0, 1, 4, 0, [], []] | Failed |
| 3 | [[None, 1, None], 1, 1, 1, 0, [10, 9, 8], []] | [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []] | Failed |
| 4 | [[None, None], 1, 0, 3, 0, [6, 3], []] | [[None, None], 1, 0, 2, 0, [6, 3], []] | Failed |
| 5 | [[1, 2], 0, 2, 8, 0, [7, 4], []] | [[1, 2], 0, 2, 7, 0, [7, 4], []] | Failed |
SHA-256 / 74c60b994e515386b1df8b19352d114c9ec40dd25033cdce1d3a3a84fd3e24ce
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
slots,journal,old_head,old_size,old_epoch,reserved,created=x
restored=slots[:]
for index,value in reversed(journal):restored[index]=value
head=old_head
size=old_size
epoch=old_epoch if not journal else old_epoch+1
permits=0
reclaimed=created[::-1]
remaining=[]
return [restored,head,size,epoch,permits,reclaimed,remaining]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([[N+2,None],[[0,N],[0,N+1]],1,1,3,2,[4,5]]), {1: [[1, None], 1, 1, 3, 0, [5, 4], []], 2: [[2, None], 1, 1, 3, 0, [5, 4], []], 3: [[3, None], 1, 1, 3, 0, [5, 4], []], 4: [[4, None], 1, 1, 3, 0, [5, 4], []], 5: [[5, None], 1, 1, 3, 0, [5, 4], []]}[N])
check('1', solve([[N,N+1,N+2],[[1,None],[2,None]],0,1,2,1,[7]]), {1: [[1, None, None], 0, 1, 2, 0, [7], []], 2: [[2, None, None], 0, 1, 2, 0, [7], []], 3: [[3, None, None], 0, 1, 2, 0, [7], []], 4: [[4, None, None], 0, 1, 2, 0, [7], []], 5: [[5, None, None], 0, 1, 2, 0, [7], []]}[N])
check('2', solve([[N],[],0,1,4,0,[]]), {1: [[1], 0, 1, 4, 0, [], []], 2: [[2], 0, 1, 4, 0, [], []], 3: [[3], 0, 1, 4, 0, [], []], 4: [[4], 0, 1, 4, 0, [], []], 5: [[5], 0, 1, 4, 0, [], []]}[N])
check('3', solve([[None,N+1,None],[[1,N]],1,1,0,1,[8,9,10]]), {1: [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []], 2: [[None, 2, None], 1, 1, 0, 0, [10, 9, 8], []], 3: [[None, 3, None], 1, 1, 0, 0, [10, 9, 8], []], 4: [[None, 4, None], 1, 1, 0, 0, [10, 9, 8], []], 5: [[None, 5, None], 1, 1, 0, 0, [10, 9, 8], []]}[N])
check('4', solve([[N,N+1],[[0,None],[1,None]],1,0,2,2,[3,6]]), {1: [[None, None], 1, 0, 2, 0, [6, 3], []], 2: [[None, None], 1, 0, 2, 0, [6, 3], []], 3: [[None, None], 1, 0, 2, 0, [6, 3], []], 4: [[None, None], 1, 0, 2, 0, [6, 3], []], 5: [[None, None], 1, 0, 2, 0, [6, 3], []]}[N])
check('5', solve([[N+3,N+1],[[0,N],[0,N+2]],0,2,7,3,[4,7]]), {1: [[1, 2], 0, 2, 7, 0, [7, 4], []], 2: [[2, 3], 0, 2, 7, 0, [7, 4], []], 3: [[3, 4], 0, 2, 7, 0, [7, 4], []], 4: [[4, 5], 0, 2, 7, 0, [7, 4], []], 5: [[5, 6], 0, 2, 7, 0, [7, 4], []]}[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 | [[1, None], 1, 1, 4, 0, [5, 4], []] | [[1, None], 1, 1, 3, 0, [5, 4], []] | Failed |
| 1 | [[1, None, None], 0, 1, 3, 0, [7], []] | [[1, None, None], 0, 1, 2, 0, [7], []] | Failed |
| 2 | [[1], 0, 1, 4, 0, [], []] | [[1], 0, 1, 4, 0, [], []] | Passed |
| 3 | [[None, 1, None], 1, 1, 1, 0, [10, 9, 8], []] | [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []] | Failed |
| 4 | [[None, None], 1, 0, 3, 0, [6, 3], []] | [[None, None], 1, 0, 2, 0, [6, 3], []] | Failed |
| 5 | [[1, 2], 0, 2, 8, 0, [7, 4], []] | [[1, 2], 0, 2, 7, 0, [7, 4], []] | Failed |
SHA-256 / ead9d7a44af8d4ae61dff9f1ef5ae16d118854bc2b5561d73375d43e75747cfe
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
slots,journal,old_head,old_size,old_epoch,reserved,created=x
restored=slots[:]
for index,value in reversed(journal):restored[index]=value
head=old_head
size=old_size
epoch=old_epoch
permits=0
reclaimed=created[::-1]
remaining=[]
return [restored,head,size,epoch,permits,reclaimed,remaining]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('0', solve([[N+2,None],[[0,N],[0,N+1]],1,1,3,2,[4,5]]), {1: [[1, None], 1, 1, 3, 0, [5, 4], []], 2: [[2, None], 1, 1, 3, 0, [5, 4], []], 3: [[3, None], 1, 1, 3, 0, [5, 4], []], 4: [[4, None], 1, 1, 3, 0, [5, 4], []], 5: [[5, None], 1, 1, 3, 0, [5, 4], []]}[N])
check('1', solve([[N,N+1,N+2],[[1,None],[2,None]],0,1,2,1,[7]]), {1: [[1, None, None], 0, 1, 2, 0, [7], []], 2: [[2, None, None], 0, 1, 2, 0, [7], []], 3: [[3, None, None], 0, 1, 2, 0, [7], []], 4: [[4, None, None], 0, 1, 2, 0, [7], []], 5: [[5, None, None], 0, 1, 2, 0, [7], []]}[N])
check('2', solve([[N],[],0,1,4,0,[]]), {1: [[1], 0, 1, 4, 0, [], []], 2: [[2], 0, 1, 4, 0, [], []], 3: [[3], 0, 1, 4, 0, [], []], 4: [[4], 0, 1, 4, 0, [], []], 5: [[5], 0, 1, 4, 0, [], []]}[N])
check('3', solve([[None,N+1,None],[[1,N]],1,1,0,1,[8,9,10]]), {1: [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []], 2: [[None, 2, None], 1, 1, 0, 0, [10, 9, 8], []], 3: [[None, 3, None], 1, 1, 0, 0, [10, 9, 8], []], 4: [[None, 4, None], 1, 1, 0, 0, [10, 9, 8], []], 5: [[None, 5, None], 1, 1, 0, 0, [10, 9, 8], []]}[N])
check('4', solve([[N,N+1],[[0,None],[1,None]],1,0,2,2,[3,6]]), {1: [[None, None], 1, 0, 2, 0, [6, 3], []], 2: [[None, None], 1, 0, 2, 0, [6, 3], []], 3: [[None, None], 1, 0, 2, 0, [6, 3], []], 4: [[None, None], 1, 0, 2, 0, [6, 3], []], 5: [[None, None], 1, 0, 2, 0, [6, 3], []]}[N])
check('5', solve([[N+3,N+1],[[0,N],[0,N+2]],0,2,7,3,[4,7]]), {1: [[1, 2], 0, 2, 7, 0, [7, 4], []], 2: [[2, 3], 0, 2, 7, 0, [7, 4], []], 3: [[3, 4], 0, 2, 7, 0, [7, 4], []], 4: [[4, 5], 0, 2, 7, 0, [7, 4], []], 5: [[5, 6], 0, 2, 7, 0, [7, 4], []]}[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 | [[1, None], 1, 1, 3, 0, [5, 4], []] | [[1, None], 1, 1, 3, 0, [5, 4], []] | Passed |
| 1 | [[1, None, None], 0, 1, 2, 0, [7], []] | [[1, None, None], 0, 1, 2, 0, [7], []] | Passed |
| 2 | [[1], 0, 1, 4, 0, [], []] | [[1], 0, 1, 4, 0, [], []] | Passed |
| 3 | [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []] | [[None, 1, None], 1, 1, 0, 0, [10, 9, 8], []] | Passed |
| 4 | [[None, None], 1, 0, 2, 0, [6, 3], []] | [[None, None], 1, 0, 2, 0, [6, 3], []] | Passed |
| 5 | [[1, 2], 0, 2, 7, 0, [7, 4], []] | [[1, 2], 0, 2, 7, 0, [7, 4], []] | Passed |
SHA-256 / 02415cca25c95fcb919451d53a2274923d681c8b60a42d385a95ebb70b03d358
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:39.386230+00:00.
Case digest / 0ab3a8a3edd48c7a00f60711ebc20efd066e5068ca59a4713deed211a52b40dd