Markdown agents return zero. The ontology resolver returns real rows.
Arkiv's data-modeling guide says project + entity_type scopes an application's data. Follow it exactly on live Tiramisu and the query runs, succeeds, and returns nothing.
25,000+ entities, 37 namespaces, 415 real attributes — and no global schema. Attribute names are invented per project; the same name can mean different types in different projects.
The resolver grounds natural language in live on-chain vocabulary. It emits the exact grammar the node requires. What you see emitted is what gets executed.
The arkiv skill teaches the alphabet. Semantic Arkiv knows the words. Neither alone is enough.
&&, use str('x'), dec(4.5) not dec('4.5')type, not entity_typeGets you from a syntax error to a valid query.
type with values price_report, price_voteprice_report carries crop, mandi, price (as dec), stateprice_vote carries voter, verdict, voted_at_ms — no priceGets you from a valid query to the right answer.
Markdown-only baseline vs. the ontology resolver, measured on 10 real prompts against live Tiramisu.
Arkiv exposes two system attributes for scoped reads: $creator (original publisher, use for provenance) and $owner (mutation authority, changes on transfer). Both are addr typed.
Arkiv entities are created via a native system address — no contract deployment, no Solidity. The execute function takes an array of operations and returns the created keys.
Note. This project is read-only by design. The write path is shown for completeness — a natural extension is a write-side resolver that grounds mutations in the same vocabulary used for reads.
4 tools. MCP stdio over newline-delimited JSON-RPC. Nothing to install, nothing to compile.
2,705 triples, 14 SHACL constraints. Every emitted filter is grounded in vocabulary read off the live chain.
11/11 checks pass on a clean clone. Zero install.