Content temporarily unavailable
PR #2103 separate WASM asset review#
- Base: origin/main at the PR's merge base.
- Production reviewed at 3a7d88102. The commit that adds this record changes only oracles, tests, and documentation, so production is the same.
- Oracles:
- The OPFS open outcome oracle, packages/browser-db-sqlite-persistence/tests/opfs-open-outcome-oracle.ts. Its jsdom driver is tests/opfs-open-outcome-oracle.test.ts and its Chromium driver is e2e/opfs-open-outcome-oracle.e2e.test.ts.
- The install-layout oracle, packages/browser-db-sqlite-persistence/e2e/install-layout-oracle.e2e.test.ts.
- Supporting checks: e2e/wasm-package-consumer.e2e.test.ts (build output, export map, classic worker, about:srcdoc, cross-origin page), e2e/bundler-consumers.e2e.test.ts (webpack 5 and Next.js consumers), and tests/opfs-database.test.ts.
Contract and evidence#
The README promises how an open settles. A capability failure in the asset lookup, worker start, or WASM load rejects with PersistenceUnavailableError. The open deadline rejects a pending open with TimeoutError, and an abort rejects it with the abort reason; both cover every step. A failed or interrupted open terminates the worker it started, and a step that completes after the open settled starts no worker.
The README also states which installs open in Vite development. A pre-bundled copy asks the dev server for its assets by package name from the app root. It opens when the root resolves that name, loads the root's copy when another copy is installed, and otherwise rejects with PersistenceUnavailableError. Excluding the specifier that the importer uses serves the copy in place.
Earlier rounds of this PR found these defects against that contract, each with a failing witness before its repair: the deadline and abort did not cover the lookup; a failed lookup, an about:srcdoc frame, and a refused Worker constructor rejected with raw errors; a missing WASM file was reported as an internal error; a cache directory named dist skipped the needed lookup; and an excluded transitive install still ran the lookup. The two oracles in this record replace the fixed witnesses that stated their own expected results.
The install-layout model disagreed with the README in two places. Two installed copies open with the root copy's assets instead of rejecting, and an npm alias must be excluded by its alias name. The README was corrected; the model was not changed to match production.
Calibration#
Each control was a temporary source mutation, rebuilt and reverted after the run. "Assertion failure" means the refinement check failed with an observation diff, not a timeout.
| Control | Owner and driver | Classification |
|---|---|---|
| Asset lookup not raced against the deadline and abort | Open outcome, Chromium | Assertion failure in both interrupted histories: settlement pending one task after the interruption (about 120 ms) |
| Same | Open outcome, jsdom | Unreached path: this driver has no lookup |
| Interrupted open starts a worker when the lookup completes late | Open outcome, Chromium | Assertion failure in both interrupted histories; the failing field was not inspected |
| Worker reports a WASM load failure as an internal error | Open outcome, Chromium | Assertion failure in the WASM-failure history |
| Same | Open outcome, jsdom | Unreached path: the driver supplies the worker's response |
| Refused Worker constructor's error escapes unclassified | Open outcome, Chromium and jsdom | Assertion failure in the refused-worker history, in both drivers |
| Rejects before making the asset lookup | Open outcome, Chromium | Assertion failure on reached.lookup only (inspected); settlement and worker counts matched. The first attempt was a setup failure: an unconditional throw did not compile, so the old build ran |
| Lookup runs even when the copy is served in place | Install layout | Assertion failure in exactly the excluded transitive, alias, and two-copy cases |
| Built package starts a module worker | Bundler consumers | Assertion failure in all six webpack and Next.js cases (workerTypes) |
| Lookup runs without a Vite client on the page | Bundler consumers | Assertion failure in the four Next.js cases; equivalent within the two webpack cases, because webpack emits the worker and WASM into one directory and the moved-code check skips the lookup |
| Production builds keep the dev-only lookup (the code before the production gate) | Bundler consumers, Vite consumer | Assertion failure in the webpack production and both Next.js production cases and in the Vite consumer's production build (shipsViteLookup) |
| Worker accepts an opener from another version (the code before the version check) | Install layout | Assertion failure in the three pre-bundled two-version cases: the open succeeded with the other copy's worker |
| Worker reports a refused OPFS storage root as internal (the code before the storage check) | Worker diagnostics | Assertion failure in the storage-root examples and both campaigns: INTERNAL with the bare browser message |
| Worker sends a PersistenceUnavailableError message with its prefix (the code before the fix) | Worker diagnostics | Assertion failure on the response text; the opener showed the prefix twice |
The reject-before-lookup control shows why the observation records reach. Without reached, that history would have passed.
No control was run for the worker-script failure history added in this round. Production passed it unchanged, and a control that ignores the Worker error event would leave the open pending and fail by timeout.
Requirements#
| Requirement | Outcome |
|---|---|
| ORC-001 Contract authority and limits | Each oracle opens with its law, the README as authority, and its limits. |
| ORC-002 Independent judgment | The open model is a decision rule over the history. The layout model reads two facts from the installed tree, the importer's specifier and the Node resolution of the package name from the app root, and imports no production code. |
| ORC-003 Distinguishable responsibilities | The open oracle keeps law, grammar, model, and comparison in one module and each driver in its own file. The layout oracle keeps model, cases, installer, and driver in separate sections. |
| ORC-004 Grammar controls | Both grammars are bounded exhaustive products. Open histories: a held lookup or silent initialization must be interrupted, a history that fails early fixes later steps, and an interruption in the same turn as a failing step is excluded because no law orders the two. Layout cases: every layout with three cache directories while pre-bundled, every layout excluded by import name, an alias excluded by package name, and every layout in production. |
| ORC-005 Production path and observation | Chromium drives the public opener from a built package in a consumer app; jsdom drives it from source. reached is the positive execution witness for the lookup, worker start, and initialization. |
| ORC-006 Calibration | See the table above. |
| ORC-007 Random campaigns | Not applicable: no history is randomly generated. |
| ORC-008 Model minimality | Not applicable: both models are stateless functions of one history or case. |
| ORC-009 Vocabulary | The open model's "worker start" combines Worker construction and script load, and "deciding step" is a model term; the module prose declares both. |
| ORC-010 Failure fidelity and cleanup | No shrinking. Drivers release held lookups and close their browser context or page in finally, after the comparison input is recorded. |
| ORC-011 Second formulation | Not applicable: no reviewer named a fault that the model and production could share. |
| ORC-013 Reusable boundary law | Not applicable: neither oracle is cited as protecting a law outside this package. |
| ORC-014 Controlled premises | The jsdom WASM failure response is a controlled premise; the Chromium driver's real WASM 404 is its receiving witness. The Chromium refused-worker init script is controlled; the consumer check's cross-origin page supplies a real refusal. |
| ORC-015 Declared reach | Each driver checks that its product covers the outcomes it declares, and each history's observation compares production reach with the model. |
| ORC-016 Law-only oracle files | The oracle files hold no unit tests; fixed checks stay in the consumer test file. |
Limits#
A manual probe ran the packaged consumer under Vite development and preview in Playwright's Firefox 150, which opened and queried SQLite, and WebKit 26.4, which refuses the OPFS storage root even on a blank page. With the storage check, WebKit's open rejects with PersistenceUnavailableError; before it, the open reported an internal error. Real Safari 27.0 on macOS was checked by hand against 9d0ee7234: under Vite development, through the asset lookup, and under a Vite production preview, the page opened SQLite, wrote and read a row, and started one classic worker.
Both oracles cover Vite only, in Chromium. The bundler consumer checks add webpack 5 builds and Next.js with Turbopack and webpack, in development and production, as fixed receiving witnesses. Firefox and real Safari were checked by hand, not by a repository test. Nothing covers webpack-dev-server, Rspack, Parcel, esbuild, an open from inside a worker, or a Vite client injected without a script src. The README states the last two as cases that need the exclusion.
The Vite production builds in these tests run with NODE_ENV=production. Vitest sets NODE_ENV=test, and a Vite build under it keeps development code, so the Vite consumer check first reported a lookup that a real vite build drops.
While the bundler checks were written, webpack and Turbopack first resolved the workspace packages to their sources through each package's tsconfig paths. Published packages ship no tsconfig, so the checks install the built workspace packages as published packages instead.
Open questions that need a product decision: no law orders an interruption against a step that fails in the same turn, and two installed copies of different versions can pair one copy's opener with the other's worker without a version check.