# verify.md — the self-check **Version 1.0 · 2026-08-27 · Nameworthy (Whitley Row LLC) · https://nameworthy.ai/spec/** Run this after executing `ai.md`. It is what turns the work from advice into a deliverable: a dated artifact the owner keeps, and a baseline any honest measurement program can be checked against later. **Rules for running it:** - **Check the artifact, not your intent.** Fetch the live URL. Parse the real file. Do not mark a check passed because you performed the task that should have produced it — verify the thing that exists. - **Fetch anonymously.** No logged-in session, no cached copy, no local file read standing in for an HTTP request. What matters is what an arriving crawler gets, not what you can see. - **A skipped check is `SKIP`, never `PASS`.** Report why. - **One failure does not stop the run.** Complete every check, then report. --- ## A. Entity graph | # | Check | Pass condition | |---|---|---| | A1 | JSON-LD present | Every canonical page emits at least one `application/ld+json` block in `
` | | A2 | Valid JSON | Every block parses; no trailing commas, no unescaped control characters | | A3 | `@id` resolves | Every `@id` referenced by another node corresponds to a node that exists in the graph | | A4 | No orphan nodes | Every node is reachable from the organization node, or is deliberately standalone and noted | | A5 | `sameAs` live | **Fetch every `sameAs` URL.** Each returns 200 and the response contains real content about this business | | A6 | `sameAs` not placeholder | No `sameAs` resolves to a parking page, "coming soon" stub, domain-for-sale page, or generic platform landing page | | A7 | Types match vertical | Every type used appears in the vertical profile; none invented | | A8 | No fabricated ratings | No `aggregateRating` or `review` unless sourced from a verifiable third-party record | | A9 | Address honest | `postalAddress` is present only if it is a real premises the public may visit; absent otherwise | | A10 | No `TK` shipped | Zero unresolved placeholders in published markup | **A5 and A6 are the two most commonly failed checks in this section.** A `sameAs` that returns 200 can still be a parking page. Read the response body. --- ## B. Agent-facing files | # | Check | Pass condition | |---|---|---| | B1 | `/ai.txt` | Returns 200, `Content-Type` is `text/plain`, body is non-empty | | B2 | `/agents.md` | Returns 200, body is non-empty | | B3 | Internal URLs | Every URL inside both files returns 200 | | B4 | No contradiction | No claim in either file contradicts the entity graph or the site's own pages | --- ## C. Crawler access | # | Check | Pass condition | |---|---|---| | C1 | `robots.txt` reachable | Returns 200 as `text/plain` | | C2 | Decisions recorded | Every agent in `ai.md` §4 has an explicit allow or disallow with a recorded reason | | C3 | No unexplained `Disallow` | Every `Disallow` line is one the operator can explain | | C4 | Sitemap referenced | A `Sitemap:` line points at a URL returning 200 | | C5 | Retrieval vs training stated | The report distinguishes which agents were blocked for training and which for retrieval — they are different decisions | | C6 | `Google-Extended` explicit | Recorded separately from `Googlebot`, not conflated | | C7 | **Real fetch test** | Request the homepage with each allowed agent's user-agent string. Record the status code returned for each | **C7 exists because `robots.txt` states a policy and the server enforces a different one.** A WAF, a bot-management rule, or a CDN setting can return 403 to a crawler the site's own `robots.txt` welcomes. Only a real request finds that. **When you run C7, vary the user agent and record each result separately.** Do not generalise from one client. A host that refuses your default agent may serve a declared crawler perfectly well, and a host that serves you may refuse the one that matters. One probe, one claim. --- ## D. Sitemap | # | Check | Pass condition | |---|---|---| | D1 | Parses | Valid XML against the sitemap schema | | D2 | URLs live | Every URL returns 200 | | D3 | Canonical | No URL is a redirect, an alias, or a `noindex` page | | D4 | Coverage | Every indexable page appears; no orphans | | D5 | `lastmod` sane | None in the future; none defaulted to today across the whole file | | D6 | `lastmod` real | Dates vary across pages unless the pages genuinely changed together | --- ## E. IndexNow | # | Check | Pass condition | |---|---|---| | E1 | Key file | `https://