Skip to content

LOAD_SUPPORT shadow-price gate: near-tie residual leaves some overnight grid imports uncovered #393

Description

@johanzander

Context

Split out from PR #385 (LOAD_SUPPORT shadow-price discharge gate, closing #384) during code review. The CHANGELOG and docs/agents/bess-knowledge.md entries for #385 originally cited #276 as the tracked follow-up for a documented residual limitation, but #276 is closed and is about an unrelated topic (DP grid-discretization/interpolation error from #275, concluded "financially optimal" per the #275/#276/#285 investigation — see PR #286). This issue is the correct tracking home for the #385-specific residual instead.

The residual limitation

docs/agents/bess-knowledge.md's "Known limitation, not yet fixed" note (added by #385): during a sustained overnight LOAD_SUPPORT drawdown, shadow_price tends to sit within a cent or two of buy_price for the entire stretch — close to the defining condition for choosing LOAD_SUPPORT at all — so intra_period_discharge_gate's strict inequality (buy_price × efficiency_discharge >= shadow_price) rarely opens in that regime. Small, real overnight grid imports (observed: 0.1-0.2 kWh/night, a few tens of cents) can still occur even with ample SOE headroom above the floor.

#385 explicitly rejected widening the gate's tolerance to paper over this — the gap between "genuinely arbitrary near-tie" (safe to open) and "real reserve correctly protected for a meaningfully pricier future peak" (must stay closed) is not currently distinguishable from the gate alone.

What this issue proposes investigating

Whether the near-tie is itself a symptom of DP value-function granularity/precision near the LOAD_SUPPORT decision boundary, or a fundamentally separate question requiring a different signal than shadow price alone to disambiguate "arbitrary tie" from "real future value." No prototype yet — filed so the residual isn't lost, not because a specific fix direction is proposed.

Note on the originating worked example

The specific worked example used during #385's investigation (Frank's debug bundle, period 6 on 2026-07-22 01:30: DP wrote a 9% discharge-rate ceiling, but the reported battery_discharged for that period was 0.2 kWh — ~1.8x what a hard 9% power cap should have permitted) turned out likely confounded by the sensor_collector.py runtime measurement-lag bug fixed in #387/#390. #387's fix only corrects forward (post-merge) collection via a new live per-minute power-sample buffer — it cannot retroactively reprocess that historical bundle, so this specific numeric discrepancy cannot be conclusively re-derived as clean or artifactual after the fact. It should not be relied on as evidence for or against this issue's residual gap; the residual gap itself is independently supported by the DP-replay evidence in #385 (Frank's actual price/consumption/solar history, not his disputed battery_discharged counter reading, replayed through the real optimize_battery_schedule + _apply_period_schedule path) and the architectural reasoning above.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghas-fix-prDraft PR opened by Stage 3 fix bot

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions