Three issues in categoryAliasList/categoryMatcher:
1. categoryAliasList appended raw synonyms without deduplication—the
addAlias helper already handles lowering and dedup, so route synonyms
through it instead of direct append.
2. categoryMatcher.matches had a fast-path that returned false when the
input contained no separators (-_ space), skipping the normalization
step entirely. This caused legitimate matches like "frozen foods" vs
"frozen" to fail when the input was a simple word that needed plural
stripping to match.
3. normalizeCategory unconditionally replaced underscores/hyphens and
re-joined fields even for inputs without separators. Gate the
separator logic behind a ContainsAny check, and use direct slice
indexing instead of TrimSuffix for the plural stripping.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>