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
- Port the harness listed above into
neomjs/devindex, adjusting src/ imports to node_modules/neo.mjs/src/ as its unit specs already do.
- Add
test-e2e to its package.json.
- Move the five specs; their
page.goto('/apps/devindex/…') targets are already correct there.
- Extend
.github/workflows/ci.yml so e2e runs on push/PR alongside the unit suite.
- Write read-path coverage against
publishedWorkingSet.
- Delete the moved specs from neo only after the destination is green.
Acceptance Criteria
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.mjs — not 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.
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/bigDataand 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/devindexhas no e2e harness at all — one config (playwright.config.unit.mjs), one script (test-unit), noe2e/directory. Five neo specs drive/apps/devindex/exclusively and have nowhere to go:e2e/grid/ThumbDragDevIndex.spec.mjse2e/grid/ThumbDrag.spec.mjsdevindex-stop-stream-buttone2e/grid/ThumbDragPause.spec.mjse2e/benchmarks/GridScrollBenchmark.spec.mjsdevindex-stop-stream-buttone2e/benchmarks/GridProfile.spec.mjsdevindex-stop-stream-buttonAnd 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 reasonneomjs/neo#17369exists. They import plain@playwright/test. OnlyGridScrollBenchmarkpulls one helper.Transitive closure of
playwright.config.e2e.mjs, measured:playwright.config.e2e.mjsconfigTemplateResolver.mjsresolveFreePort.mjse2e/utils/gpuIntent.mjse2e/globalSetup.mjsbuildScripts/util/developmentThemeAssets.mjse2e/custom-reporter.jsfs-extrae2e/utils/browser-test-helpers.mjs≈920 lines, three external ties.
developmentThemeAssets.mjsis reachable in devindex vianode_modules/neo.mjs/buildScripts/, which is already how itsserver-startresolves.gl.setup.mjs+glState.mjsare 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:config.publishedIndexconfig.publishedWorkingSetconfig.paths.indexProvenancedevindex superseded the single-file
publishedIndexwithpublishedWorkingSet— a base URL plus three members fetched through a manifest inStorage#fetchAndAdoptWorkingSet(). CountingpublishedWorkingSet/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
neomjs/devindex, adjustingsrc/imports tonode_modules/neo.mjs/src/as its unit specs already do.test-e2eto itspackage.json.page.goto('/apps/devindex/…')targets are already correct there..github/workflows/ci.ymlso e2e runs on push/PR alongside the unit suite.publishedWorkingSet.Acceptance Criteria
npm run test-e2eexists inneomjs/devindexand passes therepublishedWorkingSet, failing if the fetched/tree agreement or the fallback disclosure regressesgit grep devindex-stop-stream-buttonreturns nothing in neo afterwardsOut of Scope
fixtures.mjs— not needed, and porting it would import the problemneomjs/neo#17369exists to fixAvoided 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
fixtures.mjsstays putOrigin 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.