FAILURE MAP
← Case archive

FA-35636 / Tab interfaces / Open access

Recently closed stack: remaining undo stack · case 01

The tab workspace reports an incorrect remaining undo stack.

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

ROOT CAUSE

The remaining undo stack decision uses [r[0] for r in x['stack']][:-1] instead of [r[0] for r in x['stack'] if r[0] not in x['deleted']][:-1].

VERIFIED REPAIR

Use the stipulated workspace rule: [r[0] for r in x['stack'] if r[0] not in x['deleted']][:-1].

Unsuccessful approach: The partial repair [r[0] for r in x['stack'] if r[0] not in x['deleted']][1:] still violates a workspace boundary or normal case.

Case contract

Closed tabs are restored LIFO with original group, insertion slot, document and viewport; skip tombstones and keep remaining stack order.

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 = next((r[0] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r1 = next((r[1] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r2 = next((min(r[2],x['group_sizes'][r[1]]) for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r3 = next((r[3] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r4 = [r[0] for r in x['stack'] if r[0] not in x['deleted']]
    r5 = [r[0] for r in x['stack']][:-1]
    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: [({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 30, ['a'], []]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 2: [({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 60, ['a'], []]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 3: [({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 90, ['a'], []]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 4: [({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 120, ['a'], []]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 5: [({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 150, ['a'], []]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])]}
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['b', 'h', 0, 50, ['a', 'b'], ['a', 'b']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Failed
workspace regression 1['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]Passed
workspace regression 2['a', 'g', 1, 30, ['a'], ['a', 'b']]['a', 'g', 1, 30, ['a'], []]Failed
workspace regression 3['b', 'h', 0, 50, ['a', 'b'], ['a', 'b']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Failed
workspace regression 4['c', 'g', 1, 20, ['b', 'c'], ['a', 'b']]['c', 'g', 1, 20, ['b', 'c'], ['b']]Failed
workspace regression 5['b', 'h', 1, 0, ['a', 'b'], ['a']]['b', 'h', 1, 0, ['a', 'b'], ['a']]Passed

SHA-256 / f20c0bc3f27d7751b713c8b9aa4618cdb87fbcfdca538728bc075b22d6c10160

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    r0 = next((r[0] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r1 = next((r[1] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r2 = next((min(r[2],x['group_sizes'][r[1]]) for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r3 = next((r[3] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r4 = [r[0] for r in x['stack'] if r[0] not in x['deleted']]
    r5 = [r[0] for r in x['stack'] if r[0] not in x['deleted']][1:]
    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: [({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 30, ['a'], []]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 2: [({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 60, ['a'], []]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 3: [({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 90, ['a'], []]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 4: [({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 120, ['a'], []]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 5: [({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 150, ['a'], []]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])]}
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['b', 'h', 0, 50, ['a', 'b'], ['b']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Failed
workspace regression 1['c', 'g', 1, 20, ['a', 'b', 'c'], ['b', 'c']]['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]Failed
workspace regression 2['a', 'g', 1, 30, ['a'], []]['a', 'g', 1, 30, ['a'], []]Passed
workspace regression 3['b', 'h', 0, 50, ['a', 'b'], ['b']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Failed
workspace regression 4['c', 'g', 1, 20, ['b', 'c'], ['c']]['c', 'g', 1, 20, ['b', 'c'], ['b']]Failed
workspace regression 5['b', 'h', 1, 0, ['a', 'b'], ['b']]['b', 'h', 1, 0, ['a', 'b'], ['a']]Failed

SHA-256 / f4b80d1ed30d6c1e1ac302e24be9d668eb13b901e27b5cef46c1e8a2192c4a49

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    r0 = next((r[0] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r1 = next((r[1] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r2 = next((min(r[2],x['group_sizes'][r[1]]) for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r3 = next((r[3] for r in reversed(x['stack']) if r[0] not in x['deleted']),None)
    r4 = [r[0] for r in x['stack'] if r[0] not in x['deleted']]
    r5 = [r[0] for r in x['stack'] if r[0] not in x['deleted']][:-1]
    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: [({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 30, ['a'], []]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 50, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 0, 50], ['c', 'g', 1, 20]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 20, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 30], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 2: [({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 60, ['a'], []]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 100, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 0, 100], ['c', 'g', 1, 40]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 40, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 60], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 3: [({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 90, ['a'], []]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 150, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 0, 150], ['c', 'g', 1, 60]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 60, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 90], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 4: [({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 120, ['a'], []]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 200, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 0, 200], ['c', 'g', 1, 80]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 80, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 120], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])], 5: [({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': [], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['a', 'b', 'c'], ['a', 'b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['b', 'c'], 'group_sizes': {'g': 1, 'h': 2}}, ['a', 'g', 1, 150, ['a'], []]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['c'], 'group_sizes': {'g': 4, 'h': 0}}, ['b', 'h', 0, 250, ['a', 'b'], ['a']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 0, 250], ['c', 'g', 1, 100]], 'deleted': ['a'], 'group_sizes': {'g': 1, 'h': 2}}, ['c', 'g', 1, 100, ['b', 'c'], ['b']]), ({'stack': [['a', 'g', 2, 150], ['b', 'h', 1, 0]], 'deleted': ['c'], 'group_sizes': {'g': 1, 'h': 2}}, ['b', 'h', 1, 0, ['a', 'b'], ['a']])]}
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['b', 'h', 0, 50, ['a', 'b'], ['a']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Passed
workspace regression 1['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]['c', 'g', 1, 20, ['a', 'b', 'c'], ['a', 'b']]Passed
workspace regression 2['a', 'g', 1, 30, ['a'], []]['a', 'g', 1, 30, ['a'], []]Passed
workspace regression 3['b', 'h', 0, 50, ['a', 'b'], ['a']]['b', 'h', 0, 50, ['a', 'b'], ['a']]Passed
workspace regression 4['c', 'g', 1, 20, ['b', 'c'], ['b']]['c', 'g', 1, 20, ['b', 'c'], ['b']]Passed
workspace regression 5['b', 'h', 1, 0, ['a', 'b'], ['a']]['b', 'h', 1, 0, ['a', 'b'], ['a']]Passed

SHA-256 / e60bd678a02720fc761c7b9e201f6a3ea39cd6dea6a2e5e3c5293d954ad9a112

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

Case digest / 544d5311f317ae6b9c9221f8541443b33dfaf8de6e33fc0065237777cdfeb2e0