Detect silent extraction drift, recover broken pipelines, and verify your web data before it reaches your decisions. Built for Scrape-Verse 2026 over four days, as a deliberately narrow product: it does not fetch pages, it does not manage proxies, and it does not claim to.
Bright Data already does self-healing selectors, and a submission that quietly implied otherwise would be claiming somebody else’s engineering. This sits above that: it catches the case where nothing broke — the selector still matches, and it is matching the wrong element.
A custom Scraper Studio collector, written for this project, that takes an extraction plan as input rather than knowing any site.
Everything that decides whether the result can be believed, and everything that keeps that decision auditable afterwards.
A real run of the custom collector, read out of the archive on this request. Everything left of the rule is what Bright Data returned. Everything right of it is a judgement made here, and none of it is available to a scraper looking at one page in isolation.
| Returned by the Bright Data collector | Derived here | |||||
|---|---|---|---|---|---|---|
| Field | Value | Selector | Matches | DOM path | Value | Extraction |
| availability | In stock (20 available) | .product_main .availability | 1 | article.product_page > div.row > div.col-sm-6 > p.instock | unverified | trusted |
| price | 50.1 GBP | .product_main .price_color | 1 | article.product_page > div.row > div.col-sm-6 > p.price_color | unverified | trusted |
| product_name | Soumission | .product_main h1 | 1 | article.product_page > div.row > div.col-sm-6 > h1 | unverified | trusted |
The two right-hand columns need a history to exist at all. That is the whole of the division: the collector answers what this page says right now, and nothing it returns can answer whether the answer moved.
A checklist of ticks proves nothing on its own. Each line names the file, the identifier or the command a reviewer can check, so a claim here can be verified rather than trusted.
Every one of them had to justify itself. There is no component library, no chart library, no icon set and no CSS framework in this interface — the figures, the glyphs and the type scale are drawn here, on one grid, at one stroke weight.
The whole pipeline runs offline. Fixtures, recorded cassettes and a JSON store mean a fresh clone can reproduce every screen in this product with no credentials and no network — and spend nothing doing it.
Listed at the same weight as everything above, because the entire product is an argument about not overstating what you know. A monitor that hides its blind spots is the failure mode it exists to catch, applied to itself.
It can tell you that the number changed provenance, and how confident it is about why. Knowing the correct value would require a second source of truth, which this does not have and does not pretend to.
Drift is a comparison, so a field with one observation has nothing to compare against and is reported as unverified. That is a real gap and it is drawn as one rather than as a pass.
Alternating markup reads as repeated drift. The archive grades that field volatile rather than proposing a repair, because a repair is not the answer to a page that will do it again next week.
Every screen re-derives its verdicts from stored rows on read, which is several store reads per run. That is correct at this scale and would not be at a million sources — stating it is more honest than pre-optimising a query pattern nobody has measured.
Every user-visible occurrence reads from one module, so a rename is a one-file change. It has not been decided, and pretending otherwise on this page would be the first dishonest thing on it.
Other systems tell you when a scraper broke. We tell you when your scraper is lying.Built for Scrape-Verse 2026.
The interface you have been reading is the same one an operator uses. There is no separate demo mode, no seeded screenshot and no number on any screen that was not derived from a stored observation at the moment the page rendered.