更新紀錄¶
最新在前。簡短,刻意不完整——main 分支上的 commit 才是真正的來源,這裡只是給人看的彙總。
2026-04 — P5(UI v2 + 品質打磨)¶
前端重寫¶
- React 18 + Vite 5 + Tailwind 3 替換原有 vanilla HTML SPA。四 tab 導航(儀表板 / 自選股 / Claw / 設定),全面 TypeScript,帶型別的 API client + adapter 層把後端 Pydantic 對應成展示型別。
- 訊號卡重新設計,像素級複刻 v1 格式:標題、每 ticker 關聯度條(依層級著色:紅 / 金 / 藍)、中英雙語對照、按
[AGENT]標籤拆分的可收合 reasoning、Impact + Confidence 評分條、可展開的智慧代理詳情、非同步載入的 OG 預覽、合規免責聲明。 - UserMenu 下拉選單——點 Header 頭像查看 email、Settings 快速入口、Sign out(不再需要繞道 Settings 頁)。
- TelegramWizard——綁定流程變成三步編號指引,帶點擊複製的小按鈕,告別小字一大段。
- Ask StockClaw 頁面 給對話 transcript ≥55vh,Historical Search 移到下面,聊天卡不再被 RAG 區塊擠壓。
- OS 自適應淺色配色——GitHub 風格白卡片 + 淡灰頁面背景,調整了
text-gray-100在淺色下近乎全黑(之前是近白色灰底,幾乎看不見)。 - 盤前 / 盤後價格——自選股列在 yfinance 報
marketState為延長時段時,在常規價下方顯示 PRE / POST 徽章 + 盤前價 + 漲跌幅。用 CSS grid 做對齊,836.92和856.33的首位數字上下對齊。 - 即時狀態列——"Last updated 8s ago" 用 hook 的真實 fetch 時間戳驅動,每 15 秒 tick 一次;金色"What's moving the market"輪播真實的 12 條訊號標題,而不是之前寫死的 4 條 demo 資料。
訊號品質¶
- 緊急度分級清晰 —— FLASH / ALERT / NOTE / FYI 現在是 4 個獨立徽章(紅 / 橙 / 金 / 灰),不再把 FLASH + ALERT 合併成過載的 "BREAKING"。狀態列計數也拆開:"2 FLASH · 18 ALERT" 而不是"20 BREAKING"。
- 重複訊號修正 ——
RawItem.raw_id現在繼承自content_hash(sha256 of source URL + title),所以run_user_pipeline_task的 DB 去重實際觸發。之前raw_id每次爬取都是新 UUID4,dedup 是 no-op;使用者被同一篇 Yahoo Finance 文章每 ~20 分鐘 beat cycle 重複推送。同時減少 OpenRouter 開銷(重複文章會觸發新一輪 5-agent 合成)。
Ask Claw(RAG)修正¶
- BM25 分詞器 ——
websearch_to_tsqueryAND-匹配使用者問題裡的每個詞,幾乎從不命中。換成按內容詞 OR 連接的分詞器("Should I buy NVDA right now?"→"buy | nvda"),先去掉英文停用詞。 - 檢索診斷 ——
[rag] empty retrieval日誌列印出可見訊號數 + 每個 retriever 的命中數,RLS 失敗 vs. 查詢邏輯失敗一目瞭然。
部署 / 維運¶
- Vercel SPA fallback ——
/:path*→/的 rewrite,讓/login、/watchlist等在直接存取時回傳index.html。沒有這條時,Google OAuth 登入後重新導向到/login?code=…會 404。 - 市場行情快取 TTL 從 60 秒降到 30 秒;盤前 / 盤後價格現在 ~30 秒內刷新,之前 ~1 分鐘。
2026-04 — P4 完成¶
- P4.4 Google OAuth 用 JWKS/ES256 驗證(Supabase 目前預設);Sign in with Google 端對端打通。
- Web Push:VAPID 認證的瀏覽器通知,深連結回觸發訊號;FLASH 級得 sticky(
requireInteraction)banner。 - Telegram 多使用者:
deliver_batch從user_settings讀每使用者的telegram_chat_id,而不是全域 env var;使用者需透過 Settings 綁定。 - Per-user chat id + RLS 修正:
user_scope現在SET LOCAL ROLE authenticated,RLS 策略真正生效——之前 code 默默以 Postgres 超級使用者執行,帶BYPASSRLS。 - 智慧代理詳情面板:每條 signal 在卡片下的可展開表格裡帶每個 agent 的 impact / confidence / latency / error。
- 每 ticker 關聯度條 + Open Graph 預覽卡 為每條訊號的原文。
- 訊號卡重新設計 匹配 Telegram 推送格式——雙語對照摘要、signal id、signal_type pill、可展開 reasoning 區塊。
- email 魔法連結 走 Supabase(不需要 Google 帳號就能註冊)。
- 真實 Claw 對話 基於您的訊號做 dense + BM25 混合檢索,每次查詢寫入
rag_query_logs。 - Embedding 流程:每條新訊號在 commit 後立即 embed 到 ChromaDB(
paraphrase-multilingual-MiniLM-L12-v2)。 - Claw 規則 CRUD 帶 LLM 自然語言解析器(只儲存;觸發是後續工作)。
- OS 驅動的暗 / 淺主題 套用到整個 SPA。
- 真實市場資料 端點(
/market/quotes、/market/indices)透過 yfinance + 60 秒 Redis 快取。 - Watchlist 自動引導 讓新使用者落在可用的空清單,而不是死的"+ 新增 ticker"按鈕。
- 登出 UI(頂欄頭像下拉)。
- 法律頁面(
/privacy.html、/terms.html)和 這個文件站。
2026-04 — P3¶
- 寫入端點:
POST /watchlists/{id}/tickers、DELETE .../{ticker}、PUT /settings、POST /integrations/telegram/link、POST /claw/chat(當時還是 echo stub)。 user_settings資料表。- 新增 ticker 觸發即時爬取。
2026-04 — P2¶
- 唯讀 FastAPI:
GET /signals、GET /watchlists、GET /health、/ws/signalsWebSocket。 - JWT 認證 + 列級安全骨架。
- 前端關閉 mock 模式。
2026-04 — P1¶
- Supabase Postgres + Redis 透過 docker-compose。
- Celery + Beat 編排。
- 訊號持久化:流程把每條產生的 SignalCard 寫入 DB。
- SQLite → Supabase 自選股遷移。
2026-04 — P0¶
- 5 智慧代理合成引擎,帶 Reflexion 和 Pydantic 驗證。
- RSS / yfinance 爬蟲。
- 自選股 SQLite DB。
- 前端 SPA(儀表板 / 自選股 / Claw / 設定)帶 PWA manifest。
- Telegram bot 推送(單使用者)。