Skip to content

docs(debug-journal): fold in the 2026-09-28 queue slice (15 candidates); mark GH#5217 fixed by PR #5218, correct entries overtaken by PR #5245/#5267/#5147 - #5278

Merged
springfall2008 merged 1 commit into
mainfrom
bot/debug-journal-2026-09-28
Sep 28, 2026
Merged

springfall2008 merged 1 commit into
mainfrom
bot/debug-journal-2026-09-28

Conversation

@springfall2008

Copy link
Copy Markdown
Owner

Automated journal flush (bot run 2026-09-28 00:15 BST): folds the queue slice into tools/debug-journal.md, verifying each candidate against current main (05639a37) first. 15 candidates processed (5213–5237); 8 left queued (5238, 5241, 5242, 5243, 5252, 5259, 5261, 5269) for the next slice.

Per candidate

  • GH#5213 (folded, 3 places). Replay limits → replay section: --redo resets the load model and the live ML forecast cannot be replayed from the dump, so a replay differing from the live plan in exactly the optimiser's marginal ~10p slots is expected — the decisive check is whether the same version's own plan in the attached log contains the slot; plus the temporary-TEST_REGISTRY-test replay recipe. Version-A/B trap → Load ML row: the Pi 5 reporter's "reverting fixed the CPU" was an observation-window artefact (identical fine-tune shape on both versions; short version windows prove nothing against the 2h retrain boundary). Downgrade ABI crash → "Version drift" trap: rolling back to ≤v9.0.x with v9.1.0+ state crashes the first plan cycle (TypeError: must be real number, not list in double_array, kernel ABI 5→7 via PR refactor(export): replace the packed export-limit float with a (mode, target, power) tuple #5047), self-recovers next cycle.
  • GH#5214 (folded into the HA write/verify row). SA slot selects can report unknown permanently (the GH#5009 degraded-read shape, persistent), and a user edit of INVERTER_DEF charge_time_format to anything ≠ exactly "HH:MM:SS" is a masking workaround that silently severs SA window control via Predbat dummy entities — with the three tells and the pre-feat: Extend Solar Assistant (Growatt) functionality - Schedules and target SoC #3533 "S" note. Verified on main: the != "HH:MM:SS" branch is at inverter.py:737.
  • GH#5215 (folded into the Octopus row). The daily cheap-slot cap is derived per account (get_octopus_slot_max() from the tariff code via has_six_hour_cap()) but enforced per car (fresh slots_per_day locals per car in rate_add_io_slots()/load_octopus_slots()), semantics genuinely open (Octopus's own blog says per-car) — verified live on main; do not assume the docs' per-car sentence is wrong.
  • GH#5216 adoption-pass rule (both queue files folded into the GivTCP row). During PR fix(givtcp): fill per-inverter arg slots by REST endpoint index, not discovery order (#5209) #5216's development the re-probe adoption pass judged published_discovery gates before the adopted endpoint had published; the merged PR re-publishes after a fleet-growing rediscover() (verified on main at givtcp.py:529-553) and adds a claim hand-back (claimed_from). Recorded as a design rule for that path, plus the suspected pre-fix(givtcp): fill per-inverter arg slots by REST endpoint index, not discovery order (#5209) #5216 residue (a late-adopted tail endpoint never claims its discovery keys).
  • GH#5217 (rewritten as fixed). PR GE Cloud: parse option validation text with bracketed labels without crashing (#5217) #5218 merged 2026-09-26 — the paren-crash-loop now has parse_validation_options() (gecloud.py:405, verified on main), with the paren-less guard the candidate insisted on built in. Entry keeps the pre-GE Cloud: parse option validation text with bracketed labels without crashing (#5217) #5218 signature (too many values to unpack every cycle) and notes the triggering setting was never captured.
  • GH#5219 (folded into the charge/discharge-curve row). find_charge_curve() divides by max_power = int(battery_rate_max_charge * MINUTE_WATT) with no zero guard (numerator guard exists, verified on main at inverter.py:1391); trigger is Predbat's own freeze-export 0 W write mirrored into a live BMS rate sensor; second crash site adjust_battery_target_multi() (execute.py:1045) means a guard only in find_charge_curve() is not enough. Rewrote the candidate's "Inverter.init re-runs every 5-minute cycle" general fact: that is pre-fix(inverter): Persist inverters across planning cycles #5126 only — on current main the objects persist and refresh_config() re-reads live config per cycle (verified: inverter.py:580 recomputes battery_rate_max_charge in refresh_config()), which still closes the feedback loop.
  • GH#5221 (new symptom row). The export-side ratchet latches the threshold at the lowest = 99 sentinel (fetch.py:2432, verified), not the event price — the dump's stored rate_export_cost_threshold: 120 is a display copy from publish_rate_and_threshold(); includes the counterfactual replay that settles it and the PR fix(fetch): exclude saving-session/Axle boosted minutes from automatic rate thresholds (#5050) #5163 (open) caveat.
  • GH#5222 (new symptom row). "Sensor disappears after restart, planning still works" → battery_size_tracking()'s only publish site gated behind if today_key not in existing_history: (inverter.py:796, verified), so a mid-day HA/AppDaemon restart skips the publish until midnight; the trimmed mean is recovered separately. Includes the test-masking trap (the regression test never asserts re-publish).
  • GH#5224 (folded into the Solcast row). The Open-Meteo API has no horizon parameter — shading is client-side (shading_factors via gti_hourly_to_period_kwh(), solar_model.py:127, verified); the suspected-not-verified compatibility caveat about the rany2 HA integration's entity shape is kept marked as suspected.
  • GH#5225 (folded into the Teslemetry row). Freeze export is disabled for TESLA at exactly one flag (support_discharge_freeze: False, verified at config.py:2266ff), and flipping it alone is not enough — the device-side hold mapping is the second half (non-TBC path writes the raw 99 target into the 81-99 snap band; TBC path has no hold), generalised to every cloud-emulator type.
  • GH#5227 (folded into the Gateway MQTT row). Two probed gaps: a sole serial="" slot is bound as the control target (_needs_reconfigure() treats "" as new, verified at gateway.py:1174; firmware rejects it — the 2026-09-16 fleet incident), and if len(status.inverters) == 0: return (gateway.py:815, verified) drops EV data and staleness updates wholesale on a fully-withheld hub. Plus the topology-probe trap (battery-presence filter hides data-less slots).
  • GH#5230 (folded into the Web/Chat row). The picker's Default row is a silent no-op after any manual pick (web_chat.py:434 calls set_selected_model() only behind if model_id:, verified; set_selected_model() already pops on falsy id, verified chat_store.py:546) — live on main, draft PR fix(chat): let the Default model be reselected after picking another (#5230) #5274 open; apps.yaml edits do not work around it.
  • GH#5232 (folded into the "Reserve keeps ratcheting" row). "Reserve stuck at N%" → first knob is set_reserve_min (default 4); battery_min_soc is a raise-only floor on it; scalars parse fine (resolve_arg() extracts-by-index only for lists). Resolution set_reserve_min: 0.
  • GH#5237 (folded into the GH#5050 row + the premise trap). The import-side scan overwrite (rate_import_cost_threshold = highest, verified fetch.py:1307) widens the cheap band under a session stamp (rate_max inflated → plain peak admitted into low_rates, which feeds car planning and the charge_window_best seed); fix direction rate_max_base. Finding 2 → premise-trap bullet: check an item's enable: field in config.py before believing an "expert-gated" claim (the candidate's premise was false on both v9.0.3 and main). Note: the candidate's car_charging_plan_smart: false (default) reference was overtaken by PR fix(car): default car_charging_plan_smart to on (#5237) #5251's default flip — the folded text avoids stating the stale default.
  • All 15 candidates were verified before folding; none dropped as duplicates — the journal had no prior coverage of any of them (the processed archive ends at 5211).

Existing entries corrected (merges since the last flush)

Gate

./run_pre_commit (from coverage/): all hooks passed (cspell, markdownlint, ruff, black, dictionary sorter — kellerza/rany2 added to the dictionary as genuine identifiers). The quick suite ran and aborted at the documented near-midnight trap: test_teslemetry_local_weekday_follows_the_base_clock (test_teslemetry.py:2490) asserts against the host's datetime.now().weekday() at 00:11 BST, the 00:00–01:00 window the journal itself records as crashing that module (see the "Build test dates from Predbat's clock" trap). Pre-existing test defect, unrelated to this docs-only diff; modules after teslemetry did not run this pass.

…s); mark GH#5217 fixed by PR #5218, correct entries overtaken by PR #5245/#5267/#5147

Co-Authored-By: Claude Code <noreply@anthropic.com>
@springfall2008
springfall2008 marked this pull request as ready for review September 28, 2026 06:57
@springfall2008
springfall2008 merged commit d7718aa into main Sep 28, 2026
2 checks passed
@springfall2008
springfall2008 deleted the bot/debug-journal-2026-09-28 branch September 28, 2026 06:57
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.

1 participant