twopi parity dashboard
Differential survey of @knowvah/dot-engine twopi xdot output vs the native dot -K twopi -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 twopi && npx tsx test/corpus/parity-report.ts.
Summary
- Surveyed: 910 (generated 2026-08-01T00:38:08.731Z)
- pass: 893 (98.1%) · diverged (tracked): 0 · accepted (documented, won't-fix): 16
- oracle-error: 0 · port-error: 0 · timeout: 1
Accepted deltas (16) — 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 | 842 | A1 | 842 xdot draw-op diffs; whole radial layout is the exact x-axis mirror of the oracle's (y->-y, ring relabel k<->34-k), max node displacement 6.04pt. Mechanism: 1-ULP V8-vs-libm cos/sin in circleLayout setAbsolutePos, amplified by the symmetry-unstable PRISM overlap-removal equilibrium on the cocircular star. Injection A/B: feeding C's exact circleLayout pos into the port's PRISM reproduces the oracle node-for-node (3e-14). | known-divergences.md#a1-twopi-arrows-family |
graphs-arrows | 40 | A1 | 32 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 | known-divergences.md#a1-twopi-arrows-family |
graphs-arrowsize | 72 | A1 | 64 draw-op diffs on edge Z->I; first diff unfilled_bezier[0]: 289.55 vs 297.2 (position drift, not a ptCount flip, but same pre-routing mechanism) | known-divergences.md#a1-twopi-arrows-family |
graphs-newarrows | 40 | A1 | 32 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 (same graph family as graphs-arrows) | known-divergences.md#a1-twopi-arrows-family |
linux.x86-arrows_dot | 40 | A1 | 32 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 (arrows_dot variant of graphs-arrows) | known-divergences.md#a1-twopi-arrows-family |
macosx-arrows_dot | 40 | A1 | 32 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 (arrows_dot variant of graphs-arrows) | known-divergences.md#a1-twopi-arrows-family |
nshare-arrows_dot | 40 | A1 | 25 draw-op diffs on edge i->Z; first diff unfilled_bezier[0]: 265.18 vs 313.93 (position drift, not a ptCount flip, but same pre-routing mechanism) | known-divergences.md#a1-twopi-arrows-family |
share-newarrows | 20 | A1 | 12 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 (newarrows variant of graphs-newarrows) | known-divergences.md#a1-twopi-arrows-family |
tree-graphs-directed-oldarrows | 40 | A1 | 40 draw-op diffs confined to the mirrored radial edge pair Z->I / i->Z, which swap straight (8-coord) vs routed (14-coord) splines; node positions and every other edge conformant. Injection A/B 2026-07-28: oracle pre-routing ND_pos injected into the port -> 0 diffs, routing/emission exonerated (attribution-twopi.json). Refined flip site: with i-Z-I collinear on a ring diameter, pathplan directVis's intersect() treats the segment as blocked when a third node's axis vertex x falls strictly inside the ULP-wide (tail.x, head.x) interval (wind's 1e-4 tolerance makes 270pt-distant vertices 'collinear', and inBetween then tests ONLY the x projection) - so the straight/curved choice per side hinges on the last-ULP ordering of three nominally equal x coordinates out of PRISM's solve. Verified by replicating directVis offline on both sides' dumped obstacle sets: each reproduces its own side's decision exactly. | known-divergences.md#a1-twopi-arrows-family |
windows-newarrows | 20 | A1 | 12 draw-op diffs, all on edge Z->I; unfilled_bezier[ptCount]: 8 vs 14 (newarrows variant of graphs-newarrows) | known-divergences.md#a1-twopi-arrows-family |
2239 | 2 | A9 | 1 draw-op diff; edge label ldraw text[1]: 183.86 vs 173.06 | known-divergences.md#a9-engine-track-twopi-circo |
241_0 | 6 | A9 | 6 draw-op diffs; edge 1->6 routed as a 14-pt multispline corridor (port) vs the native plain per-member fallback (8-pt), point deltas <0.07pt. CDT cocircular incircle tie flipped by libm sin/cos 1-ULP — sibling of the accepted circo/241_0 entry. | known-divergences.md#a9-engine-track-twopi-circo |
2470 | 596 | A9 | 298 draw-op diffs, ALL edge-label ldraw text positions (HTML <td align=left>LOOKBACK labels); every diff = one xlabel candidate step (+label width x, -16.8 line-height y). Splines/nodes/bboxes bit-identical to oracle (0 draw/pos/bb diffs even @1e-7). Mechanism: ~140 near-coincident HTML edge-label anchors are placed by the neato-family xlabel placer (postproc.c:addXLabels -> label/xlabels.c). Patient-zero seq=8: node ND_coord.y differs 1.3e-13 (~2 ULP, twopi radial libm sin/cos vs V8 Math) while ND_height/sz.y/2 are bit-identical; floor(coord.y - sz.y/2) straddles exactly 0, flipping objplpmks rect y-low -1<->0 -> Hilbert key -> R-tree insertion order -> node grouping (C root 19 branches vs port 22) -> RTreeSearch pruning -> xlabel candidate flip. xladjust/AGSEQ order/CombineRect(min-min quirk)/PickBranch u64/int32 Hilbert key all faithful. No deterministic rewrite reproduces the libm coordinate. Same class as twopi/1855 and the b29 placeLabels-tie A9 family. Full RCA: .agent-notes/twopi-2470-rca.md. | known-divergences.md#a9-engine-track-twopi-circo |
graphs-b29 | 2 | A9 | 1 draw-op diff; edge label ldraw text[1]: 368.1 vs 356.1 (same knife-edge previously accepted for share-b29/windows-b29; variants swapped when polylineMidpoint gained the faithful fmadd contraction - anchor now bit-identical to C, flip is a placeLabels tie on 1-ULP-drifted surrounding objects) | known-divergences.md#a9-engine-track-twopi-circo |
linux.i386-b29 | 2 | A9 | 1 draw-op diff; edge label ldraw text[1]: 368.1 vs 356.1 (identical mechanism to graphs-b29) | known-divergences.md#a9-engine-track-twopi-circo |
tree-graphs-directed-arrows | 6 | A9 | 6 draw-op diffs, ALL edge-label placement on 2 of ~50 labelled edges: lcrow->lcrowlcrow lp/ldraw text by (+22.77 x, -12.00 y) and onormal->onormalonormal by (-12.00 y). Each delta is exactly ONE xlabel candidate step - 22.77 = half the 45.54pt label width, 12.00 = 1.2 x fontsize 10 line height (cf. 2470 16.8 at fontsize 14). Label WIDTH field identical (45.54) on both sides and zero node/spline/bbox diffs in 54KB of xdot, so layout is unchanged and only the candidate choice flips. Knife edge DEMONSTRATED 2026-07-30: nudging the point-node width by 0.0001in (0.0072pt) flips the port OWN placement onto the oracle candidate (695.22,360.51 vs oracle 695.21,360.51), so the placement algorithm agrees and only the boundary side differs. | known-divergences.md#a9-engine-track-twopi-circo |
Diverged (0)
(none)
Errors and timeouts (1)
| id | status | message |
|---|---|---|
2222 | timeout | ran 14400034ms, exceeded 14400000ms budget |
oracle errors: 8 native-crash (documented, excluded) / 0 timeout-flake (excluded this run, note to retry) Passing ids (893) are omitted for brevity — the full roster is in parity-twopi.json.