FA-10716 / Rendering state / Open access
Blend state separate alpha · case 01
The RGB blend factor is reused for a separately configured alpha factor.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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