You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Run a suite in a real browser: transpile suite + host shims with jco (JSPI), drive from Node via a page driver. Lessons from webcrypto's conformance/adapters/jco/ that should be designed in from the start:
The gating CI adapter and any interactive viewer page must share one harness module, or they drift.
Worker-pool striping (case index % workers), not contiguous chunks — expensive cases cluster by group.
Each worker imports its own suite + shim instances and runs its stripe strictly sequentially: no host instance sees two in-flight operations.
A JS throw from run means the guest was aborted (an unliftable error): record it as that case's failure, treat the instance as poisoned, keep the run alive.
Heartbeats + a stall watchdog; browser located via env var → system names → Playwright cache.
The viewer-page half of this is now tracked separately as #46 (results viewer over the canonical format, useful standalone). The shared-harness constraint recorded here applies whenever #46's page grows a live-run mode.
The viewer half landed (d85d396, see #46): js/viewer's Live pane runs any jco-transpiled suite in a Web Worker pool with the striping/instance-isolation rules this issue records, over a shared browser-safe harness.mjs (inventory parsing, mark scheduling, the case loop — selftest-gated including striping partition equality). What remains for this issue is the gating browser adapter: a Node page-driver that runs a suite in headless Chromium in CI and emits results-JSONL. Per the one-harness rule, it must consume js/viewer/harness.mjs + worker.mjs rather than carry its own loop; the heartbeat/stall-watchdog and browser-discovery pieces can port from component-webcrypto's scripts/browser-page-driver.mjs.
Closing: the in-browser runner exists and is consumed, just not via jco. The stack is the exported page-driver plus runtime-linked workers — js/browser-driver.mjs (Chromium discovery via CHROME_PATH/system/Playwright cache, heartbeat stall watchdog), js/viewer/page-runner.mjs, and the deltic browser worker (#76) — all over the one shared harness.mjs this issue demanded, with striping, per-worker instances, trap containment, and canonical results-JSONL, gated by the verify-deltic/verify-viewer selftests and consumed by the webcrypto and websocket browser legs. The jco transpile lane this issue named was deleted in the Phase 4 cutover (#77), which retires the title's mechanism; every recorded lesson is implemented in the replacement.
Activity
lann commentedon Aug 4, 2026
The viewer-page half of this is now tracked separately as #46 (results viewer over the canonical format, useful standalone). The shared-harness constraint recorded here applies whenever #46's page grows a live-run mode.
Results viewer + live browser harness (#46, the page half of #5)
lann commentedon Aug 5, 2026
The viewer half landed (d85d396, see #46): js/viewer's Live pane runs any jco-transpiled suite in a Web Worker pool with the striping/instance-isolation rules this issue records, over a shared browser-safe
harness.mjs(inventory parsing, mark scheduling, the case loop — selftest-gated including striping partition equality). What remains for this issue is the gating browser adapter: a Node page-driver that runs a suite in headless Chromium in CI and emits results-JSONL. Per the one-harness rule, it must consumejs/viewer/harness.mjs+worker.mjsrather than carry its own loop; the heartbeat/stall-watchdog and browser-discovery pieces can port from component-webcrypto'sscripts/browser-page-driver.mjs.Root npm facade: the JS runner core as a rev-pinned git dependency
lann commentedon Aug 11, 2026
Closing: the in-browser runner exists and is consumed, just not via jco. The stack is the exported page-driver plus runtime-linked workers —
js/browser-driver.mjs(Chromium discovery via CHROME_PATH/system/Playwright cache, heartbeat stall watchdog),js/viewer/page-runner.mjs, and the deltic browser worker (#76) — all over the one sharedharness.mjsthis issue demanded, with striping, per-worker instances, trap containment, and canonical results-JSONL, gated by the verify-deltic/verify-viewer selftests and consumed by the webcrypto and websocket browser legs. The jco transpile lane this issue named was deleted in the Phase 4 cutover (#77), which retires the title's mechanism; every recorded lesson is implemented in the replacement.