FA-36251 / Tab interfaces / Open access
Open document rename: document path update · case 01
The tab workspace reports an incorrect document path update.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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