ASafarIMShowcase
03 /Case study

From a live test console to a deterministic benchmark

Three iterations of the same idea — the last one is the one you can trust in public.

Fixture data, not production. These pages render a committed, reproducible snapshot distilled from a real Playwright run of a seeded sample app. Nothing here is executed live, and no event on this page is a real user event. The runnable harness lives in benchmarks/testora.
01 /Evolution

Three iterations

StageStackCore ideaWhere it hit a wall
v1 — Test consoleTestCafe · .NET API · SignalR · Vite/ReactOne-click E2E runs against real apps with live results streamed over SignalR.Required a live backend and a running target; results were tied to a specific environment and hard to reproduce or publish safely.
v2 — Orchestrator rewriteNext.js · Drizzle · custom test-engineModel requirements → suites → fixtures → cases in a database; generate and run scenarios; render HTML/JSON reports.Strong data model and reporting, but still execution-centric and stateful — not something you can expose publicly without a runner.
v3 — Public benchmark (this)Playwright · offline sample app · committed fixtures · read-only demoInvert the problem: fix the system under test, seed known defects, and measure detection deterministically. Ship the evidence, not a runner.Deliberately cannot execute user code. Live/authenticated runs are out of scope for the public surface.
02 /Architecture

How the benchmark is built

System under test

A pure static app (benchmarks/testora/sample-app) with no network, storage, or timers. Every screen renders from the URL query alone, so a run is a pure function of its inputs.

Seeded ground truth

A catalog (fixtures/scenarios.mjs) declares each scenario's true kind — pass, seeded fail, or controlled flake — and the diagnosis a good suite should produce. It drives both the specs and the scoring.

Deterministic execution

Playwright runs single-worker with one retry. Seeded regressions fail on every attempt; the flake passes testInfo.retry as its attempt, so it fails first and passes on retry.

Evidence, distilled

A generator validates that live outcomes still match ground truth, then writes byte-stable fixture JSON. The public demo renders that snapshot; CI uploads the real traces as the citable source.

03 /Tradeoffs

What we gave up, and why

No live runner in public

The public surface cannot execute arbitrary code. That closes the door on "run it against your app" demos, but it's the only honest way to publish results without a sandboxed backend.

Distilled snapshot over raw logs

Committed fixtures are a reproducible distillation, not a dump of every millisecond. Raw millisecond jitter is intentionally excluded so regeneration is byte-stable — the trade is less "liveness" for trustworthy determinism.

04 /Lessons

Lessons from the legacy system

Reproducibility beats realism

The SignalR console felt impressive but its results couldn't be re-derived. Fixing the SUT and seeding defects made the benchmark something you can actually reason about.

Detection is the real metric

Counting green tests flatters a suite. Measuring how many known defects it catches, and whether it can tell a flake from a regression, is what maps to engineering value.

Claims need a citation

Any headline about reduced manual-testing effort is only stated where the supporting source can be cited — the runnable harness and CI in benchmarks/testora — never as an unbacked number. evidence-first