Add per-paper summary verification and cap safeguards

- Per-paper summary batches are fact-checked against abstracts (verify ->
  revise once on major issues -> re-verify), controlled by SEBRIEF_VERIFY_ENABLED
- The paper cap never drops papers already published in this week's digest
  (--force re-runs could otherwise erase them from every digest)
- SEBRIEF_MAX_PAPERS default 40 -> 60 (observed weekly volume ~47)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jsahn
2026-09-02 17:21:41 +09:00
co-authored by Claude Fable 5
parent c0b140d27f
commit d9dda79282
13 changed files with 249 additions and 23 deletions
+22
View File
@@ -77,9 +77,31 @@ def test_build_payload_caps_papers_and_notes_rollover(env):
env["settings"] = env["settings"].model_copy(update={"max_papers": 3})
payload = build_payload(WEEK, env["settings"], env["store"])
assert len(payload.papers) == 3
assert [p.doi for p in payload.papers] == ["10.1/p0", "10.1/p1", "10.1/p2"]
assert any("이월" in g for g in payload.data_gaps)
def test_cap_never_drops_papers_already_in_this_weeks_digest(env):
# --force re-run: p3/p4 were published in this week's digest; the cap must drop rollover
# candidates (p0..p2) instead, even though they sort first.
env["store"].pending = [make_paper(f"10.1/p{i}") for i in range(5)]
env["store"].published_dois = {"10.1/p3", "10.1/p4"}
env["settings"] = env["settings"].model_copy(update={"max_papers": 3})
payload = build_payload(WEEK, env["settings"], env["store"])
dois = [p.doi for p in payload.papers]
assert "10.1/p3" in dois and "10.1/p4" in dois
assert len(dois) == 3 and dois == ["10.1/p0", "10.1/p3", "10.1/p4"]
def test_cap_keeps_all_published_even_beyond_max(env):
env["store"].pending = [make_paper(f"10.1/p{i}") for i in range(4)]
env["store"].published_dois = {f"10.1/p{i}" for i in range(4)}
env["settings"] = env["settings"].model_copy(update={"max_papers": 2})
payload = build_payload(WEEK, env["settings"], env["store"])
assert len(payload.papers) == 4 # a published paper is never dropped
assert not any("이월" in g for g in payload.data_gaps)
# -------------------------------------------------------------------------------- run_digest
def test_run_digest_happy_path_saves_marks_and_delivers(env):
result = run_digest(WEEK, env["settings"])