# Why Retest

> See what Retest does differently, why, and what it does not do yet.

Source: https://rehearsal.dev/retest/why-retest

Retest does not wrap another automation library. It has its own runner, its own driver for each browser and its own reports. Because it owns each layer, it can say what happened at each one.

## Outcome unknown

A browser can be lost in the middle of an action. If it is lost before the input goes, the test ends `session_lost`. If it is lost after, Retest cannot know what the page did, so the test ends `outcome_unknown`.

Either way, the input is never sent again. A form that may have been submitted is not submitted twice.

## No force click

Retest has no option to click through a covered element. Before a click, it checks that the element is visible, stable, enabled and not covered. Then a guard in the page watches the click itself.

If the press lands on another element, Retest stops the event before the page hears it. The action fails and names the element that took it.

## Secrets stay outside the test

A test names a secret with `secret('password')`. The test's process never holds the value: Retest's own process types it into the field. The environment variable it came from is removed from the test's environment.

Every value is written as `{{password}}` in events, logs, results and reports. [Secrets and sign-in](https://rehearsal.dev/retest/essentials/secrets-and-sign-in.md) has the details.

## One session contract

Every driver answers the same contract. A command goes in, and the answer says what happened and how far the input got: not sent, sent or unknown. So the runner, the checks and the reports work the same way on every platform.

## Checks judged twice

The test's process asks Retest's process to look at the page, and Retest records every look. When a check on an element passes, Retest judges it again on the look it names. A test file cannot report a pass the page did not show.

## Versioned evidence

Each run writes `events.jsonl`, one event per line, and `result.json` at the end. Both follow schema version 1, and the package ships their JSON Schemas. Every event says which process reported it.

A run that stopped early has no `result.json`. Retest rebuilds its result from the events and marks it incomplete, so it never reads as a pass.

## Not built yet

- Android apps, Windows, and real phones and tablets.
- Locators inside shadow DOM and frames.
- Dialogs, popups, uploads and downloads.
- Network mocking and visual comparison.
- Retries, custom fixtures and watch mode.
- An MCP server for coding agents.

[Coming soon](https://rehearsal.dev/retest/coming-soon.md) lists what is planned, in order.
