# Linter rules

> For the complete documentation index, see [llms.txt](/llms.txt)

The linter keeps scenarios robust — stable selectors, no silent waits. Override any rule under `linter.rules` in your config (`"off" | "warn" | "error"`).

| Rule | Default | Purpose |
| --- | --- | --- |
| `lint:deep-css` | `warn` | Reject deep / brittle CSS selectors. Prefer role/label/testid. |
| `lint:xpath` | `warn` | Reject XPath selectors. |
| `lint:obfuscated-class` | `warn` | Reject hashed class names (Tailwind JIT, CSS Modules). |
| `lint:pause-explicit` | `warn` | Discourage pause(ms) without a `// reason:` comment. |
| `lint:disambig-by-index` | `off` | Flag index-only refinement (.nth) as fragile (info). |
| `lint:evaluate-discouraged` | `warn` | Discourage bare evaluate() — prefer typed helpers. |
| `lint:scenario-in-root` | `error` | Scenarios must live in a feature subfolder, not the e2e root. |
| `lint:mustache-in-dsl` | `error` | No `{{VAR}}` string literals — reference bare identifiers. |
| `validator:unknown-function` | `error` | Unknown DSL function (typo, unsupported call). |
| `validator:dsl` | `error` | Shape / argument / unsupported-syntax violations. |
