Skip to content

⑭ 短语 lemma 折叠 FP 治理 — v23 track-② reseed 交接(RVH → RB)

方向:RVH 新会话(gate-A 第二前置,与 track-① surface-陷阱 retag 平行)→ 本文 RVH 完成回执 → RB 新会话据此 /vocab-reseed与 track-① 合并成同一次 v23 reseed(同版本号、同最终 DB)。 会话边界:生成属 RVH(已完成);RB 侧不碰预装库生成(红线 #10)。 创建:2026-06-25(RVH 会话产出) 契约真相源:~/reading-browser/docs/plans/archive/phrase-auto-highlight-thinslice-plan.md §gate-A 实测(lemma 折叠 2 实例)+ ~/reading-browser/docs/plans/backlog.md「🟠 RVH 短语/习语归一噪声治理」。 track-① 回执 = ~/reading-browser/docs/cross-end/15-rb-phrase-tiering-reseed-confirmation.md §11(surface 陷阱,always 2791,SHA 81f4a06d…=中间态)。


0. ⚠️ 关键结论 —— 任务「改 lemmatizer 资产 + 重算 PK」前提被实测推翻

RB gate-A 把 in a fix("in a fixed proportion")/ all right reserve("All rights reserved")诊断为 「lemma 过度折叠」,原计划改 surface_to_base 资产 + 全量重算 vocabulary.word PK + byte-equal lemma 表 reseed(schema-ish)。 RVH pipeline 端实测推翻

  • fixed→fix / rights→right / reserved→reserve 是合法归一,不是资产 bug(≠ v18 修的 picked→pic/passed→pas/trying→trie 真错映射,那些早已修)。
  • 删 Layer 1 映射也无效:lemmatizer 4 层架构里 Layer 3 后缀规则(-ed/-s 裁剥 + base_forms 裁决)会重新推导出同 fold。 实测(bin/phase0_normalize.dart,临时删映射跑):fixedfix(suffix-validated)、rightsright(suffix-validated)→ "in a fixed proportion" 仍归一成 "in a fix proportion",FP 不消。
  • 真要阻断须从 base_formsfix/right毁掉「fix」「right」这两个词本身)或硬加 fixed→fixed override(全局 verb-past「fixed」不再折到「fix」,vocab 高亮召回受损)→ 净负收益。
  • 结论:本轮零 lemmatizer 资产改动、零 PK 重算、零 byte-equal lemma 表变更。 正解 = 与 track-① 同款 additive 三档 retag/pruneidiomaticity:<tier> tag 值 + bad_entry 物理 skip)。

1. 两条修复

短语(归一 PK)display / canonical_surface处理理由
in a fix"in a fix"always → context真习语,但 PK「in a fix」命中 "in a fixed proportion"(fixed→fix 合法 fold)。降 context → 不自动高亮;§9 深度模式可按句救回困境/财经义。
all right reserve"all rights reserved"bad_entry 物理 prune(不入库)坏词条:法律 boilerplate "All rights reserved",非习语。LLM bad_entry rule 只抓 word-salad(这是可识别英语,judge 不会判 bad)→ 必须确定性锚定 prune。一并消除 rights→right+reserved→reserve 命中。

2. durability —— lemma-fold 盲区修补(防下次 reseed 打回)

tools/vocabulary_builder_v3/lib/idiomaticity_generator.dart_classifyPrompt rule 6 + _challengePrompt CRUCIAL 段, 在 track-① 的 (a) FRAGMENT + (b) HOMONYM 之外新增 (c) LEMMA-FOLD 子类:明确告诉 judge「matcher 逐 token lemmatize, 习语 PK 会命中其内容词的所有屈折字面形」(in a fix←in a fixed/fixes/fixing;all right reserve←all rights reserved)。 → 将来 from-scratch classify 时 in a fix 会被 LLM 自动降 context。all right reserve 非 word-salad,仍靠确定性锚点 prune。

