meta-ontology.com

In 1960, John McCarthy discovered that seven operators were enough to build a language that could describe itself.

Sixty-five years later, enterprise software still cannot describe the businesses it claims to run.

We are fixing that.

v

The Tradeoff

In 1970, disk cost $1 million per gigabyte.

When Codd designed the relational model, keeping every version of every fact was unthinkable. So UPDATE overwrites the old value with the new one. This was a reasonable tradeoff under impossible constraints.

Alice’s salary was $90,000. Now it is $100,000. Both of these are true. The first is a historical fact. The second is a current fact. UPDATE erases the first to store the second — not out of malice, but because there was no room to keep both.

The constraints have changed. Disk is a million times cheaper. Memory is abundant. We can keep everything now. We just haven’t updated the model.

The past happened. It cannot unhappen.

We finally have the resources to represent that.

One Representation for Everything

A fact is a triple: entity, attribute, value.

[alice, :salary, 90000]   ;; true until Tuesday
[alice, :salary, 100000]  ;; true since Tuesday

Both facts exist. Both are timestamped. Neither destroys the other. You can ask “what was Alice’s salary last month?” and get an answer, because the answer was never erased.

This is not a new idea. It is how RDF works. It is how Datomic works. It is how reality works.

What is new is taking this seriously.

Not as a graph database feature. Not as an event sourcing pattern. As the foundation. The only data structure. User data, schemas, queries, relationships, rules, violations, tasks — all triples. All queryable. All traveling through time.

One representation. For everything.

Seven Primitives

McCarthy needed seven operators to build eval — the function where Lisp becomes aware of itself. quote, atom, eq, car, cdr, cons, cond. From these, everything else is derivable.

We need seven primitives to build a domain operating system.

  STORAGE           COMPUTATION       ABSTRACTION

  assert           query             bind
  retract          derive            type
                   match
assert(entity, attribute, value)Add a fact.
retract(id)Remove a fact.
query(pattern)Find facts.
bind(name, type, scope)Name a thing.
type(name, constraints)Declare a shape.
derive(premises → conclusion)Infer new facts.
match(predicate, branches)Conditional dispatch.

Every form in the system — objects, actions, queries, rules, views, processes — decomposes into combinations of these seven. No form requires an eighth.

This is the test of a well-designed kernel: the surface is rich, the foundation is minimal.

The Eval Moment

In Lisp, eval is the moment the language becomes transparent to itself. Programs are lists. eval interprets lists. Therefore programs can inspect and transform programs. Code is data. The map is the territory.

We are one step away from this.

Today, when you define an entity type — say, Employee with attributes name, email, department — the system stores the definition as a JSON blob. One opaque string. The query engine cannot inspect it. You cannot ask “which entity types have a required email field?” using the same tools you use to ask “which employees are in Engineering?”

The schema is invisible to the system it describes.

The fix is obvious once you see it: decompose the blob. Store each attribute definition, each relationship, each validation rule as its own triple. Schema becomes data. Data becomes queryable. The system describes itself using its own primitives.

[Employee,  :et/name,       "Employee"]
[emp-name,  :attr/name,     ":employee/name"]
[emp-name,  :attr/type,     "string"]
[emp-name,  :attr/required, true]
[emp-name,  :attr/owner,    Employee]

Now you can ask:

(query
  (from (type AttributeDefinition) a)
  (where (= (field a required) true))
  (link a belongs-to et)
  (select (pick et name) (pick a name)))

“Which entity types have required attributes?” A question about the system, answered by the system, using the system’s own query language.

This is eval. Not in the Lisp sense — we will always have TypeScript as a host language. But in the sense that matters: one representation for everything. User data. Schema. Queries. Rules. All triples. All queryable. All time-traveling.

That is the root.

What Falls Out

When schema is data, and data is queryable, and queries can trigger rules, and rules can spawn actions, and actions create tasks, and tasks present documents, and documents capture facts, and facts feed back into rules —

you get a closed loop.

Rule:“Every employee must have an emergency contact.”
Violation:Alice has no emergency contact.
Action:Create a form. Assign it to Alice.
Task:“Alice: please add your emergency contact.”
Form:Alice fills it in. Submits.
Facts:New triples asserted for Alice's emergency contact.
Rule:Re-evaluates. Violation auto-resolves.

Zero manual intervention. The system defines the problem, creates the remedy, assigns the work, captures the result, and verifies the fix. Using the same seven primitives.

This is not a feature. This is a consequence.

A consequence of taking one representation seriously.

What We Build

Open Ontology

open-ontology.com

The platform. An open-source digital twin that unifies disparate data sources into a queryable knowledge graph. Triple store. Datalog. Lisp DSL. Time travel. The works.

Ontology-DB

ontology-db.com

The database. Where the primitives match reality — entities, relationships, facts, and time.

MCP Server

npx @open-ontology/mcp

Connect any AI agent to the knowledge graph. Assert facts. Run queries. Build ontologies. From any MCP-compatible client.

This is not a product. Not a platform.

An operating system for your domain.

Built by people who believe software should start with what is real.

If any of this resonates — if you have stared at your company’s data infrastructure and thought “this is wrong, but I cannot articulate why” — we would like to hear from you.

McCarthy, J. (1960). “Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I.”

Graham, P. (2001). “The Roots of Lisp.”

Abelson & Sussman (1996). Structure and Interpretation of Computer Programs.

Meta Ontology, 2026.