render_theme_panel is a module-level function that takes app as its
parameter, but two lines still referenced 'self' (line 6373 and 6376).
The function was converted from a method (_render_theme_panel) to a
module-level function in the module_taxonomy_refactor_20260627 Phase 1.3
(commit 3dd153f7), but the self -> app substitution was missed.
Symptom: on every frame, render_theme_panel called imgui.begin('Theme', ...)
which pushed the Theme window onto the imgui stack. Then the
'getattr(self, ...)' raised NameError. The exception was swallowed by
_render_main_interface_result's try/except, but the imgui.end() call
at the end of the function was never reached. The Theme window stayed
pushed on the stack, and HelloImGui's auto-managed MainDockSpace asserted
'Missing End()' on every frame.
The bug was masked earlier by commit 71028dad, which fixed a stale
'from src.command_palette import' in render_main_interface. Before that
fix, render_main_interface aborted entirely every frame, so the Theme
window's never-reached end() was hidden behind a different error.
Bisect confirmed: disabling any other default-visible window left the
error; only disabling Theme made /api/gui_health report healthy=True.
Verification:
- tests/test_default_layout_install.py: 3/3 PASS (install behavior unchanged)
- tests/test_api_hooks_gui_health_live.py: 1/1 PASS (was failing)
- tests/test_command_palette_sim.py: 7/7 PASS
- tests/test_saved_presets_sim.py: 2/2 PASS