Skip to content

docs(debug-journal): fold the 2026-10-19..20 review slice (15 candidates); mark #5656/#5657 and Hanchu #5684 on main - #5700

Merged
springfall2008 merged 1 commit into
mainfrom
bot/debug-journal-2026-10-23
Oct 23, 2026
Merged

springfall2008 merged 1 commit into
mainfrom
bot/debug-journal-2026-10-23

Conversation

@springfall2008

Copy link
Copy Markdown
Owner

Automated journal flush — the daily /journal-update run. It reads tools/debug-journal.md end to end, verifies each queued candidate against current main before folding, and never merges its own PR. 15 candidates processed of 39 queued; 24 left queued. Quality gate: all pre-commit hooks pass (the gate reached the test suite after the &&), and the quick suite passed the modules it reached before the local 10-minute command cap cut it off mid-run (the two quick-suite modules the journal documents as failing 00:00–01:00 local on unmodified main sit in the never-reached tail; CI in UTC is outside that window). 4 new words added to the cspell dictionary (indra, luxpython, luxpowertek, zoneinfo).

Per-candidate outcome

Folded in

  • 5643-inverter-clamp-tooltip-algebra — rewrote the GH#5394 tooltip symptom row: the PR fix(output): cap the plan tooltip charge rate at the inverter limit #5643 review derived that the PR's cap min(rate, inverter_limit × inverter_loss + pv_dc) is exact for hybrids with PV while the clamp binds (the clamp's min(battery_draw + over_limit × inverter_loss, 0) correction cancels the /inverter_loss divider in get_total_inverted()), so the row's old "cannot be a bare min() — exact only for a zero-PV window" caution was wrong; the remaining inexact case is the battery_rate_max_charge_dc > battery_rate_max_charge boost. PR fix(output): cap the plan tooltip charge rate at the inverter limit #5643 is still open, so the row keeps the mechanism marked live on main. Verified the clamp block (prediction.py) and get_charge_rate_kw() (output.py) on main.
  • 5644-apps-yaml-duplicated-docs-sections — added a Traps bullet: docs/apps-yaml.md documents each setting twice (a **key** - bullet in the CONFIG reference and a ### <Display Name> detail section further down that cross-page links resolve to), so a docs fix that updates only the bullet leaves the linked-to section stale and a key grep misses it (search the display name too). Verified live on main: the inverter_reserve_max bullet says "(default is 100)" while its linked-to ### Inverter reserve maximum section still says "the default is 98".
  • 5645-re-review-unchanged-head — added a Traps bullet: check a PR's existing reviews before reviewing; on an unchanged head, re-verify the earlier findings and post a restating re-review with comments: [] instead of re-anchoring duplicates.
  • 5646-day-night-rates-dst-week-test-failure — folded into the Octopus per-integration row, marked fixed by merged PR fix(octopus): keep the day/night rate schedule whole across a clock change #5655 (d3c2f72): the recurring late-October/early-April octopus_url::day_night_rates Expected 16 rate entries (8 days), got 15 failure was a product bug (pytz re-normalisation rewound the per-day anchor across the autumn clock change), plus the pytz technique note (a localised pytz tzinfo still carries the zone's full transition table — don't "simplify" to replace(tzinfo=…)). Verified _localise_wall_clock() and the reworked docstring on main. Dropped: the candidate's stale-docstring note (00:30–07:30 vs 00:30–05:30) — the merge already reworked that docstring.
  • 5647-eco-toggle-gate-skips-givtcp-settle-sleep — folded as a conditional note on the GH#4180 30s-sleep claims in the Solis row and the GE discharge-window symptom row: open PR fix(inverter): warn once about an eco toggle that cannot be written, and never write a non-switch through it (#4909) #5647 exempts the cycle where the eco toggle itself cannot be written; both rows say "narrow this on merge". (The candidate asked for action only if the PR merged; it hasn't.)
  • 5648-indra-template-review-notes — added a Traps bullet with four standing conventions for reviewing inverter-template PRs: sign conventions (grid_power negative on import, battery_power positive on discharge, so a charge-positive EV sensor takes battery_power_invert: True); unknown inverter_type needs no code change (GE-copy synthesis + inverter: overlay); battery_min_soc reaches the plan only via the reserve chain; the freeze-export fallback assumes discharge_stop_service is a neutral hold (the active-mode risk on mode-select devices). PR Add Indra V2H / V2G inverter template and docs #5648 itself is open, so the bullet stays class-level.
  • 5650-soc-max-remaining-sensor — folded both halves: the soc_max-bound-to-a-remaining-sensor shape into the SoC symptom row (signature: a capacity figure that swings with charge level, e.g. nominal_capacity on predbat_soc_max_calculated; "tail-only charging" is correct in itself on a flat tariff — check the capacity model first), and the replay crash into the empty-step-arrays row (a dump with the step arrays cleared raises KeyError: 0 in the replay before any plan; check the dump's pv_forecast_minute_step: keys for {} first — charge_window_best/rate_import/args: remain present and are usually enough).
  • 5652-fill-load-from-history-readback-loop — mostly already covered by the v9.4.1 load_today row; sharpened it with the merged-fix marker (PR fix(fetch): only backfill load_today from load_energy_h0 before its history starts (#5652) #5656, f60e124) and the pre-fix log reading note (Filled N gaps … totalling XkWh sums every in-window gap minute across max_days_previous days — not today's inflation), and the simulation result (first-day double-count material-but-settling; the unbounded runaway was not reproduced on synthetic data).
  • 5653-python315-strptime-z-and-quick-suite-aborts — part 1 (%z semantics, strptime_aware()) was already on main and in the journal; folded part 2 (the AST guard offset_strptime_calls() silently passes an ast.Attribute format like const.TIME_FORMAT — added to the Python 3.15 trap bullet); dropped part 3 (the quick-suite first-failure abort masking later tests) as already covered by the Test-order pollution section, and its concrete octopus_url instance is moot since fix(octopus): keep the day/night rate schedule whole across a clock change #5655 fixed the day/night schedule.
  • 5654-sigenergy-mqtt-puback-mechanics — supplemented the Sigenergy MQTT row with the two library facts (production paths pass no protocol=, so runtime rides MQTT 3.1.1 and can never carry a reason code; publish() does wait for the PUBACK, so the log line is blind only to the reason). Dropped the candidate's probe-internals caveat — the merged fix(sigenergy): REST power from energyFlow, device-list discovery, MQTT --command-test and --mqtt-scan #5654 already warns when paho's on_publish cannot be hooked.
  • 5655-octopus-day-night-dst-schedule — the merged PR fix(octopus): keep the day/night rate schedule whole across a clock change #5655's fix mechanism + pytz technique live in the Octopus row (see 5646 above); the candidate's stale-docstring half was fixed by the merge itself, so dropped.
  • 5657-short-dispatch-confirm-guard — folded into the Octopus row, marked merged (4f45708): a sub-5-minute dispatch is off-peak only where dynamic_load_car_confirmed_periods recorded the car charging — recorded only from DYNAMIC_LOAD_CAR_CONFIRM_MINUTES (2) minutes into the half hour, so a blip starting on the boundary is never confirmed; report shape "a 14:00 one-minute dispatch shows the day rate; a :13 one works". Verified dispatch_too_short() and the minute % 30 >= 2 gate on main, plus the !!set serialisation note.
  • 5660-hold-on-reserve-displays-charge-target — folded into the reserve symptom row as a third shape: "reserve always X% = (charge-window target + 1)" is the hold-on-reserve path (Hold charging as SoC … is above target SoC immediately preceding every such write; re-asserted every 5-min cycle), with the two compounding effects (reset_inverter: true on both config items; unattributed external reserve writes) and the plan-panel display gap (mirror of GH#5400). Verified the execute.py hold branch and the reset_inverter flags on main.
  • 5661-luxpower-charge-limit-minimum — added a new LuxPower per-integration row: no Predbat code at all (template-only; LuxPython lux_* vs wills-b cloud lxp_*), every target-SoC write floored at the reserve (int(max(soc, reserve_percent)) — verified in adjust_battery_target()), per-register device minimums make a well-configured setup still fail (reporter's portal screenshot), fix umbrella GH#4831, workaround set_reserve_min ≥ the device's smallest register minimum.
  • 5663-iog-withdrawn-dispatch-feed-discount-survives — folded into the Octopus row: a withdrawn dispatch (no completed record) leaves the feed-carried cheap rate in place because every discount-removal path keys on the current dispatch list and a zero strip never logs; signature (removed the dispatch rate lines silent exactly when charging begins), the yaml diagnostic (rate_import_no_io cheap + io_adjusted marked with no backing dispatch), the today-cost caveat, and the billing-truth constraint under the window billing rule.

Dropped outright: none; two partial drops are named above (5646's docstring note and 5653's part 3, each with its reason). Two candidates (5644, 5647) relate to PRs whose state changed after the candidates were written: #5644 closed as duplicate of #5651, #5647 still open.

Existing entries corrected (re-check against what merged since)

Verification notes

  • Every folded claim was re-verified against current main (a1ff5ff3): the tooltip clamp block + get_charge_rate_kw(), adjust_battery_target()'s reserve clamp, the execute.py hold-reserve write and reset_inverter flags, dispatch_too_short() + the 2-minute confirm gate, fill_load_from_history() post-fix(fetch): only backfill load_today from load_energy_h0 before its history starts (#5652) #5656, the production sigenergy MQTT paths passing no protocol=, the Free memory block, the day/night schedule code + docstring post-fix(octopus): keep the day/night rate schedule whole across a clock change #5655, and the apps-yaml.md duplicate-section structure.
  • PR states came from the PR pages (gh was unavailable in this session's permission mode).
  • Quality gate: ./run_pre_commit's hook set passed (pre_commit run --all-files exited 0 — the gate reached the suite after the &&); the quick suite passed the modules it reached in the first ~10 minutes (secrets, export_encoding, …) before the local command cap cut the run; the full quick suite exceeds the cap on this runner.

…tes); mark #5656/#5657 and Hanchu #5684 on main

Co-Authored-By: Claude Code <noreply@anthropic.com>
@springfall2008
springfall2008 marked this pull request as ready for review October 23, 2026 08:03
@springfall2008
springfall2008 merged commit 6737eb6 into main Oct 23, 2026
4 checks passed
@springfall2008
springfall2008 deleted the bot/debug-journal-2026-10-23 branch October 23, 2026 08:03
@github-actions github-actions Bot added the BOT_REVIEW Trigger an autotriage label Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BOT_REVIEW Trigger an autotriage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant