Repository navigation
docs(debug-journal): fold in the 2026-10-07 queue slice (3 candidates); mark GH#5349 fixed by PR #5360; note #5392/#5403 refinements; fix drifted should_replace_plan line cites - #5435
Merged
Conversation
…); mark GH#5349 fixed by PR #5360; note #5392/#5403 refinements; fix drifted should_replace_plan line cites - GH#4445 (HoldChrg classified from window target, not the charge limit): new symptom-table row - classification source, discard_unused_charge_slots() stamping, the why-reason fixture gap that hides it, fix shape. Verified on main by reading + a scratch unit replay; still unmerged. - GH#5413 (BCD clears planned_dispatches for OHME): new material in the Octopus row - get_intelligent_features() OHME special case, the coordinator's clearing, completed-only visibility, Predbat-side merge surfaces. BCD source re-verified live 2026-10-08. - GH#5434 (car-conditional write/replan churn): new symptom row with the hour-bucket write-counting technique and the five churn mechanisms; the Best-charge-window = prefilled-incumbent trap appended to the attachment-forensics bullet. - Corrections from merges since the last flush: Sunsynk/Deye row rewritten for PR #5360 - restore caches split (applied_payload 15m, control_active 8h ownership), GH#5349's silent-strand window fixed, mechanism kept for pre-#5360 logs. PR #5392 (v9.3.6) tightens io_adjusted flagging to lowerings beyond a penny in two entries. #5403 one-liner for consider_full. Plan-stuck row: dropped drifted should_replace_plan line numbers (plan.py:1103/1114, now unrelated code) and rewrote the fragmentation wording to current main (PR #4301 moved the branch inside the function). Co-Authored-By: Claude Code <noreply@anthropic.com>
springfall2008
marked this pull request as ready for review
October 9, 2026 18:39
Contributor
There was a problem hiding this comment.
Copilot wasn't able to review any files in this pull request. Check if the Files changed in this pull request are included in default exclusions.
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.
Automated journal flush (the
/journal-updatedaily flow) — folding the 2026-10-07 triage queue slice intotools/debug-journal.md, with every candidate re-verified againstmain(82bee43, v9.3.6) before anything was written. Nothing was left queued: the queue held exactly 3 candidates (limit 15), all 3 folded in; none dropped.Folded in
HoldChrgclassified fromtarget, not the real charge limit — added a symptom-table row: the State cell and status text classify fromcharge_window_best[n]["target"];discard_unused_charge_slots()stampstarget = limitonly when predicted SoC sits at/above the limit at both window start and end, and otherwise stamps the predicted end-of-window SoC — so a rate-limited charge that cannot complete renders asHoldChrg -> <predicted SoC>andget_charge_export_text()says "charging to N%". Freeze classification already reads the limit (is_freeze_charge(limit)), so the two can also disagree; a rising charge makes completing charges label correctly by accident. Verified on main by reading the symbol chain plus a scratch unit replay on thepublish_html_plan()path; no PR references Plan shows 'Hold Charge' for windows that are actually issuing a full-rate charge #4445 and no commit touches the classification since the issue was filed. Kept the mechanism, the fixture gap (test_plan_why_reason.pybuilds windows without atargetkey, so only the fallback path is exercised), and the fix direction as one line; dropped the scratch-test narrative and reporter details (per-issue narrative stays in the issue).get_intelligent_features()special-cases OHME toplanned_dispatches_supported = False(OHME is not inFULLY_SUPPORTED_INTELLIGENT_PROVIDERS), and the dispatches coordinator then clears planned dispatches outright (log:Clearing planned dispatches due to not being supported for provider), keeping completed and started. Octopus's API has carried Ohme Home Pro sessions as smart-charge planned dispatches only since ~29 Sep 2026 (BCD FR Issue where clipping removes a charge hold #1893, still open). Consequence:octopus_intelligent_slot→ the BCD*_intelligent_dispatchingentity on an Ohme-scheduled setup buys completed-slot tracking but zero forward car-slot visibility — and an emptyplanned_dispatchesattribute is the gate's doing, not evidence Octopus holds no dispatches for Ohme. Predbat-side reads re-verified on main (fetch.py): completed merge intooctopus_slotsunconditionally, planned gated on plugged-in/ignore-unplugged, started diagnostics-only per IOG future planned dispatches treated as cheap home rate before EV charging earns the slot #4516 Stage 1 — so the IOG extra car charging slots still not holding the off-peak rate #5413 thread's fix shape (merge completed from Octopus with planned/started from Ohme) is the real fix. BCD source re-verified live today.grep "write_and_poll_value: Wrote"→ hour buckets →sort | uniq -c, version A/B dated from thecurrently runningbanners + restart markers), and the five churn mechanisms — dynamic-load flap → forced replan;watch_listevent-entity refires (an event entity has no comparable state, so every refresh bump is a full replan); flat-band limit churn undermetric_min_improvement_plan(the GH#5330 tie surface); low-power mode doubling each limit flip into charge_rate + timed-current writes; window wipes. Ruled out Don't trust Intelligent slots the car won't need (consider_full) #5403 with the grep-for-its-log-line instruction. And theBest charge window= prefilled-incumbent trap appended to the attachment-forensics bullet: the recompute block resets the windows andprefill_charge_limit_best()runs before the line prints, so it shows the incumbent limits on the reset windows; the optimised plan appears only in the later Raw/Unclipped/Filtered lines, and the adoption decision's metric comparison re-scores both plans on the same cycle's inputs. Dropped: the reporter's counts/brands and the not-verified fix ideas (left with the maintainer on the issue).Corrections to existing entries (merges since the last flush, de3fea8 2026-10-03)
applied_payloadkeeps the 15-minute change-detection bound (SUNSYNK/DEYE_RESTORE_MAX_CONTROL) whilecontrol_activemoved to its own ownership cache under an 8-hour bound (*_RESTORE_MAX_CONTROL_ACTIVE), andrun()calls_reconcile_control()on every tick that owns the inverter — so an HA restart inside 8h restores ownership and a dropped payload is followed by a real rewrite. GH#5349's "holds lost for hours after an HA blip" is fixed for outages inside the 8h bound; the row keeps the pre-fix(sunsynk/deye): dont expire control_active after 15 minutes (fix #… #5360 mechanism (≤ v9.3.5) for older logs, where the tail-end info linecontrol ownership cache is ... minutes old (limit 480), requiring a fresh writeis the expiry tell. Verified by reading the merged code and the new constants.io_adjustedflagging — refinement, recorded in both entries that describe it (the fix(octopus): model a vanishing IOG dispatch for octopus_intelligent_slot users #5304 symptom row and the Octopus row's GH#5012 passage):rate_add_io_slots()flags/re-prices only minutes a dispatch lowers by more than a penny (IO_RATE_TOLERANCE), so sub-penny dp2-rounding differences no longer mark or re-price the fixed off-peak minutes.should_replace_plan()atplan.py:1103and a fragmentation tie-break atplan.py:1114— on main those lines are unrelated code (a docstring and a comment), and the fragmentation branch has sat insideshould_replace_plan()since PR Break near-tie plan comparison toward the less fragmented plan #4301 (2026-07-26): it favours the less fragmented plan on a near-tie and adopts a cost-neutral less-fragmented plan outright. Dropped the dead line numbers and rewrote the wording to the current semantics.octopus_intelligent_consider_fullon, future dispatch minutes no car can use are cut too, with a replan trigger loggingOctopus Intelligent: dispatch minutes no car needs changed to N— grep for that line before reaching for it on a churn report (from the IOG charging - Multiple inverter setpoint writes when charging car #5434 triage's ruled-out note).Quality gate
Hooks pass (markdownlint-fix auto-formatted the file once and the second pass is clean); the chained quick suite was hard-killed at the 10-minute Bash cap mid-run on this machine (documented failure surface for docs-only flushes — a docs-only diff cannot affect tests, and tests running at all proves the hooks exited 0); targeted
basic_rates+unitspassed.Do not merge — a human merge is the review gate on this file.