# Lint codes

Every finding `POST /programs/lint` can report.

`E…` codes block publishing a version; `W…` codes are advisory and show as warnings. `POST /programs/lint`, `kaab programs lint` and the builder report the same findings, each with the JSON path of the key it is about.

| Code | Severity | Rule |
|---|---|---|
| [E001](https://docs.kaab.ist/reference/dsl/lint/e001) | error | unknown key or wrong type |
| [E002](https://docs.kaab.ist/reference/dsl/lint/e002) | error | `loop_until`/`scroll.until`/`paginate` without `max`/`max_pages` |
| [E003](https://docs.kaab.ist/reference/dsl/lint/e003) | error | `evaluate` without `timeout_ms` or `max_result_bytes` within limits |
| [E004](https://docs.kaab.ist/reference/dsl/lint/e004) | error | target/field has no locator key |
| [E005](https://docs.kaab.ist/reference/dsl/lint/e005) | error | more than one locator key without `candidates` |
| [E006](https://docs.kaab.ist/reference/dsl/lint/e006) | error | duplicate step `id` |
| [E007](https://docs.kaab.ist/reference/dsl/lint/e007) | error | template references unknown `inputs`/`vars` |
| [E008](https://docs.kaab.ist/reference/dsl/lint/e008) | error | invalid field name or reserved `$` key |
| [E009](https://docs.kaab.ist/reference/dsl/lint/e009) | error | invalid regex / glob / JSONPath |
| [E010](https://docs.kaab.ist/reference/dsl/lint/e010) | error | `paginate` extract has no `many:true` field |
| [E011](https://docs.kaab.ist/reference/dsl/lint/e011) | error | `side_effect` step with `retry` or `optional` |
| [E012](https://docs.kaab.ist/reference/dsl/lint/e012) | error | nesting depth > 3, > 200 steps, > 256 KB, > 500 extract fields or nested deeper than 32 |
| [E013](https://docs.kaab.ist/reference/dsl/lint/e013) | error | secret input used in `extract` or rendered into a URL |
| [E014](https://docs.kaab.ist/reference/dsl/lint/e014) | error | `download.name` or `read_pdf.artifact` renders to no usable artifact name |
| [W001](https://docs.kaab.ist/reference/dsl/lint/w001) | warning | `goto`/`click` without `expect` |
| [W002](https://docs.kaab.ist/reference/dsl/lint/w002) | warning | locator list contains only structural/positional candidates (rank ≤ 20) |
| [W003](https://docs.kaab.ist/reference/dsl/lint/w003) | warning | `sleep` used |
| [W004](https://docs.kaab.ist/reference/dsl/lint/w004) | warning | `side_effect` step not followed by a `checkpoint` before the next side effect |
| [W005](https://docs.kaab.ist/reference/dsl/lint/w005) | warning | `type: number\|money` without `locale`/`decimal` and sample contains both `.` and `,` |
| [W006](https://docs.kaab.ist/reference/dsl/lint/w006) | warning | `evaluate` present (healing-opaque) |
| [W007](https://docs.kaab.ist/reference/dsl/lint/w007) | warning | `await_input` with `collect: hosted` but no `hosted.notify` |
| [W008](https://docs.kaab.ist/reference/dsl/lint/w008) | warning | `{{vars.x}}` read after a block that sets `x` on one branch only |
| [W009](https://docs.kaab.ist/reference/dsl/lint/w009) | warning | top-level `extract` alongside an `extract` step that writes `data` (nested ones included) |
| [W010](https://docs.kaab.ist/reference/dsl/lint/w010) | warning | `read_pdf` with no earlier `goto` or `download` that could produce a PDF |