⚠️ 本轮未重跑 LLM rescan(合并入 track-① 已跑完输出,避免非确定性重判 + 省 token);prompt 修补是前向保险。

2.1 确定性覆盖层(2026-06-26 durability 硬化,supersede 一次性脚本作为耐久记录)

track-② 的 2 个确定性决策(in a fix→context retag、all right reserve→bad_entry prune)原只写在一次性 bin/apply_track2_lemma_anchors_v23.dart没接进 build_all——正常重建(复用提交进仓库的 phrase_idiomaticity.json 缓存)不丢,但缓存若从空重生成(--classify-idiomaticity)则这些决策不在重生成路径里。已提取进提交进仓库的声明式 tools/vocabulary_builder_v3/data/phrase_idiomaticity_overrides.json(与 track-① 的 6 retag + 19 锚点合并成单一完整记录;prune 段固化坏词条)。generate_db overlay 与 classify_idiomaticity 都在读缓存后幂等套用该文件 → 任何重建路径(含从空重判)都逐字节复现。实证:对当前合并缓存套用 = applied 0(忠实重构);人为 corrupt 全部 27 key 后套用 = 全部重建。apply_track2_lemma_anchors_v23.dart 自此降为历史脚本(产出已固化进 overrides)。

3. 合并后 v23 final(supersede track-① 中间态 §11.0)

