FA-35836 / Tab interfaces / Open access
Save before close: revision cleanliness · case 01
The tab workspace reports an incorrect revision cleanliness.
ROOT CAUSE
The revision cleanliness decision uses x['saved_revision']<=x['revision'] instead of x['saved_revision']==x['revision'].
VERIFIED REPAIR
Use the stipulated workspace rule: x['saved_revision']==x['revision'].
Unsuccessful approach: The partial repair True still violates a workspace boundary or normal case.
Case contract
Closing a dirty tab waits for its save generation, accepts only matching successful completion, retains the tab on error/cancel and clears dirty only at the saved revision.
Why this case matters
Offline tab/panel workspace behavior; no browser or desktop framework is emulated.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
r0 = x['dirty']
r1 = x['request']==x['completion']
r2 = x['status']=='ok'
r3 = x['saved_revision']<=x['revision']
r4 = not x['dirty'] or (x['status']=='ok' and x['request']==x['completion'] and x['saved_revision']==x['revision'])
r5 = x['dirty'] and x['status']=='error' and x['request']==x['completion']
return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 2, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 6, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [False, True, True, True, True, False])], 2: [({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 4, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 12, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [False, True, True, True, True, False])], 3: [({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 6, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 18, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [False, True, True, True, True, False])], 4: [({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 8, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 24, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [False, True, True, True, True, False])], 5: [({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 10, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 30, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [False, True, True, True, True, False])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
check("workspace regression "+str(i), solve(inputs), expected)
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 |
|---|---|---|---|
| workspace regression 0 | [True, True, True, True, True, False] | [True, True, True, True, True, False] | Passed |
| workspace regression 1 | [True, True, False, True, False, True] | [True, True, False, True, False, True] | Passed |
| workspace regression 2 | [True, True, False, True, False, False] | [True, True, False, True, False, False] | Passed |
| workspace regression 3 | [True, False, True, True, False, False] | [True, False, True, True, False, False] | Passed |
| workspace regression 4 | [True, True, True, True, False, False] | [True, True, True, False, False, False] | Failed |
| workspace regression 5 | [False, True, True, True, True, False] | [False, True, True, True, True, False] | Passed |
SHA-256 / 7ac02baa6bfcc19cabf4640c56b372b12766c6ab4d57dc3a7ac020218b0029f1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
r0 = x['dirty']
r1 = x['request']==x['completion']
r2 = x['status']=='ok'
r3 = True
r4 = not x['dirty'] or (x['status']=='ok' and x['request']==x['completion'] and x['saved_revision']==x['revision'])
r5 = x['dirty'] and x['status']=='error' and x['request']==x['completion']
return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 2, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 6, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [False, True, True, True, True, False])], 2: [({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 4, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 12, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [False, True, True, True, True, False])], 3: [({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 6, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 18, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [False, True, True, True, True, False])], 4: [({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 8, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 24, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [False, True, True, True, True, False])], 5: [({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 10, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 30, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [False, True, True, True, True, False])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
check("workspace regression "+str(i), solve(inputs), expected)
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 |
|---|---|---|---|
| workspace regression 0 | [True, True, True, True, True, False] | [True, True, True, True, True, False] | Passed |
| workspace regression 1 | [True, True, False, True, False, True] | [True, True, False, True, False, True] | Passed |
| workspace regression 2 | [True, True, False, True, False, False] | [True, True, False, True, False, False] | Passed |
| workspace regression 3 | [True, False, True, True, False, False] | [True, False, True, True, False, False] | Passed |
| workspace regression 4 | [True, True, True, True, False, False] | [True, True, True, False, False, False] | Failed |
| workspace regression 5 | [False, True, True, True, True, False] | [False, True, True, True, True, False] | Passed |
SHA-256 / a6e9a5a524b014cacc5183d8e877c39fd313a9fd412a2efd27f6d8f6beb51584
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
r0 = x['dirty']
r1 = x['request']==x['completion']
r2 = x['status']=='ok'
r3 = x['saved_revision']==x['revision']
r4 = not x['dirty'] or (x['status']=='ok' and x['request']==x['completion'] and x['saved_revision']==x['revision'])
r5 = x['dirty'] and x['status']=='error' and x['request']==x['completion']
return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 2, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 7, 'saved_revision': 6, 'request': 3, 'completion': 3, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 7, 'saved_revision': 7, 'request': 3, 'completion': 3, 'status': 'ok'}, [False, True, True, True, True, False])], 2: [({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 4, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 14, 'saved_revision': 12, 'request': 6, 'completion': 6, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 14, 'saved_revision': 14, 'request': 6, 'completion': 6, 'status': 'ok'}, [False, True, True, True, True, False])], 3: [({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 6, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 21, 'saved_revision': 18, 'request': 9, 'completion': 9, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 21, 'saved_revision': 21, 'request': 9, 'completion': 9, 'status': 'ok'}, [False, True, True, True, True, False])], 4: [({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 8, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 28, 'saved_revision': 24, 'request': 12, 'completion': 12, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 28, 'saved_revision': 28, 'request': 12, 'completion': 12, 'status': 'ok'}, [False, True, True, True, True, False])], 5: [({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, True, True, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'error'}, [True, True, False, True, False, True]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'cancel'}, [True, True, False, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 10, 'status': 'ok'}, [True, False, True, True, False, False]), ({'dirty': True, 'revision': 35, 'saved_revision': 30, 'request': 15, 'completion': 15, 'status': 'ok'}, [True, True, True, False, False, False]), ({'dirty': False, 'revision': 35, 'saved_revision': 35, 'request': 15, 'completion': 15, 'status': 'ok'}, [False, True, True, True, True, False])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
check("workspace regression "+str(i), solve(inputs), expected)
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 |
|---|---|---|---|
| workspace regression 0 | [True, True, True, True, True, False] | [True, True, True, True, True, False] | Passed |
| workspace regression 1 | [True, True, False, True, False, True] | [True, True, False, True, False, True] | Passed |
| workspace regression 2 | [True, True, False, True, False, False] | [True, True, False, True, False, False] | Passed |
| workspace regression 3 | [True, False, True, True, False, False] | [True, False, True, True, False, False] | Passed |
| workspace regression 4 | [True, True, True, False, False, False] | [True, True, True, False, False, False] | Passed |
| workspace regression 5 | [False, True, True, True, True, False] | [False, True, True, True, True, False] | Passed |
SHA-256 / 0635a22e03de4f3b74bf4d6c04ffe86017b551dd48aaec9ba2ad1c3fb8878729
Verification & scope
Finite stipulated workspace snapshots only. Independent result fields describe observable obligations, not a full UI runtime. 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:42:45.419657+00:00.
Case digest / 41b184f5338f459c69a6d2315c3749f620f9d1b8c67cfcd5a57172e681ec477f