The clock looks equally precise from the page and from every worker realm
An ordinary browser: every realm that answers reports the same grid step and the same order of magnitude of residue as the window — pass. Neither value is asserted in absolute terms, because the step differs between engines and a cross-origin-isolated page legitimately gets a finer one, and the residue legitimately grows with how long the machine has been up.
What a detector infers
`performance.now()` does not hand a page the raw clock. Every engine coarsens it first — rounding the value onto a grid so that a page cannot time operations finely enough to read secrets out of the CPU's behaviour. Two facts follow from how that coarsening is built, and the check rests only on those.
First, the size of the grid step is a property of the engine, so every JavaScript realm of one browser — the page, a dedicated Worker, a SharedWorker, a ServiceWorker — must report the same step. Second, the value a page finally sees is computed by subtracting two coarsened numbers, and that subtraction is done in floating point, which cannot represent the result exactly.
The tiny residue left over is a property of the one clock all those realms share, so its size must match across realms too. The check measures the step and the residue in the window and in every worker realm that answers, and compares them. Nothing is assumed about what the numbers should be: both are derived from the browser under test, because engines coarsen by different amounts and a cross-origin-isolated page gets a finer step than an ordinary one.
What this catches is a timer overridden in the page world and left untouched inside a Worker. That asymmetry is the ordinary shape of a partial spoof — the main-thread override is the easy one to write, and the worker realms have a separate global that the override never reaches.
It is worth being precise about what is NOT a finding here: every honest browser strays from its own grid, and the size of that stray grows with how long the machine has been running, because the numbers being subtracted get larger and floating point gets coarser as they do. A freshly booted machine strays by a fraction of a nanosecond and a machine up for two months strays by a fraction of a microsecond, and both are completely ordinary.
Only disagreement between realms of the same browser is evidence of anything, which is why the absolute value is never asserted — and why a browser that 'fixes' its timer by rounding it onto a perfectly clean grid makes itself more conspicuous rather than less, since no real engine lands exactly on its own quantum.
How to resolve it
Only cross-realm disagreement is a finding, so the resolution is to make the realms agree rather than to make any particular number appear. A timer override installed on the page's `performance` object does not follow into a Worker, a SharedWorker or a ServiceWorker — each has its own global — so either apply it in every realm or, better, do not override the timer at all and let the engine's own coarsening stand in all of them.
Do not round the result onto a clean grid to make it look tidy: real engines leave a floating-point residue from subtracting two coarsened numbers, so a value that lands exactly on its own quantum is more conspicuous than the stray it replaced. Realms that cannot answer are excluded rather than counted.
Other checks in Worker realms
- Every worker realm reports the same identity as the window
worker-realms-agreeA page is not one JavaScript realm — it is several. The audit loads one probe script into all three worker kinds the platform offers: a… - Every worker realm reports the same GPU as the window
worker-gpu-agreesInside each worker the probe creates an OffscreenCanvas(32,32), obtains a webgl (or experimental-webgl) context, and reads… - Worker scopes available to compare against the window
worker-scopes-reachedThis row asserts nothing — pass is hardcoded null and severity is info.
Clearcote is a browser built for fingerprint coherence
It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.
This audit takes no position on how Clearcote scores on Worker realms checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.
See the other checks in Worker realms — the family timer-grid-across-realms belongs to.
