# Changelog ## 0.8.1 — 2026-11-04 ### 改进 - 「抖音侵权举报」预设改为按输入分流:给达人名称/店铺名/“找侵权链接”时先走 `find-douyin-ip-links` 找人,给抖音分享链接时走举报流程;两者可以先后进行,但发现本身不构成举报授权。 - 预设描述同步改为「给达人名称或抖音链接,找侵权线索并准备专利/商标/原创举报」。 - 预设指令补充两条硬边界:只能基于实际画面声称出现商标;只有封面或标题相同不能判定搬运。 ## 0.8.0 — 2026-11-04 ### 新增 - 新增达人线索发现技能 `find-douyin-ip-links`:按达人名称在抖音电商罗盘检索、逐条核对实际画面、区分商标与原创线索,产出 `discovery.json`、`trademark-targets.txt`、`original-targets.txt`、`originals.json` 交接给举报流程。 - 新增素材族聚类工具 `skills/find-douyin-ip-links/scripts/families.py`(纯标准库,无第三方依赖): - 按「时长容差 + 帧哈希汉明距离或标题相似度」把同一段素材的重复投稿折叠成素材族,每族只需实际核对 1 条; - 命中已知排除族输出 `skip`、命中已确认候选族输出 `inherit_candidate`、其余 `review`; - `learn` 把一次人工结论沉淀进本地素材族库(`known-negative.json` / `family-fingerprints.json`),跨批次复用; - 内置 `selftest`,对并族、拒绝误并、库命中等行为做断言。 - 新增 `scripts/framehash.py`(可选,需要 Pillow):把已有封面/截图转成 64 位 dHash,供聚类使用;缩放+重压缩后哈希通常只差 1–2 位,可作为同素材判据。 - 新增 `references/clustering.md`:说明信号采集、哈希生成、聚类动作语义与素材族库维护。 - `references/handoff.md` 的记录结构新增 `title`、`duration_seconds`、`frame_hash` 三个字段,避免在整理阶段丢掉聚类与去重所需信号。 ### 安全边界 - 只有时长重合、既无帧哈希也无标题佐证的族**不会**自动跳过,只标为「可能同族」并要求实核,防止把"没采到信号"误判成"已排除"。 - 时长未知且无标题的条目不会互相并族,避免堆成巨族后静默跳过。 - 素材族库属于本地私有数据,不随插件分发;`.gitignore` 已覆盖运行期私有目录。 ### 验证 - `python3 scripts/families.py selftest` 通过。 - 用一批 87 条真实已核视频(同一店铺、近30天)验证:聚成 11 个素材族,其中最大一族 63 条(72%)确为同一段约 54 秒素材的重复投稿;反例测试中同长度但哈希与标题均不同的视频不会被并入该族。 - 未在插件 UI 中暴露聚类功能,仅作为技能脚本使用。 ## 0.7.1 — 2026-10-31 ### 修复 - 原创「举报」入口定位:视频播放器在 `domcontentloaded` 之后异步渲染,原逻辑立即求值会把渲染空窗当成定位失败并整批中止(`UI_UNCALIBRATED`)。改为有界等待(最多 25 s,每 500 ms 用同一套规则重试),仍要求恰好 1 个可见 `video` 且举报控件唯一,超时照旧拒绝执行,不放松「只举报视频、不举报用户」的边界。 - 举报原因勾选:真实页面上「搬运、抄袭作品」的可点区域是单选圈而不是标签文字,点文字不会勾选,导致「被抄袭的原创作品链接」字段始终不渲染、提交按钮保持禁用。改为点单选圈并回读该字段确实出现,失败再降级点击底层 `input[type=radio]`,仍失败则 `FORM_UNVERIFIED` 停止。 - 回执识别:原先只认精确的 toast 文案(`举报成功` 等),提交后一律记为 `unknown`,无法区分成功与重复。新增监听 `/aweme/v1/report/submit/` 响应:`status_code 0` = 成功、`2159` = 该账号已举报过(拒绝重复提交)、其他 = 结果不明;文字兜底补充「您已举报过该内容」。结果不明仍不自动重试。 ### 验证(2026-10-30,DeepSeek Harness / macOS) - 真实页面首次完成原创举报提交:26 条分享链接 → 24 条可打开 → 23 个唯一视频全部点击提交;抽样 7 条提交接口返回 `2159`「您已举报过该内容」,确认本次提交已入库。另 2 条链接在平台上不可见(跳回精选页、无播放器),记为未提交,不计成功。 - 仍未验证:审核结果(平台未给出处理结论)、Windows 端真实提交、以及 `status_code 0`(首次成功)路径的端到端表现——本批视频均已存在举报记录,只能复现重复提交分支。 ## 0.7.0 — 2026-10-30 ### 新增 - 新增 `original` /「原创」举报类型:在用户本次明确指定的目标视频中进入「举报」→「搬运、抄袭作品」,填写独立原创作品 URL;不复用专利/商标 qinquan 表单。 - 新增原创任务准备器与执行器:`--original-link` 为明确限定的本批目标共享原创依据,或以 `--originals-file` JSON 提供逐项目标→原创映射。映射必须覆盖且仅覆盖本次目标;拒绝缺失、额外、重复或冲突映射及目标自引,不隐式使用旧演示链接或历史原创。 - 解析目标与原创的抖音视频链接,按浏览器解析后的目标视频 ID 去重;解析出的目标与原创相同或同一目标对应冲突原创时停止,不猜测关联。 - 原创独立使用 `original-browser-profile`;正常执行无头,不使用操作系统鼠标、键盘或剪贴板,不自动降级为有头模式。只有用户明确要求登录时才打开独立扫码窗口,登录本身不授权举报。 - 原创任务、共享目标账本和 profile 锁用于防重复与并发冲突;点击前持久化提交中状态。明确成功、明确拒绝和结果不明分开记录;结果不明、点击超时或已有成功记录不自动重投。只有同一任务明确拒绝且有授权时才允许 `--retry-failed --submit`;更换任务/状态路径不能绕过去重。 - 区分本次新增提交与历史已提交:重复运行不将历史成功重新计为本次提交。 - `status --kind original [--job <任务>]` 只读查询原创本地状态,并明确 `platform_receipt_verified: false`;专利/商标保留既有 qinquan 历史与回执查询。qinquan 的 `original_status` 是原举报记录字段,不是原创作品举报回执。 - 侧栏保留原创类型,展示原创相关状态;摘要不暴露目标、原创 URL、材料或身份。新增中英文插件显示元数据与原创 SVG 图标。 - 新增原创执行器、摘要、Python 入口路由/关联测试及拦截请求的 Chrome 合成页面 fixture。默认 `npm test` 保留原有 client/host smoke,并执行新增 Node 测试。 ### 授权与兼容 - 仅处理用户本次提供的目标与类型,原创必须有用户确认的目标→原创对应关系;不发现目标、不认定侵权。 - `prepare` 永不提交;`run` 默认只准备检查。最终提交仍需本批授权与侧栏确认设置,只有满足条件才使用 `--submit`;读取设置失败按需要确认处理,agent 不得自行关闭确认。 - 原创无需专利/商标材料与组织身份;专利/商标保留原有证明材料、身份、专用 profile、执行器与回执路径。 - 保留上游 smoke 测试和 MIT License;不随包分发配置、身份、登录 profile、任务状态、日志或私人投诉材料。 ### 验证边界 - **原创真实抖音页面的完整准备/提交流程尚未验证。** v0.7.0 原创验证限于离线单元测试、mock 与全页面请求拦截的合成浏览器 fixture;不保证当前真实页面选择器可用,不宣称实际举报已受理、审核通过或具备真实原创平台回执查询能力。 - 既有专利/商标真实页面校准不能外推为原创验证。页面变化、定位不唯一、字段回读失败、登录失效或额外风控时必须停止,不猜着提交,不回退系统输入。 - 本地 `prepared` 不等于平台接收;`uncertain` / `submitted_unknown` 或结果不明不能自动重试。历史任务状态不能代替当前平台通知或逐条处理结果。 - 发布集成与回归只允许离线测试,不访问真实抖音或实际提交。开发命令与离线测试方法见 [README](README.md#开发与-v070-离线测试)。