0 % · reading the evidence

Every clone claims fidelity.
parity measures it.

The same probes run against the original and against the clone. A clone measured only against itself proves nothing.

source
The original site as measured.
clone
The local reconstruction, rendered by the original runtime.

the measurement

Watch it run.

The whole method in one pass — capture, localize, verify, diff, and the counter-measurement that decides it. Every number in it was read from the same runs this page replays. It is still a recording, though: the tables below are rebuilt whenever the tool is, and the film is not.

44.8s 4 subjects every check run twice exit 1 on any difference

Run it twice. The difference is the proof.

Pick a subject. These are real recorded runs — the page replays the NDJSON that parity diff emitted against the evidence pairs committed in the repository.

Counter-measurement: source against clone
statusmetricsourceclone
parity diff capture/orig capture/clone

No screenshots, no numbers typed by hand. Change the tool, rebuild, the page changes with it.

A number you cannot picture, drawn to scale.

oryzo.ai is pixels tall. verify walks the whole thing in 21 steps and stops at five marks to record what the page has become by then — on both sides, at the same marks. Which is also the honest limit of the walk: on a page that cannot scroll, all 21 steps measure the same frame.

Late scroll positions are where a site reveals the assets it never mentions in its HTML. A clone that only loads what the first screen needs looks finished until somebody scrolls.

    How far each subject goes, on one scale. Only oryzo.ai measures in document pixels; the others hold everything in a canvas, so depth turns the wheel instead and records how far it still changes the picture. Those numbers are indicative, not exact — a camera that has reached its limit simply stops answering.

    Fifteen widths. Fifteen agreements.

    responsive resizes the browser to 15 widths and records what the page becomes at each one — then does the identical run against the clone. Below: every width, the page height the source produced, the height the clone produced, and whether they match.

    The bar behind each row is that page height to scale, so the site’s own responsive shape is visible too — including the width where its layout switches. responsive finds that width by measuring, rather than reading it out of a stylesheet and hoping.

    Where it stops.

    Three subjects were measured and did not reach parity. These are worth more than another green tick: two mark the edge of what the method can claim, and the third is a tick this page used to show before the tool learned to refuse it.

    basement.studio

    Every remaining error was one endpoint: /_next/image?url=…&w=1920&q=75. That is not an asset, it is a server resizing images on request.

    parity reconstructs the frontend a site ships. Server behaviour is not frontend, and is not rebuilt.

    igloo.inc

    Reported ✓ parity, 11 of 11 this morning. It was worthless: both sides had rendered nothing, and two blank pages match perfectly.

    Two defects hid behind that tick. The clone never held the site at all — its 1.5 MB application arrives through import("./App3D-…js"), a relative specifier fetch could not see, and because the markup linked the loader absolutely the browser simply took it from the original. No 404, no signal, nothing to notice.

    Both are fixed: relative imports are followed, and same-origin absolutes are rewritten so a clone is answerable only by itself. The site itself now refuses to start under an automated browser — every asset arrives, no error is raised, and no canvas is ever created. That one is unexplained.

    lusion.co

    4 of 11 checks differed, and the off-origin report named the reason: hagen.challenges.cloudflare.com. The site is behind bot protection.

    Authentication, paywalls, DRM and bot protection are not circumvented — by design, not by accident.

    Both were found the same way every result on this page was: by running the same probes against both sides and reading the difference.

    The clone that signed people up.

    An early version of the guard blocked off-origin scripts by overriding appendChild. The JSONP library it was meant to stop used insertBefore.

    The consequence was not theoretical. A local clone posted a real address to a live production Mailchimp list. A clone that lets a form through is not a copy of a page — it is a second front door to somebody else’s service.

    The guard now covers all five DOM insertion paths, plus fetch, XHR, sendBeacon and off-origin form submits — and answers JSONP callbacks locally, so the interface still reaches its confirmed state without anything leaving the machine.

    This is on the page because a tool that measures fidelity has no business hiding its own failures. The fix is only trustworthy if the bug is stated.

    Give it to an agent.

    The working mode this was built for: hand over a URL, say what you need, let the agent do the rest — because through capture and verify it can actually see what the page does instead of guessing. The repository ships that brief as an installable skill: eight phases with exact commands, the traps, and the stop conditions. Install it once, and the agent reaches for it on its own.

    loading the manifest…
    skills/parity/SKILL.md read the file

      The paragraph above is the skill's own description — the text an agent weighs when it decides whether this is the tool for the job — and the list is the section headings of the file. Both are read out of SKILL.md when the page is built, together with the install line, which is derived from the plugin manifest rather than typed here. The page cannot advertise a skill the repository does not ship.

      An agent without plugin support gets an install prompt to paste. It installs the tool and stops there — it does not go looking for a site to rebuild.

      INSTALL.md
      loading INSTALL.md…

      That is INSTALL.md from the repository, read from the file at build time rather than retyped — an install prompt that has drifted from the repo it installs is worse than none.

      Run it yourself.

      npm install
      npx playwright install chromium
      
      node bin/parity.mjs capture   https://target.tld capture/orig
      node bin/parity.mjs localize  https://target.tld clone
      node bin/parity.mjs fetch     https://target.tld clone clone/index.html
      node bin/parity.mjs serve     clone 4173
      
      node bin/parity.mjs verify https://target.tld       capture/orig  --shots --freeze
      node bin/parity.mjs verify http://localhost:4173/   capture/clone --shots --freeze
      node bin/parity.mjs diff   capture/orig capture/clone

      diff exits 1 when anything differs, so it drops into CI as-is. Node standard library plus Playwright. Nothing else.

      Every parity command
      commandargumentswhat it does

      This table is read out of bin/parity.mjs when the page is built, so it cannot drift from the CLI it documents — including the descriptions, which appear exactly as the CLI prints them. They are in German, because the engine still is.