Description
Summary
Batch of overflow/truncation inconsistencies. Grouped for one polish pass.
UX-17 — Todo pane. Item rows omit overflow: 'truncate' (packages/mayfly/src/transcript/pane-todo.ts:254, :260) while the title and blocked rows truncate (:238, :249); the compiler default is wrap (ui-compiler.ts:1087-1089). The "5-row" folded view can therefore take many more screen rows, an expanded long list has no size cap (pane-todo.ts:283-288), and under lane pressure the clamp drops the tail — including the ctrl+t to collapse footer (surface-manager.ts:241-245). Queue-pane rows likewise wrap unbounded (interaction/pane-queue.ts:39). Related: the todo docstring promises muted strikethrough for completed items but only tone: 'muted' is applied (pane-todo.ts:10 vs :163).
UX-18 — Inconsistent overflow indicators.
- Header lane silently drops rows past its 4-row cap with no marker (
surface-manager.ts:344,SURFACE_HEADER_MAX_ROWSat:88), while bottom panes render… +N more rows(surface-manager.ts:241-245,:317-320) — same situation, two behaviors. - A bottom pane allotted exactly one row shows its head with no overflow hint (
surface-manager.ts:243). - Three truncation indicators in one chrome layer: pi-tui default
'...'(chrome.ts:339,:344,:353),'…'(chrome.ts:191), and silent cutoff with no indicator (chrome.ts:412).
UX-19 — ScrollablePanel affordances. The panel chrome carries no scrollbar cell or position counter (scrollable-panel.ts:84-92) — compare the autocomplete list's (3/17) indicator (ui-patterns.ts:153) — so a user reading a long subagent transcript can't tell whether more content exists above/below. render returns [] below width 5 (scrollable-panel.ts:62), making the whole panel including borders vanish instead of degrading. (Suspected) tall plugin overlays are hard-clipped by renderLayoutFrame at the default 33%-of-screen max height with unreachable tails (surface-renderer.ts:205-211); shipped overlays embed ui.scroll(...), so impact depends on third-party content.
Acceptance criteria
- Todo/queue rows truncate consistently; folded height matches the promise; expanded lists are size-capped; the footer survives clamping.
- One overflow-indicator convention across lanes and chrome (with a marker whenever content is hidden).
- ScrollablePanel exposes a scroll-position affordance and degrades gracefully at tiny widths.
Audit reference
docs/audits/2026-09-28-ui-ux-audit-data-and-layout.md § UX-17 – UX-19 (baseline 27bc188, 2026-09-28)
Activity
GeekCmore commentedon Sep 28, 2026
In progress (
status:in-progress). Covered by the unified overflow pass:fitSurfaceRows/surface-renderershare one marker; content truncation uses…everywhere.overflow: 'truncate'), the expanded list is size-capped, and thectrl+tcollapse/expand affordance survives lane clamping (overflowKeepsTail).ScrollablePanel: scroll-position indicator and graceful degradation below width 5 instead of vanishing; tall overlays verified/regression-tested.Note: the queue-row wrap item is already fixed on
mainby #57 —interaction/pane-queue.tsnow setsoverflow: 'truncate'(baseline27bc188did not). Only a regression test is needed.Branch
fix/display-layout-fidelity.GeekCmore commentedon Sep 28, 2026
Implementation opened as #81 (branch
fix/display-layout-fidelity).pnpm run verify:fullis green (typecheck, lint, build, shots, coverage, happy smoke). Manual runtime acceptance is pending before merge.fix(ui): unify display values, overflow signalling, and editor-slot l…
Merge pull request #81 from Ephemeral-AI-Lab/fix/display-layout-fidelity
GeekCmore commentedon Sep 29, 2026
Closing as fixed, verified on current
main.OVERFLOW_ELLIPSIS(…,core/width.ts) marks the chrome frame's title/footer rows, panel chrome, and the degenerate-width clamp.overflow: 'truncate') with theMAX_VISIBLEfold cap and thectrl+taffordance (transcript/pane-todo.ts);pane-todo.spec.ts(24 tests) pins the folded/expanded selection and the affordance contract.interaction/pane-queue.spec.tspins the one-rendered-line contract against long rows (overflow: 'truncate'on every queue row).overflowKeepsTailclassification asserted inplugin-surface-bridge-pane.spec.ts(29) andsurface-manager.spec.ts(27).FRAME_DEGENERATE_WIDTHbackstop incore/chrome.ts.Note:
ScrollablePaneland its(start-end/total)position indicator were removed by the #85 conversation-views rework (component + spec deleted together); panels now budget fromscreen.editorViewport. If a scroll-position indicator is still wanted, that is new work against #85's architecture — please open a fresh issue rather than reopening this one.Deterministic evidence re-run today on
main(14e6ce7): pane-todo 24, pane-queue 7, surface-manager 27, plugin-surface-bridge-pane 29, width scans 300 — all pass.