Skip to content

Error Classification

Every captured failure gets an ErrorClassification — a label that tells the fixer which fix strategy to apply and tells you, at a glance, what kind of break happened.

Classifications

ClassificationCategoryMeaning
SELECTOR_NOT_FOUNDactionSelector missing or changed — the classic “site redesigned” break
SELECTOR_TIMEOUTactionElement exists but the action timed out
NAVIGATION_FAILEDnetworkPage navigation failed
NETWORK_TIMEOUTnetworkRequest or response timed out
NETWORK_ERRORnetworkDNS, SSL, or connection failure
CREDENTIALS_INVALIDdataLogin failed, auth rejected
DATA_VALIDATIONdataUnexpected data shape or value
BROWSER_CRASHcrashBrowser process died
BROWSER_CLOSEDcrashThe page or browser was intentionally closed, often by an app-level error handler
PERMISSION_DENIEDcrashClipboard, file access, or similar permission failure
RUNTIME_ERRORprogrammaticTypeError, ReferenceError — a bug in the script itself
UNKNOWNNothing matched

How classification works

Classification is two-tier:

  1. Observer state first. The PageObserver knows things the error message doesn’t — whether the network was failing, whether the browser process died, what the last successful action was. If the observer’s state explains the failure, that wins.
  2. Message heuristics second. Otherwise, the error message and type are matched against known Playwright failure patterns.

Why it matters

  • Fix guidance. Each classification maps to specific instructions in the fixing agent’s prompt — a SELECTOR_NOT_FOUND sends the agent hunting through the captured DOM for the replacement element; a CREDENTIALS_INVALID tells it a code change probably won’t help, so it should triage instead.
  • Deduplication. The classification is part of the error hash. See Fix Lifecycle.
  • Triage at a glance. The dashboard and Slack messages lead with the classification, so you know whether a failure is fixable-by-code before reading anything else.