refactor(tree): subtitle 迁入 L3Card/L2Card + 建树管线修正
- L3Card/L2Card 新增 subtitle: str 字段(L1Card 不加) - L3Node 移除 subtitle 字段(数据迁入 Card) - assign_subtitles_voronoi 改写 Card.subtitle + L2 聚合 - _collect_card_strings 增加 skip_fields 排除 subtitle - _node_full_text/_node_anchored_text 保持 字幕:/[sN] 语义 - get_subtitle 读 Card.subtitle(L2/L3) - verify.py/synthesizer.py: l3.subtitle → l3.card.subtitle - 迁移脚本 tools/migrate_subtitle_to_card.py(幂等,300 棵树已迁移) - 9→6 个测试文件适配(3 个无需改动) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -196,7 +196,7 @@ def _sample_l3(
|
||||
# Phase 3: 构造上下文(frame_path 已在候选过滤中保证非 None)
|
||||
card_text = _serialize_l3_card(chosen_l3, spec.context_fields)
|
||||
frame_paths = [chosen_l3.frame_path] # type: ignore[list-item]
|
||||
subtitle = chosen_l3.subtitle or ""
|
||||
subtitle = chosen_l3.card.subtitle or ""
|
||||
|
||||
# Phase 4: 干扰项——整棵树中其他 L3 的 frame_summary
|
||||
distractor_texts = [
|
||||
@@ -281,10 +281,10 @@ def _sample_l2(
|
||||
if is_temporal_perception:
|
||||
card_text += f"\n{_l2_time_range_str(chosen_l2)}"
|
||||
|
||||
# Phase 5: 字幕(L2 无自身字幕,取首个子 L3 字幕)
|
||||
subtitle = ""
|
||||
if chosen_l2.children and chosen_l2.children[0].subtitle:
|
||||
subtitle = chosen_l2.children[0].subtitle
|
||||
# Phase 5: 字幕(优先使用 L2 自身字幕,否则取首个子 L3 字幕)
|
||||
subtitle = chosen_l2.card.subtitle or ""
|
||||
if not subtitle and chosen_l2.children and chosen_l2.children[0].card.subtitle:
|
||||
subtitle = chosen_l2.children[0].card.subtitle
|
||||
|
||||
# Phase 6: 干扰项——整棵树中其他 L2 的 event_description
|
||||
distractor_texts = [
|
||||
|
||||
Reference in New Issue
Block a user