> ## Documentation Index
> Fetch the complete documentation index at: https://docs.merchantops.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Quality review

> Advisory checks that inspect enriched copy and record findings you can review before publishing.

Quality review reads the copy [enrichment](/enrichment/how-it-works) produced and
records **findings** — named, self-explanatory notes about what looks wrong.
The checks are advisory: they never block publishing and never change your data.
They only report. You need settings permission to view the page and write
permission to change it.

There is deliberately no 0–100 quality score. A number can't tell you what is
wrong with a description; the findings can, and the count of them is what sorts
the worst products to the top.

## Turn it on

**Settings → Quality Review** has a master switch, **Run quality checks**, off by
default. While it is off nothing in your organization is scored, whatever the
individual checks say. Turn it on and every enrichment run is scored when it
finishes.

Scoring is separate from enrichment. You can change anything on this page and
re-score an existing run from its job page to compare — without re-enriching the
products.

## The checks

Six checks, each with its own switch, severity, and per-property exclusions.

| Check                  | What it looks for                                                                              | On by default |
| ---------------------- | ---------------------------------------------------------------------------------------------- | ------------- |
| Near-duplicate copy    | Copy that closely matches another product's in the same run                                    | Yes           |
| Length outlier         | Copy far shorter or longer than the median for the run                                         | Yes           |
| Banned phrase matching | Any of your banned phrases appearing in generated copy                                         | Yes           |
| Field contradiction    | A spec-sheet bullet whose value disagrees with the catalog field the prompt says it comes from | Yes           |
| Prompt rule adherence  | Gendered language that contradicts the product                                                 | No            |
| Fabrication risk       | Specs, technologies, materials, or measurements the product's source data doesn't support      | No            |

A few details worth knowing before you rely on one:

* **Near-duplicate** strips your boilerplate patterns before comparing, so your
  own standard sentences don't register as duplicates.
* **Length outlier** needs at least five scored products for the run's median to
  mean anything.
* **Banned phrase matching** is exact string matching, not a model call. It can
  never invent a phrase you didn't configure.
* **Field contradiction** is a deterministic string comparison. It only checks
  bullets whose own prompt instruction asks for the value exactly; the wiring
  report lists the ones it skips.
* **Prompt rule adherence** only runs when the product declares a gender.

### Billable checks

**Prompt rule adherence** and **Fabrication risk** ask a model, so each adds a
model call for every generated property on every scored product. That's why they
are off by default and badged **Billable LLM call** in the app. The model is
chosen for you and is a cheap one by design.

Re-scoring a run doesn't re-enrich it, but it does re-run whatever checks are
enabled — including the billable ones.

### Severity and exclusions

<ResponseField name="Severity">
  **Warn** counts as a defect worth review. **Info** is recorded but reads as a
  note rather than a problem. Use Info to keep a check running while you decide
  whether to trust it.
</ResponseField>

<ResponseField name="Skip properties">
  Comma-separated property keys the check must not run for. Matched exactly and
  case-sensitively, so spell the key the way the property does. Leave it empty
  to check every scored property.
</ResponseField>

A check you have never saved shows a **Default** badge — it has no stored setting
and is following the built-in behavior shown. Saving pins the values you see.

## Your house copy

Two lists describe your own writing, so the checks judge the generated copy
rather than your standards.

<ResponseField name="Boilerplate patterns">
  Sentences your copy repeats on purpose. They're stripped out before the
  near-duplicate check compares two products — without that, a standard line you
  add to every description makes every product look like a duplicate of every
  other. One pattern per line; `*` matches any run of text, so one pattern can
  cover the same sentence with different product names in it.
</ResponseField>

<ResponseField name="Banned phrases">
  Wording that must not appear in generated copy. One phrase per line.
</ResponseField>

<Note>
  Each list is read by exactly one check. Boilerplate patterns do nothing while
  near-duplicate copy is off, and banned phrases do nothing while banned phrase
  matching is off. The page warns you when that happens.
</Note>

## Where findings show up

<ResponseField name="Job detail">
  The run's own findings, worst products first, with counts for how many were
  scored, how many have findings, how many hit a check error, and how many
  couldn't be judged. The list itself is capped on large runs, but the counts
  always cover the whole run. This is also where you **re-score** a run after
  changing settings.
</ResponseField>

<ResponseField name="Products list">
  A **Quality** column per product: a dash for never scored, **Clean** for scored
  with nothing found, and a count of findings otherwise. Never-scored and clean
  read differently on purpose. You can filter the list down to products that have
  findings.
</ResponseField>

<ResponseField name="Catalog batch">
  The same findings summary for the batch's most recent enrichment run, on the
  batch page — so you can look at quality before approving. The batch header's
  **Enrich N Products** button starts that run, and re-scoring is available from
  the summary.
</ResponseField>

A check that couldn't run is recorded as an error, never as a pass. A check that
had no evidence to judge — typically a product enriched before the generator
started recording what it showed the model — is reported separately and doesn't
count toward the finding total.

## Enrichment wiring report

The same page carries an **Enrichment wiring report**, which audits your
enrichment *configuration* rather than any run: per category and property, which
declared context fields are actually populated and at what rate, which spec-sheet
bullets bind to an empty or ambiguous field, and which placeholders a prompt
references but never declares. It is computed against your current catalog and
config, not against a job, and you generate it on demand. Use it when findings
point at a configuration problem rather than a copy problem.

## Related

<CardGroup cols={2}>
  <Card title="How enrichment works" icon="wand-magic-sparkles" href="/enrichment/how-it-works">
    What produces the copy these checks read.
  </Card>

  <Card title="Content settings" icon="sliders" href="/settings/content-settings">
    Tone, brand guidelines, and the grounding thresholds behind generation.
  </Card>

  <Card title="Reviewing enriched products" icon="clipboard-check" href="/enrichment/reviewing-results">
    Enrichment status and completeness alongside quality findings.
  </Card>

  <Card title="Jobs" icon="list-check" href="/jobs/overview">
    Where a run's findings and the re-score action live.
  </Card>
</CardGroup>
