Tier 2's commit e9654518 stripped the [Docking] data block and all
per-window DockId lines from layouts/default.ini based on the wrong
theory that HelloImgui would "auto-dock" panels via its central dockspace.
Empirically verified against tier2 branch HEAD (e9654518):
manualslop_layout.ini after first launch: 1447 bytes (Docking block
with DockSpace ID=0xAFC85805 + CentralNode=1, no DockNode children,
no per-window DockId lines)
User-visible result: empty dockspace with only the menu ribbon; 9
default-visible panels are NOT rendered.
Compared with the user's working manualslop_layout.ini on master
(2150 bytes: full [Docking] hierarchy + 2 DockNode children + every
visible window has DockId=0x00000001,N or 0x00000002,N): panels render.
Root cause: the literal DockSpace ID in the bundled INI is matched by
imgui-bundle's HelloImgui against the dockspace it creates during the
session (ID computed deterministically from MainDockSpace name hash,
which is stable across sessions -- the SplitIds line in every
HelloImui-generated INI records 2949142533 = 0xAFC85805). The Phase 1
bundled INI had DockSpace ID=0xAFBEEF01 (one increment off the
correct ID) and Tier 2 stripped the entire docking structure on the
wrong theory that ids are session-incompatible. They aren't, as long as
the bundled INI's literal ID matches the runtime's computed ID.
This fix restores the docking structure in layouts/default.ini:
- 8 [Window][...] entries (Project Settings, Files & Media, AI Settings,
Theme, Operations Hub, Discussion Hub, Log Management, Diagnostics)
each with Pos + Size + Collapsed=0 AND a DockId= line referencing
0x00000001 (left column) or 0x00000002 (right column)
- [Docking][Data] block with DockSpace ID=0xAFC85805 + 2 DockNode
children (CentralNode=1 at 0x00000001 left, sibling at 0x00000002
right)
- HelloImGui_Misc block + SplitIds line
- Comment block explaining the mechanism (replaces the misleading
e9654518 "auto-dock layer" claim)
- Omits Response (in _STALE_WINDOW_NAMES from src/gui_2.py:603-607)
so _diag_layout_state does not emit a stale-name warning
The fix is the GOOD half of e9654518 -- the live-session
imgui.load_ini_settings_from_memory(src_text) apply after the copy
stays (it ensures the install takes effect on the current launch rather
than the next one). Only the INI content + the matching test
assertions change.
Tests:
- _has_docking_block_with_docknodes (replaces _has_no_docking_block):
asserts the bundled INI has [Docking][Data] with DockSpace AND
>=1 DockNode ID= line
- _every_window_has_dockid (new): asserts every [Window][...] header
is followed by a DockId= line in its block
- _has_no_stale_window_names (new): asserts no _STALE_WINDOW_NAMES
entry is in the bundled INI
17/17 tests pass (3 install + 2 reset_layout + 8 adjacent gui +
4 commands).
Empirical verification:
- delete cwd/manualslop_layout.ini
- uv run python sloppy.py (no --enable-test-hooks; without this
flag the app uses its regular GUI rendering pipeline)
- log line: "[GUI] installed default layout: ...layouts/default.ini
-> ...manualslop_layout.ini (and applied to live session)"
- log line: "[GUI] visible-by-default windows: AI Settings,
Diagnostics, Discussion Hub, Files & Media, Log Management,
Operations Hub, Project Settings, Response, Theme"
- saved manualslop_layout.ini post-launch: 3072 bytes with 2
DockNodes, 8 [Window] entries (matches bundled INI minus runtime
additions), 0 stale window names
Bundled layouts/default.ini (relocated from tests/artifacts/ in Phase 1)
contained a [Docking] data block with a hardcoded DockSpace ID 0xAFBEEF01
plus per-window DockId references to nodes 0x10 and 0x11. Those IDs were
captured at the time the layout was first generated; on any fresh session
HelloImgui computes dockspace IDs dynamically (typically a hash of the
dockspace name + creation order) so the hardcoded literal is stale by the
first render and the orphan docking instructions are silently dropped.
Result: window positions stored in the INI render the windows as
floating at their absolute Pos coordinates, but the auto-created
dockspace captures the full window body, hiding them all. User observed
empty dockspace with only the menu ribbon rendering.
Two-part fix:
1. layouts/default.ini: remove [Docking] data block and per-window DockId
lines. Comment rewritten to explain why the auto-dock strategy is the
only session-stable option. Each [Window] entry now has only Pos + Size
+ Collapsed=0, so HelloImgui's auto-dock layer places the panels as
tabs in the central dockspace on first render.
2. _install_default_layout_if_empty: after writing the bundled INI to
disk, also call imgui.load_ini_settings_from_memory(src_text) to force
the live HelloImgui session to apply the new INI. Without this, the
install only takes effect on the NEXT launch (since HelloImgui reads
cwd/manualslop_layout.ini BEFORE the post_init callback fires). With it,
first-launch panels appear immediately.
Tests:
- tests/test_default_layout_install.py assertions updated: instead of
checking for a per-window DockId line, the install now verifies (a)
[Window][Project Settings] entry exists, (b) the INI has at least one
[Window] entry, (c) the INI has no [Docking] data block.
- New _assert_live_session_apply() on tests 1 and 2 verifies the
"(and applied to live session)" log line appears in stderr, confirming
imgui.load_ini_settings_from_memory was invoked.
17/17 tests pass (3 install + 2 reset_layout + 8 adjacent gui/commands).