4b84076540
The previous fix only covered the suggestion-chip ✕ flow (which calls /suggestions/reject). Removing a tag via the pill × in the Tags section goes through /tags/remove and wrote no feedback row, so the per-image rejection filter in get_suggestions had nothing to match on — auto-accept would re-apply the tag on the next modal load. /tags/remove now writes SuggestionFeedback(decision='rejected', suggestion_source='manual_removal', confidence=0) alongside the image_tags delete. The suggestion_source value distinguishes these rows from chip-reject rejections in the feedback log without complicating the get_suggestions filter (it matches on decision alone). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>