deepseek-harness/apps/web/tests
creatixchu 2143361195 fix(web): reserve one scrollbar gutter across the composer's text layers
Second review round escalated the wrap-width divergence from a separate
concern to a defect in this fix's own premise, and it is right.

Only .input scrolls, so only .input loses content width to a scrollbar that
consumes layout space — what Windows and Firefox draw, and what the theme's
global `::-webkit-scrollbar` width makes chromium treat as occupying space.
A narrower .input wraps a long soft-wrapped draft onto more lines, so it
grows taller, its scroll maximum exceeds the backdrop's, and the mirrored
offset clamps below the caret. That is the same failure the trailing-line
sentinel fixes, in the same direction, so deferring it would have shipped a
fix that does not hold where users run a classic scrollbar.

My first attempt to reproduce it found nothing and was wrong: the probe
content was not wrap-sensitive. With varied-length words the effect is
plain — the same draft laid out at 8px-apart widths differs by 2 to 5
lines, while at equal widths a textarea and a div agree exactly.

The three layers now reserve the gutter together, in the shared metrics
block that already exists to keep them symmetric. `overflow: hidden` is
still a scroll container, so the non-scrolling layers honour it: 8px is
reserved on each, measured. The cost is a text column 8px narrower on every
platform, which is the price of one geometry rather than a per-platform one.

The browser scenario asserts the premise directly — equal wrap widths, and a
reserved band greater than zero on each layer. The band is what stops the
assertion being vacuous: the widths would also match with no reservation at
all on this engine's overlay scrollbar, and it is the reservation, not the
match, that carries the guarantee to a platform whose scrollbar takes real
width. Removing the declaration fails it with `expected 0 to be greater
than 0`, and fails the golden with it.

Also from the same round, three comment corrections: the e2e file header no
longer describes the deleted layout effect, the measurement guard no longer
claims the backdrop holds exactly one text node (the sentinel makes a
second), and the sentinel comment now carries the one-sidedness argument
that also settles the ghost hint — the mirror only fails when the backdrop
is SHORTER, and the hint can only add content, never remove a line box.
2026-07-31 12:39:52 +08:00
..
snapshots fix(web): reserve one scrollbar gutter across the composer's text layers 2026-07-31 12:39:52 +08:00
approval-composer.e2e.ts fix: docs/static 2026-07-31 02:13:53 +08:00
built-boot.snapshot.ts wip 2026-07-31 02:13:53 +08:00
code-mode-round.e2e.ts Merge branch 'master' into codex/details-default-closed 2026-07-30 14:50:50 +08:00
composer-draft-scroll.e2e.ts fix(web): reserve one scrollbar gutter across the composer's text layers 2026-07-31 12:39:52 +08:00
cordis-tool-round.e2e.ts test(web): align e2e anchors and goldens with the unified tool-row expand 2026-07-31 02:16:28 +08:00
details-session-lifecycle.e2e.ts wip 2026-07-31 02:13:53 +08:00
lifecycle-chrome.e2e.ts fix(web): show plan status only while active 2026-07-30 22:42:25 +08:00
live-interactions.e2e.ts Merge remote-tracking branch 'origin/master' into feat/session-inherited-boundary 2026-07-30 15:34:55 +08:00
message-actions.e2e.ts wip 2026-07-31 02:13:53 +08:00
models-settings.e2e.ts feat(ui-models)!: single-key hand-written provider editors with derived credential references 2026-07-30 12:17:56 +08:00
navigation-panes.e2e.ts Merge branch 'master' into codex/basic-session-search 2026-07-31 10:23:52 +08:00
onboarding-deepseek-config.e2e.ts fix(web): address onboarding review feedback 2026-07-30 18:56:56 +08:00
plan-review.e2e.ts feat(web): render a plan review as a decision card, not a quiz 2026-07-30 19:09:35 +08:00
question-composer.e2e.ts test(web): pin browser replay locale 2026-07-30 11:39:11 +08:00
queue-actions.e2e.ts wip 2026-07-31 02:13:53 +08:00
replay-round-trip.e2e.ts test(web): pin browser replay locale 2026-07-30 11:39:11 +08:00
scaffold-hermetic.e2e.ts fix(web): isolate replay skill discovery 2026-07-30 19:30:06 +08:00
scaffold.ts Merge remote-tracking branch 'origin/master' into mergebot/pr711 2026-07-31 02:02:47 +08:00
seeded-history.e2e.ts wip 2026-07-31 02:13:53 +08:00
settings-chrome.e2e.ts feat(web): mount the config plane in dsh web and pin the Models page keyless 2026-07-30 09:29:40 +08:00
sidebar-scrollbar.e2e.ts test(web): pin browser replay locale 2026-07-30 11:39:11 +08:00
skill-invocation-policy.e2e.ts test(web): pin browser replay locale 2026-07-30 11:39:11 +08:00
smoke-real.e2e.ts Merge branch 'master' into codex/details-default-closed 2026-07-30 14:50:50 +08:00
steering.e2e.ts wip 2026-07-31 02:13:53 +08:00
support.ts test(web): pin browser replay locale 2026-07-30 11:39:11 +08:00
workspace-management.e2e.ts test(web): anchor the group section above the HoverCard wrapper 2026-07-30 16:54:43 +08:00