Click a result for that run's artifacts (Playwright trace, video, screenshots, failure output). “—” = capability not on that target.
| scenario | {targets.map((t) => ({t} | ))}|
|---|---|---|
| {scenario} | {targets.map((target) => { const run = runFor(scenario, target); if (run) { return ({run.ok ? "✓ passed" : "✗ FAILED"} {run.durationMs != null && ( {(run.durationMs / 1000).toFixed(1)}s )} | ); } return ({skipFor(scenario, target) ? "—" : "·"} | ); })}
generated {new Date(manifest.generatedAt).toLocaleString()}
{result.target} · {(result.durationMs / 1000).toFixed(1)}s ·{" "} {new Date(result.endedAt).toLocaleString()}
{result.error &&{result.error}}
{available.length > 1 && (
No visual artifacts — this surface's source of truth is the test code and its assertions.
)} {/* The session tab carries its own timeline-aligned trace table; the flat list stays for runs viewed through any other lens. */} {active !== "session" && traces.length > 0 && ( <>Every API call the recording made, as a click→server→DB waterfall in the suite's motel store (runs/.motel). Links need a motel serving that store — the suite's own while it runs, or `bun run motel` afterwards.
| when | request | trace |
|---|---|---|
| {result.startedAt ? `${((trace.at - result.startedAt) / 1000).toFixed(1)}s` : new Date(trace.at).toLocaleTimeString()} | {trace.url.replace(/^https?:\/\/[^/]+/, "")} | {trace.id.slice(0, 8)}… |