Provenance and abstention
Where did this value come from?
Every field carries its origin: supplied by your file, derived from it by a deterministic rule, inferred by us, or abstained from with a reason. It is a question almost nothing else in this category can answer, and the answer is per field rather than per file.
The four origins a value can have
Every cell in an export is exactly one of these, and the audit CSV beside the file says which.
Supplied
The value came out of your file. It may have been reformatted — a unit parsed, a number normalised — and the original is still recorded next to it.
Derived
We computed it from values your file supplied, by a rule with no model in it — a handle slugged from a title, a unit converted. It is reproducible: the same input gives the same answer every time, which is exactly what separates it from the next card.
Inferred
We wrote it, from what the file supported and nothing else. It stays marked inferred through the review screen and into the export, so it is auditable after the fact and not only during.
Abstained
We could not resolve it, so it is blank, with the reason. A plausible guess in this position is worse than an empty cell, because an empty cell is visible and a plausible guess is not.
The rule is code, because the prompt was tried first
The instruction not to name a value the file never carried was in the system prompt, in as many words, quoting the exact case we wanted avoided. Measured across the whole corpus, 8.2% of answers named one anyway — 222 of 2,693 planned cells. Given a title and nothing else, 1/2 CTTW came back as “featuring 1/2 CTTW diamonds”. zero of them reached an output, because the check below refuses them.
A prompt instruction is not a control. It is a request, made to a system with no obligation to honour it, and its failure rate is invisible unless somebody counts. So the rule moved into code: a curated list of gemstones, metals, fibres, woods and origin claims, checked against what the file actually contained. An answer naming one the source did not supply is refused, and the field is abstained from with that word in its reason.
The list also names what it does not yet catch — measurements, capacities, compatibility claims. It is a floor. Publishing the floor is the honest part; a control whose coverage nobody has stated is a control nobody can rely on.
Measured on the acceptance run
- 19,885 rows
- Processed end to end, across the whole test corpus in one run.
- 0 of 142
- Model requests that broke their response contract. A response without the shape it promised is discarded, not parsed optimistically.
- Zero leaked
- Fabrications reaching an output, on an independent recount that re-derives the check from each row rather than trusting the runtime’s own tally.
- 2026-09-05
- When this was measured. A number without a date is a liability rather than evidence.
Abstention is a feature, and it costs us something
A tool that always produces an answer is easier to demonstrate and worse to rely on.
Across the corpus run, thousands of cells were written and hundreds were deliberately left blank. Every blank is a field a competitor’s demo would have filled, and every one of them is a field you would otherwise have had to catch yourself, in a storefront, after a customer read it.
We publish the searches that fail too. Looking for open catalogue data to widen the test corpus, we swept 546 sources, inspected 250 files, and found 0 usable. The well was wrong, not the filter. A method that only reports its successes is not a method.
How provenance survives into the export · This stage in the pipeline
See what it refuses to answer.
The free report will not enrich anything, but it will show you the same posture: what was checked, what was not, and why.
Check a file free