Files
UHD_Media_Tool/docs/plan/11-requirements-coverage.md
T
rootandClaude Opus 5.5 ceb66f8c77 feat: v0.3.8–v0.3.14 工作区汇总(依赖升级、整理来源、手动入库、原地入库等)
生产 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]>
2026-10-02 15:47:17 +08:00

30 KiB
Raw Blame History

需求覆盖矩阵与后续计划

历史报告:本文核对的是 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