FAILURE MAP
← Case archive

FA-24356 / Client state / Open access

Editor autosave revision reconciliation: Save completion status · case 01

Save completion status.

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

ROOT CAUSE

The save-completion-status client decision evaluates `'saved' if response=='ok' else 'error'` instead of `'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))`.

VERIFIED REPAIR

Apply the modeled save-completion-status rule: `'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))`.

Unsuccessful approach: The partial repair `'unsaved' if current!=sent else 'saved'` still violates the explicit fixture contract.

Case contract

Autosave snapshots both revision and field set. A successful old save acknowledges its sent revision without clearing newer edits. Offline and composition defer new saves, and conflicts preserve local edits for explicit resolution. Operation save-completion-status 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):
    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s
    if operation == 'acknowledge-sent-revision':
        return sent if response=='ok' else acknowledged
    if operation == 'newer-edit-retains-dirty':
        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]
    if operation == 'composition-defers-save':
        return online and bool(dirty_fields) and not composing
    if operation == 'save-completion-status':
        return 'saved' if response=='ok' else 'error'
    if operation == 'next-save-revision':
        return current if current>sent else None
    if operation == 'unsent-field-difference':
        return [f for f in dirty_fields if f not in sent_fields]
    if operation == 'conflict-preserves-local-fields':
        return dirty_fields if response=='conflict' else []
    if operation == 'save-payload-field-snapshot':
        return list(sent_fields)
    if operation == 'unacknowledged-edit-distance':
        return max(0,current-acknowledged)
    if operation == 'resave-after-ack':
        return response=='ok' and current>sent and online and not composing
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)
check('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)
check('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)
check('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)
check('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])
check('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)
check('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)
check('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')
check('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')
check('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')
check('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')
check('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')
check('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')
check('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)
check('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)
check('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)
check('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)
check('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)
check('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])
check('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])
check('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])
check('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])
check('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])
check('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])
check('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])
check('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])
check('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])
check('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])
check('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)
check('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)
check('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)
check('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)
check('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)
check('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)
check('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)
check('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)
check('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')
check('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)
check('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])
check('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])
check('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)
check('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)
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
acknowledge-sent-revision scenario 122Passed
acknowledge-sent-revision scenario 211Passed
acknowledge-sent-revision scenario 300Passed
acknowledge-sent-revision scenario 400Passed
acknowledge-sent-revision scenario 522Passed
acknowledge-sent-revision scenario 633Passed
newer-edit-retains-dirty scenario 1['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 2[][]Passed
newer-edit-retains-dirty scenario 3['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 4[][]Passed
newer-edit-retains-dirty scenario 5['b']['b']Passed
newer-edit-retains-dirty scenario 6['a', 'b']['a', 'b']Passed
composition-defers-save scenario 1TrueTruePassed
composition-defers-save scenario 2TrueTruePassed
composition-defers-save scenario 3TrueTruePassed
composition-defers-save scenario 4FalseFalsePassed
composition-defers-save scenario 5FalseFalsePassed
composition-defers-save scenario 6FalseFalsePassed
save-completion-status scenario 1savedunsavedFailed
save-completion-status scenario 2savedsavedPassed
save-completion-status scenario 3errorerrorPassed
save-completion-status scenario 4savedsavedPassed
save-completion-status scenario 5savedunsavedFailed
save-completion-status scenario 6errorconflictFailed
next-save-revision scenario 133Passed
next-save-revision scenario 2NoneNonePassed
next-save-revision scenario 322Passed
next-save-revision scenario 4NoneNonePassed
next-save-revision scenario 533Passed
next-save-revision scenario 6NoneNonePassed
unsent-field-difference scenario 1['b']['b']Passed
unsent-field-difference scenario 2[][]Passed
unsent-field-difference scenario 3['b']['b']Passed
unsent-field-difference scenario 4[][]Passed
unsent-field-difference scenario 5['b']['b']Passed
unsent-field-difference scenario 6[][]Passed
conflict-preserves-local-fields scenario 1[][]Passed
conflict-preserves-local-fields scenario 2[][]Passed
conflict-preserves-local-fields scenario 3[][]Passed
conflict-preserves-local-fields scenario 4[][]Passed
conflict-preserves-local-fields scenario 5[][]Passed
conflict-preserves-local-fields scenario 6['a', 'b']['a', 'b']Passed
save-payload-field-snapshot scenario 1['a']['a']Passed
save-payload-field-snapshot scenario 2['a']['a']Passed
save-payload-field-snapshot scenario 3['a']['a']Passed
save-payload-field-snapshot scenario 4[][]Passed
save-payload-field-snapshot scenario 5['a']['a']Passed
save-payload-field-snapshot scenario 6['a', 'b']['a', 'b']Passed
unacknowledged-edit-distance scenario 122Passed
unacknowledged-edit-distance scenario 211Passed
unacknowledged-edit-distance scenario 322Passed
unacknowledged-edit-distance scenario 400Passed
unacknowledged-edit-distance scenario 522Passed
unacknowledged-edit-distance scenario 611Passed
resave-after-ack scenario 1TrueTruePassed
resave-after-ack scenario 2FalseFalsePassed
resave-after-ack scenario 3FalseFalsePassed
resave-after-ack scenario 4FalseFalsePassed
resave-after-ack scenario 5FalseFalsePassed
resave-after-ack scenario 6FalseFalsePassed
many edits during conflicting save: acknowledge-sent-revision11Passed
many edits during conflicting save: newer-edit-retains-dirty['a', 'b']['a', 'b']Passed
many edits during conflicting save: composition-defers-saveTrueTruePassed
many edits during conflicting save: save-completion-statuserrorconflictFailed
many edits during conflicting save: next-save-revision66Passed
many edits during conflicting save: unsent-field-difference['b']['b']Passed
many edits during conflicting save: conflict-preserves-local-fields['a', 'b']['a', 'b']Passed
many edits during conflicting save: save-payload-field-snapshot['a']['a']Passed
many edits during conflicting save: unacknowledged-edit-distance55Passed
many edits during conflicting save: resave-after-ackFalseFalsePassed

SHA-256 / 2c6cb22138ef2c3c0f884d8b4510314583c5705ee31e7cf4cce48cc5a6498d12

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(operation, s):
    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s
    if operation == 'acknowledge-sent-revision':
        return sent if response=='ok' else acknowledged
    if operation == 'newer-edit-retains-dirty':
        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]
    if operation == 'composition-defers-save':
        return online and bool(dirty_fields) and not composing
    if operation == 'save-completion-status':
        return 'unsaved' if current!=sent else 'saved'
    if operation == 'next-save-revision':
        return current if current>sent else None
    if operation == 'unsent-field-difference':
        return [f for f in dirty_fields if f not in sent_fields]
    if operation == 'conflict-preserves-local-fields':
        return dirty_fields if response=='conflict' else []
    if operation == 'save-payload-field-snapshot':
        return list(sent_fields)
    if operation == 'unacknowledged-edit-distance':
        return max(0,current-acknowledged)
    if operation == 'resave-after-ack':
        return response=='ok' and current>sent and online and not composing
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)
check('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)
check('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)
check('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)
check('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])
check('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)
check('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)
check('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')
check('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')
check('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')
check('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')
check('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')
check('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')
check('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)
check('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)
check('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)
check('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)
check('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)
check('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])
check('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])
check('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])
check('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])
check('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])
check('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])
check('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])
check('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])
check('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])
check('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])
check('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)
check('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)
check('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)
check('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)
check('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)
check('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)
check('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)
check('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)
check('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')
check('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)
check('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])
check('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])
check('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)
check('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)
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
acknowledge-sent-revision scenario 122Passed
acknowledge-sent-revision scenario 211Passed
acknowledge-sent-revision scenario 300Passed
acknowledge-sent-revision scenario 400Passed
acknowledge-sent-revision scenario 522Passed
acknowledge-sent-revision scenario 633Passed
newer-edit-retains-dirty scenario 1['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 2[][]Passed
newer-edit-retains-dirty scenario 3['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 4[][]Passed
newer-edit-retains-dirty scenario 5['b']['b']Passed
newer-edit-retains-dirty scenario 6['a', 'b']['a', 'b']Passed
composition-defers-save scenario 1TrueTruePassed
composition-defers-save scenario 2TrueTruePassed
composition-defers-save scenario 3TrueTruePassed
composition-defers-save scenario 4FalseFalsePassed
composition-defers-save scenario 5FalseFalsePassed
composition-defers-save scenario 6FalseFalsePassed
save-completion-status scenario 1unsavedunsavedPassed
save-completion-status scenario 2savedsavedPassed
save-completion-status scenario 3unsavederrorFailed
save-completion-status scenario 4savedsavedPassed
save-completion-status scenario 5unsavedunsavedPassed
save-completion-status scenario 6savedconflictFailed
next-save-revision scenario 133Passed
next-save-revision scenario 2NoneNonePassed
next-save-revision scenario 322Passed
next-save-revision scenario 4NoneNonePassed
next-save-revision scenario 533Passed
next-save-revision scenario 6NoneNonePassed
unsent-field-difference scenario 1['b']['b']Passed
unsent-field-difference scenario 2[][]Passed
unsent-field-difference scenario 3['b']['b']Passed
unsent-field-difference scenario 4[][]Passed
unsent-field-difference scenario 5['b']['b']Passed
unsent-field-difference scenario 6[][]Passed
conflict-preserves-local-fields scenario 1[][]Passed
conflict-preserves-local-fields scenario 2[][]Passed
conflict-preserves-local-fields scenario 3[][]Passed
conflict-preserves-local-fields scenario 4[][]Passed
conflict-preserves-local-fields scenario 5[][]Passed
conflict-preserves-local-fields scenario 6['a', 'b']['a', 'b']Passed
save-payload-field-snapshot scenario 1['a']['a']Passed
save-payload-field-snapshot scenario 2['a']['a']Passed
save-payload-field-snapshot scenario 3['a']['a']Passed
save-payload-field-snapshot scenario 4[][]Passed
save-payload-field-snapshot scenario 5['a']['a']Passed
save-payload-field-snapshot scenario 6['a', 'b']['a', 'b']Passed
unacknowledged-edit-distance scenario 122Passed
unacknowledged-edit-distance scenario 211Passed
unacknowledged-edit-distance scenario 322Passed
unacknowledged-edit-distance scenario 400Passed
unacknowledged-edit-distance scenario 522Passed
unacknowledged-edit-distance scenario 611Passed
resave-after-ack scenario 1TrueTruePassed
resave-after-ack scenario 2FalseFalsePassed
resave-after-ack scenario 3FalseFalsePassed
resave-after-ack scenario 4FalseFalsePassed
resave-after-ack scenario 5FalseFalsePassed
resave-after-ack scenario 6FalseFalsePassed
many edits during conflicting save: acknowledge-sent-revision11Passed
many edits during conflicting save: newer-edit-retains-dirty['a', 'b']['a', 'b']Passed
many edits during conflicting save: composition-defers-saveTrueTruePassed
many edits during conflicting save: save-completion-statusunsavedconflictFailed
many edits during conflicting save: next-save-revision66Passed
many edits during conflicting save: unsent-field-difference['b']['b']Passed
many edits during conflicting save: conflict-preserves-local-fields['a', 'b']['a', 'b']Passed
many edits during conflicting save: save-payload-field-snapshot['a']['a']Passed
many edits during conflicting save: unacknowledged-edit-distance55Passed
many edits during conflicting save: resave-after-ackFalseFalsePassed

SHA-256 / e09214003e498d60e4e1cb2b15b59bcd0538ed83355cbbf9f881b4a09246aa78

3 / The verified repair

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

N = 1
observations = []
def solve(operation, s):
    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s
    if operation == 'acknowledge-sent-revision':
        return sent if response=='ok' else acknowledged
    if operation == 'newer-edit-retains-dirty':
        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]
    if operation == 'composition-defers-save':
        return online and bool(dirty_fields) and not composing
    if operation == 'save-completion-status':
        return 'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))
    if operation == 'next-save-revision':
        return current if current>sent else None
    if operation == 'unsent-field-difference':
        return [f for f in dirty_fields if f not in sent_fields]
    if operation == 'conflict-preserves-local-fields':
        return dirty_fields if response=='conflict' else []
    if operation == 'save-payload-field-snapshot':
        return list(sent_fields)
    if operation == 'unacknowledged-edit-distance':
        return max(0,current-acknowledged)
    if operation == 'resave-after-ack':
        return response=='ok' and current>sent and online and not composing
    raise ValueError('unknown modeled operation')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)
check('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)
check('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)
check('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)
check('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])
check('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])
check('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)
check('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)
check('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)
check('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')
check('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')
check('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')
check('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')
check('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')
check('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')
check('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)
check('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)
check('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)
check('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)
check('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)
check('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])
check('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])
check('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])
check('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])
check('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])
check('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])
check('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])
check('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])
check('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])
check('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])
check('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])
check('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])
check('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])
check('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])
check('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)
check('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)
check('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)
check('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)
check('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)
check('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)
check('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)
check('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)
check('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)
check('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)
check('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)
check('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)
check('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)
check('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)
check('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')
check('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)
check('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])
check('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])
check('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])
check('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)
check('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)
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
acknowledge-sent-revision scenario 122Passed
acknowledge-sent-revision scenario 211Passed
acknowledge-sent-revision scenario 300Passed
acknowledge-sent-revision scenario 400Passed
acknowledge-sent-revision scenario 522Passed
acknowledge-sent-revision scenario 633Passed
newer-edit-retains-dirty scenario 1['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 2[][]Passed
newer-edit-retains-dirty scenario 3['a', 'b']['a', 'b']Passed
newer-edit-retains-dirty scenario 4[][]Passed
newer-edit-retains-dirty scenario 5['b']['b']Passed
newer-edit-retains-dirty scenario 6['a', 'b']['a', 'b']Passed
composition-defers-save scenario 1TrueTruePassed
composition-defers-save scenario 2TrueTruePassed
composition-defers-save scenario 3TrueTruePassed
composition-defers-save scenario 4FalseFalsePassed
composition-defers-save scenario 5FalseFalsePassed
composition-defers-save scenario 6FalseFalsePassed
save-completion-status scenario 1unsavedunsavedPassed
save-completion-status scenario 2savedsavedPassed
save-completion-status scenario 3errorerrorPassed
save-completion-status scenario 4savedsavedPassed
save-completion-status scenario 5unsavedunsavedPassed
save-completion-status scenario 6conflictconflictPassed
next-save-revision scenario 133Passed
next-save-revision scenario 2NoneNonePassed
next-save-revision scenario 322Passed
next-save-revision scenario 4NoneNonePassed
next-save-revision scenario 533Passed
next-save-revision scenario 6NoneNonePassed
unsent-field-difference scenario 1['b']['b']Passed
unsent-field-difference scenario 2[][]Passed
unsent-field-difference scenario 3['b']['b']Passed
unsent-field-difference scenario 4[][]Passed
unsent-field-difference scenario 5['b']['b']Passed
unsent-field-difference scenario 6[][]Passed
conflict-preserves-local-fields scenario 1[][]Passed
conflict-preserves-local-fields scenario 2[][]Passed
conflict-preserves-local-fields scenario 3[][]Passed
conflict-preserves-local-fields scenario 4[][]Passed
conflict-preserves-local-fields scenario 5[][]Passed
conflict-preserves-local-fields scenario 6['a', 'b']['a', 'b']Passed
save-payload-field-snapshot scenario 1['a']['a']Passed
save-payload-field-snapshot scenario 2['a']['a']Passed
save-payload-field-snapshot scenario 3['a']['a']Passed
save-payload-field-snapshot scenario 4[][]Passed
save-payload-field-snapshot scenario 5['a']['a']Passed
save-payload-field-snapshot scenario 6['a', 'b']['a', 'b']Passed
unacknowledged-edit-distance scenario 122Passed
unacknowledged-edit-distance scenario 211Passed
unacknowledged-edit-distance scenario 322Passed
unacknowledged-edit-distance scenario 400Passed
unacknowledged-edit-distance scenario 522Passed
unacknowledged-edit-distance scenario 611Passed
resave-after-ack scenario 1TrueTruePassed
resave-after-ack scenario 2FalseFalsePassed
resave-after-ack scenario 3FalseFalsePassed
resave-after-ack scenario 4FalseFalsePassed
resave-after-ack scenario 5FalseFalsePassed
resave-after-ack scenario 6FalseFalsePassed
many edits during conflicting save: acknowledge-sent-revision11Passed
many edits during conflicting save: newer-edit-retains-dirty['a', 'b']['a', 'b']Passed
many edits during conflicting save: composition-defers-saveTrueTruePassed
many edits during conflicting save: save-completion-statusconflictconflictPassed
many edits during conflicting save: next-save-revision66Passed
many edits during conflicting save: unsent-field-difference['b']['b']Passed
many edits during conflicting save: conflict-preserves-local-fields['a', 'b']['a', 'b']Passed
many edits during conflicting save: save-payload-field-snapshot['a']['a']Passed
many edits during conflicting save: unacknowledged-edit-distance55Passed
many edits during conflicting save: resave-after-ackFalseFalsePassed

SHA-256 / 08a8a8ddde8f114e5e3dc0e5bc7412bd59cf88cb35bc079dd634b8df7c76b591

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

Case digest / 1c20e7e5b570a68b274a2fafbe40a4f104ece2f4bdea82efb28dd1beb70a10ff