docs(plan): v0.2.1 independent check report
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
c1c8dc81a9
commit
d2b5095e97
1 file changed
+106
@@ -0,0 +1,106 @@
|
||||
# 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 根因) |
|
||||
Reference in new issue
Block a user