FAILURE MAP
← Case archive

FA-10716 / Rendering state / Open access

Blend state separate alpha · case 01

The RGB blend factor is reused for a separately configured alpha factor.

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

ROOT CAUSE

The RGB blend factor is reused for a separately configured alpha factor.

VERIFIED REPAIR

Use the stage contract: Apply independent normalized scalar blend factors to one RGB channel and the alpha channel.

Unsuccessful approach: Using the alpha factor for both channels reverses which configured state is lost.

Case contract

Apply independent normalized scalar blend factors to one RGB channel and the alpha channel.

Why this case matters

A deterministic software graphics stage with explicit channel and coordinate conventions; no hardware, device profile or API behavior is inferred.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(rgb_factor, alpha_factor, rgb, alpha):
    return [rgb*rgb_factor,alpha*rgb_factor]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve(*(0.5, 1, 0.5, 0.5)), [0.25, 0.5])
check('fixture 2', solve(*(1, 0.5, 0.5, 0.5)), [0.5, 0.25])
check('fixture 3', solve(*(0, 0, 1, 1)), [0, 0])
check('fixture 4', solve(*(1, 1, 0.25, 0.75)), [0.25, 0.75])
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
fixture 1[0.25, 0.25][0.25, 0.5]Failed
fixture 2[0.5, 0.5][0.5, 0.25]Failed
fixture 3[0, 0][0, 0]Passed
fixture 4[0.25, 0.75][0.25, 0.75]Passed

SHA-256 / 8f6ee3740af4b6632551119b53b16d904be4dade137bb113c922e298d3d773d2

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(rgb_factor, alpha_factor, rgb, alpha):
    return [rgb*alpha_factor,alpha*alpha_factor]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve(*(0.5, 1, 0.5, 0.5)), [0.25, 0.5])
check('fixture 2', solve(*(1, 0.5, 0.5, 0.5)), [0.5, 0.25])
check('fixture 3', solve(*(0, 0, 1, 1)), [0, 0])
check('fixture 4', solve(*(1, 1, 0.25, 0.75)), [0.25, 0.75])
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
fixture 1[0.5, 0.5][0.25, 0.5]Failed
fixture 2[0.25, 0.25][0.5, 0.25]Failed
fixture 3[0, 0][0, 0]Passed
fixture 4[0.25, 0.75][0.25, 0.75]Passed

SHA-256 / 028204a10fe489ba4da65b4982929f4eb0edf13e78a7cfaf5ddb67c75fccfb59

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(rgb_factor, alpha_factor, rgb, alpha):
    return [rgb*rgb_factor,alpha*alpha_factor]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve(*(0.5, 1, 0.5, 0.5)), [0.25, 0.5])
check('fixture 2', solve(*(1, 0.5, 0.5, 0.5)), [0.5, 0.25])
check('fixture 3', solve(*(0, 0, 1, 1)), [0, 0])
check('fixture 4', solve(*(1, 1, 0.25, 0.75)), [0.25, 0.75])
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
fixture 1[0.25, 0.5][0.25, 0.5]Passed
fixture 2[0.5, 0.25][0.5, 0.25]Passed
fixture 3[0, 0][0, 0]Passed
fixture 4[0.25, 0.75][0.25, 0.75]Passed

SHA-256 / 3e5b7c528e4cac4e3b58cfc84883e35b8cbf3a1ff0e0fd2b484e4e650547cb5c

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

Case digest / f5c1282bdabd5c9abefb5514f10ada30799a8f2d3cff02a8cd09e2c5189d46d4