package memory import "errors" // 本文件是记忆整理应用路径的**结果收敛**:把一条结果计入回执、把事务结果收敛成 // 一条跳过/失败/已应用的结果。它从 tidy_apply.go 拆出来只为守 AGENTS §10 的 // 文件行数上限(≤500 行),判据与注释**逐字未动**。 // tallyTidyApply 把一条结果计入批量回执的计数器。 func tallyTidyApply(batch *TidyApplyBatch, res TidyApplyResult) { switch res.Status { case TidyApplyApplied: batch.Applied++ switch res.Action { case TidyMerge: batch.Merged++ case TidyArchive: batch.Archived++ case TidyReclassify: batch.Reclassified++ case TidyDedupeGroup: batch.Deduped++ } case TidyApplyFailed: batch.Failed++ default: batch.Skipped++ } } // skipTidyApply 造一条 skipped 结果。 func skipTidyApply(base TidyApplyResult, reason string) TidyApplyResult { base.Status = TidyApplySkipped base.Reason = reason if base.AffectedIDs == nil { base.AffectedIDs = []string{} } return base } // tidyFailed 造一条 failed 结果(错误只进 Error 字段,调用方决定记不记日志)。 func tidyFailed(base TidyApplyResult, err error) TidyApplyResult { base.Status = TidyApplyFailed base.Reason = "apply_failed" base.Error = err.Error() if base.AffectedIDs == nil { base.AffectedIDs = []string{} } return base } // finishTidyApply 把事务结果收敛成一条结果:nil ⇒ applied;幂等哨兵 ⇒ skipped; // 目标行不在册 ⇒ skipped(原因由 notActiveReason 给);其余 ⇒ failed。 // // affected 是**成功时才会挂上去**的受影响行 id:跳过的结果绝不能声称改过哪一行 // (那是把「没做」说成「做了」)。 func finishTidyApply(base TidyApplyResult, affected []string, err error, notActiveReason string) (TidyApplyResult, error) { switch { case err == nil: base.Status = TidyApplyApplied base.AffectedIDs = affected return base, nil case errors.Is(err, errTidyCandidateDecided): return skipTidyApply(base, tidySkipAlreadyDecided), nil case errors.Is(err, errTidyItemNotActive): return skipTidyApply(base, notActiveReason), nil default: return tidyFailed(base, err), nil } }