What the symbol graph gives you

On by default, for Rust, TypeScript/JavaScript, Python and Go.

Written By Dustin

Last updated 27 minutes ago

TOVIO indexes your code into a symbol graph as part of ordinary operation — definitions, references, and the typed relationships between them. tovio commit builds the index for the files that changed; nothing separate to run, no daemon, no server.

Which languages

Four backends ship on by default, all pure Rust with no C toolchain to install:

LanguageFile extensions
Rust.rs
TypeScript / JavaScript.ts, .tsx, .js, .jsx, .mjs, .cjs
Python.py, .pyi
Go.go

A file in any other language is simply not indexed, and everything about it falls back to a text diff. That is the designed behaviour, not a failure. The same applies to a file above the indexer's size cap or nested unusually deeply — a large generated file in a supported language is skipped before parsing, which is the usual explanation when a symbol you expected does not turn up.

A wider set of languages exists as an opt-in build tier — generic tree-sitter grammars, off by default, Java and Ruby today. It is off by default deliberately: those grammars need a C toolchain, and the default build promises none.

What it enables

  • Find definitions and references across the repository, by symbol rather than by string.
  • Ranked symbol search, for when you do not know the exact name yet.
  • Interface-level diffs that flag breaking changes a textual diff makes look trivial.
  • Impact and relation queries — who calls this, which tests cover it, what depends on it.
  • Semantic-aware landing, where a protected lane can refuse a breaking change.
  • Symbol context for agents, so an agent orients itself without reading the whole tree.

It is advisory by design

The semantic layer is never on a core critical path. If the indexer is unavailable, a language is unsupported, or a symbol object is malformed, ordinary version control keeps working unchanged — commits still commit, merges still merge.

There is exactly one exception, and it is something you have to switch on: a protected lane can declare that a semantic check is required, and then a breaking change is refused at the land gate. Nothing else in the layer can block anything.

Protected files are not indexed in the clear

A symbol name and signature are derived from the file's plaintext, so they are exactly as sensitive as the file. A policy-protected file never produces a readable symbol shard: its shard is sealed under the same policy envelope as the content, and a reader who cannot decrypt the file sees neither its symbols nor any hint that they exist.

Where the commands live

Both tovio semantic and tovio behavioral are Advanced-tier, so they are hidden from the default command index to keep the everyday surface small. They run normally; they just are not listed until you ask:

tovio help --advanced

Turning it off

It is a default-on build feature. A build with --no-default-features compiles no indexer at all and no tovio semantic command — the subcommand is absent from that binary, so a query is rejected as unrecognised rather than returning an empty result.

Two things to know before reaching for it. The flag switches off more than the symbol graph; it is the minimal offline-core build, not a semantic-only toggle. And such a binary cannot land onto a lane that requires a semantic check — that land is refused rather than waved through.