主题
产品迭代 Roadmap — 2026 H2
创建:2026-07-21 · 更新:2026-07-22(补 3-6 首页→发现模块两步走 + §五 测试自动化金字塔) 物理位置:
~/reading-browser/docs/plans/product-iteration-roadmap-2026h2.md来源:ChatGPT 产品与竞品分析报告(/Users/larry/Documents/Codex/2026-07-21/qin/ReadingBrowser_桌面端产品与竞品分析报告_2026-07-22.md)
- Claude 会话交叉评估(核对了 product-launch-todo / backlog / 活跃 plans / git log 实况)。
性质:这是 roadmap(跨 sprint 的方向清单),不是实施 plan。任一条目进入实施时, 按惯例另开
<feature>-plan.md(必要时新会话),并回本文件把该条标 ✅ / 链到 as-built。 与backlog.md的关系:backlog 收零散任务;本文件收「本轮产品评估定下的结构化优先级」。两者不重复登记。
〇、对外部报告的评估结论(谁说了什么、采不采纳)
ChatGPT 报告整体质量高:事实层准确(读过真实代码与 plan 文档)、定位判断与 docs/product.md 一致。 采纳/修正结论如下,后续凡引用该报告以本节裁定为准:
| 报告论点 | 裁定 | 说明 |
|---|---|---|
| P0 发行可信度落后于产品完成度 | ✅ 采纳,最高优先 | 与 product-launch-todo.md A2/B1/C1/C2 全 ⬜ 吻合;首发版已在野外(landing 还在教用户绕 Gatekeeper) |
| P0 三档信息密度(阅读/辅助/分析) | ⚠️ 大半已做 | 三档净度 original/calm/reader 已 shipped(2026-07-12~14);复习卡已是渐进披露(cloze→揭晓→深挖)。真实增量只剩「默认单辅助面板 / 左右面板互斥」一条,降为第三梯队评估项 |
| P1 熟词冷启动(20-40 词自适应 + 行为型文案 + 收益反馈) | ✅ 采纳 | 文案+收益反馈便宜先做;自适应抽样量级需设计 |
| 熟词「词义歧义」(认识名词义不熟形容词义) | ❌ 不采纳 | mastery 三端都是 word 级(learning_entries 以 word 为键跨端同步),改 sense 级 = 动三端 schema + sync merge 全链路,代价 >> 收益;复习侧已有语境消歧 + sense_gloss 兜住精度 |
| P1 待发现词默认 Top 5-10 | ✅ 采纳 | 契合「不制造学习负债」定位 |
| P1 文章级推荐 + 客观 CEFR/个人难度/置信度三分 | ✅ 采纳 | 报告最有洞察力的设计输入;接 recommend-personalization 既有方向 |
| P1 复习评分效率(三阶段披露) | ⚠️ 基本已是现状 | 只取「间隔预览无差异时隐藏/合并」这一条微打磨 |
| P2 词汇库偏词典 → 个人记忆库优先 | ✅ 采纳且提为高优 | 数据全在库里(word_page_links / cloze sentence+sense_gloss / reading_pages),纯前端重排即可表达最强护城河 |
| P2 EPUB 长期阅读验收清单 | ✅ 采纳为测试 checklist | 报告措辞本就是「需验证」非「不存在」 |
| P2 小样本报告洞察卡 | ✅ 采纳 | 「完成 0 次复习」负向零指标观察准确 |
| §九 指标体系 + 4 个 A/B 实验 | ⚠️ 前提缺失 | RB 当前零遥测(launch-todo C3 ⬜,唯一埋点表 v25 已退役);先决策 opt-in 最小遥测,否则全部指标无从采集 |
| §八「暂不做」清单(视频/泛知识管理/游戏化/更多 AI 按钮/扩语种) | ✅ 维持不做 | 与既有产品战略一致,第三方独立验证 |
| 报告盲区(自查补充) | — | ① 未考虑跨端:复习流程改动必牵 RVH 镜像成本;② 未考虑 LLM/Supabase 边际成本与商业化;③ 未发现 anon key 需构建期注入(CLAUDE.md §5 已记录) |
一、第一梯队 —— 发行信任还债(P0,先于一切新功能)
依据:发布后每多一个用户,缺签名/更新/监控的代价翻倍。 真相源:
docs/plans/product-launch-todo.md(勾选状态以它为准,本节不重复维护 checkbox)。
| # | 条目 | 说明 / 挂钩 |
|---|---|---|
| 1-1 ✅ | macOS 代码签名 + notarization | 消灭 landing 的 Gatekeeper 绕行说明(launch-todo A2)。✅ 已了结(2026-08-01):dev.10 走 GitHub CI 四 job 全绿 + 公证一次过 + 两仓 publish + promote-updater;真机全绿(updater dev.8/9→dev.10 + 干净机首开良性框非 Gatekeeper 拦 + 麦克风 TCC 授权链路);landing「未签名/xattr 绕行」文案已撤。详见 backlog §macOS CI 了结横幅 |
| 1-2 ✅ | Tauri Updater 自动更新 + 三处版本号统一 | package.json / Cargo.toml / tauri.conf.json(launch-todo A2/B3)。✅ 已落地(2026-07-26,as-built updater-version-unify-plan.md):三处统一(真相源 = tauri.conf 带 -dev.N,set-version.mjs + CI check:version-sync;当前 0.1.0-dev.8);updater 接线(tauri-plugin-updater/-process + createUpdaterArtifacts + plugins.updater pubkey/endpoint + capabilities);前端 TitleBar 药丸 + Settings「应用」小节(useUpdaterStore/lib/updater.ts,避 content webview 遮挡);CI 签名 env + gen-latest-json.mjs + release.sh bump/promote-updater(人工闸门)。实机:cargo/vitest/build 全绿、fresh 库 sqlx 建库验证。GitHub Secrets 已配(TAURI_SIGNING_PRIVATE_KEY+_PASSWORD,2026-07-26);端到端更新已由 dev.8/9→dev.10 真机验证通过(2026-08-01,见 1-1) |
| 1-3 ✅ | Sentry 接入(Tauri Rust + React 两层) | launch-todo B1;线上问题目前完全盲。✅ 已落地(2026-07-26,as-built sentry-integration-plan.md):两层各一 DSN,构建期注入复用 anon-key 范式(build.rs RB_SENTRY_DSN / Vite VITE_SENTRY_DSN;空 DSN=自动禁用不 fail-fast);脱敏 send_default_pii=false+before_send;release.yml 已接 env。ingest 实测双 project HTTP 200;应用内 SDK 冒烟实机双端通过(Rust panic hook event id ×2 + 前端 flush=true/fetch 探针 200,临时代码已回退);GitHub Secrets 已配(挂 /release 验证)。剩:中国大陆 ingest 可达性长期评估(代理下往返 5–20s,异步不阻塞) |
| 1-4 ✅ | schema.sql 数据基线冻结决策 | backlog 未决项 + 红线 #11;与 1-2 绑定——有自动更新才谈得上存量库迁移纪律。✅ 已决 + 落地(2026-07-26):选「最后压平一次再冻结」——旧 v1→v27 折叠进 v1 baseline(golden 单测锁等价),基线 = 0.1.0-dev.8,自此 append-only(v28+)。守门 check-schema-frozen.mjs + CI;红线 #11 / §5 / database-schema.md §10 / backlog 均改「已冻结」。as-built 同 1-2 |
| 1-5 ✅ | Supabase anon key 改构建期注入 | CLAUDE.md §5 预装数据段既有要求;分发扩大前必做。✅ 已落地(2026-07-23,as-built docs/plans/archive/anon-key-build-injection-plan.md):build.rs 从 .env.local(gitignored)/CI env 注入编译期常量(env!),init.rs UPSERT 写 settings,init_data.sql(v2) 删字面量(决策=接受存量库重置),缺配置 fail-fast。CI 两 workflow 接 secret(生效验证挂 /release)。轮换旧 key = 独立 backlog 条目(跨端 RVH + 已发版客户端失效风险)。 |
| 1-6 ✅ | 隐私政策 + 服务条款上 landing | launch-todo A1;也是 4-1 遥测决策的前置。✅ 已落地(2026-07-28,as-built privacy-terms-plan.md):landing 新增 lib/legal.ts(白话诚实版 + 商店字段,点名 Supabase/Sentry/Azure/LLM 处理方,中英双语)+ LegalArticle 渲染器 + /[lang]/privacy /[lang]/terms 路由 + footer 法务链接;纯 landing 零新依赖、守住无 Supabase 隔离;build/tsc 绿、4 页 SSG 内容实测。剩:push 后 Vercel 自动上线复验 + RVH 填 canonical URL https://lampio.app/privacy(RVH 新会话) |
二、第二梯队 —— 低成本高表达的产品打磨包(可打包 1 个 sprint)
共同特征:数据/能力已存在,改的是呈现与文案;单条 0.5-2 天量级。
| # | 条目 | 要点 | 验收 |
|---|---|---|---|
| 2-1 ✅ | 词汇库详情「我的记忆」前置 | 详情页先展示:首遇来源 / 最近原句 / 当时义项(sense_gloss) / 跨内容复现次数 / 一键回原文;通用词典(释义/音标/例句)后置。数据源:word_page_links + word_cloze_contexts + reading_pages,纯前端重排 | 从词汇库跳回原文的动线可用;「我的记忆」区在有数据时始终先于词典区 |
| 2-2 ✅ | 复习间隔预览去歧义 | Hard/Easy 预览间隔相同时(如首次复习双 1d)隐藏或合并显示,避免「选择无意义」观感 | 无差异时不再并排显示两个相同时长。✅ 已落地(2026-07-22,as-built docs/plans/archive/review-interval-preview-plan.md):相同 ⇔ Easy 也算出 1d ⇔ reps=0(首次复习 + 每次按过 Hard 的下一轮——Hard 预览恒 1d,推导见 plan);组件层比较格式化串 preview.hard === preview.easy,相同时隐藏两按钮内时长、按钮行下合并一行居中「下次复习 · 1d」(strings i18n)。纯前端展示层,sm2.ts 零改动、三端黄金向量锁不触发。 |
| 2-3 ✅ | 熟词分级行为型文案 + 收益反馈 | 按钮语义改「阅读时不用提示 / 继续提醒我」;完成一轮后展示「已过滤约 N 个熟词」 | 文案落 strings/(i18n-ready);收益数字真实来自本轮标记。✅ 已落地(2026-07-23,as-built docs/plans/archive/triage-behavioral-copy-plan.md):按钮/快捷键说明行改行为型文案(en/zh locale + facade,判断题→行为题);收益反馈两处——completedDesc 对齐「过滤」框架(过完全部候选路径)+ 主动退出(返回/Esc)新增 toast「已过滤 N 个熟词」(delta 分析发现多数轮次中途退出、原先零反馈;N=store.sessionMarked,undo 回退,DB 探针实测 3→7 与标记数一致)。模块切换隐式 stop 不 toast(content webview 遮挡)。纯前端文案层,known_words 写入/schema/sync 零改动;backlog「triage 第二轮」(分档进度条/成果图)不卷入。 |
| 2-4 ✅ | 小样本学习报告洞察卡 | 数据稀疏(首日/首周)时用洞察卡替代空图表与「0 次复习」负向指标:今天读了什么主题 / 哪些词复现 / 暂无到期复习 | 新账号首日打开 Stats 无空图、无零值大数字。✅ 已落地(2026-07-23,as-built docs/plans/archive/stats-sparse-insight-cards-plan.md):delta 分析核实首日仅剩 4 处缺口(等级大数字/练得最多/记牢/回顾句/AI 段空态早已处理)——G1 本月补充行零值大数字(0 词/0 生词/0 次复习)、G2/G3 阅读·词汇空折线图、G4 全 0 CEFR 柱状图。治理:StatsPanel 派生 hasReadingData/hasVocabData/hasCefrData/monthlyHasData gate,空段整块隐藏(不露空图)+ supplement 零值时不传(灭「0 次复习」);新增 StatsInsights 观察卡(气质对齐 WeeklyReportCard,稀疏时补位)——收集词数/引导 + 常读领域(getReadingInterestSignals,无 LLM 替代「今日主题」)+ 复习节奏(useDueCount→「暂无到期复习,安心读」正向)。文案走 strings(en/zh/facade 逐 key 对齐)。「哪些词复现」卡已加(只读 Rust get_recurring_words,COUNT DISTINCT reading_page_id HAVING>1)。实机验收暴露并根治两处跨用户泄漏(换用户后新账号非稀疏):① weekly_report_cache(全局 KV)换用户未清 → 新账号看到旧用户 AI 周报(隐私)→ auth.rs 换用户清理补入(沿 last_known_cefr_level 先例);② reading_log 设备级(无 user_id/不清)→ 新账号继承旧用户阅读趋势 → migration v27 ALTER ADD user_id + 回填当前用户 + 12 处读查询(reading.rs 8 / report.rs 3 / supabase.rs 1)全部按 current_user_id 过滤(阅读统计真正 per-user、零数据丢失、不进换用户清理循环);③ 本月补充行零值大数字(0 生词/0 复习)→ supplement 加 !sparse gate。DOM 实测新账号首日:无空图、无零值、无泄漏报告,观察卡补位。cargo check/test(62)/build/no-inline-zh·en/audit:locale 全过。 |
| 2-5 ✅ | 主叙事文案对齐 | landing hero + 首页空态改「熟词过滤 + 原文语境复习」主张(报告 §十 文案可直接参考:「打开任何英文网页或 EPUB,只看到真正值得你学习的词」) | landing 与应用内表述一致;改 landing 记得同步 hero 直链发版动作。✅ 已落地(2026-07-23,as-built docs/plans/archive/main-narrative-alignment-plan.md):语气选定「价值直陈」(报告 §十 风),身份 slogan「把感兴趣的英文内容变成英语课堂」保留为 landing 主 H1 不动,只把副标题从功能清单锐化为差异化主张。五处改动:① landing hero.tsx 副标题、② app/page.tsx metadata description(与副标题同源,title/keywords 不动)、③ features.tsx 前两卡(卡①「只高亮值得学的词」点明熟词过滤、卡②「双击查词 + 原文语境复习」,卡③④不动)、④⑤ RB 首页主叙事线 = 问候区副标题 hpGreetingSub(zh/en locale 两处;HomePage.tsx 代码零改动,走 strings facade)。landing 下载 CTA(#download 锚 + 内测版行)+ download.tsx 发版 TAG 原样保留(TAG 随 /release 更新,本次不 bump)。验证:landing tsc --noEmit + build 绿;RB check:no-inline-zh/en + audit:locale(parity 0)+ pnpm build 全绿。实机视觉观感交用户肉眼(pnpm --dir landing dev 看 hero / dev app 看首页问候副标题)。⬆️ 升级(2026-07-24,同 plan):用户复盘判定第一版 altitude 不够(「只高亮值得学的词」格局小、「双击查词」是功能非价值)。参考 MarginNote(信念当标题)/ CapWords(隐喻讲价值)后把主叙事提到信念/灵魂层:hero 副标题改情感差异化「读你真正想读的,英语自然长在你身上——不背单词,不打卡,不焦虑」;四张功能卡重构为三支柱信念(①满屏英文只有该学的词会亮起来=熟词聚焦/去噪 ②在你读到它的那句话里记住它=原文语境 ③你的词汇库是你读过的路=阅读足迹),CEFR/查词/SM-2/翻译/同步降级为「底层能力带」一行小字;应用内 hpGreetingSub 同步换成同一句灵魂。并叠加 landing 国际化(中英双语):Next 16 无库 i18n(app/[lang]/ 段 + lib/dictionaries.ts zh/en 字典 + proxy.ts Accept-Language 重定向 + lang-switcher hero 右上),/zh /en 真实 URL + per-locale metadata/OG。安装排障提示暂不动(补 EN 翻译,等 1-1 签名再清)。验证:landing tsc+build(/zh /en 静态双份 + OG per-locale + proxy)绿;RB 三守门 + build 绿。 |
三、第三梯队 —— 中等工程量,接既有 roadmap
| # | 条目 | 要点 | 挂钩既有真相源 |
|---|---|---|---|
| 3-1 ✅ | 文章级推荐卡升级 | 卡片从「来源目录」转「文章决策」:预计阅读时间 + 个人难度(区分客观 CEFR / 对当前用户相对难度 / 置信度三分)+ 推荐理由 + 在学词复现(本地词表 × 文章词表交集,可本地算,需拉全文)。✅ Phase 1 已落地(2026-07-28,纯客户端呈现层,as-built article-decision-card-plan.md):新增 RecommendedArticleCard(flat ListItem 决策卡)聚合已有信号——客观 CEFR 中性徽标 + 相对难度档(difficulty.ts)+ 置信门控 + summary 摘要行 + 在学词 chips(non-interactive)+ 兴趣/全局理由;tierLabel 迁 difficulty.ts 供文章卡/站点/Feed 共享。✅ Phase 2(后端正文管线)代码已落地(2026-07-29,用户选择跳过遥测门控):analyze-articles 抓正文(content:encoded 优先,否则 readability)+ word_count + LLM 读摘录评级;客户端 analyze_article_bodies(全文级在学词复现 + 词汇覆盖难度 coverageTier 替换 CEFR 减法档)+ 诚实阅读时间。migration v29 加列、双轴难度心智。全绿(cargo/build/vitest/i18n/arch-check)。✅ 后端已部署+线上验证(2026-07-29):Dashboard 建列 word_count/body_text + /edge-deploy analyze-articles(deno-dom 非 readability,canvas 原生模块云端打不了包)+ 手动 invoke Analyzed 19 / bodies 17/19 / HTTP 200、CEFR 跨 A2~C1。✅ 客户端实机验收(2026-08-01):dev.10 决策卡显示「预计阅读时间」= 端到端全闭环。as-built article-decision-card-plan.md Phase 2 段 + recommendation-algorithm.md | recommend-personalization-v1-plan.md / tier-aware-recommendation-sorting-plan.md;推荐流是战略方向(memory),此条是其表达层 |
| 3-2 ✅ | 待发现词前台收敛 | 后台保留全候选,前台默认当前页/本章 Top 5-10(排序:掌握状态 × 语境重要性 × 跨文复现 × 通用价值);全表折叠为高级视图。✅ 已落地(2026-08-04,as-built discovery-topn-ranking-plan.md)。实质是「排序」不是「收敛」——原先每档已折叠到 15 个,但排的是字母序(DiscoveryPanel.tsx:162),不展开只能看到 abandon…arbitrary 那批,信息量为零。四维中两维需新建数据:①「跨文复现」本仓零数据源(word_page_links 是 JOIN learning_entries,只记已存词;reading_log 只存聚合)→ migration v31 word_encounters(local-only 聚合表,行数被候选池封顶 ≤~12k 而非明细表的 ~1M/年;last_page_url 作去重闸挡 SPA 重跑;per-user 走 user_id 过滤沿 v27 reading_log 先例、不进换用户清理);②「语境重要性」页内频次原先在 pageWordSet 去重时就丢了 → content-script Set→Map<word,{count,inHeading}>,emit 载荷加 page_freq/in_heading。③「掌握状态」退化为过滤器(候选集本就已排除三张表),④「通用价值」直接用 vocabulary.frequency_rank(填充 87%,NULL 降级 0.4)。打分在前端(lib/discoveryRank.ts,沿 recommendRank.ts 先例——信号分裂两侧且便于 vitest 直测):4 维加权 + 频次/复现封顶 5 防霸榜 + 确定性 tie-break。UI:跨档统一 Top-9 单列表(保留 CEFR 色点)+ 复现 ≥2 带「读到过 N 次」小标 + 全表降级为 CollapsibleSection「全部候选词」(分档/filter chips/每档 15/Show more 原样保留)。Top-N 必须先按启用档过滤——未启用档的词没包 .rb-discover span,进榜会得到点了没反应的 chip。顺带兑现 4-1 刻意延后的指标②「建议词 CTR」(discovery_list_shown/_word_click/_words_saved,props 只含数值布尔)。零 Supabase / 零同步矩阵 / 零 RVH | DiscoveryPanel;discovery-topn-ranking-plan.md |
| 3-3 ✅ | 面板互斥 / 单辅助面板评估 | 三档信息密度建议的真实增量:默认只允许一个主辅助面板占用阅读空间。✅ 已落地(2026-08-01,as-built app-shell-redesign-plan.md Item A):usePanelStore 左右辅助面板互斥(开一侧自动收另一侧,含 4 处事件自动开右 panel 场景)。纯前端 store,零 RVH | app-shell-redesign-plan.md |
| 3-4 ✅ | Focus Review 模式落地 | 显式 session 状态机 + chrome 收敛 + 完成庆祝页。✅ 主体早于本轮由 e0cdcdd(ActivityBar 6-module workspace)落地——useReviewStore.enterReviewModule/startSession/endSession 状态机 + FocusReviewHeader + ReviewSessionComplete 庆祝页 + Vocab/Notes 合并 Library,还多做了「复习/重温」子活动。复习期点 Settings/Account 的 Modal 逃逸(不 endSession、会话保活)已于 2026-08-01 补齐(Item C,live 验证)。纯前端,零 RVH(数据/SM-2/session 契约未动) | app-shell-redesign-plan.md |
| 3-5 ✅ | EPUB 长期阅读验收 | 把报告 §六 P2 清单转为测试 checklist:全书搜索/书签划线/排版设置/滚动分页/脚注图表兼容/书库元数据/位置恢复/复习回跳稳定性。只验收,缺什么再立项。✅ 已完成(2026-08-07,实测报告 epub-longform-acceptance-handoff.md §4 + §4.1):8 项全部实测有结论——✅1 项(排版设置,且 §1 两个假设均被推翻:EPUB 走全局字号而非 domain_zoom)、🔶3 项(书签划线:落库/关书重开 ✅ 改名 ❌;书库元数据;复习回跳:右页落回原章原句 ✅、「打开原书」❌)、❌4 项(全书搜索只搜当前章 56/188、章末无任何续读入口、跨文件锚点回程差 ~2 屏、位置恢复三层全不恢复)。另捞出 6 条计划外缺陷,其中 2 条影响面大于表内多数条目:N1「开书即死路」(落封面+目录不自动开+无下一章,三条叠加=打开书走不下去)、N4「source_ref fragment 从不剥离」(一个根因三处断路,且被自动模块切换伪装成成功)。零 migration、零 Supabase、零 RVH,符合预期。缺陷全部立项 → backlog.md §🔴EPUB 长期阅读 9 条(建议前 3 条合成一个「EPUB 可用性」小 sprint,单修任何一条都不解决问题) | epub-longform-acceptance-handoff.md;backlog.md |
| 3-6 ✅ | 首页 → 发现模块(两步走) | 背景:app 无自带内容,首页(发现/推荐)是整个「来源→阅读→复习」闭环的进水口,产品分量是模块级的,但现在的形态是「tab 之一」——与任意网页 tab 享有同等视觉权重,低估了它(2026-07-22 用户提出)。架构事实:Home 已是钉死特殊 tab(恒首位、纯 React 页、无 content webview),升级主要动「导航呈现」而非生命周期,不违反原则 1。第一步(跟 3-1 绑定):内容先配得上地位——首页从「来源目录」升级为「今日阅读决策流」(文章卡 + 个人难度 + 理由 + 在学词复现 + Continue Reading);顺手做轻量表达升级:tab 栏 Home 与普通 tab 用分隔符/固定槽位区隔(pinned-tab 语义),可改名「发现/Discover」。第二步(与 3-3/3-4 合并设计):顶层导航一次定型——App 顶层 = 发现 / 阅读 / 复习 / Library / Stats 的认知模式平级关系与入口形态(左 rail or 顶部模式切换),一次手术做完三件事。⚠️ 校正:形态骨架(左 rail 6-module ActivityBar)早于本轮由 e0cdcdd 落地,只是发现没拿到 rail 槽、仍是 Read 内的 Home tab。✅ 第二步已落地(2026-08-01,as-built app-shell-redesign-plan.md Item B):发现干净模块化——Home 退出 tab 系统 → 独立 Discover 模块(rail 首位 Compass,全宽渲染同一 HomePage);Read 变纯浏览、无 tab 时显空态引导去 Discover;启动/登录默认落 Discover(新用户首屏见内容)。纯前端,零 RVH | app-shell-redesign-plan.md;HomePage.tsx / useTabsStore;recommend-personalization-v1-plan.md |
进度(2026-08-07):第三梯队 3-1 ~ 3-6 至此全绿。收尾的 3-5 是纯验收条目,本身不产出代码 (零 migration / 零 Supabase / 零 RVH),产出是一份可复现的实测报告 (epub-longform-acceptance-handoff.md §4 + §4.1)+ 9 条立项缺陷(backlog.md)。 ⚠️ 「梯队全绿」= 验收做完了,不等于 EPUB 体验合格 —— 恰恰相反,3-5 的结论是 EPUB 长文阅读目前走不下去(见 backlog 前 3 条)。别把这一行读成「EPUB 没问题」。
四、第四梯队 —— 前置决策(不急但要定,否则上面无法验证)
| # | 条目 | 要点 |
|---|---|---|
| 4-1 ✅ | opt-in 最小遥测方案 | 没有它,第二/三梯队所有改动的效果都无法验证,报告 §九 的指标与 4 个实验全部悬空。设计约束:隐私最小化 + 用户可关(与产品气质自洽);候选 PostHog/Plausible(launch-todo C3);优先级最高的少数指标:熟词首轮完成率 / 建议词点击率 / 复习单卡时长 / 崩溃率(1-3 Sentry 兼办)。🚧 主体已落地(2026-07-29,as-built telemetry-opt-in-plan.md):后端选型改自建 Supabase 事件表(非 PostHog/Plausible——中国大陆可达性已被现网同步验证、不新增第三方处理方、复用 anon key 注入 + observability 范式)。已做:migration v28 usage_events_local(本地缓冲=读出口,根治死表教训)+ commands/telemetry.rs(record no-op-when-off / flush fire-and-forget)+ 前端 lib/telemetry.ts(opt-in 缓存 + 匿名白名单护栏)+ 两处埋点(①triage stop / ③复习单卡计时;②CTR 延后)+ Settings「隐私」opt-in 开关(默认关 + install 级匿名 UUID)+ 隐私政策改写(撤回三处「不做遥测」否定承诺→opt-in 匿名措辞,中英双语)+ flush 搭车 useAuthStore polling。cargo test 64 / vitest 52 / build / i18n 三守门 / landing build 全绿。① Supabase Dashboard 建表 + RLS ✅(2026-07-29,anon INSERT 201 / SELECT 锁死实测);客户端全链路 ✅ 实机验证通过(默认关=零采集 → 开启=精确采集 triage①+复习③ → 匿名 → flush 上报 synced_at 回填)。② admin 看板消费 ✅(2026-07-29,commit 7db8279:gen-types 刷新 + observability「使用遥测」tab + getTriageStats/getReviewDurationStats + 原始事件列表)。4-1 全部完成(后端建表/RLS + 客户端全链路实机 + admin 看板三项齐)。见 backlog |
| 4-2 | 商业化 / 成本模型草案 | 8/13 edge function 走 LLM,用户量上来后边际成本真实存在(llm_call_log + admin 成本看板已可观测)。要回答:哪些能力无限免费、哪些收费或限额;缓冲池/词典兜底/消歧/翻译的成本曲线 |
五、测试自动化金字塔(贯穿性工程质量线,2026-07-22 补)
背景:RB 当前零自动化测试(launch-todo C1/C2 全 ⬜)。按本仓真实风险分布排 ROI—— 历史上最疼的 bug 全是 sync 数据丢失类(红线 5a/5b/5c/5d 每条 = 一次事故)和 三端行为漂移类。测试投入优先护住这两类,UI 全自动 E2E 明确降级(见 5-5 平台限制)。 人力原则:自动化优先;人工层只保留发版冒烟 + EPUB 验收 checklist(各 ≤10 分钟)。
| # | 层 | 内容 | 说明 / ROI |
|---|---|---|---|
| 5-1 | Rust 单元测试(最高优,零基建) ✅ 已落地(2026-07-22) | ① SM-2 srs.rs:get_quality 序列 / sm2_calculate 间隔阶梯+EF下限 / compute_mastery_level 升降级(12 测,含抓到的 q=2 走降级而非升级边界);② sync common.rs:mastery_to_num / max_ts + 抽取 should_take_remote_srs merge 谓词(pull.rs:216 内联→纯函数)表驱动测三条 OR 分支(9 测);③ reconcile_cloze_pool 内存库:NOCASE 去重/gloss 回填/封顶5 软删最旧(5 测);④ 迁移链:空库 v1→head 干净应用 + 终态表/列断言 + v20建/v25drop 顺序 + 版本单调(5 测);⑤ lemmatizer 红线 #9:normalize/normalize_phrase 既有覆盖已充分(NFC/幂等/41 条 RVH 短语 byte-equal),新补 propose_stem Layer3 规则表直测(min_stem_len/辅音前置/forbidden ou/元音守卫,7 测)。合计 +38 测;cargo test --lib 59 passed 全绿。⚠️ sqlx checksum 冻结属运行时行为不在单测范围(测内已声明)。未做(后续):sync 三分支墓碑传播端到端(需 mock HTTP 层,比谓词单测重,评估后另立) | cargo test 直接跑;护住最贵资产 |
| 5-2 | 跨端黄金测试向量 ✅ RB 侧已落地(2026-07-22) | docs/cross-end/sm2-golden-vectors.json(get_quality 11 条 + sm2_calculate 10 条)。Rust + TS 双端消费同一份:srs.rs mod sm2_golden_tests(include_str!+serde_json,3 测)+ src/lib/sm2.test.ts(fs 读+JSON.parse,22 测,float 比较 epsilon 1e-9)。为此导出 sm2Calculate。单次改 JSON 强制两端测试同步——「改任一端 SM-2 必须验证另两端」的人工纪律变机器纪律。RVH Dart 侧 ✅ 已完成(2026-07-22):RVH 复制 fixture + test/sm2_golden_test.dart,flutter test +21 全过、三端无漂移(被测对象实为 lib/core/algorithms/sm2_algorithm.dart 类 SM2Algorithm,非交接 prompt 猜测的路径)。SM-2 三端一致性锁完整闭合 | ✅ 三端齐活 |
| 5-3 | 前端 Vitest ✅ 已落地(2026-07-22) | vitest 4.1.10(配 vite 8)+ happy-dom;vitest.config.ts(node 默认环境,react 插件)+ package test/test:run;tsconfig.app.json exclude *.test.ts 不进 tsc -b(保 pnpm build 绿)。① 纯函数:url.ts(13)/fontScale.ts(9)/cloze.ts(11,含 all-forms 挖空防泄露 + position 分组/轮换)/sm2.ts(吃 5-2 向量);② commands.ts mock 红利演示:rssHelpers.test.ts mock ./commands+@tauri-apps/plugin-http 两边界,测参数映射/XML 解析/静默失败(4 测,happy-dom)。合计 52 vitest 测全绿。未做(后续 stretch):React 面板组件测试(需 @testing-library/react;mock 边界红利已由 rssHelpers 证明,组件测试为增量覆盖非新范式) | Vite 8 原生配套 |
| 5-4 | CI 接线 ✅ 已落地(2026-07-22,.github/workflows/ci.yml) | 两 job:frontend(ubuntu×1)=install + check:no-inline-zh/en + pnpm build;rust(macOS×10,仅 --lib 不 bundle)=占位 dist(generate_context! 需 frontendDist 存在,实测 32B index.html 足够)+ cargo test --lib + clippy(informational)。push(忽略 v* tag,归 release.yml)+PR 触发;concurrency cancel-in-progress 控额度。未纳入门:pnpm lint(全仓 507 errors,多在 supabase/functions Deno 代码,存量待清)+ vitest(待 5-3)。平台选 macOS 因本仓只发 Win/mac、Linux 编译未验证,避开未 gate 平台代码的编译坑 | 兑现 launch-todo C2 |
| 5-5 ✅ | 半自动冒烟(E2E 替代) —— ✅ 已收口(2026-08-07,docs/smoke-test-runbook.md)。断言层 2026-07-22 校准;本轮(搭 3-5 EPUB 验收的实机会话)补齐剩余两件:① 复习入口选择器已实测点通 nav[aria-label] button:nth-of-type(3)(位置型、不吃 locale——原「title 中英混用不可靠」的障碍由此绕开),另固化 TOC 条目 / 切标签 / .rb-annotation 计数三个选择器 + 确认 rb_click 对主 webview React onClick 有效;② 写驱动步骤已按能力边界而非「待定」写清:原生文件面板与真实 Selection/dblclick 合成事件碰不到,永远标 🙋,别再试。并修正一条假断言:原 Flow 4「位置恢复」断言的是产品不存在的行为(3-5 证明书/章/偏移三层全不恢复),已重写为「打开→章节导航→划线跨会话持久」这条真实闭环,位置恢复待 backlog B4 修复后加回。剩 Flow 3 评分按钮选择器(源码已推导 button[class*="flex-1"][class*="font-semibold"],本轮无到期卡未实跑,首跑时验证) | ⚠️ 平台事实:tauri-driver(官方 WebDriver E2E)不支持 macOS(WKWebView 无 WebDriver 端点),不按全自动 E2E 规划。改用现成资产:rb-debug MCP 驱动真实 app。runbook 固化 6 条核心链路(启动+登录门 / 登录→sync / 开网页→双击查词→保存→库可见 / 复习→SM-2 落库 / EPUB→位置恢复 / sync 双向对账),每条含前置/驱动(🤖MCP或🙋人工)/客观断言(rb_db_query/rb_state/rb_supabase_query,非截图)。建议挂 /release Step 1 前。本会话 dev app 未运行,runbook 尚未实跑校准——首次执行时就地修正选择器/断言 | 比通用 E2E 框架便宜一个量级 |
| 5-6 🚧 | 用户测试(人力层,保持薄) | Sentry(1-3)= 最重要的被动用户测试;内测群 + 应用内反馈入口(mailto / issue 直链);EPUB 验收清单(3-5)作为大版本人工 checklist。暂不上问卷/访谈流程。🚧 应用内反馈入口 ✅ 已落地(2026-08-12,commands/support.rs + Settings「应用」页「反馈」小节):一键唤起系统邮件客户端、主题/正文按 UI 语言预填、只附版本/系统/架构三项诊断(无用户数据)、地址同时明文显示兜底没配邮件客户端的人;命令只收语言枚举不收 URL(收件地址写死在 Rust——#[tauri::command] 对 content webview 同样可见,收 free-form URL 等于把「打开任意东西」送给任何被访问的站点);Windows 用 rundll32 而非 cmd /C start(后者会吃掉 mailto 里分隔 subject/body 的 &)。地址复用隐私政策公示的 landing/lib/legal.ts::CONTACT_EMAIL。实机验证:邮件草稿收件人/主题/预填正文/版本行全对。⬜ 剩「issue 直链」不做(源码仓私有,链过去用户看到 404)+ ⬜ 内测群未建 | 遥测决策见 4-1 |
落地顺序:① 5-1 ✅ → ② 5-2 ✅(三端齐活)→ ③ 5-4 ✅ → ④ 5-3 ✅ → ⑤ 5-5 ✅(2026-08-07 收口)。 进度(2026-08-07 更新):5-1/5-2(三端)/5-3/5-4/5-5 全绿。cargo test --lib 62 + pnpm test:run 52 + RVH flutter test +21。剩 5-6 用户测试(挂 Sentry 后)——第五梯队至此只差这一条。
5-5 收口于 2026-08-07,搭 roadmap 3-5 的实机会话顺手做掉(dev app 已开着、用户已在手动驱动,边际成本近零)。
六、明确不做(本轮裁定,防止反复评估)
- ❌ sense 级熟词分级(三端 schema 代价 >> 收益,见 §〇)
- ❌ 视频/字幕战线(Migaku / Language Reactor 方向)
- ❌ 泛知识管理器(Readwise Reader 方向)
- ❌ 游戏化 / 打卡 / 学习计划(产品红线,本就不做)
- ❌ 扩更多学习语言
- ❌ 继续新增通用 AI 按钮(存量能力做编排,不做加法)
附:执行纪律
- 单条进入实施 → 另开
<feature>-plan.md(复习/同步相关先评估 RVH 镜像成本,涉 RVH 改动新会话) - 本文件只维护「方向 + 优先级 + 裁定」,勾选进度:第一梯队看
product-launch-todo.md,其余条目完成后在此标 ✅ 并链 as-built - 报告原文长期保留在用户 Documents 目录,如需引用细节回查原文