FA-93676 / Solar tracker geometry / Open access
Overcast diffuse flat stow: blend band edge · case 01
At the lower edge of the blend band status reports blend while the angle is unchanged.
ROOT CAUSE
The blend band includes its lower edge.
VERIFIED REPAIR
Blend only when df is strictly inside the band.
Unsuccessful approach: Placing the band above the threshold disables blending.
Case contract
ghi <= 0 returns [0.0, night]. Diffuse fraction df = dhi*100/ghi percent (may exceed 100 with sensor noise). df >= thresh_pct: [0.0, 'diffuse']. If blend > 0 and df > thresh_pct - blend the angle is ideal*(thresh_pct - df)/blend ('blend'). Otherwise [ideal, 'track']. Angles rounded to 3.
Why this case matters
Single-axis and dual-axis solar trackers turn a sun direction into actuator commands; a sign, frame or limit mistake points a whole plant away from the sun or into a mechanical stop.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ghi, dhi, ideal, thresh_pct, blend):
if ghi <= 0:
return [0.0, 'night']
df = dhi * 100 / ghi
if df >= thresh_pct:
return [0.0, 'diffuse']
if blend > 0 and df >= thresh_pct - blend:
return [round(ideal * (thresh_pct - df) / blend, 3), 'blend']
return [round(float(ideal), 3), 'track']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 0, 70, 20], [0.0, 'blend']],
['control 1', [100, 400, -30, 70, 20], [0.0, 'diffuse']],
['control 2', [0, 80, 0, 70, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 0, 70, 20], [0.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [100, 400, -30, 70, 0], [0.0, 'diffuse']],
['control 2', [100, 0, 0, 70, 0], [0.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [200, 160, 25, 70, 0], [0.0, 'diffuse']],
['control 2', [800, 160, -50, 80, 20], [-50.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 80, -30, 80, 0], [-30.0, 'track']],
['control 2', [0, 60, 25, 80, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 400, 0, 80, 10], [0.0, 'diffuse']],
['control 2', [100, 400, -30, 70, 0], [0.0, 'diffuse']]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| boundary: diffuse fraction at threshold | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| boundary: blend band lower edge | [30.0, 'blend'] | [30.0, 'track'] | Failed |
| normal: clear sky | [-45.0, 'track'] | [-45.0, 'track'] | Passed |
| regression: blend band edge | [25.0, 'blend'] | [25.0, 'track'] | Failed |
| regression: blend band edge (partial repair) | [0.0, 'blend'] | [0.0, 'blend'] | Passed |
| control 1 | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| control 2 | [0.0, 'night'] | [0.0, 'night'] | Passed |
SHA-256 / cef0b8b1b39ca90592e13bbda1898e814ffd1071db6cdfe0a3ae8fa1bfdf20c2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ghi, dhi, ideal, thresh_pct, blend):
if ghi <= 0:
return [0.0, 'night']
df = dhi * 100 / ghi
if df >= thresh_pct:
return [0.0, 'diffuse']
if blend > 0 and df > thresh_pct + blend:
return [round(ideal * (thresh_pct - df) / blend, 3), 'blend']
return [round(float(ideal), 3), 'track']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 0, 70, 20], [0.0, 'blend']],
['control 1', [100, 400, -30, 70, 20], [0.0, 'diffuse']],
['control 2', [0, 80, 0, 70, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 0, 70, 20], [0.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [100, 400, -30, 70, 0], [0.0, 'diffuse']],
['control 2', [100, 0, 0, 70, 0], [0.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [200, 160, 25, 70, 0], [0.0, 'diffuse']],
['control 2', [800, 160, -50, 80, 20], [-50.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 80, -30, 80, 0], [-30.0, 'track']],
['control 2', [0, 60, 25, 80, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 400, 0, 80, 10], [0.0, 'diffuse']],
['control 2', [100, 400, -30, 70, 0], [0.0, 'diffuse']]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| boundary: diffuse fraction at threshold | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| boundary: blend band lower edge | [30.0, 'track'] | [30.0, 'track'] | Passed |
| normal: clear sky | [-45.0, 'track'] | [-45.0, 'track'] | Passed |
| regression: blend band edge | [25.0, 'track'] | [25.0, 'track'] | Passed |
| regression: blend band edge (partial repair) | [0.0, 'track'] | [0.0, 'blend'] | Failed |
| control 1 | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| control 2 | [0.0, 'night'] | [0.0, 'night'] | Passed |
SHA-256 / b4312d3203df5e16d4605152c42092e808f5e3c7c35bb0780d03dedea013cfad
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ghi, dhi, ideal, thresh_pct, blend):
if ghi <= 0:
return [0.0, 'night']
df = dhi * 100 / ghi
if df >= thresh_pct:
return [0.0, 'diffuse']
if blend > 0 and df > thresh_pct - blend:
return [round(ideal * (thresh_pct - df) / blend, 3), 'blend']
return [round(float(ideal), 3), 'track']
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 0, 70, 20], [0.0, 'blend']],
['control 1', [100, 400, -30, 70, 20], [0.0, 'diffuse']],
['control 2', [0, 80, 0, 70, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 0, 70, 20], [0.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [100, 400, -30, 70, 0], [0.0, 'diffuse']],
['control 2', [100, 0, 0, 70, 0], [0.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [200, 160, 25, 70, 0], [0.0, 'diffuse']],
['control 2', [800, 160, -50, 80, 20], [-50.0, 'track']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 80, -30, 80, 0], [-30.0, 'track']],
['control 2', [0, 60, 25, 80, 0], [0.0, 'night']]],
[['boundary: diffuse fraction at threshold', [400, 280, 30, 70, 10], [0.0, 'diffuse']],
['boundary: blend band lower edge', [400, 240, 30, 70, 10], [30.0, 'track']],
['normal: clear sky', [800, 80, -45, 70, 10], [-45.0, 'track']],
['regression: blend band edge', [200, 100, 25, 60, 10], [25.0, 'track']],
['regression: blend band edge (partial repair)', [100, 60, 45, 70, 20], [22.5, 'blend']],
['control 1', [400, 400, 0, 80, 10], [0.0, 'diffuse']],
['control 2', [100, 400, -30, 70, 0], [0.0, 'diffuse']]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| boundary: diffuse fraction at threshold | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| boundary: blend band lower edge | [30.0, 'track'] | [30.0, 'track'] | Passed |
| normal: clear sky | [-45.0, 'track'] | [-45.0, 'track'] | Passed |
| regression: blend band edge | [25.0, 'track'] | [25.0, 'track'] | Passed |
| regression: blend band edge (partial repair) | [0.0, 'blend'] | [0.0, 'blend'] | Passed |
| control 1 | [0.0, 'diffuse'] | [0.0, 'diffuse'] | Passed |
| control 2 | [0.0, 'night'] | [0.0, 'night'] | Passed |
SHA-256 / f5c787dfd69e026d07809e34dfb0d28ff90c64873cc9fb276a3e0eca55ca06c8
Verification & scope
Deterministic stipulated toy contract for teaching; no claim of conformance with any standard, vendor protocol or production controller. 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:51:57.415875+00:00.
Case digest / 932eb7d877df3f6b41dde82b8b30b67fb5138c53378fed547053bf7209e185d9