v0.9.16 - Graphify head-to-head benchmarks
Synaptic vs Graphify
This release adds a reproducible synaptic eval head-to-head benchmark against pinned Graphify b2cd36267456c166788c95be6e68574064a92a42, plus the extraction fixes found by running it.
Hand-labeled accuracy corpus
| Tool | Quality F1 | Accuracy | Precision | Recall | Labels resolved | Cold corpus |
|---|---|---|---|---|---|---|
| Synaptic | 98.55% | 97.14% | 100.00% | 97.14% | 100.00% | 1.13 s |
| Graphify | 87.10% | 77.14% | 100.00% | 77.14% | 100.00% | 6.37 s |
Both tools tied on the six single-language fixtures. Graphify missed the labeled cross-language couplings in the TypeScript/Rust, gRPC, queue, PyO3, and WebSocket fixtures.
Ten pinned real-world projects
Quality metrics are agreement with Universal Ctags over the same detector-selected code files and structural declaration kinds. Anchor exactness is checked directly against source. The run used one fresh cold build per project on Windows on 2026-08-20.
| Tool | Projects | Quality F1 | Accuracy | Precision | Recall | Anchor exact | Parse warnings | Cold total |
|---|---|---|---|---|---|---|---|---|
| Synaptic | 10 | 92.20% | 85.53% | 91.12% | 93.31% | 100.00% | 1.17% | 15.39 s |
| Graphify | 10 | 81.10% | 68.21% | 75.01% | 88.27% | 94.01% | 0.00% | 50.07 s |
Synaptic led by 11.10 points in F1, 17.32 in accuracy, 16.11 in precision, 5.04 in recall, and 5.99 in anchor exactness while completing the corpus 3.25x faster. It won F1, accuracy, precision, and cold speed on all ten projects. All 60,501 checked Synaptic source anchors were exact.
S/G means Synaptic / Graphify:
| Project | F1 S/G | Accuracy S/G | Precision S/G | Recall S/G | Anchor S/G | Cold seconds S/G |
|---|---|---|---|---|---|---|
| memchr | 98.68 / 40.29 | 97.39 / 25.23 | 98.19 / 25.42 | 99.17 / 97.01 | 100.00 / 98.40 | 0.37 / 5.06 |
| click | 99.93 / 86.59 | 99.86 / 76.36 | 100.00 / 93.53 | 99.86 / 80.62 | 100.00 / 96.17 | 0.98 / 3.46 |
| p-map | 84.75 / 58.46 | 73.53 / 41.30 | 75.76 / 48.72 | 96.15 / 73.08 | 100.00 / 93.94 | 0.11 / 0.70 |
| cobra | 98.52 / 96.28 | 97.09 / 92.82 | 98.69 / 93.25 | 98.36 / 99.51 | 100.00 / 100.00 | 0.32 / 1.70 |
| axum | 94.46 / 85.10 | 89.50 / 74.06 | 96.86 / 85.23 | 92.17 / 84.97 | 100.00 / 90.84 | 1.58 / 4.52 |
| gson | 97.70 / 94.82 | 95.49 / 90.16 | 96.00 / 90.38 | 99.45 / 99.72 | 100.00 / 93.41 | 2.23 / 7.22 |
| fmt | 85.19 / 72.09 | 74.21 / 56.36 | 90.43 / 78.87 | 80.53 / 66.38 | 100.00 / 98.62 | 1.60 / 5.04 |
| Humanizer | 87.24 / 81.18 | 77.37 / 68.32 | 81.34 / 70.57 | 94.07 / 95.54 | 100.00 / 89.29 | 7.07 / 18.22 |
| rack | 94.34 / 86.86 | 89.29 / 76.78 | 91.83 / 82.30 | 97.00 / 91.97 | 100.00 / 90.28 | 0.41 / 1.93 |
| Slim | 99.65 / 91.52 | 99.31 / 84.36 | 100.00 / 86.99 | 99.31 / 96.54 | 100.00 / 100.00 | 0.72 / 2.23 |
Across the corpus, Synaptic produced 74,889 nodes and 118,000 edges versus Graphify's 32,547 nodes and 77,238 edges. Against 18,787 oracle declarations, Synaptic matched 17,531 with 1,256 oracle-only and 1,709 tool-only; Graphify matched 16,584 with 2,203 oracle-only and 5,525 tool-only.
Quality fixes
- JavaScript/TypeScript named arrow functions and assigned function expressions now own their calls and correct source anchor.
- Rust type aliases/unions and Java enums, records, annotations, and compact constructors are retained.
- C/C++ calling-convention, attribute, and project macros no longer fuse declarations or move anchors.
- Oracle scope excludes imports, fields, rationale, generated/dependency noise, and unnameable anonymous declarations.
h2is updated to 0.4.16 for RUSTSEC-2026-0258; RustSec and cargo-deny pass.
See BENCHMARKS.md for methodology, reproduction commands, and report paths, or the full changelog.