生产 v0.3.8~v0.3.13 均由 8013196 加工作区修改构建部署,此前未提交;本提交补齐源码,
并含未部署的 v0.3.14 原地入库。中间各版本源码状态未保存,无法逐版拆分,详见
docs/plan/17-full-upgrade.md 与 docs/plan/18-organize-release.md。
- v0.3.8 全面升级:Deno workspace 依赖、Router 8 / Vite 8、camofox 1.18.0 / Node 24、
PostgreSQL 18.6、备份客户端 18.6、演示 qB 5.2.4
- v0.3.9 媒体整理:分类规则、整理来源与目录快照(0059)、文件管理整理入口
- v0.3.10 手动下载与入库:独立手动下载、详情页资源下载、TMDB / Local 元数据兜底
(metadata.resolve_organize)、正常多版本 / 一次性洗版(0060)
- v0.3.11 搜索详情与桌面黑边修复
- v0.3.12 列表分页、搜索历史、首页概况
- v0.3.13 统一整理弹窗与队列
- v0.3.14 原地入库(0061,未部署)
同批审计修复:
- 刮削入队:确认原记录存在后才删重放产生的新记录;写回 run 关联失败时保持 queued,
由处理器补关联(对齐 MP 先登记、只在入队失败时记失败)
- 识别升级链只在结果更确定时采用,不再用 no_match 顶替原有歧义候选
- bluray_dir 资产以原盘目录本身为刮削根(MP 同做法)
- metadata.resolve_organize 登记到入库排障 Skill 与能力地图
- db/src/types.ts 按迁移重新生成;contracts 整理动作枚举顺序与数据库对齐
- 测试:原地入库用例改为直接查记录表;domain 测试模板补 version
- 前端:通知铃铛弹层与用户菜单统一样式;站点卡片共用卡头、底栏贴底、分页间距
依赖升级证据只提交摘要文件,registry-snapshot.json 移至 .local/(SHA-256 记于文档)。
Co-Authored-By: Claude Opus 5.5 <[email protected]>
30 KiB
需求覆盖矩阵与后续计划
历史报告:本文核对的是 2026-09-28 的
57346d4,其中未做 / 待合并 / 真机验证状态与数字不代表当前版本。2026-10-01 的 v0.3.7 现状、R01–R32 复核及验证边界见 当前开发情况基线。
2026-09-28。对照 REQ v0.7(../../media_automation_requirements_architecture_v0.7.md)逐条核对 main HEAD 57346d4 的实现。证据来自代码 grep、测试文件与已有验收文档(04、07、08、10-v0.2.1-check.md),没有跑新的测试。
标记:
- 已做:代码与自动化测试都在,mock 环境下行为符合 REQ。
- 部分:只做了其中一段,缺口写在最后一列。
- 未做:没有对应实现。
- 待真实环境验证:代码完成,只在 mock(RSS / 站点 / TMDB / qB / Emby / camofox / fake 模型)下验证过,没有连过用户的真实服务。
所有"已做"都隐含一个前提:没有连过真实 PT 账号、qB、Emby、camofox 和真实模型上游。下文"待真实环境验证"只标那些核心价值就在真实交互上的条目。
进行中(不在 main,不计入本文统计):c2a 分支(工作区 /opt/uhd_media_tool-c2a)在做跨进程限流与缓存(PG 令牌桶、UNLOGGED 缓存表、TMDB 响应缓存、图片代理,见 00 §9 最后两条);检查子代理的 10-v0.2.1-check.md 尚未提交。
1. R01–R32 覆盖矩阵
统计:已做 18,部分 11,未做 0,待真实环境验证 3(R26、R30、R32)。"部分"里 R06、R24、R31 同时也需要真实环境验证。
| 编号 | 需求 | 状态 | 证据 | 缺口 |
|---|---|---|---|---|
| R01 | 多个 RSS 并存 | 已做 | feed_source / observation;ingest.test「三个 Feed 看到同一资源只建一条 source_release」「窗口零重叠 → feed.gap_suspected」;docs/runbook/sites.md |
没有并发 ingest 的测试(现有用例是顺序抓取) |
| R02 | 综艺正片齐全,附加内容可选 | 部分 | release-parser 输出 contentType(main / extra / performance_only…)与 segment(upper / lower / full);content_unit.content_type 列;订阅覆盖矩阵显示分段 |
没有"上 + 下 = 一期正片"的覆盖计算,没有节目级"附加内容全部收录"配置,完整性不按正片覆盖判定 |
| R03 | TMDB 滞后不阻断 | 已做 | 临时季 / 集单元(resolve.test「剧集:建 series 作品与临时季/集单元」);总集数账本 0025;e7-tv-series「总集数未知,Slot 不判满足」 |
一对多 / 多对一编号关系(unit_relation)没有建表 |
| R04 | 按规则收录双版本 | 部分 | 每作品多 Slot、Slot × 单元预留(e9-continuous-series);订阅"自动补全其他版本";require_distinct_asset 列与表单开关 |
checkDistinctAssets(domain/slot/completion.ts)没有接进服务端,同一文件仍可同时满足两个 Slot |
| R05 | 根据 PT 每日新增自动收录 | 已做 | 策略 newTitle 规则与 new_title 模式(rules-api.test「new_title:not_new_release」);新作品 / 追更 / 升级三种模式(domain/acquisition/mode.ts) |
没有"每日汇总"视图 |
| R06 | 部分 PT 需要浏览器 | 部分 | camofox BrowserProvider(packages/adapters/src/browser)、会话 / 租约、凭证服务端注入、验证码转待处理(browser-api.test、browser-e2e.test);docs/runbook/browser.md |
站点适配器 HTTP 失败后不会自动切到浏览器(REQ §4.4);只对 mock camofox 验证过 |
| R07 | 保持最终路径结构 | 已做 | path_binding_active_key;organize-move.test「路径绑定固定:译名变化后新集仍进旧目录」;命名模板对已有绑定只用于新目录(docs/design/naming-template.md 样例 24) |
— |
| R08 | 不绑定 TMDB 身份 | 已做 | 本地 UUID;external_identity (provider, entity_type, external_id) 部分唯一;合并保留 merged_into_id 跳转(resolve.test「合并重复作品」) |
— |
| R09 | 数据库存映射并定期校验 | 部分 | 资产对账 reconcileLibrary(哨兵 + 增量 stat,suspected → confirmed);元数据 6 小时刷新;vertical.test「资产对账」 |
没有 Identity Reconciler(外部对象存在性 / 类型核对)和 Server Reconciler(本地资产 ↔ Emby);备份恢复只有人工演练 |
| R10 | 必要时 Agent 辅助刮削 | 部分 | identity.resolve、catalog.lookup 能力;待识别事项自动调查(e5-auto-investigate);字段锁 |
没有字段级 metadata.apply 能力;NFO / 图片写入返回 not_implemented(file-manager/probe.ts) |
| R11 | 以 MP / MovieClaw 实现为基线迁移 | 已做 | docs/porting/(识别、刮削、转移、订阅、站点框架、Rust 逻辑差分、许可账本 license-and-provenance.md);scripts/mp-sync 差分脚本 |
MP 多文件 / 整季包 / 目标冲突的运行对照(REQ §14.1.1)只到源码层 |
| R12 | Pi Agent 作为推理内核 | 已做 | @earendil-works/[email protected],AgentRuntimePort,显式白名单(agent/test/runtime.test);ADR-003 |
— |
| R13 | 公开 API / MCP | 已做 | 195 个端点定义(packages/contracts/src/api.ts)+ OpenAPI;Streamable HTTP MCP(modules/mcp,test/mcp/mcp.test);27 个能力 |
— |
| R14 | qB 标签管理 | 已做 | 提交打管理标签、已有种子接管只补标签(vertical.test「already_exists」);e8-tag-removal 去标签 / 任务消失 |
— |
| R15 | Copy / Move 与缓存清理 | 已做 | verifyAndImport、跨卷 Copy→核验→删源、EXDEV 不降级、fsproxy 看门狗;vertical.test「缓存清理」「H&R 未满足时 Move 变冲突」 |
硬链接工作流、蓝光原盘整目录未做(REQ 本身不把硬链接作主流程) |
| R16 | 条件选片与 Agent 偏好选片 | 部分 | 确定性 evaluateAcquisition、规则组分级优先级与逐级 trace |
Agent 主观选片(偏好判断、独立预算、选片理由)没有实现;Agent 只能在会话里按用户委托提交 |
| R17 | 自动执行为主、按操作授权 | 已做 | 策略发布即生成持续授权;服务端授权器(authorize.ts);approvals.test;e1 / e7 无逐次确认 |
— |
| R18 | 旧库分范围接管 | 部分 | 库根 management_mode(register_only / managed);资产对账;文件管理可逐项识别整理 |
没有首次全库扫描登记、没有"启用前预览影响"、没有作品级覆盖;scanIncremental 出错仍返回 complete |
| R19 | 控制台与 Agent 双入口 | 已做 | 同一能力注册表服务 Web / Agent / MCP;Agent 抽屉带页面上下文;凭证与原站接管走专用 UI | — |
| R20 | 偏好标签编辑与学习 | 部分 | 偏好标签作为规则展示形态,抑制记录(rules-api.test、rule-groups.test「Agent 不能加回(409)」);修订历史 |
"重复反馈调整软排序"的学习没有;标签不参与订阅评估(CHANGELOG 0.1.0 已知限制 3) |
| R21 | 下载缓存硬阈值 | 已做 | 按 cache_volume_key 汇总多 qB 同卷(services/volumes.ts);vertical.test「硬阈值……低于恢复水位只恢复阈值暂停项」 |
未纳管任务的占用与不暂停没有测试(AT42) |
| R22 | 跨季综合召回 | 部分 | TMDB + title_alias pg_trgm 召回;待识别池可按原始标题检索;identity_unresolved 有界复查 |
同名重启、简称变化、特别篇与下一季的区分没有专项逻辑和样本;没有召回率 / 误关联报告 |
| R23 | 整理记录公开接口 | 已做 | /organization-records、/organization-records/changes(游标,含状态更新);scope organize.read / organize.execute;vertical.test「整理记录 API」 |
— |
| R24 | Emby 兼容辅助查询 | 部分 | 多实例并行查询,失败为 unknown(emby.test、inventory/media-servers.test) |
库存结果不参与收录决策("已有则满足目标");没有 server_mapping 对账;没连过真实 Emby / Jellyfin |
| R25 | 站点缓存优先 | 已做 | 站点独立启停、快照、实时补查并发合并(sources-identity/api.test);全局搜索短缓存 |
限流器是进程内的,跨进程令牌桶在 c2a 进行中 |
| R26 | Pi 原生能力配置 | 待真实环境验证 | 上游 / 模型 / 思考档位 / 上下文预算 / 压缩 / 子会话开关;41 个 provider + 8 种订阅登录 | 只有 fake 与 OpenAI 兼容本地端点有自动化覆盖 |
| R27 | 禁止默认自动换源 | 已做 | 无进展只记证据 + 待处理(downloads.ts);恢复白名单不含换源(e6-auto-recover「换源被拒」) |
用户委托换源没有"替换计划"把新提交与原任务处置绑在一起 |
| R28 | 单管理员、多服务实例 | 已做 | 管理员登录 + TOTP / Passkey;API Key 四档 scope,可撤销;多 qB / 多 Emby / 路径映射 | — |
| R29 | 交互执行模式 | 已做 | 会话默认执行,agent.plan 步骤清单、agent.propose_options、内联审批、"先给方案"(e12-interaction) |
— |
| R30 | PT 站点工作台 | 待真实环境验证 | 站点页整理视图:列表 / 搜索 / 详情 / 库存叠加 / 统一下载入口;全局搜索 | 四个主力站没有连过真实账号;观众站定义无 H&R 选择器 |
| R31 | 同会话原站接管 | 部分 | 原站视图:截图轮询 + 坐标点击 / 输入 + 接管租约,交还后强制重读页面(browser-api.test) |
画面是 1.5 秒截图轮询,不是实时流;同一标签页人 / Agent 连续操作没在真实 camofox 上核验(browser.md §6 清单全空) |
| R32 | 可配置浏览器后端 | 待真实环境验证 | BrowserProvider 合同 + camofox 实现;按站点 / 账号隔离 profile |
用户 camofox 的 fork / 版本 / 地址未提供;只实现 camofox 一种 |
2. §2.1 五原则
| 原则 | 保障点 | 已知违背或风险 |
|---|---|---|
| 身份≠名字,路径≠外部 ID | external_identity_accepted_key(0005_identity.ts);本地 UUID 主键;合并留 merged_into_id;resolve.test「人工纠错映射:旧映射退役留修订」 |
domain 匹配仍要求本地候选带 externalId(W1 建议项,未修) |
| 已建立的路径绑定不随元数据重算 | path_binding_active_key;命名模板只在首次建绑定时生成目录;organize-move.test「路径绑定固定」;文件管理显式 move 才修订绑定(file-manager/write.test) |
无 |
| 模型不是业务事实唯一来源 | 服务端授权器忽略模型声称的"已同意"(e2「没有授权:download.submit 被拒」);汇报取自整理记录,模型文本标"未经核查";审批只接受管理员会话 |
能力统计把挂起重放算成失败(10-v0.2.1-check #4),只影响统计 |
| 失败≠不存在 | 对账库根离线只标 unavailable;TMDB 失败记 lookup_failed;Emby 失败为 unknown;文件管理根离线返回 503 不返回空列表(browse.test) |
scanIncremental 出错仍返回 complete(旧库接管会用到,目前服务端未调用) |
| 清理按明确授权 | assertSafeToDeleteData(已入库、无失败文件、无引用、保留期与 H&R);只读对账 / 总开关关闭时拒绝自动 execute;回收站代替直接删除,永久删除默认关闭 |
部分文件入库后不整种清理(AT29)只有代码保障,没有测试 |
3. §15 分期对照
结论:当前版本相当于"M0 大部分 + M1 全部(仅 mock 环境)+ M2 约三分之一"。 不是 M2 首版候选:REQ §15.3 明确 M2 才构成覆盖全部核心痛点的首版,而综艺分段覆盖、双版本组合校验、旧库接管、Agent 选片与规则学习都还没做,四站与浏览器也没连过真实环境。
M0
| 项 | 状态 | 证据 / 缺口 |
|---|---|---|
| 固定 Deno / Pi / PG / OpenWorkflow 版本与骨架 | 已做 | Deno 2.9.7、pi 0.87.1、openworkflow 0.10.1、PG 16;ADR-002 / 003 / 004 |
| Deno 下 Pi / PG / MCP / OpenWorkflow 实际兼容 | 已做 | docs/spikes/,MCP 用官方 SDK 实连(mcp.test) |
| Pi 白名单、无隐式扩展 | 已做 | runtime.test「未注册工具(bash)被拒」 |
| 执行器崩溃恢复 | 已做 | tasks/test/crash-recovery、e4 |
| 流程版本升级 | 部分 | 只在 spike 验证,产品代码没有测试 |
| 提前审批不丢失 | 已做 | engine.test「waitForFact 事实先于等待到达不丢失」、approvals.test |
| 多 Feed 并发不重复提交 | 部分 | 顺序 ingest 去重 + outbox 并发投递有测试;并发 ingest 没有 |
| 改名与映射修订后路径不变 | 已做 | organize-move.test、resolve.test |
| MP 多文件 / 整季包 / 目标冲突源码对照 | 部分 | docs/porting/moviepilot-transfer.md,只到源码层 |
| 浏览器连用户现有 camofox,验证同会话交接 | 未做(待用户提供) | 只对 mock 验证;linuxserver/chrome / Selkies 适用性未记录 |
| 脱敏真实样本 | 部分 | MP 差分样本(识别 / 规则 / 命名);没有四站真实 RSS 与综艺样本 |
| 自动执行关闭、影子决策 | 已做 | 自动化总开关;resolve.test「自动化关闭:证据足够也只提议」 |
M1
| 项 | 状态 | 证据 / 缺口 |
|---|---|---|
| 观众 + 馒头、多 RSS | 已做(mock) | api.test、mteam-tasks.test、ingest.test |
| qB 标签接管、Copy / Move | 已做 | vertical.test、organize-move.test、e8 |
| 一个电影目标 + 一部常规剧集 | 已做 | e1 / e2(电影)、e7 / e9(剧集) |
| 整理记录 API、可选 Emby 查询 | 已做 | 见 R23 / R24 |
| 备份、审计、恢复、停用自动化开关 | 部分 | 备份脚本与 umt backup;恢复只有人工演练;定时任务里的"备份"是占位 |
| 工作台列表 / 详情 / 库存标注 / 统一下载入口 | 已做(mock) | 站点页、全局搜索、/search/releases/{siteId}/{rid}/plan |
| Agent 自然语言目标 → 查库存 / 搜索 / 选片 / 提交 → 持续流程入库 → 真实汇报 | 已做(fake 模型) | e2「有持续授权:……汇报来自整理记录」 |
| 授权内异常调查与恢复 | 已做 | e6「task.inspect → download.recheck → 系统核实已恢复」 |
| 关闭聊天后台继续 | 已做 | e3 |
M2
| 项 | 状态 |
|---|---|
| 综艺内容分类与分段覆盖 | 部分(只到标题解析) |
| 本地临时集账本 | 已做 |
| 独立双版本 | 部分(require_distinct_asset 未生效) |
| 新作品 / 追更 / 升级三种规则 | 已做 |
| 浏览器 Adapter、工作台双视图、同会话接管 | 部分(mock;截图轮询) |
| 映射巡检与辅助刮削 | 部分(资产对账、元数据刷新;无身份巡检、无 NFO) |
| 旧库分范围接管 | 未做(只有库根两种模式) |
| 授权规则优化、条件 / Agent 选片 | 部分(只有条件选片;策略预览 = 对最近 200 条已识别资源试算) |
| 缓存硬阈值与清理 | 已做 |
| 偏好标签 | 已做(学习未做) |
| 站点快照缓存 | 已做 |
| 跨季召回与待识别治理 | 部分 |
| 双入口待处理 | 已做(顶栏收件箱 + 首页 + 页面内联) |
| HHClub / CHD 适配 | 待真实环境验证(定义来自 MovieClaw v0.27.0 MIT,有解析单测) |
| 媒体级主动整理 | 已做(文件管理 v2、整理向导、命名模板) |
| 影子模式比较人工选择 | 未做 |
M3
| 项 | 状态 |
|---|---|
| 更多 PT | 部分:23 个站点定义 + MP 专用 spider / 用户信息解析器已移植,均未真实核验 |
| Transmission / Plex | 未做 |
| 历史样本回放、规则迁移 | 未做 |
| Skill 管理 | 未做 |
| CLI | 部分:umt backup / --role export-mappings 等运维入口,没有业务 CLI |
| MCP 扩展 | 已做(提前到 v0.2.1) |
| 页面提取修复提案 | 未做 |
4. §16 AT01–AT80
分类:测试 = 有自动化测试覆盖通过标准;部分 = 有测试但只覆盖一段;手工 = 只能手工验证;未覆盖 = 没有测试也没有对应实现或手工流程。标 (mock) 的只在 mock 服务上跑过。
统计:测试 44(55%),部分 26(32.5%),手工 2(2.5%),未覆盖 8(10%)。有自动化测试的(测试 + 部分)合计 70 / 80 = 87.5%;完整覆盖率按 55% 计。
| AT | 状态 | 测试 / 说明 |
|---|---|---|
| 01 | 测试 | ingest.test「三个 Feed 看到同一资源只建一条 source_release」 |
| 02 | 部分 | e10「按作品选 Slot」;没有两站不同版本分进各自 Slot 的用例 |
| 03 | 测试 | ingest.test「窗口零重叠 → feed.gap_suspected,并路由到有预算的补漏快照」 |
| 04 | 部分 | release-parser.test 把加更识别为 extra;分段覆盖未实现 |
| 05 | 部分 | release-parser.test 会员版样本;节目级规则未实现 |
| 06 | 测试 | resolve.test「剧集:建 series 作品与临时季/集单元」、e7 |
| 07 | 测试 | organize-move.test「路径绑定固定:译名变化后新集仍进旧目录」 |
| 08 | 测试 | resolve.test「人工纠错映射」 |
| 09 | 部分 | e9 多版本延后;没有"两个 Slot 同时缺失分别执行"的专项 |
| 10 | 测试 | rules-api.test「new_title:not_new_release」 |
| 11 | 测试 (mock) | browser-api.test「租约到期 → 等待处理 + 待处理事项」、browser-e2e.test 验证码转接管 |
| 12 | 测试 | e4「download.submit 途中 kill worker → 不重复提交」 |
| 13 | 测试 | organize-move.test 跨卷 kill 后 resumed |
| 14 | 测试 | vertical.test「资产对账:库根离线只标 unavailable」 |
| 15 | 测试 | tasks/engine.test waitForFact 先到;approvals.test |
| 16 | 测试 | approvals.test 改计划 → 被拒 → 重批 → 只消费一次;rules-api 旧授权吊销 |
| 17 | 部分 | runtime.test 预算超限;e6 预算超限;没有"模型断网时确定性链继续"的用例 |
| 18 | 未覆盖 | 只有系统提示词约束,没有恶意标题 e2e |
| 19 | 部分 | vertical.test 删数据安全检查;硬链接工作流未做 |
| 20 | 手工 | docs/runbook/backup-restore.md 演练记录 |
| 21 | 测试 | resolve.test「用户锁定字段不被覆盖」(海报锁随 NFO 未做) |
| 22 | 测试 | emby.test、inventory/media-servers.test「异常实例 unknown」 |
| 23 | 测试 | vertical.test「already_exists:……只补管理标签」 |
| 24 | 测试 | e8 去标签 / 任务消失 |
| 25 | 测试 | vertical.test「缓存清理」、e8「缓存清理」 |
| 26 | 部分 | space_insufficient 事项有代码;没有"全部仍需保留"的专项用例 |
| 27 | 测试 | organize-move.test 跨卷 Move resumed |
| 28 | 测试 | vertical.test「H&R 未满足时 Move 变冲突」、organize-guard.test |
| 29 | 未覆盖 | 代码有文件级结果检查,无测试 |
| 30 | 部分 | 条件选片有测试;Agent 偏好选片未实现 |
| 31 | 部分 | 人工纠错有测试;Agent 规则优化未实现 |
| 32 | 测试 | e1 / e7 发布策略 → 持续授权 → 自动执行 |
| 33 | 未覆盖 | 旧库接管未实现 |
| 34 | 部分 | e7 / e9 持续追更;追新季开关没有测试 |
| 35 | 部分 | browser-e2e.test 凭证注入登录 (mock);HTTP → 浏览器自动切换未实现 |
| 36 | 测试 | rules-api.test revision 乐观锁 |
| 37 | 测试 | file-manager/write.test、organize-move.test |
| 38 | 部分 | domain/slot.test、rules-slot.test 升级档位;没有服务端 4K WEB-DL → 蓝光压制用例 |
| 39 | 部分 | e10「重复评估只留一条候选」;Agent 选片未实现 |
| 40 | 测试 | rules-api.test、rule-groups.test 抑制记录 |
| 41 | 测试 | vertical.test「硬阈值……只恢复阈值暂停项」 |
| 42 | 未覆盖 | 同卷汇总已实现(volumes.ts),未纳管任务没有测试 |
| 43 | 未覆盖 | 没有调查整个 qB 实例(含未纳管任务)的能力 |
| 44 | 部分 | seasonScope 已实现;来源默认值没有测试 |
| 45 | 部分 | resolve.test 本地召回、合并;同名重启 / 简称变化没有样本 |
| 46 | 测试 | resolve.test「no_match 进池并开未识别事项」 |
| 47 | 测试 | ingest.test「站点关闭后 Feed 不再抓取」、browser-api.test「站点停用」 |
| 48 | 测试 | vertical.test「changes 游标增量(含既有记录状态更新)」、w5a2.test partial |
| 49 | 部分 | Emby unknown 有测试;来源版本未知的专项没有 |
| 50 | 部分 | download-state.test「无进展判定」;服务端 e2e 没有 |
| 51 | 部分 | e11 开关关闭时拒绝派生;思考档位能力表达只有 upstreams.test |
| 52 | 测试 | e11 预算共享、父中止级联取消 |
| 53 | 测试 | e12「先看方案时执行被拒」 |
| 54 | 部分 | e7 整季包只覆盖实际文件;MP 对照样本没有 |
| 55 | 部分 | op-ledger「租约丢失旧 attempt 提交被拒」;流程升级没有 |
| 56 | 部分 | auth.test 撤销后 401;恢复与路径改变没有自动化 |
| 57 | 部分 | 站点 mock 列表 / 详情;四站真实页面没有 |
| 58 | 部分 | vertical.test「首页、媒体库、库存叠加 API」;Emby 叠加没有 |
| 59 | 测试 | sources-identity/api.test 实时补查并发合并、关闭站点 |
| 60 | 部分 | e10 去重、浏览器下载转 /acquisition-plans;并发触发没有 |
| 61 | 测试 (mock) | browser-api.test「输入类动作要先接管;他人接管中 409」 |
| 62 | 测试 (mock) | browser-api.test「交还后需重新读取页面」 |
| 63 | 测试 (mock) | browser-api.test「服务重启……标签页标 lost」「站点停用」 |
| 64 | 测试 | browser-api.test 快照遮蔽密码与 passkey;redact-consistency.test |
| 65 | 测试 (mock) | browser-api.test 下载暂存、sha256 / infohash 核验 |
| 66 | 未覆盖 | 不适用:没有接独立 Chrome |
| 67 | 测试 | e2 |
| 68 | 测试 | e5 自动调查、e6 授权内恢复 |
| 69 | 测试 | e3、e4 |
| 70 | 测试 | e2「已提交≠已入库」 |
| 71 | 测试 | e5「重复事件只一个 run」、e6 尝试上限 |
| 72 | 测试 | mcp.test「execute Key……有授权后执行并记账本」 |
| 73 | 未覆盖 | 多下载器相同 hash 没有测试 |
| 74 | 未覆盖 | 待处理按 dedupe_key 去重,但没有挂载根因聚合 |
| 75 | 手工 | 待处理事项有 dismissed 状态,无测试 |
| 76 | 测试 | search.test「两站成功 + 一站超时 → partial」 |
| 77 | 测试 | w5a2.test 目录复制 partial;vertical.test 文件明细 |
| 78 | 部分 | agent-mock.test 生产禁 mock;卡片引用失效没有测试 |
| 79 | 测试 | sse.test、sse-pg.test resync |
| 80 | 部分 | logger.test、redact-consistency.test、runtime.test 脱敏;"未知用量不填零"没有测试 |
5. §17 待落实事项
5.1 §17.2 部署配置(界面都已可配,缺的是用户的真实值)
| 项 | 状态 |
|---|---|
| HHWEB 所指站点的域名 / 身份 | 待用户提供(目前按 HHClub hhanclub 定义处理) |
| 另外 1–2 个站点 | 待用户提供(23 个定义可选) |
| 实例地址与凭据(qB、Emby、站点) | 待用户提供 |
| qB 管理标签 | 可配(每个下载器实例 managedTag) |
| 容器路径与共享挂载 | 待用户提供(路径映射有 verify 端点) |
| 现有目录模板 | 可配(命名模板三级覆盖);需用户确认默认模板 |
| 电影 / 剧集 / 综艺的 Slot 作用范围 | 待用户提供 |
| Copy / Move 默认范围 | 可配 |
| H&R / 保留要求及单位 | 可配;观众站缺 H&R 选择器 |
| 缓存阈值 / 恢复水位 | 可配,默认 90% / 85% / 清理目标 80% |
| 新旧媒体保留策略 | 部分:替换时旧文件进回收站,没有独立的旧版本保留策略 |
| NFO / 海报权限 | 未做(写 NFO / 图片未实现) |
| 快照周期 | 可配 |
| Pi 上游、思考档位、上下文 / 压缩预算、子会话开关 | 可配;待用户提供真实上游 |
| camofox 仓库 / 版本 / 地址 / 认证 | 待用户提供 |
| Move 遇未满足 H&R | 已定:409 + 待处理,不自动改 Copy |
| 升级后旧文件何时清理 | 未定,目前进回收站按回收站过期清理 |
| 合并版是否替换既有分段 | 未定(综艺分段未做) |
5.2 §17.3 技术准入
| 项 | 状态 |
|---|---|
| 业务核心 Deno | 已定 2.9.7 锁版本(ADR-004) |
| PostgreSQL | 已定 PG 16 + Kysely,迁移到 0040;大库规模性能未测 |
| 执行引擎 | 已定 openworkflow 0.10.1(ADR-002);旧流程跨版本升级未做产品测试 |
| Agent | 已定 pi 0.87.1;子会话自研(agent.spawn / agent.await) |
| 前端 / API | 已定 Hono + React Router 7 SPA,REST / OpenAPI / MCP |
| 浏览器 | camofox 适配完成;fork / 版本 / 画面交接待真实实例 |
| 文件工具 | 静态 ffprobe 9.0.2;真实挂载基准 B1–B3 未跑 |
5.3 §17.4 下一阶段产物
| # | 产物 | 状态 |
|---|---|---|
| 1 | 两项目实现迁移对照 | 已做(docs/porting/),运行对照未做 |
| 2 | 固定版本兼容原型 | 已做(docs/spikes/、ADR) |
| 3 | Agent 发起并跟踪的恢复纵切 | 已做(mock,e2 / e6) |
| 4 | 四站真实脱敏样本集 | 未做,待用户提供账号 |
| 5 | 正式接口与数据迁移草案 | 已做(packages/contracts,旧库接入部分未做) |
| 6 | 可观测性合同 | 部分(任务流、时间线、运行状态页;根因聚合与版本覆盖矩阵只做了订阅侧) |
| 7 | PT 工作台原型 | 已做(mock);真实实例核验清单见 docs/runbook/browser.md §6 |
6. 未做功能清单(按优先级)
估算按一个开发子代理的工作日粗估,不含等待用户提供环境的时间。
| # | 功能 | 实施建议 | 估算 |
|---|---|---|---|
| 1 | 综艺分段与正片覆盖(REQ §5、R02) | 覆盖计算从"集号"改为"内容单元 × 分段":上 + 下或完整版任一满足一期;节目级策略(附加内容收录、是否等完整版、完整版出现后是否替换分段);待识别池加分段歧义事项;先收集 3–5 个节目的真实标题样本 | 5–8 天 |
| 2 | 四站真实核验(观众 / 馒头 / HHClub / CHD) | 用户给账号后逐站跑列表、详情、下载、促销、H&R、登录过期;补观众 H&R 选择器;结果写 docs/runbook/sites.md |
2–3 天(拿到账号后) |
| 3 | camofox 真实实例核验 | 按 browser.md §6 六项逐条核验,写 verified;决定截图轮询是否够用,不够再评估 VNC / 流式 |
2 天(拿到实例后) |
| 4 | 双版本组合校验(R04) | checkDistinctAssets 接进 Slot 落定与计划预留;同一资产满足第二个 Slot 时转 attention |
1–2 天 |
| 5 | 旧库分范围接管(R18、AT33) | 首次扫描任务(续扫游标,复用 reconcileLibrary 批处理)→ 识别登记 → 预览影响(作品数、缺口、预计下载量)→ 按库根 / 作品开启;先修 scanIncremental 的 partial |
5–7 天 |
| 6 | Emby 库存参与收录决策(R24) | 已确认的外部库存可满足 Slot(需证据与策略开关);Server Reconciler 写 server_mapping;真实 Emby / Jellyfin 验证分页与认证 |
3–4 天 |
| 7 | Agent 偏好选片(R16、AT30 / 39) | 策略增加"Agent 判断"层:确定性过滤后把候选交给有界 Agent 任务,独立预算,理由存 acquisition_plan.evaluation;硬排除仍由代码执行 |
4–5 天 |
| 8 | 规则学习与样本回放(R20、AT31) | 人工纠错写标注样本;策略新旧版本对历史样本回放,展示新增命中 / 误排除;Agent 发布需额外授权并可回滚 | 5–7 天 |
| 9 | 委托换源的替换计划(R27 例外流程) | 新能力生成"替换计划":新候选 + 原任务处置(保留 / 暂停 / 移除 / 删数据分别授权),一次审批或持续授权覆盖 | 2–3 天 |
| 10 | 备份恢复演练自动化(AT20 / 56) | compose 夜间任务:备份 → 清库 → 恢复 → 只读对账 → 映射行数比对;定时任务"备份"从占位改为真实执行 | 2 天 |
| 11 | Pi 上游真实验证(R26) | 用户提供 1–2 个真实上游(API Key 与一种订阅登录)跑 e2 纵切;Codex _randomBytes spike |
1–2 天 |
| 12 | 测试补缺 | AT18 恶意标题 e2e、AT29 部分入库不清理、AT42 未纳管占用、AT73 多下载器同 hash、流程版本升级回归 | 3 天 |
| 13 | NFO / 图片投影(R10) | 遵守字段锁,临时文件 + 原子提交,写入受库根策略控制 | 2–3 天 |
| 14 | 身份巡检与挂载根因聚合(R09、AT74) | Identity Reconciler 周期核对外部对象;同一库根离线的事项按根因合并 | 3 天 |
| 15 | HTTP 失败自动切浏览器(R06、AT35) | 站点适配器在登录失效 / 挑战时按策略转浏览器会话,仍失败再进待处理 | 2–3 天 |
| 16 | 调查整个 qB 实例(AT43) | 只读能力列出实例全部任务(含未纳管),一次性操作不写管理标签 | 1–2 天 |
| 17 | 通知渠道 | REQ 未列为必需;若要做,先做 webhook 出站(待处理新增 / 解决),Telegram 之后 | 2 天 |
| 18 | Transmission / Plex、Skill 管理、业务 CLI | M3 范围,真实需求出现后再排 | — |
说明:任务书里曾列为缺口的"多 qB 缓存卷汇总"已实现(services/volumes.ts 按 cache_volume_key 汇总),缺的只是未纳管任务的测试(第 12 项)。
7. 与 REQ 的有意偏离
| 偏离 | 说明 | 记录位置 |
|---|---|---|
| 运行时先 Node 后改 Deno | REQ 首选 Deno;W0 曾用 Node 24,W1 后迁到 Deno 2.9.7,现已符合 REQ | ADR-001(已取代)、ADR-004 |
| 不引入 Redis / Deno KV | 与 REQ §9.1 一致;限流与短期缓存放 PG(令牌桶、UNLOGGED 表),c2a 进行中 |
00 §9 |
| MP 站点定义文件加密不可用,改用 MovieClaw v0.27.0(MIT)定义 | MP user.sites.v3.bin 加密;MovieClaw 只取 MIT 版本,之后的附条件许可内容未使用 |
packages/adapters/src/sites/definitions/NOTICE-MovieClaw.md、docs/porting/license-and-provenance.md |
| Agent 取消 plan_only / execute 模式 | REQ §10.6 的"只规划"改为会话内"先给方案"选项与 agent.plan 步骤清单;旧 mode=plan_only 兼容为 proposeFirst |
00 §9、docs/runbook/agent.md |
| 子代理自研 | REQ 说不假定 SDK 提供子代理;实现为 agent.spawn / agent.await,继承授权上限、共享预算 |
docs/runbook/agent.md、CHANGELOG 0.2.0 |
| 命名模板与 MP 输出的差异 | 10 处:非法字符全变量转全角、空白规整、合集集号范围、扩展名小写、长度截断、安全子集不支持 for / 属性访问、已有绑定目录优先、末段必须有扩展名 | docs/design/naming-template.md §5、§10 |
| 识别与 MP 的故意差异 | 125 处 intentional(未知发布组兜底、期号记为 issue 等) | docs/porting/mp-rust-logic-parity.md §2.3 |
| 转移行为必须偏离 MP 的点 | 不覆盖、路径绑定优先、跨卷可恢复等 | docs/porting/moviepilot-transfer.md §3 |
| OpenWorkflow 面板自研 | 官方面板 Proprietary,只参考信息架构,直查同一 schema;后并入统一任务页 | docs/design/openworkflow-dashboard-reference.md、docs/design/console-ia.md |
| 原站视图用截图轮询 | REQ 要求同会话可视接管,传输方案待验证;先用截图 + 坐标输入,未冒充实时画面 | docs/runbook/browser.md |
| 永久删除开关是环境变量 | 规格原为设置项,改为 FILES_ALLOW_PERMANENT_DELETE,需重启生效 |
07 §3.2 |