# Ledlenser - Autopilot AgentSite bundle

Generated **2026-08-03** · spec `agentsite/1.25` · locale `en-US` · marketplace `amazon.com` (US)

## Contents

| File | Purpose |
| --- | --- |
| `manifest.json` | Build metadata, counts, locale and marketplace coverage |
| `catalog.json` | Every published product with paths to its JSON and Markdown documents |
| `index.json` | Products grouped by category, plus an ASIN → path lookup |
| `coverage.json` | Full enrolled-vs-published accounting with per-ASIN withholding reasons |
| `validation-report.json` | The quality gate this build passed, check by check |
| `llms.txt` | Agent-facing entry point |
| `en-US/products/` | 59 products, each as `<ASIN>.json` + `<ASIN>.md` |

## Numbers

- **89** ASINs enrolled in Autopilot for this brand
- **84** enriched (the 8 not fetched are confirmed discontinued)
- **59** published here
- **52** of those carry the full four layers (listing + facts + USPs + keywords)
- **30** withheld, every one itemised with a reason in `coverage.json`

## Reading a product document

Each product carries four layers:

1. **Listing** — title, highlights, bullet points, description, attributes, images.
2. **Facts** — discrete claims extracted from the merchant's own copy, each with a confidence
   level and a pointer to the field that supports it.
3. **USPs** — ranked buyer-value propositions, each tied back to a supporting fact.
4. **Keywords** — the search terms shoppers use, with rank and volume where available.

## Three things importers should know

**Offers are not in this bundle.** No price, availability, Prime status or delivery estimate.
The `pending_offers_feed` block in every product forward-declares the expected field names so
offers can be bound later without a schema migration. Nothing here should be rendered as a
price.

**No review-derived content, anywhere.** Verbatim review text, review-derived themes, and
review sentiment are all excluded by policy. The source API does return review evidence inside
its facts and USPs payloads; that was stripped at ingest and never written to disk. See
`tier_policy` in any product document.

**Withholding is explicit, never silent.** 30 enrolled ASINs are not published.
`coverage.json` names every one and which gate stopped it:

| Gate | Count | Meaning |
| --- | --- | --- |
| Discontinued | 8 | SKU absent from the live brand storefront catalogue |
| Completeness floor | 16 | Listing copy present but no facts and no USPs |
| Empty variation container | 6 | Variation parent with no real bullet content; its children publish instead |

Within the completeness floor, `withhold_basis` distinguishes **brand-confirmed inactive**
(nine ASINs the brand confirmed are not active on Amazon) from **enrichment pending** — recent
listings whose enrichment simply has not been generated yet. The latter are re-fetch
candidates, not dead products.

## Data quality notes

Where the source data was wrong, this build corrected or dropped rather than passing it
through. Individual products may carry:

- `dropped_facts` — claims whose cited evidence does not exist in the listing (for example a
  "batteries included" claim citing a description that says no such thing). Dropped rather
  than published.
- `source_data_notes` — recorded upstream defects: a browse-node miscategorisation, a
  `parent_id` that is a label rather than an ASIN, a parent listing covering two different
  models, model-name disagreements between title and attributes.
- `data_gaps` — every empty layer is declared with the specific reason, and the reasons are
  distinguished from each other (parent-ASIN keyword banks live on children; an empty bank;
  a bank that has not been ingested yet).
