Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.0 KiB
UX-53 - Home draws a grid charge only where the add-on will take it
Status: DONE 2026-10-26 (owner go 2026-10-25, from the PRICE-02 rig test F-1 and F-2).
Decision
Home asks the add-on's own gate, and does not decide for itself.
- Modes on.
Controller._mode_roles()files the gate it just asked (TariffPlan.arbitrage()with the measured peak guard) asmode_gate: None when it allowed a charge, else its reason (peak,not_worth,not_covered). While it is set,homeview.mode_runs()draws no grid charge andprice_windows()marks no cheap quarter. Control never reads it. A refusal that is not the gate (no measured headroom, a battery cycling) is not filed, so those pages are as before. - Modes off. A charge the verdict puts after its last dear period is
refused when its time comes: the quarters left are all equal.
leg_taken()askstrade_verdict()(the control cycle's own call) at the leg's start and keeps the leg only if the gate allows it there. A leg in progress is the verdict's own answer now. The sale, "Tomorrow:" lines and chart marks use the same answer. - Words. "Lowest/Highest published price" becomes "Lowest/Highest price left" (the verdict reads only the periods not yet over). The flat-tariff refusal calls a site "a fully fixed product" only when its product is fixed.
What does not change
No control decision, command or option. Day/night and hourly sites with a
second day of prices keep both legs at every half hour of a day
(test_ux53.py part 4), except where every price left is equal: with an
all-night weekend, Friday's 22:00 charge is no longer drawn, as the add-on
does not take it. Price-off sites draw nothing, as before.
Limits
The leg's gate is asked on today's plan, as the control cycle will find it at that time. A plan that gets new prices in between is drawn again at the next refresh. While the peak guard holds, a modes-on page shows no grid charge at all, also not the rest of a run the add-on charges in once the guard clears, as the modes-off page already did.