twopi plain/plain-ext parity dashboard
Differential survey of @knowvah/dot-engine twopi plain/plain-ext output vs the native dot -K twopi oracle (test/corpus/plain-walk.ts), semantic comparison per docs/conformance.md (±0.01 deterministic tolerance, ±0.5 for the iterative engines). Regenerate: npx tsx test/corpus/plain-walk.ts twopi && npx tsx test/corpus/parity-report.ts.
Summary
- Surveyed: 762
- pass: 731 (95.9%) · diverged (tracked): 0 · accepted (documented, won't-fix): 21
- errors (oracle/port/timeout, excluded from scoring): 10
Diverged (0)
(none)
Accepted (21) — documented, not chased
| id | #diffs | firstDiff | reason |
|---|---|---|---|
1855 | 200 | [node] 1/y: port=3.9982 native=3.9853; [node] 10/x: port=5.4496 native=5.4665; [node] 11/x: port=4.2919 native=4.3084; [node] 11/y: port=7.4968 native=7.48; [node] 12/x: port=3.1333 native=3.1506 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
2239 | 1 | [edge] srtpdec1_0x5641244e6b50_rtcp_src_0x7f06a000ebd0->_proxypad10_0x5641244e58c0#0/ly: port=2.5912 native=2.4412 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
241_0 | 1 | [edge] 1->6#0/pointCount: port=7 native=4 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
2470 | 298 | [edge] n13->n12#0/lx: port=101.52 native=100.44; [edge] n13->n12#0/ly: port=9.1604 native=9.3937; [edge] n135->n101#0/ly: port=7.9819 native=8.2152; [edge] n135->n102#0/ly: port=7.9303 native=8.1636; [edge] n135->n103#0/lx: port=97.685 native=96.604 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
graphs-arrows | 7 | [edge] i->Z#0/point[0].x: port=3.683 native=4.3602; [edge] i->Z#0/point[1].x: port=3.6589 native=4.3842; [edge] i->Z#0/point[2].x: port=3.6384 native=4.4047; [edge] i->Z#0/point[3].x: port=3.6239 native=4.4193; [edge] i->Z#0/point[4].x: port=3.11 native=4.9332 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
graphs-arrowsize | 16 | [edge] Z->I#0/point[0].x: port=4.0216 native=4.1278; [edge] Z->I#0/point[0].y: port=4.2709 native=4.2512; [edge] Z->I#0/point[1].x: port=4.0216 native=4.3433; [edge] Z->I#0/point[1].y: port=4.8152 native=4.7564; [edge] Z->I#0/point[2].x: port=4.0216 native=4.7935 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
graphs-b29 | 1 | [edge] Node14732->Node14731#0/ly: port=5.1542 native=4.9876 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
graphs-b34 | 1 | [node] 7/label: port=montañas native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
graphs-b56 | 6 | [node] Schluesseloel/label: port=Schluesselöl native=6; [node] Schluesseltraeger/label: port=Schlueßelträger native=6; [node] Torschluessel/label: port=Torschlüssel native=6; [node] Torwaechter/label: port=Torwächter native=6; [node] creation/label: port=<f0>genPräfix|<f1>legennStamm|<f2>heitnSuffix native=<f0>genPr�fix|<f1>legennStamm|<f2>heitnSuffix | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
graphs-b60 | 5 | [node] 0/label: port=XXXrôôôôôôôôôôôôôôleXXX native=solid; [node] 0/style: port=solid native=ellipse; [node] 0/shape: port=ellipse native=black; [node] 0/color: port=black native=lightgrey; [node] 0/fillcolor: port=lightgrey native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
graphs-Latin1 | 1 | [node] a/label: port=áâãäåæçèéêëìíîïðñòóôõöøùúûü native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
graphs-newarrows | 2 | [edge] Z->I#0/pointCount: port=4 native=7; [edge] i->Z#0/pointCount: port=7 native=4 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
graphs-Symbol | 10 | [node] greek/label: port=αβγδεζηθικλμνξοπρςστυφχψωϒϖ native=solid; [node] greek/style: port=solid native=ellipse; [node] greek/shape: port=ellipse native=black; [node] greek/color: port=black native=lightgrey; [node] greek/fillcolor: port=lightgrey native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
linux.i386-b29 | 1 | [edge] Node14732->Node14731#0/ly: port=5.1542 native=4.9876 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
linux.x86-arrows_dot | 2 | [edge] Z->I#0/pointCount: port=4 native=7; [edge] i->Z#0/pointCount: port=7 native=4 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
macosx-arrows_dot | 7 | [edge] i->Z#0/point[0].x: port=3.683 native=4.3602; [edge] i->Z#0/point[1].x: port=3.6589 native=4.3842; [edge] i->Z#0/point[2].x: port=3.6384 native=4.4047; [edge] i->Z#0/point[3].x: port=3.6239 native=4.4193; [edge] i->Z#0/point[4].x: port=3.11 native=4.9332 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
nshare-arrows_dot | 2 | [edge] Z->I#0/pointCount: port=4 native=7; [edge] i->Z#0/pointCount: port=7 native=4 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
share-Latin1 | 5 | [node] a/label: port=áâãäåæçèéêëìíîïðñòóôõöøùúûü native=solid; [node] a/style: port=solid native=ellipse; [node] a/shape: port=ellipse native=black; [node] a/color: port=black native=lightgrey; [node] a/fillcolor: port=lightgrey native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
share-newarrows | 2 | [edge] Z->I#0/pointCount: port=4 native=7; [edge] i->Z#0/pointCount: port=7 native=4 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
windows-Latin1 | 5 | [node] a/label: port=áâãäåæçèéêëìíîïðñòóôõöøùúûü native=solid; [node] a/style: port=solid native=ellipse; [node] a/shape: port=ellipse native=black; [node] a/color: port=black native=lightgrey; [node] a/fillcolor: port=lightgrey native= | oracle bug (A4): canon() use-after-free — output.c:103-108 agstrfree()s the agstrdup-ed refstr before the caller prints it, and _agstrcanon returns that pointer whenever no quoting is needed. Labels whose text is not otherwise pooled (latin1/entity-converted, differs from the raw attr bytes) hit refcnt 0 and are freed; the intervening printdouble allocations reuse the block, so native prints garbage/empty. Port prints the correct converted text. Journal 2026-07-24. |
windows-newarrows | 7 | [edge] i->Z#0/point[0].x: port=3.7887 native=4.2544; [edge] i->Z#0/point[1].x: port=3.7214 native=4.3217; [edge] i->Z#0/point[2].x: port=3.6572 native=4.386; [edge] i->Z#0/point[3].x: port=3.6239 native=4.4193; [edge] i->Z#0/point[4].x: port=3.11 native=4.9332 | layout geometry inherited from the twopi xdot engine track: id already diverged there with an accepted mechanism (engine acceptance registry / decision journal); plain re-emits the same layout. Journal 2026-07-24. |
Errors and timeouts (10)
Passing ids (731) are omitted for brevity — the full roster is in plain-parity-twopi.json.