Repository navigation
docs(debug-journal): fold in the 2026-09-22 queue slice; correct the component-thread and shared-fixture entries - #5192
Merged
Conversation
…component-thread and shared-fixture entries Co-Authored-By: Claude Code <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Copilot wasn't able to review any files in this pull request.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
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 triage bot folding the day's queued findings into
tools/debug-journal.mdand re-checking existing entries against what has merged since (verified against main8b9fe029). A human merge is the review gate. 55 candidates remain queued.Folded in (10):
GH#4993 follow-up (SolaX 10402 token thrash) — rewrote the SolaX row. 10402 repeating every cycle with data still flowing is server-side token invalidation between cycles (same token succeeds mid-cycle and is rejected next cycle; stated ~30-day
expires_invs real ~1-cycle token lifetime); prime suspect a second client sharing the sameclient_id/secret— kept marked suspected, not proven. Each 10402 also inflates the component's lifetime error counter. Secondary finding: "No solar forecast data was returned from HA sensors" on the SolaX Cloud template = no PV forecast source configured at all (the template'spv_forecast_*regexes match nothing without the Solcast HA integration). Code claims re-verified on8b9fe029: the solax.py auth-error branch clears the token andrequest_wrapper()retries in-request; the solcast.py HA-sensor fall-through branch; thetemplates/solax_cloud.yamlregexes.GH#5087 (Solis API codes misclassified) — fixed on main since the candidate was written (PR fix(solis): stop retries draining the SolisCloud daily API allowance #5089, merged 2026-09-14):
B0115/R0000are now classified (SOLIS_API_CODES,SOLIS_API_CODES_NO_RETRY) with a per-inverter datalogger-offline cooldown, andautomatic_config()now retries viaautomatic_config_doneinstead of the first-cycle-only gate. Folded as a fixed entry with the pre-fix(solis): stop retries draining the SolisCloud daily API allowance #5089 mechanism kept (B0115 was treated as rate limiting, R-series fell through to "Unknown code" with the full retry ladder, draining the 200/day allowance).GH#5090 (Solis amp↔watt voltage) — fixed on main since the candidate was written (PR fix(solis): use a stable voltage for amp<->watt conversions #5095, merged 2026-09-15):
get_nominal_voltage()priority is nowsolis_nominal_voltage→ HV live (>60V) → BMS charge-voltage classification (16S/15S) → 48V fallback. The pre-fix diagnostic (failed-write readbacks at a constant ratio of the target) is kept for older logs; pre-fix(solis): use a stable voltage for amp<->watt conversions #5095 there was no workaround, sincesolis_nominal_voltagefed only the capacity path.GH#5091 (auto-config first-cycle gate) — fixed by the same PR fix(solis): stop retries draining the SolisCloud daily API allowance #5089 (
automatic_config_doneretry). Folded with Solis: one unreachable inverter keeps the whole component in startup backoff #5093's premise correction (auto-config actually ran at the end of every completed first attempt regardless ofpoll_success— now moot since the gate is gone). GE Cloud still runs its auto-config underif first:only, noted so its self-heal after an outage is described as the slow one.GH#5093 (per-inverter failures folded into one
poll_success) — still live on main; folded as still-live with the workaround (list only working SNs insolis_inverter_sn) and the contained fix shape (per-inverter booleans already exist at everypoll_successsite). PR Solis: don't let a refused startup register read abort startup, and back off B0600 #5185 (open, unmerged) noted as the neighbouring per-inverterstartup_reset_registers()backoff.GH#5092 (bare
ValueErrorfor a missing load source) — new symptom-table row:fetch_sensor_data()'s bareraise ValueErrorunwinds the whole cycle (the fetch-before-inverter-read ordering is what makes "SoC stops updating"); cloud components setload_todayat runtime, so "fix apps.yaml" is the wrong pointer during a component startup delay; no fallback exists before a first successful fetch.GH#5094 (Tesla discharge-stop fallback) — appended to the HA write/verify row:
adjust_charge_immediate()'s fallback tocharge_stop_servicewithdomain="discharge"lands on active discharge to load on Tesla, so freeze/hold cycles issue a discharge command then a hold ~2s later. Re-verified on8b9fe029(inverter.py:3089-3090); workaround plus therepeat: Falsecaveat kept.GH#5082 (GEC 3-phase freeze export) — appended to the GE Cloud row:
inv_support_discharge_freezeis read statically fromINVERTER_DEFwhileinv_has_timed_pauseis runtime-probed, soset_export_freezeis never force-disabled for the eco-less 3-phase class; the "grep only for the eco warning" trap noted; the GIV-3HYcharge_power_rate-limits-AC-only point kept as hardware-reported; fix precedent PR feat(fox): select Feed-in First for a Fox Cloud freeze export #5038.GH#5083 (hold hysteresis unreachable) — new symptom row: the hold gate has no tolerance, the nested 1% hysteresis is unreachable and its else re-enables the window, so ±1% SoC quantisation wobble thrashes charge/hold writes; confirmation recipe and "don't hunt for a v8.53 regression" kept. Structure re-verified on
8b9fe029(line numbers drifted, structure identical).GH#5079 pointers — folded into the rewritten Test-order section: hand-rolled
argssnapshot/restore remains intest_inverter.py/test_agent_tools.py(≥9 modules at write time — the others were cleaned up);soc_kwh_history = {}restore-to-default intest_calculate_yesterday.pyremains latent-fragile; the runner still breaks on first failure.Existing entries corrected (2 areas):
Component health row — the entry said
ComponentBase.start()runs every component'srun()loop "on the main asyncio event loop" and concluded a blocking sync call stalls shutdown, HA callbacks and every other component. Wrong on both counts (candidate 5075, from the PR Run ML training off the event loop and let a shutdown abandon it #5112 review). Re-verified on8b9fe029:Components.start()starts each component throughbase.create_task(), which spawns a real non-daemon OS thread per component running its ownasyncio.run()— a sync CPU-bound call blocks only that component's loop; the real cost is shutdown, wherestop_all()doest.join(5 * 60)per thread afterterminate()and the interpreter's non-daemon-thread shutdown then waits again unbounded. PR Run ML training off the event loop and let a shutdown abandon it #5112 (open draft, unmerged) is the fix; the misleading "Lock released" comment is still on main.Test-order pollution section + Test-ordering trap bullet — the section said all tests share one
PredBatfixture; PR test: give each test its own PredBat rather than sharing one (#5079) #5102 (merged 2026-09-15) gave every registry test its own instance andcreate_predbat()now pinsminutes_now/now_utcfromFIXTURE_MINUTES_NOW, closing the GH#5026 wall-clock class the entry had anticipated. References totools/shuffle_fuzz_known_pairs.txtremoved (the file no longer exists). Historical mechanism kept for older logs; the candidate's residue pointers folded in.Dropped (4) — already covered by existing entries:
5071 (debug snapshot ~5MB + unbounded download-all): both halves already in the journal (the
debug_history_countmax raise with storage arithmetic, and the web download route capped at 16 by PR Raise debug_history_count maximum to 500 for multi-week history (#5070) #5071).5072 (retrain interval vs the 48h staleness cap): already in the Load ML row's "frequency is a separate axis" paragraph.
5073 (SolarEdge preserve-charge refusals): core already in the symptom row (idle-reset writes; no failure dedup in
write_and_poll_value()); only two case notes folded in (SE preserve flag invisible in dumps; unexplained second execute pass ~46s later).5074 (chat OpenRouter-first error wording): already in the Web/MCP/Chat row.
Quality-gate note: the cspell/markdownlint/black hooks pass (
&&gates the quick suite on them); the quick suite then aborted attest_teslemetry_local_weekday_follows_the_base_clockat 00:09 BST — the journal's own documented local-midnight clock-window failure (docs-only tree, second sighting), unrelated to these docs-only changes.🤖 Generated with Claude Code