track-① 中间态(doc 15 §11.0)两轨合并 final
总词数18899(0 移除)18898(−1:all right reserve prune)
always / context / literal2791 / 3449 / 3712789 / 3450 / 371
bad_entry01
reading_vocab.db SHA25681f4a06d…(弃)747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913
lemma_surface_to_base / lemma_base_forms140370 / 101646140370 / 101646(不变,红线 #5e)
surface_to_base.json / base_forms.json SHAca75b179… / 3094c829…不变(红线 #5e 锚点照旧)

加性证明(vs v22 baseline,sqlite3 row-content diff,排除 created_at/updated_at/synced_at): surviving 行 word_tags 变 250(全 always→context:249 track-① + 1 in a fix);word set −1(prune all right reserve); 0 新增;非 idiomaticity tag / 其它列 0 触碰;lemma 表不变。

4. RVH 侧改动清单(本次 commit)

  • 新增:tools/vocabulary_builder_v3/bin/apply_track2_lemma_anchors_v23.dart(确定性 demote/prune-only,不走 LLM)。
  • 改动:tools/vocabulary_builder_v3/lib/idiomaticity_generator.dart(双 prompt 加 (c) LEMMA-FOLD 子类)、 tools/vocabulary_builder_v3/data/phrase_idiomaticity.json(仅 2 条:+1 demote +1 bad_entry,diff 实证只动这 2 key)、 assets/databases/reading_vocab.db(整包重导出,合并 track-① + track-②)。
  • 不改 assets/nlp/surface_to_base.json / base_forms.json(红线 #5e SHA 不变); app_database.dart 版本(22→23)由 track-① 改,本轮不动。
  • 与 track-① 改动(bin/rescan_always_idiomaticity_v23.dart 等)合并进同一个 v23 commit

5. RB 行动项(合并 v23)

  1. /vocab-reseed:整包覆盖 src-tauri/assets/reading_vocab.db,用 新 SHA 747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913 校验完整性 (不是 doc 15 §11.0/§11.6 的 81f4a06d…——那是 track-① 中间态,已被本合并值取代)+ bump VOCABULARY_SEED_VERSION(建议 rvh-18898-v23-idiomaticity-retag-2-2026-06-25,注意词数 18898)。
  2. 1 个 prune 需删既存行all right reserve(归一 PK)从 v23 起不在预装库。RB reseed UPSERT 不自动删孤行 → 须沿 v18 phrase-asset-fix 的 prune 自愈机制删该残留行(同 docs/cross-end/09 「48 旧 PK 残留 prune」先例,本次仅 1 行)。 否则旧高亮 "All rights reserved" 仍误命中。
  3. 消费侧零代码改动——matcher substr(value,14) + content-script filter === 'always' 自 v21 就位;in a fix 移出 always 自动停高亮。
  4. 验证:冷重启 → 三档 always 2789 / context 3450 / literal 371、总词数 18898 → gate-A 复测 in a fix("in a fixed proportion")/ all rights reserved 不再误高亮 + track-① 的 3 个 surface 陷阱也清。两轨齐 → 评估 phrase_auto_highlight 默认 on。
  5. sync 脚本断言lemma_* 表行数不变(140370/101646)→ scripts/sync-rvh-vocabulary.sh 4 表白名单期望行数无需改。 vocabulary 总词数若有断言:18899→18898。短语属预装库、不进 Supabase 同步矩阵 → 同步矩阵不变。
  6. Supabase 缓冲池:零 PK 重算(仅 1 prune、0 rename、in a fix PK 不变)→ vocabulary 共享缓冲池无需 PK 核对all right reserve 即便曾被缓存,post-reseed 双端都无此 PK,benign(红线 #5b/#9 不触发)。

6. 关系图

gate-A 实测(28% FP,5 硬 FP)
  ├─ 3 surface 陷阱 → track-①(doc 15 §11,RVH rescan_v23,LLM demote)→ always 2791
  └─ 2 lemma 折叠  → track-②(本文,apply_track2_lemma_anchors_v23,确定性)→ −2 always + 1 prune
                                    ↓ 合并
                          v23 final:always 2789 / 总 18898 / SHA 747f4732

                          RB 一次 /vocab-reseed(按本文 §5)→ gate-A 复测两轨齐

7. 收口确认 —— 「fix lemmatizer over-folding bugs」分支结案:无资产改动,747f4732 为 final(2026-06-26)

本节回应 track-① 协调文件 temp/session-status-v23-phrase-idiomaticity-for-lemmatizer-session.md §3/§4 的关键分支:「你若 NOT 改任何短语归一输出 → overrides/缓存键不动,v23 成果原样有效」。

「lemmatizer over-folding 修复」任务经 RVH pipeline 端实测结案为「不需要也不应改 lemmatizer」(根因见 §0):

  • 零 lemmatizer 资产改动surface_to_base.json / base_forms.json SHA 不变(ca75b179… / 3094c829…); db 内 lemma_surface_to_base / lemma_base_forms 未动(140370 / 101646,仍与 RB byte-equal,红线 #5e 不触发)。
  • 5 个「过度折叠产物」override 键全部保持原样、不 re-keyfor the bird / spill the bean / anything go / in a fix / all right reserve)——它们是合法归一 PK(屈折→基形是正确 lemma 且被 Layer 3 后缀规则重导, 改资产无效或伤全局 vocab 召回)。故 generate_db 套 overrides = applied 0(无 missing),短语 overlay 不重 key。
  • 747f4732…3113913 即最终 SHA,不 supersede:本分支未 re-export DB。doc 15 §11 / 本文 §3/§5 的所有数字 (always 2789 / context 3450 / literal 371 / 词数 18898 / lemma 140370·101646 / prune 1=all right reserve,PK 不变)全部成立

给 RB 的统一结论(合并 v23,已由 RVH 032fc55 + RB 3ec731f 落地):

最终合并 SHA747f4732adab8ec9ecfe181e73316541949c5defdfb30789524828add3113913(无后续 supersede)
三档 / 词数always 2789 / context 3450 / literal 371;18898
lemma_* 表行数 / SHA140370 / 101646,byte-equal 不变 → RB reseed 无需连 lemma 表整包覆盖
prune 行清单all right reserve(归一 PK 不变,沿 v18 prune 自愈机制删 1 行)
supersede 了哪些数字——doc 15 §11 / doc 14 数字均为 final
RB 还需等后续 SHA 吗——lemmatizer 分支已结案,直接按 doc 15 §11 / 本文 §5 reseed