Skip to content

Dot parity dashboard

Differential survey of graphviz-ts 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.

Summary

  • Oracle: dot 15.1.0 · corpus: graphviz tests/ (local clone ~/git/graphviz/tests)
  • Surveyed (applicable): 788
  • conformant*: 759 (96.3%) · structural-match: 16 → 775/788 structurally equal (98.4%)
  • Accepted deltas (documented, won't-fix): 19 · Tracked gaps (unaccepted, will-fix): 0 → of 19 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 (759)

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.

121 1213-1 1213-2 1221 1308 1323 1323_1 1328 1332 1408 1425 1425_1 1436 1444-2 1444 1447 1447_1 144_no_ortho 144_ortho 1453 1514 1585_0 1585_1 162 1622_0 1622_1 1622_2 1622_3 1624 1644 165 1652 1658 165_2 165_3 167 1702 1718 1724 1767 1855 1856 1865 1879-2 1879 1880 1896 1898 1902 1909 1925 1939 1949 1990 2082 2087 2095 2095_1 2108 2159 2168 2168_1 2168_2 2168_3 2168_4 2168_5 2183 2184 2193 2222 2225 2239 2242 2257 2258 2285 2295 2325 2342 2343 2352 2352_1 2352_2 2361 2368_1 2391 2391_1 2406 241_0 2436 2437 2457_1 2457_2 2458 2460 2475_2 2476 2484 2490 2497 2502 2516 2521 2521_1 2556 2559 2563 2564 2572 258 2592 2609 2613 2614 2615 2619 2619_1 2619_2 2636 2636_1 2636_2 2639 2643 2669 2682 2683 2699 2717 2721 2727 2734 2743 2801 2825 358 42 56 705 813 925 graphs-AvantGarde graphs-Bookman graphs-ER graphs-Heawood graphs-Helvetica graphs-KW91 graphs-Latin1 graphs-NaN graphs-NewCenturySchlbk graphs-Palatino graphs-Petersen graphs-Symbol graphs-Times graphs-ZapfChancery graphs-ZapfDingbats graphs-a graphs-abstract graphs-alf graphs-arrows graphs-arrowsize graphs-awilliams graphs-b graphs-b102 graphs-b103 graphs-b106 graphs-b117 graphs-b123 graphs-b124 graphs-b135 graphs-b143 graphs-b145 graphs-b146 graphs-b15 graphs-b155 graphs-b22 graphs-b29 graphs-b3 graphs-b33 graphs-b34 graphs-b36 graphs-b491 graphs-b51 graphs-b53 graphs-b545 graphs-b56 graphs-b57 graphs-b58 graphs-b60 graphs-b62 graphs-b68 graphs-b69 graphs-b7 graphs-b71 graphs-b73 graphs-b73a graphs-b76 graphs-b77 graphs-b786 graphs-b79 graphs-b80 graphs-b80a graphs-b81 graphs-b85 graphs-b94 graphs-b993 graphs-bad graphs-badvoro graphs-big graphs-biglabel graphs-cairo graphs-center graphs-clover graphs-clust graphs-clust1 graphs-clust2 graphs-clust3 graphs-clust4 graphs-clust5 graphs-clusters graphs-clustlabel graphs-color graphs-colors graphs-colorscheme graphs-compound graphs-crazy graphs-ctext graphs-d graphs-dd graphs-dfa graphs-dir graphs-dpd graphs-edgeclip graphs-fdp graphs-fig6 graphs-flatedge graphs-fsm graphs-grammar graphs-grdangles graphs-grdcluster graphs-grdcolors graphs-grdfillcolor graphs-grdlinear graphs-grdlinear_angle graphs-grdlinear_node graphs-grdradial graphs-grdradial_angle graphs-grdradial_node graphs-grdshapes graphs-hashtable graphs-html graphs-html2 graphs-in graphs-inv_inv graphs-inv_nul graphs-inv_val graphs-japanese graphs-jcctree graphs-jsort graphs-labelclust-fbc graphs-labelclust-fbd graphs-labelclust-fbl graphs-labelclust-fbr graphs-labelclust-fdc graphs-labelclust-fdd graphs-labelclust-fdl graphs-labelclust-fdr graphs-labelclust-ftc graphs-labelclust-ftd graphs-labelclust-ftl graphs-labelclust-ftr graphs-labelclust-nbc graphs-labelclust-nbd graphs-labelclust-nbl graphs-labelclust-nbr graphs-labelclust-ndc graphs-labelclust-ndd graphs-labelclust-ndl graphs-labelclust-ndr graphs-labelclust-ntc graphs-labelclust-ntd graphs-labelclust-ntl graphs-labelclust-ntr graphs-labelroot-fbc graphs-labelroot-fbd graphs-labelroot-fbl graphs-labelroot-fbr graphs-labelroot-fdc graphs-labelroot-fdd graphs-labelroot-fdl graphs-labelroot-fdr graphs-labelroot-ftc graphs-labelroot-ftd graphs-labelroot-ftl graphs-labelroot-ftr graphs-labelroot-nbc graphs-labelroot-nbd graphs-labelroot-nbl graphs-labelroot-nbr graphs-labelroot-ndc graphs-labelroot-ndd graphs-labelroot-ndl graphs-labelroot-ndr graphs-labelroot-ntc graphs-labelroot-ntd graphs-labelroot-ntl graphs-labelroot-ntr graphs-layer graphs-layer2 graphs-layers graphs-ldbxtried graphs-longflat graphs-lsunix1 graphs-lsunix2 graphs-lsunix3 graphs-mike graphs-mode graphs-nestedclust graphs-newarrows graphs-ngk10_4 graphs-nhg graphs-nojustify graphs-nul_inv graphs-nul_nul graphs-nul_val graphs-ordering graphs-overlap graphs-p graphs-p2 graphs-p3 graphs-p4 graphs-pack graphs-pgram graphs-pm2way graphs-pmpipe graphs-polypoly graphs-ports graphs-proc3d graphs-process graphs-ps graphs-ps_user_shapes graphs-pslib graphs-radius graphs-rd_rules graphs-record graphs-record2 graphs-records graphs-root graphs-rootlabel graphs-rowcolsep graphs-rowe graphs-russian graphs-sb_box graphs-sb_box_dbl graphs-sb_circle graphs-sb_circle_dbl graphs-shapes graphs-shells graphs-sides graphs-size graphs-sl_box graphs-sl_box_dbl graphs-sl_circle graphs-sl_circle_dbl graphs-sq_rules graphs-sr_box graphs-sr_box_dbl graphs-sr_circle graphs-sr_circle_dbl graphs-st_box graphs-st_box_dbl graphs-st_circle graphs-st_circle_dbl graphs-states graphs-style graphs-train11 graphs-trapeziumlr graphs-tree graphs-triedds graphs-trivial graphs-try graphs-unix graphs-unix2 graphs-unix2k graphs-url graphs-user_shapes graphs-val_inv graphs-val_nul graphs-val_val graphs-viewfile graphs-viewport graphs-weight graphs-world graphs-xlabels graphs-xx linux.i386-ER linux.i386-b102 linux.i386-b106 linux.i386-b29 linux.i386-b36 linux.i386-crazy linux.i386-dfa linux.i386-hashtable linux.i386-radius_dot linux.i386-trivial_dot linux.x86-arrows_dot linux.x86-compound_dot linux.x86-dotsplines_dot linux.x86-dotsplines_dot1 linux.x86-edgeclip_dot linux.x86-flatedge_dot linux.x86-html2_dot linux.x86-html_dot linux.x86-neatosplines_neato linux.x86-neatosplines_neato1 linux.x86-nestedclust_dot linux.x86-ordering_dot linux.x86-ordering_dot1 linux.x86-overlap_neato linux.x86-overlap_neato1 linux.x86-pack_neato linux.x86-pack_neato1 linux.x86-pack_neato2 linux.x86-ports_dot linux.x86-radius_dot linux.x86-rankdir_dot linux.x86-rankdir_dot1 linux.x86-rankdir_dot2 linux.x86-record_dot linux.x86-root_circo linux.x86-root_twopi linux.x86-rowcolsep_dot linux.x86-rowcolsep_dot1 linux.x86-shapes_dot linux.x86-trivial_dot linux.x86-weight_dot macosx-arrows_dot macosx-compound_dot macosx-edgeclip_dot macosx-nestedclust_dot macosx-ordering_dot macosx-ordering_dot1 macosx-radius_dot macosx-rowcolsep_dot macosx-rowcolsep_dot1 macosx-trivial_dot negative-dpi nshare-arrows_dot nshare-compound_dot nshare-dotsplines_dot nshare-dotsplines_dot1 nshare-edgeclip_dot nshare-flatedge_dot nshare-html2_dot nshare-html_dot nshare-neatosplines_neato nshare-neatosplines_neato1 nshare-nestedclust_dot nshare-ordering_dot nshare-ordering_dot1 nshare-overlap_neato nshare-overlap_neato1 nshare-pack_neato nshare-pack_neato1 nshare-pack_neato2 nshare-ports_dot nshare-radius_dot nshare-rankdir_dot nshare-rankdir_dot1 nshare-rankdir_dot2 nshare-record_dot nshare-root_circo nshare-root_twopi nshare-rowcolsep_dot nshare-rowcolsep_dot1 nshare-shapes_dot nshare-trivial_dot nshare-weight_dot reference-test_reference-001.001 regression_tests-shapes-reference-Mcircle regression_tests-shapes-reference-Mdiamond regression_tests-shapes-reference-Msquare regression_tests-shapes-reference-assembly regression_tests-shapes-reference-box regression_tests-shapes-reference-box3d regression_tests-shapes-reference-cds regression_tests-shapes-reference-circle regression_tests-shapes-reference-component regression_tests-shapes-reference-cylinder regression_tests-shapes-reference-diamond regression_tests-shapes-reference-doublecircle regression_tests-shapes-reference-doubleoctagon regression_tests-shapes-reference-egg regression_tests-shapes-reference-ellipse regression_tests-shapes-reference-fivepoverhang regression_tests-shapes-reference-folder regression_tests-shapes-reference-hexagon regression_tests-shapes-reference-house regression_tests-shapes-reference-insulator regression_tests-shapes-reference-invhouse regression_tests-shapes-reference-invtrapezium regression_tests-shapes-reference-invtriangle regression_tests-shapes-reference-larrow regression_tests-shapes-reference-lpromoter regression_tests-shapes-reference-none regression_tests-shapes-reference-note regression_tests-shapes-reference-noverhang regression_tests-shapes-reference-octagon regression_tests-shapes-reference-oval regression_tests-shapes-reference-parallelogram regression_tests-shapes-reference-pentagon regression_tests-shapes-reference-plain regression_tests-shapes-reference-plaintext regression_tests-shapes-reference-point regression_tests-shapes-reference-polygon regression_tests-shapes-reference-primersite regression_tests-shapes-reference-promoter regression_tests-shapes-reference-proteasesite regression_tests-shapes-reference-proteinstab regression_tests-shapes-reference-rarrow regression_tests-shapes-reference-rect regression_tests-shapes-reference-rectangle regression_tests-shapes-reference-restrictionsite regression_tests-shapes-reference-ribosite regression_tests-shapes-reference-rnastab regression_tests-shapes-reference-rpromoter regression_tests-shapes-reference-septagon regression_tests-shapes-reference-signature regression_tests-shapes-reference-square regression_tests-shapes-reference-star regression_tests-shapes-reference-tab regression_tests-shapes-reference-terminator regression_tests-shapes-reference-threepoverhang regression_tests-shapes-reference-trapezium regression_tests-shapes-reference-triangle regression_tests-shapes-reference-tripleoctagon regression_tests-shapes-reference-underline regression_tests-shapes-reference-utr share-ER share-Heawood share-KW91 share-Latin1 share-NaN share-Petersen share-a1 share-a2 share-a3 share-abstract share-alf share-b102 share-b106 share-b124 share-b29 share-b36 share-b491 share-b51 share-b786 share-b94 share-clust share-clust1 share-clust2 share-clust3 share-clust4 share-clust5 share-crazy share-ctext share-dfa share-fig6 share-flatedge share-fsm share-grammar share-hashtable share-jcctree share-jsort share-labelclust-fbc share-labelclust-fbd share-labelclust-fbl share-labelclust-fbr share-labelclust-fdc share-labelclust-fdd share-labelclust-fdl share-labelclust-fdr share-labelclust-ftc share-labelclust-ftd share-labelclust-ftl share-labelclust-ftr share-labelclust-nbc share-labelclust-nbd share-labelclust-nbl share-labelclust-nbr share-labelclust-ndc share-labelclust-ndd share-labelclust-ndl share-labelclust-ndr share-labelclust-ntc share-labelclust-ntd share-labelclust-ntl share-labelclust-ntr share-labelroot-fbc share-labelroot-fbd share-labelroot-fbl share-labelroot-fbr share-labelroot-fdc share-labelroot-fdd share-labelroot-fdl share-labelroot-fdr share-labelroot-ftc share-labelroot-ftd share-labelroot-ftl share-labelroot-ftr share-labelroot-nbc share-labelroot-nbd share-labelroot-nbl share-labelroot-nbr share-labelroot-ndc share-labelroot-ndd share-labelroot-ndl share-labelroot-ndr share-labelroot-ntc share-labelroot-ntd share-labelroot-ntl share-labelroot-ntr share-ldbxtried share-longflat share-mike share-newarrows share-ngk10_4 share-nhg share-pgram share-pm2way share-pmpipe share-polypoly share-proc3d share-process share-record2 share-records share-rowe share-shells share-states share-structs share-train11 share-trapeziumlr share-tree share-triedds share-try share-unix share-unix2 share-unix2k share-viewfile share-world usershape windows-ER windows-Heawood windows-KW91 windows-Latin1 windows-NaN windows-Petersen windows-abstract windows-alf windows-b102 windows-b106 windows-b124 windows-b29 windows-b36 windows-b491 windows-b51 windows-b94 windows-clust windows-clust1 windows-clust2 windows-clust3 windows-clust4 windows-clust5 windows-crazy windows-ctext windows-dfa windows-fig6 windows-fsm windows-grammar windows-hashtable windows-jcctree windows-jsort windows-labelclust-fbc windows-labelclust-fbd windows-labelclust-fbl windows-labelclust-fbr windows-labelclust-fdc windows-labelclust-fdd windows-labelclust-fdl windows-labelclust-fdr windows-labelclust-ftc windows-labelclust-ftd windows-labelclust-ftl windows-labelclust-ftr windows-labelclust-nbc windows-labelclust-nbd windows-labelclust-nbl windows-labelclust-nbr windows-labelclust-ndc windows-labelclust-ndd windows-labelclust-ndl windows-labelclust-ndr windows-labelclust-ntc windows-labelclust-ntd windows-labelclust-ntl windows-labelclust-ntr windows-labelroot-fbc windows-labelroot-fbd windows-labelroot-fbl windows-labelroot-fbr windows-labelroot-fdc windows-labelroot-fdd windows-labelroot-fdl windows-labelroot-fdr windows-labelroot-ftc windows-labelroot-ftd windows-labelroot-ftl windows-labelroot-ftr windows-labelroot-nbc windows-labelroot-nbd windows-labelroot-nbl windows-labelroot-nbr windows-labelroot-ndc windows-labelroot-ndd windows-labelroot-ndl windows-labelroot-ndr windows-labelroot-ntc windows-labelroot-ntd windows-labelroot-ntl windows-labelroot-ntr windows-ldbxtried windows-longflat windows-mike windows-newarrows windows-ngk10_4 windows-nhg windows-pgram windows-pm2way windows-pmpipe windows-polypoly windows-proc3d windows-process windows-radius_dot windows-record2 windows-records windows-rowe windows-shells windows-states windows-structs windows-train11 windows-trapeziumlr windows-tree windows-triedds windows-trivial_dot windows-try windows-unix windows-unix2 windows-unix2k windows-viewfile windows-world

Accepted deltas (19) — 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
2470structural-match8.00A4maxΔ ~8pt; element tree identical, same init_rank/pathplan recovery family as 2471known-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
graphs-structsdiverged0.00A4maxΔ 0; element-tree difference only (the oracle's lost struct1->struct3)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
2620structural-match585.00A8423 diffs / maxΔ 585 on 24 edge paths + 22 arrowheadsknown-divergences.md#a8-fp-contractfma-rounding-vs-strict-ieee-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: ~/git/graphviz/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: ~/git/graphviz/tests/imagepath_test/base.gv: syntax error in line 8 near ']'
share-b545share/b545.gvError: ~/git/graphviz/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.