Mova0.5 pre-release⌕
☰
home / docs / onto — the world model

onto — the world model

A model of abstractions kept separate from the narrative: TBox versus ABox from Smart annotator — layers, context, memory, section "World model — separate from the narrative". The guiding idea: build the world model before the mathematics; it still has to be taught, much like in fairy tales, that an apple is a fruit.

The core does not depend on en: lemmas and parts of speech come from OEWN itself. Only the hs module (goods classifier) takes parses from en and exact numbers from math.

In brief (2026-09-26)

How it works

Model (model.rs)

Build (build.rs, zip.rs) and snapshot (store.rs)

Seeds (seeds/) and layers

Inheritance (kb.rs)

A query on layer L sees only the seeds of L and its ancestors. An exception applies on its own layer and below: the fable CanSpeak does not make real crows speakers.

  1. Layer: the most specific layer where at least one visible seed concerns the concept or its ancestor decides. A fable overrides the real world only where it has said something of its own.
  2. Concept: within that layer the most specific concept wins. An ancestor's seed is overridden by a descendant's seed, and the proof shows it.
  3. Nixon diamond: two incomparable seeds with different values give "undetermined" with both proofs, not a random choice.
  4. Strength: Strict is not overridden on its own layer. A lower layer may explicitly override anything — that is what layers are for.

Word sense selection (query.rs)

Without a sentence, the context comes from the query itself (for isa and haspart the candidates are then ranked by the WSD score, section "Word sense selection by context"):

Every answer says which sense was taken, why, and at what frequency rank.

Queries

querywhat"no" or "unknown"
isa X YX is a kind or instance of Y; IsA/InstanceOf chain"no" — with two chains to the common ancestor where they diverge
can X V · prop X P [--layer L]property on a layer; chain to the seed, the defeated seed, the layer"unknown" if no seed applies
haspart X Y · partof Y X · memberof Y X · madeof X Yparts, including those inherited from ancestors, parts of partsOEWN meronymy is incomplete, so we never say "no" — only "unknown"
parts Xdirect parts, members and substances of the concept and its ancestors
frame V · role V R · inherits F Ga verb's frames with Core and other roles, frame inheritance"unknown" if the word is not among the lexical units
entails X Y · causes X Yverb entailment and causation, with hypernyms
word W · up Xa word's senses; ancestors

An unknown word gives "unknown", not a guess.

Examples (examples.txt):

$ onto can crow speak --layer fable
yes
  sense: crow → oewn-01581669-n «crow» (1st of 6, noun.animal; first sense) — «black birds having a raucous call»
  inherited: «crow» —IsA→ «corvine bird» —IsA→ «oscine» —IsA→ «passerine» —IsA→ «bird» —IsA→ «vertebrate» —IsA→ «chordate» —IsA→ «animal»
  seed d62 [fable — genre, Default]: oewn-00015568-n «animal» CanSpeak=yes — source: fable genre: animals talk (Aesop; …)
  exception of layer fable (applies only on it and below)
$ onto can crow speak          → no: seed d10 [real] animal CanSpeak=no
$ onto can penguin fly         → no: seed d14 penguin CanFly=no (gloss: «flightless»); overrides d13 bird CanFly=yes and d26 object CanFly=no
$ onto isa whale fish          → no: whale (2nd sense, noun.animal) ⊂ cetacean ⊂ aquatic mammal ⊂ placental ⊂ mammal ⊂ vertebrate;
                                  fish ⊂ aquatic vertebrate ⊂ vertebrate; diverge under «vertebrate»
$ onto frame buy               → yes: Commerce_buy ← buy.v (LU 2966); Core: Buyer, Goods; other: Money, Seller, …; Inherits Getting
$ onto prop nixon pacifist     → undetermined: d60 Quaker Pacifist=yes ⇐ Nixon —InstanceOf[r01]→ Friend;
                                  d61 Republican Pacifist=no ⇐ Nixon —InstanceOf[r02]→ Republican
$ onto isa blorft animal       → unknown: the word «blorft» is not in the world model (OEWN 2025+) — not guessing

Bridge to the narrative world (bridge.rs, read-only)

Sources and licenses

sourceversion, filelicensewhat we take
Open English WordNet2025+ (english-wordnet-2025-plus.xml.gz; the base english-wordnet-2025.xml.gz — only for the "plus" bit)CC BY 4.0: Lexicon header in both files. Commercial use — yes, with attributionsynsets, glosses, lemmas and sense order, IsA, InstanceOf, parts, members, substances, entails, causes
Berkeley FrameNet1.7 (framenet_v17.zip from nltk_data)CC BY 3.0 per the nltk_data index; no text found on the ICSI site; FrameNet 1.5 in nltk_data is NC. Check before commercial use (raw/en-framenet-1-7/SOURCES.md)frames, roles, lexical units, frame relations
Wikidata lexemesdump 2026-09-23 (wikidata-20260923-lexemes.json.bz2)CC0P5137 "item for this sense", P8814 "WordNet 3.1 synset", English glosses — trial alignment
Full Wikidata dump2026-09-15, (latest-all.json.bz2)CC0full pass on 26.09 → wikidata.duckdb (section "Wikidata: pass and database"); the geography project's folder was only read
Seeds seeds/our own, 26.09ours (closed part)OEWN glosses are quoted with the attribution above
FairytaleQA, "The Jelly Fish and the Monkey"texts — Project Gutenbergpublic domainone quote in seed d66

