Deferred half of the consumer-glue consolidation (see the bin/helpers issue and umbrella on #14). Each consumer built a jco driver over @polymorph/component-test-js/harness, and the topologies genuinely differ:
- webcrypto (
conformance/driver-ct/jco/runner.mjs, worker-node.mjs, run-browser.mjs, worker-browser.mjs): worker-thread / Web-Worker pools striping ~19k cases, fresh instance per case (JSPI attempts cannot be cancelled), content-stamp + flock transpile guard, Playwright page harness with heartbeat stall watchdog, findChrome() ladder.
- websocket (
run-node.mjs, run-browser.mjs, harness.mjs): sequential (loopback-I/O-bound corpus; sidesteps Chromium per-endpoint handshake serialization), suite-owned echod spawn, env-carried config.
- webrtc (
run.mjs, run-browser.mjs, harness.mjs): drivers are children of a Rust orchestrator — JSONL on stdout, role/run-id env contract, --select prefix, same-origin reverse proxy for the browser mailbox.
What is provably common: transpiled-module loading, import binding, envelope emission, per-case timeout handling, the browser page-driver skeleton (static server + import map + Chromium + watchdog). What varies: concurrency/instance policy, SUT host modules and their config, child-process vs in-process contract.
Decision deferred until (a) the shared-parts issue lands and shrinks the residue, and (b) a fourth consumer arrives (tls's jco leg, blocked on lann/jco#34 + lann/jco#35) to test any proposed seam against. Generalizing the driver from n=3 with live divergence risks an abstraction the next consumer immediately breaks.
Deferred half of the consumer-glue consolidation (see the bin/helpers issue and umbrella on #14). Each consumer built a jco driver over
@polymorph/component-test-js/harness, and the topologies genuinely differ:conformance/driver-ct/jco/runner.mjs,worker-node.mjs,run-browser.mjs,worker-browser.mjs): worker-thread / Web-Worker pools striping ~19k cases, fresh instance per case (JSPI attempts cannot be cancelled), content-stamp + flock transpile guard, Playwright page harness with heartbeat stall watchdog,findChrome()ladder.run-node.mjs,run-browser.mjs,harness.mjs): sequential (loopback-I/O-bound corpus; sidesteps Chromium per-endpoint handshake serialization), suite-owned echod spawn, env-carried config.run.mjs,run-browser.mjs,harness.mjs): drivers are children of a Rust orchestrator — JSONL on stdout, role/run-id env contract,--selectprefix, same-origin reverse proxy for the browser mailbox.What is provably common: transpiled-module loading, import binding, envelope emission, per-case timeout handling, the browser page-driver skeleton (static server + import map + Chromium + watchdog). What varies: concurrency/instance policy, SUT host modules and their config, child-process vs in-process contract.
Decision deferred until (a) the shared-parts issue lands and shrinks the residue, and (b) a fourth consumer arrives (tls's jco leg, blocked on lann/jco#34 + lann/jco#35) to test any proposed seam against. Generalizing the driver from n=3 with live divergence risks an abstraction the next consumer immediately breaks.