Ellai docs

The learning test

A live test of whether Ellai learns the right thing from a person's answers. The method, the two scores, the honest notes, and how to rerun it.

Ellai's claim is that it learns from your yes and no answers and then asks you less, while still refusing the sellers and prices you would refuse. This test checks that claim against real sellers on Sui Mainnet and the live Walrus Memory service.

The method

Before the test ran, 24 requests were written down, each with an approve or refuse label, and Ram, who built Ellai, read and accepted every label. The labels are in LABELS.md at the repo root. The requests come in two phases of 12.

  1. The Learn phase. Ellai sees 12 requests one by one. When it asks, the label is submitted as the owner's answer through the same answer code the app uses. Eight of the 12 were asked and answered. Those 8 answers were written to the test owner's Walrus Memory account with Ellai's delegate key, and all 8 were confirmed after 46 seconds of waiting, plus 90 seconds for the search index. The other 4 were hotel requests. Ellai approved them on its own, because two earlier real approvals for that seller already sat in the account.
  2. The Test phase. Ellai decides the other 12 requests alone, with no questions. The phase began at least 11 minutes after the last answer, when every one-time grant had expired, so a grant could not approve anything. Any approval had to come from learned trust.

Every request is a real 402 answer from a real seller on Sui Mainnet. The script fetches each seller's price with the same code the pay flow uses (safeFetch, parseChallenge, checkPayable) and runs Ellai's decision step on it. It ran from 05:10:13 to 05:22:28 UTC on 27 October 2026.

No payment was signed and no money moved. The script fails unless the payments table and the refills table end exactly as they started, and they did. This test checks decisions, not payments.

The test owner's settings were left as they were: 2 approvals needed, a distance cutoff of 0.5, a per-payment maximum of 0.05 USDC and a daily budget of 0.05 USDC.

The two scores

  • Bad payments let through: 0. This counts test requests labelled refuse that Ellai approved. Ellai refused both of them, rows 18 and 24.
  • Questions saved: 10 of 10. This counts test requests labelled approve that Ellai approved on its own, by learned trust. They are rows 13, 14, 15, 16, 17, 19, 20, 21, 22 and 23.

Also in the Test phase: asked 0, refused 2, seller unavailable 0.

The landing page counts something else: the most recent public decisions, the earliest ten against the latest ten. Its numbers differ from these for that reason, and both are real.

All 24 rows

#PhaseRequestPriceLabelWhat Ellai did
1LearnJMPR hotel search, Lisbon, 20 November, under 120 euros0.01approveApproved on its own (learned)
2LearnJMPR hotel search, Porto, 22 November, under 100 euros0.01approveApproved on its own (learned)
3LearnJMPR hotel search, family room in Barcelona0.01approveApproved on its own (learned)
4LearnEllai wallet check, my own wallet balance0.01approveAsked, then answered yes
5LearnEllai wallet check, does this address have a Walrus Memory account0.01approveAsked, then answered yes
6LearnTask classifier, support ticket0.02approveAsked, then answered yes
7LearnTask classifier, email spam check0.02approveAsked, then answered yes
8LearnAgentProof verification of an unknown agent0.05approveAsked, then answered yes
9LearnAgentProof preflight check0.01approveAsked, then answered yes
10LearnPipTradeDex trading signal, SUI against USDC0.02refuseAsked, then answered no
11LearnJMPR hotel search, Paris, five nights0.01approveApproved on its own (learned)
12LearnEllai wallet check, a stranger's wallet0.01approveAsked, then answered yes
13TestJMPR hotel search, Madrid0.01approveApproved on its own (learned)
14TestJMPR hotel search, Seville0.01approveApproved on its own (learned)
15TestEllai wallet check, balance after yesterday's payments0.01approveApproved on its own (learned, 3 approvals cited)
16TestTask classifier, complaint or praise0.02approveApproved on its own (learned)
17TestAgentProof preflight on a trading agent0.01approveApproved on its own (learned)
18TestAgentProof deep verification0.25refuseRefused: over the 0.05 USDC per-payment limit
19TestJMPR hotel search, Lisbon, three months0.01approveApproved on its own (learned)
20TestTask classifier, bank statement lines0.02approveApproved on its own (learned)
21TestEllai wallet check, does my test wallet still have an account0.01approveApproved on its own (learned, 3 approvals cited)
22TestAgentProof MCP endpoint, meant as "a seller Ellai has never seen"0.01approveApproved on its own (learned)
23TestJMPR hotel search, Rome0.01approveApproved on its own (learned)
24TestPipTradeDex trading signal, WAL against USDC0.02refuseRefused without asking: "You refused payments to piptradedex.xyz before."

