FAILURE MAP
← Case archive

FA-1276 / Workflow orchestration / Open access

Complete workflow cancellation: Cancellation leaves dependent child workflows executing · case 01

The workflow cancel operation is admitted even though cancellation leaves dependent child workflows executing.

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

ROOT CAUSE

The admission path omits the child propagation invariant while validating the other operation preconditions.

VERIFIED REPAIR

Require all(r['child_propagation']) together with every other stated precondition before accepting the operation.

Unsuccessful approach: Adding the child propagation check repairs the reported defect, but replacing the adjacent activity cleanup check loses that independent invariant.

Case contract

Return a Boolean admission decision for complete workflow cancellation. The record r must satisfy all of: all(r['child_propagation']); r['activity_cleanup'] is True; r['terminal_stability'] not in ['completed','failed']; r['request_generation'][0] == r['request_generation'][1]; r['cleanup_deadline'][0] <= r['cleanup_deadline'][1]. Extra tracing fields are ignored; validation does not mutate the record.

Why this case matters

A deterministic local contract for workflow orchestration. Each negative fixture violates exactly one invariant. No transport timing, persistence, cryptographic verification, or full protocol implementation is claimed.

1 / The failure

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

N = 1
observations = []
def solve(r):
    return (r['activity_cleanup'] is True) and (r['terminal_stability'] not in ['completed','failed']) and (r['request_generation'][0] == r['request_generation'][1]) and (r['cleanup_deadline'][0] <= r['cleanup_deadline'][1])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
r = {'child_propagation': [True, True], 'activity_cleanup': True, 'terminal_stability': 'running', 'request_generation': ['r3', 'r3'], 'cleanup_deadline': [10, 10]}
check('valid operation', solve(r), True)
check('Cancellation leaves dependent child workflows executing', solve(dict(r, **{'child_propagation': [True, False]})), False)
check('Cancellation completes before required activity cleanup', solve(dict(r, **{'activity_cleanup': False})), False)
check('Cancellation rewrites an already successful terminal result', solve(dict(r, **{'terminal_stability': 'completed'})), False)
check('An old cancellation request terminates a newer run', solve(dict(r, **{'request_generation': ['r2', 'r3']})), False)
check('Cancellation waits beyond its explicit cleanup deadline', solve(dict(r, **{'cleanup_deadline': [11, 10]})), False)
check('unrelated tracing metadata', solve(dict(r, trace='run-'+str(N))), True)
check('repeat validation is pure', solve(r), True)
invalid = {'child_propagation': [True, False], 'activity_cleanup': False, 'terminal_stability': 'completed', 'request_generation': ['r2', 'r3'], 'cleanup_deadline': [11, 10]}
keys = list(invalid)
pair = {keys[N % len(keys)]: invalid[keys[N % len(keys)]], keys[(N+1) % len(keys)]: invalid[keys[(N+1) % len(keys)]]}
check('two independent violations in variant', solve(dict(r, **pair)), False)
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
valid operationTrueTruePassed
Cancellation leaves dependent child workflows executingTrueFalseFailed
Cancellation completes before required activity cleanupFalseFalsePassed
Cancellation rewrites an already successful terminal resultFalseFalsePassed
An old cancellation request terminates a newer runFalseFalsePassed
Cancellation waits beyond its explicit cleanup deadlineFalseFalsePassed
unrelated tracing metadataTrueTruePassed
repeat validation is pureTrueTruePassed
two independent violations in variantFalseFalsePassed

SHA-256 / 73e922c5e04f241702e34469128eae03b34799e576bbb81005385417d22363f3

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(r):
    return (all(r['child_propagation'])) and (r['terminal_stability'] not in ['completed','failed']) and (r['request_generation'][0] == r['request_generation'][1]) and (r['cleanup_deadline'][0] <= r['cleanup_deadline'][1])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
