Files
UHD_Media_Tool/docs/plan/10-v0.2.1-check.md
T
2026-09-28 22:07:53 +08:00

107 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v0.2.1 收尾波独立检查
2026-09-28。对象:C1-A~E、AG-1、AG-2 合入 main 后的状态(基线 `cd70a69`)。检查者独占工作区。
## 结论
七路成果在 main 上可用,自动化测试与实机走查都能对上交付项。检查中发现并修复 5 项(其中 1 项是 HEAD 上 `deno task lint` 本身就不过),
另记录 6 项未修(都不阻塞发布)。修复后 `deno task ci` 连跑 2 次全绿(协调者要求加速,第 3 次中止),前端冒烟 69/69 通过。文案标点违规数为 0,`check:copy` 改为 `--strict`。
## 提交
| 提交 | 内容 |
| --- | --- |
| `410d4ee` | 工作区遗留的排序改动:`api.ts` 的 `export * from "./mcp.ts"` 排序(**HEAD 上 biome organizeImports 报错,ci 的 lint 一步不过**);`types.ts` 与 `deno task gen:types` 输出一致(开发库迁到 0040 后重新生成,逐字相同);`deno.json` imports 按字母排序。`deno.lock` 的改动(`@peculiar/asn1-*` 2.9.5→2.10.0、多出 `npm:vite@*`)是重新解析产生的,HEAD 的 lock 用 `deno install --frozen` 验证一致,已丢弃 |
| `0fccfe2` | 设置页左侧锚点补齐:Agent 分区加「MCP 服务端」「能力清单」,账户分区加「Passkey」(`SETTINGS_SECTIONS.anchors`) |
| `fb84a71` | 标点:剩余 828 处违规里 602 个字面量由 `--fix` 自动修正(74 个文件,只动字符串字面量 / JSX 文本),biome 重排 9 个文件;e2 / e6 断言跟随全角汇报文本;`check:copy` 改 `--strict`,ci 里有违规即失败 |
| `57346d4` | Agent 会话:挂起的调用(方案选择 / 审批)恢复重放时 `tool_call_start` 用同一 `toolCallId`,`foldEvents` 重复出卡 → React 重复 key 报错,工具调用计数也多 1(界面 6、列表 5)。改为沿用原卡片,补单测;汇报脚注的 `"已提交"` 改 `「已提交」` |
## CI 与冒烟
本机串行,HEAD `c1c8dc8`(代码同 `57346d4`,其后只有文档提交):
| 次 | 结果 | 耗时 |
| --- | --- | --- |
| 1 | 全绿 | 448 秒 |
| 2 | 全绿 | 453 秒 |
| 3 | 未跑完(按协调者要求中止) | — |
用例数(两次相同):server 69 文件 / 419、adapters 310(跳过 3)、agent 38、contracts 858、db 13、domain 582、mapping 22、tasks 17、testkit 4、web 99。
检查过程中的试跑:改标点后第一次 ci 因 biome 行宽与 3 个 e2e 断言(半角汇报文本)失败,已在 `fb84a71` 修掉。
前端冒烟:后端 `PORT=4412`(开发库 55433)+ web dev `--port 5202`,`deno task test:web:smoke` **69/69 通过**,跳过 7 条详情页(库里无站点 / 作品)。
## 逐路核验
| 路 | 交付项 | 证据 | 结论 |
| --- | --- | --- | --- |
| C1-A | 私有规则组、画质字段(MP 分辨率 / 来源 / 特效)、保存路径 / 下载器、关键词搜索、重置、日历 | `test/subscriptions/subscriptions-c1a.test.ts`(12)、`subscriptions-c1a-sources.test.ts`(2);走查:订阅总览 / 列表 / 日历视图、新建表单、详情页「订阅操作 → 重置」确认框与执行 | 通过 |
| C1-B | `agent.await` / `agent.spawn{await}` 挂起不占槽 | `e11-subagents`(`await_wake`、`run_started` resumed) | 通过 |
| C1-B | TOTP 二维码 + 恢复码 | `auth-settings/account-security.test.ts`、`login.test.ts`;走查:begin → enable(返回 8 个恢复码)→ 新会话密码登录出现 TOTP 步骤 → 输码登录 → disable | 通过 |
| C1-B | Passkey | 同上(`soft-authenticator.ts`);走查:CDP 虚拟认证器在设置页登记 → 登出 → 登录页出现「用 Passkey 登录」→ 登录成功 → 删除 | 通过。登录页只在已登记 Passkey 时显示入口(设计如此) |
| C1-B | 主密钥轮换 | `auth-settings/rotate-master-key.test.ts`;runbook `auth.md`「主密钥轮换」 | 通过 |
| C1-C | 契约 G6–G8、identify S-7 字段 | `file-manager/g678.test.ts`、`identify-organize.test.ts`、contracts `schemas.test.ts` | 通过 |
| C1-C | DataTable groupBy | `web/components/console/data-table.test.ts` | 通过 |
| C1-C | U6 悬浮按钮滚动让位 | 走查截图未见遮挡(未专门录滚动过程) | 通过 |
| C1-C | 标点全站执行 | 本轮修完剩余 828 处,0 违规,已切 strict | 已修 |
| C1-D | media-servers 并行 | `inventory/media-servers.test.ts`(并行、慢实例超时、partial) | 通过 |
| C1-D | identify 远端查询入队 + SSE | `identify-organize.test.ts`「缺省入队远端查询…发 identify.completed」 | 通过 |
| C1-D | 清理脚本 dry-run | 实跑 `scripts/dev-db-clean.ts`:dry-run 列出走查留下的 `qa-chk` 订阅 3 / 站点 1 且不改动;`--yes` 删除 174 个残留 schema 与这 4 行 | 通过 |
| C1-E | camofox BrowserProvider、会话 / 租约 | adapters `browser/browser.test.ts`、`interact.test.ts`;server `browser/__tests__/browser-api.test.ts`(9)、`browser-e2e.test.ts` | 通过 |
| C1-E | 原站视图 | 走查(mock camofox 19377):打开会话 → 画面 → 接管 → 地址栏跳转(被重定向到登录页,符合 mock 站点)→ 交还;「画面与输入未对真实实例核验」标记显示 | 通过,见问题 #3 |
| C1-E | 下载走 acquisition-plans | `routes.ts` 下载转调 `POST /acquisition-plans`(同一鉴权 / 去重 / 授权);`browser-e2e.test.ts` | 通过 |
| C1-E | 能力 25 | C1-E 时为 25;AG-2 加 `agent.plan` / `agent.propose_options` 后 `GET /capabilities/tools` 为 27,MCP 可见 read 9 / organize.execute 18 / admin 23,与 `mcp.md` 一致 | 通过 |
| AG-1 | MCP 端点鉴权与 scope、会话绑定、停用 / 允许列表、无授权拒绝 | `test/mcp/mcp.test.ts`(官方 SDK client 实连) | 通过 |
| AG-1 | stats / tools 端点 | 同上;走查 `GET /capabilities/stats` 200、`/capabilities/tools` 27 项、`/mcp/status` 200 | 通过 |
| AG-1 | 设置 → Agent → 工具与 MCP、IO 抽屉 | 走查设置 Agent 分区:MCP 服务端(开关、端点、接入配置)、能力清单表格 28 行(API 27 项) | 通过;左侧锚点已补(`0fccfe2`) |
| AG-2 | mode 移除与兼容 | `e12-interaction`「旧 mode=plan_only 按先看方案处理」 | 通过 |
| AG-2 | plan / propose_options 事件与 UI | `e12-interaction`、contracts `agent-events.test.ts`;走查:fake 脚本 → 步骤 1/3 实时勾选 → 方案卡(REMUX / WEB-DL / 都不要)→ 选定后续跑到 3/3、已完成 | 通过;修了重复 key(`57346d4`) |
| AG-2 | 内联审批 | `e12-interaction`(管理员会话批准后重放、审批 consumed;拒绝写待处理);UI 用 `/console/agent?mock=1` 看审批卡 | 通过。开发库没有版本目标 / 资源,未在实库上走真实审批 |
| AG-2 | E12 | `apps/server/test/e2e/e12-interaction.test.ts` 每次 ci 通过 | 通过 |
## 实机走查
脚本 `apps/web/test/screenshots/chk-v021/_walk.mjs`(Playwright,chromium headless,1440×900),截图与 `report.json` 在
`apps/web/test/screenshots/chk-v021/`(不进 git,共 58 张 + 冒烟 `smoke/`)。
走过:登录页 / 密码登录 / TOTP 步骤 / Passkey 登录;设置 9 区 + Agent 的 MCP 与能力清单锚点;站点列表、添加向导、站点详情(概览 / 账号 / 资源 / 快照)、原站视图;
来源健康;订阅(空态、新建表单、总览、列表、日历、详情、重置);规则页 5 个页签;文件管理(真实目录、演示数据、整理向导与推荐名、回收站);
任务页(全部、计划 Tab、详情);Agent 会话(fake 步骤 + 方案选择、`?mock=1`、列表);运行状态;⌘K 命令面板;搜索结果页。
- 控制台错误:修复前 Agent 会话选定方案后 4–6 条 React 重复 key;修复后 0。
- 失败请求:原站视图交还后 1 次 `409 GET /browser/sessions/{id}/screenshot`(问题 #3)。其余 0。
- 横向溢出:0。
- 走查临时数据(站点、订阅、浏览器服务行、Passkey、TOTP、`agent.fakeScript`)已清理或还原。
## 安全快查
| 端点 | scope / auth | 结论 |
| --- | --- | --- |
| `/browser/providers`、`/browser/sessions/**`(建 / 关 / 导航 / 点击 / 输入 / 滚动 / 选择 / 快照 / 截图 / 接管 / 交还) | admin | 输入类另需调用者持有自己的人工租约 |
| `POST /browser/sessions/{id}/download` | organize.execute | 带 target 需人工租约;提交转调 `/acquisition-plans`,授权与去重同 REST。比其它浏览器端点低一级,见问题 #5 |
| `/api/v1/mcp` | API Key(cookie 会话 403) | 调用走 `capabilities.invoke(source="mcp")`,execute 类要持续授权或有效审批;`GET /mcp/status`、`PATCH /mcp/config` admin |
| `POST /subscriptions/{id}/reset`、`/feed-sources/{id}/reset` | admin | — |
| `/auth/totp*`、`/auth/passkeys*`(管理) | admin + session | API Key 一律 403 |
| `/auth/passkeys/login/*` | public | 与 `PUBLIC_AUTH_PATHS` 一致(api-registry 测试断言) |
| `GET /files/download` | admin + session | — |
| `POST/PATCH /approvals` | admin + session | 会话内审批卡走 `PATCH /approvals/{id}`;能力注册表里没有任何审批类能力,Agent 与 MCP 都不能给自己开审批 |
| `GET /capabilities/stats`、`/capabilities/tools` | read | 只有描述符与计数 |
- 浏览器模块只写 `DATA_DIR/tmp/browser-downloads`(0700 目录 / 0600 文件,24 小时清理),没有媒体库或库根写入;凭证由服务端按 `credential` 注入,请求体不带明文。
- 本波新增 logger 调用 16 处逐条看过:只有 id、计数、错误 message、路径,没有凭证 / token / 明文;`mcp tool call failed` 记 `err` 对象,依赖 logger 的全局遮盖。
## 问题清单
| # | 问题 | 状态 |
| --- | --- | --- |
| 1 | HEAD 上 `api.ts` 导出未排序,`deno task lint` 失败 | 已修 `410d4ee` |
| 2 | 设置页左侧缺 MCP 服务端 / 能力清单 / Passkey 锚点 | 已修 `0fccfe2` |
| 3 | 原站视图交还后第一轮截图轮询 409,状态徽标瞬时显示红色「连接中断」;一次失败就标红偏敏感 | 未修:需要决定是否对单次失败做容忍 / 交还期间暂停轮询 |
| 4 | 能力清单里 `agent.propose_options` 失败率 50%:挂起那次调用在审计里记为失败,重放成功又记一次,统计把正常的挂起算成失败(`agent.spawn{await}` 同理) | 未修:需要定统计口径(挂起单独计或不计) |
| 5 | `POST /browser/sessions/{id}/download` 是 organize.execute,其余浏览器端点 admin。组合下需要先有 admin 建的会话,且带 target 要人工租约,风险有限 | 未修:记录,scope 取舍留给 C1-E 负责人 |
| 6 | 仓库根 `.env` 在 01:35 被换成了 docker compose 用的内容(没有 `DATABASE_URL`、`SECRET_MASTER_KEY`),`deno task gen:types` / `db:migrate` / `dev:server` 直接失败;本轮用环境变量覆盖运行,未改该文件(`umt` 栈可能在用) | 未修:建议把部署 env 放部署目录,根 `.env` 恢复为 `.env.example` 的开发内容 |
| 7 | 开发库缺 3 个迁移,本轮补迁到 0040(`0037_agent_await_passkey`、`0039_capability_stats`、`0040_agent_interaction`) | 已处理 |
| 8 | Agent 会话详情里步骤卡片 sticky,滚动时盖住方案卡上半部分(截图 49) | 未修:视觉取舍 |
| 9 | 自动修正不处理嵌套括号,如 `调查超出预算(工具调用次数超出预算(1))` 仍是半角外括号;检查脚本也不报 | 未修:脚本规则限制 |
| 10 | 会话详情工具调用计数与列表不一致(6 vs 5) | 已修 `57346d4`(同重复 key 根因) |