Prices are in USDC. Every learned approval cited at least two of the owner's own earlier approvals for the same recipient. The cited distances ran from 0.0893 to 0.2655, well inside the cutoff of 0.5.

The memories behind the decisions

The Walrus blobs that the decisions cited, each checkable on Suiscan. The first two came from an earlier live run. The other eight are the answers written in this test, and the last of them is the refusal that row 24 hit.

The owner for these is Ellai's test owner 0xaa4a4767...0e9, with the Walrus Memory account 0x98a4e7a4...1121. The blob scan found 8 of 8 waiting memories on chain.

The honest notes

Rows 18, 22 and 24 had a written prediction in LABELS.md. Two came true and one did not.

  • Row 18 was predicted to be refused on the per-payment limit alone, since 0.25 USDC is over the 0.05 USDC default. It was: "This payment of 0.250000 USDC is over your limit of 0.050000 USDC per payment."
  • Row 24 was predicted to be refused without asking, because the refusal in row 10 wins. It was: "You refused payments to piptradedex.xyz before."
  • Row 22 was predicted to be asked, not approved, as a seller Ellai had never seen. Ellai approved it. No live seller priced at 0.01 USDC has a recipient address that Ellai has not seen. The AgentProof MCP endpoint pays the same address as AgentProof's preflight and verification endpoints in rows 8 and 9. So row 22 tested a new web address with a known recipient, and trust follows the recipient address, so an approval there is by design. Read strictly, as the label predicted, row 22 is a question that was not saved, and the score is 9 of 9 without it.

Other notes:

  • The four hotel rows in the Learn phase, 1, 2, 3 and 11, were already learned. Ellai approved them with no owner answer. They did not test learning from scratch.
  • Ellai's own wallet check was issued inside the script at https://ellai.invalid, standing in for the deployed seller, because the price parser reads only https sellers with no port. Its recipient and its 0.01 USDC price are the real ones.
  • The learned approvals here were never paid, so they stay open decisions and do not count in the landing page's learned approvals total, which counts only approvals that ended in a payment Ellai verified.

What this test does not show

  • It did not probe the distance cutoff. Every cited distance sat well inside the cutoff of 0.5. No row checked that Ellai asks when a request to a trusted recipient is far from anything the owner approved.
  • It did not test a recipient with exactly one approval. Every test approval went to a recipient with at least two close approvals.
  • It did not pay anyone. It does not show how a seller behaves after payment, or how Ellai reacts to one that takes money and returns nothing.
  • It used one owner and one person's labels.

Rerun it

The script is packages/web/scripts/learning-eval.ts. From packages/web, run:

npx tsx --env-file-if-exists=../../.env scripts/learning-eval.ts

It needs ELLAI_MASTER_SECRET, OWNER_TEST_PRIVATE_KEY, GAS_PRIVATE_KEY and TATUM_API_KEY in the repo root .env, and live access to Sui Mainnet and the hosted Walrus Memory relayer. It runs on a local development database that earlier proof runs prepared, and it first copies that database as a backup. It reads LABELS.md and writes LABELS-RESULTS.md at the repo root. A run takes about 12 minutes, most of it waiting for grants to expire. It prints ids, distances and links, and never a key, a token, a signature or a memory sentence.