Skip to content

Parity overview

Cross-engine conformance summary of @knowvah/dot-engine vs the native Graphviz oracle, one row per track (engine × comparison surface). A report, not a gate. Regenerate: npx tsx test/corpus/parity-report.ts (after refreshing the per-track surveys it reads).

conformant / pass is the ±0.01 deterministic-tolerance verdict per docs/conformance.md — numeric payloads agree within tolerance and non-numeric content is exactly equal — not byte equality. errors = oracle-error + port-error/errored + timeout (excluded from scoring). accepted = documented won't-fix deltas (0 for engines without an acceptance list).

Tracks

tracksurveyedconformant / passdivergedacceptederrorspass %
dot (SVG)9399100171296.9%
dot (xdot)905905000100.0%
dot (json)90590302099.8%
circo (xdot)91090204499.1%
twopi (xdot)910893016198.1%
osage (xdot)90589708099.1%
patchwork (xdot)905905000100.0%
dot (imagemap)905905000100.0%
dot (plain)90589708099.1%
circo (plain)905887013598.0%
twopi (plain)905881023197.3%
osage (plain)905889016098.2%
patchwork (plain)90589708099.1%
dot (dot)905905000100.0%
circo (json)90589406598.8%
twopi (json)905887017198.0%
osage (json)905892013098.6%
patchwork (json)90590302099.8%
circo (imagemap)90590000599.4%
twopi (imagemap)90590400199.9%
osage (imagemap)90590401099.9%
patchwork (imagemap)905905000100.0%

Iterative engines (±0.5 characterization)

neato/fdp/sfdp are iterative force-directed solvers whose results depend on floating-point accumulation (FMA, Math.pow, libm) that JavaScript cannot reproduce bit-for-bit — accepted class A1. These rows are compared at a ±0.5pt tolerance to characterize behavior, not to gate byte-fidelity; do not read their pass % against the deterministic bar above.

tracksurveyedconformant / passdivergedacceptederrorspass %
neato (xdot)910826083190.8%
fdp (xdot)9107030204377.3%
sfdp (xdot)9106190290168.0%
neato (plain)90589608199.0%
fdp (plain)90589308498.7%
sfdp (plain)90589608199.0%
neato (json)910825084190.7%
fdp (json)9107010205477.0%
sfdp (json)9106170292167.8%
neato (imagemap)91090207199.1%
fdp (imagemap)905883018497.6%
sfdp (imagemap)910880029196.7%

Dot output formats (SVG · xdot · json)

How faithfully the port renders each input across all three deterministic dot outputs, joined by id. xdot and json survey the SVG-conformant roster, so this is the intersection (905 inputs); an input is conformant in all three only when every format agrees with the oracle within tolerance.

status across SVG · xdot · jsoncount%
conformant in all three90399.8%
accepted (won't-fix) in ≥1, diverged in none20.2%
diverged / errored in ≥100.0%

Per-format status of the ids not conformant in all three:

idSVGxdotjson
share-Latin1conformantconformantaccepted
windows-Latin1conformantconformantaccepted

Engine exclusions

Graphs NOT walked on the listed engines, because the engine cannot meaningfully exercise them. These carry no verdict — they are not accepted divergences. An entry requires all three of: structurally degenerate for that engine, expensive enough that skipping it buys something, and covered on a cheaper track. Source of truth: test/corpus/engine-exclusions.json.

idengineswhy it measures nothingcovered instead by
2222neato, fdp, sfdp, circo, twopi28,303 node declarations and ZERO edges, so every node is its own connected component. With no edges there are no springs to relax, no circular ordering and no radial tree: all five engines delegate to the engine-INDEPENDENT component packer (lib/pack), whose polyomino packing is visible in the output as a grid (861 distinct x by 1632 distinct y). Their own algorithms never run — confirmed by all four measured oracle outputs being BYTE-IDENTICAL (16,390,698 bytes, cmp-verified). Ruled out a layout= attribute override (none) and fixed pos= (none).The four dot tracks (SVG, xdot, json, imagemap), where 2222 is conformant and the native render takes 6s. dot does NOT use lib/pack — its output differs from the neato-family — so dot coverage exercises a different disconnected-component path, and the packer path itself remains covered by the 157 other edgeless corpus graphs, all of which are cheap (<=7KB).

Goldens

247 pinned golden inputs (test/golden/manifest.json), by engine:

enginegoldens
dot178
neato18
fdp7
sfdp6
circo15
twopi8
osage7
patchwork8

The golden xdot suite gates these in CI (test/golden/xdot-suite.test.ts).

Per-track dashboards