跳转至

更新日志

最新在前。简短,刻意不完整——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.92856.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_tsquery AND-匹配用户问题里的每个词,几乎从不命中。换成按内容词 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_batchuser_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}/tickersDELETE .../{ticker}PUT /settingsPOST /integrations/telegram/linkPOST /claw/chat(当时还是 echo stub)。
  • user_settings 表。
  • 添加 ticker 触发即时爬取。

2026-04 — P2

  • 只读 FastAPI:GET /signalsGET /watchlistsGET /health/ws/signals WebSocket。
  • 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 推送(单用户)。