Skip to content

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
springfall2008 merged 2 commits into
mainfrom
bot/debug-journal-2026-10-08
Oct 9, 2026
Merged

springfall2008 merged 2 commits into
mainfrom
bot/debug-journal-2026-10-08

Conversation

@springfall2008

Copy link
Copy Markdown
Owner

Automated journal flush (the /journal-update daily flow) — folding the 2026-10-07 triage queue slice into tools/debug-journal.md, with every candidate re-verified against main (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

  1. GH#4445 — plan-table HoldChrg classified from target, not the real charge limit — added a symptom-table row: the State cell and status text classify from charge_window_best[n]["target"]; discard_unused_charge_slots() stamps target = limit only 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 as HoldChrg -> <predicted SoC> and get_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 the publish_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.py builds windows without a target key, 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).
  2. GH#5413 — planned dispatches on the Octopus entity are empty by design for an Ohme charger — added to the Octopus row: BCD's get_intelligent_features() special-cases OHME to planned_dispatches_supported = False (OHME is not in FULLY_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_dispatching entity on an Ohme-scheduled setup buys completed-slot tracking but zero forward car-slot visibility — and an empty planned_dispatches attribute is the gate's doing, not evidence Octopus holds no dispatches for Ohme. Predbat-side reads re-verified on main (fetch.py): completed merge into octopus_slots unconditionally, 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.
  3. GH#5434 — car-conditional write/replan churn — folded in two places. New symptom row ("Too many inverter register writes / replans while the car charges"): the hour-bucket write-counting technique (grep "write_and_poll_value: Wrote" → hour buckets → sort | uniq -c, version A/B dated from the currently running banners + restart markers), and the five churn mechanisms — dynamic-load flap → forced replan; watch_list event-entity refires (an event entity has no comparable state, so every refresh bump is a full replan); flat-band limit churn under metric_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 the Best charge window = prefilled-incumbent trap appended to the attachment-forensics bullet: the recompute block resets the windows and prefill_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)

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 + units passed.

Do not merge — a human merge is the review gate on this file.

CI and others added 2 commits October 8, 2026 00:11
…); 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
springfall2008 marked this pull request as ready for review October 9, 2026 18:39
Copilot AI balanced review requested due to automatic review settings October 9, 2026 18:39

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@springfall2008
springfall2008 merged commit 5328e01 into main Oct 9, 2026
2 checks passed
@springfall2008
springfall2008 deleted the bot/debug-journal-2026-10-08 branch October 9, 2026 18:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants