技能|同批重复产物识别与逐份独立校验法
一、适用场景
同一轮任务产出两份(或多份)同类产物;定时自动化疑似被并发触发两次;
备份 / 导出 / 快照目录里出现时刻几乎相同的一对条目。
触发词:同日两份、重复产物、并发触发、多了两份、是不是重复执行了。
二、操作步骤
-
识别:产物名带时间戳且时刻相差秒级(如
20261024-100252与20261024-100256,相差 4 秒)
→ 高度疑似同批重复,而不是两次独立作业。先按「同批重复」假设处理,不要当成两次成功作业记两笔功劳。 -
逐份独立校验(本包第一铁律):对每一份都跑完整校验,
各自得出自己的结论(例:SHA256SUMS ALL OK+ 只读比表数/行数 → 各出一份 VERDICT)。
禁止验完一份就推断另一份也完整——那不是校验,是猜。 -
定性:两份都完整 → 定性为「互为冗余,无半成品风险」。
多一份完整产物在当前「同盘无盘损隔离」状态下甚至是正冗余,
不得因为「多了一份」就判定为异常、更不得顺手删。 -
不擅自删除:若删除不在本次任务边界内 → 只上报、不动手(越界 → 只上报不处置);
确需清理时也必须:用户确认 + 精确路径逐条 + 回收站。 -
记根因观察项:并发触发属待观察项,下次复查带「连续第 N 次」计数,N≥3 升级为待用户拍板项。
-
双落同步:当日日志 + 自动化记忆两处都记,且用同一套要素模板;
双落不等于双保险,落完各跑一遍体检器。 -
存量与保留策略:核对
backup.py list份数与BACKUP_KEEP,
临近上限时明确提示「下次将触发淘汰」。
三、注意边界
- 与
04-开发-每日定时备份自动化执行与判成败SOP分工:那个管单轮怎么判成败,
本包管同一轮出现多份怎么处置,不重复其四段判成败。 - 校验一律走快照副本 / 只读打开,不开线上库。
- 「冗余」不等于「故障」,也不等于「可以清理」——清理与否是用户的拍板项。
四、反例避雷
- ✗ 只验一份就说两份都完整:2026-10-24 是补验第二份之后才敢下「互为冗余」的结论。
- ✗ 顺手删掉「多出来那份」:既违反删除铁律,当时也不在本次任务边界内(只上报不处置)。
- ✗ 定性为自动化 bug 并自行改自动化配置:属越界处置,只能上报并给出可选方案。
- ✗ 忽略保留策略触顶:13 份 vs
BACKUP_KEEP=14,下次即触发淘汰,必须写进记录提示。 - ✗ 双落各写一半:当日日志写A漏B、自动化记忆写B漏A,两份单独体检各 FAIL,合并才 PASS。
五、代码锚点 / 实战战绩
锚点
- .workbuddy/memory/2026-10-24.md L8(两份同日快照相差 4 秒、已核实非半成品、未做任何删除)
- .workbuddy/memory/2026-10-24.md L11(补验第二份:SHA256SUMS ALL OK、98 表 / 5833 行(时点值,非稳定基线,见「基线口径订正」节)一致)
- .workbuddy/memory/2026-10-24.md L7(backup.py list 共 13 份,BACKUP_KEEP=14)
- 代码:程序源代码/backup.py(backup / list / _prune)、程序源代码/tools/backup_mirror.py
战绩
- 2026-10-24:20261024-100252 与 20261024-100256 两份快照各自 SHA256SUMS ALL OK、
只读开库均为 98 表 / 5833 行(时点值,非稳定基线,见「基线口径订正」节)与线上库一致,两份 VERDICT 均 PASS → 定性互为冗余。
- 全程未删任何文件、未改动业务数据、未重启服务;风险项(异地目录不存在,连续第 9 次)照旧上报。
基线口径订正(2026-10-25)
撤回说明:本包此前把「98 表 / 5833 行」当作稳定校验基线使用。2026-10-25 第 14 次定时快照
实测总行数 5770(−63),该数值基线已被证伪。总行数属数值基线,随时点漂移(易变表自然增减),
不可与历史数字硬比。
订正过程
1. 快照 20261025-093828:SHA256 3ff60ab5ba3b… ALL OK,只读开库比对 98 表 / 5770 行,与线上库一致。
2. 与上一份快照做表级 diff → 差异全部落在易变表:sessions 67→2(-65)、page_cache 8→4(-4)、
audit_log +3、ledger_hl +1、hl_archive_index +1、settings +1。
3. 业务台账表只增不减 → 定性「非数据丢失」,VERDICT PASS。
正确口径(取代本包旧表述)
- 表数属结构基线,可硬比(基准 98);行数属数值基线,不可硬比。
- 行数校验一律做「与上一份快照的表级 diff」,易变表 sessions / page_cache / audit_log / settings
及归档类(*_archive_index)豁免。
- SHA256 ALL OK 只证明文件完整,不证明内容没少,之后仍须走表级 diff。
影响面(四类穷举)
- 代码/配置:无改动(校验脚本 tools/_verify_snapshot_tmp.py 本就输出表级 diff,是判读口径错了)。
- 文档手册:本包正文与正例中所有「5833 行」已标注为「时点值,非稳定基线」。
- 技能包:同批订正 04-开发-数据库快照在线备份与校验SOP、04-开发-每日定时备份自动化执行与判成败SOP、
04-开发-同批重复产物识别与逐份独立校验法、06-成品-跨机数据迁移先校验后写入SOP 四包。
- 记忆与自动化:MEMORY.md 八已改口径;每日备份自动化记录按新口径书写。
权威出处:05-测试-历史基线数值失效与表级差分校验法(本批新建,口径的单一出处)。
六、关联笔记
- [[技能|每日定时备份自动化执行与判成败SOP]](单轮判成败,与本包互补)
- [[技能|数据库快照在线备份与校验SOP]](单次作业层)
- [[技能|越界风险只上报不处置与连续确认升级法]](不擅自删除 + 连续计数升级)
- [[技能|同构定时自动化族编排与双重保障SOP]](并发触发的根因侧)
- [[技能|沙箱环境写文件限制规避法]](只读开快照副本)
七、版本记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0 | 2026-10-25 | 首发:秒级时刻识别 + 逐份独立校验 + 冗余定性 + 不擅删 + 连续计数;附 scripts/dup_artifact_check.py 只读体检器 |
- (2026-10-25 订正)撤回「5833 行」稳定基线表述,改以表级 diff + 易变表豁免为准;
订正过程与影响面见「基线口径订正(2026-10-25)」节。