FA-35841 / Tab interfaces / Open access
Save before close: close commit · case 01
The tab workspace reports an incorrect close commit.
ROOT CAUSE
The close commit decision uses x['status']=='ok' instead of not x['dirty'] or (x['status']=='ok' and x['request']==x['completion'] and x['saved_revision']==x['revision']).
VERIFIED REPAIR
Use the stipulated workspace rule: not x['dirty'] or (x['status']=='ok' and x['request']==x['completion'] and x['saved_revision']==x['revision']).
Unsuccessful approach: The partial repair not x['dirty'] or x['status']=='ok' 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 = x['status']=='ok'
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, True, False] | [True, False, True, True, False, False] | Failed |
| workspace regression 4 | [True, True, True, False, True, 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 / 3d7982f3c33bc209c50055157a24ecf54c11c9d5097ab109a32d2b610fedac53
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 = x['saved_revision']==x['revision']
r4 = not x['dirty'] or x['status']=='ok'
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, True, False] | [True, False, True, True, False, False] | Failed |
| workspace regression 4 | [True, True, True, False, True, 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 / 74dae3b290c1f497451f94418c8237ec3105329dd6f243358234ac5f0ce4cf86
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.429827+00:00.
Case digest / 30e27b5e67641c1eed5fcd7eb36e55f8c1c4c10df2d4a2fa5655dc52d7c6c372