FAILURE MAP
← Case archive

FA-36251 / Tab interfaces / Open access

Open document rename: document path update · case 01

The tab workspace reports an incorrect document path update.

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

ROOT CAUSE

The document path update decision uses x['paths'] instead of {d:(x['new_path'] if d==x['renamed'] else p) for d,p in x['paths'].items()}.

VERIFIED REPAIR

Use the stipulated workspace rule: {d:(x['new_path'] if d==x['renamed'] else p) for d,p in x['paths'].items()}.

Unsuccessful approach: The partial repair {d:x['new_path'] for d in x['paths']} still violates a workspace boundary or normal case.

Case contract

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

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 = [v for v,d in x['views'].items() if d==x['renamed']]
    r1 = x['new_path'].rsplit('/',1)[-1]
    r2 = x['paths']
    r3 = list(x['views'])
    r4 = x['dirty']
    r5 = x['active']
    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: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'])], 2: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3'])], 3: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3'])], 4: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3'])], 5: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e', 'extra3': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2', 'extra3'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3'])]}
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 fixtureActualExpectedOutcome
workspace regression 0[['v1', 'v3'], 'c.txt', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 1[['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 2[['v1', 'v3'], 'c.txt', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']Failed
workspace regression 3[['v1', 'v3'], 'c.txt', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']Failed
workspace regression 4[['v1', 'v3'], 'c.txt', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 5[['v1', 'v3'], 'report.md', {'d': '/old/a.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed

SHA-256 / 54db1bb67a47aed42156969157bdb98faa60cf3f298fda88955ac1489c9302b4

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    r0 = [v for v,d in x['views'].items() if d==x['renamed']]
    r1 = x['new_path'].rsplit('/',1)[-1]
    r2 = {d:x['new_path'] for d in x['paths']}
    r3 = list(x['views'])
    r4 = x['dirty']
    r5 = x['active']
    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: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'])], 2: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3'])], 3: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3'])], 4: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3'])], 5: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e', 'extra3': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2', 'extra3'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3'])]}
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 fixtureActualExpectedOutcome
workspace regression 0[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/new/c.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 1[['v2'], 'z.txt', {'d': '/new/z.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 2[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/new/c.txt'}, ['v1', 'v2', 'v3'], [], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']Failed
workspace regression 3[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/new/c.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']Failed
workspace regression 4[['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': 'c.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed
workspace regression 5[['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/deep/path/report.md'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Failed

SHA-256 / 09d60c762cff8ca6922aaf18ff2cf1d82dd3b3fb17506e522b6934d28ae0559e

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    r0 = [v for v,d in x['views'].items() if d==x['renamed']]
    r1 = x['new_path'].rsplit('/',1)[-1]
    r2 = {d:(x['new_path'] if d==x['renamed'] else p) for d,p in x['paths'].items()}
    r3 = list(x['views'])
    r4 = x['dirty']
    r5 = x['active']
    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: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'])], 2: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0'], ['d'], 'v3'])], 3: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1'], ['d'], 'v3'])], 4: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2'], ['d'], 'v3'])], 5: [({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'e', 'extra1': 'e', 'extra2': 'e', 'extra3': 'e'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'e', 'new_path': '/new/z.txt', 'dirty': ['d'], 'active': 'v3'}, [['v2', 'extra0', 'extra1', 'extra2', 'extra3'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': [], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], [], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/new/c.txt', 'dirty': ['d'], 'active': 'v2'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v2']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': 'c.txt', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3']), ({'views': {'v1': 'd', 'v2': 'e', 'v3': 'd', 'extra0': 'd', 'extra1': 'd', 'extra2': 'd', 'extra3': 'd'}, 'paths': {'d': '/old/a.txt', 'e': '/other/b.txt'}, 'renamed': 'd', 'new_path': '/deep/path/report.md', 'dirty': ['d'], 'active': 'v3'}, [['v1', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3', 'extra0', 'extra1', 'extra2', 'extra3'], ['d'], 'v3'])]}
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 fixtureActualExpectedOutcome
workspace regression 0[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Passed
workspace regression 1[['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v2'], 'z.txt', {'d': '/old/a.txt', 'e': '/new/z.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Passed
workspace regression 2[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], [], 'v3']Passed
workspace regression 3[['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2'][['v1', 'v3'], 'c.txt', {'d': '/new/c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v2']Passed
workspace regression 4[['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'c.txt', {'d': 'c.txt', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Passed
workspace regression 5[['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3'][['v1', 'v3'], 'report.md', {'d': '/deep/path/report.md', 'e': '/other/b.txt'}, ['v1', 'v2', 'v3'], ['d'], 'v3']Passed

SHA-256 / 7232e6142b2cf2f9785932a66360b98cba6550709310a491b02ced51748f973a

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

Case digest / 0a2ec25939794da9e1b9cc23ea70709573a313f9beffdcb4bb51dcf4e1b0f664