Run all stored test cases for a product against the current product+brick configuration and return per-test-case results without persisting anything. This is the in-memory product-testing framework — its lifecycle is "compute, return, discard".
Logs scope (important). Test-case runs are ephemeral and in-process — they do NOT write to the persistent execution-log streams that back GET /products/{productId}/execution-logs and GET /products/{productId}/execution-log-streams. Every diagnostic for a test-case run lives inline in the response at testCaseResults[].logs[] ({timestamp, level, message} entries captured from the brick's console.* output) and, on failure, in testCaseResults[].errorMessage. The /execution-logs and /execution-log-streams endpoints are populated only by POST /products/{productId}/execute and POST /product-bricks/{brickId}/execute. There is no test-case-run equivalent because frozen-time logs cannot be safely interleaved into wall-clock log streams.
Brick-crash diagnosis. When a brick throws at runtime during a test-case run, the corresponding testCaseResults[].status === "error", errorMessage carries the unwrapped throw text, and logs[] ends with an error-level entry mirroring it — so a single read of logs[] is sufficient to diagnose the failure.
Structured error envelope (errorDetails[]). When the failure has per-field detail (typically a stored draftSnapshot.transport that does not validate against the TransportForProducts shape), the result also exposes testCaseResults[].errorDetails: { path: string[]; message: string }[] — one entry per validation issue. Prefer this over substring-searching errorMessage / logs[].message when reasoning about which field of the snapshot to patch. Mirrors the BRICK_PAYLOAD_INVALID envelope on POST /product-bricks.
Scope. Authorization, draft snapshots, and shape resolution all happen server-side per stored test case; no body is required.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
401unauthorized
503Transient backend error returned with no body. Retry with exponential backoff (suggested: 1s, 2s, 5s); the request is idempotent and safe to retry. Do not treat as a payload error.
