LearnNewsExamplesServices
Frontmatter
id17430
titleTwo grid properties lost coverage when devindex left: a paused thumb drag, and scroll cost
stateClosed
labels
architecturetech-debt
assigneesneo-opus-grace
createdAtAug 20, 2026, 7:41 PM
updatedAtAug 25, 2026, 9:26 PM
githubUrlhttps://github.com/neomjs/neo/issues/17430
authorneo-opus-grace
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 25, 2026, 9:26 PM

Two grid properties lost coverage when devindex left: a paused thumb drag, and scroll cost

Closed Backlog/active-chunk-18 architecturetech-debt
neo-opus-grace
neo-opus-grace commented on Aug 20, 2026, 7:41 PM

Context

#17421 removes apps/devindex and the five e2e specs that navigated to it. Those specs were the app's coverage, and they moved to neomjs/devindex with it — correct disposition, and the operator explicitly accepted removing now.

But three of the five were also engine coverage that merely used the app as a fixture. Most of that survives; two properties do not, and this is the account of which — filed at removal time rather than discovered later as a silent hole.

What survives (measured, not assumed)

property still covered by fixture
Visual blanking + jitter under scroll grid/RowPinning.spec.mjs — the identical test title BigData
Optical + recycling horizontal scroll grid/LockedCellHorizontalStability.spec.mjs lockedColumns
Scrollbar-routed overdrag, locked region frozen grid/ColumnOverdragScroll.spec.mjs lockedColumns

RowPinning.spec.mjs already carried "Scroll Telemetry: Visual Blanking and Jitter Detector" against BigData — the same title the departing spec used — so the jitter half needed no retargeting. Worth stating plainly, because the obvious assumption on reading the removal diff is that it left with the app.

The Problem — two properties genuinely left

1. Pausing mid-thumb-drag no longer has any coverage.

ThumbDragPause.spec.mjs asserted "Pausing during thumb drag keeps pinning active" — hold the scrollbar thumb, stop moving, and pinned rows must stay pinned. RowPinning.spec.mjs contains exactly one test and it is the telemetry one, so nothing remaining exercises a paused drag. The pause is the interesting part: it is the state where a drag is live but no events are arriving, which is exactly when a stale-render bug is invisible to a moving-drag test.

2. neo has no grid scroll benchmark.

GridProfile and GridScrollBenchmark were the only grid wall-clock measurements here. The sole remaining file under e2e/benchmarks/ is HarnessEnduranceBenchmark.spec.mjs, which drives /ai/examples/harnessEndurance/neo/ and measures event-loop lag and heap under a streamed load — a different subject entirely. Nothing in this repository now measures grid scroll cost.

This one is not simply "re-point the old spec". #17421 recorded why: the benchmarks re-baseline at any fixture change (50k rows / 37 columns → 20k / 50 for bigData), so numbers before and after are not comparable and must not be read as a regression. A new series is the honest framing, not a continued one.

Acceptance Criteria

  • A neo-fixture spec asserts pinning survives a paused thumb drag — thumb held, no movement for a measurable interval, pinned rows still pinned and still painted
  • That spec fails when the pause handling is removed or short-circuited — a moving-drag-only assertion must not be able to satisfy it
  • Either a grid scroll benchmark exists against a neo-owned fixture, or this ticket records the decision not to have one and says what covers scroll-cost regressions instead
  • If a benchmark lands, its first run is labelled as a new series with its fixture named in the annotation, so a future reader cannot compare it against the pre-removal numbers

Deliberately not urgent

Neither gap is a live defect and neither blocks #17421 or #17376. This exists so the reduction is observed rather than remembered — a coverage hole with no ticket is indistinguishable from a coverage hole nobody noticed, and #17421's own diff reads as if the coverage simply moved.

Out of Scope

  • Restoring the deleted specs here; they navigate to an app this repository no longer contains
  • GridScrollBenchmark's dormant jank instrument and its scroll target, both marked fixme and now neomjs/devindex's to repair

Related

  • #17421 — the removal that produced this reduction
  • #17422 — the test migration that preceded it
  • #17427 — the grid silent-update defect a paused-drag probe would plausibly exercise

Origin Session ID: 3e4f33e0-fb23-4a61-a2a0-7f396950f3d6

Handoff Retrieval Hints: query_raw_memories("devindex removal grid coverage gap thumb drag pause benchmark"). Anchors: ThumbDragPause.spec.mjs, RowPinning.spec.mjs, HarnessEnduranceBenchmark.spec.mjs.

tobiu referenced in commit 32cc4b7 - "test(grid): pinning survives a paused thumb drag (#17430) (#17775) on Aug 25, 2026, 9:26 PM
tobiu closed this issue on Aug 25, 2026, 9:26 PM