Skip to content

短语非组合性三档标签 — 跨端交接 plan(B 方案根治精度)

物理仓库:RB(/Users/larry/reading-browser)。 跨端协调 plan 统一存 RB(CLAUDE.md §9)。RVH 会话用绝对路径读本文件: Read ~/reading-browser/docs/plans/archive/phrase-noncompositionality-tiering-crossend-plan.md 跨仓库文件引用一律用 ~-锚定绝对路径:RB→~/reading-browser/...,RVH→~/reading_vocab_helper/...

前置:先读 thin-slice plan ~/reading-browser/docs/plans/archive/phrase-auto-highlight-thinslice-plan.md(v1 已落地,commit 0808399)。本 plan 是其"后续相"。


0. RVH 会话启动信息(复制粘贴到新开的 RVH 会话)

启动 B 时,把下面整块贴进一个新的 RVH 会话(CLAUDE.md §9 会话隔离)。

任务:短语「非组合性三档标签」(idiomaticity) —— RVH pipeline 侧(B 方案 / 短语精度根治)

【会话隔离】这是 RVH 仓(~/reading_vocab_helper,Flutter/Dart + 预装库 pipeline)的工作。
跨端协调 plan 统一存在 RB 仓,用 ~-锚定绝对路径读,禁止裸相对路径。

【先读完整规格(RB 仓,绝对路径,唯一真相源)】
Read ~/reading-browser/docs/plans/archive/phrase-noncompositionality-tiering-crossend-plan.md
(含背景、三档判定 rubric §2、数据模型两选 §3、RB 消费契约 §4、验证口径 §5、你的待办 §6)

【前置阅读(同在 RB 仓)】
- ~/reading-browser/docs/cross-end/06-rvh-phrase-library-brief.md          ← 短语库源头/word_tags 结构
- ~/reading-browser/docs/cross-end/10-synonym-differentiation-handoff.md   ← JSON 内加键先例(word_tags tag 值同类)
- ~/reading-browser/docs/cross-end/12-etymology-handoff.md                 ← 加独立列先例

【一句话目标】
给预装库 reading_vocab.db 里 6,611 条 phrasal_verb/idiom 短语,各打一档 idiomaticity ∈
{always | context | literal}(rubric 见 plan §2),让 RB 端「只自动高亮 always 桶」,
根治当前 41% 误报。判定是【类型层、与上下文无关】,烤进预装库一次定。

【交付(详见 plan §6)】
1. 跑 LLM judge 产出每条短语三档 + 坏词条标记(如 some person)
2. 建模决策:word_tags 加 `idiomaticity:always|context|literal` tag 值(推荐,省 RB migration,
   现有 tag abbreviation/basic/idiom/phrasal_verb/proper_noun/symbol 不撞)/ 或新列 idiomaticity
   (仿 12-etymology)。决定写回 plan §3
3. 写入 ~/reading_vocab_helper/assets/databases/reading_vocab.db,bump 预装库版本号
4. 产出确认文档 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md
   (记 SHA / 版本 / 建模方式 / 各档计数 / 是否 additive)
5. 知会 RB:RB 新会话据该文档跑 /vocab-reseed + 消费改动

【纪律】红线 #10 双端 byte-equal;加 tag 值/列都不增表 → sync 脚本 4 表白名单断言不变。
【校准参考(RB 实测)】应判 context:come to / work in / sit in / move in / look on / draw on …;
应判 always:by virtue of / spill the beans / by and large / cautionary tale …;边界保守归 context。

流程:RVH 先行(产出标签→写预装库→确认文档)→ 回 RB 新会话(/vocab-reseed + §4 消费改动)→ 观察 §5 误报率。


1. Context(为什么做)

短语自动高亮 thin-slice v1 用 basic tag 当精度粗代理,实测验证:basic 过滤必要但不够

v1 上线后真实埋点(phrase_interaction_log,约 1 小时主动测试样本):

指标
shown219 个短语 / 19 页
clicked51
dismissed(LLM 判 fit=false)21
误报率 = dismissed/clicked41% ⚠️

误报集中在非-basic 但高度字面的"动词+介词"短语come to(3/3)、work in(2/2)、and how(2/2)、sit in/move in/start in/look on/draw on/make for/as of/of choice,以及坏词条 some person。 真正有价值的命中(点了没被撤):by virtue of/cautionary tale/labor of love/come together/to do with/stand behind

根因basic 区分的是"高频/常见",不是"组合性"。come to 非 basic 但绝大多数是字面用法。需要一个直接刻画"非组合性/歧义度"的信号

