- 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>
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