Files
camoufox/tests
Jake WriterandClaude Opus 5.5 d3d9d73c2d docs: one AGENTS.md for every agent, a roadmap, and docs that match the code
- AGENTS.md holds the engineering rules for any coding agent, plus the
  repo map, build, patch and test commands that CLAUDE.md used to carry.
  CLAUDE.md now only imports it, so there is one set of rules.
  ci/tribal-rules.yml is the record of settled decisions it points to.
- ROADMAP.md lists planned work, each item linked to its issue.
- README:
  - fpgen and the coherence check replace BrowserForge;
  - the patch workflow uses the make targets instead of the removed
    developer UI;
  - letter-spacing noise is described as off by default, as it is.
- docs/:
  - beta-testing-ff146.md removed;
  - patch-upgrading-guide rewritten around the make targets;
  - per-context-patches without the canvas patch that no longer exists,
    and with measured preset counts;
  - playwright-maintenance without the JSM wrapper that does not exist;
  - smaller fixes in MEDIA-DEVICES, input-dispatch and FONTS.
- ci/README: every job, and the real shard, skiplist and entry-point lists.
- pythonlib, tester and patch-dependency READMEs corrected against the code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 15:22:28 -06:00
..

Tests

Two things live here, and neither is a copy of anyone else's suite.

patches/ — patch guards

One standalone script per shipped spoofing behaviour: isolated evaluate, trusted events, font spoofing, mouse trajectories, the touchscreen digitizer, and so on. Each exits 0 or 1 and drives the browser through the Python package.

These are the most direct evidence that a Firefox bump did not quietly neuter a patch that still applies cleanly — the failure a compile check cannot catch.

python3 -m ci.run_patch_guards --binary /path/to/camoufox-bin
python3 -m ci.run_patch_guards --binary /path/to/camoufox-bin --only isolated-evaluate

camoufox/ — Camoufox's own Playwright tests

Tests for behaviour upstream Playwright has no equivalent for, or asserts the opposite of on purpose. ci/suite.py overlays them onto the upstream checkout so they run against its harness. See camoufox/README.md for when to add one.


Where the Playwright suite went

This directory used to hold a fork of a ~v1.55-era playwright-python suite. It was deleted, because measuring it showed it was strictly weaker than running upstream's own suite:

  • 73 of the 74 tests it skipped as "Not supported by Camoufox" pass when the same binary runs upstream's copy. The skips predated main-world execution and were never revisited; the suite was asserting that Camoufox was worse than it is.
  • Of its passing tests, eight had no upstream counterpart. Six of those were Camoufox-specific and are now the three modules in camoufox/; the other two were tests upstream had since renamed.
  • Everything else was upstream code, one generation stale.

ci/run_playwright.py fetches playwright-python at the tag ci/versions.py resolves for the browser under test, applies ci/skiplist.yml, and overlays camoufox/. A suite that is re-fetched every run cannot go stale, and a deliberate difference from upstream now has to be written down in the skiplist with a reason instead of being encoded as a silent fork.

make tests                  # the whole suite
make tests headful=true     # ... headed
python3 -m ci.run_playwright --binary /path/to/camoufox-bin --shard 3/6