The payoff: what runs in production is generated from, and stays true to, the knowledge your experts approved, and it scales across your data without a re-architecture.
This page goes under the hood of how verified knowledge runs at scale, the graph engine, the schema language it compiles to, and how it distributes. It is written for technical evaluators, with a short summary above each diagram so the through-line stays clear whether or not you read the diagrams themselves.
Back to Architecture & StandardsOnce your knowledge is proved, it runs over your live data in an engine whose structure comes straight from that proved knowledge, not a database schema someone maintains by hand. Built on a distributed, battle-tested foundation, it keeps what runs in production from ever quietly drifting away from the knowledge your experts approved.
A BFO 2020-typed distributed hypergraph, built on an eleven-year fork of Microsoft Trinity (SIGMOD 2013), the engine Microsoft Research reports running as a server cluster behind the Microsoft Knowledge Graph, also known as Satori. Four layers, read top to bottom: how systems connect, how the knowledge is enforced, how it is represented, and what it runs on. The organizing idea is that your ontology is the type system, so what runs in production cannot drift from what your experts approved.
The configuration we ship today is a single node. On one machine it holds 100.7 million BFO-typed cells resident in about 55 GB, serving TCP/RPC and gRPC at the same time, with every protocol its schema declares registered and dispatching. That is a capacity measurement taken from a running engine. It is not a throughput benchmark: we have not run an audited workload against it and do not claim one. The distributed cluster is real, inherited capability with multi-partition fan-out wired, but we would rather tell you what is shipped than what is possible.
Static and dynamic Trinity clustering is battle-tested in its original lineage and the fan-out path is wired here. Throughput figures quoted internally — such as a heartbeat floor above 5,000 operations per second, are test gates used in our own build, never published benchmarks.
The type system running in production is the ontology your experts approved.
Powered by OntoMotion™Inside the engine, every concept and relationship is a formally typed node, so the graph can only ever represent what your ontology actually allows. It refuses to store what the logic forbids, ruling out whole classes of bad or contradictory data before they can reach the systems that depend on them.
The graph refuses to represent what the standard forbids. Because both the things and the relationships between them are ontologically typed, a contradiction cannot be quietly stored and discovered later. It is rejected as it is written.
Queries walk typed relationships instead of joining tables, so a question is expressed the way a domain expert would phrase it: start here, follow this relationship, keep what matches.
StartFrom(cell)
.FollowEdge(ContinuantPartOf)
.VisitNode(predicate)LIKQ fan-out search resolves in-process on a single node, or across nodes through RPC hypergraph-query processors. Zero-copy accessors keep individual cell reads in the sub-microsecond range.
Theory-level consistency is discharged by the theorem provers, not claimed by the store. Two layers do two different jobs. The provers settle whether the theory itself is consistent. Generated runtime validators enforce the per-fact constraints as data is written, and they ship in every target language.
The catalogue runs to around 355 BFO 2020 axioms. Runtime validators are generated into all five SDK languages, covering relation algebra (transitivity, symmetry, antisymmetry, reflexivity, irreflexivity), category disjointness, dependence constraints such as inherence uniqueness and the quality-bearer requirement, mereology, and RCC spatial relations. Theory-level questions still go to the ATP substrate through OntoEnact, because whether a theory admits a model is a different question from whether a fact being written breaks a constraint.
You can ask a running engine how well grounded its own ontology is, and it will tell you where it falls short. A substrate report scores seven dimensions: grounding-chain completeness, schema conformance, axiom coverage, relation-property compliance, category conformance, entailment, and ATP consistency. It returns a composite alongside the specific gaps behind each one. How many concepts lack a BFO IRI. How many cell types are ungoverned. Which ancestor chain fails to reach the root universal.
A companion pass proposes repairs for those gaps, and it is deliberately conservative about which it will act on. Deterministic repairs the top-level ontology fully licenses are proposed at confidence 1.0. Anything inferred sits below a threshold and is marked for human review instead of applied. A third class, such as a broken ancestor chain, is reported and never auto-patched, because no amount of confidence makes it safe to guess. Gaps the tool declines are counted and the reasons are retrievable.
This is the same discipline as the prover verdicts. The system is allowed to say it does not know, and a low-confidence suggestion is never quietly promoted into a fact.
A contradiction cannot sit in this graph long enough for anyone to read it.
Powered by OntoMotion™The graph's structure is written in a schema language that is itself derived from your verified ontology and proved before use, so when the knowledge changes, the structure regenerates instead of drifting, sparing your teams the expensive re-engineering that keeping software current with changing rules normally demands.
A schema language that carries meaning alongside structure. Ordinary schemas describe how data is shaped. This one also records which formal concept each structure stands for, which is what lets the storage layer be checked against your ontology instead of merely described by it.
OGSL is a specified language. The engine we forked shipped its own schema language. We replaced it instead of extending it, and wrote OGSL from scratch with ontological grounding as a first-class construct instead of a comment. It carries a published EBNF grammar that has been through real revisions: v0.32.0, then v0.40.0, now v0.50.0.
The v0.50.0 grammar runs to four EBNF documents and roughly 4,900 lines: 145 productions for the core language, 144 for the BFO 2020 extensions, 55 for reactive streams, 30 for transaction logic. Those four map one-to-one onto the four layers described below. Every production in the core grammar is covered by the compiler, and a missing one fails the build.
One structure, bound to one formal concept. Read it as: this is the BFO universal entity, here is its identifier in the standard, here are the eight axioms that govern it, here is the formula they reduce to, and here is the cell the engine will actually store.
Nobody writes this by hand, and it is not meant to be written by hand. OGSL is deliberately verbose. It carries the ontological binding, the axiom identifiers, the storage layout and the codegen targets in one place, because a schema that leaves any of those implicit cannot be checked against the ontology.
Verbosity is the cost of being machine-checkable, so a machine pays it. The Graph Engine IDE authors OGSL for you, driven by the visual model and the OGSL design surface. The text stays readable so a person can review, diff and reason about it, which is the half that matters at audit time.
#ontologyspec { bfo: { category: Entity; iri: "BFO:0000001"; clifname: "entity"; label: "Entity"; definition: "An entity is anything that exists or has existed. The most general BFO 2020 universal, partitioned exhaustively into continuants and occurrents."; level: TLO; } clif: { module: "universal-declaration"; axioms: [nmq-1, mbf-1, uns-1, qaf-1, oap-1, lqn-1, nis-1, bee-1]; outdiscourse: ["entity", "continuant", "occurrent", "particular", "universal", "instance-of", "exists-at"]; formulas: [ "(forall (x) (if (entity x) (or (continuant x) (occurrent x))))" ]; } validation: { ontoenact: strict; phase: both; } codegen: { targets: [csharp, cpp, rust, go, java]; } } [BFO_IRI: "BFO:0000001", BFO_CLIFName: "entity", BFO_Label: "Entity", BFO_TLO, BFO_Universal, CLIF_Source: "universal-declaration.cl", BFO_AxiomIds: "nmq-1,mbf-1,uns-1,qaf-1,oap-1,lqn-1,nis-1,bee-1", GraphNode, HyperNode, OntoEnact: "strict", AxiomValidation: "both", GenerateValidator: true, Observable, CodeGen_Target: "all"] cell EntityEnhanced { // Fixed-width fields first, so the cell packs for zero-copy reads [BFO_TemporalParameter] DateTime CreatedTimestamp; [BFO_TemporalParameter] DateTime ModifiedTimestamp; bool IsActive; // BFO 2020 category, which is what makes type checking possible [Index, BFO_Role: "Category"] string Category; [Index, BFO_Role: "Identifier"] string EntityId; }
Because the binding is written into the schema itself, the theorem provers can check the storage layer against the ontology, and the graph engine, the generated code, and the proof all refer to the same definition. Nothing has to be kept in sync by hand.
The engine is designed to run across a cluster, spreading your data out while keeping every result consistent, so the platform grows with your data instead of forcing a re-architecture as you scale. Today's published performance figures are single-machine. The distributed design is built in from the start.
The same engine runs on a laptop and across a cluster, so an evaluation does not have to be rebuilt to become a deployment. What changes as you grow is the number of machines, never the model of how results are produced.
Routing uses a deterministic FNV-1a hash, so placement is idempotent and provenance-stable. Multi-partition write fan-out replicates across a share-nothing cluster. Static and dynamic cluster modes run over the same MemoryCloud substrate, with 256 trunks, 128 GB per-node capacity and a 1,000-connection client limit as shipped defaults. All three are configurable.
The distinction matters because it determines what is actually distributed and what only looks that way.
The clustering capability is real and inherited from a battle-tested lineage, and the fan-out path is wired, but we have not benchmarked it multi-node ourselves, and we will not present inherited pedigree as our own measurement.
The shipped configuration is single-node, as noted in the engine architecture above. Throughput figures used internally, on the order of 10,000 to 50,000 events per second with a P99 latency target of 20 ms, are test gates in our own build, not published multi-node benchmarks.
Once verified workflows are running, the engine and your systems hold a symmetric, full-duplex conversation, either side can start work, stream data, or observe decisions as they are made. Long-running processes stay live and auditable rather than fire-and-forget, keeping people and systems in the loop on every decision at the moment it happens, not after the fact.
Every decision the engine takes is emitted as it happens, so an operator sees the reasoning unfold instead of polling for a final answer, and the audit trail is the stream itself, never a report reconstructed afterwards.
Twelve command messages and roughly fifteen event messages over three bidirectional RPCs. Because the connection is symmetric and full-duplex, the engine can request data mid-run and the client can suspend, resume, or cancel a workflow already in flight, including heartbeat and session control.
The message shapes are defined once and projected onto both a network protocol and an in-process native interface. Your developers get the same payload either way, and nothing is re-specified by hand for the second surface.
A single wire definition carrying decision records, prover dispositions, and audit entries generates protobuf3 for gRPC and repr(C) plain-data structures for the native FFI. The same payload appears on both surfaces — never JSON on either, so there is no serialization tax and no divergence between them. The gRPC surface also carries RO-LSP (Reason-Oriented Language Server Protocol), the interface IDEs and editors connect through.
Streaming is not a special case bolted onto workflow execution. A client can watch a proof, a compile, or a live ontology edit unfold the same way.
Roughly 22 streaming RPCs across about 46 protocol definitions cover the reasoning suite, which is what makes a live IDE experience, or an agent that reacts as reasoning progresses, possible rather than aspirational.
Either side can open the conversation, over whichever transport you already run.
Powered by OntoMotion™