更新日志¶
最新在前。简短,刻意不完整——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 头像查看邮箱、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 条演示数据。
信号质量¶
- 紧急度分级清晰 —— 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 从 60s 降到 30s;盘前 / 盘后价格现在 ~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 策略真正生效——之前代码默默以 Postgres 超级用户运行,带BYPASSRLS。 - 智能体详情面板:每条 signal 在卡片下的可展开表格里带每个 agent 的 impact / confidence / latency / error。
- 每 ticker 关联度条 + Open Graph 预览卡 为每条信号的源文章。
- 信号卡重新设计 匹配 Telegram 推送格式——双语对照摘要、signal id、signal_type pill、可展开 reasoning 块。
- 邮箱魔法链接 走 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 推送(单用户)。