docs(plan,changelog): W6-B status per item in 07, known limits updated, ci timings
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
7daf544bd9
commit
8f7d92150f
2 files changed
+50
-6
No files matched your search
+17
-6
@@ -95,6 +95,17 @@
|
|||||||
- 完成判定只保留 `applySlotEvent(verify_passed)` 一条路径,整理流程不再自行把订阅置为完成。
|
- 完成判定只保留 `applySlotEvent(verify_passed)` 一条路径,整理流程不再自行把订阅置为完成。
|
||||||
- server 测试分为并行的 unit 组和文件级串行的 pg 组,`packages/tasks` 同样串行;`deno task ci` 连续 3 次全绿(约 340–370 秒)。
|
- server 测试分为并行的 unit 组和文件级串行的 pg 组,`packages/tasks` 同样串行;`deno task ci` 连续 3 次全绿(约 340–370 秒)。
|
||||||
|
|
||||||
|
### 发布前安全修复(W6-B,`docs/plan/07-v0.1-final-review.md` §1.2)
|
||||||
|
|
||||||
|
- 多源 Move 授权:`/files/move` 与 `/files/organize`(action=move)按**每个源**所属作品(声明作品 ∪ 源下已登记资产的作品)逐一核对持续授权,任一不覆盖整体 403 并列出未授权项;无法归属作品的源只接受一次性审批;organize 先整体预检,不会只执行一部分组。
|
||||||
|
- `GET /files/download`、`POST /files/trash/purge` 在注册表标 `auth:"session"`,由中间件统一只放行管理员会话(DEV key 与 admin scope 的 API Key 一律 403);永久删除同口径;`api-registry.test` 新增反向断言,未标 session 的端点不得对 admin scope 返回 403。
|
||||||
|
- 脱敏键表只剩一份:rss 与 browser 的参数判定改用 `@umt/contracts` 的 `SENSITIVE_QUERY_PARAMS` / `isSensitiveQueryParam`,补齐 `pass_key`、`c_secure_pass`、`refresh_token`、`password`、`uid_key`、`auth` 等写法,加三处一致性测试。
|
||||||
|
- 回收站"还原到…"只允许可写的 managed 库根;原位还原逐级重建父目录且不跟随符号链接;跨卷还原受 `FILES_TRASH_CROSS_MAX_BYTES` 上限,回收站进出的跨卷复制经 fsproxy。
|
||||||
|
- `/files/identify` 的远端查询经进程共享的 TMDB 限流器,单次请求最多 20 个远端查询;`POST /files/probe` 改为需要 `organize.execute`(会写 `media_info`)。
|
||||||
|
- fsworker 阶段完成的进度一律立即上报,不再被节流吞掉最后一跳(全量 ci 下偶发的 fsproxy 用例失败)。
|
||||||
|
- fsproxy 挂死验收开关 `UMT_FS_TEST_HANG_AFTER_BYTES` 必须同时设置 `UMT_FS_TEST_HOOKS=1` 才生效,preflight 发现已设置会告警。
|
||||||
|
- 控制台账户弹层新增"二次验证"入口(生成密钥 → 验证码确认开启;凭密码 + 验证码关闭),不显示二维码,手动输入密钥或 otpauth 链接。
|
||||||
|
|
||||||
### 已知限制
|
### 已知限制
|
||||||
|
|
||||||
完整清单与出处见 `docs/plan/07-v0.1-final-review.md` §8;范围外内容以 `docs/plan/00-first-version-plan.md` §3.2 与 §6 为准。
|
完整清单与出处见 `docs/plan/07-v0.1-final-review.md` §8;范围外内容以 `docs/plan/00-first-version-plan.md` §3.2 与 §6 为准。
|
||||||
@@ -108,13 +119,13 @@
|
|||||||
|
|
||||||
3. 完成判定前不会强制刷新元数据;titleQuery 订阅不会自动建档回填;季范围语义(`current_season` 在没有季单元时固定)未做;偏好标签不参与评估。
|
3. 完成判定前不会强制刷新元数据;titleQuery 订阅不会自动建档回填;季范围语义(`current_season` 在没有季单元时固定)未做;偏好标签不参与评估。
|
||||||
4. 同作品同季重复订阅没有查重;`prefer_pack`、回退等待期、Agent 选片理由与独立预算、队列按优先级出队、实体级识别词都未做;没有"清账重置"(只能把状态改回 active 重新订阅)。
|
4. 同作品同季重复订阅没有查重;`prefer_pack`、回退等待期、Agent 选片理由与独立预算、队列按优先级出队、实体级识别词都未做;没有"清账重置"(只能把状态改回 active 重新订阅)。
|
||||||
5. 完成判定的双路径已在 W6-A 合并为一条(见"稳定性与部署")。
|
5. (已解决)完成判定的双路径已在 W6-A 合并为一条,编号保留以便与 07 §8 对照。
|
||||||
|
|
||||||
**文件管理**
|
**文件管理**
|
||||||
|
|
||||||
6. NFO / 图片投影(scrape 的 `writeNfo/images` 返回 `not_implemented`)、硬链接、蓝光原盘整目录操作未做;路径守卫没有下沉到 adapters。
|
6. NFO / 图片投影(scrape 的 `writeNfo/images` 返回 `not_implemented`)、硬链接、蓝光原盘整目录操作未做;路径守卫没有下沉到 adapters。
|
||||||
7. 从回收站还原不会恢复资产状态,需要重新整理登记;永久删除开关是环境变量,不是设置项。
|
7. 从回收站还原不会恢复资产状态,需要重新整理登记;永久删除开关是环境变量,不是设置项。
|
||||||
8. 跨卷进回收站(≤2 GiB)、跨卷还原、永久删除、identify(每项超时 15 秒,不经 TMDB 限流器)、probe 都在 HTTP 请求内执行,也都不经 fsproxy。
|
8. 跨卷进回收站与跨卷还原(都受 `FILES_TRASH_CROSS_MAX_BYTES` 上限、复制经 fsproxy)、永久删除、identify(已经走 TMDB 限流器,单次最多 20 个远端查询)、probe(串行,每次 30 秒超时)仍在 HTTP 请求内执行;浏览、根探测、readdir 与永久删除的 `rm` 不经 fsproxy。计划 v0.1.1 改为入队(07 S-7)。多项永久删除没有服务端的逐项确认(单项要求 `confirmName`)。
|
||||||
9. 前端没有整理向导 e2e 和移动端快照,页面行为靠 model 单测和冒烟覆盖。
|
9. 前端没有整理向导 e2e 和移动端快照,页面行为靠 model 单测和冒烟覆盖。
|
||||||
|
|
||||||
**转移与文件系统**
|
**转移与文件系统**
|
||||||
@@ -124,8 +135,8 @@
|
|||||||
|
|
||||||
**Agent 与安全**
|
**Agent 与安全**
|
||||||
|
|
||||||
12. 控制台没有 TOTP 开关入口(后端 `GET/POST /auth/totp` 已有)。
|
12. (已解决,W6-B)控制台 TOTP 入口已补;开启时只显示密钥与 otpauth 链接,不渲染二维码。
|
||||||
13. rss 和 browser 的脱敏键表没有与 contracts 统一。
|
13. (已解决,W6-B)rss 和 browser 已改用 contracts 的共享键表;全仓凭证泄漏的故障注入测试留到 M2。
|
||||||
14. `GET /inventory/media-servers` 在请求内串行查 Emby;能力调用超时后,底层调用仍会跑完。
|
14. `GET /inventory/media-servers` 在请求内串行查 Emby;能力调用超时后,底层调用仍会跑完。
|
||||||
15. Agent 页的幂等键来自审计(最多 3 页),审批卡片的 planId 靠解析工具摘要得到,较早的运行可能取不到。
|
15. Agent 页的幂等键来自审计(最多 3 页),审批卡片的 planId 靠解析工具摘要得到,较早的运行可能取不到。
|
||||||
16. 自动恢复只核实到下载恢复,入库由后续流程负责;恢复白名单只有 `task.retry`、`download.recheck`、`identity.resolve`。
|
16. 自动恢复只核实到下载恢复,入库由后续流程负责;恢复白名单只有 `task.retry`、`download.recheck`、`identity.resolve`。
|
||||||
@@ -136,5 +147,5 @@
|
|||||||
|
|
||||||
**质量与运维**
|
**质量与运维**
|
||||||
|
|
||||||
18. 恢复流程只有人工演练;流程版本升级没有产品侧测试;下载状态机 `ALLOWED` 未收紧;`scanIncremental` 出错时仍返回 complete;AT18 恶意标题 e2e、AT42 未纳管占用没有测试;`vertical.test` 的用例依赖执行顺序;web 单测少。
|
18. 恢复流程只有人工演练;流程版本升级没有产品侧测试;下载状态机 `ALLOWED` 未收紧;`scanIncremental` 出错时仍返回 complete;AT18 恶意标题 e2e、AT42 未纳管占用没有测试;`vertical.test` 的用例依赖执行顺序;web 单测少(账户弹层的 TOTP 对话框只有类型检查,没有组件测试);E6 自动恢复只核实到 recheck 后回到下载中,engine-retry 用的是 mock enqueue。
|
||||||
19. `deno task ci` 约 6 分钟,server 测试(pg 组文件级串行)是主要耗时。
|
19. `deno task ci` 约 6 分钟(W6-B 两次全绿 357 s / 341 s),server 测试(pg 组文件级串行)是主要耗时。
|
||||||
@@ -288,3 +288,36 @@ REQ 增强点:"总集数未知不结束"和"临时集单元"从 ✗/◐ 变成
|
|||||||
3. **订阅闭环第二阶段**:消除双轨完成判定;完成前强制刷新;偏好标签编译进 SlotSpec;`require_distinct_asset` 接入评估与入库(这是综艺和双版本的前置);队列按优先级出队。
|
3. **订阅闭环第二阶段**:消除双轨完成判定;完成前强制刷新;偏好标签编译进 SlotSpec;`require_distinct_asset` 接入评估与入库(这是综艺和双版本的前置);队列按优先级出队。
|
||||||
4. **文件管理补全**:NFO 投影(带 umt 标记与字段锁)、hardlink(`link` 自带 no-clobber)、蓝光原盘目录、空目录上溯清理;前端补向导 e2e、移动端快照和键盘可访问性测试。
|
4. **文件管理补全**:NFO 投影(带 umt 标记与字段锁)、hardlink(`link` 自带 no-clobber)、蓝光原盘目录、空目录上溯清理;前端补向导 e2e、移动端快照和键盘可访问性测试。
|
||||||
5. **把 CI 当作发布门禁**:e2e 按包并行、给 server 测试分片,把 ci 控制在 90 秒内;夜间跑"备份 → 清库 → 恢复 → 只读对账 → 映射比对"和流程版本升级回归;CHANGELOG 与已知限制由每个波次的汇报强制更新,避免再出现 B1。
|
5. **把 CI 当作发布门禁**:e2e 按包并行、给 server 测试分片,把 ci 控制在 90 秒内;夜间跑"备份 → 清库 → 恢复 → 只读对账 → 映射比对"和流程版本升级回归;CHANGELOG 与已知限制由每个波次的汇报强制更新,避免再出现 B1。
|
||||||
|
|
||||||
|
## 10. W6-B 处理状态(2026-09-28,打 tag 前)
|
||||||
|
|
||||||
|
| # | 状态 | 提交 | 说明 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| B1 | 已修 | b48d859、本文档提交 | CHANGELOG `[0.1.0]` 按功能补齐文件管理、订阅增强、转移语义、Agent 会话页、识别补迁、稳定性(W4-D~W6-A)与 W6-B 安全修复;"已知限制"换成本文 §8 的 19 条,过时的集单元条目已删 |
|
||||||
|
| S-1 | 已修 | 17cf3cb | `authorizeMoveEntities`:每个源的作品集合(声明作品 ∪ 源下已登记资产的作品)逐一核对 grant,一次性审批覆盖整请求;无法归属作品的源只认审批;拒绝时列出未授权项并写审计。`/files/move` 与 `/files/organize`(move,先整体预检、不消费审批)都接入;copy 不删源、delete 每次审批,无此问题。测试:`write.test`「两个作品只授权一个 → 403」、`identify-organize.test`「源是别的作品的已登记资产 → 403」 |
|
||||||
|
| S-2 | 已修 | 17cf3cb | download / trash purge 标 `auth:"session"`,files 路由按注册表挂 `requireAdminSession`;口径:DEV key 等同 admin scope Key,仅会话端点与永久删除一律拒绝,Move/删除审批的免授权仍放行 DEV key(与 `authorizeMove` 一致)。`api-registry.test` 会话列表加这两个,新增反向断言(未标 session 的端点对 admin scope Bearer 不得 403,会话中间件在入参校验之前,暗挂必暴露);download/purge 用例补 admin scope Key 与 DEV key 403 |
|
||||||
|
| S-3 | 已修 | ba1361a | 账户弹层"二次验证":生成密钥(base32 分组 + otpauth 链接)→ 6 位码确认开启;已开启时凭当前密码 + 验证码关闭。没有二维码(不引新依赖);没有组件测试,只有类型检查 |
|
||||||
|
| S-4 | 已修 | 47bd04a | contracts 新增 `isSensitiveQueryParam`;rss 删掉本地 `SENSITIVE_QUERY_KEYS`,browser 的 `CREDENTIAL_PARAM` 由 `SENSITIVE_QUERY_PARAMS` 生成,各自只保留特有规则;`adapters/src/redact-consistency.test.ts` 24 种写法三处一致 |
|
||||||
|
| S-5 | 已修 | 17cf3cb | 还原目标走 `isWritableTarget`;原位还原 `mkdirWithin` 逐级 lstat + realpath,不跟随符号链接;跨卷还原受 `trashCrossMaxBytes`,进出回收站的跨卷复制经 fsproxy。测试:下载根 / register_only 目标 403、父目录换成根外链接 → path_escape 且根外无新目录、逐级重建、跨卷超限 too_large |
|
||||||
|
| S-6 | 已修 | b4560be | `sharedInvokeLimiter()` 进程共享;identify 的远端查询经 TMDB 信号量 + 15 s 超时,单次请求去重后最多 20 个,超出项给 warning |
|
||||||
|
| S-7 | 部分,余下延期至 v0.1.1 | 17cf3cb | 做了:跨卷还原加上限、回收站进出的跨卷复制经 fsproxy。未做:回收站 / 还原 / 永久删除 / identify / probe 改入队,根探测与 readdir 经 FsProxy 快操作。已写入 CHANGELOG 已知限制第 8 条 |
|
||||||
|
| S-8 | 已修(W6-A) | 887843f | 已核对:`organize.ts` 不再有本地 `slotComplete` 与订阅完成写入,手动整理指定 Slot 改调 `services/subscriptions.ts slotComplete`;完成与历史只由 `applySlotEvent(verify_passed)` 负责 |
|
||||||
|
| S-9 | 已修 | 2e3c209、cb3fb9b | rust-transfer §7 遗留(编译二进制 fsworker、trash_item)标已做;contracts / adapters / server README 补齐;04 表 S9 标已修;files runbook 授权矩阵同步 |
|
||||||
|
| S-10 | 已修 | 2ddaf7b | 开关需同时 `UMT_FS_TEST_HOOKS=1`(`fsTestHookFromEnv` 单测);`preflight` 发现已设置就 warn;deploy.md 演练命令同步 |
|
||||||
|
|
||||||
|
§1.3 建议:
|
||||||
|
|
||||||
|
| 建议 | 状态 |
|
||||||
|
|---|---|
|
||||||
|
| probe 标 `organize.read` 却写 `media_info` | 已修(d3de2c8):改为 `organize.execute`;仍在请求内串行,见 S-7 |
|
||||||
|
| 多项永久删除没有服务端确认 | 延期至 v0.1.1(写入 CHANGELOG 已知限制第 8 条) |
|
||||||
|
| trash 用例补"重放 → 拒绝" | 已补(d3de2c8) |
|
||||||
|
| download 用例补"admin scope 的 Key → 403" | 已补(17cf3cb) |
|
||||||
|
| E6 自动恢复延伸到入库、engine-retry 真实引擎用例 | 延期至 v0.1.1(已知限制第 18 条) |
|
||||||
|
| e2e 编号重复 | 已修(d3de2c8):`e6-w4a-endpoints` → `e10-w4a-endpoints` |
|
||||||
|
| 04 §1.3 的 7 条 | 延期(已知限制第 18 条) |
|
||||||
|
| biome 1 warning + 1 info | 已清(9887d8b) |
|
||||||
|
|
||||||
|
另:第一次全量 ci 暴露 `fsproxy.test`「正常复制」偶发失败(fsworker 的进度节流吞掉了复制阶段最后一跳,收到 6291456 而非 6291461),7daf544 改为阶段完成立即上报,单测连跑 3 次通过。
|
||||||
|
|
||||||
|
**ci**:修复后连续两次 `deno task ci` 全绿:357 s、341 s(server 44 文件 / 267 用例)。未打 tag。
|
||||||
Reference in new issue
Block a user