docs: 注释规范要求精简可读,并清理生产代码中的历史叙事

AGENTS.md 的注释规范新增三节可执行约束:

- 只写代码真实逻辑:注释只回答"做什么"与"为什么必须这么做",禁止写决策/
  修改时间、历史版本对比、实测数据与实验结论、事故与缺陷编号(run_xxxx /
  batch_xxxx / R01 等)——这些属 docs/decisions.md 与审查跟踪文件;当前生效
  的约束可以写,但不附带它何时因何变成这样。
- 精简可读:单段连续注释不超过 3 行;docstring 一句话概括职责,不重复函数名
  已表达的信息;不写逐行翻译代码的废话注释,只在非显然处(业务规则、边界、
  易错点、外部约束)加注。
- 覆盖范围:测试注释只说明验证什么行为,回归用例可保留一句溯源;并明确
  参数说明应写在**参数读取处**附近,而不是把多个参数的解释堆在离使用位置
  很远的注释块里。

按此清理生产代码(注释净减 70 行,18 个文件),典型处理:

- nodes/whisper.py:删掉堆在一起、含"用户 2026-08 决定 / 实测 savr-1054"
  等叙事的参数块,把各参数说明移到各自的读取处与 model.transcribe 调用处;
- nodes/llm_filter.py、nodes/subtitle_cleanup.py:模块 docstring 去掉英文
  背景叙事与条数统计,保留"默认只跑规则层""整条删除而非 '-' 占位"等当前
  行为;
- src/wov_app/{batch,db,scheduler}.py 与 routers:去掉 batch_xxx/run_xxx 事故
  编号与"修复前……"对比,改为一句"否则会出现什么问题";
- nodes/ass.py、frame_extract.py:去掉废弃值对比与日期,保留判据本身。

安全验证:用 AST 对比(剥离 docstring 后比较语法树)确认 18 个文件**零逻辑
变更**;`nodes/proper_nouns.py` 的规则表 reason 字段会注入 LLM 提示词,属于
数据而非注释,已恢复原值。全量测试 476 passed。
This commit is contained in:
2026-09-13 16:37:49 +08:00
parent 8f6083f8cf
commit 7a7212f70c
18 changed files with 192 additions and 262 deletions
+9 -16
View File
@@ -1,20 +1,13 @@
"""LLM 翻译节点。
"""LLM 翻译节点:SRT → 纯文本分批翻译 → 回填时间轴
单体版中作为进程内节点模块,由调度器直接调用。接收 SRT,提取纯文本行
分批调用 LLM,再把译文回填到原 SRT 结构并输出 cn.srt。
关键修复(见 tests/test_translation_line_alignment.py):
1. **提示词强化**:要求"逐行独立翻译 + 碎片句按语境独立成行 + 禁止合并/拆分"
从源头减少 LLM 因语义碎片而重排断句、导致行数不一致。
2. **ID 对齐(审查 R05)**:历史按行数合并/补空不能定位中间缺失,曾造成
run_51242078d76e 译文贴错时间。改为 JSON id/text 条目逐项校验,缺失、
重复、未知 ID 或坏结构重试整批,耗尽即失败;时间戳留在本地按 cue 回填。
3. **system_prompt 拼接 bug**:圆括号内一旦出现 f-string 赋值(表达式),
隐式字符串拼接失效,整体变成 tuple;json 序列化后发出去的 content 是数组,
API 返回 400 invalid parameter。必须用 + 显式拼接为单个字符串。
要点:
- **ID 对齐**:以 JSON `{id, text}` 条目请求翻译,逐项校验 ID 集合、类型与
正文;乱序按 ID 回填,缺失/重复/坏结构重试整批。时间戳不进入模型,只在
本地按 cue 回填,避免模型重排断句时译文贴错时间轴。
- **提示词**:要求逐行独立翻译、碎片句按语境独立成行、禁止合并或拆分。
- **严格错误处理**:结构重试耗尽立即失败,不用补空或合并掩盖对应关系丢失。
- 拼接 system_prompt 时用 `+` 显式连成单个字符串:括号内的隐式字符串拼接
遇到 f-string 表达式会失效,生成 tuple 后序列化成数组,API 会返回 400。
"""
from __future__ import annotations