Repository navigation
fix(control): an idle car's start reads the phases now, not its own heat - #1829
Merged
Merged
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
After the car stopped on the home box on 25 Oct 2026, its start added the new current to the fuse heat its own charging had left: the cap stayed at 0 for 84 s with 14 A of room on the reading, then gave 9 A. As Fredrik decided: an idle start reads each phase's current now plus the car's new current against the working limit. The heat filter blocks a start only while its own level is over that limit, and keeps its job on the cut path and for a running car's rises. The split between idle cars reads the same room. The random-house judge now dates a house step to the plant second it takes effect, after the control tick that set it. For the five pinned seeds on master that changes no result; it stops counting a start sent before a house step as the step's cause. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
frahlg
force-pushed
the
fix/ev-start-reads-the-meter
branch
from
October 25, 2026 10:35
d6b10c5 to
76f42dd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Field case
Home box, 25 Oct 2026, v0.155.1-beta.1, on a 3 × 20 A site:
fuseHeat.levelA:max(reading, heat) + pending). The cap stayed at 0 for 84 s, and then gave only 9 A.#1827 removes the stop that started that night's chain. This PR changes how fast and how high a car starts again after any short stop.
Change
Fredrik's decision:
In code:
fuseHeat.startLevelA: per phase, the reading plus our orders the reading may not show yet. The heat counts only on a phase whose filtered current is over the working limit.evMeterRoom.startW/startRoomA: the start's room.stepEVIdleStartreadsstartW.EVFusePhaseRoomA). Without that change, the loadpoint's own per-phase cap would still hold the start back by the heat.docs/safety.mdsays the same.overA), a running pool's rises, the restart dwell and fix(control): an idle car starts on the hour's slack under the import ceiling #1828's own start rule under the import ceiling.Deleted: nothing. Production code: +35/−8 lines in
fuse_heat.goandev_fuse_budget.go.Tests
TestEVIdleStartReadsThePhasesNotTheCarsOwnHeat: stop from 14 A with L1 at 22.9 of 24 A, start 20 s laterTestStartLevelReadsHeatOnlyOverTheLimit: heat just under and over the limit, with orders on their way, one phaseTestEVIdleStartWaitsForTheHeatOfARealOverage: L1 at 26 A for 5 min, then 8 AThe one new matrix row is
pr1763/25A/3p/3p-15A/easee120s/car3p/6-2-2/pause+battery own-raise relief. It is the site where the battery charges from the plan while the car charges, with an Easee answering in 120 s.relief: the battery ends its relief before Core's own changes show. On master it passed on timing.Random-house property test
TestSiteSimRandomHousejudges five fixed random houses for an hour. Two edits to the test:TestEVFuseLandedCutCoversOnlyItsRun.The trade-off, per seed (1 h each):
The car charges more and waits less. In exchange, more of the random house steps land on a car that is already charging, so a phase spends more time over the working limit before Core's cut reaches the charger. In seed 3, on a slow charger, that takes the peak to 1.49 × In for about the charger's 40 s.
The fuse never blows (damage at most 0.59 of 1), and every invariant holds. These are outside steps the cut path answers; no start of Core's own put a phase over the limit.
Independent review (Sonnet)
The reviewer found no case where a start puts a phase over the limit by Core's own doing, and confirmed the decision as stated. It also found:
levelAandphaseRoomA;docs/safety.md; the start path's reason label; the heat test now compares I² asoverAdoes; the changeset now mentions the restart wait; and the new unit test forstartLevelA.Open drafts touch the same files: #1782, #1789 and #1792 in
ev_fuse_budget.go, and #1789 also infuse_heat.go. #1789 read the heat for starts, which this reverses as Fredrik decided.make verifypasses.Hardware
Not yet run on the box. Real-hardware evidence is still needed: a stop and restart on the home box's busy L1.
🤖 Generated with Claude Code