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
+13 -22
View File
@@ -11,24 +11,16 @@ from pathlib import Path
from wov_sdk.models import InvokeRequest, InvokeResponse
# ---------------------------------------------------------------------------
# 统一 ASS 样式常量(单一事实来源)
# ---------------------------------------------------------------------------
# 说明:新生成字幕(write_ass/invoke)与"历史字幕统一脚本"
# scripts/unify_ass_style.py)共用下面这套样式定义——要调整字幕样式
# (位置/透明度/描边等)只改这里,两条输出路径保持一致,不会各自漂移。
#
# 2026-09 调整:默认顶部安全边距 DEFAULT_MARGIN_TOP 由 120 改为 700。
# 旧值 120 顶部对齐时字幕贴近画面最顶端,VR 头盔里需抬头才看得到;
# 700 为实测合适值,字幕落在更接近视线自然平视的高度。
# 统一 ASS 样式常量(单一事实来源):新生成字幕(write_ass/invoke)与历史
# 字幕统一脚本(scripts/unify_ass_style.py)共用,调整样式只改这里,两条输出
# 路径不会各自漂移。
DEFAULT_MARGIN_TOP = 700
# 左右眼样式行字段(列顺序与 ASS Style Format 一一对应):
# - PrimaryColour &HB3FFFFFF:约 70% 透明文字填充,弱化对画面的遮挡;
# - OutlineColour &H80000000:半透明黑描边(取代早期实心纯黑),保留可读性
# 又不产生生硬黑框;
# - Alignment 8\an8 顶部居中):配合 MarginV 形成顶部安全区——避开画面
# 中央人脸高发区,同时落在视线自然高度。
# - PrimaryColour &HB3FFFFFF:约 70% 透明文字填充,降低对画面的遮挡;
# - OutlineColour &H80000000:半透明黑描边,兼顾可读性与不产生生硬黑框;
# - Alignment 8\an8 顶部居中):配合 MarginV 形成顶部安全区,避开画面中央
# 人脸区,并落在视线自然高度。
_ASS_FONT = "Arial"
_ASS_FONT_SIZE = 50
_ASS_PRIMARY = "&HB3FFFFFF"
@@ -56,9 +48,9 @@ ASS_EVENT_FORMAT = "Format: Layer,Start,End,Style,Name,MarginL,MarginR,MarginV,E
def style_row(eye: str, width: int, margin_top: int = DEFAULT_MARGIN_TOP) -> str:
"""生成单眼(LeftEye/RightEye)的完整 ASS 样式行。
左眼占左半幅(左缘留 _EYE_PAD 内边距、向中线收 50%),右眼占右半幅
两眼水平相对位置一致 → 零视差A-1):字幕渲染在屏幕平面,不产生
额外景深冲突。margin_top 即该眼样式的 MarginV(距画面上缘的安全边距)。"""
左眼占左半幅(左缘留 _EYE_PAD 内边距、向中线收 50%),右眼占右半幅
两眼水平相对位置一致 → 零视差,字幕落在屏幕平面,不引入额外景深冲突。
margin_top 即该眼样式的 MarginV(距画面上缘的安全边距)。"""
mid = width // 2
margin_l, margin_r = (_EYE_PAD, mid) if eye == "LeftEye" else (mid, _EYE_PAD)
return (
@@ -149,8 +141,8 @@ def write_ass(
) -> None:
"""把解析后的条目写入 ASS 文件,每个条目输出左右眼两行 Dialogue。
margin_top 控制字幕距画面顶部的安全边距(默认 7002026-09 起),顶部对齐(\an8
使字幕整体落在顶部安全区下方。左右眼使用相同文本与水平相对位置(零视差A-1)。"""
margin_top 字幕距画面顶部的安全边距,配合顶部对齐(\an8让字幕落在
顶部安全区。左右眼使用相同文本与水平相对位置(零视差)。"""
width, height = (int(part) for part in resolution.lower().split("x", 1))
header = ass_header(width, height, margin_top=margin_top)
# an8 对齐到屏幕顶部,配合 MarginV 形成顶部安全区,避开中央人脸区域。
@@ -176,8 +168,7 @@ def invoke(request: InvokeRequest) -> InvokeResponse:
output_path = output_dir / "dual_eye.ass"
# 分辨率默认 3840x1920,覆盖常见 VR 视频尺寸。
resolution = str(request.params.get("resolution", "3840x1920"))
# margin_top 可选:顶部安全边距(默认 700,2026-09 起),不同分辨率/内容
# 仍可用工作流参数微调(历史 120 已过时,勿再使用)。
# margin_top 可选:不同分辨率/内容可用工作流参数微调顶部安全边距。
margin_top = int(request.params.get("margin_top", 700))
write_ass(entries, output_path, resolution, margin_top=margin_top)
return InvokeResponse(status="completed", outputs={"ass_uri": str(output_path)})