Files
endorphin-tessera-gui/docs/ui-workspace-audit.md
T

10 KiB
Raw Blame History

Window workspace requirement audit — 2026-10-24

This audit follows the full conversation, including later corrections. Implementation completion and native evidence are different columns. No claim is made that Chrome was personally measured.

Requirement Implementation Evidence / limits
One top row with native macOS controls Transparent/full-size native title bar; reserved control space; 40 px tab strip Actual Retina macOS windows viewed; native close/minimize/fullscreen controls retained
Continuous left/top chrome One neutral background; 56 px left rail; inset content panel Actual main and detached windows viewed; no Tools label or rail launchers
Compact symmetric round tabs, softer active state 208 px maximum width; equal 4 px vertical insets; matching icon/close slots; no hard active stroke Native settled UI viewed; hover and selected use the same bounds
+ and startup default page One startup request guarded against duplicate resume; + release-inside; Cmd/Ctrl+T Immediately after restart: pages().count = 1. Two native Cmd+T actions produced three tabs
New-tab motion, filled and unfilled 200 ms cubic ease; new width grows from zero; existing bounds and + interpolate; scalar-only animation data Real native new/close/fill operations completed; settled compression/overflow viewed. No frame-by-frame recording or Chrome timing comparison
Overflow and scrolling Separate + reservation; arrows, edge dwell and hit bounds share tab viewport Native overflow reached; + in overflow increased VM count 7 → 8. Dragging out of + kept count at 7
Close/activate/reorder/migrate/detach Ordinary managed Page methods retained; animated hit bounds and drag anchors use current visual bounds Native close and drag-out to Endor Window 2 succeeded. API detach/move-back preserved Page 1:135:0. Native cross-window drop, dwell and mixed-DPI were not re-run in this final build
Four developer tools separated Independent Page instances; Console/Sources/Network/Settings modules and separate per-view state Earlier native top-level Sources/Console activation and read-only copy/paste verified; no nested navigation remains
Four tools not default or permanently placed No Tools menu, rail buttons or new-page tool directory; existing API/shortcut retained Final default surfaces viewed without tool entries
Source reading/selection/copy Grapheme-boundary selection, no gutter in copy, select-all/copy, Shift navigation, drag edge scrolling Native single-line drag/copy/paste verified earlier in this change. Final keyboard copy was re-run after the chrome-focus fix: drag-copy matched the complete selected line; four Shift+Right operations copied the expected four characters; select-all copied multiline source without a gutter. Drag edge behavior compiled; exhaustive combinations remain untested
Clicking Console output must not jump to prompt/end Input hit region restricted to actual prompt rows Native reading/copy path verified earlier; no input hit over transcript-only area
Default page reflects Endor Real Endor Page with creation, shared-object and composition actions; no persistence/model backend claims Referenced chats read: 01a16819-28c3-7ce0-9423-0ffaa19402ce and 01a1689b-77d8-75a2-ba9e-b2fa3dce654e; actual native start surface viewed
Sensible source organization Runtime/API tests separated; four page view modules; shared painter/selection; native tool Page factory; motion module All-target Clippy compiled production and test sources. Runtime host reduced from ~7000 to ~1380 lines
Protect existing work examples/README.md and examples/workspace.endor excluded; vendor/Aster untouched git status checked before staging
Verification restrictions fmt, all-target Clippy -D warnings, release build and manual native/API checks No cargo test, smoke script, Docker, dependency test install or CI polling

Reference boundaries

The user's Chrome/Codex reference images supplied the single-row controls, capsules and continuous left/top chrome. The Obsidian reading-view reference informed restrained contrast and pane separation.

The actual tools refused access to both Codex and Terminal. The available in-app browser exposes page content, not Chrome's native tab strip. No personal Chrome window/profile was operated. A Chromium source search was supplementary research, not an animation test; fetching the selected source page failed. Therefore the requested isolated Chrome comparison remains unverified.

Manual request correction

One placement probe used unsupported == syntax and returned a parse error before execution. It was replaced with direct returned object-identity checks. Both the detached-window Page and moved-back Page returned 1:135:0. The failed expression is not counted as passing evidence.

Remaining verification

