Readability keeps 1 of 5 hidden notes. A CSS class is enough to get it through.
We ran Mozilla Readability 0.6.0 on a help page with five hidden notes. The article kept the one hidden by a stylesheet class, and a computed-style pre-pass removed it.
By David Discua
Measured in the lab
- 5
- hidden notes on the page
- 1
- notes in the raw article
- 0
- notes after the filter
- 14/14
- tests passed
- Raw article keeps NOTA-CLASE and no other note
- Pre-pass article keeps zero notes and both visible paragraphs
- CLI exits 4 on the raw page and 0 with --visible
- 14 tests passed, 0 failed, with no API keys
- Skills layout check exits 0
From reports/gate.json · run on October 19, 2026. @mozilla/readability 0.6.0 (04fd32f72b44), jsdom 30.1.3, Bun 1.4.2; bun test 14 pass, 0 fail, 5 files; GitHub Actions run not recorded
How it is wired
01/03A help page hides five notes from the person reading it.
Readability is the library behind Firefox Reader View. It takes a web page and returns the article text, which is often what an agent hands to a model. We fed it a local help page with five notes a person never sees, and the article it returned kept one of them, the note hidden only by a stylesheet class. A computed-style pre-pass in front of the parser took that count to zero.
The catch
Readability decides what is visible in _isProbablyVisible (Readability.js lines 2694 to 2707). That function reads the inline style attribute, the hidden attribute and aria-hidden="true". It never looks at the page's stylesheets. Our fixture fixtures/ayuda.html defines .solo-ia{display:none} in a <style> block and puts a note in a paragraph with that class. Your browser hides it, and Readability copies it into the article.
The other four notes in that file use an inline display:none, the hidden attribute, an HTML comment and JSON inside a <script type="application/json"> tag. None of those four reached the article at this pin.
The pre-pass has limits too. It removes elements whose computed display is none or whose computed visibility is hidden. White text, opacity:0, font-size:0 and text pushed off screen (fixtures/trucos.html) are still in the page and the filter does not target them. It also removes a visibility:hidden parent even when a child sets visibility:visible. The upstream README says sanitizing input is outside Readability's scope, and that line is about script injection rather than hidden text.
What we ran (keyless)
git clone https://github.com/SkilledDragonCorp/oculto-readability-clase.git
cd oculto-readability-clase
bun install
bun src/cli.ts fixtures/ayuda.html
bun src/cli.ts fixtures/ayuda.html --visible
bun test
bun scripts/report.ts
The first CLI run prints NOTA-CLASE and a count of 1 and exits with status 4. With --visible it prints 0 and exits with status 0.
From reports/gate.json, run on October 19, 2026:
| Field | Value |
|---|---|
| Pin | @mozilla/readability@0.6.0, commit 04fd32f7, jsdom 30.1.3 |
| Runtime | Bun 1.4.2 on Linux |
bun test | 14 passed, 0 failed, 5 files, 12995 ms |
| Skills layout check | exit 0 |
| API keys | none |
The tests assert that the raw article holds NOTA-CLASE and nothing else, that the pre-pass article holds zero notes and still contains both visible paragraphs, and that the CLI returns the exit codes above. A second fixture, fixtures/controles.html, shows that a class named hidden with no CSS rule behind it is ordinary visible text, so both paths keep it. On macOS the full suite stops with exit 5 because the network sandbox needs unshare; the other four test files passed there, 13 of 13. We did not run the upstream test suite or gitleaks in this delivery, and there is no GitHub Actions log yet.
How it is wired
extractRaw builds a jsdom document and calls new Readability(document).parse(). extractVisible walks every element under <body>, asks window.getComputedStyle for its display and visibility, removes the hidden ones, and then calls parse() on the same document. Both return the article text plus the NOTA-* tokens found in it. jsdom keeps its defaults, so page scripts do not run and nothing is fetched from the network.
Minilab (open source)
Upstream is mozilla/readability (11,510 stars, Apache-2.0, JavaScript, as of October 20, 2026). Add your own page under fixtures/, run bun src/cli.ts on it with and without --visible, and re-run bun scripts/report.ts to refresh reports/gate.json.
Run it yourself
SkilledDragonCorp/oculto-readability-clase
Clone, install and run the report with no API keys. The numbers above are what that run writes.
bun install && bun src/cli.ts fixtures/ayuda.htmlSkilledDragon is not affiliated with Mozilla or the Readability project. Numbers are from our own keyless local lab run; the GitHub Actions run is not recorded yet. Re-run the report before relying on them. Marks belong to their owners.
All labs