# 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:///.txt` returns 200 with the exact key as its entire body | | E2 | Submission | A test submission returns a success response | | E3 | Scoped | The ping fires on changed URLs only, not the full sitemap on every deploy | --- ## F. Entity consistency | # | Check | Pass condition | |---|---|---| | F1 | Record table | The report contains one row per external record with the value at each source | | F2 | Name identical | Byte-identical business name across every record and the entity graph | | F3 | Address identical | Byte-identical where published at all — abbreviation differences are mismatches | | F4 | Phone identical | Same number, and note the format used | | F5 | URL identical | Same canonical URL, same protocol, same trailing-slash convention | | F6 | Mismatches resolved | Every mismatch either fixed or listed as blocked with a reason | | F7 | No invented accounts | No record was created in a name the business does not use, and no home address was published | --- ## G. Page structure | # | Check | Pass condition | |---|---|---| | G1 | Single `

` | Exactly one per page | | G2 | Hierarchy | No skipped heading levels | | G3 | Answer-first | Each section's opening paragraph answers its own heading standalone, without the preceding paragraph | | G4 | FAQ valid | `FAQPage` markup parses and every question maps to a visible answer on the page | | G5 | FAQ true | Every answer is verifiable against a named source or the business's own confirmed facts | --- ## H. Compliance — hard stops **Any failure here is a stop-and-escalate, not a warning.** Do not publish. Do not mark the run complete. | # | Check | Pass condition | |---|---|---| | H1 | No outcome claims | No clinical outcome, efficacy, or case-result claim was generated | | H2 | No superiority claims | No "best", "leading", "#1", or comparative superiority claim was generated | | H3 | No testimonials | No review, testimonial, or third-party endorsement was written, drafted, or solicited — including examples | | H4 | Bylines approved | No content published under a named person's byline without that person's written approval, recorded with a date | | H5 | Escalations recorded | Every credential, legal or medical fact, price, and guarantee statement is listed with who approved it and when | | H6 | No fabrication | Every published fact traces to the site, a named source, or something the owner confirmed — nothing to a plausible guess | --- ## Output — the report Produce a dated markdown report. This is the deliverable the owner keeps. ``` # AI Visibility Foundation — verification report Site: example.com Spec: ai.md v1.0 Profile: profile-.md v1.0 Run by: Date: YYYY-MM-DD Vantage: anonymous, no session ## Summary Checks passed: NN Checks failed: NN Checks skipped: NN Hard stops: NONE | ## Results ## Unresolved ## Escalated for human approval ## What this report does not tell you This is a readability audit. It does not measure whether any AI engine names this business, and it makes no claim that it will. ``` **That last section is not boilerplate. Keep it.** A verification report that gets read as a visibility result is the single most likely way this document gets misused. --- ## What comes after this Everything above is checkable from the site itself. The question this report cannot answer is whether any engine actually names the business when a customer asks — that needs the questions asked, repeatedly, per engine, from a clean vantage, and logged. Our own measurement finds that any two engines agree on roughly **one business in eight**, so a single engine's answer is not a read on the others, and a single run is not a read on the engine. **`measure.md`, in this same directory, is the protocol for doing exactly that**, by hand and for free. It is the fourth step and the one this report deliberately does not attempt: build it, confirm it is readable, then find out whether it changed what an engine says. Run it once now and once in thirty days. Doing it repeatedly, logged, across six engines, every month is the part we sell. Doing it once yourself is free and you should. --- *Free and public, in full, because the file was never the valuable part. — https://nameworthy.ai/spec/*