b223d3af2d
The dynamic taxonomy minted ~150 roles incl. exact triplicates («پرستار کودک» x3), multi-role compounds («پرستار و بهیار»، «ماما / پرستار»، «پزشک و پرستار و بهیار»), and typos («بیهیار»، «بیار»). Creation hardening: ResolveOrCreateRole now collapses a compound to its FIRST base role when that segment is a known role (so «پرستار و بهیار»→«پرستار», but specialty names like «قلب و عروق»/«پوست و مو» are left whole), and new aliases fold typos/synonyms (بیهیار/بیار→بهیار، فیزیوتراپ→فیزیوتراپیست، نسخه پیچ→تکنسین داروخانه، پرستار بچه/اطفال→پرستار کودک). Cleanup: MergeDuplicateRolesAsync (+ admin button) maps every role to a canonical form and merges same-canonical roles into one keeper, repointing all shifts/jobs/talent/preferences/alerts/profiles first (mirrors the manual /Admin/Roles merge). Combined with the no-fan-out change this should cut the dropdown to a clean base set. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>