FAILURE MAP
← Case archive

FA-23581 / Client state / Open access

Client persistence write transaction: Retain dirty on quota · case 01

Retain dirty on quota.

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

ROOT CAUSE

The retain-dirty-on-quota client decision evaluates `False` instead of `dirty and (not writable or outcome!='ok')`.

VERIFIED REPAIR

Apply the modeled retain-dirty-on-quota rule: `dirty and (not writable or outcome!='ok')`.

Unsuccessful approach: The partial repair `dirty and outcome=='quota'` 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 retain-dirty-on-quota 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 False
    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 fixtureActualExpectedOutcome
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 1FalseFalsePassed
retain-dirty-on-quota scenario 2FalseTrueFailed
retain-dirty-on-quota scenario 3FalseFalsePassed
retain-dirty-on-quota scenario 4FalseTrueFailed
retain-dirty-on-quota scenario 5FalseFalsePassed
retain-dirty-on-quota scenario 6FalseFalsePassed
schedule-debounce scenario 122Passed
schedule-debounce scenario 233Passed
schedule-debounce scenario 3NoneNonePassed
schedule-debounce scenario 455Passed
schedule-debounce scenario 533Passed
schedule-debounce scenario 6NoneNonePassed
flush-deadline-inclusive scenario 1TrueTruePassed
flush-deadline-inclusive scenario 2FalseFalsePassed
flush-deadline-inclusive scenario 3FalseFalsePassed
flush-deadline-inclusive scenario 4FalseFalsePassed
flush-deadline-inclusive scenario 5TrueTruePassed
flush-deadline-inclusive scenario 6TrueTruePassed
write-permission-gate scenario 1TrueTruePassed
write-permission-gate scenario 2TrueTruePassed
write-permission-gate scenario 3FalseFalsePassed
write-permission-gate scenario 4FalseFalsePassed
write-permission-gate scenario 5TrueTruePassed
write-permission-gate scenario 6FalseFalsePassed
success-cancels-timer scenario 1NoneNonePassed
success-cancels-timer scenario 233Passed
success-cancels-timer scenario 3NoneNonePassed
success-cancels-timer scenario 4NoneNonePassed
success-cancels-timer scenario 5NoneNonePassed
success-cancels-timer scenario 6NoneNonePassed
quota-error-classification scenario 1NoneNonePassed
quota-error-classification scenario 2storage-fullstorage-fullPassed
quota-error-classification scenario 3NoneNonePassed
quota-error-classification scenario 4unavailableunavailablePassed
quota-error-classification scenario 5NoneNonePassed
quota-error-classification scenario 6unavailableunavailablePassed
unchanged-write-suppression scenario 1TrueTruePassed
unchanged-write-suppression scenario 2TrueTruePassed
unchanged-write-suppression scenario 3FalseFalsePassed
unchanged-write-suppression scenario 4FalseFalsePassed
unchanged-write-suppression scenario 5TrueTruePassed
unchanged-write-suppression scenario 6FalseFalsePassed
failed-write-retry-buffer scenario 1NoneNonePassed
failed-write-retry-buffer scenario 2{'a': 0}{'a': 0}Passed
failed-write-retry-buffer scenario 3NoneNonePassed
failed-write-retry-buffer scenario 4{'a': 1}{'a': 1}Passed
failed-write-retry-buffer scenario 5NoneNonePassed
failed-write-retry-buffer scenario 6NoneNonePassed
timer-delay-remaining scenario 100Passed
timer-delay-remaining scenario 211Passed
timer-delay-remaining scenario 3NoneNonePassed
timer-delay-remaining scenario 4NoneNonePassed
timer-delay-remaining scenario 500Passed
timer-delay-remaining scenario 600Passed

