osage parity dashboard
Differential survey of graphviz-ts osage xdot output vs the native dot -K osage -Txdot oracle over the dot-track SVG-conformant corpus set (semantic draw-op comparison at ±0.01 — see test/golden/compare-xdot.ts; per docs/conformance.md, not byte equality). Regenerate: npx tsx test/corpus/engine-walk.ts osage && npx tsx test/corpus/parity-report.ts.
Summary
- Surveyed: 761 (generated 2026-07-15T00:41:06.303Z)
- pass: 750 (98.6%) · diverged (tracked): 0 · accepted (documented, won't-fix): 6
- oracle-error: 5 · port-error: 0 · timeout: 0
Accepted deltas (6) — documented, not chased
Deliberate, root-caused differences we have chosen not to make conformant. Source of truth: test/corpus/accepted-divergences-engines.json; rationale in Known divergences. Excluded from the diverged table below.
| id | #diffs | class | bound | ref |
|---|---|---|---|---|
1855 | 110 | A9 | 110 xdot draw-op diffs = 3 obstacle-routed edges (6->1 B10, 16->1 B7, 30->1 B10) routed on the mirror side of the node row; X bit-exact, Y mirrored (6->1 429.120 vs 385.608). Node centers already bit-exact. Mechanism: octagon obstacle vertices (circumscribed_polygon_corner_about_ellipse) differ 3-4 ULP from C because clang -ffp-contract=on fuses the a*b+-c chains in ellipse_tangent_slope/line_intersection while V8 rounds each op; C's fused rounding collapses a gutter column of corner-x to one bit-exact double (exact collinearity), the port's splits it into two, flipping the visibility clear() tangency test so the gutter is no longer blocked -> ~20 extra visibility edges -> Dijkstra resolves the up/down homotopy tie to the mirror side. cos/sin injection is a no-op; C-obstacle injection A/B -> 0 diffs. Full RCA: .agent-notes/osage-spline-family-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
graphs-polypoly | 24 | A9 | Rigid pack-cell swap of the 9000-series distorted-quad components (whole-node ±(182,338)/±2909 translations; <=24 draw-op diffs per id, no shape/routing error). Mechanism: bare transcendental cos(pi+theta) — V8 Math.cos is correctly rounded while Apple libm's cos carries a 1-ULP argument-dependent error, so |cos(pi+theta)| != |cos(theta)| only under libm; the 1-ULP size delta feeds pack GRID ceil, tips a perimeter tie, and qsort swaps two components' cells. No deterministic rewrite reproduces a non-correctly-rounded libm transcendental. osage only. Full RCA: .agent-notes/patchwork-tail-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
linux.i386-b29 | 3 | A9 | 2 draw-op diffs; edge Node14663->Node14649 label ldraw text x-anchor 878.28 (port) vs 841.06 (oracle) on both label lines. Edge spline (B 4 1040.15 72 ... 679.18 72) and arrowhead tdraw are BIT-IDENTICAL; only the label anchor differs, placed symmetrically about the bit-identical spline midpoint ~859.67 (±18.6 = half the label width). Same placeLabels knife-edge accepted for twopi/graphs-b29: a 1-ULP drift in the surrounding objects tips a label-side tie. share-b29 is the mirror (841.06 vs 878.28). 2 diffs in a 136 KB graph, every other label bit-matches. Full RCA: .agent-notes/osage-small-tail-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
share-b29 | 3 | A9 | 2 draw-op diffs; mirror of linux.i386-b29 (label anchor 841.06 vs 878.28) — same placeLabels knife-edge tie; edge spline + arrowhead bit-identical, all other labels match. | known-divergences.md#a9-engine-track-twopi-circo |
share-polypoly | 12 | A9 | Rigid pack-cell swap of the 9000-series distorted-quad components (whole-node ±(182,338)/±2909 translations; <=24 draw-op diffs per id, no shape/routing error). Mechanism: bare transcendental cos(pi+theta) — V8 Math.cos is correctly rounded while Apple libm's cos carries a 1-ULP argument-dependent error, so |cos(pi+theta)| != |cos(theta)| only under libm; the 1-ULP size delta feeds pack GRID ceil, tips a perimeter tie, and qsort swaps two components' cells. No deterministic rewrite reproduces a non-correctly-rounded libm transcendental. osage only. Full RCA: .agent-notes/patchwork-tail-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
windows-polypoly | 12 | A9 | Rigid pack-cell swap of the 9000-series distorted-quad components (whole-node ±(182,338)/±2909 translations; <=24 draw-op diffs per id, no shape/routing error). Mechanism: bare transcendental cos(pi+theta) — V8 Math.cos is correctly rounded while Apple libm's cos carries a 1-ULP argument-dependent error, so |cos(pi+theta)| != |cos(theta)| only under libm; the 1-ULP size delta feeds pack GRID ceil, tips a perimeter tie, and qsort swaps two components' cells. No deterministic rewrite reproduces a non-correctly-rounded libm transcendental. osage only. Full RCA: .agent-notes/patchwork-tail-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
Diverged (0)
(none)
Errors and timeouts (5)
| id | status | message |
|---|---|---|
1879 | oracle-error | Command failed: /Users/scottseely/git/graphviz/build/cmd/dot/dot -K osage -Txdot /Users/scottseely/git/graphviz/tests/1879.dot |
2516 | oracle-error | Command failed: /Users/scottseely/git/graphviz/build/cmd/dot/dot -K osage -Txdot /Users/scottseely/git/graphviz/tests/2516.dot |
2619 | oracle-error | Command failed: /Users/scottseely/git/graphviz/build/cmd/dot/dot -K osage -Txdot /Users/scottseely/git/graphviz/tests/2619.dot |
2619_1 | oracle-error | Command failed: /Users/scottseely/git/graphviz/build/cmd/dot/dot -K osage -Txdot /Users/scottseely/git/graphviz/tests/2619_1.dot |
2619_2 | oracle-error | Command failed: /Users/scottseely/git/graphviz/build/cmd/dot/dot -K osage -Txdot /Users/scottseely/git/graphviz/tests/2619_2.dot |
oracle errors: 5 native-crash (documented, excluded) / 0 timeout-flake (excluded this run, note to retry) Passing ids (750) are omitted for brevity — the full roster is in parity-osage.json.