FA-23616 / Client state / Open access
Client persistence write transaction: Failed write retry buffer · case 01
Failed write retry buffer.
ROOT CAUSE
The failed-write-retry-buffer client decision evaluates `None` instead of `draft if outcome!='ok' else None`.
VERIFIED REPAIR
Apply the modeled failed-write-retry-buffer rule: `draft if outcome!='ok' else None`.
Unsuccessful approach: The partial repair `draft if outcome=='quota' else None` still violates the explicit fixture contract.
Case contract
A debounced local snapshot write commits saved data only after a permitted successful write. Failures retain dirty edits, no-op snapshots avoid writes, and timer deadlines include equality. Operation failed-write-retry-buffer has the six explicit input/output oracles below.
Why this case matters
An offline client lifecycle model that isolates a state-management defect without DOM rendering or network services.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(operation, s):
saved, draft, dirty, writable, outcome, scheduled, now, debounce = s
if operation == 'commit-only-on-success':
return draft if outcome=='ok' and writable else saved
if operation == 'retain-dirty-on-quota':
return dirty and (not writable or outcome!='ok')
if operation == 'schedule-debounce':
return None if not dirty else (now+debounce if scheduled is None else scheduled)
if operation == 'flush-deadline-inclusive':
return scheduled is not None and now>=scheduled+debounce
if operation == 'write-permission-gate':
return dirty and writable
if operation == 'success-cancels-timer':
return None if outcome=='ok' else scheduled
if operation == 'quota-error-classification':
return 'storage-full' if outcome=='quota' else ('unavailable' if not writable else None)
if operation == 'unchanged-write-suppression':
return draft!=saved
if operation == 'failed-write-retry-buffer':
return None
if operation == 'timer-delay-remaining':
return max(0,scheduled+debounce-now) if scheduled is not None else None
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('commit-only-on-success scenario 1', solve('commit-only-on-success', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), {'a':N+2})
check('commit-only-on-success scenario 2', solve('commit-only-on-success', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':N})
check('commit-only-on-success scenario 3', solve('commit-only-on-success', ({}, {},False,True,'ok',None,5,2)), {})
check('commit-only-on-success scenario 4', solve('commit-only-on-success', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':1})
check('commit-only-on-success scenario 5', solve('commit-only-on-success', ({'a':0},{'a':None},True,True,'ok',3,5,2)), {'a':None})
check('commit-only-on-success scenario 6', solve('commit-only-on-success', ({'a':N},{'a':N},False,False,'ok',2,9,2)), {'a':N})
check('retain-dirty-on-quota scenario 1', solve('retain-dirty-on-quota', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), False)
check('retain-dirty-on-quota scenario 2', solve('retain-dirty-on-quota', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('retain-dirty-on-quota scenario 3', solve('retain-dirty-on-quota', ({}, {},False,True,'ok',None,5,2)), False)
check('retain-dirty-on-quota scenario 4', solve('retain-dirty-on-quota', ({'a':1},{'a':N},True,False,'denied',None,5,0)), True)
check('retain-dirty-on-quota scenario 5', solve('retain-dirty-on-quota', ({'a':0},{'a':None},True,True,'ok',3,5,2)), False)
check('retain-dirty-on-quota scenario 6', solve('retain-dirty-on-quota', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('schedule-debounce scenario 1', solve('schedule-debounce', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 2)
check('schedule-debounce scenario 2', solve('schedule-debounce', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('schedule-debounce scenario 3', solve('schedule-debounce', ({}, {},False,True,'ok',None,5,2)), None)
check('schedule-debounce scenario 4', solve('schedule-debounce', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 5)
check('schedule-debounce scenario 5', solve('schedule-debounce', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 3)
check('schedule-debounce scenario 6', solve('schedule-debounce', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('flush-deadline-inclusive scenario 1', solve('flush-deadline-inclusive', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('flush-deadline-inclusive scenario 2', solve('flush-deadline-inclusive', ({'a':N},{'a':0},True,True,'quota',3,4,2)), False)
check('flush-deadline-inclusive scenario 3', solve('flush-deadline-inclusive', ({}, {},False,True,'ok',None,5,2)), False)
check('flush-deadline-inclusive scenario 4', solve('flush-deadline-inclusive', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('flush-deadline-inclusive scenario 5', solve('flush-deadline-inclusive', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('flush-deadline-inclusive scenario 6', solve('flush-deadline-inclusive', ({'a':N},{'a':N},False,False,'ok',2,9,2)), True)
check('write-permission-gate scenario 1', solve('write-permission-gate', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('write-permission-gate scenario 2', solve('write-permission-gate', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('write-permission-gate scenario 3', solve('write-permission-gate', ({}, {},False,True,'ok',None,5,2)), False)
check('write-permission-gate scenario 4', solve('write-permission-gate', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('write-permission-gate scenario 5', solve('write-permission-gate', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('write-permission-gate scenario 6', solve('write-permission-gate', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('success-cancels-timer scenario 1', solve('success-cancels-timer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('success-cancels-timer scenario 2', solve('success-cancels-timer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('success-cancels-timer scenario 3', solve('success-cancels-timer', ({}, {},False,True,'ok',None,5,2)), None)
check('success-cancels-timer scenario 4', solve('success-cancels-timer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('success-cancels-timer scenario 5', solve('success-cancels-timer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('success-cancels-timer scenario 6', solve('success-cancels-timer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('quota-error-classification scenario 1', solve('quota-error-classification', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('quota-error-classification scenario 2', solve('quota-error-classification', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 'storage-full')
check('quota-error-classification scenario 3', solve('quota-error-classification', ({}, {},False,True,'ok',None,5,2)), None)
check('quota-error-classification scenario 4', solve('quota-error-classification', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 'unavailable')
check('quota-error-classification scenario 5', solve('quota-error-classification', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('quota-error-classification scenario 6', solve('quota-error-classification', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 'unavailable')
check('unchanged-write-suppression scenario 1', solve('unchanged-write-suppression', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('unchanged-write-suppression scenario 2', solve('unchanged-write-suppression', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('unchanged-write-suppression scenario 3', solve('unchanged-write-suppression', ({}, {},False,True,'ok',None,5,2)), False)
check('unchanged-write-suppression scenario 4', solve('unchanged-write-suppression', ({'a':1},{'a':N},True,False,'denied',None,5,0)), N!=1)
check('unchanged-write-suppression scenario 5', solve('unchanged-write-suppression', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('unchanged-write-suppression scenario 6', solve('unchanged-write-suppression', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('failed-write-retry-buffer scenario 1', solve('failed-write-retry-buffer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('failed-write-retry-buffer scenario 2', solve('failed-write-retry-buffer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':0})
check('failed-write-retry-buffer scenario 3', solve('failed-write-retry-buffer', ({}, {},False,True,'ok',None,5,2)), None)
check('failed-write-retry-buffer scenario 4', solve('failed-write-retry-buffer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':N})
check('failed-write-retry-buffer scenario 5', solve('failed-write-retry-buffer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('failed-write-retry-buffer scenario 6', solve('failed-write-retry-buffer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('timer-delay-remaining scenario 1', solve('timer-delay-remaining', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 0)
check('timer-delay-remaining scenario 2', solve('timer-delay-remaining', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 1)
check('timer-delay-remaining scenario 3', solve('timer-delay-remaining', ({}, {},False,True,'ok',None,5,2)), None)
check('timer-delay-remaining scenario 4', solve('timer-delay-remaining', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('timer-delay-remaining scenario 5', solve('timer-delay-remaining', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 0)
check('timer-delay-remaining scenario 6', solve('timer-delay-remaining', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 0)
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 |
|---|---|---|---|
| commit-only-on-success scenario 1 | {'a': 3} | {'a': 3} | Passed |
| commit-only-on-success scenario 2 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 3 | {} | {} | Passed |
| commit-only-on-success scenario 4 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 5 | {'a': None} | {'a': None} | Passed |
| commit-only-on-success scenario 6 | {'a': 1} | {'a': 1} | Passed |
| retain-dirty-on-quota scenario 1 | False | False | Passed |
| retain-dirty-on-quota scenario 2 | True | True | Passed |
| retain-dirty-on-quota scenario 3 | False | False | Passed |
| retain-dirty-on-quota scenario 4 | True | True | Passed |
| retain-dirty-on-quota scenario 5 | False | False | Passed |
| retain-dirty-on-quota scenario 6 | False | False | Passed |
| schedule-debounce scenario 1 | 2 | 2 | Passed |
| schedule-debounce scenario 2 | 3 | 3 | Passed |
| schedule-debounce scenario 3 | None | None | Passed |
| schedule-debounce scenario 4 | 5 | 5 | Passed |
| schedule-debounce scenario 5 | 3 | 3 | Passed |
| schedule-debounce scenario 6 | None | None | Passed |
| flush-deadline-inclusive scenario 1 | True | True | Passed |
| flush-deadline-inclusive scenario 2 | False | False | Passed |
| flush-deadline-inclusive scenario 3 | False | False | Passed |
| flush-deadline-inclusive scenario 4 | False | False | Passed |
| flush-deadline-inclusive scenario 5 | True | True | Passed |
| flush-deadline-inclusive scenario 6 | True | True | Passed |
| write-permission-gate scenario 1 | True | True | Passed |
| write-permission-gate scenario 2 | True | True | Passed |
| write-permission-gate scenario 3 | False | False | Passed |
| write-permission-gate scenario 4 | False | False | Passed |
| write-permission-gate scenario 5 | True | True | Passed |
| write-permission-gate scenario 6 | False | False | Passed |
| success-cancels-timer scenario 1 | None | None | Passed |
| success-cancels-timer scenario 2 | 3 | 3 | Passed |
| success-cancels-timer scenario 3 | None | None | Passed |
| success-cancels-timer scenario 4 | None | None | Passed |
| success-cancels-timer scenario 5 | None | None | Passed |
| success-cancels-timer scenario 6 | None | None | Passed |
| quota-error-classification scenario 1 | None | None | Passed |
| quota-error-classification scenario 2 | storage-full | storage-full | Passed |
| quota-error-classification scenario 3 | None | None | Passed |
| quota-error-classification scenario 4 | unavailable | unavailable | Passed |
| quota-error-classification scenario 5 | None | None | Passed |
| quota-error-classification scenario 6 | unavailable | unavailable | Passed |
| unchanged-write-suppression scenario 1 | True | True | Passed |
| unchanged-write-suppression scenario 2 | True | True | Passed |
| unchanged-write-suppression scenario 3 | False | False | Passed |
| unchanged-write-suppression scenario 4 | False | False | Passed |
| unchanged-write-suppression scenario 5 | True | True | Passed |
| unchanged-write-suppression scenario 6 | False | False | Passed |
| failed-write-retry-buffer scenario 1 | None | None | Passed |
| failed-write-retry-buffer scenario 2 | None | {'a': 0} | Failed |
| failed-write-retry-buffer scenario 3 | None | None | Passed |
| failed-write-retry-buffer scenario 4 | None | {'a': 1} | Failed |
| failed-write-retry-buffer scenario 5 | None | None | Passed |
| failed-write-retry-buffer scenario 6 | None | None | Passed |
| timer-delay-remaining scenario 1 | 0 | 0 | Passed |
| timer-delay-remaining scenario 2 | 1 | 1 | Passed |
| timer-delay-remaining scenario 3 | None | None | Passed |
| timer-delay-remaining scenario 4 | None | None | Passed |
| timer-delay-remaining scenario 5 | 0 | 0 | Passed |
| timer-delay-remaining scenario 6 | 0 | 0 | Passed |
SHA-256 / 4e7172f3061cc1bc7a14973ba1f72bf8ec1f3ed0e4ecd96f6a6d1c12f2be3fce
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(operation, s):
saved, draft, dirty, writable, outcome, scheduled, now, debounce = s
if operation == 'commit-only-on-success':
return draft if outcome=='ok' and writable else saved
if operation == 'retain-dirty-on-quota':
return dirty and (not writable or outcome!='ok')
if operation == 'schedule-debounce':
return None if not dirty else (now+debounce if scheduled is None else scheduled)
if operation == 'flush-deadline-inclusive':
return scheduled is not None and now>=scheduled+debounce
if operation == 'write-permission-gate':
return dirty and writable
if operation == 'success-cancels-timer':
return None if outcome=='ok' else scheduled
if operation == 'quota-error-classification':
return 'storage-full' if outcome=='quota' else ('unavailable' if not writable else None)
if operation == 'unchanged-write-suppression':
return draft!=saved
if operation == 'failed-write-retry-buffer':
return draft if outcome=='quota' else None
if operation == 'timer-delay-remaining':
return max(0,scheduled+debounce-now) if scheduled is not None else None
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('commit-only-on-success scenario 1', solve('commit-only-on-success', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), {'a':N+2})
check('commit-only-on-success scenario 2', solve('commit-only-on-success', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':N})
check('commit-only-on-success scenario 3', solve('commit-only-on-success', ({}, {},False,True,'ok',None,5,2)), {})
check('commit-only-on-success scenario 4', solve('commit-only-on-success', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':1})
check('commit-only-on-success scenario 5', solve('commit-only-on-success', ({'a':0},{'a':None},True,True,'ok',3,5,2)), {'a':None})
check('commit-only-on-success scenario 6', solve('commit-only-on-success', ({'a':N},{'a':N},False,False,'ok',2,9,2)), {'a':N})
check('retain-dirty-on-quota scenario 1', solve('retain-dirty-on-quota', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), False)
check('retain-dirty-on-quota scenario 2', solve('retain-dirty-on-quota', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('retain-dirty-on-quota scenario 3', solve('retain-dirty-on-quota', ({}, {},False,True,'ok',None,5,2)), False)
check('retain-dirty-on-quota scenario 4', solve('retain-dirty-on-quota', ({'a':1},{'a':N},True,False,'denied',None,5,0)), True)
check('retain-dirty-on-quota scenario 5', solve('retain-dirty-on-quota', ({'a':0},{'a':None},True,True,'ok',3,5,2)), False)
check('retain-dirty-on-quota scenario 6', solve('retain-dirty-on-quota', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('schedule-debounce scenario 1', solve('schedule-debounce', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 2)
check('schedule-debounce scenario 2', solve('schedule-debounce', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('schedule-debounce scenario 3', solve('schedule-debounce', ({}, {},False,True,'ok',None,5,2)), None)
check('schedule-debounce scenario 4', solve('schedule-debounce', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 5)
check('schedule-debounce scenario 5', solve('schedule-debounce', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 3)
check('schedule-debounce scenario 6', solve('schedule-debounce', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('flush-deadline-inclusive scenario 1', solve('flush-deadline-inclusive', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('flush-deadline-inclusive scenario 2', solve('flush-deadline-inclusive', ({'a':N},{'a':0},True,True,'quota',3,4,2)), False)
check('flush-deadline-inclusive scenario 3', solve('flush-deadline-inclusive', ({}, {},False,True,'ok',None,5,2)), False)
check('flush-deadline-inclusive scenario 4', solve('flush-deadline-inclusive', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('flush-deadline-inclusive scenario 5', solve('flush-deadline-inclusive', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('flush-deadline-inclusive scenario 6', solve('flush-deadline-inclusive', ({'a':N},{'a':N},False,False,'ok',2,9,2)), True)
check('write-permission-gate scenario 1', solve('write-permission-gate', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('write-permission-gate scenario 2', solve('write-permission-gate', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('write-permission-gate scenario 3', solve('write-permission-gate', ({}, {},False,True,'ok',None,5,2)), False)
check('write-permission-gate scenario 4', solve('write-permission-gate', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('write-permission-gate scenario 5', solve('write-permission-gate', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('write-permission-gate scenario 6', solve('write-permission-gate', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('success-cancels-timer scenario 1', solve('success-cancels-timer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('success-cancels-timer scenario 2', solve('success-cancels-timer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('success-cancels-timer scenario 3', solve('success-cancels-timer', ({}, {},False,True,'ok',None,5,2)), None)
check('success-cancels-timer scenario 4', solve('success-cancels-timer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('success-cancels-timer scenario 5', solve('success-cancels-timer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('success-cancels-timer scenario 6', solve('success-cancels-timer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('quota-error-classification scenario 1', solve('quota-error-classification', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('quota-error-classification scenario 2', solve('quota-error-classification', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 'storage-full')
check('quota-error-classification scenario 3', solve('quota-error-classification', ({}, {},False,True,'ok',None,5,2)), None)
check('quota-error-classification scenario 4', solve('quota-error-classification', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 'unavailable')
check('quota-error-classification scenario 5', solve('quota-error-classification', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('quota-error-classification scenario 6', solve('quota-error-classification', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 'unavailable')
check('unchanged-write-suppression scenario 1', solve('unchanged-write-suppression', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('unchanged-write-suppression scenario 2', solve('unchanged-write-suppression', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('unchanged-write-suppression scenario 3', solve('unchanged-write-suppression', ({}, {},False,True,'ok',None,5,2)), False)
check('unchanged-write-suppression scenario 4', solve('unchanged-write-suppression', ({'a':1},{'a':N},True,False,'denied',None,5,0)), N!=1)
check('unchanged-write-suppression scenario 5', solve('unchanged-write-suppression', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('unchanged-write-suppression scenario 6', solve('unchanged-write-suppression', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('failed-write-retry-buffer scenario 1', solve('failed-write-retry-buffer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('failed-write-retry-buffer scenario 2', solve('failed-write-retry-buffer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':0})
check('failed-write-retry-buffer scenario 3', solve('failed-write-retry-buffer', ({}, {},False,True,'ok',None,5,2)), None)
check('failed-write-retry-buffer scenario 4', solve('failed-write-retry-buffer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':N})
check('failed-write-retry-buffer scenario 5', solve('failed-write-retry-buffer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('failed-write-retry-buffer scenario 6', solve('failed-write-retry-buffer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('timer-delay-remaining scenario 1', solve('timer-delay-remaining', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 0)
check('timer-delay-remaining scenario 2', solve('timer-delay-remaining', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 1)
check('timer-delay-remaining scenario 3', solve('timer-delay-remaining', ({}, {},False,True,'ok',None,5,2)), None)
check('timer-delay-remaining scenario 4', solve('timer-delay-remaining', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('timer-delay-remaining scenario 5', solve('timer-delay-remaining', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 0)
check('timer-delay-remaining scenario 6', solve('timer-delay-remaining', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 0)
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 |
|---|---|---|---|
| commit-only-on-success scenario 1 | {'a': 3} | {'a': 3} | Passed |
| commit-only-on-success scenario 2 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 3 | {} | {} | Passed |
| commit-only-on-success scenario 4 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 5 | {'a': None} | {'a': None} | Passed |
| commit-only-on-success scenario 6 | {'a': 1} | {'a': 1} | Passed |
| retain-dirty-on-quota scenario 1 | False | False | Passed |
| retain-dirty-on-quota scenario 2 | True | True | Passed |
| retain-dirty-on-quota scenario 3 | False | False | Passed |
| retain-dirty-on-quota scenario 4 | True | True | Passed |
| retain-dirty-on-quota scenario 5 | False | False | Passed |
| retain-dirty-on-quota scenario 6 | False | False | Passed |
| schedule-debounce scenario 1 | 2 | 2 | Passed |
| schedule-debounce scenario 2 | 3 | 3 | Passed |
| schedule-debounce scenario 3 | None | None | Passed |
| schedule-debounce scenario 4 | 5 | 5 | Passed |
| schedule-debounce scenario 5 | 3 | 3 | Passed |
| schedule-debounce scenario 6 | None | None | Passed |
| flush-deadline-inclusive scenario 1 | True | True | Passed |
| flush-deadline-inclusive scenario 2 | False | False | Passed |
| flush-deadline-inclusive scenario 3 | False | False | Passed |
| flush-deadline-inclusive scenario 4 | False | False | Passed |
| flush-deadline-inclusive scenario 5 | True | True | Passed |
| flush-deadline-inclusive scenario 6 | True | True | Passed |
| write-permission-gate scenario 1 | True | True | Passed |
| write-permission-gate scenario 2 | True | True | Passed |
| write-permission-gate scenario 3 | False | False | Passed |
| write-permission-gate scenario 4 | False | False | Passed |
| write-permission-gate scenario 5 | True | True | Passed |
| write-permission-gate scenario 6 | False | False | Passed |
| success-cancels-timer scenario 1 | None | None | Passed |
| success-cancels-timer scenario 2 | 3 | 3 | Passed |
| success-cancels-timer scenario 3 | None | None | Passed |
| success-cancels-timer scenario 4 | None | None | Passed |
| success-cancels-timer scenario 5 | None | None | Passed |
| success-cancels-timer scenario 6 | None | None | Passed |
| quota-error-classification scenario 1 | None | None | Passed |
| quota-error-classification scenario 2 | storage-full | storage-full | Passed |
| quota-error-classification scenario 3 | None | None | Passed |
| quota-error-classification scenario 4 | unavailable | unavailable | Passed |
| quota-error-classification scenario 5 | None | None | Passed |
| quota-error-classification scenario 6 | unavailable | unavailable | Passed |
| unchanged-write-suppression scenario 1 | True | True | Passed |
| unchanged-write-suppression scenario 2 | True | True | Passed |
| unchanged-write-suppression scenario 3 | False | False | Passed |
| unchanged-write-suppression scenario 4 | False | False | Passed |
| unchanged-write-suppression scenario 5 | True | True | Passed |
| unchanged-write-suppression scenario 6 | False | False | Passed |
| failed-write-retry-buffer scenario 1 | None | None | Passed |
| failed-write-retry-buffer scenario 2 | {'a': 0} | {'a': 0} | Passed |
| failed-write-retry-buffer scenario 3 | None | None | Passed |
| failed-write-retry-buffer scenario 4 | None | {'a': 1} | Failed |
| failed-write-retry-buffer scenario 5 | None | None | Passed |
| failed-write-retry-buffer scenario 6 | None | None | Passed |
| timer-delay-remaining scenario 1 | 0 | 0 | Passed |
| timer-delay-remaining scenario 2 | 1 | 1 | Passed |
| timer-delay-remaining scenario 3 | None | None | Passed |
| timer-delay-remaining scenario 4 | None | None | Passed |
| timer-delay-remaining scenario 5 | 0 | 0 | Passed |
| timer-delay-remaining scenario 6 | 0 | 0 | Passed |
SHA-256 / 9a66374b1422ddc83b267ecd449bc7f70fc8a50bd431534bdd110579c37b31e6
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(operation, s):
saved, draft, dirty, writable, outcome, scheduled, now, debounce = s
if operation == 'commit-only-on-success':
return draft if outcome=='ok' and writable else saved
if operation == 'retain-dirty-on-quota':
return dirty and (not writable or outcome!='ok')
if operation == 'schedule-debounce':
return None if not dirty else (now+debounce if scheduled is None else scheduled)
if operation == 'flush-deadline-inclusive':
return scheduled is not None and now>=scheduled+debounce
if operation == 'write-permission-gate':
return dirty and writable
if operation == 'success-cancels-timer':
return None if outcome=='ok' else scheduled
if operation == 'quota-error-classification':
return 'storage-full' if outcome=='quota' else ('unavailable' if not writable else None)
if operation == 'unchanged-write-suppression':
return draft!=saved
if operation == 'failed-write-retry-buffer':
return draft if outcome!='ok' else None
if operation == 'timer-delay-remaining':
return max(0,scheduled+debounce-now) if scheduled is not None else None
raise ValueError('unknown modeled operation')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('commit-only-on-success scenario 1', solve('commit-only-on-success', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), {'a':N+2})
check('commit-only-on-success scenario 2', solve('commit-only-on-success', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':N})
check('commit-only-on-success scenario 3', solve('commit-only-on-success', ({}, {},False,True,'ok',None,5,2)), {})
check('commit-only-on-success scenario 4', solve('commit-only-on-success', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':1})
check('commit-only-on-success scenario 5', solve('commit-only-on-success', ({'a':0},{'a':None},True,True,'ok',3,5,2)), {'a':None})
check('commit-only-on-success scenario 6', solve('commit-only-on-success', ({'a':N},{'a':N},False,False,'ok',2,9,2)), {'a':N})
check('retain-dirty-on-quota scenario 1', solve('retain-dirty-on-quota', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), False)
check('retain-dirty-on-quota scenario 2', solve('retain-dirty-on-quota', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('retain-dirty-on-quota scenario 3', solve('retain-dirty-on-quota', ({}, {},False,True,'ok',None,5,2)), False)
check('retain-dirty-on-quota scenario 4', solve('retain-dirty-on-quota', ({'a':1},{'a':N},True,False,'denied',None,5,0)), True)
check('retain-dirty-on-quota scenario 5', solve('retain-dirty-on-quota', ({'a':0},{'a':None},True,True,'ok',3,5,2)), False)
check('retain-dirty-on-quota scenario 6', solve('retain-dirty-on-quota', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('schedule-debounce scenario 1', solve('schedule-debounce', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 2)
check('schedule-debounce scenario 2', solve('schedule-debounce', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('schedule-debounce scenario 3', solve('schedule-debounce', ({}, {},False,True,'ok',None,5,2)), None)
check('schedule-debounce scenario 4', solve('schedule-debounce', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 5)
check('schedule-debounce scenario 5', solve('schedule-debounce', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 3)
check('schedule-debounce scenario 6', solve('schedule-debounce', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('flush-deadline-inclusive scenario 1', solve('flush-deadline-inclusive', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('flush-deadline-inclusive scenario 2', solve('flush-deadline-inclusive', ({'a':N},{'a':0},True,True,'quota',3,4,2)), False)
check('flush-deadline-inclusive scenario 3', solve('flush-deadline-inclusive', ({}, {},False,True,'ok',None,5,2)), False)
check('flush-deadline-inclusive scenario 4', solve('flush-deadline-inclusive', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('flush-deadline-inclusive scenario 5', solve('flush-deadline-inclusive', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('flush-deadline-inclusive scenario 6', solve('flush-deadline-inclusive', ({'a':N},{'a':N},False,False,'ok',2,9,2)), True)
check('write-permission-gate scenario 1', solve('write-permission-gate', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('write-permission-gate scenario 2', solve('write-permission-gate', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('write-permission-gate scenario 3', solve('write-permission-gate', ({}, {},False,True,'ok',None,5,2)), False)
check('write-permission-gate scenario 4', solve('write-permission-gate', ({'a':1},{'a':N},True,False,'denied',None,5,0)), False)
check('write-permission-gate scenario 5', solve('write-permission-gate', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('write-permission-gate scenario 6', solve('write-permission-gate', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('success-cancels-timer scenario 1', solve('success-cancels-timer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('success-cancels-timer scenario 2', solve('success-cancels-timer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 3)
check('success-cancels-timer scenario 3', solve('success-cancels-timer', ({}, {},False,True,'ok',None,5,2)), None)
check('success-cancels-timer scenario 4', solve('success-cancels-timer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('success-cancels-timer scenario 5', solve('success-cancels-timer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('success-cancels-timer scenario 6', solve('success-cancels-timer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('quota-error-classification scenario 1', solve('quota-error-classification', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('quota-error-classification scenario 2', solve('quota-error-classification', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 'storage-full')
check('quota-error-classification scenario 3', solve('quota-error-classification', ({}, {},False,True,'ok',None,5,2)), None)
check('quota-error-classification scenario 4', solve('quota-error-classification', ({'a':1},{'a':N},True,False,'denied',None,5,0)), 'unavailable')
check('quota-error-classification scenario 5', solve('quota-error-classification', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('quota-error-classification scenario 6', solve('quota-error-classification', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 'unavailable')
check('unchanged-write-suppression scenario 1', solve('unchanged-write-suppression', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), True)
check('unchanged-write-suppression scenario 2', solve('unchanged-write-suppression', ({'a':N},{'a':0},True,True,'quota',3,4,2)), True)
check('unchanged-write-suppression scenario 3', solve('unchanged-write-suppression', ({}, {},False,True,'ok',None,5,2)), False)
check('unchanged-write-suppression scenario 4', solve('unchanged-write-suppression', ({'a':1},{'a':N},True,False,'denied',None,5,0)), N!=1)
check('unchanged-write-suppression scenario 5', solve('unchanged-write-suppression', ({'a':0},{'a':None},True,True,'ok',3,5,2)), True)
check('unchanged-write-suppression scenario 6', solve('unchanged-write-suppression', ({'a':N},{'a':N},False,False,'ok',2,9,2)), False)
check('failed-write-retry-buffer scenario 1', solve('failed-write-retry-buffer', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), None)
check('failed-write-retry-buffer scenario 2', solve('failed-write-retry-buffer', ({'a':N},{'a':0},True,True,'quota',3,4,2)), {'a':0})
check('failed-write-retry-buffer scenario 3', solve('failed-write-retry-buffer', ({}, {},False,True,'ok',None,5,2)), None)
check('failed-write-retry-buffer scenario 4', solve('failed-write-retry-buffer', ({'a':1},{'a':N},True,False,'denied',None,5,0)), {'a':N})
check('failed-write-retry-buffer scenario 5', solve('failed-write-retry-buffer', ({'a':0},{'a':None},True,True,'ok',3,5,2)), None)
check('failed-write-retry-buffer scenario 6', solve('failed-write-retry-buffer', ({'a':N},{'a':N},False,False,'ok',2,9,2)), None)
check('timer-delay-remaining scenario 1', solve('timer-delay-remaining', ({'a':1},{'a':N+2},True,True,'ok',2,5,2)), 0)
check('timer-delay-remaining scenario 2', solve('timer-delay-remaining', ({'a':N},{'a':0},True,True,'quota',3,4,2)), 1)
check('timer-delay-remaining scenario 3', solve('timer-delay-remaining', ({}, {},False,True,'ok',None,5,2)), None)
check('timer-delay-remaining scenario 4', solve('timer-delay-remaining', ({'a':1},{'a':N},True,False,'denied',None,5,0)), None)
check('timer-delay-remaining scenario 5', solve('timer-delay-remaining', ({'a':0},{'a':None},True,True,'ok',3,5,2)), 0)
check('timer-delay-remaining scenario 6', solve('timer-delay-remaining', ({'a':N},{'a':N},False,False,'ok',2,9,2)), 0)
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 |
|---|---|---|---|
| commit-only-on-success scenario 1 | {'a': 3} | {'a': 3} | Passed |
| commit-only-on-success scenario 2 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 3 | {} | {} | Passed |
| commit-only-on-success scenario 4 | {'a': 1} | {'a': 1} | Passed |
| commit-only-on-success scenario 5 | {'a': None} | {'a': None} | Passed |
| commit-only-on-success scenario 6 | {'a': 1} | {'a': 1} | Passed |
| retain-dirty-on-quota scenario 1 | False | False | Passed |
| retain-dirty-on-quota scenario 2 | True | True | Passed |
| retain-dirty-on-quota scenario 3 | False | False | Passed |
| retain-dirty-on-quota scenario 4 | True | True | Passed |
| retain-dirty-on-quota scenario 5 | False | False | Passed |
| retain-dirty-on-quota scenario 6 | False | False | Passed |
| schedule-debounce scenario 1 | 2 | 2 | Passed |
| schedule-debounce scenario 2 | 3 | 3 | Passed |
| schedule-debounce scenario 3 | None | None | Passed |
| schedule-debounce scenario 4 | 5 | 5 | Passed |
| schedule-debounce scenario 5 | 3 | 3 | Passed |
| schedule-debounce scenario 6 | None | None | Passed |
| flush-deadline-inclusive scenario 1 | True | True | Passed |
| flush-deadline-inclusive scenario 2 | False | False | Passed |
| flush-deadline-inclusive scenario 3 | False | False | Passed |
| flush-deadline-inclusive scenario 4 | False | False | Passed |
| flush-deadline-inclusive scenario 5 | True | True | Passed |
| flush-deadline-inclusive scenario 6 | True | True | Passed |
| write-permission-gate scenario 1 | True | True | Passed |
| write-permission-gate scenario 2 | True | True | Passed |
| write-permission-gate scenario 3 | False | False | Passed |
| write-permission-gate scenario 4 | False | False | Passed |
| write-permission-gate scenario 5 | True | True | Passed |
| write-permission-gate scenario 6 | False | False | Passed |
| success-cancels-timer scenario 1 | None | None | Passed |
| success-cancels-timer scenario 2 | 3 | 3 | Passed |
| success-cancels-timer scenario 3 | None | None | Passed |
| success-cancels-timer scenario 4 | None | None | Passed |
| success-cancels-timer scenario 5 | None | None | Passed |
| success-cancels-timer scenario 6 | None | None | Passed |
| quota-error-classification scenario 1 | None | None | Passed |
| quota-error-classification scenario 2 | storage-full | storage-full | Passed |
| quota-error-classification scenario 3 | None | None | Passed |
| quota-error-classification scenario 4 | unavailable | unavailable | Passed |
| quota-error-classification scenario 5 | None | None | Passed |
| quota-error-classification scenario 6 | unavailable | unavailable | Passed |
| unchanged-write-suppression scenario 1 | True | True | Passed |
| unchanged-write-suppression scenario 2 | True | True | Passed |
| unchanged-write-suppression scenario 3 | False | False | Passed |
| unchanged-write-suppression scenario 4 | False | False | Passed |
| unchanged-write-suppression scenario 5 | True | True | Passed |
| unchanged-write-suppression scenario 6 | False | False | Passed |
| failed-write-retry-buffer scenario 1 | None | None | Passed |
| failed-write-retry-buffer scenario 2 | {'a': 0} | {'a': 0} | Passed |
| failed-write-retry-buffer scenario 3 | None | None | Passed |
| failed-write-retry-buffer scenario 4 | {'a': 1} | {'a': 1} | Passed |
| failed-write-retry-buffer scenario 5 | None | None | Passed |
| failed-write-retry-buffer scenario 6 | None | None | Passed |
| timer-delay-remaining scenario 1 | 0 | 0 | Passed |
| timer-delay-remaining scenario 2 | 1 | 1 | Passed |
| timer-delay-remaining scenario 3 | None | None | Passed |
| timer-delay-remaining scenario 4 | None | None | Passed |
| timer-delay-remaining scenario 5 | 0 | 0 | Passed |
| timer-delay-remaining scenario 6 | 0 | 0 | Passed |
SHA-256 / d25c0a854c6c11db00ce8b47ec83dac7fde8c56f17559cabea7e398fcd787e65
Verification & scope
Only the explicitly specified operations and finite deterministic records are modeled; no browser or framework conformance is claimed. 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:40:49.408163+00:00.
Case digest / 664434d6ed51696f0c10b06c9687e03406ca555326d71e26cc78c11de0d7f5f5