Skip to content
All fingerprint checks
Error subsystem

stack serialisation matches the engine actually measured

Pim· Clearcote Research 2 min readCheck id error-stack-format-vs-engine

Stacks serialise in the form the measured engine actually uses: a header line with indented frames, or frames in name-at-location form with no header.

What a detector infers

Captures of three real browsers on one machine pin this precisely: for the same collector, the serialised stack begins with the error name and message under one engine, and with a frame written in name-at-location form under the other two. The difference is structural rather than verbal. One family prefixes a header line and indents every frame beneath it; the other emits frames directly with no header at all.

Each shape is a property of that engine's serialiser rather than of any individual error, which is what makes it a stable thing to check. Nothing in this audit asked the question before, and the three neighbouring rows each ask something genuinely different.

The realm-agreement row compares the error dialect ACROSS realms and deliberately names no engine — its own reasoning is that naming one would create a table that rots, and that an unfamiliar engine should simply agree with itself and pass. That is the right design for what it does, and it is exactly why that row cannot say whose dialect it is reading. The binding-layer row covers the wording of DOM exceptions, which is generated by a different codebase entirely.

This one covers the JavaScript engine's own stack serialisation: a third, independent surface, and the only one of the three that describes the shape of the output rather than its text. It is anchored on the measured engine — the oracle no user-agent edit, client-hint shim or debugging-protocol override reaches — so relabelling cannot satisfy it, and the discriminator is the presence of a header and the form of the frames rather than any list of strings.

How to resolve it

Stack serialisation comes from the JavaScript engine and is not a value a profile sets. If it is being rewritten to resemble another engine, note that three independent surfaces have to move together — dialect consistency across realms, DOM exception wording, and stack shape — and only one of them is reachable from the page at all.

Anatomy of a browser fingerprint: every signal, and why they must agree

Other checks in Error subsystem

Who builds this test

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 Error subsystem 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 Error subsystem — the family error-stack-format-vs-engine belongs to.