# Gazetteer vocabulary

Plain list of domain-specific words the analysis LLM might not know —
medication brand names, proper nouns, colleagues, technical terms. Loaded
once at server start. Used to annotate close edit-distance neighbours in
Whisper transcripts as `Token [?Canonical]` for LLM-side review.

## Format

- One entry per line, UTF-8.
- Blank lines and lines starting with `#` are skipped.
- Matching is case-insensitive; original casing is preserved for display.
- Entries must be ≥5 characters (shorter tokens collide too often with
  everyday German words).
- Duplicates (case-insensitive, across files) are collapsed automatically.

### Optional: bypass-aliases for false-positive Hunspell compounds

A line may carry one or more `-`-prefixed alias tokens after the canonical:

```
Sellink -Seelink -Seelinks
```

Meaning: when a transcript token (case-insensitive) exactly matches a
listed alias, the gazetteer skips the Hunspell dict-veto and rewrites
the token to the canonical. Use this **only** when Hunspell-de
mistakenly accepts a known mishearing as a valid German compound and
thereby blocks a legitimate correction (e.g. Hunspell parses `Seelink`
as `See` + `link` and vetoes `Seelink → Sellink`).

- The `-` is the bypass marker; it is stripped before storage.
- Aliases are **exact match only** (no Damerau-Levenshtein tolerance).
  If a new declension or mishearing surfaces, append it explicitly:
  `Sellink -Seelink -Seelinks`.
- Aliases are scoped to the entry whose canonical wins the DL contest;
  identical aliases under unrelated entries do not interfere.
- A secondary token without `-` is a hard server-start error
  (`io::ErrorKind::InvalidData`) — the loader fails loud rather than
  silently misindex.

## Adding entries

Edit `vocabulary.txt` (or drop additional `*.txt` files into this
directory — the loader picks up every `*.txt` non-recursively). Restart
the server afterwards; there is no hot-reload. Keep entries phonetically
distinctive: `Tavor` is a good entry, `Haus` would match innocent words.
