2026-07-06

sqry v27.0.8

This release closes out a long line of work since v17.0.1. The through-line is a sharper identity: sqry answers structural questions about code exactly, by parsing it like a compiler. The experimental natural-language surface is gone, and in its place are a declarative rule layer, structural shape matching, and a richer query planner. Here is the full picture.

Natural language is gone; structure is the whole product

The experimental natural-language surface was removed in v21.0.0: the sqry ask command, the sqry_ask MCP tool, the sqry/ask LSP request, and the entire on-device ONNX / embedding / intent-classifier stack. sqry is AST-based, not embedding-based. Removing the ML path made the tool smaller, faster to install, and easier to reason about, with no model downloads and no heuristic matching.

Everything that surface did is covered by exact structural queries:

sqry query "kind:function AND async:true AND lang:rust"
sqry plan-query "kind:function has:caller"

and by the structural MCP tools (semantic_search, relation_query, sqry_query, and the rest).

A declarative rule layer

sqry rules runs standing checks against the code graph. Resolve a shipped rule or pack by stable id, or point it at a TOML rule pack in your workspace, and the rule engine returns structured output plus a witness for each rule. The same capability is exposed to agents as the rules_run MCP tool.

sqry rules run <rule-or-pack-id>
sqry rules run ./my-rules.toml

Daemon hardening

The sqryd daemon got steadier under load in this line. The file watcher now starts automatically on workspace load, workspace watcher status is surfaced through sqry daemon status, and the read path runs on a bounded CPU executor with cancellation so a heavy query cannot starve the daemon.

Structural shape matching

sqry shape-match (and the structural_similar MCP tool) find functions with a similar body shape rather than a similar name. Each function gets an identifier-blind descriptor built from its control-flow shape plus a MinHash, so you get exact shape_hash identity and approximate Jaccard similarity. It finds copy-paste-and-tweak duplication that name-based search misses.

The sqry-db planner

sqry plan-query (and the sqry_query MCP tool) run on the newer sqry-db planner: a predicate-chain grammar with traversals and nested subqueries that compiles and fuses before executing against the unified graph.

sqry plan-query "traverse:reverse(calls,3) callers:main"
sqry plan-query "callees:(kind:method name:visit_*)"

The legacy sqry query grammar is unchanged and still supported.

Go context-propagation analysis

sqry context-propagation (and the context_propagation MCP tool) detect Go call-sites that drop context.Context plumbing: synchronous break sites, go f() goroutines that lose the context, and http.HandlerFunc-shaped handlers that never thread it through. It is a distinct, structural take on a bug class that text search cannot see.

C and C++ indirect-call precision

The C indirect-call work adds C-scoped query predicates for reasoning about function pointers and promiscuous call sites:

sqry query "resolved_via:binding_plane lang:c"
sqry query "address_taken:true"

resolved_via: records how each call edge was resolved, address_taken: flags functions whose address escapes, and callsite_promiscuous: marks call sites with many candidate targets.

MCP surface

Standalone sqry-mcp now exposes 38 tools; the daemon-hosted mode (sqry-mcp --daemon) serves a 16-tool subset from a warm graph with zero rebuild cost. Refinements in this line include a budget-safe summary mode for list_symbols, a path argument that scopes tools to a subtree, and an opt-in workspace-relative path redaction preset. The full list is at /tools.md and /docs/mcp/tools/.

Languages

sqry ships 37 language plugins, 28 of them with full relation analysis, including specialty plugins for Terraform, Pulumi, Puppet, Salesforce Apex, SAP ABAP, ServiceNow, and Oracle PL/SQL. See /docs/languages/.

Upgrade notes

Several changes in this line touched in-format graph semantics (the C indirect-call provenance, Go field and import edges, and the definition signal). Existing snapshots keep loading, but the new edges and predicates only appear after a rebuild. Run sqry index --force once after upgrading.

If you have older automation or docs that call sqry ask, the sqry_ask MCP tool, or --model-dir, migrate them to sqry query, sqry plan-query, and the structural MCP tools. That surface no longer exists.

← All releases