The scorecard
What we have actually built
Nine tools over one engine, with four ways to reach it. This page is the honest inventory: what each tool is for, how they chain together, and what each one refuses to do. The refusals are the part worth reading.
Measured on a 108 word everyday sweep. One answer is wrong and we name it. Verified 2026-08-11 against CODE-STATUS.md.
One engine, four front doors
The analysis lives in a plain Python library. Everything else is a thin adapter on top of it. An MCP server so an AI assistant can call it, a REST API for apps, a browser page for people who will never install anything, and a command line.
Heads
One engine
Sources
The web page was added later and needed zero changes to the engine. That is the evidence that "one engine, many heads" was a real design rather than a diagram in a document.
The nine tools
Grouped by what they are for. Refuses is not a caveat list, it is the product: a tool that declines to answer is the only kind a teacher can safely put in front of a student.
The front door
One call that composes the rest and merges their provenance. Most callers never need another.
analyze_word
Return everything the project knows about one Tamil word: origin, root and meaning, formation, grammar, and an attested native equivalent when the word is borrowed.
Refuses Non-Tamil, multi-word or empty input comes back as an error saying what to fix. Any field no source can ground is reported as a gap rather than filled.
The fact-finders
Where the word came from, what it reduces to, and what it means. Each answers one question and carries its own sources.
classify_origin
Say whether a word is native (இயற்சொல்), Sanskrit-derived (வடசொல்) or a loanword, from orthography, the native FST parse and attestation.
Refuses திரிசொல் and திசைச்சொல் need corpus and dialect knowledge we do not have, so they are never guessed. When the signals cannot settle a class the answer is `unknown` with the evidence collected so far. Homographs get one entry per sense, because கால் is leg and also time.
get_root
Resolve the lemma or வேர்ச்சொல் from the ThamizhiMorph anchor. மரத்தில் gives மரம்; வந்தான் gives வா.
Refuses When the morphology is ambiguous the lemma is left empty and every valid analysis is returned. It never picks one quietly. With no analyser available the lemma is a gap, not a guess.
get_meaning
Return sourced senses with the source and retrieval date on each, from the knowledge store or a live pull.
Refuses A word no source can ground returns a gap with the reason. It never writes a plausible gloss.
The grammar tools
The two that answer a Tamil teacher's questions, and the two the ILAKKANAM benchmark tests hardest.
explain_formation
Split the word into Nannūl's six பகுபத உறுப்பு and name the புணர்ச்சி at each join, with the authority on every label.
Refuses A join the analyser cannot determine is left unnamed rather than invented. A simple or borrowed word is reported as பகாப்பதம், which is an answer and not an error.
explain_grammar
Return word class (பெயர் / வினை / இடை / உரி), வேற்றுமை for nouns, and tense with person, number and gender for verbs. Tholkappiyam first, with the authority recorded.
Refuses Ambiguity is preserved. The suffix இல் reads as both the fifth and the seventh வேற்றுமை, so both come back rather than one being chosen.
The equivalents tool
The highest hallucination risk in the whole server, and the one with the hardest rule.
suggest_native_equivalent
For a borrowed word, offer pure-Tamil equivalents that a named glossary actually attests, each candidate carrying its attestation.
Refuses An unattested coinage never surfaces, however plausible. A word with no attested equivalent comes back as an honest gap, which is a common and acceptable answer.
The writers
How coverage grows without anybody maintaining a word list. These are the only two tools that change anything.
enrich_word
Force the enrichment loop for one word: pull from evolving sources, write the result back to the knowledge store with provenance, and report what the store now holds.
Refuses Only fields with a real evolving source are cached. Rule-based answers are recomputed rather than stored, so a rule fix takes effect everywhere at once.
refresh_sources
Re-pull a batch of words, either named explicitly or selected by how stale their cached claim is, bounded by a limit so the network cost stays predictable.
Refuses Called with no scope at all it returns an error asking for one, rather than sweeping the entire store.
Summarised from the server's own tool descriptions, read 2026-08-19. Those descriptions are a product surface rather than documentation: a model decides whether to call a tool by reading them, and we once measured a model calling these tools 0% of the time under a neutral prompt. The server was returning correct answers. Nothing was telling the model to ask.
How a single call chains
Asking analyze_word one question fans out to the six read tools, merges what they
return, and reports each field with the source that grounded it. The two writers feed the same
store from the side, which is how coverage grows.
- Normalise the input, and reject anything that is not a single Tamil word.
- Ask the store. A hit is served with the provenance it was stored with.
- Ask the anchors: the FST for morphology, the cited rule tables and the pinned verses for grammar.
- Ask the evolving sources only for what anchors cannot supply, chiefly meaning and etymology.
- Merge, keeping competing readings rather than adjudicating them.
- Write back what was newly learned, tagged with its source and the date.
- Return the answer, with a gap wherever nothing could ground a field.
Step 6 is quietly the most important one on this page. Every resolved analysis is captured as verified, provenance-tagged data, so the corpus Tamil is missing accumulates as a by-product of ordinary use. That is the bridge to the horizon.
Every source declares two independent things
How good the evidence is, graded A to D, and what we are legally allowed to do with it. They are separate questions and collapsing them causes mistakes in both directions: a source can be excellent evidence that we may only consult and cite.
The grade is stamped onto every citation the server returns and shown in the app, so a reader can see that a claim rests on a pinned classical edition rather than on a community word list. This came out of finding that one word list we depend on had no stated licence at all, which is written up on the sources layer and stays published rather than quietly fixed.
What is not done
Current, from the code side, verified 2026-08-11:
- Non-finite FST coverage
- The full புணரியல் sandhi engine
- Storage backend abstraction
- The morphological-lift evaluation, paused
- No CI in the code repo yet
- No release rung shipped: version is still 0.1.0
The formation decoder handles 26 of 29 in-scope words in the everyday sweep. The remainder are non-finite forms, and they are blocked on a grammar question we have not settled rather than on code. We would rather leave them undecoded than name them wrongly.