canonic sits between your data stack and your agents: an auto-built, git-versioned description of what your data means and how to query it safely. No guessing. And when it isn't sure, it refuses and asks.
An agent pointed straight at your warehouse sees tables and columns, not meaning. So it guesses, and a confident, well-formatted, wrong number is the worst kind of wrong. Real output from a live run:
"How do I query this safely?" Tables, types, grains, joins, measures: the executable semantic layer.
"What does this mean to the business?" Definitions, caveats, policies: searchable prose a human can trust.
"Which definition is canonical, and what must the answer obey?" Metrics, guardrails, assertions.
A knowledge page explains why "amount includes refunds unless filtered." A contract makes the SQL obey it. Documented caveats become enforced guardrails.
canonic never mutates your warehouse. It reads. There is no write path back.
It never silently edits your context. Every change is a reviewable diff anchored to evidence.
Ambiguous or unsafe? It returns a structured reason, not a guess.
Queries compile deterministically: the same question always produces the same SQL. An LLM only drafts context, never computes an answer.
Run entirely on your machine with a local model and local embeddings. Nothing has to leave your network.
A local event log tracks accuracy, freshness, and answer quality. "Trustworthy" is something you can check.
Multi-tenant isolation and role-based access are opt-in policies, not application code. Add a contract, and every query, yours or an agent's, is scoped before it runs.
Row-level isolation enforced by compiling a tenant predicate into every joined source, not just the table in the query. The tenant comes only from a verified Principal token, never from anything an agent or LLM supplies.
Role-based access to metrics, dimensions, and knowledge tags, with column-level masking (null, hash, partial). A denied lookup looks identical to a nonexistent one, so there's no existence oracle for an agent to probe.
Enforcement happens inside the deterministic compiler, not as a bolt-on filter, and every answer logs its tenant, roles, and exemptions for audit.
Point canonic setup at a local SQLite or DuckDB file. It introspects the schema, drafts your semantics, and ends by answering a real question from your data. Then connect Claude, Cursor, or any MCP client, no separate integration to build.