---
name: pdp-answer-audit
description: Audits one public product page for whether an AI answer engine can identify it, price it, and recommend it, producing a buyer-question coverage report with the exact missing facts and source lines. Use when the user gives a product page URL and asks about AI search visibility, GEO, answer-engine readiness, or why a product does not appear in AI shopping answers.
---

# PDP answer audit

Audits ONE product page. Never crawls.

## Input

A product page URL, given in the prompt or in a file the prompt names.
If no URL is present, ask for one and stop.

## Steps

1. Fetch the given URL once. Save the raw HTML to `demo/output/raw/<slug>.html`.
   Do not follow links. Do not fetch a second page. Record the retrieval timestamp.
2. Run `python3 .agents/skills/pdp-answer-audit/scripts/parse.py <saved-html>`.
   It reads a local file only and needs no network and no packages.
3. Confirm this is a product page: a `Product` JSON-LD object, or a single price
   plus a purchase control. If neither, report
   "insufficient evidence: not a product page" and stop. Do not score it.
4. If the page yields fewer than 200 visible words, report
   "insufficient evidence: <N> words received" and stop. Do not score it.
5. Run the six checks against the parser output and the saved HTML only:
   - **Identity** — brand, model, GTIN, MPN, SKU. Without these no machine can
     match this product to anything else on the web.
   - **Schema completeness** — price, priceCurrency, availability, brand,
     rating, shipping, returns present in `Product` JSON-LD.
   - **Price triangulation** — schema price vs prices in the rendered text.
     Absent, or disagreeing, means an AI states a price at random.
   - **Crawler vision** — are price and specifications in the raw HTML, or only
     after JavaScript runs.
   - **Buyer question coverage** — of these twelve, how many can the page answer:
     fits-what, size, material, delivery time, return window, stock, what's in
     the box, needs-anything-else, warranty, compatibility, weight, power.
   - **Problem-language coverage** — does the page state any symptom, situation
     or use case, or only what the object is.
6. If a demand corpus exists at `demo/input/corpus/<category>.csv`, add section 7:
   the phrases buyers use, and whether each appears on the page. Label it
   "snapshot, retrieved <date>". If no corpus, print
   "section 7 skipped: no demand corpus supplied" and continue.
7. Print the headline numbers first. Then write the findings as JSON and render
   the branded report:
   `python3 .agents/skills/pdp-answer-audit/scripts/render.py <findings.json> demo/output/<slug>-audit.html`
   The renderer is stdlib-only and embeds the logo as a data URI, so the file is
   self-contained. It carries print styles: the reader gets a PDF with Cmd-P.
   Also write the same findings to `demo/output/<slug>-audit.md`. Every claim
   carries a source line, and the "not verified" section is always filled.

## Rules

- Report only what is in the fetched HTML. If you know this product or shop from
  training, do not use that knowledge. State only what the page shows.
- Never describe the saved HTML or a corpus as live. Every section carries its own
  retrieval timestamp.
- Never rewrite, publish, or push changes to the audited site. Recommendations only.
- Never fetch a second URL, including linked shipping, returns, or review pages.
  Their absence from the product page is itself a finding.
- Report a missing fact as missing. Never infer a plausible value.

## Done when

`demo/output/<slug>-audit.md` exists, both headline scores are printed, every
claim carries a source line, and the "not verified" section is filled or
explicitly empty.
