The QueryGraph stack is a governed semantic lakehouse for agentic AI: five coordinated open-source components that let AI agents answer questions over enterprise data while proving what they did — which semantics they used, which policies allowed it, which sources they touched, and which they were denied. The stack’s thesis is that the differentiating infrastructure for enterprise AI is not a bigger model or a longer context window, but a verifiable chain from question to answer: deterministic identity, dual policy gating, signed envelopes, canonical hashing, and lineage anchoring, all projected through open standards.
The five components, each independently useful, released in coordinated, codenamed versions:
qg-rust) and Python (qg-python): four
semantic projections (Semantic Croissant, CDIF, W3C DID, ODRL) plus OSI
business semantics, RBAC+ODRL dual gating, Ed25519-signed TypeDID
envelopes verified across languages, OpenLineage audit with signed
attestations, an HTTP /v1 API with envelope authentication,
MCP servers in both languages, an A2A agent card, and the governed
navigator loop. (Parts II–III.)Part IV walks the integrations end to end — catalog to governed answer, agent frameworks plugging in, and operating the stack — and the closing chapter lays out future work.
As of this guide, the current releases are QueryGraph 0.4.0 “Sentinel” (the governed-answer release, in both languages, following 0.3.0 “Goshawk”, the interoperability release), over Grust 0.12.0 “Lobster”, TypeSec 0.12.0 “Torcello”, and LakeCat 0.3.0 “Ocelot” — a coordinated substrate wave in which Grust merged its Full39075 GQL goal, TypeSec became an agent-interoperability security platform, and LakeCat proved stock-client Iceberg REST conformance.
This guide is the stack-wide companion to the dedicated QueryGraph book (which walks the semantic layer itself as a textbook). It is written to be self-contained: each component gets its own part and chapters, each standard is explained before it is used, every chapter closes with worked examples in Rust and Python as applicable, and the outputs shown are captured from real runs against the released code.