LearnNewsExamplesServices
Frontmatter
id17422
titleMove every devindex-related test out of neo, e2e harness included
stateOpen
labels
enhancementaitestingarchitecture
assigneesneo-opus-grace
createdAtAug 20, 2026, 5:24 PM
updatedAtAug 20, 2026, 5:31 PM
githubUrlhttps://github.com/neomjs/neo/issues/17422
authorneo-opus-grace
commentsCount1
parentIssue17238
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Move every devindex-related test out of neo, e2e harness included

Open Backlog/active-chunk-18 enhancementaitestingarchitecture
neo-opus-grace
neo-opus-grace commented on Aug 20, 2026, 5:24 PM

Context

Operator, 2026-08-20: "we need to ensure ALL tests (not just unit ones) from neo that relate to devindex get moved over. once this is done, we can remove it from the neo repo. when that is done, we can finally reduce the bloated 5GB neo history."

That fixes the ordering for the whole line: move the tests → remove the app (neomjs/neo#17421) → reclaim history (neomjs/neo#17376). This ticket is the first link, and it is the one that has to be finished before either of the others can start.

It also supersedes a proposal of mine on neomjs/neo#17421. I had suggested retargeting the three shared e2e specs to examples/grid/bigData and accepting a benchmark re-baseline. Moving them is better and I withdraw the retarget: the specs keep driving the same app in its new home, so the benchmark series stays continuous instead of acquiring a discontinuity we would have had to remember forever.

Live latest-open sweep at 2026-08-20T15:1xZ: no equivalent open ticket. A2A in-flight claim sweep over the last 30 messages: no overlapping [lane-claim].

The Problem

neomjs/devindex has no e2e harness at all — one config (playwright.config.unit.mjs), one script (test-unit), no e2e/ directory. Five neo specs drive /apps/devindex/ exclusively and have nowhere to go:

spec lines devindex-specific dependency
e2e/grid/ThumbDragDevIndex.spec.mjs 313 the app itself; named for it
e2e/grid/ThumbDrag.spec.mjs 195 devindex-stop-stream-button
e2e/grid/ThumbDragPause.spec.mjs 51 50,000 rows
e2e/benchmarks/GridScrollBenchmark.spec.mjs 102 devindex-stop-stream-button
e2e/benchmarks/GridProfile.spec.mjs 116 devindex-stop-stream-button

And one unit spec has no counterpart there — see the read-path section below.

The Architectural Reality

The harness port is far smaller than the e2e tree suggests, and that is worth stating up front so nobody scopes it off the directory size.

None of the five specs import test/playwright/fixtures.mjs — the 682-line Neural Link fixture that pulls the Brain and is the reason neomjs/neo#17369 exists. They import plain @playwright/test. Only GridScrollBenchmark pulls one helper.

Transitive closure of playwright.config.e2e.mjs, measured:

file lines non-builtin dependency
playwright.config.e2e.mjs 84
configTemplateResolver.mjs 177 node builtins only
resolveFreePort.mjs 41 node builtins only
e2e/utils/gpuIntent.mjs 151 none
e2e/globalSetup.mjs 19 buildScripts/util/developmentThemeAssets.mjs
e2e/custom-reporter.js 314 fs-extra
e2e/utils/browser-test-helpers.mjs 135 none

≈920 lines, three external ties. developmentThemeAssets.mjs is reachable in devindex via node_modules/neo.mjs/buildScripts/, which is already how its server-start resolves.

gl.setup.mjs + glState.mjs are the GPU-probe project, only instantiated when the launch args request hardware GL. Optional for a first cut; named so the omission is a decision rather than an oversight.

The read-path gap is not a move

unit/app/devindex/StoragePublishedIndex.spec.mjs (8 tests) cannot be copied. Measured on both trees:

symbol neo devindex
config.publishedIndex 2 0
config.publishedWorkingSet 0 4
config.paths.indexProvenance 3 0

devindex superseded the single-file publishedIndex with publishedWorkingSet — a base URL plus three members fetched through a manifest in Storage#fetchAndAdoptWorkingSet(). Counting publishedWorkingSet / baseUrl / fetch( across all nine devindex specs returns zero: the newer, more complex implementation has no coverage, while the superseded one has eight tests in the repo that no longer runs it.

So this arm is write new coverage against the live shape, using neo's spec as the specification of intent. Detail and the eight properties: neomjs/neo#17421's D1 correction comment.

The Fix

  1. Port the harness listed above into neomjs/devindex, adjusting src/ imports to node_modules/neo.mjs/src/ as its unit specs already do.
  2. Add test-e2e to its package.json.
  3. Move the five specs; their page.goto('/apps/devindex/…') targets are already correct there.
  4. Extend .github/workflows/ci.yml so e2e runs on push/PR alongside the unit suite.
  5. Write read-path coverage against publishedWorkingSet.
  6. Delete the moved specs from neo only after the destination is green.

Acceptance Criteria

  • npm run test-e2e exists in neomjs/devindex and passes there
  • All five specs run green in the destination, driving the app from that repo
  • The two benchmarks produce numbers on the same app they measure today — no fixture change, so the series stays continuous
  • Read-path coverage exists for publishedWorkingSet, failing if the fetched/tree agreement or the fallback disclosure regresses
  • devindex CI runs both suites on push and PR
  • Only then: the moved specs are deleted from neo, and neomjs/neo#17421 can proceed
  • git grep devindex-stop-stream-button returns nothing in neo afterwards

Out of Scope

  • Removing the app, guides, SCSS from neo — neomjs/neo#17421, gated on this
  • History reclaim — neomjs/neo#17376, gated on that
  • The Neural Link fixtures.mjsnot needed, and porting it would import the problem neomjs/neo#17369 exists to fix
  • The GPU-probe project, unless the benchmarks prove to need hardware GL

Avoided Traps

Do not delete from neo first. The read-path gap is exactly how that ends: eight tests deleted from the only repo that has them, against code that lives elsewhere and is uncovered.

Do not port fixtures.mjs "for completeness." No spec here imports it; pulling it in would give devindex the whole-Brain import cost for zero specs.

Related

  • neomjs/neo#17421 — the removal, gated on this
  • neomjs/neo#17376 — history reclaim, gated on that
  • neomjs/neo#17238 — the epic
  • neomjs/neo#17394 — the privacy defect on the uncovered hydration path
  • neomjs/neo#17369 — why fixtures.mjs stays put

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

Handoff Retrieval Hints: query_raw_memories("devindex e2e harness port ThumbDrag benchmarks publishedWorkingSet coverage"). Anchors: playwright.config.e2e.mjs, browser-test-helpers.mjs, fetchAndAdoptWorkingSet.