sysml
sysml is a CLI-native knowledge graph toolkit for SysML v2, the OMG systems-engineering modeling language. It’s a single Rust binary that runs in two modes, a clap CLI for humans and CI, and a stdio MCP server for agents, both delegating to the same sysml-core domain logic so neither mode duplicates the other’s behavior. Parsing comes from tree-sitter-sysml, a grammar I also maintain; sysml builds a queryable knowledge graph on top of it and exposes it through commands like search, trace, check, and query.
The design follows GitLab’s Global Knowledge Graph architecture (tree-sitter parsing into a property graph, then agentic traversal over it), but the working thesis is that CLI beats MCP as the transport: a trace call costs on the order of 50 tokens against an estimated 15,000 for an MCP tool’s schema load. That 15,000 is an estimate, and nothing has measured it. The companion benchmark harness doesn’t settle it either, because it varies tool sets rather than transports and exposes every condition over MCP; its four tool sets bill between about 250 and 1500 schema tokens, an order of magnitude under my estimate, which is a reason to distrust the estimate before the thesis. The comparison I actually want is still unrun.
Highlights
- The 9 coverage tests in
crates/sysml-core/src/graph.rs, documented in CONTRIBUTING.md, parse the test corpora on everycargo test --workspacerun and fail by name when tree-sitter-sysml’s grammar adds a node type the walker doesn’t know about yet, rather than silently dropping it. - Those tests caught a real bug:
queryandtracehad hardcodedskip_kinds = ["import", "member"], hiding 848 of 1454 relationships (58%) from every graph command until Phase 9.5 removed the filter fromqueryand made it opt-in ontracevia--include-structural. - Test fixtures are two real SysML v2 models, not synthetic ones: an LLM-generated Eve Online mining frigate (19 files, BSD-3-Clause) and Airbus’s Apollo 11 CoSMA mission model (28 files, MPL-2.0), which sysml-bench’s own README calls the largest public real-world SysML v2 model.
cargo-denygates the pipeline withaudit_allow_failure: false. Three transitive RUSTSEC advisories are waived indeny.tomlwith a one-line reason each (an unmaintainedpastecrate, an unsoundrand::rng()path this code doesn’t use, abincode1.3.x pin insidehnsw_rs), and nothing else is allowed through.- The
mcpfeature wasn’t covered by a plaincargo clippy --workspace, so a broken build under--features mcpshipped once before the pipeline moved to an all-features gate; one commit fixed the break, a second closed the gap in CI so it can’t happen quietly again. - CI is a fail-closed automerge gate, not just a green pipeline:
osv-verdictandcargo-verdicteach report a check, andautomerge-gateblocks the merge unless both are present and passing, which is the signal Renovate’s automatic merges read. - 10 MCP tools, 0 prompts (an early CHANGELOG draft claimed 15 tools and 4 prompts before a docs pass corrected it). Five CLI surfaces,
plan,skill,--format,search --layer,trace --trace-format, have no MCP equivalent yet, tracked as a known gap in CONTRIBUTING.md. - Ships two reusable GitLab CI components for consuming projects: a model validation gate (syntax check plus a completeness badge) and an MR model diff comparing the base branch’s index against the head branch’s.
Vector search behind fastembed is written but deferred: structural signals alone carry the corpora sysml ships against, and past that range the benchmark says vector search doesn’t rescue discovery either, so it’s unclear it earns its weight. The scaling wall in the Aside above is the question I’d want answered first.