# Proat woordenlijst

`proat-dictionary.json` is de enige plek waar de woordenlijst van Proat wordt
bijgehouden. macOS, iOS en Windows krijgen hun kopie uit dit bestand.

## Een woord of regel toevoegen

1. Zet het erbij in `proat-dictionary.json`:
   - `vocabulary`: losse termen die de spraakherkenning moet kennen. Dit stuurt
     alleen (Voxtral-biasingprompt plus het `<CUSTOM_VOCABULARY>`-blok van de
     verfijning) en vervangt niets.
   - `replacements`: harde vervangingen. `from` is een komma-lijst met
     verbasteringen, `to` de canonieke schrijfwijze. Een `from` die met een slash
     begint is een regex (`/patroon/` of `/patroon/i`).
2. Hoog `packVersion` op. Zonder die verhoging seeden macOS en Windows de nieuwe
   regels niet: de versie is de vlag die bepaalt of er nog geseed moet worden.
3. Draai de generator en de tests:

   ```bash
   python3 dictionary/generate.py
   python3 dictionary/test_replacements.py
   ```

4. Bouw de platforms die je wilt bijwerken (`make local` voor macOS, Xcode voor
   iOS, `dotnet publish` voor Windows).

## Wat de generator schrijft

| Doel | Platform | Hoe het gebruikt wordt |
|---|---|---|
| `VoiceInk/Services/DictionaryPack.generated.swift` | macOS | `DictionaryService` seedt de SwiftData-store bij het opstarten |
| `proat-ios/Proat/ProatDictionary.json` | iOS | gebundeld, gelezen door `ProatDictionaryStore` |
| `../proat-windows/DictionaryPack.generated.cs` | Windows | `DictionaryStore` seedt `dictionary.json`, `VoxtralClient` gebruikt de woorden direct |

Die drie bestanden zijn gegenereerd. Pas ze niet met de hand aan, de volgende
generator-run overschrijft het. `python3 dictionary/generate.py --check` meldt
(exit-code 1) of een doel achterloopt op de bron, handig in een pre-commit hook.

## Regels waar je op moet letten

- **Eén letterlijke regel per doel.** Twee regels naar hetzelfde doel vechten om
  de sorteer-orde (langste `from` eerst), waardoor de kortste het laatste woord
  heeft. De generator en de tests blokkeren dit.
- **Geen gewone Nederlandse woorden als variant.** `graniet` naar `Granit` en
  `vakwerk` naar `Vakwark` staan er bewust in, op verzoek. Samenstellingen zoals
  "granieten" blijven ongemoeid door de woordgrens, een los "graniet" niet.
  Voeg een nieuwe twijfelvariant altijd toe aan `MUST_NOT_CHANGE` in
  `test_replacements.py` als hij een gewoon woord raakt.
- **Tekenbudget.** `biasBudgetChars` (5000) begrenst de Voxtral-biasingprompt.
  Zit de lijst erboven, dan worden termen aan de staart stil weggelaten. De
  generator faalt dan met een melding; verhoog het budget bewust of schrap
  termen.
- **Komma's in een regex mogen.** De engine detecteert een regex-trigger vóór de
  komma-split, dus een quantifier als `{1,6}` blijft heel.
