weave: use observation-level tag mapping instead of embedding matcher
the embedding-based _match_cards_to_tags returned 0 matches because short
URL strings don't embed close to tag names. now create_cluster_cards
returns both cards and a tag->card mapping built from the observations
that contained those URLs — direct association, no similarity threshold.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>