2347f5eaa2
Adds a per-image rejection filter to get_suggestions so once the user clicks ✕ on an auto-accepted chip (or rejects a regular suggestion via the existing ✕ button), that tag name stops reappearing in suggestions — including auto_accept candidates. Without this filter, the undo flow was cosmetic: the user's ✕ removed the tag from this image and logged a SuggestionFeedback decision='rejected' row, but the next modal load re-ran auto-accept against the same unchanged WD14 predictions and re-attached the same tag. Rinse, repeat. Implementation: _rejected_names_for_image(image_id) reads distinct tag_names from suggestion_feedback where decision='rejected' for this image. get_suggestions filters merged results against that set alongside the existing blocklist filter. Both auto-accept candidates and the three core categories respect the filter. Tested on image 222 at threshold=0.9: first load auto-applied 23 general tags; rejected '1girl'; second load auto_accepted.count=0, general suggestions had 10 new items, '1girl' absent from both. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>