Reference
The six checks
Every check, its pass/warn/fail semantics, its weight, and the scoring model.
run(url) executes six checks (lib.js#L97-L113). Each check
returns a status (pass, warn, or fail), a detail string, and a concrete fix
when it does not pass.
| # | Check | Weight | Pass | Fail |
|---|---|---|---|---|
| 1 | AI crawler access | 35 | No tracked AI crawler is blocked by robots.txt | Every tracked crawler is blocked |
| 2 | Structured data (JSON-LD) | 22 | At least one parseable JSON-LD block with a type | None found |
| 3 | Title and meta description | 15 | Title 15-65 chars and description 70-165 chars | Both missing |
| 4 | Open Graph tags | 8 | 3 or more og: tags | None |
| 5 | XML sitemap | 15 | /sitemap.xml exists (or is declared in robots.txt) | None found |
| 6 | llms.txt | 5 | /llms.txt exists and is non-empty | Warn only: absence never fails a site |
Notes on semantics, straight from the source:
- Check 1 blocks only on a group-level
Disallow: /(or/*) that applies to the crawler and is not offset by a rootAllow(lib.js#L47-L64). Partial-path disallows do not count as blocking. - Check 2 distinguishes parseable JSON-LD from unparseable blocks: unparseable
JSON-LD downgrades to
warn, notfail(lib.js#L103-L105). - Check 6 is deliberately gentle: the detail text notes there is no proven citation effect, so a missing llms.txt is hygiene, not a ranking problem (lib.js#L113).
Scoring and grades
Statuses map to points (pass 1, warn 0.5, fail 0) and are combined with the
weights above (lib.js#L115-L118):
- score = round(100 x sum(weight x points) / sum(weights))
- Grades: A at 90+, B at 75+, C at 60+, D at 40+, F below 40
