Skip to content

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 24 Jul 12:04
· 67 commits to main since this release
9bc9167

1.0.0 (2026-07-24)

Bug Fixes

  • acyclic: iterative back-edge DFS for browser-safe deep chains (88ff118)
  • api: preserve low-level render as renderWithContext (T9) (514053c)
  • arrows: reproduce arrow_gen EPSILON normalization (byte parity) (213ee10)
  • attrs: apply edge[...] defaults to edges (incl. subgraph scope + order) (3c9d7e6)
  • attrs: node[...] defaults inside a subgraph apply to nodes declared there (109d454)
  • B1: re-baseline edge-route unit tests to un-normalized x-frame (1d7c1e9)
  • batch-11: correct rendering pipeline defaults and SVG normalization (4b881c2)
  • bb: compute_bb must expand over edge splines and edge labels (29d4f0b)
  • cdt: correct splay not-found reassembly for DT_OSET iteration order (0efe2f5)
  • cdt: match CDT Dtobag equal-key order in DtBag (bagInsert) (3dd6c64)
  • circo: block-tree child positioning per C circpos (bcd842e)
  • circo: create derived edges in C's per-tail agfstout seq order (7c685b2)
  • circo: create root graph label before layout (904f3ea)
  • circo: edge labels + dotneato_postprocess (d03d538)
  • circo: faithful block skeleton, spanning DFS, and crossing count (2b0c1e5)
  • circo: inch-space radius, C pipeline, and ID-ordered iteration (3dc46bc)
  • circo: record clipping, packed-bb refresh, equal-radius test (80e5004)
  • circo: walk bcc dfs edges in agfstedge order (cda28cc)
  • classify: label vnode lw uses root nodesep not subgraph (d20df4d)
  • cluster-label: read labeljust + inherit labelloc/labeljust (8b22ac2)
  • cluster: drop agdelete-emptied clusters before expansion (D2) (99e17d3)
  • cluster: drop agdeleted node's edges from cluster (defect C) (58eed09)
  • cluster: inherit all graph attributes (color/fill/pen/bgcolor) to clusters (b13b319)
  • cluster: inherit graph-level style (bold/dashed/rounded/filled) to clusters (34399ca)
  • cluster: match C ldbxtried cluster x-layout via interclexp edge order (20aa305)
  • cluster: order-correct label/font inheritance for subgraphs (b854eb0)
  • cluster: prune foreign nodes in markClusters + fixed-rl skeleton (B1) (c923f1a)
  • cluster: prune sibling-owned nodes in node_induce (defect D) (18fc1e5)
  • cluster: reserve LR rank room for cluster labels (adjustRanks flip) (d3cb57f)
  • color: canonicalize render colors like gvrender_resolve_color (3b91fa3), closes #rrggbb #abcc28 #abcc29
  • common: align text metrics with graphviz reference output (5214c2e)
  • common: complete truncated Courier/Consolas width LUTs; faithful Nunito italic (3309a9a)
  • common: fmadd-contract polylineMidpoint interpolation (states x3) (08d57bc)
  • common: gv_nodesize INCH2PS round-trip (graphs-b106 osage xlabels) (8e911d7), closes #25
  • common: quantise text widths to FreeType's 96 dpi pixel grid (022e6e3)
  • compass-port: skip ray-cast for box shapes (exact bbox corner) (b1a764d)
  • compound: drop non-faithful findVertical/findHorizontal base case (edfc70a)
  • conc: alias the cluster rank window, don't slice a copy (6b7c5a7)
  • corpus: namespace oracle cache per oracle; correct rules survey (c2a2f4c)
  • corpus: reconcile json+map track blocks in parity-report (dce8f24)
  • corpus: rescue 1652 — restore floor invariant + LPT survey dispatch (0a5e45e)
  • corpus: scale oracle render cap with slowest canonical native (6cc3d2a)
  • curved: route 2-cycle as one cnt=2 group, matching native C (0c57b0b)
  • dashboard: default missing verdict counts to 0 (4485c60)
  • dashboard: escape raw </> in free-text PARITY.md cells (f169064)
  • docs: playground editor dark-mode token colors (d2f7598)
  • docs: render mermaid diagrams via vitepress-plugin-mermaid (aed78ae)
  • docs: rewrite ../../plans links to GitHub blob in parity.md (ef34687)
  • dot: 1949 flat-label flip + adjacent-flat grouping (fb7fd5d)
  • dot: add missing fastgr helper (untracked from T32) (d9acdcc)
  • dot: anchor bottom rank at rank[maxr].ht1, not root GD_ht1 (05bee2d)
  • dot: apply GD_flip axis swap in updateBB label bbox growth (0890833)
  • dot: chain dyna-ports, checkpath stale count, record rankdir clip (ceb2c1b)
  • dot: clamp edge routing corridor to cluster boundaries (cl_bound) (0288b3d)
  • dot: clip multi-rank back edges as forward spline + swapSpline (e7947d3)
  • dot: cluster layout fixes for rank, mincross, and position (5b1bfb8)
  • dot: drop flat edges between adjacent record nodes (#1323) (6230218)
  • dot: expand graph bb for chain/long-edge splines (no right-clip) (ce9559c)
  • dot: follow C through dot_position/rebuild_vlists failure (95d945c)
  • dot: forward-normalize flat-adj lead edge (makefwdedge, dotsplines.c:1502) (23734d2)
  • dot: gate transpose crossing counts per C (mincross.c:646) (8022faf)
  • dot: honor edge weight attr in dotInitEdge (45815d1)
  • dot: honor ranksep and nodesep graph attributes (b2cae06)
  • dot: inherit cluster label into nested subclusters (93c3c8e)
  • dot: inherit compound attr on pack-branch component graphs (b77952f)
  • dot: iterate subgraph nodes in AGSEQ order at agfstnode sites (F7) (264484f)
  • dot: lane order + flat-adjacent guard — closes NaN edge-endpoint residual (bf57b24), closes #1949
  • dot: medians resets mval unconditionally per pass (mincross.c:1643) (3d4b121)
  • dot: merge 2-cycle back-edge instead of duplicating it (c8781c5)
  • dot: port routesplines lost-edge failure path — 1332 count parity (d1ce135)
  • dot: propagate dotMincross failure to skip dotPosition (F8) (eb8cb97)
  • dot: re-land ufUnion ND_id tie-break faithfulness (F4) (5cc7c6b)
  • dot: resolve flat rank table and has_labels from the right graph (f7d40d9)
  • dot: resolve setlinewidth(N) for arrowhead penwidth geometry (2cbd992)
  • dot: route flat adjacent side-port edges under dir=both/back (da74600), closes #241_0
  • dot: shift cluster rank state with abomination's +1 renumber (1b01770)
  • edge-label: run neato addXLabels in C's pre-translate frame (1e7515d)
  • edge-routing: correct elen and arrowDir for bold/back edges (09a8f1a)
  • edges: clip edge spline to the endpoint node's pen width (93b7dde)
  • edges: undirected edges draw no arrowhead, route to boundary (f4f9dc6)
  • emit: port node_in_box clip gate and GD_bb-faithful bb (2825) (e1a915d)
  • F1: port rec_reset_vlists call in flat_edges (flat.c:333) (f0e28a6)
  • F2: group penalty matches same-group endpoints; CL_CROSS=1000 (7ec6555)
  • F3: continue Pshortestpath on partial triangulation like C (1aa0712)
  • fdp: inject oracle bb; fdp derives GD_bb before the hook (8d0db41)
  • flat: clone node-default snapshot so aux nodes inherit fontsize (69dc0e2), closes #1949 #1949 #1879 #1949
  • flat: flip-aware clone orientation in make_flat_adj_edges (480b34a)
  • flat: forward-clip + swapSpline for adjacent no-port flat edges (35e6dae)
  • flat: group adjacent flats into one aux call; STOP on 2nd divergence (1a26327)
  • flat: mark to_virt chain in checkFlatAdjacent so adjacency survives (0638013)
  • flat: merge opposing flat edges and fix abomination rank parity (70a9359)
  • flat: only NORMAL/labeled-virtual nodes block flat adjacency (f3513aa)
  • flat: recover back-edge head arrow in copyFlatArrow (#241_0) (5440256), closes #241_0
  • flat: resolve adjacency via to_virt rep for cross-cluster flats (217e541)
  • flat: route non-adjacent flat edges through the make_flat_edge corridor (8041db5)
  • flat: swap ports in makeFwdEdge so back edges curl (closes #241_0) (5f15c81), closes #241_0 #241_0
  • font: translate PostScript font names to SVG font-family (20eaf19)
  • GF-A: dispatch neato overlap removal by mode, not always VPSC (74da840)
  • gvc: round exact ties half-to-even in printDouble (a3a6694)
  • gvc: run engine cleanup after render, matching C gvFreeLayout (b0da47d)
  • html-label: decode entities and inherit pen color in HTML labels (861b641), closes #91
  • html: center non-simple cell text by mxfsize, not measured height (760e1d2)
  • html: faithful
    line semantics + per-line BR ALIGN justify (1e8f04f)
  • html: faithful cell border default and fixed-size cell box (1c9b321)
  • html: HTML label syntax error yields an empty label (ef5a3cd)
  • html: IMG SCALE falls back to the node imagescale attr (2119b0c)
  • htmllex: consume attr values; reject bare/unquoted attrs per expat (6ce543b)
  • html: port pos_html_tbl FIXEDSIZE align + extra-space distribution (3b123f4)
  • htmltable: FIXEDSIZE table honors explicit WIDTH/HEIGHT (ac33a4f)
  • htmltable: honor cell HALIGN/VALIGN for text content (66ccd60)
  • integer-divide chain Splinesep to match C (LR piece-count residual) (e6f509e)
  • integer-divide flat-edge Splinesep to match C (consistency) (3c56d76)
  • integer-divide regular-edge Splinesep to match C (LR control-points) (5d79822)
  • json: close 27 divergences — gradient y-flip, parseString bytes, latin1 (f754310)
  • json: close json tail 12→1 — cluster keying, node_induce, edge-lp, harness (dda82bf)
  • json: fix 2239 draw-text round-trip — overlay pre-serialization draws (3e01e5f)
  • label: cluster/graph labels inherit fontname/size/color from ancestors (b543dd4)
  • label: xlintersections zero-size filter matches C (De Morgan) (c36fb4f)
  • layout: cluster separation under flip + constraint=none ranking (e0eeae4)
  • layout: four corpus-hardening fixes for non-dot engines (9a5f042)
  • layout: real-rankdir records, PLINE fallback, layout attr priority (91d86bf)
  • layout: spline-extent bb + arrow ops carried through shifts (1f5b702)
  • map: close 11 imagemap divergences — cell hot spots, CLUSTERS_LAST, entities (6f8de06), closes #160
  • mincross: index rcross Count by window-relative order (19246be)
  • mincross: integer median to match C's int VAL arithmetic (89756df)
  • mincross: save_vlist must honour vStart window for cluster rankleader (647bbe3)
  • mincross: use vStart in installInRank for multi-component graphs (d1f9fae)
  • mincross: window flat-reorder rank access by vStart (T2) (6f62e28)
  • neato-attribution: greedy name parse in position injector (5aee00e)
  • neato: call addEdgeLabels from every routing function (3995465)
  • neato: clusters, effective polygon shapes, default-none overlap (6d52ee6)
  • neato: coalesce equivalent edges before spline routing (611207a)
  • neato: collect ortho edges in agfstnode/agfstout order (36747f3)
  • neato: create root graph label for neato, fdp and sfdp (0fa406a)
  • neato: derive outline periphery ring in makeObstacle (c0d3c5e)
  • neato: faithful makeObstacle + esep margins; AGSEQ child order; (a697358)
  • neato: honor user pos= as initial layout (port user_pos) (6fb2b46)
  • neato: keep the aspect-scaled bb through routing (92852a0)
  • neato: parse nodesep engine-neutrally (1949 on 3 engines) (97f52b1)
  • neato: place edge labels for neato, fdp and sfdp (6e1bae2)
  • neato: recompute endpoint polys via in_poly in installSpline (cf7c584)
  • neato: resolve dynamic ports before spline routing (113649d)
  • neato: resolve edge type from splines attr; fix CDT cavity winding (44673ca)
  • neato: round size to integer points in neato-family parse (1855) (015ba47)
  • neato: splines=ortho dispatch, fallback, and obstacles (9d0a56a)
  • node-label: honor labelloc via ND_label space + valign (7edd295)
  • node: don't clobber a computed 0 node size (shape=plain) (c54f08b)
  • nodeinit: create ND_xlabel for record and Mrecord nodes (f5c9de9)
  • ns: faithful x-coord network-simplex cursor + slack caching (dce82f9)
  • ns: make tree_adjust iterative to avoid stack overflow (f59f96d)
  • ns: match C qsort tie-order in TB_balance so node L ranks correctly (0cda4fb)
  • ordering: ignore subgraph-scoped ordering like C (agGraphAttr) (ebda523)
  • ortho: apple qsort semantics, addPEdges precedence, gcell exact bb (df314d9)
  • ortho: C-exact cdt Dtoset channel dicts (1447_1 osage) (9afe570)
  • ortho: compute edgeLen from node centers, not bb corners (d08d8ae)
  • ortho: edgeLen reads ND_coord not bbox center (ortho.c:1124) (5df89a8)
  • ortho: faithful adj-buffer spill + chancmpid containment (c1c93a2)
  • ortho: faithful traverse_polygon DFS order in partition() (F1) (9933511)
  • ortho: htrack round half-away-from-zero (1447 osage) (aae1a0c)
  • ortho: match C qsort tie-order in ortho edge-length sort (bd7de4c)
  • ortho: plumb node ports into circo/neato ortho routing (e8f00b3)
  • ortho: port concentrate edge dedup for splines=ortho (2361) (d665df1)
  • osage: create edge labels so addXLabels can place them (4adb82d)
  • osage: keep cluster-inclusive GD_bb through ratio aspect path (522bae9)
  • osage: root graph label + full postprocess (50b63d4)
  • osage: route edges (setEdgeType was never called) (8e8c1f5)
  • osage: use C DFLT_MARGIN=4 and read real sortv values (0178f52)
  • pack,render: osage tail — genBox CVAL/round + printf non-finite (2f05030)
  • pack: component subgraphs keep the original root (7c28a30)
  • packed clusters rendered clipped outside the viewport (8356405)
  • pack: match C qsort tie-order in array/poly-place sorts (c725a52)
  • pack: match C qsort tie-order in polyRects perimeter sort (bbb3c74)
  • pack: read pack/packmode graph attrs with full C syntax (f055848)
  • parser: create node-set edges in AGSEQ order (c913307)
  • parser: dedup subgraph edge-endpoint member nodes (d544ea8)
  • parser: don't treat comment chars inside strings as comments (05f8764)
  • parser: faithful cgraph %N anonymous-object numbering (1c03fc6)
  • parser: full escape parity — lexer keeps escapes verbatim per scan.l (5e57052)
  • parser: propagate node/edge membership to all enclosing subgraphs (dbcc8f1)
  • parser: register subgraph edge-endpoints as real subgraphs (86a4203)
  • parser: strip quoted-string content from edge-operator validation (T1) (29d9c93)
  • parser: widen NAME char class to the BMP for non-Latin names (T10) (68185ec)
  • patchwork,osage: honor cluster=true, invisible alias, box winding (3b0deab)
  • patchwork: faithful init, finishNode, and postprocess (4b39be0)
  • patchwork: translate cluster bbs with the drawing per C translate_bb (e4b4576)
  • pathplan: fix infinite loops and polygon winding in T14 (3fc24e7)
  • pathplan: iterative ear-clip triangulation (stack-safe) (f19fc35)
  • position: cluster-local v0 in keepout_othernodes (vStart window) (e39072d)
  • position: integer-truncate make_LR_constraints running position (a16263e)
  • position: propagate post-label cluster ht to global rank (7f11e33)
  • position: read cluster margin attribute (was hardcoded CL_OFFSET) (1e1dbfa)
  • position: read cluster rank via vStart window in contain_nodes (2ffe3f9)
  • position: truncate edge-pair port offset to int like C make_edge_pairs (73d9e21)
  • position: use flip-aware label dimension in selfRightSpace (29b05e6)
  • rank: dedup makeXnode by name so strong clusters share TOP/BOT (8cfe52b)
  • rank: dot2 aux edges start at minlen=0/weight=0 (mirror calloc) (c44059f)
  • rank: inherit nslimit1 into cluster local ranking (0794026)
  • record nodes apply the rankdir flip to lw/rw/ht (was clipping) (05b1f92)
  • remediate code-review findings (XSS, browser-safety, contracts) (f99c7f1)
  • render: attr-or-tag parity — getObjId id/class + gid prefix + stylesheet PI (T8) (8731c28)
  • render: color-stroke parity — bgcolor, setlinewidth, FUNLIMIT, scheme, peripheries (T6) (229ceaf), closes #rrggbb #rrggbb
  • render: derive node size and polygon extent from lw/rw/ht (c563c9d)
  • render: honor dpi/resolution SVG scaling and HTML BALIGN (bf91e91)
  • render: honor style=invis — omit invisible nodes and edges (fe9efdd)
  • render: match C cluster paint order and node id assignment (69a3dfc)
  • render: read graph margin attribute for viewport (F6) (0ce0a54)
  • render: read graph pad attribute for viewport (F2) (dd56749)
  • render: round exact decimal ties half-even like C printf (931b1b6)
  • render: skip empty textspans at all label emit sites (66532b2)
  • render: text-content parity — XML escaping, entity decode, no implicit string concat (T7) (e01d906), closes #39 #45 #10 #13 #160 #NNN #xHH
  • routing: accumulate MINW per rank in the spline corridor bounds (f5711d3)
  • routing: grow graph bb by the flat-adj spline so the loop isn't clipped (25cf82d)
  • routing: refine updateBbBz to the actual curve, fixing the bbox class (565bbb8)
  • self-loop: flip-correct label dimension + inter-loop widen (20fa64e)
  • self-loop: updateBB for labeled self-loop labels (48e11b7)
  • sfdp/routing: armPow libm-faithful + bezierClip NaN termination (5bc5d08)
  • sfdp: reclassify 2095 A9->A1 after injector-fix attribution regen (1068172)
  • sfdp: refine single-component graph bb to the edge curve (a6c371c)
  • shape: box vertex order honors orientation (ee1b337)
  • shape: port star vertices (was rendering a decagon) (cf52fe7)
  • shapes: clip edges to stars with star_inside, not poly_inside (29df8e1)
  • shapes: draw rounded/diagonals star instead of throwing (a43bd66)
  • shapes: fold star vertex extent into node height (rank spacing) (f515bf8)
  • shapes: honor nojustify in node label justification space (2abb397)
  • shapes: match C poly_init FP so pack cells don't swap (circo/osage) (77e9e30)
  • shapes: port poly_gencode peripheries loop and ring vertices (0295a60)
  • shapes: port star_size/cylinder_size node sizing (size_gen) (d1a1ff8)
  • site: playground highlighter uses pure-JS regex engine, no WASM (9bda08f)
  • spline: make routeSplines translation-equivariant (closes #241_0) (82b7360), closes #241_0 #241_0
  • splines: apply REAL_CLUSTER in cl_bound neighbor lookup (d907b79)
  • splines: gate place_portlabel on the attr decls, not has_labels (fe100e1)
  • splines: match C qsort tie-order in flat-labeled edge sort (be2f1c1)
  • splines: wire samehead/sametail shared ports for honda edges (58cc5cd)
  • style: only "invis" omits an object, not "invisible" (fc70f78)
  • svg: emit fill/stroke-opacity for RGBA edge colors (7a0e533)
  • T1.2: port fdp compound cluster-edge preprocessing (e3e2f22)
  • T1.2: route lone and group edges in one edgecmp-ordered pass (fdad3e0)
  • T1.2: route parallel/opposing cross-rank edges through the corridor (ac4dbcb)
  • T10b: flat-adj spline direction via C top-level normalize predicate (537ecbd), closes hi#order
  • T11: swapBezier bounds reverse to [0, size), not whole list (f7022ca)
  • T13: ortho int-truncation tie-break + compass-port endpoints (ea8e551)
  • T14: polySize honors polygonBB's post-inflation base box (f169555)
  • T15: delegate updateBBForLabel to the shared flip-aware updateBB (164a800)
  • T16: dedupByOrig resolves swapped proxies to their real edge (b7338ea)
  • T17: freeze spline corridor bounds once per dot_splines_ pass (9f875d9)
  • T19: save_best scratch stores window-relative order like C saveorder (a522206)
  • T1: apply vStart window fix to medians/reorder (b4e6afb)
  • T1b: route multi-rank forward edges via virtual chains in dot (2084b4a)
  • T1: classify non-well-formed oracle SVG as oracle-error (9c2a630)
  • T1: emit both arrowheads for concentrated opposing edges (a085474)
  • T1: faithful transpose_step — reverse condition + candidate flag (e616dc0)
  • T1: follow routed splines in neato component packing (fe2d315)
  • T1: group opposing adjacent flats by getMainEdge, route arcs (307d28f)
  • T1: induce intra-cluster edges in nodeInduce (cluster stacking) (b97052e)
  • T1: measure text per UTF-8 byte to match C (non-ASCII labels) (f1e5719)
  • T1: read flat constraint matrix by low, not order-vStart (59a74a2)
  • T1: reposition aux label vnode onto spline via recover_slack (DOT-12) (2e13de2)
  • T1: reposition aux virtual nodes via nlist (DOT-11a) (67ca8e3)
  • T1: skip empty label spans in renderOneLabel (2b6d43b)
  • T1: virtual edges inherit AGSEQ(orig) for ordering enforcement (bcecf61)
  • T2: bucket indexed @points[N] as polygon-points (091c2ab)
  • T2: dotRank honours the newrank attribute (d7e457f)
  • T2: emit bz.size bezier points, not the over-allocated list (5fef1c7)
  • T2: emit cluster ids from AGSEQ seq, drop dense clusterId (7855886)
  • T2: faithful build_ranks flip via exchange (fixes order corruption) (fafc47c)
  • T2: give clustered nodes a median so reorder can move cluster skeletons (286d710)
  • T2: invalidate ncross cache on transpose swap (DOT valid flag) (fd156a9)
  • T2: link corpus tests to gitlab, scrub local paths from dashboards (28946af)
  • T2: match C constraint=false spline routing for 1213 (flat_limits) (588f5f1)
  • T2: match C dot spline routing for root_twopi (maximal_bbox round) (1deaf16)
  • T2: match C mincross flat-rank order for shells (left2right single cell) (dacbb20)
  • T2: order dot ranks by compass-port x in mincross (G2) (719d24e)
  • T2: port dot doDot pack branch (multi-component) for 2458 (7302bb3)
  • T2: round normalizeXcoords delta for integer routing frame (24c9baf)
  • T2: route concentrate merged-trunk via spline_merge for 2559 (683463f)
  • T2: route edges in dot_splines_ order (rank-major + edgecmp) (16da31b)
  • T3.1: inject empty-named nodes in the attribution hook (3ebefbf)
  • T3: alias cluster rank vlist into root array (merge_ranks parity) (ab03478)
  • T3: apply vStart window fix to saveBest/restoreRank (Layer 2) (e6e2029)
  • T3b: expand graph bb from installed splines in clipAndInstall (6af542f)
  • T3: default nodesep to 18pt in neato self-loop routing (d5ecf99)
  • T3: markClusters treats undefined ranktype as NORMAL (0cd33af)
  • T3: MAX flat-label dist onto class rep in flat_edges (faa5b54)
  • T3: place compass ports on the shape boundary via ictxt path (ecc88d2), closes #241_0
  • T3: port record_path as record pboxfn — graphs-biglabel (d77efa1)
  • T3: route back edges through their chain segments like C (923fc05)
  • T3: sanitizeComments so TypeDoc reference builds under VitePress (eb5279e)
  • T4.2: keep ratio=fill scaled bb in sfdp single-component postprocess (fa0240b)
  • T4a: rebuild_vlists infuses chain vnodes from original cluster edges (df0fa57)
  • T4b: advance cp/prevbp/bp1 before the bend-at-end segment (e38aa17)
  • T4: swap arrow-op slots with the spline in swapEdgeSpline (95a0acd)
  • T5.2: run sfdp addXLabels in the packed frame for multi-component (dfaafcc)
  • T5: port dotsplines post-routing edge-label placement loop (cbb22f5)
  • T5: propagate html font flags through measurement, layout, and svg emission (ad1c2ff)
  • T5: shapefile nodes bind to C's custom-box fallback (8e83b58)
  • T6b: interleave each bezier's arrowheads inside the emit loop like C (2f686bb)
  • T6: draw degenerate labeled flats via faithful edge_in_box (4e8a843)
  • T6: sort spline routing list with gvQsort like C's libc qsort (97b4b36)
  • T7: anchor inheritance, cluster graph-attr anchors, anchor-id escaping (dda8252)
  • T7: route titles, ids and class attrs through C's gvputs_xml escaping (2e353df), closes #45 #160
  • T8: invis clusters skip box+label; cluster label line advance (d28afd5)
  • T9: port html emission gaps found by C-oracle verification (d77123b)
  • T9: port size_html_txt simple/non-simple vertical model (b95b9d4)
  • T9: port-label splines — bezier size indexing + ortho placement (d2807a7)
  • text: exact FreeType line-height model + multi-line label splitting (9e4382c)
  • twopi: create root graph label before layout (af448df)
  • twopi: edge labels + dotneato_postprocess (6963aca)
  • twopi: shift head/tail/xlabels with drawing in shiftEdgePoints (92e0d2a)
  • twopi: traverse incident edges in agfstedge order (62e08a5)
  • xcoord: truncate flat-edge minlen to int like C (make_LR_constraints) (5b78594)
  • xdot: agcanonStr-faithful attr escaping; raw cluster labels (0ddac1a)
  • xdot: arrow penwidth setlinewidth + only line styles emit S ops (c82cc63)
  • xdot: background covers bb ± pad (dot device default pad = 0) (f3caeaf)
  • xdot: bgcolor=transparent fills white on the non-truecolor xdot device (ae0276f)
  • xdot: echo layout attrs C leaves unwritten instead of dropping (3b8612a)
  • xdot: edge pos emits s,-start marker and exactly bez.size points (499a580)
  • xdot: emit edge labels (ldraw) (e6dba7a)
  • xdot: emit edge spline + arrow draw ops; 2-dp draw-op numbers (3123285)
  • xdot: emit explicit style names (S ops) and transparent as #fffffe00 (c3518a1), closes #fffffe00
  • xdot: emit linear gradient node fills (C len -[G0 G1 2 stops]) (5f67cce), closes -#hex
  • xdot: emit linear graph-background gradient (f8ac516)
  • xdot: emit ortho rounded-corner edges as polyline segments + arcs (f5349a1)
  • xdot: emit parallel multicolor edge splines (color="a:b:c") (69340d7)
  • xdot: emit radial gradient fills ((c1 r1 c2 r2 2 stops)) (52526c8)
  • xdot: emit split-along-length multicolor edge beziers (6e79d2e)
  • xdot: emit tapered edges as a filled taper polygon (c962c78)
  • xdot: escape backslashes in label draw strings (put_escaping_backslashes) (7ec6763)
  • xdot: faithful cluster edge induce-up + irrelevant_subgraph (1514) (56e6436)
  • xdot: faithful string encoding — UTF-8 lengths, quote escaping, ids (81fe1b7)
  • xdot: faithful xdot engine — bg, colors, y-up, labels, clusters, quoting (825c6b2)
  • xdot: format pos/bb/width/height with %.5g like native (a969a41)
  • xdot: gate edge emission on edge_in_box (drop off-box labels) (4fa2a42)
  • xdot: omit pos for IGNORED (concentrate-merged) edges (0026f3d)
  • xdot: re-emit solid style between arrowed multi-bezier segments (70775bb)
  • xdot: round draw-op numbers half-to-even like %.02f (26a0498)
  • xdot: route edge head/tail labels to hldraw/tldraw (49051ac)
  • xdot: route HTML-table label draws to ldraw with solid style (ce766a9)
  • xdot: serialize every rendered cluster, always with draw (e2a853d)
  • xlabels: store hilbert R-tree key as signed int32 (circo b81) (04e6b6e)

Features

  • api: add api entry barrel (08f5347)
  • api: add getLayout geometry snapshot (2683f48)
  • api: add programmatic graph builder (518e3d6)
  • api: add safe addEdge helper (40617c4)
  • api: add setHtmlAttr for HTML-string labels on the builder (9279047)
  • api: add tryRenderSvg and structured render-stage errors (a53d2b4)
  • api: expose cluster bboxes in getLayout snapshot (85b40a5)
  • api: wire api + render entry points into package exports (bfedb07)
  • arrows: crow/vee/tee/curve/gap + modifiers + compound stacking (T3) (78bc807)
  • arrows: length fns + closed-shape generators (dot/box/diamond/normal) (T2) (6c7fafc)
  • arrows: resolve arrow type + draw-op union (T1) (704107b)
  • b15: collect routing edges from the rank array (f4560cd)
  • b15: per-entry run routing + C-faithful edgecmp/groupSize (1dd5fa7)
  • B2-T1: port mincross Verbose trajectory print (trace hook) (dd1d653)
  • batch-11: add golden-file test harness, reference SVGs, and suite (f1bf494)
  • cdt: port lib/cdt DtSplay and DtHash (5822b16)
  • circo: port circo circular layout engine (T49) (e3db8f2)
  • common: exact drand48/srand48 port (D3) (f2758dd)
  • common: port poly_init label-driven node sizing (63c848f)
  • common: size all nodes from labels via shared poly_init port (aa9a988)
  • common: structure HtmlParseError as semantic GvError (6c92409)
  • compound: clip arrowheads to cluster boundary (lhead/ltail) (472abaf)
  • corpus: imagemap dashboard + first survey (641/762 conformant) (261e541)
  • corpus: imagemap walker — dual-format walk over conformant set (d5b6be5)
  • corpus: iterative-engine parity tracks (neato/fdp/sfdp at ±0.5) (2fb8e79)
  • corpus: json parity track vs dot -Tjson (baseline survey) (5ee1e73)
  • corpus: per-engine parity reports + xlabels placement order fix (68721da)
  • corpus: round-3 fresh sweeps — all 7 engines + dot at post-fix state (5f644f5)
  • corpus: round-4 sweeps confirm zero open deterministic divergences (9032029)
  • corpus: round-5 final gates — all tracks green, zero open deterministic ids (0e8d27e)
  • corpus: semantic imagemap comparator (cmapx XML + imap lines) (5a3c4e1)
  • corpus: survey:fast mode — skip graphs slower than 60s port time (d1280cd)
  • docs: golden corpus showcase, rendered client-side (#15) (175be0f)
  • docs: render diagrams with DOT via the library; drop Mermaid (#18) (2ea8b20)
  • docs: syntax-highlight DOT code fences (f74cef8)
  • docs: syntax-highlight the playground DOT editor (da3d47e)
  • dot-cluster: port cluster rendering + graph label placement (517881f)
  • dot/rank: port dot1_rank and dot2_rank pipelines (T33) (7a2417c)
  • dot: activate ratio=compress via graph drawing params (232e252)
  • dot: activate the concentrate=true feature (274964e)
  • dot: add cluster expansion for dot position phase (T35) (4305a63)
  • dot: add compound edge clipping and aspect stub (T38) (d2614c0)
  • dot: add crossing minimization (mincross) (983f832)
  • dot: add dot init, pipeline entry point, and engine registration (T39) (3301c53)
  • dot: add flat edges and edge classification (T36) (ce4bfad)
  • dot: add network simplex solver for rank assignment (T33) (8707f74)
  • dot: add spline routing, sameport, and edge concentration (T37) (ea700b0)
  • edge-route: port straight-mode segmentation for long edges (96365d5)
  • edge-routing: port full routesplines_ + bezier_clip + arrowEndClip pipeline (553f862)
  • edges: split-along-length multi-color edges (semicolon syntax) (0cbe5bd)
  • emit: whole-node URL anchors with object escape substitution (d75cebe)
  • EP-T1: wire NodeId port/compass into edge tailport/headport attrs (9d2a4ef)
  • EP-T2: port chkPort and common_init_edge port block (08a52d7)
  • EP-T3: port compassPort and poly_port; wire POLY_FNS.portfn (234142f)
  • EP-T4: port map_rec_port and record_port; wire RECORD_FNS.portfn (bc7a4a0)
  • EP-T5: port closestSide and make resolvePort real (36ddee6)
  • errors: add structured GvError contract and friendly-message seam (4da2b08)
  • fdp: dispatch overlap removal + port coincident rand() fallback (92c594d)
  • fdp: port fdp layout engine (T46) (c52cb3c)
  • fdp: port fdpgen core — derived graphs, tlayout, xlayout (389ffca)
  • flat: faithful cnt>=2 non-adjacent flat routing (make_flat_edge loop) (71a4a3e)
  • flat: route adjacent flat side-port edges via make_flat_adj_edges (1acd419)
  • flat: route non-adjacent flat groups via the cnt-loop router (42ef301)
  • font-aware vertical text metrics (Helvetica line height) (151da37)
  • G1: port multicolor parser and gradient resolution (e28800f)
  • G2: port SVG gradient emitters and obj-state plumbing (e43c445), closes #id
  • G3: wire node and cluster gradient fills (0f7ca1e), closes #node1_l_0
  • G4: wire graph background gradient (59a778b)
  • golden: add 50 reference input/SVG pairs for golden-file suite (4137bd5)
  • gvc: add createDefaultContext registering all renderers (74b6b14)
  • gvc: add device render loop and coordinate transform (4b70e76)
  • gvc: add GvcContext with capability negotiation (ac1e74b)
  • gvc: add RenderJob and text layout selection (6b13de7)
  • honor the splines graph attribute in edge type (b26eb5c)
  • html-label: size, position, and render HTML-like labels (65f42b2)
  • htmltable: emit gradient bgcolor fills for tables and cells (1f18afa)
  • htmltable: emit rounded bgcolor fills + fill stroke-width (3b7e72f)
  • htmltable: nested HTML tables + html_port edge resolution (1631535)
  • json: port json emitter to -Tjson parity (0->720/762) (fd1397d)
  • label: decode HTML 4 named entities (α -> α) (3a113d4)
  • layers: SVG output-layer support (943fd24)
  • layout,render: store + emit per-type arrow draw-ops (T5+T6) (322d8a2)
  • layout: add per-type arrow clip length helper (T4) (105b71b)
  • M1: render multi-color parallel-spline edges (509810e)
  • map: port url_map_p imagemap emitter + anon-graph identity (be8e906)
  • model: add EdgeInfo interface (d7e0fc6)
  • model: add geometry primitive types (d1f1f76)
  • model: add Graph, Node, Edge base classes (4a88214)
  • model: add GraphInfo interface (9dd13ee)
  • model: add NodeInfo interface (1d7b544)
  • neato-pack: port pinned-node fixed packing protocol (428f1c4)
  • neato: float32-faithful stress majorization with C numerics (1cab00b)
  • neato: port _neato_set_aspect (ratio/size reshape for neato family) (20fb0bf)
  • neato: port dijkstra, bfs, and apsp utilities (T40) (6ed950b)
  • neato: port GTS CDT insertion algorithm for mkSurface (87cfa34)
  • neato: port makeMultiSpline (CDT triangle router) (0d2a25a)
  • neato: port neatoinit and wire neato layout engine (T45) (1fe64fc)
  • neato: port neatosplines routing (T44) (28b56bb)
  • neato: port Plegal_arrangement sweep-line (legal.c) (9f2addb)
  • neato: port PRISM overlap removal (overlap=false family) (2621ce6)
  • neato: port SGD layout with MT19937 Fisher-Yates shuffle (T42) (a857476)
  • neato: port stress majorization and conjugate gradient (T41) (919e618)
  • neato: port VPSC overlap removal (T43) (6d360ea)
  • osage: build and place cluster labels per C mkClusters (29a2393)
  • osage: port osage recursive cluster packing engine (T51) (63e7f10)
  • pack dot clustered multi-component graphs (corpus 2592) (da88a50)
  • pack: port polyomino component packing (l_node/l_clust/l_graph) (9fb539f)
  • pack: port rectangle packing and component decomposition (T48) (ee6925f)
  • parity: track accepted vs unaccepted divergences via a registry (a3676c3)
  • parser: add Peggy DOT grammar derived from grammar.y (b996c69)
  • parser: add TypeScript wrapper and tests for DOT parser (38742fb)
  • parser: structure ParseError as GvError with code, location, expected (ae2f648)
  • parser: unique names for anonymous subgraphs (d0c4876)
  • patchwork: port patchwork squarified treemap engine (T52) (3428c57)
  • pathplan: emulate the oracle's fp-contracted ccw bit-for-bit (c51c39c)
  • ratio: activate ratio=fill layout reshape (setAspect R_FILL) (a18e568)
  • rbtree: port lib/rbtree with nil-sentinel contract (ca2bd9d)
  • render: add DOT and XDOT renderers (T29) (4d58c02)
  • render: add JSON renderer (b3591b2)
  • render: add multi-format render entry (2ec3627)
  • render: add plain/imap/cmapx renderers (d27a5f7)
  • render: add render entry barrel (c4d1149)
  • render: add SVG renderer (T28) (8f0ecb0)
  • render: draw rounded clusters and Mrecord as bezier paths (round_corners) (185ec0f)
  • render: draw style="tapered" edges as filled taper polygons (51d7459)
  • render: emit URL/href anchors for graph, cluster, and edges (30e730f)
  • render: expose structured xdot draw-ops (d457615)
  • render: resolve fill and pen for record/Mrecord nodes (record_gencode) (b6876ab)
  • S1: port striped and wedged multicolor node fills (e0ddac7)
  • scaffold: initialize typescript project (5091508)
  • sfdp: dispatch overlap removal via ported adjust modes (0ee394f)
  • sfdp: port minstd rand stream and SparseMatrix subset (c9cb1db)
  • sfdp: port multilevel coarsening, spring-electrical, quadtree (26f90a4)
  • sfdp: port sfdp multilevel spring-electrical engine (T47) (01ff1c7)
  • sfdp: port sfdp_layout pipeline — components, scaling, splines (b80429b)
  • shape-rendering: port poly_gencode, poly_init; wire node shapes into SVG pipeline (10403d9)
  • shapes: port record shape parsing, sizing, and rendering (16348ae)
  • shapes: port round_corners special node shapes (all 26) (e24a57f)
  • shapes: render shape=point as a small filled dot (point_init/gencode) (b2f5d75)
  • shapes: round_corners siblings (diagonals/rounded/underline/Mcircle) (0682335)
  • splines: port straight_path helper for chain straight-mode (cf1409a)
  • SR2: assemble faithful routesplines pipeline for dot port edges (a786041)
  • SR3: route side-port dot edges via faithful routesplines (6471827)
  • SR5: route flat side-port dot edges via faithful make_flat_edge (2a6160f)
  • SR7: route multi-rank side-port dot edges via faithful chain (6f339de)
  • SR8: edge-title port fix + mint steering-port goldens (84813f5), closes #45
  • stack parallel labeled adjacent flat edges (makeSimpleFlatLabels) (95224f0)
  • svg: detect landscape orientation into job.rotation (9dde0d0)
  • svg: emit landscape rotation transform and swapped canvas dims (33236df)
  • T14: port lib/pathplan visibility-graph routing and spline fitting (647dbb1)
  • T15: port lib/xdot operation string parser and serializer (093a343)
  • T16: port lib/sparse CSR/COO SparseMatrix and Barnes-Hut QuadTree (24dde23)
  • T17: port lib/ortho orthogonal edge router via Seidel trapezoidation (f1e615c)
  • T18: port lib/common types and shape catalogue (29153ff)
  • T19: port lib/common color system (84f1ca2)
  • T1: add routeRegularByType edge-type dispatch helper (f4b734a)
  • T1: assign subgraph AGSEQ seq from a root-level counter (c71ff58)
  • T1: create flat label vnode (wire flatEdges + abomination rewrite) (28e15c7)
  • T1: create node xlabel in common node init (c231c64)
  • T1: dispatch splines=ortho in the dot engine (no labels) (6974f93)
  • T1: enumerate + classify the dot corpus for the parity survey (945fda5)
  • T1: injection attribution harness for iterative-engine parity (ed337d9)
  • T1: inline external images as data URIs via setImageResolver (ef6cf8f)
  • T1: port beautifyLeaves radial leaf placement (SFDP-1) (5ee095f)
  • T1: port cgraph subgraph/node ops for newrank fill nodes (5537a0a)
  • T1: port ellipticWedge arc tessellation (ellipse.c) (7138fbc)
  • T1: port fixLabelOrder reorder for flat labels (DOT-5) (b8bdc0a)
  • T1: port lib/label rectangle primitives (f8c41c3)
  • T1: port makeSimpleFlat for unlabeled adjacent flat groups (cb0f640)
  • T1: port style/color resolution helpers (1198d3e)
  • T1: read minlen and constraint edge attrs in dot init (1ecb5af)
  • T1: record maxDeltaPath in survey diffVerdict (751983a)
  • T1: restore runExclusive sweep lock (2c4b3e2)
  • T1: route adjacent back edges through pathplan (92c3a01)
  • T1: route splines=curved via makeStraightEdges in the dot engine (5bb43bc)
  • T20: port lib/common HTML label parser and layout sizing (a0bd817)
  • T21: port lib/common text measurement LUT and TextMeasurer interface (d33e445)
  • T22: port lib/common arrow types and geometry (1cec495)
  • T23: merge splines.c + routespl.c port from worktree (eb37020)
  • T23: port splines.c and routespl.c to TypeScript (6e2c684)
  • T24: port emit.c rendering dispatch to TypeScript (fa38cab)
  • T2: A1-drift class acceptance in per-engine parity reports (104a233), closes docs/known-divergences.md#a1-drift-iterative-engines
  • T2: add removeFromRank (inverse of install_in_rank) (5f91a2d)
  • T2: bucket structural-match by worst-diff signature in dashboard (0f66491)
  • T2: copy flat-edge label back from aux graph (DOT-10) (6c9c8a3)
  • T2: create edge label and xlabel in common edge init (465af5a)
  • T2: dispatch regular box-corridor edges on edge type (dcf44ab)
  • T2: port lib/label R-tree node and quadratic splitter (032f840)
  • T2: port make_flat_labeled_edge + dispatch (6fbfd52)
  • T2: port make_regular_edge multi-edge routing (c2cc600)
  • T2: port ortho corner detection + wedge params (emit.c) (eb80652)
  • T2: position edge labels for splines=ortho (C warn+downgrade) (8afabe5)
  • T2: push C obj-state lifecycle through the device walk (b91a6dc)
  • T2: route adjacent-rank forward edges through pathplan (13e0fd5)
  • T2: route dot self-loop edges via makeSelfEdge (9fb1e2e)
  • T2: scale SVG output to size= via init_job_viewport zoom (3f0c23d)
  • T2: subprocess-isolated dot parity survey runner (4b0d4dd)
  • T2: variant-aware text measurement for html font flags (f06732b)
  • T2: wire beautifyLeaves into sfdp, drop the throw (SFDP-1) (7648352)
  • T2: wire checkLabelOrder for flat-edge labels (DOT-5) (54e583e)
  • T32: port acyclic cycle-breaking and decompose component detection (ff8d087)
  • T35: port dot position phase (set_xcoords, set_ycoords, set_aspect) (8f366a9)
  • T3: complete html lexer/parser attrs (gradientangle, sides, port, img) (2939df7)
  • T3: dedup edge group by orig + multi-edge oracle pins (1ebd36d)
  • T3: dot parity dashboard + triaged divergence backlog (157a870)
  • T3: emit adjacent flat-edge label + multi-case oracle pins (f0b452c)
  • T3: oracle-error classifier — native-crash vs timeout-flake (5c1e549)
  • T3: port fillRanks/realFillRanks for newrank placeholder ranks (4e03a14)
  • T3: port lib/label R-tree index API (5dbbac2)
  • T3: port makeLineEdge for multi-rank splines=line (7dc08ee)
  • T3: port ortho segment + corner-arc polyline emit (emit.c) (929f800)
  • T3: render node fill, pen, penwidth, and line style (82d979d)
  • T3: root graph label creation and placement (56103dc)
  • T3: route multi-rank forward edges through pathplan (9ec090e)
  • T3: route parallel/opposing edges through pathplan (da44293)
  • T4: emit node xlabel and graph label in live render path (5e5f31a)
  • T4: emit rounded ortho corners in the SVG edge renderer (3b3de1e)
  • T4: html dispatch at all seven label creation slots (ff3ae09)
  • T4: newrank reaches dot oracle parity (cross-cluster rank=same) (46576f0)
  • T4: port lib/label placeLabels and Hilbert placement (1245f97)
  • T4: port removeFill + pin newrank rank-reconciliation parity (7705284)
  • T4: render edge color, penwidth, and line style (2d68dea)
  • T4: route back + non-forward edges through pathplan (3c56602)
  • T5,T6: fdp+sfdp attribution; fdp needs its own injection site (4f2bd9a)
  • T5: implement expand_leaves for LEAFSET leaf packing (87333d5)
  • T5: port addXLabels into gv_postprocess (5d6ba93)
  • T5: regular-edge rankdir parity + oracle pins (bc6db15)
  • T5: render cluster fill and graph background color (2f584ed)
  • T6a: attach edge splines at compass/record port points (ab45dff)
  • T6: decorate=true edge-label attachment polylines (faad09d)
  • T6: emit html cell decorations (fills, sides, rules, anchors) (47efffe)
  • T6: port gv_postprocess — rankdir LR/BT/RL support (8c5f048)
  • T7: html img sizing and emission via injected ImageSizer (6d50cb9)
  • T7: port parallel multi-edge offset in dot splines (cf2790a)
  • T8: render html labels in all live emission slots (fd81fdf)
  • T9: port headlabel/taillabel creation and angle-based placement (afbbd37)
  • textmeasure: add EstimateTextMeasurer (raw headless-matching) (41fcb9d)
  • textmeasure: cut over Node default to EstimateTextMeasurer (239c51b)
  • textmeasure: production wiring + docs (T3.1) (da6ea38)
  • textmeasure: public setTextMeasurer + resolution chain (T1.1) (9eb48f6)
  • twopi: port twopi radial layout engine (T50) (c3fc0b8)
  • twopi: route and clip edges per C spline_edges pipeline (96d20fb)
  • util: port lib/util agxbuf, list, xml, math, mt19937 (78a187a)
  • vpsc: port lib/vpsc IncVPSC solver (092b421)
  • xdot: build xdot conformance harness (Batch 1) (8f741b5)
  • xdot: emit computed label attrs and compare them (b18e6b9)

Performance Improvements

  • dot: eliminate O(N*E) edge scans in cluster/mincross/emit (e299762)
  • dot: shape-stabilize EdgeInfo + fuse NS hot-loop property reads (ea66e2c)
  • mincross: cut per-op cost of reorder hot loop, byte-identical (8d2ff15)
  • mincross: stabilize RankEntry V8 shape — megamorphic to polymorphic (398a045)
  • model: stabilize NodeInfo shape to exit V8 dictionary mode (27463a0)
  • ns: flat dfsRange stack + iterative rerank (8c7c1e8)
  • ortho: faithful maze dict — 4.7x on 2620, byte-identical (eaf3283)