araharah-executor
a9f9ab380c
feat(04-01): search contracts + JUPEM abbreviation table as DATA + symmetric normalizer
- types.ts: GazetteerEntry / SearchQuery / SearchHit / SearchSource (D-03/D-07/D-08)
— byId() is separate and synchronous; empty search() array = honest refusal
- rules/abbreviations.ts: the vendored JUPEM table (49 rows incl. Presint→Prsn
vowel-drop and MS 2039 A3 Kpg forms) as a ReadonlyArray of pairs, inverted once
by a single generic builder — extends by file edit, never a code change (D-09)
- normalize.ts: NFKD fold → punctuation collapse (keeps '/') → whole-token
expansion (canonical = long form) → longest-first glued split (remainder >= 3)
T1-T9 green; typecheck clean.