为什么放 RVH pipeline(静态):短语【类型】的非组合性是通用词知识spill the beans 几乎永远是习语;come to 经常字面),与上下文无关 → 烤进预装库一次定、运行时确定性读取。符合 LLM 静态/运行时选址轴(docs/cross-end/...、memory project_llm_static_vs_runtime_axis)。


2. 三档分类方案(RVH 产出的核心)

每个 phrasal_verb / idiom 短语打一档 idiomaticity

判据示例归宿
always几乎任何上下文都是非组合(习语)义;字面解读罕见或不通by and large, spill the beans, by virtue of, labor of love, cautionary tale, a dime a dozen自动露(本地、免费、秒出,不走 LLM)
context习语义与字面义都常见,需上下文才能定come to, work in, make up, look up, pick up, break down, move in默认不露(选区按需);§9 深度模式的 LLM 消歧候选
literal绝大多数是字面/话语用法,习语价值低kind of, a number of, as long as, and how, of choice❌ 始终不露,连深度模式也不送 LLM(省调用、不值得)

三档其实是「LLM 路由闸」(结合 §9 深度模式看更清晰):always = 永不需要 LLM(类型已确定);context = 唯一值得跑 occurrence-LLM 的桶;literal = 跑了也是浪费。这正是把判断放静态类型层的价值——先用一次性静态标签把「该不该问 LLM」筛掉,运行时只对真正含糊的 context 桶问

判定规则(给 RVH 的 LLM judge rubric)

  1. 问"这个串在真实英文里,非组合习语义占比大概多少?" ≳90% → always;30–90% → context;≲30% → literal。
  2. 边界一律保守归 context(宁可漏、不误报)。break down 这种(车抛锚/情绪崩溃 vs 破门)→ context。
  3. 坏词条剔除:judge 顺便标记"根本不像独立习语"的条目(如 some person),RVH 决定从短语库移除或降级。
  4. 判据是类型层、与上下文无关——不是判某一句,是判这个短语作为词条的固有性质。

RB v1 只用 always 档自动高亮;context/literal 都不自动露。三档保留信息量供未来调(如将来想给 context 桶上 occurrence 级 LLM)。


3. 数据模型(RVH 产出格式 + byte-equal 纪律)

