Repository navigation
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
Conversation
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 (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
--redoresets 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 listindouble_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.unknownpermanently (the GH#5009 degraded-read shape, persistent), and a user edit of INVERTER_DEFcharge_time_formatto 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 atinverter.py:737.get_octopus_slot_max()from the tariff code viahas_six_hour_cap()) but enforced per car (freshslots_per_daylocals per car inrate_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.published_discoverygates before the adopted endpoint had published; the merged PR re-publishes after a fleet-growingrediscover()(verified on main atgivtcp.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).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 unpackevery cycle) and notes the triggering setting was never captured.find_charge_curve()divides bymax_power = int(battery_rate_max_charge * MINUTE_WATT)with no zero guard (numerator guard exists, verified on main atinverter.py:1391); trigger is Predbat's own freeze-export 0 W write mirrored into a live BMS rate sensor; second crash siteadjust_battery_target_multi()(execute.py:1045) means a guard only infind_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 andrefresh_config()re-reads live config per cycle (verified:inverter.py:580recomputesbattery_rate_max_chargeinrefresh_config()), which still closes the feedback loop.lowest = 99sentinel (fetch.py:2432, verified), not the event price — the dump's storedrate_export_cost_threshold: 120is a display copy frompublish_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.battery_size_tracking()'s only publish site gated behindif 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).horizonparameter — shading is client-side (shading_factorsviagti_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.support_discharge_freeze: False, verified atconfig.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.serial=""slot is bound as the control target (_needs_reconfigure()treats""as new, verified atgateway.py:1174; firmware rejects it — the 2026-09-16 fleet incident), andif 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).web_chat.py:434callsset_selected_model()only behindif model_id:, verified;set_selected_model()already pops on falsy id, verifiedchat_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.set_reserve_min(default 4);battery_min_socis a raise-only floor on it; scalars parse fine (resolve_arg()extracts-by-index only for lists). Resolutionset_reserve_min: 0.rate_import_cost_threshold = highest, verifiedfetch.py:1307) widens the cheap band under a session stamp (rate_max inflated → plain peak admitted intolow_rates, which feeds car planning and thecharge_window_bestseed); fix directionrate_max_base. Finding 2 → premise-trap bullet: check an item'senable:field inconfig.pybefore believing an "expert-gated" claim (the candidate's premise was false on both v9.0.3 and main). Note: the candidate'scar_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.Existing entries corrected (merges since the last flush)
car_charging_nowcan be a charging power sensor (number in watts counts as charging fromCAR_CHARGING_NOW_POWER_W,car_charging_now_value()verified atfetch.py:2576-2596). (2) "plan-table display should matchprediction.py's condition" is now implemented: PR fix(output): show a car icon and "Hold for car" reason when discharge is held for a charging car #5147 made the plan table takehold_for_carfrom the prediction's own record (predict_car_hold_best), shown for at least half a slot on Demand rows.Gate
./run_pre_commit(fromcoverage/): all hooks passed (cspell, markdownlint, ruff, black, dictionary sorter —kellerza/rany2added 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'sdatetime.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.