ba852f3dc2
2026-10-29T19:16Z 真实现场:作业只写完 database 阶段(resources/index/wiki/verify 仍 pending),worker 被杀、人工拉起后被判 succeeded,阶段写"已登记生效版本(仅收尾, 未重写生产)",并把生效版本归属改写成这个作业。 根因:classifyTakeover 只看"当前生效版本的目标快照是不是我的目标快照"。版本行主键 由 (kind, scope, 快照) 决定(LibraryVersionID),登记是 ON CONFLICT (id) DO UPDATE、 会改写 source_job_id —— 快照相等这一维里没有作业身份。 改法:effectiveOwnedBy(version, jobID, snapshotID) 一份实现,接管与基线共用; 归属别的作业 ⇒ 新的 takeoverForeignEffective,走 failLibraryTakeover:不写目标、 不释放维护、终态失败并指明预备份(目标可能半写,释放等于谎称已恢复)。 本作业自己的 finalize 阶段成功仍是独立证据,不被归属改写推翻。 验证(已跑): - go test ./cmd/worker -run TestClassifyTakeover → PASS(含 4 条新用例) - 负例:撤掉身份判定后同两条用例红(classify="pending_final", want "foreign_effective") - 真实 PG(一次性库 kg_takeover_foreign_test): TestTakeoverRefusesSameSnapshotRegisteredByAnotherJob PASS(1.41s), 负例同一用例红(library_takeover_integration_test.go:53) - 同一库 TestTakeoverClassificationUsesExactCurrentVersionBeyondHistoryWindow PASS - make verify:overall success(15 项必需全绿)