Skip to content

Dot (SVG) parity dashboard

Differential survey of @knowvah/dot-engine SVG output vs the native dot oracle over the dot test corpus. A report, not a gate (AD-1). Regenerate: npx tsx test/corpus/survey.ts && npx tsx test/corpus/dashboard.ts (writes PARITY-dot.md; the cross-engine PARITY.md summary comes from parity-report.ts).

Summary

  • Oracle: dot 15.1.0 · corpus: graphviz tests/ (local clone ~/git/graphviz/tests)
  • Surveyed (applicable): 788
  • conformant*: 762 (96.7%) · structural-match: 14 → 776/788 structurally equal (98.5%)
  • Accepted deltas (documented, won't-fix): 16 · Tracked gaps (unaccepted, will-fix): 0 → of 16 non-conformant graphs
  • errored: 0 · timeout: 0 · oracle-error: 10 (excluded from scoring)
  • Quarantined (not surveyed, from corpus-manifest.json): malformed 6, engine-deferred 6, multi-graph 3, perf 2

* conformant is a deterministic-tolerance verdict, not literal byte equality: numeric coordinates/paths agree within ±0.01 and all non-numeric content (tags, colors, text) is exactly equal (compareSvg(…, 'deterministic')). Full definition: docs/conformance.md.

Accepted deltas are deliberate, root-caused, won't-fix differences (test/corpus/accepted-divergences.jsonKnown divergences). Everything else non-conformant is a tracked gap we intend to close.

conformant (762)

Port SVG is conformant with the oracle: numeric coordinates/paths agree within the deterministic tolerance (±0.01) and all non-numeric content is exactly equal — not literal byte equality. See docs/conformance.md.

Conformant ids (762) are omitted for brevity — the full roster is in parity.json.

Accepted deltas (16) — documented, not chased

Deliberate, root-caused differences we have chosen not to make conformant (a portability constraint, sub-perceptual and bounded). Source of truth: test/corpus/accepted-divergences.json; rationale in Known divergences. These are excluded from the diverged table and the backlog below.

idverdictmaxΔclassboundref
2368structural-match10.22A3maxΔ~10pt on one flat-edge arc (376->76); bbox/nodes/labels conformantknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
2371structural-match16.80A3maxΔ 16.8 on two edges (g[9263] r6837mid--r9687mid, g[23859] r38mid--r8699mid); the port emits the exact control-point-sequence mirror of the oracle on both; all ~36,900 other elements byte-identicalknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
241_1structural-match2.36A3maxΔ ~2.4pt on one flat-edge arc; bbox/nodes/labels conformantknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
2413_1structural-match67.65A3maxΔ 67.65 on the labeled 2-cycle back-edge label-vnode slit corridor; nodes/bbox conformantknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
2413_2structural-match99.55A3maxΔ ≤99.55 (two findMaxDev ties, same corridor family as 2413_1) once the T11 swapBezier-reverse fix lands; until then parity.json reports maxΔ 1922.26, dominated by that separate, already-diagnosed-and-fixed swapBezier over-allocated-reverse defect (not part of this acceptance)known-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
graphs-b100structural-match20.00A3maxΔ 20 (one rank-row) on one hub in-edge knot (Node23730->Node23729); every node + all upstream box/poly/taut-path byte-identical to Cknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
graphs-b104structural-match20.00A3maxΔ 20 (one rank-row) on one hub in-edge knot; identical source to graphs-b100, same symmetric-channel tie-breakknown-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
graphs-decoratestructural-match43.54A3maxΔ 43.54 on a single intra-cluster labeled edge (Se3ffa656...->Se3ffa61c...); all 23 diffs live in that one <g>known-divergences.md#a3-hypot-tie-break-in-spline-routing-dot
1435structural-match0.39A4maxΔ 503 on pathplan-fallback spline debris; 11/11 edges on both sides; nodes/clusters conformantknown-divergences.md#a4-oracle-in-an-acknowledged-broken-state-the-init_rank--pathplan-family
1581diverged0.00A4maxDelta 465; top-level childCount 39 vs 22 (oracle recovery discards content)known-divergences.md#a4-oracle-in-an-acknowledged-broken-state-the-init_rank--pathplan-family
2471structural-match6906.60A4whole-layout numeric (maxΔ ~9063); element tree identical incl. the same 6 lost edgesknown-divergences.md#a4-oracle-in-an-acknowledged-broken-state-the-init_rank--pathplan-family
2796structural-match11.11A4maxΔ 49 numeric only; identical element tree (both sides lose edge 3->16)known-divergences.md#a4-oracle-in-an-acknowledged-broken-state-the-init_rank--pathplan-family
1367diverged0.00A5maxDelta 0; exactly one structural diff (one <title> byte: raw 0x80 vs UTF-8 U+0080); all element counts and coordinates conformantknown-divergences.md#a5-invalid-input-bytes-encoding-representation
1314structural-match1683625618000.00A6only the top-level svg width/height differ; every node ellipse/coord, translate, polygon, and font-size is byte-identicalknown-divergences.md#a6-unsigned-int-canvas-overflow-on-degenerate-input
graphs-honda-tokorostructural-match1.06A7maxΔ ~1pt on one edge (n012->n011); every node/label/bbox conformantknown-divergences.md#a7-round-box-wall-rounding-boundary-dot
2646structural-match42.09A8maxΔ 42.09 on 3 of 21,216 edges (edge2575 g[4639], edge3905 g[7777], edge15467 g[30201]; all record-port :c->:nb_part smode long-edge routes)known-divergences.md#a8-fp-contractfma-rounding-vs-strict-ieee-dot

Tracked structural-match (0)

Same element tree; only numeric coordinate diffs above tolerance (no missing or extra elements). Near-misses — sub-pixel-to-modest position drift — that we intend to close (accepted structural-match deltas are listed above instead).

Buckets below are keyed by the element KIND of each graph's worst numeric diff (maxDeltaPath) crossed with a magnitude band — an equivalence-class map for driving groups to conformance. Mechanism-family attribution: see analysis.

idmaxΔkindworst-diff path

Tracked diverged (0) — worst-first

idmaxDeltafirstDiffPath

errored (0)

idpathmessage

timeout (0)

idpathmessage

oracle-error (10) — excluded from port scoring

The native oracle did not emit a complete SVG (usually a hard syntax error it rejects entirely); there is no reference to compare against.

idpathmessage
14111411.dotError: https://gitlab.com/graphviz/graphviz/-/blob/main/tests/1411.dot: syntax error in line 17 near ''
14721472.dotoracle not well-formed XML: 102068B
17831783.dotError: overflow when calculating virtual weight of edge
18641864.dotWarning: Warning: no hard-coded metrics for 'monospace'. Falling back to 'Times' metrics
20642064.dotoracle exit null
2475_12475_1.dotoracle exit null
25932593.dotoracle exit null
27232723.dotoracle exit null
imagepath_test-baseimagepath_test/base.gvError: https://gitlab.com/graphviz/graphviz/-/blob/main/tests/imagepath_test/base.gv: syntax error in line 8 near ']'
share-b545share/b545.gvError: https://gitlab.com/graphviz/graphviz/-/blob/main/tests/share/b545.gv: syntax error in line 1 near '3.583'

Divergence backlog (next missions)

Named buckets over tracked (unaccepted) divergences, largest first. Each is a candidate oracle-pinned fix mission.