Home / Reasoning / Ask

Your data,
in plain language.

Ask questions of your own database in ordinary English. Get an answer, the evidence behind it, and a record of exactly how it was reached. Everything runs on your machine — nothing is sent anywhere.

Deterministic retrieval Evidence with every answer Loopback-only No API keys, no per-question cost
Interactive · watch a question become an answer

Language sits at
the two ends only

The part that decides WHICH records answer your question is deterministic. Pick a question and run it.

Ask · scope: BUSINESS · index built
Choose a question
Pipeline
The split is the safety property. The language slots carry no data-correctness responsibility: slot #1 only proposes phrases that are then resolved against the real catalog, and slot #2 only re-words facts the engine computed. A hijacked or hallucinating model therefore produces a wrong sentence above a correct table — never wrong data.
🎯

It cannot invent your data

The step that finds your records is a direct walk along real links between them — not a similarity guess. The language model phrases the answer; it never decides what the answer is.

same question, same data ⇒ same evidence
🛡️

Every answer can be defended

One panel shows the values it anchored on, the records it matched, which parts of your data it was allowed to see, and the exact text the model was given — word for word.

you can tell a wrong answer from a wrong question
🏠

It never leaves the building

The database, the language model, speech-to-text and text-to-speech all run locally and listen only on the loopback interface. No API keys, no vendor, no per-question cost.

answer payroll questions without telling anyone
Step 1 is a correctness control, not a filter

The catalog
is the grounding

You tick the areas of your business that are askable, and the index is built by walking the hierarchy of every knowledge area you chose. A question can only anchor on a value that is in that index — which is precisely why the scope picker is a correctness control.

A value outside the built index cannot be answered about. So the page states its scope and flags any concept that reached the engine ceiling — because an unindexed value would otherwise return a confident “no records found” that is indistinguishable from a true negative.

Quadrant → KAs /api/listka ↓ user ticks the scope walk the hierarchy, per KA /api/model/list → /api/concept/list → /api/item/list ↓ every value becomes an Anchor { item_id, value, concept, model, ka } ↓ valueIndex : normalised value → Anchor[]
Reported ceiling. handle_item_list() fills a fixed HierID ids[1024], so a concept with more than 1,024 distinct values is capped. 41 concepts sit on that ceiling — and the page reports it rather than answering from part of the data. Raising it is an engine change, not a front-end one.
Ask + ATLAS

Answering questions that
have no single record

“Which records match” is a lookup. “How are these two things connected”, “what else is like this”, “what are we probably missing” are not. ATLAS holds your whole dataset as a graph — 314,000 things and 4.1 million relationships — and answers that second kind.

Structural

What is actually connected

The clusters your data naturally forms, everything that neighbours the thing you asked about, and the shortest defensible path between any two records — with the strength of every hop.

asserted fact · traceable hop by hop
Dense

What is similar in meaning

ATLAS learns a mathematical representation of every record, so it can surface things that resemble your subject even when nothing links them directly — confined to the scope you ticked.

offered as resemblance, never as fact
Inferred

What is probably missing

Relationships ATLAS believes should exist but which nobody has recorded — the missing link between two customers, the duplicate entered twice, the record whose connections look nothing like its peers.

always labelled a prediction · never written in as truth
🔧

Let the model investigate for you

Ask can hand the reasoning engine to the language model as a set of tools and let it look things up for itself — neighbours, connecting paths, clusters, similar records, likely-missing links — until it can answer. Every lookup it makes is listed underneath the answer, so the investigation is reviewable.

🔒

Your scope is honoured all the way down

The areas you tick in step 1 travel with the question into the reasoning engine, so the six most similar records are the six most similar in scope — not whatever survives a search across everything you own. A question about one department cannot quietly read another.

How the prompt is assembled

Retrieved rows are
whatever somebody typed

So they are fenced, the fence markers are stripped from the content first — so data cannot close its own fence — and the system prompt states that nothing inside is an instruction.

And that is not enough, which we say plainly. A small model still follows instruction-shaped text inside the fence. Measured against llama3.2:3b with the full system prompt in place. It is contained by the pipeline split, not by the prompt — which is why the Audit panel shows the assembled prompt verbatim, and why the evidence table is computed independently of it.
-----BEGIN UNTRUSTED DATA----- FACTS: Filter: KEY = "T2A0001" Matching records: 1 KEY: T2A0001 ASSET: ASSET-0001 FUEL: WIND … GRAPH CONTEXT (ATLAS): clusters · neighbours · INFERRED … -----END UNTRUSTED DATA----- Question: …
What Ask sits on

Five processes.
Only one is required.

All loopback-only, reached same-origin through the dev proxy. The rest degrade features rather than break them.

/api

AtomicDB engine

REQUIRED — records, values, and the index behind every answer. Session-gated.

/atlas

ATLAS logic engine

optional — GraphRAG grounding (structural · dense · inferred) plus the agent tool surface.

:11434 · llama3.2:3b

Local language model

optional — both language slots. Absent ⇒ the deterministic template answers instead.

/voice

Speech to text

the microphone button only.

/tts

Text to speech

the speak button only.

latency

Pre-warmed and streamed

A cold model load costs ~160 s, so the page pre-warms on mount. Narration then streams — measured first token at 4.3 s, and the evidence table renders before it.

Measured, not claimed

Figures taken from the running system, not a benchmark rig.

0M
relationships held in memory across 314,291 records
~0 s
to the first words of an answer, once warm
0 ms
to map the neighbourhood around a record
0
bytes sent to any third party
100%
of answers carry their own audit trail
Teaching ATLAS — designed, not yet built

Every question already walks
a real path through your data

Today that walk is thrown away once the answer is rendered. The reasoning engine is built to learn from exactly this signal: it keeps a strength on every relationship and raises it each time that relationship is actually used. Feeding each answered question back would make the graph learn what your organisation actually asks about — so the connections your people rely on daily start ranking above the ones that merely exist.

The system already ships the safeguard this needs: a shadow mode that compares the learned ordering against the unlearned one, so the effect of learning can be measured before it is trusted. Usage shapes what surfaces first — it never changes what is true.

What still needs fixing

Stated, not hidden

Fencing stops retrieved data from closing its fence; it does not stop a small model from following instruction-shaped text within it — measured against llama3.2:3b with the full system prompt in place. Contained by the pipeline split, not by the prompt.
An engine limit in handle_item_list. Ask can report it but cannot page around it. Raising it is an engine change.
When anchors span two models the evidence columns come from the first anchor's model group only, and nothing currently surfaces that.

Everything on this page except the shaded panel is implemented and running today.