FAILURE MAP
← Case archive

FA-24816 / Client state / Open access

Cancelling a parent render transition leaves nested work attached · case 01

Cancelling a parent render transition leaves nested work attached.

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

ROOT CAUSE

The faulty implementation violates Cancelling a render transition cancels its descendant task tree transitively, including descendants of an already-removed parent, without cancelling ancestors or unrelated roots.

VERIFIED REPAIR

Cancelling a render transition cancels its descendant task tree transitively, including descendants of an already-removed parent, without cancelling ancestors or unrelated roots.

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

Case contract

Cancelling a render transition cancels its descendant task tree transitively, including descendants of an already-removed parent, without cancelling ancestors or unrelated roots.

Why this case matters

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

1 / The failure

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

N = 1
observations = []
def solve(tasks, cancelled):
    return [task for task,parent in tasks if task not in cancelled]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('nested descendants', solve([('a',None),('b','a'),('c','b'),('side',None)],['a']), ['side'])
check('child cancellation keeps parent', solve([('a',None),('b','a')],['b']), ['a'])
check('no cancellation', solve([('a',None)],[]), ['a'])
check('unknown root cancellation', solve([('a','missing')],['missing']), [])
check('separate trees', solve([('a',None),('b',None),('c','b')],['a']), ['b','c'])
check('parameterized deep chain', solve([(str(i),None if i==0 else str(i-1)) for i in range(N+3)],['0']), [])
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
nested descendants['b', 'c', 'side']['side']Failed
child cancellation keeps parent['a']['a']Passed
no cancellation['a']['a']Passed
unknown root cancellation['a'][]Failed
separate trees['b', 'c']['b', 'c']Passed
parameterized deep chain['1', '2', '3'][]Failed

SHA-256 / dacf98f5473d19f6541047184330ba3d1942779052ca5a9a9ed7e929212400e5

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(tasks, cancelled):
    return [task for task,parent in tasks if task not in cancelled and parent not in cancelled]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('nested descendants', solve([('a',None),('b','a'),('c','b'),('side',None)],['a']), ['side'])
check('child cancellation keeps parent', solve([('a',None),('b','a')],['b']), ['a'])
check('no cancellation', solve([('a',None)],[]), ['a'])
check('unknown root cancellation', solve([('a','missing')],['missing']), [])
check('separate trees', solve([('a',None),('b',None),('c','b')],['a']), ['b','c'])
check('parameterized deep chain', solve([(str(i),None if i==0 else str(i-1)) for i in range(N+3)],['0']), [])
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
nested descendants['c', 'side']['side']Failed
child cancellation keeps parent['a']['a']Passed
no cancellation['a']['a']Passed
unknown root cancellation[][]Passed
separate trees['b', 'c']['b', 'c']Passed
parameterized deep chain['2', '3'][]Failed

SHA-256 / fc2d79c762004fcb3c57faff05c10a88eaee71b0177b6a7cc067ac07c18d9704

3 / The verified repair

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

N = 1
observations = []
def solve(tasks, cancelled):
    dead=set(cancelled)
    while True:
        grown=dead|{task for task,parent in tasks if parent in dead}
        if grown==dead: break
        dead=grown
    return [task for task,parent in tasks if task not in dead]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('nested descendants', solve([('a',None),('b','a'),('c','b'),('side',None)],['a']), ['side'])
check('child cancellation keeps parent', solve([('a',None),('b','a')],['b']), ['a'])
check('no cancellation', solve([('a',None)],[]), ['a'])
check('unknown root cancellation', solve([('a','missing')],['missing']), [])
check('separate trees', solve([('a',None),('b',None),('c','b')],['a']), ['b','c'])
check('parameterized deep chain', solve([(str(i),None if i==0 else str(i-1)) for i in range(N+3)],['0']), [])
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
nested descendants['side']['side']Passed
child cancellation keeps parent['a']['a']Passed
no cancellation['a']['a']Passed
unknown root cancellation[][]Passed
separate trees['b', 'c']['b', 'c']Passed
parameterized deep chain[][]Passed

SHA-256 / 7a1b2df5c04fe1ae281e7a30131fbea639a82986f248f07917b97fb736dd1331

Verification & scope

This models the stated application policy only; no browser or framework conformance is claimed. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:41:00.999291+00:00.

Case digest / 650194feaf66b75c3088a13af346e2008c6da9b511a4a47f625611246f2ef3ee