anti-font-fingerprinting.patch added a seeded amount to every glyph advance,
so that text widths differed per context. No real machine produces those
widths: the same font on the same OS measures the same everywhere. So the
noise was itself a fingerprint, measured in #779 at +1 px per ~100 glyphs
plus fractional deltas on every measureText. #779 defaulted the seed to 0
and kept it as an opt-in, but an opt-in whose only effect is to become
detectable is not worth carrying. Removed:
- The browser side:
- FontSpacingSeedManager and window.setFontSpacingSeed;
- the HarfBuzz hook;
- the plumbing that existed only to carry the context id down to the
shaper: the userContextId on gfxTextRun, gfxShapedWord and the word-cache
key, and the extra MakeTextRun argument in nsTextFrame, nsFontMetrics,
MathML and canvas.
The font group keeps its userContextId, which font-list-spoofing.patch
uses to apply the per-context font list. Text is now shaped exactly as
stock Firefox shapes it.
- The fonts:spacing_seed key. The launcher had been sending 0 on every
launch, plus a setFontSpacingSeed(0) call in every context's init script.
- tests/patches/config-overrides.py, which tested only the spacing override.
A pythonlib test now covers config_overrides with another key.
timezone-spoofing, webrtc-ip-spoofing and window-setter-seal change only in
context lines and the setter seal list. Every patch applies cleanly to a
fresh tree, and the result builds. The settled decision is recorded as
no-glyph-spacing-noise, with an automated check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- Created patch-upgrading-guide.md with step-by-step instructions for updating patches across Firefox versions
- Covers understanding patch system, preparation, general workflow, and common reject types
- Includes historical context patch merging section (no longer applicable after Firefox 146)
- Documents testing, validation, best practices, and complete example session
- Provides troubleshooting section for common issues and API changes
- Details