The papers Reiter 1980 ("A logic for default reasoning") and Reiter & Criscuolo 1981 (Nixon diamond) are only sources of ideas, not of data.

Numbers

Frozen set (data/frozen.tsv)

groupquestionsblind roundsecond round (NON-blind)
isa191718
prop232323
layer999
part97 (+2 "unknown")7 (+2 "unknown")
frame111111
verb333
total7470 (95%), 2 "unknown", 2 wrong71 (96%), 2 "unknown", 1 wrong

With the core and WSD (section "Check"): 72/74, 0 wrong, 2 "unknown".

Wrong answers of the first-sense rounds (both answered right with WSD):

"Unknown":

Reports: frozen-blind.md and frozen-second.md — every question with its proof.

Negative controls (onto controls)

controlon real dataon an injected defect
IsA cyclethe graph is acyclicedge animal IsA crow: the seed gate refuses, and bypassing the gate the full check finds a cycle of 9 concepts
Strictall 66 seeds passed the gate; the same exception on layer fable — acceptedpenguin LaysEggs=no against strict d42 on the same layer — refused
lemma ∈ synsetall 66 seeds and 2 edges passed; bird + synset bird — acceptedcrow + synset bird — refused
layer exception does not leak192 "word × property" pairs on real are identical with all layers and with the real one only; crow CanSpeak: real — no, fable — yesthe "all layers visible" defect gives 16 mismatches, including character
unknown word5 made-up words × 8 query kinds — all "unknown"the same check on "crow" goes red
shuffled hierarchyIsA 95%IsA edge endpoints permuted: IsA 53% — the "always yes" baseline level (53%); properties 100% → 39%; parts 78% → 67%
set hashmatchesone changed letter — mismatch
snapshotloads6 corrupted bytes or a truncated file — error

Bridge to the narrative world

Speed (onto bench)

Wikidata

Lexemes (CC0, onto wd-lexemes, 213 s on one core)

Trial alignment of lexemes with OEWN (onto wd-map)

English senses with P5137 → OEWN synsets. P8814 gives 1; other methods:

methodsenses
unambiguous (one sense on both sides)10 097 (30%)
by overlap of gloss words (≥ 2 and ahead of the runner-up)4 033 (12%)
ambiguous — no guess11 886 (36%)
lemma not in OEWN6 434 (19%)
different part of speech936 (3%)

Full dump: probe

