feat(review): 医生核对包入口;CEUS 运行目录的读取收进 runs

- 新模块 review(组织层,只依赖 library、answers、runs):把一次构建和它装入的
  CEUS 运行整理成医生可读的文件夹(CSV 带 BOM、说明与报告转 PDF、图片视频逐字节拷贝),
  入口 scripts/review_pack.py + config/review_pack.yaml。任务书 03。
- 读 CEUS 运行目录(failed.csv、结果目录、关键帧文件)从 build 挪进 runs,build 与
  review 都经它读;failed.csv 读取在边界上收严(步号须为整数、视频号不重复、列数固定)。
- library、answers 补只读函数;import-linter 增 review 契约。
- 文档:guides/医生核对包.md(过一轮硕士生阅读),结构.md 第三至八部分同步。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 06:04:19 -04:00
parent 14d6f8e153
commit c7373efde2
23 changed files with 1718 additions and 83 deletions
+20
View File
@@ -29,6 +29,7 @@ from cadx.answers import read_aliases
from cadx.build import run_build
from cadx.ceus import ANCHOR_SLOTS
from cadx.library import list_aliases, read_ultrasound
from cadx.review import run_review_pack
from conftest import CEUS_YAML
from fake_ceus_video import HEIGHT, LESION, SPLIT, WIDTH, write_video
from fake_delivery import REPO_ROOT, make_delivery, write_config
@@ -243,6 +244,25 @@ def test_build_reads_real_run_layout(
assert route.tic["keyframes"]["F1"]["video_time_s"] == pytest.approx(15.0, abs=0.1)
assert route.tic["keyframes"]["F2"]["located"] is False
# 医生核对包也读这个真实布局:TIC 曲线图和回放视频按字节拷进病例目录。
pack_config = tmp_path / "review_pack.yaml"
pack_config.write_text(
yaml.safe_dump(
{
"library_dir": str(result.library_dir),
"answers_dir": str(result.answers_dir),
"output_root": str(tmp_path / "review_pack"),
}
),
encoding="utf-8",
)
pack = run_review_pack(pack_config, REPO_ROOT, datetime(2026, 10, 17, 12, 0, 0).astimezone())
case_dir = pack.pack_dir / "病例" / "P001"
assert (case_dir / "TIC曲线.png").read_bytes() == (run_dir / "U001" / "tic.png").read_bytes()
assert (case_dir / "回放视频.mp4").read_bytes() == (
run_dir / "U001" / "overlay.mp4"
).read_bytes()
def test_unreadable_video_fails_at_step_1_and_next_case_runs(
tmp_path: Path,