reticle doctor collapses the setup failure modes into one command. It is the first thing to run when something is wrong.
Flags
What it prints
Human-readable lines on stdout, not the JSON log. Real capture:sessions line fails and the daemon’s own diagnosis is appended under the checklist. Real capture, against a daemon on a scratch port that no app had dialled, with the diagnosis wrapped for width and trimmed at the ellipsis:
The chromium line
Playwright pins one Chromium revision per version, and the daemon launches that one and no other. So the check is not “is a Chromium there” but “is this revision there”, and the three answers have three different fixes. All three captures below are real, taken by pointingPLAYWRIGHT_BROWSERS_PATH at a full root, a stale root, and an empty one.
✓ installed means the wanted revision is on disk. Nothing to do.
✗ wrong revision means builds are installed and none of them is the wanted one. One pinned download away. The line names the revision Playwright wants, then every revision the root actually holds, then the exact command:
✗ missing means the browsers root holds no Chromium at all. It prints the full executable path it looked for, so you can see which root it searched. If that is not where your browsers live, PLAYWRIGHT_BROWSERS_PATH is what moves it:
.... The revision number and the pinned Playwright version come from the build you are running, so yours may differ from these; use the ones your own doctor prints.
The wanted revision and the root are both read back off the path Playwright itself resolves, so PLAYWRIGHT_BROWSERS_PATH and every platform default (including %LOCALAPPDATA%\ms-playwright on Windows) are honoured without this command keeping its own table of roots.
Exit codes
Always0. doctor reports; it does not gate.
Worked example
Deeper debugging
Reading the daemon log, and what
RETICLE_TRACE=1 adds to it.