✅ RVH 已定(2026-06-18):采用「word_tags tag 值」方案(下方推荐项)。 落地:phrase 行 word_tags 加 idiomaticity:<tier> 值(generate_db 短语 overlay 回填, 源自提交进仓库的确定性缓存 data/phrase_idiomaticity.json)。纯 additive、零 schema migration——RB 端只需 matcher SQL 加 MAX(CASE WHEN je.value LIKE 'idiomaticity:%' …) 取档 (现有 word_tags = excluded.word_tags merge SQL 不动)。坏词条(如 some person物理移除 (不入库为 vocabulary 行)。详见交接确认文档 docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md。 ⚠️ substr 偏移:tag 前缀 idiomaticity: = 13 字符(含冒号),取 tier 值用 substr(value,14) (本文件 §4 写的 13 是冒号位,RB 实现取 14)。

推荐:作为 vocabulary.word_tags JSON 数组的新 tag 值(不是新列):

  • 在现有 ["idiom","phrasal_verb","basic"] 里加一个档值:idiomaticity:always / idiomaticity:context / idiomaticity:literal(带前缀避免与其它 tag 撞)。
  • 优势(关键)word_tags 已是现成列,预装库 reseed 的 merge SQL 已含 word_tags = excluded.word_tags无需 RB 端 schema migration、无需改 helpers.rs merge SQL,纯 additive reseed(沿 RVH v19-synonym/⑤ 差异化的"riding 现有列"先例,比 ⑦ etymology 独立列省一步)。
  • RB 端只需:matcher SQL 加一个 MAX(CASE WHEN je.value LIKE 'idiomaticity:%' ...) 取档(与现有 is_basic 完全同款,见 §4)。

备选:新列 idiomaticity TEXT('always'|'context'|'literal')。语义更干净、更易 admin review/排序,但需双端 ALTER ADD migration + helpers.rs merge SQL 加 idiomaticity = excluded.idiomaticity(沿 ⑦ etymology 独立列先例,红线 #10)。若 RVH 倾向列式建模,走这条也可,RB 跟进一个 ALTER-ADD migration。

两端最终选哪种由 RVH pipeline 建模习惯定;RB 都能跟进,工作量都很小。红线 #10:无论哪种,reading_vocab.db 双端 byte-equal,发版用 scripts/sync-rvh-vocabulary.sh 整包覆盖。

覆盖范围:当前短语集 = word_tags 含 phrasal_verb/idiom 且 frequency_rank ≤ 6000,约 6,611 条(RB 实测)。RVH judge 需覆盖这批(可含更冷僻的,RB 侧用 freq 阈值兜)。


4. RB 侧消费改动(RVH 产出后,RB 新会话执行)

最小改动,全部镜像现有 is_basic 模式(见 commit 0808399):

  1. src-tauri/src/commands/vocabulary/query.rs · match_phrases_in_node_texts
    • SQL 加 MAX(CASE WHEN je.value LIKE 'idiomaticity:%' THEN substr(je.value,14) END) AS idiomaticity(tag 方案 — 已定;前缀 idiomaticity: 13 字符含冒号,tier 从第 14 字符起,故 substr(...,14),不是 13)。
    • phrase_map value 加 idiomaticityPhraseMatchmod.rs)加 pub idiomaticity: String
  2. src-tauri/src/content-script/features/phrase-highlight.js · highlightPhrasesOnPage
    • 自动路径 filter 从 !m.is_basic 改为 m.idiomaticity === 'always'
    • 选区按钮路径(highlightPhrasesInSelection不变:仍露全部(含 context/literal),保留捞回。
  3. 保留 on-click LLM 兜底maybeResolvePhrase/dismissPhraseHighlight):标签错判漏进来的 false positive 仍能点击时自愈 → 类型层粗筛 + occurrence 层兜底双保险。
  4. basic 过滤可保留或移除:always 档天然已排除 basic 话语词,但留着无害(双层)。建议保留 is_basic 字段、过滤条件改成 idiomaticity==='always'(更准)。
  5. 若走列方案:加一个 ALTER-ADD migration(vN+1)+ helpers.rs merge SQL 加列。

5. 验证(数据闭环)

RB 已有 phrase_interaction_log(migration v20)。B 落地后用同一张表对比:

  • 误报率 = dismissed/clicked 应从 41% 大幅下降(目标 <10%)——因为 context 桶的 come to/work in 等不再自动露。
  • shown_sum 会下降(覆盖收窄,预期)——观察是否过窄(always 桶太小导致几乎没短语露出)。
  • 抽查:always 档里有没有混进字面短语(标签错判,系统性可定位);context 档里有没有该升 always 的高价值习语(覆盖损失)。

判据:误报率达标且 always 桶覆盖不过窄(每页仍能露出有意义数量的真习语)→ B 成功,可考虑把 phrase_auto_highlight 默认值定为 on 进发版。


6. RVH 会话的待办(交接清单)

RVH = ~/reading_vocab_helper(Flutter/Dart + 预装库 pipeline)。本节是给 RVH 新会话的 actionable 清单。

前置阅读(RVH 会话先读,都在 RB 仓,用绝对路径)

  • 本短语库的源头 brief:~/reading-browser/docs/cross-end/06-rvh-phrase-library-brief.md(短语集怎么来的、word_tags 结构)
  • 建模两种先例:~/reading-browser/docs/cross-end/10-synonym-differentiation-handoff.md(在 JSON 内加键,word_tags tag 值同类)/ ~/reading-browser/docs/cross-end/12-etymology-handoff.md(加独立列 + RB merge SQL DO UPDATE SET 多一步)
  • 资产纪律:红线 #10 + ~/reading-browser/scripts/sync-rvh-vocabulary.sh(4 表白名单断言;加 tag 值不增表 → 断言不变;加列同理不增表)
  1. 判定 idiomaticity 三档:对预装库 6,611 条 phrasal_verb/idiom 短语(freq≤6000,与 RB 实测一致)跑 LLM judge(rubric 见 §2),产出每条的档值 + 坏词条标记。
  2. 建模决策:选 word_tags tag 值(§3 推荐,省 RB migration;现有 tag = abbreviation/basic/idiom/phrasal_verb/proper_noun/symbol,加 idiomaticity:always|context|literal 前缀不撞)还是新列 idiomaticity(更干净,仿 12-etymology)。把决定写回本文件 §3 备注。
  3. 写入预装库 ~/reading_vocab_helper/assets/databases/reading_vocab.db,bump 预装库版本号。
  4. 坏词条处理some person 类从短语库移除或降 literal。
  5. 产出交接确认文档 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md(编号 15 = 现有最高 14 +1):记 SHA、版本号、建模方式(tag/列)、各档计数、是否 additive/需 migration。
  6. 知会 RB:RB 新会话据该确认文档跑 /vocab-reseed(整包覆盖 byte-equal)+ §4 消费改动。

判定质量参考(用 RB 实测数据校准 RVH 的 judge):

  • 应判 context(v1 实测误报):come to, work in, sit in, move in, start in, look on, draw on, make for, and how, as of, of choice。
  • 应判 always(v1 实测真命中):by virtue of, cautionary tale, labor of love, spill the beans, by and large, a dime a dozen。
  • break down / come together 是边界——按 §2 规则 2 保守归 context(即便 v1 里它们暂时没误报,可能是运气/样本小)。

7. Rollout 顺序

RVH 新会话:judge 三档 → 写预装库 → bump 版本 → 交接确认文档
  ↓(byte-equal 整包)
RB 新会话:/vocab-reseed → §4 matcher/filter 改动 → build-check → 实机

观察 phrase_interaction_log 误报率是否 <10% + 覆盖不过窄

达标 → phrase_auto_highlight 默认 on,进发版评估

8. 不做 / 边界

  • B 本身不做 occurrence 级扫描时 LLM(见 §9 为单独的后续档)。 注意(2026-06 LLM 选型后修正):推后 occurrence-LLM 不再是因为"贵"——DeepSeek V4 Flash 实测 ~0.056¢/篇(§9),便宜。推后的真正理由是:① always 桶本地、免费、秒出、可离线,对它跑 LLM 纯浪费;② 隐私——默认层零文本外发,整篇外发留给 §9 opt-in 深度模式做知情同意闸;③ 延迟/可靠——不让默认高亮卡在 LLM 往返 + DeepSeek 峰值波动上。
  • 为什么不干脆"全部短语都跑 LLM 消歧"(既然便宜):会让每个高亮都等 LLM(always 桶秒变 1-3s)、每篇都外发、且依赖 API 在线。B 的静态三档把"明显的(always)"和"没救的(literal)"先筛掉,只把真正含糊的 context 桶留给 LLM——延迟、隐私、鲁棒性都更好,且 LLM 调用量最小。便宜不等于该处处都用。
  • 不动选区按钮路径:始终匹配全部短语(含 context/literal),保留用户捞回(对齐"决定 A"意图)。
  • 三档是离散标签,对边界短语必有取舍——保守归 context,宁可覆盖窄、不误报。
  • 验证分层:§5 的"误报率 41%→<10%"是验 B 的 always-桶默认层;context 桶经 §9 深度模式的精度是另一档单独验证,不混算。

9. 后续档:context 桶"深度模式"(B 站稳后再评估,opt-in / 付费)

B 让 context 桶不自动露(稳,但漏掉它们偶尔的习语用法)。要把 context 桶也准确露出,需 occurrence 级上下文判断 = LLM。设计成独立 opt-in / premium 档,不进免费默认:

  • 触发:用户开"深度短语模式" → 进 reader 模式时对本页 context 桶候选一次批量 LLM 消歧 → 只高亮判为习语义的。always 桶(B,本地)仍秒出,context 桶 LLM 返回后二段补出。
  • 模型 = DeepSeek V4 Flash 非思考(2026-06 选型,复用现有 translate_provider=deepseek + _shared/llm.ts)。对"习语 vs 字面"二分类够用;思考模式/Pro 是杀鸡用牛刀(Pro 标准价反比 Haiku 贵)。低置信候选可选择性升思考模式二判。
  • 成本:V4 Flash ≈ 0.056 美分/篇(每篇 ~3000 in/~500 out),比 Haiku(~0.55¢)便宜约 10×;重度用户 50 篇/天全开 ≈ $0.84/月。成本几乎不是问题。
  • 付费门的真正意义 = 隐私同意,不是收成本:深度模式把整篇正文发第三方(vs 点击只发一句),与 local-first 倾向冲突 → opt-in 显式知情同意。
  • 复用现成explain_phrase 骨架 + _shared/llm.ts(计量/限额/llm_call_log 成本看板/预算闸)全现成。注意_shared/llm.ts 的 deepseek 别名 2026-07-24 废弃 → 迁 deepseek-v4-flash(计价已于本次更新)。
  • 运营:DeepSeek 高峰期延迟有波动 → 强实时"加载即高亮"留意;reader 批量/异步路径影响小。
  • 决策前:用 phrase_interaction_log 真实短语 + 构造句跑小评测量 Flash 准确率(≥90% 与人工一致即采用)。评测脚手架 /tmp/phrase_eval/(gold set 28 条 = 习语 19 + 字面 9,key 取 dev 库 translate_api_key)。
    • ✅ 2026-06-18 已跑(gate-B 通过)deepseek-v4-flash = 92.9%(26/28,0 漏报、2 误报)deepseek-v4-pro = 92.9%(错得完全一样)。
      • 结论:采用 flash,不用 pro——同准确率、同错、同位置;pro 贵 ~12×/慢 3× 却一个没多对 → 非模型能力问题,升级无救。坐实 §9 选型。
      • 0 漏报:19 个真习语全识别 → context 桶"救回"功能有效。
      • 2 误报均 work in 字面句(flash/pro 同错)→ prompt/gloss 质量问题:gold 给泛化 gloss "to insert or include something",被 work in 多义干扰。§9 实现时给 per-sense 精准 gloss 可改善。
      • 诚实保留:gold 是平衡集,真实网页字面分布更多 → 线上 FP 率可能高于 22%(2/9 字面句);这是离线 gate,非线上误报率。
      • 环境卡点已解(原"代理自签证书未跑完"根因):Python OpenSSL 不读 macOS keychain,DOVE 透明 TLS 拦截的根证书撞 self-signed(curl 读 keychain 不受影响)→ 评测脚本 ssl._create_unverified_context() 关验证(本机可信代理、数据非敏感)。

10. v21.1 retag —— 3 个 over-confident always 重判(A 喂 B 第一步,2026-06-24 敲定)

物理仓库:本文件在 RB。A 的执行在 RVH 新会话(Flutter/Dart + pipeline,CLAUDE.md §9)。 本节是给那个 RVH 会话的 actionable 清单。RB 侧已用真实埋点定位 + 决策敲定,RVH 直接执行。

背景:v21 上线后真实埋点(phrase_interaction_log,2026-06-24 dev 库):CTR 3.9%(25/639)、误报率 28%(7/25)。28% 100% 可归因到两个确定性根因——桶① boilerplate(all right reserve×2,RB 第 0 步 commit 2a2e0b3 已用扫描范围收窄根治)+ 桶② 这 3 个类型层 mistag(本节)。无任何弥散性误报

这 3 个全部被 v21 judge 标成 idiomaticity:always,全部标错

短语字面读法(被误标的高频来源)重判目标档理由
in the black"in the black coat/car"(black 作形容词)context财经习语真有价值,财经文里也常见;交 §9 深度模式救回(财经句→高亮,"black coat"→不高亮)
to die for"to die for [a cause]"(为某事而死)context"a dress to die for" 习语本身相当常见,值得 occurrence-LLM 判
so much for"thank you so much for…"(碾压性字面搭配)literal字面搭配频率碾压、习语义罕见到不值得占 LLM 配额;落 literal = §9 深度模式也不送,"so much for our plans" 永不救回(有意取舍)

RVH 会话的待办

  1. 先查根因:核对 v21 judge 当初按什么规则把这 3 个判成 always(看 data/phrase_idiomaticity.json 缓存 + judge prompt)。目的是避免下次 reseed 又打回
  2. 修 rubric 系统性盲区(比修 3 个词更重要):v21 judge 问的是"这是不是真习语?"(这 3 个答案都是 yes → 给 ≳90% → always),却没充分加权"surface 串在真实语料里习语义占比多少"so much for/to die for 都是「高频字面搭配 + 真习语」双重身份串——这是 always-mistag 的系统性陷阱类型。修法 = judge prompt 显式估计 surface 串的字面搭配频率,把这类陷阱识别出来。建议顺带 re-scan 全 6,611 条里是否有同模式的其它 always 误标(如其它"动词+介词/形容词补语"高频字面串)。
  3. 重判落档in the blackcontextto die forcontextso much forliteral(按上表)。
  4. additive reseed:改 word_tagsidiomaticity: tag 值(纯 additive,无 schema migration,沿 v21 先例);bump 预装库版本号。
  5. 交接确认:在 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md 续记本次 retag(SHA / 版本 / 这 3 个的新档 + 任何 re-scan 连带改动 / additive 确认)。
  6. 知会 RB:RB 新会话据确认文档跑 /vocab-reseed(整包覆盖 byte-equal)。RB 侧消费零改动——matcher 已读 idiomaticity 档、filter 已是 === 'always',这 3 个移出 always 即自动停止高亮。

RB 侧后续(不在本 RVH 会话):reseed 后 gate-A 重测(误报应 <10%)→ 达标评估 phrase_auto_highlight 默认 on;§9 深度模式(B)单开 RB 会话,目标桶 = context(含本次降级进来的 in the black/to die for)。

关键次序洞见A + reseed 单独就能闭合 gate-A ⚠️ 被 2026-06-25 gate-A 实测推翻(见 §11)——v22 demote 222 个后仍 28% 误报,长尾未覆盖。B(§9)仍是独立增强、非 default-on 前置。


11. v23 retag 第 2 轮 —— surface 陷阱降 context(gate-A 实测驱动,2026-06-25)

方向:RVH pipeline 续作(A→B 延续)→ 本节 = 给 RVH 新会话的 actionable → RB 据回执 /vocab-reseed驱动:gate-A 实测(~/reading-browser/docs/plans/archive/phrase-auto-highlight-thinslice-plan.md §gate-A 实测)发现 v22 后 always 桶仍 28% 误报,硬 FP 双轨根因之一 = surface 陷阱(另一轨 lemma 折叠见 §短语 B #1b / backlog 噪声治理条,单独 RVH 会话)。 RB 侧消费零改动——matcher 已读 idiomaticity、filter 已 === 'always';降 context 即自动停止高亮。

11.1 目标 & 确诊 3 个(当前都 idiomaticity:always,应降 context)

短语字面框(误命中来源)习语义
on the loose"on the loose grit"(loose=形容词修饰名词)逃逸在外
for the bird"for the birds"(指真实的鸟)没价值
to speak of"refuse to speak of the condition"(=谈及/说起)值得一提(多见于 "nothing to speak of")

demote-only(always→context),对 RB 单调更安全(只减假高亮)。预装库 v22→v23

11.2 关键调查项(比降 3 个更重要 — 否则下轮还漏)

v22 的 re-scan 已加 rule 6「SURFACE-STRING TRAP」+ challenge demote,为什么这 3 个还留在 always?先查 data/phrase_idiomaticity.json + rescan_always_idiomaticity.dart 判定记录,定位漏网原因:

  • challenge 把它们的「字面框占比」估低了(判 ≳90% 习语 → 保留 always)?
  • demote-only 保守回退(缺回显/失败保留 always)误留?
  • re-scan 采样/阈值没覆盖到?

据此修 challenge 的字面框估计(这 3 个作校准锚点),让本轮真正捞到它们 + 同模式长尾

11.3 RVH 待办(照 v22 §10)

  1. 修 challenge 字面框判定 → re-scan always 桶(demote-only)→ 降这 3 个 + 同模式连带。
  2. additive reseed:改 word_tagsidiomaticity: tag 值(无 migration),bump 预装库 v22→v23。
  3. 校准锚点全程保 always(抽查 by virtue of / spill the beans / at stake / pave the way / pan out 等真习语不误降)。
  4. 续写交接确认 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md 新 §11(SHA / v23 / 降级清单 / additive 证明 / 这 3 个新档)。
  5. 知会 RB:RB 新会话据回执跑 /vocab-reseed(byte-equal 整包覆盖);RB 消费零代码改动

11.4 边界 / 不做

  • 不治 lemma 折叠in a fix←fixed / all right reserve←rights reserved)——另一轨,lemmatizer 资产 bug,单独 RVH 会话(backlog「RVH 短语/习语归一噪声治理」/ §短语 B #1b)。
  • 低价值 basicno matter what / pay attention):它们语义上确是 always(降 context 是错的),属"正确但低价值"噪声、非 FP(实测 2/18)。
    • ⚠️ 「RB filter 加 !is_basic」已否决(2026-06-25 量化核实):always+basic 共 59 条约一半是高价值彩色习语cut to the chase / bad hair day / judge a book by its cover / call it a day / out of one's league / too good to be true / keep an eye on…)。basic tag = "高频/常见" ≠ "低价值",一刀切 !is_basic 会误杀这些该高亮的习语,得不偿失。
    • 正解(可选、低优)= RVH 精挑"纯话语功能"子集降 literalno matter what / by far / on purpose / for the most part / in spite of / right away / the other day / from time to time / once in a while / how come / fair enough…),保留彩色习语在 always。属判断活,可选择性折进本轮 retag、也可单列。
    • ✅ 已落地(round-3 v24,2026-06-26):上述 12 个纯话语功能子集(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 always→literal,连同 A 类 all along→context。预装库 v24(SHA 1315958f…,always 2776 / context 3451 / literal 383)。确定性覆盖层、零 LLM、纯 additive。回执 = docs/cross-end/15 §12。静态 idiomaticity 治理自此冻结(floor+ceiling,残留 occurrence FP 交 §9 深度模式)。

11.5 gate-A 复测(RB,1a+1b 都 reseed 后)

按 thinslice §gate-A 实测同法(Claude 读 data-rb-sentence 逐条判,文学/叙事体裁取样)→ FP <10% 且覆盖不过窄 → 评估 phrase_auto_highlight 默认 on。

11.6 ✅ RVH 落地回执(2026-06-25,RVH 会话完成)

RVH 待办 1+2+3+4 已完成,预装库 v22→v23。详见交接确认文档 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md §11(完整 SHA / 降级清单 / additive 证明 / 根因)。

结果
漏网根因probe 实证 = challenge 的 surface-trap 只框 FRAGMENT,漏 HOMONYM(整串本身就是常见字面短语,如 for the birds=真鸟 / to speak of=谈及)。非保守回退误留、非采样未覆盖。顺带发现旧 prompt 误降锚点 pan out(噪声实锤)
rubric 修补classify rule 6 + challenge CRUCIAL 段拆 (a)FRAGMENT + (b)HOMONYM 两类各给锚例 + 加 PROTECT 清单 防 flagship 误降。probe 验证:3 目标全 demote、12 锚点(含 pan out)全 keep
落档3 确定性(on the loose/for the bird/to speak of→context)+ re-scan 连带 246 + 19 锚点保护集(绝不降级)= 249 条 always→context(纯 demote-only)
三档分布always 3040→2791(占 42%,不过窄)/ context 3200→3449 / literal 371 不变
新 SHA(v23)81f4a06d66c5ce1d241754effbf7c868654dce59fe1365f75b23e3dc7af86661
additive 证明row-content diff(排时间戳列):18899 行不变、仅 249 行 word_tags 变、tier moves 全 always→context、0 触碰其它列;lemma 表 140370/101646 不变
RB 行动/vocab-reseed 整包覆盖(SHA 81f4a06d…)+ bump VOCABULARY_SEED_VERSION;消费侧零代码改动(filter 已 === 'always')。详见确认文档 §11.6
边界lemma 折叠轨(in a fix←fixed / all right reserve←rights reserved)不在本轮,单独 RVH 会话治

12. v25 tier-quality retag —— go to + 透明 PV 降 literal(deep-mode 多体裁评测驱动,2026-06-27)

物理仓库:本文件在 RB。执行在 RVH 新会话(Flutter/Dart + pipeline,CLAUDE.md §9)。本节 = 给那个 RVH 会话的 actionable。 与 v24"冻结"的关系:v24 冻的是 occurrence-FP 的 always 反复 retag(边际递减、whack-a-mole)。本节性质不同—— 修 tier 误分类:一批 context 桶短语根本没有非组合性义项(所有 sense 都字面/透明),本不该当 deep-mode 候选。 这是一次性 tier 质量校正(deep mode P1 多体裁评测实证驱动),做完再 re-freeze,不是重开 occurrence 轮次。

12.0 为什么(RB 侧 deep mode P1 评测实证)

RB 深度短语模式 P1 落地后做了 5 体裁实机评测(~/reading-browser/docs/plans/phrase-eval-log.md)。论说/新闻/文学/科学体裁经 RB 侧 prompt/gloss 收口后已干净;唯一 RB 治不动的硬 FP = go to

  • go topos_definitions 4 个 sense 全字面("to attend an event or place" / "attend classes at a school" / "tend to support" / "intended to happen")——没有任何"whole > parts"的习语义
  • 回忆/纪实体裁实测:go to("you went to Deerbrook Mall" / "went to The Woodlands")反复判 idiomatic=true = FP。
  • RB 侧 prompt("位移→false")+ 全 sense gloss + gold 回归都兜不住:gold 单测能判对,但整页 batch 一起判时 邻居项影响 + flash 方差 → 实机仍漏。根因 = 它压根没习语义、不该进 context 桶。"go-to"(=可靠首选)是形容词 go-to, 另一个词条,不是动词 go to
  • ∴ robust 解只能 tier 层go toidiomaticity:literal(deep mode 直接不送、不判、不亮)。

12.1 确诊 + 候选(RVH 执行)

A. 确定降级(已坐实,直接做)

短语(归一 PK)现 tier目标理由
go tocontextliteral4 sense 全字面、无习语义;多体裁实测 FP;prompt/gloss 治不动

B. 复核降级(透明高组合 PV,用 §12.2 rubric 判,疑似但需 RVH 定夺): RB gate-C 单页样本里这些 context-tier PV 属"义对但太透明=噪声"(learner 词都认识、合起来也直白): slow down / speed up / get up / pass by / cut out(及同模式"动词+纯方向副词"透明 PV)。 ⚠️ 别一刀切:其中有的可能有非透明义(cut out = "停止/适合":"cut it out" / "cut out for";pass by = "错过/逝去")。 逐个过 rubric:有任一非组合义 → 留 context;纯方向/程度透明、跨 occurrence 几乎无歧义 → literal。

12.2 判别 rubric(demote-to-literal 唯一判据)

对每个候选问一句:"这个短语有没有至少一个'词都认识却猜不出'的非组合义项(whole > parts)?"

  • (哪怕也有字面义)→ 留 context(那个习语义正是 deep mode 按 occurrence 救回的目标,别动)。
  • 没有(所有 sense 都是字面/透明组合)→ 降 literal(deep mode 不送、省判省噪声)。

go to = 没有 → literal。break down(=decompose) / set out(=embark) / to do with(=related) 等 = 有 → 必须留 context。

顺带 re-scan(比降几个更重要、防下轮再漏):扫 context 桶里同模式的"全字面义 PV"—— ①"go/come/move/walk + to/into a place"纯位移;②"动词 + 纯方向副词"无引申义。建议 judge prompt 显式加 "该短语是否存在非组合义"作 tier 判据(没有 → literal,而非 context)。

12.3 落档机制(照 v24 / cross-end/15 §12.3 确定性覆盖层,纯 additive)

tools/vocabulary_builder_v3/data/phrase_idiomaticity_overrides.jsonretags 段加 context→literal 项 (A 类 go to + B 类经 rubric 确认者),bin/apply_* 幂等套用进缓存 → generate_db overlay 再幂等套用 → 任何重建逐字节复现。纯 word_tags 改 idiomaticity: 值,无 schema migration、不碰 lemmatizer/PK(沿 v22/v23/v24 先例)。 bump 预装库版本(v25)。

12.4 加性证明(红线 #10)

新 v25 output DB vs 旧 v24 assets DB 做 row-content diff(排时间戳列):18898 行不变、仅降级条数行 word_tags 变、 tier moves 全 context→literal、0 触碰其它列、lemma 表 140370/101646 不变。

12.5 回执 + RB follow-up

  • RVH 在 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md 续记 §13(SHA / 版本 v25 / 降级清单 A+B / re-scan 连带 / additive 确认)。
  • RB 据回执跑 /vocab-reseed(整包覆盖 byte-equal + bump VOCABULARY_SEED_VERSION v25)。RB 侧消费零代码改动 (deep mode 只送 context;go to 移出 context 即自动停止被判/高亮)。RB 再跑 /phrase-eval 多体裁复测(回忆体裁 go to FP 应清零)。

12.6 边界 / 不做

  • 纯 demote context→literal(A 确定 + B 经 rubric);不碰 always 桶、不做 occurrence 级 retag(v24 已冻、保持冻)。
  • 不误伤有非组合义的 PV(rubric 把关:有习语义一律留 context)。
  • 本轮 = 一次性 tier 质量校正,做完 re-freeze 静态治理。RB 侧 prompt 已收的(过程位移 / for good 碰撞)不进本轮(那是 occurrence,归 RB edge)。

12.7 ✅ RVH 落地回执(2026-06-27,RVH 会话完成)

RVH 待办全部完成,预装库 v24→v25。详见交接确认文档 ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md §13(完整 SHA / 降级清单 / additive 证明 / 不误伤清单 / rubric 修补)。

结果
A 类确定降go to → literal(4 sense 全字面、无习语义)✓
B 类经 rubricslow down / speed up → literal(全 sense 透明);get up/pass by/cut out 留 context(各有非组合义,rubric 把关不误伤)✓
re-scan 连带27 条 context 桶"全字面义 PV"(纯位移 / 纯地点 leave-enter)→ literal;go/come/move + in/over 家族全部正确留 context(有真习语义)
落档机制确定性覆盖层(零 LLM):overrides.json retags +30 + bin/apply_v25_tier_quality.dart 幂等套用 + generate_db overlay(applied 0 忠实重构)
rubric 前向保险idiomaticity_generator.dart classify rule 3 扩「透明 MOTION/DIRECTION PV 无非组合义→literal」+ 不误伤 contrast 锚例
三档分布always 2776 不变 / context 3451→3421 / literal 383→413;总词数 18898 不变(0 prune)
新 SHA(v25)b2821764adcdc48b5fe919032bb83d19aa608a69455c25f00d4b871034ec1795
additive 证明row-content diff(排时间戳列):18898 行不变、仅 30 行 word_tags 变、全 context→literal、0 触碰其它 18 列;lemma 表 140370/101646/4 行数+内容 byte-identical(红线 #5e)
RB 行动/vocab-reseed 整包覆盖(SHA b2821764…)+ bump VOCABULARY_SEED_VERSION;消费侧零代码改动(deep mode 只送 context,go to 移出即停送)。再跑 /phrase-eval 多体裁复测(回忆体裁 go to FP 应清零)。详见确认文档 §13.6
边界RB prompt 已收的过程位移(pass through/along/shoot out)/ for good 碰撞不在本轮(occurrence 级,归 RB edge)