feat: add scientific subtitle review workflow

This commit is contained in:
2026-08-25 14:22:30 +08:00
parent 555ed525f6
commit fb5a4017f6
11 changed files with 1054 additions and 14 deletions
@@ -217,6 +217,80 @@ class VerifyDeliveryTests(unittest.TestCase):
self.assertTrue(result["complete"])
self.assertEqual(result["burned_video"], str(expected.resolve()))
def test_scientific_review_gate_is_required_and_checksum_bound(self) -> None:
inputs = self.root / "subtitles" / "translation-input"
inputs.mkdir(parents=True)
batch = inputs / "batch-0001.json"
batch.write_text("{}", encoding="utf-8")
outputs = self.root / "subtitles" / "translation-output"
outputs.mkdir()
(outputs / "batch-0001.json").write_text("{}", encoding="utf-8")
subtitle_manifest = self.root / "subtitles" / "subtitle-manifest.json"
subtitle_manifest.write_text(
json.dumps(
{
"translation_batches": [{"path": str(batch)}],
"translation_output_dir": str(outputs),
}
),
encoding="utf-8",
)
self.manifest.write_text(
json.dumps(
{
"deliverable": "bilingual-subs",
"output_directory": str(self.root),
"execution": {"scientific_review_required": True},
"artifacts": {
"intermediate": None,
"subtitle": {"source_srt": {"path": self.subtitle.name}},
},
}
),
encoding="utf-8",
)
pending = delivery.assess_delivery(self.manifest)
self.assertEqual(pending["stage"], "scientific_review_required")
review_dir = self.root / "subtitles" / "scientific-review"
reviewed = review_dir / "reviewed-translations"
reviewed.mkdir(parents=True)
(reviewed / "translations.json").write_text("{}", encoding="utf-8")
report = review_dir / "report.json"
report.write_text(
json.dumps(
{
"status": "complete",
"human_expert_reviewed": False,
"subtitle_manifest_sha256": hashlib.sha256(
subtitle_manifest.read_bytes()
).hexdigest(),
}
),
encoding="utf-8",
)
rendered = self.root / "subtitles" / "rendered"
rendered.mkdir()
(rendered / "bilingual.ass").write_text("[Script Info]\n", encoding="utf-8")
(rendered / "validation.json").write_text(
json.dumps(
{
"translation_quality_reviewed": True,
"scientific_review": {
"report_sha256": hashlib.sha256(report.read_bytes()).hexdigest()
},
}
),
encoding="utf-8",
)
result = delivery.assess_delivery(self.manifest)
self.assertTrue(result["complete"])
report.write_text("{}", encoding="utf-8")
with self.assertRaisesRegex(delivery.DeliveryError, "incomplete"):
delivery.assess_delivery(self.manifest)
def test_declared_citation_requires_matching_burn_receipt(self) -> None:
inputs = self.root / "subtitles" / "translation-input"
inputs.mkdir(parents=True)