datumwise

Columna

An open-source data framework — a data model, a query language, and an engine — built so that no layer of it can return a confident wrong number.

pip install columna quickstart, two minutes →

start here

Never Let Your Agent Touch the Database

Why your agent should never hold database credentials — and what to put between them. Three minutes.

transactionbasis: eventsinventorybasis: spinecategory_profilebasis: spine=day · storeproduct ↔ categorytouchprimarysplit

the demo manifold, drawn from the released package at build time.


Columna has three parts. The Manifold is a data model that holds what your data means — declared by a person, then checked against the data itself before it serves. FrameQL is a query language that can only ask for meaning the Manifold declares. The engine serves nothing the model can't defend. Behind the model stands a published theory with a proved kernel — a growing fragment of its laws are machine-checked theorems, not house style.

Every answer comes back in one of four moods: serve (the number), disclose (the number and the assumptions it rides on), clarify (the question has more than one legitimate answer — choose), or refuse (the data does not define this — here's why). The same contract reaches a Python caller, an HTTP client, and an AI agent over MCP.

It is Apache-2.0, developed in the open, and currently at 0.14.0.


latest


Try a question

The demo below runs the shipped package. Tap a question to see the answer and the mood it comes back in.

this is the actual wire — what an AI agent receives. Every answer is a pair: a result, and its disclosure. The mood is how the pair reads.

what's in this manifold? — explore the data before you ask

👇 Tap a question to run it live. You'll get back the real result and the mood it answers in — served, disclosed, clarified, or refused.

this exact refusal, captured live, ships in the package.

New to the wire? Ask your own AI to explain it.
Columna's "wire" is the answer format an AI agent receives from a data query: a RESULT paired with its
CONTEXT, in one of four moods — serve, disclose, clarify, refuse — on one contract (contract_version
"1"), identical over MCP or a direct API call. Example: asking `avg(aov) @ cal.month` — an average with
no pinned input grain — returns `clarify` (which grain to average from), never a guessed number. Explain
this wire format to me, and answer my follow-up questions about it.

Transcripts on this site are generated at build time by running the released package; they are not edited by hand.


Where to go

In the order a reader usually wants them.

  1. Never Let Your Agent Touch the Database start here the position: why the model should never hold your database credentials, and what to put between them.
  2. 1
    Run the demo install, and a clarify, a refuse, and a disclose print on your machine as wire JSON.
  3. 2
    Read the case a complete worked example: a realistic warehouse, the Manifold that serves it, and recorded agent transcripts.
  4. 3
    Learn the framework what Columna, FrameQL, and a Manifold are; the three manuals; the live Explorer.
  5. 4
    Read the argument the eight-minute case for why this exists, with two live exhibits.
  6. 5
    Positions every stance we hold, with its evidence and its paper edition.
  7. 6
    The research corpus from the failure atlas to the proved kernel: every paper, one map, every claim one click from its DOI.

datumwise builds and stewards Columna: Huayin Wang (research), Irena Wang (engineering). It is an independent open-source research project.

We are taking three design partners for real-world deployments — contact@datumwise.ai.