## TL;DR

Screenshots of a lazy-loaded jobs dashboard are a terrible data source: content loads as you scroll, and parsers misread it. The agent should call the jobs list API, which returns every job as structured data, and reserve screenshots for human-facing visual checks.

## Error

```text
agent's screenshot parser failed on the dbt cloud dashboard's lazy-loaded jobs
```

## Steps

1. Abandon the screenshot approach for job data. Expected: no more parsing pixels for structured information.
2. Call the jobs list API for the account and project. Expected: complete, structured job records.
3. Page through the results with the defensive pagination pattern (checkpoints, backoff). Expected: every job captured.
4. Filter and analyze the job data programmatically. Expected: exact answers, no OCR errors.
5. Proceed with whatever the job data was needed for. Expected: the workflow continues on solid data.

## When to use

- An agent parses screenshots of dashboards for structured data.
- Lazy loading, infinite scroll, or dynamic content breaks the parse.

## When not to use

- The task is genuinely visual (checking a layout or a rendering bug).
- No API exists for the data (then screenshots are the fallback, handled carefully).

## Tool compatibility

- dbt Cloud API jobs endpoints.

## Variant phrasings

### Screenshot shows only the visible jobs

Lazy loading means the screenshot is always a partial view; the API is complete.

### OCR misreads job names or statuses

Structured data has no OCR step; the misreads disappear.

## Why it happens

Dashboards virtualize long lists for performance: only visible rows exist in the DOM. A screenshot captures the viewport, not the data, so parsers see a fraction of the jobs and misread even those.

## Edge cases

- API pagination still needs the defensive pattern (500s happen); do not trade one fragility for another.
- Permissions for the API may differ from dashboard access; check both.
- For human reports, a screenshot plus the API data is the complete package.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_br9eHuZu6reqT56scOmWvw
