Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ jobs:

# The full verification matrix: component builds, all execution
# paths (host-embed runner, composed wasi:cli runner under wasmtime,
# deltic runner under stock Deno + its selftest under plain Node,
# polyengine runner under stock Deno + its selftest under plain Node,
# inventory + results pipeline), lockfile drift checks. No engine
# flags: the jco/JSPI lane was deleted in the deltic migration.
# flags: the jco/JSPI lane was deleted in the deltic (now polyengine) migration.
verify:
runs-on: ubuntu-latest
timeout-minutes: 25
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,18 @@ jobs:
# The tree mirrors the repository layout: the viewer resolves
# its engines and the demo fixtures by relative path (see
# js/viewer/README.md), so publishing preserves paths instead
# of flattening. Everything is runtime-linked by deltic in the
# of flattening. Everything is runtime-linked by polyengine in the
# page — no transpiled trees, no shim node_modules.
run: |
set -euo pipefail
mkdir -p _site/js/viewer _site/js/runner-deltic _site/components/fixture-suite _site/examples/aggregate _site/expected
mkdir -p _site/js/viewer _site/js/runner-polyengine _site/components/fixture-suite _site/examples/aggregate _site/expected
cp -r js/viewer/index.html js/viewer/app.mjs js/viewer/viewer.css \
js/viewer/harness.mjs js/viewer/context.js js/viewer/deltic.mjs \
js/viewer/harness.mjs js/viewer/context.js js/viewer/polyengine.mjs \
js/viewer/README.md js/viewer/generated js/viewer/suite \
js/viewer/deltic \
js/viewer/polyengine \
_site/js/viewer/
cp js/runner-deltic/browser-worker.mjs js/runner-deltic/engine.mjs \
_site/js/runner-deltic/
cp js/runner-polyengine/browser-worker.mjs js/runner-polyengine/engine.mjs \
_site/js/runner-polyengine/
cp components/fixture-suite/tests.lock _site/components/fixture-suite/
cp examples/aggregate/targets.toml _site/examples/aggregate/
cp expected/verify-pipeline-fixture.jsonl _site/expected/
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ node_modules/
# Viewer build products (transpiles of the wasm engines/suites)
js/viewer/generated/
js/viewer/suite/
js/viewer/deltic/
js/viewer/polyengine/
23 changes: 12 additions & 11 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ components/ guest components (build with --target wasm32-wasip2)
drift-fixture broken by design: raw registration, drift check
zero-gen-fixture broken by design: zero-row decline generator
hang-fixture broken by design: CPU spin + async wedge (#45)
js/runner-deltic/ deltic runner leg: CLI, browser shard worker, node
js/runner-polyengine/ polyengine runner leg: CLI, browser shard worker, node
selftest (runner-is-provider topology; release-pinned)
actions/ composite GitHub Actions for consumers (#14):
aggregate (matrix -> job summary, findings ->
Expand Down Expand Up @@ -98,11 +98,11 @@ with copies; symlinks require `core.symlinks` on Windows.

wasmtime 47 (`-W component-model-async -S p3`), wac-cli 0.10, wit-bindgen
0.60, Node 24 (plain — the selftest legs; no engine flags anywhere:
deltic's callback ABI needs no JSPI), deno 2.9 (deltic runner
leg + browser-asset build; deltic itself is consumed from JSR as exact
prerelease pins — see `js/runner-deltic/README.md`), Rust
polyengine's callback ABI needs no JSPI), deno 2.9 (polyengine runner
leg + browser-asset build; polyengine itself is consumed from JSR as exact
release pins — see `js/runner-polyengine/README.md`), Rust
target `wasm32-wasip2`, wasm-tools (WIT validation), just (task
runner). jco is GONE from this repo (the deltic migration's Phase 4
runner). jco is GONE from this repo (the deltic (now polyengine) migration's Phase 4
cutover); its findings in `docs/findings.md` are historical. Known
sharp edges are catalogued in `docs/findings.md` — read
it before fighting the toolchain; your bug is probably finding #5, #6,
Expand Down Expand Up @@ -152,17 +152,18 @@ them before committing anything cross-cutting):
2. **Composed runner** (see `examples/compose/README.md`): bundle via
`wac compose`, plug via `wac plug`, run under `wasmtime run -W
component-model-async -S p3`. Same sample-suite verdicts.
3. **deltic runner + browser leg** (see `js/runner-deltic/README.md`):
drive the suite directly under deltic — no transpile step, no engine
flag; JSR-pinned in `js/runner-deltic/deno.json` + `deno.lock`. Same
3. **polyengine runner + browser leg** (see `js/runner-polyengine/README.md`):
drive the suite directly under polyengine — no transpile step, no engine
flag; JSR-pinned in `js/runner-polyengine/deno.json` + `deno.lock`. Same
sample verdicts (shared human + fold goldens); tag scheduling from the
suite's own embedded inventory (fixture leg runs `--missing hsm` like
Paths 1/4, lane goldens in `expected/verify-deltic-*`). The browser
Paths 1/4, lane goldens in `expected/verify-polyengine-*`). The browser
worker (`browser-worker.mjs`, drop-in for `page-runner.mjs` via
`workerUrl`) shares `harness.mjs`'s case loop; `selftest.mjs` gates
that engine path under plain node as `verify-deltic`'s last leg. (The
that engine path under plain node as `verify-polyengine`'s last leg. (The
jco-node runner that used to be this path was deleted in the deltic
migration's Phase 4; `js/viewer/browser-worker.mjs` remains as
(now polyengine) migration's Phase 4; `js/viewer/browser-worker.mjs`
remains as
consumer-facing glue for transpiled-module layouts.)
4. **Inventory + results pipeline**:
```sh
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ together is described in [ARCHITECTURE.md](ARCHITECTURE.md). Layout:
[`crates/`](crates/) (host-side Rust: core model, formats, results
schema, guest SDK, CLI, host-embed runner), [`components/`](components/)
(guest components: reference provider, composed CLI runner core, sample
and fixture suites), [`js/`](js/) (deltic runner leg + browser harness),
and fixture suites), [`js/`](js/) (polyengine runner leg + browser harness),
[`examples/compose/`](examples/compose/) (composition walkthrough),
[`examples/aggregate/`](examples/aggregate/) (cross-target aggregation
walkthrough), [`docs/findings.md`](docs/findings.md) (toolchain
Expand Down Expand Up @@ -264,7 +264,7 @@ WPT, `go test`, LLVM lit) is tracked in the issues.
decline cases).
- The reference `test-context` provider component.
- Runners: `wasi:cli`, `wasi:http` (served UI + remote API), in-browser via
deltic (runtime-linked), native embedding with a libtest-mimic frontend.
polyengine (runtime-linked), native embedding with a libtest-mimic frontend.
- Semver-compatible-linking verification for the `test-context` growth path;
custom-section survival through composition tooling.
- Inventory lockfiles (names + tags) and the update workflow, including
Expand Down
11 changes: 6 additions & 5 deletions docs/findings.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,10 @@ N trivially-passing cases, no corpus, no per-case data
(`components/bench-suite`, count via `BENCH_CASES` env). Drivers:
`bench-mint` bin (wasmtime, production `Runner` config: pooling, CoW,
epoch instrumentation, untyped `Val` calls) and
`js/runner-deltic/bench-mint.mjs` (pinned deltic embedder, plain
`js/runner-polyengine/bench-mint.mjs` (pinned polyengine embedder, plain
Node). Medians over 20/10 fresh instances, one dev box (17-core
x86_64 Linux), wasmtime 47.0.3 / deltic pre-83fff30 / Node 24.
x86_64 Linux), wasmtime 47.0.3 / deltic pre-83fff30 (the engine's
pre-rename name; now polyengine) / Node 24.

19. **wasmtime: `all()` splits ~3:1 registry-build : mint+lift, both
linear.** At 10k cases: all#1 (build + mint + lift) 3.2ms, all#2
Expand All @@ -154,7 +155,7 @@ x86_64 Linux), wasmtime 47.0.3 / deltic pre-83fff30 / Node 24.
wizer) buys more than lift avoidance alone; a direct-access
interface caps out at ~25% unless stacked on a lazy/static
registry.
20. **deltic (runtime linker, callback ABI): same shape, bigger
20. **polyengine (runtime linker, callback ABI): same shape, bigger
constants.** Instantiate ~650µs (~30× wasmtime); mint+lift
~340–370ns/handle (~4.3×; mildly superlinear by 30k — V8 GC on
the wrapper objects); per-call boundary overhead ~25µs (~10×);
Expand All @@ -165,7 +166,7 @@ x86_64 Linux), wasmtime 47.0.3 / deltic pre-83fff30 / Node 24.
21. **`harness.mjs` fresh-instance relocation was the real JS-leg
quadratic** (fixed — positional relocation, PR #83): `freshCases`
re-found each case by a linear `name()` scan. Hot-loop `name()`
costs ~3.4µs under deltic (a cold single call measures ~26µs —
costs ~3.4µs under polyengine (a cold single call measures ~26µs —
promise/JIT overhead that amortizes), so the scan averaged ~N/2 ×
3.4µs ≈ **17ms per case** at 10k (33ms worst, measured), a
multiple of the `all()` re-enumeration it followed and O(N²)
Expand Down Expand Up @@ -223,7 +224,7 @@ bench-suite artifact built with its `wizer-init` feature.
full-isolation run: 30.8s → 7.1s sequential (4.3×), **1.14s at
jobs=8** — per-case isolation on a wizened suite undercuts the
shared-instance numbers that motivated relaxing isolation in #22.
24. **deltic, wizened suite: net ~1.5× only.** all#1 6.9ms → 2.9ms,
24. **polyengine, wizened suite: net ~1.5× only.** all#1 6.9ms → 2.9ms,
but instantiate 0.78ms → 2.17ms: V8 has no CoW memory images, so
the 1.29MB active data segment is copied at every instantiation,
eating most of the build win (translate also 24ms → 44ms,
Expand Down
2 changes: 1 addition & 1 deletion docs/runner-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ the wizened artifact (finding 22).

When it does *not* pay:

- **JS legs (deltic, browser): net ~1.5× at best.** V8 has no
- **JS legs (polyengine, browser): net ~1.5× at best.** V8 has no
copy-on-write memory images, so the 1.29 MB active data segment is
copied at every instantiation (0.78 ms → 2.17 ms), eating most of
the enumeration win (finding 24). Instance granularity K>1 remains
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{"component-test-results":"0.1","target":"deltic/deno","suite":{"name":"fixture_suite","artifact-sha256":"<sha256>"},"run":{"segment":0,"scheduling":"tags"}}
{"component-test-results":"0.1","target":"polyengine/deno","suite":{"name":"fixture_suite","artifact-sha256":"<sha256>"},"run":{"segment":0,"scheduling":"tags"}}
{"case":"fixture/trap/before","status":"pass","provenance":"returned","diagnostics-complete":true,"diagnostics":["before the storm"]}
{"case":"fixture/trap/boom","status":"fail","provenance":"trap","detail":"trap: guest trapped: unreachable","diagnostics-complete":false,"diagnostics":["about to trap"]}
{"case":"fixture/trap/after","status":"pass","provenance":"returned","diagnostics-complete":true,"diagnostics":["still alive in a fresh instance"]}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{"component-test-results":"0.1","target":"deltic/deno","suite":{"name":"sample_suite","artifact-sha256":"<sha256>"},"run":{"segment":0,"scheduling":"tags"}}
{"component-test-results":"0.1","target":"polyengine/deno","suite":{"name":"sample_suite","artifact-sha256":"<sha256>"},"run":{"segment":0,"scheduling":"tags"}}
{"case":"sample/math/add","status":"pass","provenance":"returned","diagnostics-complete":true,"diagnostics":["computing 2 + 2","got 4"]}
{"case":"sample/math/mul","status":"fail","provenance":"returned","detail":"6 * 9: expected 42, got 54","diagnostics-complete":true,"diagnostics":["computing 6 * 9","got 54, expecting the ultimate answer"]}
{"case":"sample/token/attest","status":"skipped","provenance":"returned","detail":"token unavailable at run time; asserted attestation fails cleanly (no hang, no partial attestation)","diagnostics-complete":true,"diagnostics":["probing for hardware token","token unavailable; asserting clean error"]}
Expand Down
16 changes: 8 additions & 8 deletions js/deno.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "@polymorph/test",
"version": "0.1.1",
"version": "0.2.0",
"license": "Apache-2.0",
"//": "The polymorph:test stack's JS runner core on JSR — the one consumable JS surface (the repo-root npm-git facade is retired; this export map is the only one). Plain JS with relative and node: imports only; the browser-safe pieces (harness, context, imports, the workers) load in browsers unchanged, and the node: importers (node-runner, browser-driver) are Node/Deno-side drivers. The publish include-list IS the package: everything else under js/ is repo tooling (the deltic runner leg, selftests, the viewer app).",
"//": "The polymorph:test stack's JS runner core on JSR — the one consumable JS surface (the repo-root npm-git facade is retired; this export map is the only one). Plain JS with relative and node: imports only; the browser-safe pieces (harness, context, imports, the workers) load in browsers unchanged, and the node: importers (node-runner, browser-driver) are Node/Deno-side drivers. The publish include-list IS the package: everything else under js/ is repo tooling (the polyengine runner leg, selftests, the viewer app).",
"exports": {
"./harness": "./viewer/harness.mjs",
"./context": "./viewer/context.js",
Expand All @@ -11,9 +11,9 @@
"./page-runner": "./viewer/page-runner.mjs",
"./node-runner": "./node-runner.mjs",
"./browser-driver": "./browser-driver.mjs",
"./deltic-worker": "./runner-deltic/browser-worker.mjs",
"./deltic-engine": "./runner-deltic/engine.mjs",
"./deltic-worker-main": "./runner-deltic/worker-main.mjs"
"./polyengine-worker": "./runner-polyengine/browser-worker.mjs",
"./polyengine-engine": "./runner-polyengine/engine.mjs",
"./polyengine-worker-main": "./runner-polyengine/worker-main.mjs"
},
"publish": {
"include": [
Expand All @@ -25,9 +25,9 @@
"viewer/page-runner.mjs",
"node-runner.mjs",
"browser-driver.mjs",
"runner-deltic/worker-main.mjs",
"runner-deltic/browser-worker.mjs",
"runner-deltic/engine.mjs"
"runner-polyengine/worker-main.mjs",
"runner-polyengine/browser-worker.mjs",
"runner-polyengine/engine.mjs"
]
}
}
18 changes: 0 additions & 18 deletions js/runner-deltic/browser-bundle-entry.ts

This file was deleted.

49 changes: 0 additions & 49 deletions js/runner-deltic/deno.lock

This file was deleted.

Loading
Loading