Isolated Chrome timing/shape comparison, frame-by-frame animation capture, fresh native cross-window drop/dwell on the final build, mixed-DPI cross-screen interaction and exhaustive keyboard/source-selection combinations remain without new runtime evidence. These are not silently marked passed. The shipped Page lifetime/GC model was preserved; no new persistence or AI backend is claimed.

Final focus regression fix

Final native retesting found a real regression: title-strip mouse events cleared the active editor focus. Window activation performed before automated key events exposed the same behavior. Chrome mouse presses now preserve content focus; developer pane hit testing ignores points outside the pane; frame publication updates the keyboard route according to the active Page. No source, tab geometry or selection state is logged by the shipped build.

After the fix, direct system clipboard comparisons (without printing clipboard contents) confirmed selected-line equality (28 characters), Shift+Right selection equality (4 characters), and multiline select-all with no line-number gutter. The temporary Sources Page was closed afterwards. All-target Clippy, formatting and release building passed again.

Local delivery state

Implementation commits: 3220544 (runtime test-source separation), 656522e (managed workspace/chrome implementation), d3165b1 (behavior and requirement audit), followed by the chrome-focus fix commit. A push to origin/main was attempted once and rejected by automatic approval review because explicit authorization for this default-branch remote mutation was required. No alternative push route was attempted. The remote remains unchanged pending the user's approval.

Functional start-page revision

The previous Rust-painted introduction was removed. ui_bridge/start_page.endor now defines a managed Page subclass with native layout alignment, real buttons, a shared-state counter and a composed-Blocks example. Its private module globals do not overwrite user REPL bindings. The same factory is available as ui.newTab(); legacy ui.developerTools("New tab") delegates to it. No developer-tool entry is shown on the start page.

Native startup checks caught unsupported comparison syntax and unimplemented arithmetic bytecode in initial layout drafts. Those drafts were replaced with existing Page/Row measurement and native mainAlign, without changing Aster. A subsequent layout check caught unbounded child-height centering; sizing now belongs to the root Page, which receives the actual content constraints. These failures were corrected locally, and are not counted as passing checks.

Final native checks for this revision: all three start-page buttons opened their corresponding managed Pages; the blank-page return action activated its original home Page; one native counter click changed both views from 0 to 1. Overflow navigation was visible while these Pages were added. A direct ui.newTab() call increased the live Page count from 4 to 5, confirming one Page per factory call. The final window was also being operated by the user (reported by the UI tool), so the pre-existing four tabs are not treated as a clean-start count measurement. No additional restart was done after that interaction. The earlier isolated startup count of one remains evidence for the guarded startup path; the new factory's single-call count was checked separately.

Formatting, all-target offline Clippy with warnings denied, the release macOS bundle and diff whitespace checks passed. No test suite or smoke script was run. All earlier requirements were reviewed against the table above; isolated Chrome motion comparison and the explicitly listed cross-window/DPI verification gaps remain unverified, rather than being marked complete.

Chrome contrast correction

The continuous top/left chrome now uses #E6E9ED instead of #F5F5F5, separating it visibly from the #F7F7F5 content canvas. Selected tabs retain white fill and dark text; inactive titles use muted text. Geometry and borderless selection are unchanged. After rebuilding and restarting, the native window showed one startup tab; a + click added a second tab and the two states were visually checked. Formatting, all-target offline Clippy and release bundling passed.

Start-page visual redesign

Reviewed the four user-supplied Codex/Chrome/Obsidian/VS Code references and Anthropic's frontend-design skill. Reference decisions and tokens are recorded in docs/start-page-design.md. The default page now uses one 28 px wordmark, a short 14 px hint, aligned action rows and separate shortcut rows. A first pass with white outlined buttons was rejected by the user; the action fill and border were removed in the final pass. The Endor Button subclass keeps a 360 × 40 hit target but returns an empty background display list; its label and native focus indicator still render through the existing tree.

Native screenshot review confirmed the final text-row treatment. Clicking the shared-object action opened its Page; Tab focused the first action with a visible outline. Startup displayed one default Page. Formatting, all-target offline Clippy, release bundling and diff whitespace checks passed. No automated test suite was run. The design skill was read from a temporary download only; no global skill, hooks or new application dependency was installed.