-- 0047_taste_profile_moods.up.sql — mood taste facet (#1534, milestone #160 -- Opt 2b). A fourth taste facet alongside artists + tags + eras: signed weights -- over canonical mood buckets (melancholic / energetic / chill / …) derived -- from a track's enriched folksonomy tags (#1490) via the internal/mood -- vocabulary, rebuilt daily. Weight is a signed float — positive = drawn to -- that mood, negative = passively avoided. Coverage is partial (grows with tag -- enrichment), so it's a supplement, not a foundation. Mirrors -- taste_profile_tags: CASCADE on user delete, indexed by (user_id, weight DESC). CREATE TABLE taste_profile_moods ( user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE, mood text NOT NULL, weight double precision NOT NULL, updated_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (user_id, mood) ); CREATE INDEX taste_profile_moods_user_weight_idx ON taste_profile_moods (user_id, weight DESC); -- Mood-facet build knob, tunable in the lab (mirrors era_scale / enriched_tag_ -- scale): scales how strongly a mood-tagged play imprints on the profile. -- DEFAULT 0.5 backfills the existing singleton and matches -- taste.DefaultConfig().MoodScale; 0 disables the mood facet entirely. ALTER TABLE taste_tuning ADD COLUMN mood_scale double precision NOT NULL DEFAULT 0.5;