← All posts
Guide

A failure triage loop that takes minutes, not mornings

A red run is a question, not a verdict. The useful skill is turning that red into a short list of decisions and closing them fast. This guide walks the loop TestVibe is built for: read the run, isolate the real failures, re-run only those, and pick the right fix for each one.

Read the run before you read the tests

TestVibe reports status at two levels: the run status describes the whole run, and each test row status describes one scenario. Start at the top and work down. Open the run, note whether it Passed or Failed, then open the Features tab to see which rows produced that outcome.

A failed run does not mean everything is broken. A run can fail even when most tests pass — a single failing row flips the whole run to Failed. Treat that as a signal that at least one selected test or setup step needs attention, not as a reason to distrust the green rows.

The shape of the failures tells you where to look first:

PatternWhat it usually means
One failed rowStart with that test's details and evidence.
Several failures in one groupCheck the shared flow or data for that feature area.
Many rows fail at the same stepCheck login, environment state, or a common prerequisite.
Only one browser or configuration failsReview viewport or configuration-specific behavior.

That last column is the whole point of reading the run first: five failures that all die at login are one problem, not five. Fix the prerequisite before you touch any individual test.

Open one failed row and let the evidence talk

Pick a representative failed row and expand it. The failure panel is meant to be read top to bottom, and each layer answers a different question:

AreaWhat to look for
ErrorThe Playwright error text, assertion output, and failure source.
LocationThe spec file and configuration where the failure occurred.
Final screenshotThe browser state at the end of the failed scenario.
VideoThe session leading up to the failure.
Debug with AIOpens the full Playwright trace with an assistant docked beside it that diagnoses the failure automatically.

Most failures resolve at the screenshot. If the shot shows the wrong page, you have a navigation, login, or environment problem. If it shows the expected page but the assertion still failed, the expectation is likely too strict or out of date. When the panel does not explain it, open the trace: the action-by-action timeline, DOM snapshots, console errors, and network requests are where "the app was just slow" separates from "the selector no longer exists."

The read here maps cleanly onto a decision:

SignalLikely causeFix
Screenshot shows the wrong pageNavigation, login, or environment setupFix the environment or credentials, then re-run
Expected page, assertion failedTest expectation is staleRegenerate or edit the test
Missing selector or timeoutThe UI changed, or the app was slowRegenerate if the UI moved; re-run if it was flaky
Error before the test reaches the appSession setup, dependencies, or secretsFix setup, then re-run

Re-run just the failures

Once you know which rows are worth retrying, you do not re-run the whole suite. From Runs, select the failed run and choose Re-run. The run composer opens pre-scoped to that run — the same tests are pre-checked and the same Playwright configurations are pre-selected — and from there you narrow to only the failed tests.

The Re-run composer, pre-scoped to the previous run with its features, environment, and configuration carried forward
The Re-run composer, pre-scoped to the previous run with its features, environment, and configuration carried forward

Choosing Re-run does not start anything on its own. The new run is only dispatched when you choose Start Run, so it is safe to open the composer just to review what a run covered and trim the selection. Uncheck the groups that passed, keep the rows that failed, and start.

Here is what carries forward, and what to double-check before starting:

ItemPre-filled fromCheck
Test selectionThe run's tests, pre-checkedNarrow to just the failed rows
Site URLThe previous run's target, reusedTo hit a different environment, use New Run instead
ConfigurationThe run's Playwright configsConfirm browser and viewport
SecretsRead from Settings → Variables & Secrets at run timeRefresh credentials if the failure was auth-related

Two details matter for scoped re-runs. First, a re-run creates a new attempt; the original run stays in history, so you can compare before and after directly rather than losing the evidence you just read. Second, if the original failure looked like an overloaded test site — timeouts under parallel load rather than real bugs — set Execution to Sequential or a small Custom cap so the retry does not reproduce the same contention.

Re-run, regenerate, or fix the app

Every triaged failure lands in one of three buckets. Naming the bucket is the decision.

Re-run when the failure was not about the test being wrong: a flaky timeout, a slow-loading resource, a service that was briefly down, or credentials you have since refreshed. Nothing to change — retry the same test and see if it holds.

Regenerate when the test itself is out of date. If the screenshot shows the expected page but the assertion failed, or the error is a missing selector because the UI genuinely moved, the scenario needs to catch up to the product. Because a feature is described in natural language and the Playwright code is generated from it, regenerating updates the expectations to the current app — and the new code is verified by actually running it before you trust the result.

Fix the app when the test is right and the app is wrong. The screenshot shows a broken page, a 500, a missing element that should be there — that is a bug your suite just caught. Fix the application, then re-run the failed scope to confirm the red turns green.

The loop is deliberately small: read the run, open one row, scope a re-run to the failures, pick a bucket. A morning of scrolling logs becomes a few minutes of targeted decisions. Get early access to run it against your own app, or read Inspect failed steps for the full triage reference.

Early access

Ready for tests that write themselves?