主题
短语自动高亮 —— B 方案后续(floor 冻结后剩下的 5 条)
创建:2026-08-30(从
backlog.md外迁,原文 2026-06-24 起累积) 状态:🟡 主线已收敛,剩 5 条未做 —— 1a / 1b(RVH 会话)· 1c(RB 复测会话)· #3 的 P2 行动 3 / 6 / 7 · #4 vocab 高亮收窄(纯 RB,未启动)为什么外迁:它在 backlog 里长到 24 KB(占全文 9%),形状早已是 plan 而不是 backlog 条目 —— 有阶段编号(#0…#4)、有 gate 判据、有跨端接力顺序。留在 backlog 里的代价是 每个读 backlog 的会话都要吃这 24 KB,而其中 80% 是已完成轮次的审计留痕。
🚫 不要把已完成的轮次删掉:#0/#1/#2/#3-P1 的留痕是 gate 判据的来源, 后续复测(1c 的 gate-A、#3 的 gate-C)要拿它们当对比基线。
关联真相源(都已归档,读历史时按这个顺序):
archive/phrase-noncompositionality-tiering-crossend-plan.md(§9 深度模式 + §11 治理)·archive/phrase-auto-highlight-thinslice-plan.md(gate-A 复测方法)·archive/phrase-deep-mode-plan.md(P1 落地状态)·archive/phrase-unified-llm-refactor-plan.md(2026-06-28 取代 floor/ceiling 的统一重构)·phrase-eval-log.md(常驻评测流水)。
战略结论与推进队列(原 backlog §短语 B,逐字保留)
B 核心已落地 + gate-A 达标:静态三档 idiomaticity(always 2789/context 3450/literal 371,预装库 v23 SHA
747f4732)+ RB reseed/消费/prune 全落地。gate-A 复测硬 FP 28%→7%(<10%)。真相源:phrase-noncompositionality-tiering-crossend-plan.md(§9 深度模式);phrase-auto-highlight-thinslice-plan.md§gate-A 复测; 交接docs/cross-end/15;埋点表已于 v25 DROP 退役(纯只写无消费者,2026-07-14)。phrase_interaction_log(v20)
🧭 战略结论(2026-06-26 综合评估敲定,取代「死磕 retag」基调)
静态分类构造上收敛不到 0——残留 FP(
all along/in a fix/for the bird)全是 occurrence 级问题 (同一短语在不同句子有时习语、有时字面),用 type 级标签(idiomaticity 与上下文无关)解,永远漏长尾。 继续 retag = 边际递减、不收敛。但「纯 LLM 取代一切」是伪命题:短语库(哪些串是短语)+ 已做好的三档 (LLM 路由器:always 免判 / context 才送 / literal 不送)都要留——扔的只是继续打磨分类的轮次。正确架构 = floor + ceiling 两层:
- floor(免费/默认,已就位)= 本地 always 桶:即时、离线、零文本外发、~93% 干净。接受 ~5-7% FP (安静低害高亮)。停止 retag 治理——顶多再 1 次廉价 demote-only(
all along等 homonym 长尾 + §11.4 话语子集)然后冻结。- ceiling(premium/opt-in)= §9 LLM occurrence 判断(见下 #3,新主线):本地框候选→含候选句送 flash 判→true 才高亮。解决 occurrence 陷阱(FP→近 0)+ 救回整个 context 桶(recall 从 2789 扩到 6000+)。 闸 = 隐私同意(非成本:flash 0.056¢/篇可忽略),成本顺手定价进 premium。对 opted-in 用户 LLM 复判 always 桶 → 连 7% 残留 FP 一起洗掉。
完整评估论证:本会话(2026-06-26);要点 = ① 真值得学的短语 ~1-2k(PHaVE 前 150 覆盖 75%)、单页密度低 (always ~1.8/页)→ 低密度正是 LLM 最划算场景;② LLM 不只修 precision,更是 recall 大增(context 桶救回); ③ headline 准确率静态 ~93% ≈ flash 92.9%,但失败模式不同(静态错在 occurrence 不可改 / LLM 错在 gloss 可改)。
历史推进队列(#0/#1 已完成,#1a/#1b/#1c 已并入 v23,保留作审计)。下方 #3 = 新主线:
0. ✅ A retag 第 1 轮(v22)——已完成(2026-06-24~25)
RVH 重判 3 个 over-confident always(in the black→context / to die for→context / so much for→literal)
- re-scan 连带 demote 219 条同模式 + 修 judge「字面搭配频率」盲区 → 预装库 v22(SHA
042c71ae…)。 RB 侧/vocab-reseed整包覆盖 + bumpVOCABULARY_SEED_VERSIONv22 + 运行期 reseed 已生效(commit38432a3)。 消费侧零代码改动。交接docs/cross-end/15§10;第 0 步 boilerplate commit2a2e0b3。
1. ✅ gate-A 实测 v22→未达标(28%)→ v23 复测达标(7%,2026-06-26)
真相源:
phrase-auto-highlight-thinslice-plan.md§gate-A 实测(v22)+ §gate-A 复测(v23,含完整样本表 + 方法)。
方法修正:放弃「点击→自动 dismiss」做 FP 信号——实测 on-click LLM 兜底不可靠(明显误报点击后 15s+ 未 dismiss)→ dismissed/clicked 严重低估。改用 Claude 读 data-rb-sentence 逐条判(更强 oracle、零 LLM)。省 token:shown 行 带 count=该页 always 数,开页先查 count=0 则跳过。
v22 结果(10 篇 / 18 个 always):✅干净 11(61%)· ⚠️低价值 2(11%)· ❌硬 FP 5(28%),未达标。双轨根因(见 #1a/#1b): 🟠 surface 陷阱 ×3(on the loose/for the bird/to speak of)+ 🔴 lemma 折叠 ×2(in a fix/all right reserve)。
✅ v23 复测达标(8 篇 / 15 个 always,13 distinct):✅干净 9(73% instance)· ⚠️低价值 3 · ❌硬 FP 1(7%),< 10% 目标。
- 两轨修复真机生效:v22 那 5 个硬 FP 全部消失(reseed v23 SHA
747f4732,三档 always 2789/context 3450/literal 371)。 - 覆盖没砍过窄:v23 一次 demote 249 条后 always 仍 1.9/页(≈v22 的 1.8),观鸟随笔单篇 7 个。
- 残留两类(✅ round-3 v24 已收,2026-06-26):①
all along1 个硬 FP(HOMONYM surface 陷阱长尾)→ demote context;② 3 个 ⚠️ 低价值话语(no matter what/pay attention/for the most part)+ §11.4 候选 9 个共 12 个→ demote literal。预装库 v24(SHA1315958f…,always 2789→2776 / context 3450→3451 / literal 371→383)。详见 #3 floor 清理 round-3 +docs/cross-end/15§12。静态治理自此冻结。 - → 可评估
phrase_auto_highlight默认 on:round-3 把免费层硬 FP 推向 ~0 + 清掉 ⚠️ 噪声。待 RB/vocab-reseedv24 后冷重启抽查all along("all along the river" 句)不再误高亮 → 评估 default on / 并行 deep mode。
#1a/#1b 已完成(v23 合并落地,2026-06-26):① surface 陷阱 retag 第 2 轮(RVH,demote 249)+ ② lemma 折叠(RVH 实测结案=不改 lemmatizer,in a fix→context demote + all right reserve bad_entry prune,根因/结论见 RVH docs/cross-end/14)。RB 侧 /vocab-reseed v23 + prune 已落地。下方 #1a/#1b/#1c 历史描述保留作审计。
1a. idiomaticity retag 第 2 轮:surface 陷阱降 context(RVH 新会话,§9 隔离)
触发:用户说「做 retag 第 2 轮 / 治 surface 陷阱」。必须 RVH 新会话。与 v22 retag 同机制(A→B 延续)。
确诊 surface 陷阱(always 但有高频字面框):on the loose("on the loose [N]")/ for the bird("for the [real] birds")/ to speak of("speak of [X]"=谈及)→ 应降 context。RVH 用 v22 同款 re-scan(改进版 challenge,demote-only)扫 always 桶找同模式,连带降级。RB 侧零改动(reseed 即生效)。
低价值 basic 旁注(
no matter what/pay attention,2/18 噪声、非 FP):「RB filter 加!is_basic」已否决—— always+basic 共 59 条,约一半是高价值彩色习语(cut to the chase/bad hair day/call it a day/out of one's league…),basic=高频 ≠ 低价值,一刀切会误杀。正解(可选低优)= RVH 精挑"纯话语功能"子集(no matter what/by far/on purpose/ in spite of/right away…)降 literal(不是 context——它们语义确是 always),保留彩色习语在 always。详见 tiering plan §11.4。
1b. lemmatizer 资产治理——gate-A 阻塞项(RVH 新会话)
触发:用户说「治 lemmatizer 噪声 / 修 fixed→fix」。详见本文件后面「🟠 RVH 短语/习语归一噪声治理」条 (本次 gate-A 实测把它从"P2 可选"升为 gate-A 阻塞项——
fixed→fix/rights→right折叠制造幻影 always 匹配, 占残余 FP 的 2/5)。与as→a/picked→pic同类,需双端原子重算受影响 PK + reseed(红线 #5e/#9/#10)。
1c. RB 复测会话:reseed + gate-A 复测(新开 RB 会话,1a+1b 出回执后)
触发:① retag round-2 + ② lemmatizer 两个 RVH 会话都产出 cross-end/15 回执后。新开 RB 会话 (RB→RB 接力;本会话长、上下文重,价值已落盘,新会话从文档 bootstrap 更干净)。
开场先读:① backlog §短语 B(本节)+ 噪声治理条;② docs/cross-end/15(最新回执:新 SHA/版本/是否合并一版/ lemma_* 新行数/是否需 migration);③ tiering plan §11;④ thinslice plan §gate-A 实测(复测方法)。
动作:
/vocab-reseed:按回执新 SHA 整包覆盖 + bump 版本。⚠️ 若 ② 改了lemma_*行数 →scripts/check-vocab-asset.sh(2026-08-29 前叫sync-rvh-vocabulary.sh)硬编码期望行数 断言会失败,先按回执新行数更新脚本再跑。⚠️ 上面那对数字(140370 / 101646)已过期两轮 (cross-end/24 → 140281/101709,cross-end/27 → 140277/101713)—— 以脚本里的值为准。①②合并一版=一次 reseed;分两版=reseed 到终态。消费侧零代码改动。- 实机验证:冷重启触发 reseed;抽查
on the loose/for the bird/to speak of已是 context、in a fix/all right reserve已消失。 - gate-A 复测:照 thinslice §gate-A 实测同法(读句判定 +
shown.count免 DOM;文学/叙事体裁,干硬体裁 0 产出别用), 攒 ~15-20 高亮 → FP <10% 且覆盖不过窄 → 评估phrase_auto_highlight默认 on。结果写回 backlog #1 + thinslice(对比 28%)。
完整开场 prompt 见本次会话末尾(2026-06-25)/ 可照上述动作直接执行。
2. ✅ gate-B:context 桶 LLM 消歧准确率(已过,2026-06-18)
deepseek-v4-flash = 92.9%(26/28,0 漏报、2 误报),与 pro 打平 → 采用 flash(贵 12×/慢 3× 的 pro 一个没多对)。脚手架 /tmp/phrase_eval/(gold 28 条,key 取 dev 库 translate_api_key,SSL 关验证绕 DOVE 拦截)。详见 plan §9。
3. ✅🚧 §9 深度短语模式(LLM occurrence 判断)——P1 落地 + 部署 + gate-C ① 已跑(87%);P2 待启
状态(2026-06-26):P1 全落地 +
judge-phrases-batch已部署 + 实机 gate-C ① 跑完。完整结果见docs/plans/archive/phrase-deep-mode-plan.md§P1 落地状态。 gate-C ① 实测(单篇文学随笔,23 instance / 19 distinct):precision 87%(20/23 非字面,略低于 90% 目标); 3 硬 FP 全是位移/物理 PV 的位置性字面用法(go to a window/pushing on environment);recall 净增(floor 此页露 0、deep 救回 23,42% 候选被 LLM 判字面压制)。实机修了 1 bug(judge_phrases_batch误带 vocabulary 不存在的deleted_at列)。 P2 行动清单(2026-06-27 dogfood 后重排 ROI;faithful 基线 24/29=83% @ v24/prompt v2/首条-gloss,见phrase-eval-log.md):
- ✅ 分批不丢(救 cap 漏,已落地+实机确认):候选超
DEEP_PHRASE_BATCH=40不静默丢,滚入下一批并行判,硬顶DEEP_PHRASE_MAX=120才丢+log。实机确认 Longreadsjudged=65 dropped=0(原 40/丢 25)。⛔「跳 basic 桶」预过滤经 rb_db_query 否决(is_basic 不区分伪/真);伪匹配纯 occurrence 级、交 LLM 兜底。- ✅ 头号杠杆:Rust 送全部 sense gloss(已落地 5e742e7)——faithful 83% 的 5 失败同一根因 = 取首条 sense 常是字面义(FP 命中/FN 不命中)。改为送全部 sense + edge prompt 对照全义项判非组合性 + POS/parse 碰撞规则 → faithful gold 83%→100%,Longreads 实机 go to→false/let in→true 确认。⚠️ 但见行动 4:回忆体裁 go to 仍漏(batch 方差 + 本质 mis-tier)。
- prompt v4(次要,行动 5 扩样后扩容):① 🆕 物理/流体/过程位移亦 false——科学/百科体裁
pass through a gap/pass along a duct/shoot out the ink判 true(FP),prompt v3 的"人类位移→false"没覆盖非人主语过程位移;②for good+名词 碰撞("for good reason",for good有真习语 gone for good 故走 prompt 不降 tier)。go to走行动 4 不靠 prompt。- ✅
go to→literal demote + 透明 PV demote(RVH v25 已落地):RVH 30 条 context→literal(go to + slow down/speed up + re-scan 27 纯位移 PV;rubric 保留 get up/pass by/cut out/move in 等有非组合义者)。RB/vocab-reseedv25(SHAb2821764…,always 2776/context 3451→3421/literal 383→413)+/phrase-eval复测确认go todeep 高亮结构性清零(tier 层根治、页面无关)。详 cross-end/15 §13 + plan §12 + phrase-eval-log (6)。静态治理 re-freeze。- ✅ 多体裁复测(行动 5 已完成 5 体裁,见 phrase-eval-log §(4)):论说/新闻/文学=干净高精度;回忆=go to FP(→行动4);科学=过程位移 FP(→行动3①)。方法学:gold 过≠野外过(batch 组成致判定漂移)→ 评测以野外多体裁为准、gold 仅回归底线。叙事小说 dud(americanliterature 广告重抽不到正文)→ 改 Gutenberg HTML 后补。
- 🆕 cap 调优(观察项):
DEEP_PHRASE_MAX=120在书本级长文(PG essay ~178 候选)被触发丢 58(非静默有 log)。是否抬硬顶/自适应——成本权衡,暂留观察。- always 桶复判 FP 清理 + live 页路径。P3 = paywall + 两个 AI opt-in 合并评估(4C UX 缝隙)。 方法学固化:gold-set 的 gloss 必须与生产同源(
run.py已改为从预装库取首条 sense,否则假绿)。 实施件:opt-in 开关phrase_deep_mode(Switch+ConfirmDialog)+ edge(flash 批量二分类,复用_shared/llm.ts)+ Rustjudge_phrases_batch(pos_definitions 取主习语义 gloss 入 batch)+ content-scriptdeepResolvePhrasesOnPage()二段 fire-and-forget(cap40 + per-page 内存缓存 +data-rb-phrase-deep标记)。
✅ occurrence FP「最后一公里」—— 已决策(2026-06-28):不做复核轮,转向统一 LLM 重构
结论:复核正例 ≡ DEEP_PHRASE_BATCH 旋钮的更差实现(同机制、非对称、第二轮 round-trip + 闪烁 + 调用翻倍)→ 不做复核轮;要 precision 就降 batch。讨论过程把问题从「FP 率」重构成「信任 = 一致 + 诚实」,衍生出一次统一 LLM 重构(floor/ceiling 两层 → 单层「AI 短语分析」:合并两 judge、judge-before-paint、弹窗读缓存永不撤销、always 桶也送 LLM、短语开关合一、诚实承认 LLM 概率性)。 真相源:新 plan
docs/plans/archive/phrase-unified-llm-refactor-plan.md(取代phrase-deep-mode-plan.mdfloor/ceiling)+phrase-eval-log.md(10) 决策记录。 ✅ 已实施落地(2026-06-28):P0–P5 全做完 + edge 部署 + 实机 gate-C 全过(多体裁高精度、点击零撤销、命中义项正确)。commit 08f9146/880a9dc/6b4fe4e/5e1f035/ac64805。线上孤儿explain-phrase函数已删。 记牢:batch~10 是唯一准确度旋钮、极端可降 1(D4)。case-1(释义未覆盖)属词库覆盖轴、本重构不治。
✅ 跨 tab 面板串清单 bug —— gate-C 实测捞出 + 已修复(2026-06-28,审计留痕 + 教训)
现象:开多个 tab 时,活动 tab 的「短语发现」清单被后台 tab 的分析 emit 覆盖成它的清单(页面有 set out 高亮、清单却没有)。 根因:
discovery-words-found/discovery-phrases-found两个 content→main 事件没带webview_label、前端无条件setDiscoveryPhrases—— 而 vocab 同类事件(vocab-count-changed等)早就带 label + 按活动 tab 过滤。这是既有漏网的隔离,被统一重构「慢 LLM + mutation 多次 emit」放大暴露。 修复:两事件补webview_label(emit加webview: Webview→.label())+ 前端按getActiveTab().webviewLabel过滤 + 切 tab 后 eval__RB_REEMIT_DISCOVERY重发该页清单(短语 DOM 实扫 + 潜在词从state.discovery.words重发)。commit 880a9dc/6b4fe4e/5e1f035,实机验证清单不再串/空。 🔑 教训(防再犯):任何 per-page 的 content→main 事件(每个 content webview 各自 emit、面板只该显示活动 tab 的)必须带webview_label+ 前端按活动 tab 过滤,并考虑 tab 激活时重发。新增此类事件照 vocab/discovery 模式做。
- 两段式(不是把全文丢给 LLM):本地 matcher 框候选(context 桶为主,opted-in 时含 always 复判)带偏移 → 只把含候选的句子打包送 flash 做"习语义 vs 字面义"二分类 → 判 true 才高亮。always 桶本地秒出先到,二段异步补出。
- 用 flash(gate-B 坐实 92.9%);复用
supabase/functions/_shared/llm.ts(计量/限额/llm_call_log)+explain_phrase骨架。 - opt-in = 隐私门不是成本门:flash ≈ 0.056¢/篇可忽略(定价进 premium);opt-in 真正理由 = 整篇正文片段外发第三方需显式知情同意。
- work in gloss 优化点(gate-B 2 个误报全
work in字面句,flash/pro 同错 → prompt/gloss 问题非模型):消歧 prompt 给的 gloss 是泛化 "to insert or include something",被 work in 多义干扰。实现时给 per-sense 精准 gloss 可改善。 - floor 清理 round-3(✅ 已完成,2026-06-26,RVH 会话):预装库 v23→v24(SHA
1315958f…,always 2776 / context 3451 / literal 383)。A 类all along→context(gate-A 复测唯一硬 FP;always 桶逐项检视确认无其它同模式 homonym 长尾——余皆彩色习语,v23 已扫净)+ B 类 12 个纯话语功能子集→literal(no matter what/pay attention/for the most part/by far/on purpose/in spite of/right away/the other day/from time to time/once in a while/how come/fair enough)。纯 demote-only、确定性覆盖层(零 LLM、零 lemmatizer 改、零 PK 重算)、additive(13 行 word_tags、0 prune、18898 不变)。静态 idiomaticity 治理自此冻结(见上方 🧭 战略结论)。回执 =docs/cross-end/15§12。RB 待跑/vocab-reseed(SHA1315958f…,消费侧零代码改动)。
启动 prompt(复制即用,2026-06-26 备):
- deep mode P1(RB 新会话):bootstrap 在
docs/plans/archive/phrase-deep-mode-plan.md(开新会话先读它 + backlog 🧭 战略结论 + tiering plan §9/§gate-B + explain-phrase/_shared/llm.ts 骨架)。P1 范围 = opt-in 开关phrase_deep_mode+ 新 edgejudge-phrases-batch+ Rustjudge_phrases_batch+ content-scriptdeepResolvePhrasesOnPage()(reader 二段 context 桶救回)+ gate-C ①。部署走/edge-deploy。 - floor 清理 round-3(RVH 新会话):
任务:短语 floor 清理 round-3 —— 残留 FP demote-only + 冻结静态治理(必须 RVH 新会话)
【会话隔离】RVH = 本仓子目录 `rvh/`(Flutter/Dart;2026-08-28 合仓)。仍要**新开会话**,
判据是工具链(flutter/dart vs cargo/pnpm),不是目录 —— 见 CLAUDE.md §9「会话隔离规则」。
路径一律**仓根相对**(原写在这里的「~-锚定绝对路径」规则随 §9「跨仓库路径约定」整节于
2026-08-29 T4-7 删除,那条规则的前提就是两个仓)。本轮纯 additive(word_tags idiomaticity tag
值变更,无 schema migration,不动 lemmatizer/PK),沿 v22/v23 同机制。
【先读真相源(仓根相对路径)】
1. docs/plans/backlog.md §短语 B 🧭 战略结论 + #3(floor 清理那条)
2. docs/plans/archive/phrase-auto-highlight-thinslice-plan.md §gate-A 复测
(2026-06-26:1 个硬 FP `all along` + 3 个低价值话语词的实证)
3. ~/reading-browser/docs/plans/archive/phrase-noncompositionality-tiering-crossend-plan.md §11.4
(话语子集降 literal 的判断 + 「!is_basic 一刀切已否决」的警告)
4. ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md
(最近 reseed 回执格式 + v23 final 数字 always 2789/context 3450/literal 371)
【一句话目标】
这是【冻结静态治理前的最后一轮】廉价 demote-only。两件事,做完即冻结——以后短语质量靠 RB 的
§9 LLM 深度模式(ceiling),不再 retag 静态分类。
【两类降级(方向不同,别混)】
A. HOMONYM surface 陷阱 → 降 context(demote-only always→context,同 round-2 机制):
确诊 `all along`("all along the river"=空间字面义 撞习语"自始至终")。用 v23 同款改进版
challenge(rule 6 的 HOMONYM 子类)re-scan always 桶,连带降同模式长尾(整串本身就是常见
字面短语那类)。这些是真习语、只是 occurrence 含糊 → context(§9 深度模式可救回)。
B. 纯话语功能子集 → 降 literal(不是 context!):
`no matter what` / `pay attention` / `for the most part`(gate-A 实证 3 个)
+ §11.4 候选 `by far` / `on purpose` / `in spite of` / `right away` / `the other day`
/ `from time to time` / `once in a while` / `how come` / `fair enough` 等。
它们语义上确是 always(故不能降 context),但纯话语功能、学习价值低 → literal
(= 既不自动露、§9 深度模式也不送,有意取舍)。
【关键纪律(否则误杀)】
- **保留彩色习语在 always**——§11.4 实锤:always+basic 共 59 条,约一半是高价值彩色习语
(cut to the chase / bad hair day / call it a day / out of one's league…)。**禁止** `!is_basic`
一刀切。B 类只精挑「纯话语功能」子集,逐个判断,不按 basic tag 批量降。
- demote-only 对 RB 单调更安全(只减假高亮);校准锚点全保 always(抽查 by virtue of /
spill the beans / break the ice / pan out / at stake / pave the way 不误降)。
【交付(additive,照 v23 §10/§11)】
1. A 类 re-scan + B 类精挑 → 改 word_tags 的 idiomaticity tag 值(纯 additive,无 migration)。
2. byte-equal 重导出 reading_vocab.db + bump 预装库版本(v24 或 RVH 定)。
3. lemma 表不动(140370/101646,红线 #5e 不触发);不增表(4 表白名单断言不变)。
4. 续写交接确认 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md
新 §12(SHA / 版本 / A 类降 context 清单 / B 类降 literal 清单 / 新三档分布 / additive 证明)。
5. 知会 RB:跑 /vocab-reseed(byte-equal 整包覆盖);RB 消费零代码改动(filter === 'always'
自 v21 就位,移出 always 的自动停高亮)。
【冻结声明】本轮后静态 idiomaticity 治理冻结——残留 occurrence 级 FP 交 RB §9 深度模式
(floor+ceiling 架构,见 backlog 🧭 战略结论),不再开 retag 轮次。
【红线】#10 byte-equal 整包覆盖、#9 跨端 PK(本轮零 lemmatizer 改动、PK 不变)、additive 无 migration。4. vocab(CEFR/discovery)高亮也收窄到主内容容器(倾向做,未启动)
触发:用户说「收窄 vocab 高亮 / vocab 也别扫 footer」。纯 RB,无 RVH。 来源:2026-06-24 短语第 0 步验证时顺带发现(见
phrase-auto-highlight-thinslice-plan.mdv2 §顺带观察)。
- 现状:phrase 自动高亮已收窄到主内容容器(2026-06-24,
findMainContentRoot());但 vocab 高亮仍扫全document.body——验证页<footer>里仍出现rb-discoverspan(footer 导航/推荐链接里的词被高亮)。 - 倾向收窄(用户 2026-06-24 表态):CEFR/discovery 高亮在 footer/nav/侧栏里属噪声,与「安静增强层 / 学习自然发生在正文」定位更一致。
- 实现路子:复用 phrase 已落地的
findMainContentRoot()(提取为共享 helper,避免两份选择器清单漂移)→highlight.js的 vocab/discovery TreeWalker 根从document.body改为主内容根。注意 reader 模式路径已是 overlay-scoped(reader.js进入时只刷 overlay),主要改 live 模式路径。 - 需先确认的边界:① EPUB / 非 article 结构页退回 body 是否合理;② discovery 高亮(
highlightDiscoverable)与 vocab 是否同步收窄;③ 选区查词、双击查词不受影响(那些不依赖整页扫描)。先小范围验证 footer 清零 + 正文不丢,再定。