d62929ca0d
Qualified live applicants and found three problems, all fixed: - Duplicate cards: one ad fanned out into «پرستار» + «پرستار کودک» (same person). Applicants now publish ONE listing (no role fan-out); secondary roles → tags. - Role sprawl: modifiers became roles. Prompt now returns the BASE profession and pushes age-group/ward/seniority to tags; new roles only for a genuinely new base profession (تکنسین داروخانه ✓, پرستار کودک ✗). - Tag/category noise: categories pinned to the 5 fixed groups (+سایر, never invented); BuildTags drops pay/contact/location/fragment words. Reprocess action: IngestionService.ReprocessAsync re-runs the current pipeline over every stored RawListing WITHOUT re-fetching (keeps the raw text, so nothing is lost to sources only exposing recent posts), deleting the old aggregated posts and republishing cleanly. Admin dashboard button «پردازش مجددِ آیتمهای ذخیرهشده» runs it on a background scope; result lands in the run-log. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>