The figures in a table or chart come from the query, not the assistant
It writes the query that finds them. The platform runs that query against your system and renders every row itself. If the answer needs a difference or a total, the assistant asks the query for it and the platform works it out on the rows. The assistant gets the row count and a small sample of the first rows, so it knows the shape of the result, and it is told not to read figures from them. The block on your screen is drawn from the full result, straight from your database, and nothing that could change a figure sits between the two.
Every figure on screen is a rendered query result
A block the platform built from the rows the query returned, with the call that produced it attached: the tool, the table, the filters, the record count, and a handle that runs the same query again.
What the platform rendered
- You asked: Which customers are over their credit limit right now?
The assistant answered: Answered by the analysis model. Read as Customers over credit limit.
Used 4 tools: Open a guide, Search saved knowledge, Read table fields, Read Business Central records.
3 of the 42 customers with a credit limit are over it right now, by 123,550 DKK in total.
Customers over their credit limit Customer Balance (LCY) Credit Limit (LCY) Over by Nordisk Trædesign A/S 412,900 350,000 62,900 Vestjysk Maskinfabrik 288,450 250,000 38,450 Kolding Byg ApS 197,200 175,000 22,200 Read as Customers over credit limit · by customer.
Source: Customer · Business Central · CRONUS Danmark A/S · Production. Columns No. · Name · #59 · #20. #20 not 0, #59 > #20. Result 3 rows · 42 read.
Suggested next questions:
- Show open entries for Nordisk Trædesign A/S
- Which invoices are more than 30 days overdue?
- Who owes us the most?
- Under the message box: Figures in a block are read from a live query when they are shown. The words around them are AI-generated and can be wrong.
What the assistant was told back
{
"block": {
"type": "table",
"columns": ["Customer", "Balance (LCY)",
"Credit Limit (LCY)", "Over by"]
},
"row_count": 3,
"fields": ["No.", "Name",
"Balance (LCY)", "Credit Limit (LCY)"],
"computed": {
"Over by": "Balance (LCY) - Credit Limit (LCY)"
},
"totals": { "Over by": 123550 },
"truncated": false,
"status": "rendered"
}Column headers, field names, a row count, and one figure: the total of Over by, which the assistant asked the query for and the platform added up from the rows. Because a tool returned that total this turn, the sentence beside the block may state it. The block is drawn from the full result, not from anything the assistant typed, so it cannot round, soften or misremember a figure in it. The query also hands the assistant a small sample of the first rows to show the result's shape, with the instruction not to read figures from it; the Data page covers what is sent to the model.
- The call
The tool and the table, by name and number
Customer (18), named with its table number, read through the read tool in the environment and company the session is connected to. A consultant can open the same table with the same filter, see the same 42 customers, and find the same three whose Balance (LCY) is above their Credit Limit (LCY).
- The filters
Every condition the query applied
The filters are the definition of the metric, so they are shown rather than summarised. A figure quoted from a wider query and then pinned to a narrower one is caught by the platform and flagged, because the chart would stop matching the sentence.
- The count
How many were read and how many matched
Both numbers, plus whether the read stopped early. A live read pages automatically to 2,000 records; past that the result says it was truncated and no total is drawn from it.
- The handle
A path that runs the query again
Derived from the query itself and carrying no company, so the same handle answers for whichever company is asking. It is what pins the figure into a report, what a saved business term stores as its recipe, and what a daily check re-runs, each recipe at least once a week, to confirm the answer still holds.
On a Controller seat, the sentences around the block are checked too
The assistant still writes prose beside the figures: what it filtered, what it noticed, what it would check next. That text is the one place a number could slip in without coming from a query. On a Controller seat, every figure in it is checked before it reaches you: it has to appear in what the tools returned or were asked this turn, in your question, or in an answer you have already seen. Anything else is hidden behind a marker labelled not verified, which you can click to see what the model wrote.
A rounded figure
2 not verified
What the model wrote
Roughly 800,000 DKK across 4 users.
What you see
Roughly … DKK across … users.
The rows said 812,400 across 3 users. A figure that was rounded, softened or misremembered is not the figure that came back.
A figure the model wrote itself
2 not verified
What the model wrote
The caption said 777 and the prompt 555.
What you see
The caption said … and the prompt ….
Text the model authored is not evidence. A number it wrote into a caption cannot ground the same number in its prose.
A caveat with invented counts
2 not verified
What the model wrote
Only 500 of 3,901 rows are in this file. The export is incomplete.
What you see
Only … of … rows are in this file. The export is incomplete.
Neither count came from a tool, the question or an earlier answer. The warning stays; the invented counts are hidden.
A figure from the rows
Passed
What the model wrote
Revenue was 812,400 DKK, a 12.3 % share of 3,901 rows.
What you see
Revenue was 812,400 DKK, a 12.3 % share of 3,901 rows.
Every figure appears in the rows the query returned this turn, and the filter matches a figure in any of the formats it can be written in.
Dates, times and IDs
Passed
What the model wrote
Last 7 days (4 September – 10 September 2026), after 14:30, ticket #3, project PR0017.
What you see
Last 7 days (4 September – 10 September 2026), after 14:30, ticket #3, project PR0017.
Dates, years, clock times, week numbers, quarters, list markers and identifiers are never treated as figures, in Danish, English, German or Spanish.
And the query itself could not have overreached
Showing where a figure came from only helps if the query behind it could not have read something the person asking was never allowed to see.
- It runs as you
Your own connection, your own token
Every Business Central connection belongs to one user and holds that person's own delegated credentials. The assistant reads through them, so Business Central enforces the permission. A company, a ledger or a mailbox you cannot open stays closed, and that limit is not an instruction in a prompt that a clever question could talk around.
- Scope is below the tools
There is no tenant argument to get wrong
Where a tool could read across customers, the customer's identity is resolved beneath the tool layer and written into the query itself. The telemetry tools a customer gets take no tenant and no raw query, so they cannot be pointed at another tenant; free-form KQL is kept for UNI4C staff.
- Encrypted at rest
AES-256-GCM in the application, on top of storage encryption
Conversations, their tool results, generated files, attachments, report snapshots and every stored credential are encrypted by the application before they are written to storage that is itself encrypted. The encryption is authenticated, so data that has been tampered with is rejected rather than quietly decrypted.
- Everything is answerable
An audit log the application only appends to
Every state-changing path writes an entry naming who did it, what changed and when. The application only ever adds entries; no part of it edits or deletes one.
- Support access is yours
UNI4C reads your chats only while you allow it
An administrator in your company decides whether UNI4C consultants may open your team's chats. While it is off, no one at UNI4C can read a chat, only see how many there are. Each change is written to the audit log and your other administrators are notified.
Where it stops instead of guessing
A confident wrong answer costs more than no answer, so several paths are built to end in a refusal.
- A truncated read
It says it stopped
A live read pages automatically to 2,000 records and the result carries whether rows were left behind. A report refuses to aggregate a read that hit its ceiling.
- An empty result
A blank block is refused, not drawn
An aggregate over no matching rows comes back as a single empty row. Rendering that as a dash would read as a zero, so the block is refused and the assistant says what it found.
- An unsettled question
It asks, and gives you the options
When several customers match, or the period or the measure is ambiguous, the assistant asks a question with two to six one-click answers rather than picking one and being confidently wrong.
- A full-table scan
It is refused unless you ask for it
A free-text pattern on a table above a quarter of a million rows with no indexed filter beside it is rejected, and the error names the fields that would seek instead. It runs only when you ask for a search across the whole table.
Prompts go only to model endpoints in the EU: Scaleway in France and Requesty's EU-only routes. Where each part runs, who processes what, and the answers a procurement checklist asks for are on the Data page.
Bring the question you think would break it
Ask it the question you expect it to get wrong, then check the source line it gives against Business Central. Start a trial to try it in the portal, or book a demo and test it with one of us on a tenant set up like yours.
Or write to us at hello@uni4c.ai