r = {'child_propagation': [True, True], 'activity_cleanup': True, 'terminal_stability': 'running', 'request_generation': ['r3', 'r3'], 'cleanup_deadline': [10, 10]}
check('valid operation', solve(r), True)
check('Cancellation leaves dependent child workflows executing', solve(dict(r, **{'child_propagation': [True, False]})), False)
check('Cancellation completes before required activity cleanup', solve(dict(r, **{'activity_cleanup': False})), False)
check('Cancellation rewrites an already successful terminal result', solve(dict(r, **{'terminal_stability': 'completed'})), False)
check('An old cancellation request terminates a newer run', solve(dict(r, **{'request_generation': ['r2', 'r3']})), False)
check('Cancellation waits beyond its explicit cleanup deadline', solve(dict(r, **{'cleanup_deadline': [11, 10]})), False)
check('unrelated tracing metadata', solve(dict(r, trace='run-'+str(N))), True)
check('repeat validation is pure', solve(r), True)
invalid = {'child_propagation': [True, False], 'activity_cleanup': False, 'terminal_stability': 'completed', 'request_generation': ['r2', 'r3'], 'cleanup_deadline': [11, 10]}
keys = list(invalid)
pair = {keys[N % len(keys)]: invalid[keys[N % len(keys)]], keys[(N+1) % len(keys)]: invalid[keys[(N+1) % len(keys)]]}
check('two independent violations in variant', solve(dict(r, **pair)), False)
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
valid operationTrueTruePassed
Cancellation leaves dependent child workflows executingFalseFalsePassed
Cancellation completes before required activity cleanupTrueFalseFailed
Cancellation rewrites an already successful terminal resultFalseFalsePassed
An old cancellation request terminates a newer runFalseFalsePassed
Cancellation waits beyond its explicit cleanup deadlineFalseFalsePassed
unrelated tracing metadataTrueTruePassed
repeat validation is pureTrueTruePassed
two independent violations in variantFalseFalsePassed

SHA-256 / eff354d03059d83aeedc62be7a31b0be3cb29909c112e5558fb2fd2649143d57

3 / The verified repair

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

N = 1
observations = []
def solve(r):
    return (all(r['child_propagation'])) and (r['activity_cleanup'] is True) and (r['terminal_stability'] not in ['completed','failed']) and (r['request_generation'][0] == r['request_generation'][1]) and (r['cleanup_deadline'][0] <= r['cleanup_deadline'][1])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
r = {'child_propagation': [True, True], 'activity_cleanup': True, 'terminal_stability': 'running', 'request_generation': ['r3', 'r3'], 'cleanup_deadline': [10, 10]}
check('valid operation', solve(r), True)
check('Cancellation leaves dependent child workflows executing', solve(dict(r, **{'child_propagation': [True, False]})), False)
check('Cancellation completes before required activity cleanup', solve(dict(r, **{'activity_cleanup': False})), False)
check('Cancellation rewrites an already successful terminal result', solve(dict(r, **{'terminal_stability': 'completed'})), False)
check('An old cancellation request terminates a newer run', solve(dict(r, **{'request_generation': ['r2', 'r3']})), False)
check('Cancellation waits beyond its explicit cleanup deadline', solve(dict(r, **{'cleanup_deadline': [11, 10]})), False)
check('unrelated tracing metadata', solve(dict(r, trace='run-'+str(N))), True)
check('repeat validation is pure', solve(r), True)
invalid = {'child_propagation': [True, False], 'activity_cleanup': False, 'terminal_stability': 'completed', 'request_generation': ['r2', 'r3'], 'cleanup_deadline': [11, 10]}
keys = list(invalid)
pair = {keys[N % len(keys)]: invalid[keys[N % len(keys)]], keys[(N+1) % len(keys)]: invalid[keys[(N+1) % len(keys)]]}
check('two independent violations in variant', solve(dict(r, **pair)), False)
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
valid operationTrueTruePassed
Cancellation leaves dependent child workflows executingFalseFalsePassed
Cancellation completes before required activity cleanupFalseFalsePassed
Cancellation rewrites an already successful terminal resultFalseFalsePassed
An old cancellation request terminates a newer runFalseFalsePassed
Cancellation waits beyond its explicit cleanup deadlineFalseFalsePassed
unrelated tracing metadataTrueTruePassed
repeat validation is pureTrueTruePassed
two independent violations in variantFalseFalsePassed

SHA-256 / c81db3daacf3710610940096e79f737fdb7224efd26fb113cf3e20bb9fa0ba3d

Verification & scope

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

Case digest / e8d04d2e829931ba1e95fc7cfdabc7cdc5675a01cb0e01963b70d6168492483e