-- =============================================================================
-- Migration 034: rag_query_log / learning_episodes embedding_signature
-- Operation Ollama-First v5.0 — BGE-M3 cross-table guardrail
-- 日期: 2026-05-12 台北
-- =============================================================================
-- 背景:
--   migration 026 已替 ai_insights.embedding 加 embedding_signature，但
--   rag_query_log.query_embedding 與 learning_episodes.embedding 仍缺同一護欄。
--   一旦 bge-m3:latest / normalize / dim 漂移，跨表 cosine 會退化且無法定位。
--
-- 設計:
--   1. 新增 nullable VARCHAR(64)，metadata-only，不回填、不重寫大表。
--   2. 新寫入由 services/rag_service.py 與 services/openclaw_learning_service.py 補簽名。
--   3. 既有 NULL 代表歷史資料，查詢端可保守放行或在後續 backfill 後收緊。
-- =============================================================================

ALTER TABLE IF EXISTS rag_query_log
    ADD COLUMN IF NOT EXISTS embedding_signature VARCHAR(64);

COMMENT ON COLUMN rag_query_log.embedding_signature IS
    'BGE-M3 一致性簽名；對應 query_embedding，NULL = 歷史資料或 embedding 失敗';

CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_rag_query_log_embedding_signature
    ON rag_query_log (embedding_signature)
    WHERE query_embedding IS NOT NULL AND embedding_signature IS NOT NULL;

ALTER TABLE IF EXISTS learning_episodes
    ADD COLUMN IF NOT EXISTS embedding_signature VARCHAR(64);

COMMENT ON COLUMN learning_episodes.embedding_signature IS
    'BGE-M3 一致性簽名；對應 embedding，NULL = 尚未 embedding 或歷史資料';

CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_le_embedding_signature
    ON learning_episodes (embedding_signature)
    WHERE embedding IS NOT NULL AND embedding_signature IS NOT NULL;

DO $$
BEGIN
    RAISE NOTICE 'Migration 034 done: embedding_signature added to rag_query_log and learning_episodes';
END $$;
