For tool builders and researchers
The Lab
One deceptive pattern per page. Isolated, repeatable, and labelled where a tool cannot peek.
The storefront mixes many tricks on one screen, the way real sites do. That is good for people and bad for measurement. The Lab takes the tricks apart: 8 specimens that each show one pattern, and 3 controls that show none.
Every Lab page is plain HTML in the page itself. No frames, no shadow DOM, no text drawn on a canvas. What a person can see, a tool can read.
Specimens
Each page opens as Deon ships it: deceptive. Add ?twin=fair to the address to get the honest twin of the same page.
| Specimen | Pattern | Expected findings | Fair twin |
|---|---|---|---|
| 01 Boxes ticked in advance | preselection |
4 | The same boxes, empty. Near-misses on both versions: an unchecked add-on (#s2) and a harmless checked default (#s4). Open fair twin |
| 02 Declines that shame | confirmshaming |
3 | Every decline says “No thanks”, the same size and style as the yes. Near-miss: a plain “Not now” (#s3). Open fair twin |
| 03 A countdown that restarts on reload | fake-countdown |
1 | No countdown. The price is the price. Open fair twin |
| 04 A countdown that starts over | fake-countdown |
1 | No countdown. The price does not depend on how long you take. Open fair twin |
| 05 Stock and crowd claims | fake-scarcity |
3 | “In stock”, and nothing about other shoppers. Near-miss on both versions: “30-day returns” (#s4), a number that is a plain fact. Open fair twin |
| 06 Renewal terms in small or pale text | buried-terms |
2 | The same terms at 17 pixels and full contrast, above the button. Open fair twin |
| 07 Consent with a lopsided choice | lopsided-consent |
1 | Reject all and Accept all as two buttons of the same size and style. Open fair twin |
| 08 Consent with no way to refuse | no-reject |
1 | Reject all, Accept all and Choose on the first screen, as equal buttons. Open fair twin |
Controls
Honest pages that look suspicious. A good detector reports nothing on them. A detector that only matches words will trip on every one.
| Control | Expected findings | Why it is honest |
|---|---|---|
| C1 An honest product page | 0 | An empty newsletter box, a harmless checked default, a plain “No thanks”, “In stock”, renewal terms at 17 pixels and full contrast, and opening hours that look like a timer and never tick. |
| C2 An honest consent dialog | 0 | Reject all and Accept all are the same size and style, on the first screen. |
| C3 A real deadline | 0 | The countdown runs to midnight UTC. Reload and it has moved on by exactly the time that passed. |
Ground truth
The answers are in one file: /lab/manifest.json. For each specimen it lists the pattern, the page, the deceptive elements as #id selectors, how many findings to expect, and what the fair twin changes. For each control it says why the page is honest.
The answers are not in the pages. Deceptive elements carry neutral ids such as s1, and no class, id or data attribute on a Lab page names a pattern. The build fails if one does. A tool has to work it out the way a person would.
“Expected findings” is the number of deceptive elements on the page as Deon ships it. Some pages also hold honest near-misses, such as an add-on box that starts empty. Reporting one of those is a false alarm.
What you can rely on
- Stable addresses and ids. A specimen keeps its address and its element ids. New ones are added; old ones are not renumbered.
- The same page every time. Lab pages ignore the Fair mode switch you may have set elsewhere on the site. Only the address decides which twin you get.
- Repeatable “random” numbers. Stock and viewer counts come from a seeded generator, so the sequence is the same on every visit.
- Real time. Countdowns read the clock. A second is a second, also in a background tab.
- No side effects. Lab pages write nothing to the Receipt and store nothing.
- No requests. Nothing on this site calls a server. The response headers forbid it.
Two specimens need time
A fake countdown cannot be proven from one look. Lab 03 restarts on every page load: a tool has to load it, wait, and load it again. Lab 04 starts over by itself after 20 seconds: a tool has to watch for about 25 seconds. The control with a real deadline keeps counting across reloads, and must stay unflagged.
The stock and viewer numbers in Lab 05 change every two to three seconds. A tool that watches for ten seconds sees them go up as well as down.
Using the Lab
- Read the manifest and visit each
urlon this site. - Run your tool. Collect the elements it reports.
- Compare them with
targets. A reported target is a hit. Anything else on the page is a false alarm. A target that was not reported is a miss. - Do the same with
?twin=fairand with the controls. Every finding there is a false alarm.
Cepti, the browser add-on made alongside Deon, runs its own tests against these pages.
Pattern names follow the sources listed on the About page. They are general information about design, not a statement about what any law requires.