The assistant quotes the docs instead of retelling them
The wallet's assistant answers questions about the network and about the wallet itself, in English, Russian and Ukrainian. It is built differently from most assistants of this kind, and the difference shows on the first awkward question.
Retelling was the problem
The usual approach is to hand a model the passage you retrieved and ask it to explain. We started
there. A 1.7-billion-parameter model retold briskly and confidently: it called .agent a paid name
for a multi-signature treasury, which is .vault, and split addresses into open and closed kinds
that do not exist.
No metric caught any of it. The bar we had checked that certain forbidden words were absent, not that the sentences were true — and a confident, fluent, wrong sentence contains no forbidden words at all.
So the model stopped writing answers. It now does the one thing it cannot get wrong in our favour: it names which retrieved passage answers the question, or says none of them does. Choosing is not composing. You can only choose among things already written down; something invented has nothing to check it against.
Figures never pass through the model
Balance, fee, minimum stake, how much you sent and received — each arrives from the node already computed and drops into a fixed sentence. The model does not see the number and does not write it.
We deliberately do not add up transfers inside the assistant. A second money arithmetic living beside the chain's own will drift apart from it eventually, and the day it does, nothing will announce it. Totals got their own node endpoint instead, and it excludes bookkeeping markers exactly as the transaction list does — the figure and the list are read by the same person, so they have to agree.
Refusals are rules, not the model's mood. A request to sign a transfer is declined every time, rather than almost every time.
It knows the wallet, screen by screen
Ask what the Send button does, what the Recovery tab is for, why a transfer sits in held, or
whether anyone can register an AI model — the answer comes from an entry written for that screen,
in the language you asked in.
A description of a button is the first thing to rot. The button gets renamed, moved or removed, and the text survives it, confidently wrong. So every entry names the route it describes, and two tests hold the two sides together: an entry must point at a route the app actually has, and every screen must carry at least one entry. A renamed tab breaks the build; a new one cannot ship undescribed.
How badly that is needed is visible in our own repository. A knowledge folder sat there for months describing a consensus we replaced in the spring, read by no code and noticed by nobody, because there was nothing to check it against.
What the measurement cancelled
The plan called for the assistant to ask which of two readings you meant when the top candidates scored close together. We measured it and threw the idea away.
A correct choice can have a margin of 0.014. A wrong one can have 0.093. The distributions overlap completely and no threshold separates them. Worse, the most confident mistakes happen where the right tool does not exist at all — and no margin will ever catch that. In practice the feature turned correct answers into questions.
The measuring instrument needed as much repair as the thing it measured. It penalised Ukrainian for matching Russian word for word in a short template, when one string cannot belong to one of two languages. It graded knowledge-base answers as though a template were owed. And it degraded quietly to guessing whenever an import it needed failed, because the failure was swallowed. An instrument that errs in your favour is worse than no instrument.
Where it stands
Against a live node, forty-five questions across three languages: refusals by rule 100%, figures by template 100%, answer language 100% in each of the three, fabrications zero, routing 100%.
Most answers take a fraction of a second, because in most cases the model never runs.