How every parity score is calculated
A port is only worth its claim if it does what the original does, so every score here is measured by running the original library. For each port a harness installs the real published package at a pinned version, starts it as a subprocess in its own runtime, asks it and the Go port the identical questions, and records every disagreement by name. Upstream is the oracle: there are no hand-written expectations to drift, and a new upstream release re-scores the port on its own.
Pick a library below to see its complete record — the exact upstream package and version it was measured against, the exact Go module measured, the stages that run executed, every upstream symbol compared side by side with its Go counterpart, and every individual case with its result.
The stages of a run
Every harness executes the same seven stages, defined in parity/HARNESS.md. Each library's page draws these as a graph labelled with that run's real artefacts: the package it installed, the runner files it started, the case files it streamed, and the counts it wrote out.
- 1Install the pinned upstream oracle. The harness installs the real published package at an exact version — the npm tarball, the PyPI wheel, the gem, the jar. An unpinned oracle would make the score unreproducible, so the version is written into the case files.
- 2Start the upstream runner. A small program in the upstream ecosystem (node/, python/, java/, ruby/, rust/, elixir/, c/) is started once and kept open, speaking JSON Lines over stdio: one JSON object in per line, exactly one out. The harness never links against the library — it only talks to it.
- 3Start the Go runner. go/run.go implements the same contract over the Go port. Neither runner may exit on a failing case: it reports ok:false and keeps reading, so one loss never cascades into the rest of the suite.
- 4Stream every case to both. Cases live in cases/*.json as language-agnostic JSON, each naming the upstream symbol and the Go symbol it exercises. Every case goes to both runners, in order, through the two long-lived processes, with a per-case timeout.
- 5Compare ok, then value. Failure is compared before value — returning a result where upstream throws is not parity. Values are compared with a normalising deep-equal that treats every JSON number as float64, so 1 and 1.0 agree while a real behavioural difference still shows.
- 6Classify match, mismatch or deviation. A documented, deliberate difference is counted as a deviation and listed in the port’s API-DEVIATIONS.md; anything else that disagrees is a mismatch, named by case id. A deviation is never quietly counted as a pass.
- 7Write parity.json and COVERAGE.md. The run rewrites the machine-readable score plus the full upstream API inventory: every exported upstream symbol marked match, differs, missing, extra or untested, with the command that enumerated it. This page is generated from those two files.
Every measured library
| Library | Upstream oracle (pinned) | Ecosystem | Go module | Cases | Mismatch | Deviations | Symbols | Parity | Nested ports |
|---|---|---|---|---|---|---|---|---|---|
| algebra | sympy@1.14.0 | python | github.com/malcolmston/algebra@v0.8.0 | 292 | 27 | 0 | 107 | 90.8% | — |
| axios | axios@1.7.9 | node | github.com/malcolmston/axios@v0.3.0 | 151 | 0 | 2 | 159 | 100.0% | — |
| chalk | chalk@5.3.0 | node | github.com/malcolmston/chalk v0.4.0 | 680 | 96 | 6 | 80 | 85.8% | |
| cheerio | cheerio@1.0.0 | node | github.com/malcolmston/cheerio v0.0.0-20260810111529-e3282199363b | 317 | 2 | 9 | 106 | 99.4% | — |
| Express | express@4.21.2 | node | github.com/malcolmston/express v0.4.0 => ../../express | 184 | 2 | 1 | 244 | 98.9% | |
| fastmcp | fastmcp@3.4.6 | python | github.com/malcolmston/fastmcp v0.4.0 | 110 | 55 | 0 | 81 | 50.0% | — |
| glTF | @gltf-transform/core@4.2.1+gltf-validator@2.0.0-dev.3.10 | node | github.com/malcolmston/gltf v0.0.0-20260810111530-84677d83f157 | 101 | 3 | 0 | 122 | 97.0% | — |
| Handlebars | handlebars@4.7.8 | node | github.com/malcolmston/handlebars@v0.0.0-20260810111532-be93e3763eef | 236 | 29 | 0 | 73 | 87.7% | — |
| Jest | expect@29.7.0 + expect@29.7.0 + jest-mock@29.7.0 | node | github.com/malcolmston/jest v0.0.0-20260810111534-fc19c60ec8b3 | 369 | 31 | 27 | 72 | 90.9% | — |
| JOSE | jose@5.9.6 | node | github.com/malcolmston/jose v0.0.0-20260810111536-aa9e56a9a81b | 157 | 6 | 0 | 64 | 96.2% | — |
| jq | jq@1.7.1 | c | github.com/malcolmston/jq v0.0.0-20260810111538-69e9503f8dce | 574 | 58 | 13 | 308 | 89.7% | — |
| JWT | jsonwebtoken@9.0.2 | node | github.com/malcolmston/jwt@v0.3.0 | 155 | 9 | 3 | 52 | 94.1% | — |
| LiveView | phoenix_live_view@1.2.9 | elixir | github.com/malcolmston/liveview@v0.3.0 | 94 | 25 | 0 | 85 | 73.4% | — |
| lodash | lodash@4.17.21 | node | github.com/malcolmston/lodash v0.0.0-20260810111543-820ef3866dc9 | 624 | 16 | 22 | 328 | 97.3% | — |
| Lucene | lucene@9.11.1 | java | github.com/malcolmston/lucene v0.0.0-20260810111545-f6877e274658 | 237 | 58 | 0 | 86 | 75.5% | — |
| Markdown | commonmark@0.31.2 | node | github.com/malcolmston/markdown v0.1.0 | 701 | 18 | 0 | 49 | 97.4% | — |
| matplotlib | matplotlib@3.10.0 | python | github.com/malcolmston/matplotlib@v0.0.0-20260810111548-1b42add03764 | 103 | 42 | 0 | 73 | 59.2% | — |
| Migrate | rails/rails activerecord@8.0.2 (sqlite3 gem 2.7.4, SQLite backend) | ruby | github.com/malcolmston/migrate v0.3.0 | 86 | 42 | 0 | 115 | 51.2% | — |
| Moment | moment@2.30.1 | node | github.com/malcolmston/moment v0.0.0-20260810111552-e5d96a99ef23 | 1,731 | 105 | 5 | 237 | 93.9% | — |
| morgan | morgan@1.10.0 | node | github.com/malcolmston/morgan@v1.2.0 | 98 | 32 | 0 | 54 | 67.4% | — |
| Nodemailer | nodemailer@6.9.16 | node | github.com/malcolmston/nodemailer v0.0.0-20260810111553-311143ed3171 => ../../nodemailer | 86 | 8 | 0 | 84 | 0.0% | — |
| numpy | numpy@2.2.6 | python | github.com/malcolmston/numpy v0.0.0-20260810111555-4476c82e3a95 | 301 | 11 | 4 | 110 | 96.3% | — |
| Oban | oban@2.23.1 | elixir | github.com/malcolmston/oban@v0.0.0-20260810111557-dd5f0675354a | 165 | 29 | 0 | 87 | 82.4% | — |
| opencv | opencv-python@4.11.0 | python | github.com/malcolmston/opencv v0.8.0 | 751 | 168 | 1 | 190 | 77.6% | — |
| pandas | pandas==2.3.3 | python | github.com/malcolmston/pandas v0.2.0 | 217 | 42 | 1 | 639 | 80.6% | — |
| Passport | passport@0.7.0+passport-local@1.0.0+passport-http@0.3.0+passport-http-bearer@1.0.1 | node | github.com/malcolmston/passport@v0.3.0 | 74 | 0 | 2 | 81 | 100.0% | |
| PDFKit | pdfkit@0.15.1 | node | github.com/malcolmston/pdfkit v0.0.0-20260810111600-857c462c84f5 | 119 | 111 | 0 | 150 | 6.7% | — |
| Prisma | prisma@5.22.0 | node | github.com/malcolmston/prisma v0.3.0 | 112 | 31 | 0 | 112 | 72.3% | — |
| puppeteer | cheerio@1.0.0 + tough-cookie@5.1.2 + node WHATWG fetch/URL | node | github.com/malcolmston/puppeteer v0.2.0 | 197 | 5 | 7 | 388 | 97.4% | — |
| quartz | org.quartz-scheduler:quartz@2.5.0 | java | github.com/malcolmston/quartz@v0.0.0-20260810111605-f2c1d7b7b70a | 225 | 67 | 0 | 101 | 70.2% | — |
| react | react@19.2.7 react-dom@19.2.7 | node | github.com/malcolmston/react@v0.1.0 | 483 | 0 | 2 | 60 | 100.0% | — |
| Redis | redis-server@8.2.2 | c | github.com/malcolmston/redis v0.3.0 | 93 | 31 | 0 | 267 | 66.7% | — |
| RRule | python-dateutil@2.9.0.post0 | python | github.com/malcolmston/rrule v0.1.0 | 261 | 37 | 0 | 84 | 85.8% | — |
| sequelize | sequelize@6.37.8 | node | github.com/malcolmston/sequelize@v0.1.0 | 61 | 0 | 3 | 84 | 100.0% | — |
| sharp | sharp@0.33.5 | node | github.com/malcolmston/sharp v0.0.0-20260810111610-e874a7b0b3f8 | 327 | 114 | 0 | 67 | 65.1% | — |
| sled | sled@0.34.7 | rust | github.com/malcolmston/sled v0.0.0-20260810111611-e90aa95364ed | 70 | 1 | 5 | 99 | 98.5% | — |
| Socket.IO | engine.io-parser@5.2.3; socket.io-parser@4.2.7; socket.io@4.8.1 + socket.io-client@4.8.1 | node | github.com/malcolmston/socketio v0.4.0 => ../../socket.io | 165 | 5 | 5 | 152 | 97.0% | |
| SQLite | sqlite3@3.45.3 | c | github.com/malcolmston/sqlite v0.2.0 | 428 | 132 | 0 | 754 | 69.2% | — |
| Streamlit | streamlit==1.61.1 | python | github.com/malcolmston/streamlit v0.3.0 | 55 | 15 | 0 | 120 | 72.7% | — |
| YAML | yaml@2.6.1+yaml-test-suite@da267a5c4782e7361e82889e76c0dc7df0e1e870 | node | github.com/malcolmston/yaml v0.1.0 | 1,071 | 74 | 7 | 77 | 93.1% | — |