Skip to content

tooling: drop Chrome for Testing — it was never the browser this ships to - #22

Merged
izzykatt-ci[bot] merged 1 commit into
mainfrom
drop-chrome-for-testing
Sep 29, 2026
Merged

izzykatt-ci[bot] merged 1 commit into
mainfrom
drop-chrome-for-testing

Conversation

@izzykatt-ci

@izzykatt-ci izzykatt-ci Bot commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

The CDP lane ran a DIFFERENT BROWSER at a DIFFERENT VERSION against a
throwaway profile, so whatever it proved was not what a reader gets. That is
not verification; it is a demo that happens to be scriptable.

It was measured drifting. A feature was reported "verified on all five hosts"
against Chrome for Testing 154 on a machine whose actual browser is Chromium
152 — and two of those five hosts turned out to be scroll-locked in ways the
rig papered over. thumbwall's own WHY block had recorded its original
measurements on "Chromium 152.0.7977.64" all along: the real browser. The 154
lane was the newer, wrong thing layered on top.

The browser here is ungoogled-chromium 152.0.7977.64 with Violentmonkey 2.48.0
from the Chrome Web Store, and the only channel into a page is the manager's
own install path. Testing a change means installing it.

Removed in full: nix/chrome-for-testing.nix, nix/violentmonkey.nix,
scripts/cdp.mjs, scripts/userscript-watch.mjs, scripts/userscript-verify.mjs,
scripts/watch-daemon.mjs, the browser / watch / verify / watch-status /
watch-stop / browser-bump commands, the two Claude Code hooks that kept the
loop alive, and the 470 MB .nix-browser/ profile. 474 MB -> 3.8 MB on disk.

Two things fell out with it:

  • allowUnfreePredicate is gone. It admitted exactly one package, Chrome for
    Testing; nothing unfree is left, so a contributor no longer needs an
    unfree allowance to get a dev shell.
  • Five ESLint globals — fetch, WebSocket, AbortController, setTimeout,
    clearTimeout — which only the CDP client used. scripts/ is meta-lint.mjs
    alone now, so no-undef keeps meaning something.

What replaces the tooling is the rule it used to enforce mechanically.
selector-verify.mjs returned a GENERATED verdict; CONTRIBUTING.md now carries
it in prose — anchor on ARIA roles, href values and data attributes, never a
generated class and never aria-label or link text, both of which are
localised. Log the count from the script itself behind a debug flag that ships
off, and break the selector on purpose to prove the failure mode.

Two findings kept as page facts, not rig facts: xhamster ships
body.xh-scroll-disabled (overflow-y: hidden) on a clean profile with no dialog
behind it, and pornhub holds scrollHeight === innerHeight behind its age
modal. Both measured 2026-09-29 identical with a script armed and with it torn
down, so neither is the script's doing.

CHANGELOG history is untouched; it was true when it was written.

…s to

The CDP lane ran a DIFFERENT BROWSER at a DIFFERENT VERSION against a
throwaway profile, so whatever it proved was not what a reader gets. That is
not verification; it is a demo that happens to be scriptable.

It was measured drifting. A feature was reported "verified on all five hosts"
against Chrome for Testing 154 on a machine whose actual browser is Chromium
152 — and two of those five hosts turned out to be scroll-locked in ways the
rig papered over. thumbwall's own WHY block had recorded its original
measurements on "Chromium 152.0.7977.64" all along: the real browser. The 154
lane was the newer, wrong thing layered on top.

The browser here is ungoogled-chromium 152.0.7977.64 with Violentmonkey 2.48.0
from the Chrome Web Store, and the only channel into a page is the manager's
own install path. Testing a change means installing it.

Removed in full: nix/chrome-for-testing.nix, nix/violentmonkey.nix,
scripts/cdp.mjs, scripts/userscript-watch.mjs, scripts/userscript-verify.mjs,
scripts/watch-daemon.mjs, the browser / watch / verify / watch-status /
watch-stop / browser-bump commands, the two Claude Code hooks that kept the
loop alive, and the 470 MB .nix-browser/ profile. 474 MB -> 3.8 MB on disk.

Two things fell out with it:

  - allowUnfreePredicate is gone. It admitted exactly one package, Chrome for
    Testing; nothing unfree is left, so a contributor no longer needs an
    unfree allowance to get a dev shell.
  - Five ESLint globals — fetch, WebSocket, AbortController, setTimeout,
    clearTimeout — which only the CDP client used. scripts/ is meta-lint.mjs
    alone now, so no-undef keeps meaning something.

What replaces the tooling is the rule it used to enforce mechanically.
selector-verify.mjs returned a GENERATED verdict; CONTRIBUTING.md now carries
it in prose — anchor on ARIA roles, href values and data attributes, never a
generated class and never aria-label or link text, both of which are
localised. Log the count from the script itself behind a debug flag that ships
off, and break the selector on purpose to prove the failure mode.

Two findings kept as page facts, not rig facts: xhamster ships
body.xh-scroll-disabled (overflow-y: hidden) on a clean profile with no dialog
behind it, and pornhub holds scrollHeight === innerHeight behind its age
modal. Both measured 2026-09-29 identical with a script armed and with it torn
down, so neither is the script's doing.

CHANGELOG history is untouched; it was true when it was written.
@izzykatt-ci
izzykatt-ci Bot enabled auto-merge (squash) September 29, 2026 17:36
@izzykatt-ci
izzykatt-ci Bot merged commit 5af8ea9 into main Sep 29, 2026
5 checks passed
@izzykatt-ci
izzykatt-ci Bot deleted the drop-chrome-for-testing branch September 29, 2026 17:37
izzykatt-ci Bot added a commit that referenced this pull request Sep 29, 2026
…ke (#23)

Restores every file to its state at f481e36 — the commit before "nix: pin the
whole toolchain and mechanise the maintenance it guards" (#14). This undoes #14
through #22: the flake, the pinned browser, the CDP watch/verify tooling, the
Claude Code setup, and the docs written around them.

WHAT THIS DOES NOT TOUCH, and it is the whole reason a revert is safe here:
neither userscript changed at any point in that range. thumbwall.user.js and
leolist-listings-only.user.js are byte-identical at f481e36 and at main
(e6804e698a52 and 4d9db4aa33bd). thumbwall stays at 5.0.0, leolist at 1.65.0.
No published behaviour changes and no script work is lost.

CI still gates. Both required checks are defined in the restored lint.yml under
the same names branch protection asks for — "eslint + meta" and "node --check" —
and scripts/meta-lint.mjs predates the range, so `npm run lint` remains the
publish gate it always was.

Removed: flake.nix, flake.lock, nix/mermaid-ascii.nix, .envrc, .claude/,
CLAUDE.md, .github/workflows/nix.yml, the markdownlint configs and _typos.toml.
Restored: .gitignore, eslint.config.mjs, lint.yml, CHANGELOG.md,
CONTRIBUTING.md and README.md to their pre-flake content.

A revert rather than a force-push: main is public and carries 22 merged pull
requests, and rewriting that history would break every clone and branch taken
from it. The tree is what matters and the tree is exact.

Co-authored-by: Izzy Katt <hi@izzykatt.ca>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant