经理的问题成立:新批次或换业务键原本仍可新增相同来源/实体。已有requestId幂等只解决原请求重放。本升级在现有Skill增加workshop-dedup,并在workshop-import自动预检,服务端实际提交再次在事务锁内检查。
| 情况 | 行为 |
|---|---|
| 同一requestId、同一请求 | 原回执复用 |
| 不同批次、相同owner/模式/来源类型/URL/平台与内容SHA | sourceId复用,保留首次来源元数据 |
| 同源结构化资料完整字段相同 | objectId复用,operation=unchanged |
| 原始平台记录真实上游ID相同,完整载荷及业务内容相同 | 可跨来源批次复用;不覆盖已有人工判断 |
| 缺真实上游ID | 仅同源同索引同载荷复用,不将不同人的相同短评合并 |
| 同名但规格、正文、价格、观察时间或原始载荷变化 | 不自动合并;不同业务键保留独立快照,同键冲突停止核查 |
| 相似内容、不同来源URL、不同授权身份 | 不做语义合并/跨权限去重 |
| 历史已有重复 | 不自动删库,不修引用,不回填伪造身份 |
无sourceRef的基础分类等按完整字段比较;有sourceRef的普通实体限定同源。原始记录忽略批次runRef、recordIndex、collectedAt及服务端噪声状态,但原始载荷内变化仍保留。合同limits.maxReadScan超限明确失败,不把未查完说成无重复。暂未建立全库语义去重或任意并发写入防线:同表新版导入用数据库事务咨询锁串行,绕过这些函数的旧脚本/直接数据库写入不受保护。
重复资料实体可复用,新的采集执行、操作回执和导入日志仍保留。因此数据库会因新资料和审计增长,这种增长合理;不能承诺完全不增长。原件上传发生在来源登记之前,文件字节已经上传的审计/文件对象不在此升级删除范围。
这是新增需求的独立补丁。旧v4与集成ZIP原件保持不变,不在旧清单上改hash。补丁含升级后十文件Skill和自己的清单;插件/适配器/身份登记工具不改,r7和credential-binding.json不改。
如原安装任务已经开始,先报告已执行步骤和实际版本,切勿一边覆盖一边让王刚跑导入。可在首次真实业务导入前完成这份补丁;已完成身份安装无需重做登记。只有任务尚未开始时才按完整合并顺序一次实施。
K轮原任务不重放。在单独稳定的去重验收键下准备一份注明sample的原料资料;第一轮workshop-dedup→workshop-import保存实际sourceId/objectId,再使用同一原文/URL/结构化字段、不同requestId和externalKey重复导入。预期第二轮sourceOperation=unchanged、counts.created=0、counts.unchanged=1,sourceId/objectId相同。保存两层真实invocationId与回执。
保持业务键和记录数据一致只换requestId的测试仅证明原有幂等;本轮必须换externalKey证明新跨批查重。改规格/原文/价格的测试使用另一个明确版本键,不覆盖先前对象;原料名称相同不能单独视为重复。测试记录正常保留,不自动删除。
只读命令形状:
node /opt/data/skills/ksf-workshop-runtime/scripts/ksf-secure.mjs workshop-dedup --input /绝对路径/任务.json --request-id 本轮稳定查询键
任务JSON与workshop-import同source/records形状。复用、未命中、依赖待解析分别汇报,不把预检当完整校验或真正入库。公开页面验收及完整S1–S5要求仍适用。
测试覆盖跨requestId来源复用、URL/模式/owner隔离、跨业务键复用、原始上游ID跨批次、同短评不同人、数据变化保留、人工噪声判断保留、只读预检无写、扫描上限、服务未升级停、独立部署只读/回退/创建响应丢失,以及完整S1–S5回归。此文和交付不是远端安装证明;生产验收需运维与王刚实际回执。