FA-24776 / Client state / Open access
A transition disappears while one of its spawned child tasks remains unresolved · case 01
A transition disappears while one of its spawned child tasks remains unresolved.
ROOT CAUSE
The faulty implementation violates A transition owns a set of child task identities. A finish/failure settles only its child; unknown or repeated completion cannot clear siblings; failures are reported separately from remaining work.
VERIFIED REPAIR
A transition owns a set of child task identities. A finish/failure settles only its child; unknown or repeated completion cannot clear siblings; failures are reported separately from remaining work.
Unsuccessful approach: The partial repair still violates at least one explicit regression oracle.
Case contract
A transition owns a set of child task identities. A finish/failure settles only its child; unknown or repeated completion cannot clear siblings; failures are reported separately from remaining work.
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(events):
pending=False; errors=[]
for kind,task in events:
pending=kind=='start'
if kind=='fail': errors.append(task)
return (['pending'] if pending else []),errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sibling remains', solve([('start','a'),('start','b'),('finish','a')]), (['b'],[]))
check('failed child releases only itself', solve([('start','a'),('start','b'),('fail','a')]), (['b'],['a']))
check('all finished', solve([('start','a'),('finish','a')]), ([],[]))
check('unknown finish', solve([('start','a'),('finish','x')]), (['a'],[]))
check('duplicate completion', solve([('start','a'),('finish','a'),('finish','a')]), ([],[]))
check('parameterized children', solve([('start',str(i)) for i in range(N+1)]+[('finish','0')]), (sorted(str(i) for i in range(1,N+1)),[]))
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 |
|---|---|---|---|
| sibling remains | [[], []] | [['b'], []] | Failed |
| failed child releases only itself | [[], ['a']] | [['b'], ['a']] | Failed |
| all finished | [[], []] | [[], []] | Passed |
| unknown finish | [[], []] | [['a'], []] | Failed |
| duplicate completion | [[], []] | [[], []] | Passed |
| parameterized children | [[], []] | [['1'], []] | Failed |
SHA-256 / bff581dc6533c53aaa1838a4ab622b3091cd4eeb8d033aeea0f42861b8b55a20
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
pending=set(); errors=[]
for kind,task in events:
if kind=='start': pending.add(task)
elif kind in ('finish','fail'): pending.clear()
if kind=='fail': errors.append(task)
return sorted(pending),errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sibling remains', solve([('start','a'),('start','b'),('finish','a')]), (['b'],[]))
check('failed child releases only itself', solve([('start','a'),('start','b'),('fail','a')]), (['b'],['a']))
check('all finished', solve([('start','a'),('finish','a')]), ([],[]))
check('unknown finish', solve([('start','a'),('finish','x')]), (['a'],[]))
check('duplicate completion', solve([('start','a'),('finish','a'),('finish','a')]), ([],[]))
check('parameterized children', solve([('start',str(i)) for i in range(N+1)]+[('finish','0')]), (sorted(str(i) for i in range(1,N+1)),[]))
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 |
|---|---|---|---|
| sibling remains | [[], []] | [['b'], []] | Failed |
| failed child releases only itself | [[], ['a']] | [['b'], ['a']] | Failed |
| all finished | [[], []] | [[], []] | Passed |
| unknown finish | [[], []] | [['a'], []] | Failed |
| duplicate completion | [[], []] | [[], []] | Passed |
| parameterized children | [[], []] | [['1'], []] | Failed |
SHA-256 / 7a714f7e74de78f490c5e1e391243d197cca72eb0b2a3068d417243e6e3f117d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(events):
pending=set(); errors=[]
for kind,task in events:
if kind=='start': pending.add(task)
elif kind=='finish': pending.discard(task)
elif kind=='fail': pending.discard(task); errors.append(task)
return sorted(pending),errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sibling remains', solve([('start','a'),('start','b'),('finish','a')]), (['b'],[]))
check('failed child releases only itself', solve([('start','a'),('start','b'),('fail','a')]), (['b'],['a']))
check('all finished', solve([('start','a'),('finish','a')]), ([],[]))
check('unknown finish', solve([('start','a'),('finish','x')]), (['a'],[]))
check('duplicate completion', solve([('start','a'),('finish','a'),('finish','a')]), ([],[]))
check('parameterized children', solve([('start',str(i)) for i in range(N+1)]+[('finish','0')]), (sorted(str(i) for i in range(1,N+1)),[]))
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 |
|---|---|---|---|
| sibling remains | [['b'], []] | [['b'], []] | Passed |
| failed child releases only itself | [['b'], ['a']] | [['b'], ['a']] | Passed |
| all finished | [[], []] | [[], []] | Passed |
| unknown finish | [['a'], []] | [['a'], []] | Passed |
| duplicate completion | [[], []] | [[], []] | Passed |
| parameterized children | [['1'], []] | [['1'], []] | Passed |
SHA-256 / 752c3cc92c4b425ede403d81d66c73146dd134711aaf19b52609a869c35c635c
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.619942+00:00.
Case digest / 307298be94fd30590b13a410df1e86f58591209c1ac786b966c57208da9ece33