Skip to content

circo json parity dashboard

Differential survey of @knowvah/dot-engine circo json output vs the native dot -K circo oracle (test/corpus/json-walk.ts), semantic comparison per docs/conformance.md (±0.01 deterministic tolerance, ±0.5 for the iterative engines). Regenerate: npx tsx test/corpus/json-walk.ts circo && npx tsx test/corpus/parity-report.ts.

Summary

  • Surveyed: 762
  • pass: 750 (98.4%) · diverged (tracked): 0 · accepted (documented, won't-fix): 6
  • errors (oracle/port/timeout, excluded from scoring): 6

Diverged (0)

(none)

Accepted (6) — documented, not chased

id#diffsfirstDiffreason
2095_12197edge:1083->1084#0/_draw_/op[1].b[0]A1 irreducible (proven by injection A/B 2026-07-24): circo getRotation's closest-node selection (circpos.c:79-91) is an exact-tie knife edge for this graph's three copies of a symmetric 5-node block — the cut vertex and its mirror node are equidistant from the rotated origin in real arithmetic. V8's trig chain yields an exact FP tie (both 1.9333108975227196) so strict < keeps the neighbor (rot=0); Apple libm gives the neighbor +1 ULP so the mirror wins (rot 0.15/0.09/0.03 rad), rigidly rotating 3 blocks / 55 nodes by up to 5.2deg / 66pt. Injecting libm's ~2-ULP y asymmetry into just the 3 cut vertices makes the port match the oracle EXACTLY (2197 diffs -> 0 at 0.01): every port stage downstream is exonerated. Same class as the twopi 1855 radial mirror.
241_041edge:1->2#0/_draw_/op[1].b[1]layout drift inherited from the circo xdot engine track: id diverged there with the documented accepted mechanism (iterative drift / engine tail classes, engine registry + decision journal); json re-emits the same layout. Journal 2026-07-24.
2475_2989edge:590_174423->590_174412#0/_draw_/op[1].b[0]layout drift inherited from the circo xdot engine track: id diverged there with the documented accepted mechanism (iterative drift / engine tail classes, engine registry + decision journal); json re-emits the same layout. Journal 2026-07-24.
share-Latin11node:a/labelInput is Latin-1 with NO charset declaration, so the bytes are invalid UTF-8. Native dot's -Tjson then emits a MIXED-ENCODING document: attribute values (e.g. node label) are echoed as RAW Latin-1 bytes (0xe1 0xe2 ... unconverted), while the DRAWN label text (ldraw T op, via make_label) is UTF-8 (0xc3 0xa1 ...). No single decode reads both halves correctly: Latin-1 recovers the attribute but mojibakes the text, UTF-8 does the reverse (and the attribute bytes are not valid UTF-8). The port decodes the input once (utils.c latin1ToUTF8 fallback) and is internally consistent valid UTF-8 on BOTH surfaces, so it cannot reproduce the oracle's split encoding. A4 class: the oracle output is an encoding bug; the port declines to emit invalid/mixed-encoding JSON. The DECLARED charset=latin1 case (graphs-Latin1/b60) IS handled via the stoj double-encode fix; only the UNDECLARED-charset case is irreducible.
windows-Latin11node:a/labelIdentical mechanism to share-Latin1: undeclared-charset Latin-1 input makes native -Tjson emit raw-Latin-1 attribute bytes alongside UTF-8 drawn text (mixed, invalid). The port's consistent-UTF-8 output cannot match both halves. A4 class.
windows-tree10edge:node2->node8#0/_draw_/op[1].b[5]layout drift inherited from the circo xdot engine track: id diverged there with the documented accepted mechanism (iterative drift / engine tail classes, engine registry + decision journal); json re-emits the same layout. Journal 2026-07-24.

Errors and timeouts (6)

idmessage
1447oracle exit null
1652oracle exit null
1880oracle exit null
2108oracle exit null
2222oracle exit null
graphs-b103oracle exit null

Passing ids (750) are omitted for brevity — the full roster is in json-parity-circo.json.