FAILURE MAP
← Case archive

FA-24756 / Client state / Open access

A removed workspace leaves the client on an inaccessible last-visited workspace · case 01

A removed workspace leaves the client on an inaccessible last-visited workspace.

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

ROOT CAUSE

The faulty implementation violates If the current workspace becomes inaccessible, select the first accessible recent workspace, then an accessible default, otherwise no workspace.

VERIFIED REPAIR

If the current workspace becomes inaccessible, select the first accessible recent workspace, then an accessible default, otherwise no workspace.

Unsuccessful approach: The partial repair still violates at least one explicit regression oracle.

Case contract

If the current workspace becomes inaccessible, select the first accessible recent workspace, then an accessible default, otherwise no workspace.

Why this case matters

A bounded offline client-state transition with explicit lifecycle inputs.

1 / The failure

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

N = 1
observations = []
def solve(current, allowed, recent, default):
    return current
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('recent allowed preferred', solve('gone',['a','b'],['gone','b','a'],'a'), 'b')
check('current retained', solve('a',['a','b'],['b'],'b'), 'a')
check('default allowed', solve('gone',['a'],[],'a'), 'a')
check('default forbidden', solve('gone',['a'],[],'bad'), None)
check('no workspaces', solve('gone',[],['a'],'a'), None)
check('skip many inaccessible recent', solve('gone',['ok'],['bad'+str(i) for i in range(N)]+['ok'],'bad'), 'ok')
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
recent allowed preferredgonebFailed
current retainedaaPassed
default allowedgoneaFailed
default forbiddengoneNoneFailed
no workspacesgoneNoneFailed
skip many inaccessible recentgoneokFailed

SHA-256 / eb58f12bfc81a6c504ff74dc4ab95876e1075a78763f85bec9098a79113fb6a8

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(current, allowed, recent, default):
    return current if current in allowed else default
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('recent allowed preferred', solve('gone',['a','b'],['gone','b','a'],'a'), 'b')
check('current retained', solve('a',['a','b'],['b'],'b'), 'a')
check('default allowed', solve('gone',['a'],[],'a'), 'a')
check('default forbidden', solve('gone',['a'],[],'bad'), None)
check('no workspaces', solve('gone',[],['a'],'a'), None)
check('skip many inaccessible recent', solve('gone',['ok'],['bad'+str(i) for i in range(N)]+['ok'],'bad'), 'ok')
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
recent allowed preferredabFailed
current retainedaaPassed
default allowedaaPassed
default forbiddenbadNoneFailed
no workspacesaNoneFailed
skip many inaccessible recentbadokFailed

SHA-256 / 7ba74003eada805566326487518e42c31ed78fa541feb9d655b816f740f23671

3 / The verified repair

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

N = 1
observations = []
def solve(current, allowed, recent, default):
    return current if current in allowed else next((w for w in recent if w in allowed), default if default in allowed else None)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('recent allowed preferred', solve('gone',['a','b'],['gone','b','a'],'a'), 'b')
check('current retained', solve('a',['a','b'],['b'],'b'), 'a')
check('default allowed', solve('gone',['a'],[],'a'), 'a')
check('default forbidden', solve('gone',['a'],[],'bad'), None)
check('no workspaces', solve('gone',[],['a'],'a'), None)
check('skip many inaccessible recent', solve('gone',['ok'],['bad'+str(i) for i in range(N)]+['ok'],'bad'), 'ok')
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
recent allowed preferredbbPassed
current retainedaaPassed
default allowedaaPassed
default forbiddenNoneNonePassed
no workspacesNoneNonePassed
skip many inaccessible recentokokPassed

SHA-256 / b0cc5b87aa896e1064282b413ef789b84d951b9fe7cfe7e697fe1cff57d788f3

Verification & scope

This models the stated application policy only; 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:41:00.427852+00:00.

Case digest / 2376fe055c7712e16c25c269185e32e3ed4b03ebd675ecd103b96b98ae643526