SHA-256 / 3791554881f9124c2e235d0db9d7dd72220ce92738a067cefa4b579595290a29

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 outcome=='quota'
    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 fixtureActualExpectedOutcome
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 1FalseFalsePassed
retain-dirty-on-quota scenario 2TrueTruePassed
retain-dirty-on-quota scenario 3FalseFalsePassed
retain-dirty-on-quota scenario 4FalseTrueFailed
retain-dirty-on-quota scenario 5FalseFalsePassed
retain-dirty-on-quota scenario 6FalseFalsePassed
schedule-debounce scenario 122Passed
schedule-debounce scenario 233Passed
schedule-debounce scenario 3NoneNonePassed
schedule-debounce scenario 455Passed
schedule-debounce scenario 533Passed
schedule-debounce scenario 6NoneNonePassed
flush-deadline-inclusive scenario 1TrueTruePassed
flush-deadline-inclusive scenario 2FalseFalsePassed
flush-deadline-inclusive scenario 3FalseFalsePassed
flush-deadline-inclusive scenario 4FalseFalsePassed
flush-deadline-inclusive scenario 5TrueTruePassed
flush-deadline-inclusive scenario 6TrueTruePassed
write-permission-gate scenario 1TrueTruePassed
write-permission-gate scenario 2TrueTruePassed
write-permission-gate scenario 3FalseFalsePassed
write-permission-gate scenario 4FalseFalsePassed
write-permission-gate scenario 5TrueTruePassed
write-permission-gate scenario 6FalseFalsePassed
success-cancels-timer scenario 1NoneNonePassed
success-cancels-timer scenario 233Passed
success-cancels-timer scenario 3NoneNonePassed
success-cancels-timer scenario 4NoneNonePassed
success-cancels-timer scenario 5NoneNonePassed
success-cancels-timer scenario 6NoneNonePassed
quota-error-classification scenario 1NoneNonePassed
quota-error-classification scenario 2storage-fullstorage-fullPassed
quota-error-classification scenario 3NoneNonePassed
quota-error-classification scenario 4unavailableunavailablePassed
quota-error-classification scenario 5NoneNonePassed
quota-error-classification scenario 6unavailableunavailablePassed
unchanged-write-suppression scenario 1TrueTruePassed
unchanged-write-suppression scenario 2TrueTruePassed
unchanged-write-suppression scenario 3FalseFalsePassed
unchanged-write-suppression scenario 4FalseFalsePassed
unchanged-write-suppression scenario 5TrueTruePassed
unchanged-write-suppression scenario 6FalseFalsePassed
failed-write-retry-buffer scenario 1NoneNonePassed
failed-write-retry-buffer scenario 2{'a': 0}{'a': 0}Passed
failed-write-retry-buffer scenario 3NoneNonePassed
failed-write-retry-buffer scenario 4{'a': 1}{'a': 1}Passed
failed-write-retry-buffer scenario 5NoneNonePassed
failed-write-retry-buffer scenario 6NoneNonePassed
timer-delay-remaining scenario 100Passed
timer-delay-remaining scenario 211Passed
timer-delay-remaining scenario 3NoneNonePassed
timer-delay-remaining scenario 4NoneNonePassed
timer-delay-remaining scenario 500Passed
timer-delay-remaining scenario 600Passed

SHA-256 / d979ba2ae9eb6740d253e31535d203bf84500f9cb5f5a8e0e272f935d0731ff8

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 fixtureActualExpectedOutcome
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 1FalseFalsePassed
retain-dirty-on-quota scenario 2TrueTruePassed
retain-dirty-on-quota scenario 3FalseFalsePassed
retain-dirty-on-quota scenario 4TrueTruePassed
retain-dirty-on-quota scenario 5FalseFalsePassed
retain-dirty-on-quota scenario 6FalseFalsePassed
schedule-debounce scenario 122Passed
schedule-debounce scenario 233Passed
schedule-debounce scenario 3NoneNonePassed
schedule-debounce scenario 455Passed
schedule-debounce scenario 533Passed
schedule-debounce scenario 6NoneNonePassed
flush-deadline-inclusive scenario 1TrueTruePassed
flush-deadline-inclusive scenario 2FalseFalsePassed
flush-deadline-inclusive scenario 3FalseFalsePassed
flush-deadline-inclusive scenario 4FalseFalsePassed
flush-deadline-inclusive scenario 5TrueTruePassed
flush-deadline-inclusive scenario 6TrueTruePassed
write-permission-gate scenario 1TrueTruePassed
write-permission-gate scenario 2TrueTruePassed
write-permission-gate scenario 3FalseFalsePassed
write-permission-gate scenario 4FalseFalsePassed
write-permission-gate scenario 5TrueTruePassed
write-permission-gate scenario 6FalseFalsePassed
success-cancels-timer scenario 1NoneNonePassed
success-cancels-timer scenario 233Passed
success-cancels-timer scenario 3NoneNonePassed
success-cancels-timer scenario 4NoneNonePassed
success-cancels-timer scenario 5NoneNonePassed
success-cancels-timer scenario 6NoneNonePassed
quota-error-classification scenario 1NoneNonePassed
quota-error-classification scenario 2storage-fullstorage-fullPassed
quota-error-classification scenario 3NoneNonePassed
quota-error-classification scenario 4unavailableunavailablePassed
quota-error-classification scenario 5NoneNonePassed
quota-error-classification scenario 6unavailableunavailablePassed
unchanged-write-suppression scenario 1TrueTruePassed
unchanged-write-suppression scenario 2TrueTruePassed
unchanged-write-suppression scenario 3FalseFalsePassed
unchanged-write-suppression scenario 4FalseFalsePassed
unchanged-write-suppression scenario 5TrueTruePassed
unchanged-write-suppression scenario 6FalseFalsePassed
failed-write-retry-buffer scenario 1NoneNonePassed
failed-write-retry-buffer scenario 2{'a': 0}{'a': 0}Passed
failed-write-retry-buffer scenario 3NoneNonePassed
failed-write-retry-buffer scenario 4{'a': 1}{'a': 1}Passed
failed-write-retry-buffer scenario 5NoneNonePassed
failed-write-retry-buffer scenario 6NoneNonePassed
timer-delay-remaining scenario 100Passed
timer-delay-remaining scenario 211Passed
timer-delay-remaining scenario 3NoneNonePassed
timer-delay-remaining scenario 4NoneNonePassed
timer-delay-remaining scenario 500Passed
timer-delay-remaining scenario 600Passed

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

Case digest / bd616646433c412656bf463a1a9b1fdb0f54da162c7ca1b91daf04ce57fc1fbb