Measurement (onto wd-probe, nice, 1 core, read-only, nothing written to the geography project's folder):

Wikidata: pass and database (2026-09-26)

Wikidata is loaded into DuckDB; it also carries translations — how an article, or an apple, is rendered in different languages. One streaming pass over the full dump → derived TSV (zstd) wikidata-derived → a separate database wikidata.duckdb (the main mova.duckdb — via ATTACH … (READ_ONLY)). Runs and reports — wikidata-2026-09-26.

How: dump copier (counts compressed bytes) → lbzip2 -dc -n 8 → 8 MiB chunks → 2 parser threads (Cow, labels first as RawValue) → each writes its own <table>-w<N>.tsv.zst; 10 threads, nice -n 10, a progress log every minute. The bottleneck is bzip2. The budget was estimated with the wd-sample sample: bzip2 blocks from an arbitrary bit offset, 48 chunks spread evenly over the file (the first GB of the dump are the most popular items, so a pilot on them overestimates).

Pass: 2 h 05 min, 13.8 MB/s compressed, 1.84 TB of JSON. 121 710 188 entities (121 696 284 items, 13 904 properties), 0 unparsed, [ and ] in place — exactly as many as the geography project counted on 17.09 (the wd-probe measurement gave ~67 M — a poor extrapolation from the heavy start of the file).

tablewhatrows
itemsQ, labels en/mul/uk, descriptions en/uk, sitelinks, Wikipedias, label languages, is_class (P279 as subject or value — 4 482 022), is_taxon (4 006 029)121 696 284
labelslabels and aliases in all languages — for classes, items with a sitelink, and taxa (31.2 M items), 637 languages421 364 939
sitelinksarticle titles of 364 language Wikipedias (without Commons, Species, Wikisource, Abstract Wikipedia; disambiguators in parentheses kept)67 553 750
claims(s, p, o, rank)P31 128.4 M, P279 5.24 M, P171 4.0 M, P361 5.46 M, P527 2.80 M, P186 2.35 M, P1034 2 267, P4733 95, P1582 3 886 and added P105, P1672, P2670, P3113, P462, P1419, P2974, P366, P1552, P3094 (why — PROPS in src/wdx.rs)153 165 153
strs, mono, quantP225 4.0 M, P2888 564 614, P1709, P5063 ILI, P8814; P1843 with language 817 895; mass 1.72 M, length 397 578, height 1.44 M, speed, lifespan — with unit and qualifiers4.6 / 0.8 / 3.6 M
propsproperty names en/uk, type13 904
isa_edges, isa_cycles, closureP279 + P171 without cycle edges; closure — for nodes with a Wikipedia article9.2 M / 14 / 271.7 M
lexemes, lemmas, forms, glosses1 675 319 lexemes, forms with grammatical features (18.2 M), 934 793 senses with glosses
sense_items, sense_links, sense_strs, lex_claimsP5137 → Q 339 127; P5972 translation 136 123, P5973 synonym 67 738, P5974 antonym 3 484; P8814 — 5
synset_qOEWN synset ↔ Q with status and support912 382

Macros: wd_label(q, lang) (lang → mul → en), wd_ancestors(q), wd_descendants(q), wd_isa(x, y).

Decisions and why:

Sizes: derived files 6.6 GB (budget 10), database 13.3 GB (budget 15). Loading — ~3 min; large tables are not sorted (a full sort of 121 M wide rows — Out of Memory at 20 GB).

Check queries (sql/wikidata-checks.sql):

P279/P171 cycles: 7 components, 14 nodes (cosmology ⊂ astrophysics ⊂ … ⊂ cosmology; corruption ⇄ abuse of power; two P171 loops). The gate lists them; the edges are removed from the closure and recorded; after breaking — a DAG. Negative control: edge fruit ⊂ apple — the gate goes red, a cycle of 7 nodes.

Synset ↔ Q (wd-align): 912 382 candidates from lexemes (P5137), P5063 ILI, P8814 and English labels; 53 392 synsets accepted (62.9% of nouns), 46 405 distinct Q. Silver — direct P5063/P8814 versus choosing from lexemes and labels only: 77.9% (21 231 of 27 239). Shuffled labels: 7 965 accepted — a 6.7× drop, while the pre-set threshold was 10×: support via general ancestors (up to 5% of nouns) lets random pairs through. This loose rule is the synset_q table of the database; the walker and the core use the strict rule (section "Strict synset ↔ Q alignment").

How to update: new dump → wd-extract (~2 h) → wd-lex (48 s) → wd-senses + wd-map → wd-closure → wd-align → sql/wikidata-load.sql and sql/wikidata-closure.sql → sql/wikidata-checks.sql. Commands — section "Commands".

License: Wikidata — CC0 1.0, both the full dump and lexemes: commercial use without restrictions, attribution not required, but the wikidata row is recorded in en/data/train-licenses.tsv. The dump lives in the geography project — only read, nothing written to its folder.

Wikidata walker (2026-09-26)

A small walker goes through Wikidata and collects seed candidates for the core. Sounds (P4733) are not collected. Numbers are kept as distributions, not as one specific animal: a lion's mass comes from a normal distribution. Runs — onto2-2026-09-26; database and derived files — read-only.

A whale is not a fish (src/wdwalk.rs)

Wikidata cladistics leads the whale into fish: whale —P279→ Cetacea —P171×16→ mammal [class] —P171×22→ Sarcopterygii [class] → Osteichthyes [superclass] —P279→ fish. Folk "is a kind of":

queryfolk rulefull cladistics (control)
whale → mammalsyes, 2 stepsyes
whale → fishnoyes, 26 steps — without the rule it goes red
crow → birdsyes (anchor taxon Corvus, 15 steps)yes
shark → fishyes (shark —P279→ fish)yes
bat → mammals · → birdyes · noyes · no
pike → fishyesyes
crow → mammalsnono

Strict synset ↔ Q alignment (wd-align)

The loose rule above plus: a generality threshold for the common ancestor of 2% (loose: 5%), two supporting sources — label, lexeme, direct link (ILI and P8814 together count as one support, they are set together), folk ancestors. Ancestor support but a single source — status single.

loosestrict
synsets accepted53 392 (62.9%)23 898 (28.1%)
shuffled labels: accepted7 965 — 6.7× drop586 — 41× drop (threshold 10×)
manual sample of 50 (loose)37/50 = 74%17 accepted, 16 of them correct (94%)
manual sample of 50 (strict)49/50 = 98%
silver (direct P5063/P8814 vs lex and label)77.9%78.5%

Core walker (onto wd-walk)

propertyPcandidatesconceptsconfidence ≥ 0.7
partP527, P2670831174153
useP366598151122
foodP103426732164
materialP1862266674
colorP462471939
no_partP311346360
habitatP297434115
mass · height · length · lifespan · speedP2067 · P2048 · P2043 · P2250 · P205252 · 30 · 24 · 12 · 4

Confidence = anchor (strict 0.9 · two supports 0.7 · one support or anchor taxon 0.6) × statement rank (preferred 1 · normal 0.9) × 0.85^steps to the ancestor. Numbers: own — ×0.95, distribution over descendants — ×0.7.

Examples: cat — part tail, claw, paw, tooth, snout; knife — part blade, handle, tang, use cutting; bread — material flour, water, salt; lion — food ungulate; horse — height ≈ 1.47 ± 0.19 m (n = 174, over 108 breeds).

LLM: a second opinion (onto wd-confirm)

claude -p (claude-opus-5-5, effort high via --settings env, API key from local.md, no tools), with a cap, log vmm-calls.jsonl. The answer is "yes / no / refine + why". The criterion is the typical instance, default knowledge.

sample (60)yesrefineno
disputed, confidence 0.45–0.8 → seeds/wd-confirm.tsv10743
confident, ≥ 0.7 → runs/…/confirm-high.tsv (measurement)34719

Character — only in fables

At the cost of 5 Prop values (Cunning Vain Greedy Industrious Wise, preference noun.animal) — 7 seeds on layer fable (d67–d73): the fox is cunning, the crow vain (Perry 124), the wolf greedy (Perry 156), the ant industrious, the grasshopper not (Perry 373), the owl wise (Perry 437), the donkey not (Perry 188). The real layer is silent about character: prop fox cunning → "unknown", with --layer fable → "yes".

Check queries and the cycle gate — green (walk.md).

Compiled core, context-based sense selection, description (2026-09-26)

Well-known standard animals live a compiled life, not as a dynamic class (Smart annotator — layers, context, memory, "The core is compiled"). The test: how well the model describes the animals, trees, etc. of the tales. Runs — onto3-2026-09-26.

Core in code (build.rs, src/core.rs, src/coresel.rs, src/coregate.rs)

fieldcells knownvaluesunknownnot applicable
parts11433913347
use12329712447
material4711186161
food2311181190
habitat921105180
mass · height · length21 · 17 · 11distributions266 · 220 · 1867 · 57 · 97
lifespan · speed7 · 2distributions107 · 102180 · 190
risks293367 (71 — "none")10
total (3 234 cells)6671 3041 4111 156

All 937 values from Wikidata were confirmed by the LLM: "yes" — 896, "refine" — 41. No unchecked confident values remain. Numbers are the bottleneck: mass is known for 21 of 287 concepts, because Wikidata has numbers mostly for species, not for everyday concepts.

Word sense selection by context — WSD (src/wsd.rs)

A sense's score is a sum of terms, each visible in the explanation (onto wsd mouse "The cat caught a mouse"):

  1. Extended Lesk (Banerjee & Pedersen 2003): words shared between the sentence and the glosses and lemmas of the synset (weight 1) and of its neighbours — hypernyms up to 2 steps, hyponyms, parts, whole, substances (weight ½); IDF weights over OEWN glosses.
  2. Predominant sense from a corpus — McCarthy et al. 2004 (ACL P04-1036), onto wsd-prior:
    • a word's distributional neighbours — from within-sentence co-occurrences in the Leipzig corpora: eng_wikipedia_2016_1M, eng_news_2024_1M, co_s, significance, top-200 contexts, cosine;
    • neighbours vote for senses close in the graph: Wu–Palmer similarity to the 8th power (McCarthy used the sharp jcn);
    • output — 383 polysemous words in 18 s → sense-prior.tsv.
  3. Core: +0.5 for a sense that is a core concept.
  4. Domain: the share of sentence words whose senses (ranks 1, ½, ⅓) lie in the sense's lexfile.

Frozen set — data/wsd-frozen.tsv: 60 sentences, 14 words (dolphin, oak, bank, bass, apple, crane, seal, bat, jaguar, mouse, mole, pike, cricket, jellyfish). Sha256 2be56b43…, committed before the WSD code (f28a80d4).

systemcorrect
OEWN "first sense" baseline21/60 (35%)
everything together43/60 (72%)
Lesk only45/60 (75%)
corpus only (McCarthy)20/60 (33%)
corpus + core (no sentence)29/60 (48%)
without corpus47/60 (78%)
without Lesk28/60 (47%)

Concept description: onto describe and completeness on tale classes

onto describe fox --layer fable gives:

Every row has a source.

onto describe-eval — 305 classes from the tale and fable worlds (302 described). "Before" — graph and seeds, without the core; "after" — the core, then the graph. The core covers 89 of 302 classes.

categoryclassesfields per class: before → after"unknown": before → after
animals31–323.0 → 5.1 of 1275% → 58%
food162.8 → 4.3 of 760% → 38%
objects1173.1 → 3.7 of 966% → 59%
plants63.0 → 3.5 of 1070% → 65%
people78–792.0 → 2.3 of 561% → 53%
total3022.5 → 3.1 of 764% → 55%

By field after: parts 96%, risks 37%, use 24%, material 20%, food 29%, habitat 8%, mass 4%.

Opus judge (onto describe-judge): all 604 descriptions — 302 classes "before" and "after". Blind: versions shuffled under random numbers. Fixed rubric: C — correctness, F — completeness, U — usefulness, E — errors, each 1–5. Classes split by name hash: training — 194, held out — 108.

versionpartCFUEmean
beforetraining3.881.811.913.442.76
beforeheld out4.011.901.933.692.88
aftertraining3.931.992.023.452.85
afterheld out4.112.092.103.743.01

The "student — architect" loop — only the first round was done: the judge gave scores, the architect (describe-judge architect, saw only the training part) proposed three changes (runs/…/architect-r1.md):

  1. Word sense by score, not the first one:
    • lemmatization of plurals (shoes → shoe);
    • fairy-tale lexfiles — artifact, animal, plant, food, person — up; state, communication — down;
    • a threshold below which the LLM breaks ties.
  2. Parts and material only from physical ancestors and no further than 3 steps; general ancestors (whole, structure) give no parts; for magical creatures — a bridge to creature.
  3. WordNet glosses into fields via templates: "made of", "used for", "having a … and a …", "feeds on"; such values — with source gloss and lower confidence.

The changes were not implemented, and there was no second round. To measure rounds, the judge must use stable ids (class + version): currently the numbers depend on the shuffle of a single run.

Pronoun API (src/pron.rs) — for the upcoming coreference

Check (2026-09-26)

Independent tests (2026-09-26)

More tests for the common-sense builder. The sets are in tests/data/vmm/ (LLM) and in …/ext/, and the same files run on any build: onto vmm <tag> [--haspart rows.json] (the hash of every file is checked before the run; report — vmm-<tag>.md and .tsv in ONTO_RUNS).

LLM questions

groupcorrect"unknown"wrongnot supported
isa7406—
unknown (made-up words)10005
part / material / member23 / 4 / 325 / 16 / 72 / 0 / 0—
ability (can) / property / layer28 / 21 / 165 / 4 / 12 / 0 / 3—
mass, height, length, speed, lifespan, sense———70 + 75
total1795813150

Analysis of the 13 wrong answers (a third path — biology and definitions, not the data): all are our defects.

"Unknown" instead of "yes" for parts (48) — incomplete OEWN meronymy, as intended: we never say "no" about parts.

From the internet: catalog and samples

setwherelicensewhat was done
hasPart KB (Bhakthavatsalam et al. 2020)HF community-datasets/has_part"unknown" on the card — measurement only, not in the repo100 rows via datasets-server → tests-onto-ext; 23 yes, 77 "unknown", 0 wrong
NumerSense ("a bird has two legs")HF INK-USC/numer_senseMITthe set is loaded by a script (data from GitHub): not downloaded
CommonsenseQAHF tau/commonsense_qaMITcatalog; measurement later (multiple-choice questions)
PIQAHF ybisk/piqa"unknown" on the cardcatalog; measurement only
GenericsKBHF community-datasets/generics_kbCC BY 4.0catalog; a source of generalization seeds
DoQ (quantity distributions)GitHub only—family rule: we do not access GitHub
Verb Physics (size comparisons)GitHub only—same

HS: world model of goods (2026-09-26/27)

The goods classifier (HS, from the import-export project, about 6 thousand entries) is read into a word ontology, as for the tales. HS is a ready-made world model of goods (Smart annotator — layers, context, memory, "Thousands of domains"): a tree, "others", features, thresholds. Runs — hsonto-2026-09-26.

Data and license.

How it works (src/hs.rs, src/hsmap.rs)

  1. Tree: 97 chapters → 1 229 headings → 5 609 subheadings, with parents (data/hs/tree.tsv). "Others" are marked separately:
    • by code (…9, …90) — 1 375;
    • textual (n.e.c., other than) — 1 476;
    • both together — 906.
  2. Parsing. en (model ud-ewt-eslspok) gives lemmas, parts of speech and the tree in 2.6 s for all descriptions. The HS telegraphic style ("Fruit, edible: apples, fresh") is split by colon into levels (0 — the heading top) and by commas into pieces. A piece is either features from closed enums (enum State, Process, Attr) or a noun phrase. Rules that emerged on real descriptions:
    • the list "of sheep, goats, horses" extends across commas;
    • "excluding …" and "not fillets, meat of 0304…" — exclusions to the end of the level, "(excluding X)" — only within the parentheses;
    • "men's or boys'" — a purpose, not a product;
    • Latin names in parentheses — taxa;
    • "Nuts, edible" → edible nut, "Lighters: cigarette" → cigarette lighter, if such a compound exists in OEWN.
  3. Thresholds — via math:
    • "over 1000 but not over 1500cc" → Capacity ∈ (0.001, 0.0015] m³: exact rationals Rat, bounds with inclusivity;
    • units from math::units (kg, g, m, cm, mm, %), g/m² and cm³ — via Mono; t, l, kW, kVA, V, dtex, years — with an exact multiplier.
  4. Alignment (data/hs/terms.tsv, codes.tsv), with the reason on every row. Steps:
    1. Phrase → the longest one present in OEWN; British spelling as a fallback.
    2. WSD with the heading context: Lesk, corpus, core, domain.
    3. Product state: live → animal or plant; fresh, frozen… → food (also accepts animal). If the longer phrase lacks such a sense, the shorter one is taken: fatty liver — a disease, liver — food.
    4. Chapter domain — in a second pass: the lexfile share of the chapter's head concepts, "one sense per text".
    5. Then — the core concept, and then a Q via strict alignment (accepted).
  5. LLM confirmation (onto hs confirm → data/hs/sense-confirm.tsv).
    • Key — phrase, chapter and state class: live and frozen fish are not merged.
    • We take 240 disputed (margin < 0.15) and most frequent keys.
    • Final run: the LLM agreed in 112, chose another sense in 105, "none fits" — 23.
    • WSD errors in frequent words are the most costly: rubber in chapter 40 — a condom, iron — a clothes iron, steel — a knife sharpener, glass — a drinking glass, wood — not timber.

Numbers

measurevalue
head concept found (deepest product, otherwise the heading top)5 575 / 5 609 (99.4%)
head concept aligned with a synset5 254 (93.7%)
— core concept / with Q434 (7.7%) / 2 536 (45.2%)
terms (distinct phrases) / occurrences aligned4 298 / 4 792 (89.7%) · 17 282 / 18 176 (95.1%)
"unknown": head concept not aligned355 (6.3%)
label words without a class2 086 / 61 317 content words (3.4%)

Features (data/hs/feats.tsv): how many features, in how many subheadings.

stateprocessingof Xformpurposepartstaxonthresholdcompositionexcept
1 171 · 7352 236 · 1 4693 100 · 1 732613 · 4781 706 · 1 045238 · 218419 · 209958 · 7531 517 · 9271 890 · 1 166

IsA gate. HS says "product ⊂ heading top" (apple ⊂ edible fruit). The negative control swaps products between headings.

verdictrealcontrol
yes / yes via another sense824 / 9022 / 15
part / taxon heading / kind of the top's modifier ("Mollusc preparations: mussels")45 / 3 / 10618 / 0 / 0
sisters (common ancestor — the top's parent)13026
product made of the top's material / organism — source of the product675 / 102862 / 270
no — contradiction648 (24.7%)1 410 (53.8%)
unknown (product or top not aligned)335—

Feature versus core and seeds — 21 cases, and the gate found a gap in the seeds:

Neighbour thresholds. Subheadings of a heading with otherwise identical features must differ by a threshold.

New concepts (data/hs/new-concepts.tsv) — 494 phrases (894 occurrences) that are neither in the core nor in the graph:

Blind Opus judge (onto hs judge).

runMFPmeandistribution 1–5decoys$
r13.453.593.443.493 / 29 / 42 / 40 / 361.000.70
r23.593.593.653.612 / 24 / 40 / 44 / 401.000.71

Labels in other languages (onto hs labels, sql/hs-labels.sql). Q labels from Wikidata (CC0, data/hs/labels.tsv) were checked against the translation project's translations of HS names: does the stem of our concept's label occur in the subheading's translation.

languageukdefresplruitnl
match76.2%80.8%87.0%86.1%78.2%80.4%84.1%80.3%

Mismatches are mostly Q taxa with a Latin label (Bos taurus, Bubalina, Thunnini), families instead of species (Nephropidae), synonyms ("Innereien" versus "Schlachtnebenerzeugnisse"). Less often — our wrong concept: rose → rose hip.

API calls — within the cap: confirmation (a probe and two runs), judge (two runs).

onto hs describe examples (in full — runs/…/describe-examples.txt):

080810 — subheading of heading 0808 [apple, pear, quince] of chapter 08 [fruit, coconut, almond, apple]
head concept (goods): apple → oewn-07755101-n «apple» (noun.food; core: Apple; Q89)
  why: Lesk 0.77 [fruit, edible] + corpus 1.17 + core 0.50 + domain 0.32 + HS state 1.00 + chapter 0.94 = 4.70
  is a kind of (OEWN): apple → edible fruit → produce → solid food → food → …
HS: apple ⊂ edible fruit — ours: yes
features: state: edible; fresh
world model: parts pericarp; mass ≈ 0.167 kg ± 0.047; risks eat → allergy p ≈ 0.01 [core, with sources]

030213 — subheading of heading 0302 [fish, Alaska pollock, Atlantic salmon, Nile perch] of chapter 03
head concept (goods): Pacific salmon → oewn-02537365-n «salmon» (noun.animal; core: Salmon; Q2796766)
HS: Pacific salmon ⊂ fish — ours: yes (salmon → food fish → fish)
features: state fresh; chilled · except fillet; meat; fish offal · reference 0304 · taxon Oncorhynchus nerka, … (7)

870322 — subheading of heading 8703 [vehicle] of chapter 87
head concept (heading head): vehicle → oewn-04531608-n «vehicle» (noun.artifact)
features: threshold Capacity ∈ (0.001, 0.0015] m³ · composition: spark ignition internal combustion piston engine

Check.

Commands

export PATH=$HOME/.cargo/bin:$PATH
cargo build --release
../target/release/onto build                        # OEWN 2025+ and FrameNet 1.7 → $MOVA_DATA/onto/onto-v1.bin (ONTO_SNAPSHOT)
../target/release/onto isa apple fruit
../target/release/onto can crow speak --layer fable
../target/release/onto haspart bird beak · parts bird · frame buy · role buy Seller · inherits Commerce_buy Getting
../target/release/onto entails snore sleep · word whale · up crow
../target/release/onto eval blind                   # frozen set → $MOVA_DATA/runs/onto-2026-09-26/frozen-blind.{md,tsv} (ONTO_RUNS)
../target/release/onto controls | bridge | bench | stats
../target/release/onto wd-lexemes $MOVA_DATA/raw/wikidata/20260923/wikidata-20260923-lexemes.json.bz2 <dir>
../target/release/onto wd-map <dir>
nice ../target/release/onto wd-probe $MOVA_DATA/raw/wikidata-all/latest-all.json.bz2 1 <dir>
# Wikidata: pass and database (section "Wikidata: pass and database"; runs — ONTO_WD_RUNS, default $MOVA_DATA/runs/wikidata-2026-09-26)
D=$MOVA_DATA/raw/wikidata-derived
nice -n 10 ../target/release/onto wd-sample $MOVA_DATA/raw/wikidata-all/latest-all.json.bz2 <dir> --k 48 --mb 12 --level 9 --skip-wm
nice -n 10 ../target/release/onto wd-extract $MOVA_DATA/raw/wikidata-all/latest-all.json.bz2 $D --bz 8 --workers 2 --level 9 --skip-wm [--gb 2]
nice -n 10 ../target/release/onto wd-lex $MOVA_DATA/raw/wikidata/20260923/wikidata-20260923-lexemes.json.bz2 $D
../target/release/onto wd-senses $D <run>/wd-senses-en.tsv && ../target/release/onto wd-map <run>
nice -n 10 ../target/release/onto wd-closure $D --threads 8
nice -n 10 ../target/release/onto wd-align $D --wd-map <run>/wd-map.tsv [--generic 0.02] [--min-src 2] [--no-folk] [--out synset_q.tsv]
# walker (section "Wikidata walker"; runs — ONTO_WD_RUNS=$MOVA_DATA/runs/onto2-2026-09-26)
nice -n 10 ../target/release/onto wd-walk $D [--align <run>/synset_q-v2.tsv] [--core data/core.tsv] [--out seeds/wd-candidates.tsv]
../target/release/onto wd-confirm [--n 60] [--batch 30] [--cap 10] [--lo 0.45 --hi 0.8] [--out seeds/wd-confirm.tsv]   # LLM, $ — API
../target/release/onto prop fox cunning --layer fable
(cd $D && ~/bin/duckdb $MOVA_DATA/db/wikidata.duckdb < <repo>/onto/sql/wikidata-load.sql)
~/bin/duckdb -readonly $MOVA_DATA/db/wikidata.duckdb < sql/wikidata-checks.sql
# core, WSD, description (section "Compiled core, …"; runs — ONTO_RUNS / ONTO_WD_RUNS=$MOVA_DATA/runs/onto3-2026-09-26)
../target/release/onto core-vmm confirm [--batch 50] [--cap 7]      # LLM goes through candidates without a verdict, $ — API
../target/release/onto core-vmm risks [--batch 50] [--cap 8]        # risks of core concepts
../target/release/onto core-select                                  # → data/core-props.tsv; then cargo build (completeness gate)
../target/release/onto wsd-prior                                    # predominant senses from the Leipzig corpora → $MOVA_DATA/onto/sense-prior.tsv
../target/release/onto wsd mouse "The cat caught a mouse in the kitchen"
../target/release/onto wsd-eval                                     # WSD frozen set + shuffled-gloss control
../target/release/onto describe fox --layer fable [--no-core]
../target/release/onto describe-eval                                # tale classes before/after the core, completeness
../target/release/onto describe-judge [--cap 15] | describe-judge report   # blind Opus judge, $ — API
# HS: world model of goods (section "HS"; runs — ONTO_RUNS, default $MOVA_DATA/runs/hsonto-2026-09-26)
../target/release/onto hs build [--no-confirm]                      # HS22 (BACI) → data/hs/*.tsv, report hs-report.md (~5 s)
../target/release/onto hs describe 080810 [--text]                  # product description; --text — WCO description from a local file
../target/release/onto hs parse 030213                              # parsing debug (tokens and features)
../target/release/onto hs confirm [--n 240] [--margin 0.15]         # LLM confirms disputed and frequent senses, $ — API
../target/release/onto hs judge [--n 150] [--decoys 20]             # blind Opus judge, decoys as control, $ — API
(cd $ONTO_RUNS && ~/bin/duckdb -readonly $MOVA_DATA/db/wikidata.duckdb < <repo>/onto/sql/hs-labels.sql) && ../target/release/onto hs labels
cargo test --release                               # 36: world model, Wikidata, folk rule, anchors, LLM, core, pronouns, HS

What's next

  1. Core and WSD:
    • a fairy-tale corpus for predominant senses (news pulls mouse towards the device);
    • numbers for everyday concepts — mass is known for 21 of 287;
    • the "student — architect" loop: implement the round-1 proposals (word sense by score, physical ancestors for parts, glosses → fields) and measure on the held-out part;
    • one Wsd per batch for pronouns.
  2. Word sense from the text. WSD chooses by sentence; by text, "one sense per text" exists only as a hook. A second frequency vote — the sense order of Wikidata lexemes and our corpora.
  3. Wikidata into the core: human confirmation of what build.rs stitches into the core; filters for the systematic errors revealed by the LLM (P3113 of general classes, P186 "human food", P527 not about parts); P1034 — typical food, not all prey; general concepts (bird, mammal) — support via P8814/ILI without ancestors.
  4. Seeds from OEWN glosses automatically ("flightless", "edible", "swift" → a property with gloss provenance) with a manual sample.
  5. Selectional preferences from FrameNet roles (role semTypes) and IsA: who can be a Buyer, what can be eaten. Then — arc plausibility for the second parsing pass (Smart annotator — layers, context, memory).
  6. World: the LLM writes an entity's class directly as a synset id. The bridge reads the world state, not just the commands.
  7. Reasoning module: Horn clauses over the TBox (world model) and the ABox (the tale's world), every conclusion with a proof.
  8. Size, quantity, comparison: a lion is big, a mouse is small, a hare is faster than a tortoise.

Files

filewhat
src/model.rsconcepts, words, Pos, Src, Rel, Core, LEXFILES, CSR graph
src/build.rsOEWN XML and FrameNet → graph, build gates
src/zip.rsminimal zip reader
src/store.rsbinary graph snapshot
src/kb.rslayers, seeds, extra edges, inheritance, Nixon diamond, seed gates
src/query.rssense selection, queries with proof
src/bridge.rsbridge to the narrative world
src/eval.rsfrozen set, evaluation, negative controls
src/wikidata.rsfull dump measurement, lexemes, trial alignment
src/wdx.rspass over the full dump: lbzip2 → multi-threaded parsing → TSV zstd; sampling from the middle of the dump
src/wdlex.rslexemes → lemmas, forms, senses, translations; wd-senses for wd-map
src/wdgraph.rs"is a kind of" graph (P279 + P171), cycle gate, closure
src/wdalign.rssynset ↔ Q alignment with ancestor check, shuffled control, silver; strict rule — two supports, 2%, folk ancestors, gold
src/wdwalk.rsfolk "is a kind of" (P171 up to class, grade, bypassing clades), core walker, anchors, number distributions, check queries
src/wdvmm.rsLLM via claude -p — "yes / no / refine", cap and cost log
sql/wikidata-load.sql, sql/wikidata-closure.sqlloading derived files into wikidata.duckdb, macros
sql/wikidata-checks.sql, sql/wikidata-core-coverage.sqlcheck queries; core coverage of fable classes
build.rsbuild script — core data/core.tsv + data/core-props.tsv → enum CoreId, CORE (completeness gate)
src/core.rs, src/coregate.rs, src/coresel.rs, src/corevmm.rscore types and the "core ↔ graph" gate; completeness gate; selection; LLM (confirmation pass, risks)
src/wsd.rsWSD — Lesk, McCarthy 2004 from the Leipzig corpora, core, domain; shuffled-gloss control
src/describe.rs, src/judge.rsconcept description with proofs, completeness; blind Opus judge
src/pron.rspronoun API — gender, animacy, humanness
src/hs.rs, src/hsmap.rsHS: code tree, description parsing (en), features and thresholds (math); alignment with the world model, gates, controls, hs describe, judge, LLM confirmation, labels
data/hs/*.tsvHS: derived data only — tree, code → concept, features, terms, new concepts, contradictions, LLM confirmations, Wikidata labels (CC0); no WCO texts
sql/hs-labels.sqlHS: concept labels in eight languages from wikidata.duckdb
data/core-props.tsvcore — every "concept × field" cell explicit, with a source
data/wsd-frozen.tsv + .sha256WSD frozen set (60 sentences)
seeds/wd-confirm-high.tsv, seeds/wd-confirm-v3.tsv, seeds/core-risks.tsvLLM verdicts: confident sample (60), confirmation pass (2 071); risks of core concepts
src/tests.rstests on a synthetic graph
seeds/layers.tsv, seeds/defaults.tsv, seeds/relations.tsvseeds (including 7 character seeds on layer fable)
seeds/wd-candidates.tsvseed candidates from Wikidata — 2 171, with source, confidence and distributions; not truth
seeds/wd-confirm.tsvLLM second opinion on 60 disputed candidates
data/core.tsvcore — 294 concepts (lemma, domain)
data/align-gold.tsv100 synset ↔ Q pairs checked by hand (loose- and strict-rule samples)
data/frozen.tsv + .sha256frozen set (74)
data/fable-questions.tsv + .sha256fable questions (14)

This page in Markdown → https://md.mova.elamur.ai/free/en/docs/onto/