test: 完成 MVP-0 集成验收与运行闭环 #13

Closed
opened 2026-08-20 18:01:05 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求 / 集成验收
  • 所属 Epic:#3
  • 所属 MVP / 版本:#4(MVP-0)
  • 阶段:已完成

依赖与并行

  • 前置工单:#5、#6、#7、#8、#9、#10、#11、#12
  • 是否允许与前置工单并行:否;所有前置单元任务须分别完成并验收
  • 原因:依赖项定义本工单所需的可执行环境、共享模型、接口或已确认设计;未满足时保持待实施,不标记阻塞。

子项目影响

  • 仅影响的子项目 / 交付单元:全仓库 MVP-0 交付单元
  • 是否跨子项目:否
  • 是否修改共享接口或契约:否;验证既有契约,发现范围变化回到对应单元工单
  • 各子项目需要执行的验证:见“验证方式”和验收标准。

原始需求

  • 来源:用户对话;Product-Requirements-Overview、Architecture-and-Code-Map、Business-Rules-and-Glossary
  • 提出时间:2026-08-20
  • 关键原话或脱敏摘要:用户要求“为 MVP-0 的生产实现拆分单元工单”;本工单负责 完成 MVP-0 从空环境到文本/图片生成闭环的独立集成验收。

要解决什么

单元测试通过不等于 MVP 可交付。本工单从空 MySQL 8、mock 上游和受控种子用户出发,验证迁移、运行、恢复、安全、页面和退出的完整闭环,并补齐实际运行/部署文档证据。

做什么 / 不做什么

做

  • 从空隔离库执行全量 up/down/up,重复运行种子命令。
  • 构建、vet、测试并启动 portal 内嵌 worker 与 mock 上游。
  • 浏览器完成文本/图片成功、错误分类、幂等、跨用户、租约恢复和鉴权文件访问。
  • 验证 SSRF、密钥、CSRF/session、日志脱敏、优雅退出和陈旧 worker CAS。
  • 更新长期 Wiki、Deployment-and-Operations、实际运行命令、限制和回退步骤。
  • 形成 MVP-0 集成证据,等待用户验收;不代替各子工单验收。

不做

  • 不新增功能或顺手修复超出既有工单范围的问题;发现缺陷回到对应单元工单或新建 Bug。
  • 不调用真实上游额度,不连接生产/共享数据库,不发布生产。
  • 不关闭 MVP #4 或 Epic #3;只有用户明确验收 MVP 后才关闭父工单。

已确认方案

  • 使用 mock 上游和构造用户/图片;所有密钥均为测试环境临时值且不写证据正文。
  • 先验证安全和环境前置,再执行集成链路;失败时处理首个可定位错误。
  • 将每个 MVP 验收条目映射到命令、日志摘要、数据库断言或浏览器证据。

预计修改文件:

  • 必要的集成/E2E 测试与 fixture
  • docs/ 对应 Wiki 镜像
  • docs/10-deployment-and-operations.md 对应 Wiki 更新
  • 不创建 docs/task/,除非用户另行要求导出

需求变化记录

无。实现中若范围、接口、数据、依赖、验收或风险发生变化,必须先更新本工单;改变已确认结果时重新等待用户确认。

设计与原型门禁

  • 修改类型:非 UI
  • 所需设计证据:已确认的架构、数据、安全或流程设计;不要求 UI 原型
  • 事实来源:核心 Wiki 与父工单 #4
  • 状态:已确认;具体实现差异仍须按工单变化规则处理
  • 无需 UI 原型原因:本工单不改变用户界面

文档影响

  • 更新 Project-Profile、Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations 和 Product-Requirements-Overview 中实际发生变化的页面
  • Wiki 先改、回读 revision,再同步核心镜像
  • 不影响长期文档

交付文档影响

  • 更新部署与运行文档,受众:开发、测试和运维
  • 需要用户做 MVP-0 人工验收
  • 发布生产(明确不在本工单范围)

验收标准

  • 文本和图片各成功一次;pending/running/终态正确且终态停止轮询。
  • rendered_prompt、attempts、latency 或失败 error 字段完整。
  • 幂等、跨用户任务/文件、租约重领和旧 token CAS 逐项通过。
  • 400/401/策略拒绝与 429/5xx/超时/连接分类正确,MVP-0 不换家。
  • SSRF 全矩阵、API Key 密文 key_id、CSRF/session 和日志脱敏通过。
  • 图片鉴权访问、缩略图和文件原子落位通过。
  • 375/768/1024/1440 浏览器 E2E、键盘和 44px 目标通过。
  • 空 MySQL 8 up/down/up、Go build/vet/test、优雅退出和重启恢复通过。
  • Wiki、核心镜像、提交、任务归档和未验证项证据完整,工单停在待验收。

验证方式

  • go build ./...
  • go vet ./...
  • go test -race ./...
  • MySQL 8 全量迁移 up/down/up 与并发集成测试
  • Playwright 全状态、多视口和跨用户 E2E
  • python dev_scripts/harness.py check --strict
  • python -m unittest discover -s tests -v
  • python dev_scripts/harness.py sync --check
  • git diff --check

未执行或因环境不足无法执行的验证必须如实回写,不得把预期结果记为通过。

风险和回退

  • 高风险:本工单覆盖数据库、安全、并发和完整用户流程;任何真实数据、真实额度或发布操作都必须停止并另行授权。
  • 风险:本机环境与目标版本不符时不能降级验收标准,应回到环境工单处理。
  • 回退:停止服务、使用已验证 down 回退隔离库、回退对应子工单提交;不对生产数据执行回退。

实施与验证证据(2026-08-21)

  • 集成检查发现 portal/main.go 未接入已有 worker,按 #10 已确认设计建立并实施缺陷 #15;没有改变 UI、API、schema、状态机或 SSRF 边界。
  • 实现与文档镜像提交:1ad8dca9cf9d4ac671a17193435baf3326682f66,已推送到 origin/main。
  • MySQL 8.4.8 专用可丢弃库完成 up → seed×2 → down -all → up → seed×2;计数稳定为 1 用户、1 Provider、2 ProviderModel、2 Prompt,down 后业务表 0。最终专用库已撤权并删除,确认剩余数据库数 0;既有 chorus_test 未执行 down/drop。
  • go build ./...、go vet ./...、go test -race -count=1 -p=1 ./... 全部通过。MySQL 集成覆盖文本/图片 mock 成功、rendered_prompt、attempt/latency、幂等、跨用户、租约重领、旧 token CAS、鉴权文件、原图/缩略图和原子落位。
  • retryable 400/401/策略拒绝及 429/5xx/超时/连接、SSRF 矩阵、AES-GCM key_id、session/CSRF、日志/错误脱敏均包含在全量 race 测试并通过;没有调用真实 Provider。
  • Playwright 四视口运行 8 项:5 项通过,3 项为“终态流程只在 desktop-small 运行”的预期跳过;四视口响应式主流程均通过,desktop-small 额外通过 pending/running、文本成功、图片成功、失败终态和终态停止轮询。
  • 真实内嵌 worker 进程从隔离库认领 6 条 pending 并写终态;回环 Provider 在连接前被 SSRF 拦截。测试前后的两个 portal 前台进程均通过 Ctrl+C 干净退出。
  • Harness strict、42 项 Python 测试、git diff --check、Wiki 回读和核心镜像一致性通过。
  • Wiki revision:Project Profile 79ad76521eb7;Architecture b61f12999ae1;Local Development 31d2d641a46d;Deployment 80dac2704377;Product Requirements fa500788e6c0。
  • 未验证:真实 Linux/systemd/nginx、生产 TERM/重启、备份恢复、真实 Provider 和生产发布,均保持首次发布门禁,不宣称已上线。
  • 清理遗留:命令策略拒绝递归删除仓库外 D:\OPC\chorus-tools\e2e-13-current;其中仅有本次临时 portal 可执行文件、构造图片和存储 metadata,无凭据且不在 Git。该目录不影响运行或验收,可人工删除。

验收结论

  • 用户于 2026-08-21 明确确认 #13 验收通过。
  • 实现提交:1ad8dca9cf9d4ac671a17193435baf3326682f66;验收文档提交:3b54d50,均已推送到 main。
  • 任务归档 revision:166a0a72f28af482fee03fb76cbd4a7ad76c3622。
  • 工单已完成并关闭;MVP #4 仍等待单独验收。
## 基本信息 - 类型:需求 / 集成验收 - 所属 Epic:#3 - 所属 MVP / 版本:#4(MVP-0) - 阶段:已完成 ## 依赖与并行 - 前置工单:#5、#6、#7、#8、#9、#10、#11、#12 - 是否允许与前置工单并行:否;所有前置单元任务须分别完成并验收 - 原因:依赖项定义本工单所需的可执行环境、共享模型、接口或已确认设计;未满足时保持待实施,不标记阻塞。 ## 子项目影响 - 仅影响的子项目 / 交付单元:全仓库 MVP-0 交付单元 - 是否跨子项目:否 - 是否修改共享接口或契约:否;验证既有契约,发现范围变化回到对应单元工单 - 各子项目需要执行的验证:见“验证方式”和验收标准。 ## 原始需求 - 来源:用户对话;Product-Requirements-Overview、Architecture-and-Code-Map、Business-Rules-and-Glossary - 提出时间:2026-08-20 - 关键原话或脱敏摘要:用户要求“为 MVP-0 的生产实现拆分单元工单”;本工单负责 完成 MVP-0 从空环境到文本/图片生成闭环的独立集成验收。 ## 要解决什么 单元测试通过不等于 MVP 可交付。本工单从空 MySQL 8、mock 上游和受控种子用户出发,验证迁移、运行、恢复、安全、页面和退出的完整闭环,并补齐实际运行/部署文档证据。 ## 做什么 / 不做什么 ### 做 - 从空隔离库执行全量 up/down/up,重复运行种子命令。 - 构建、vet、测试并启动 portal 内嵌 worker 与 mock 上游。 - 浏览器完成文本/图片成功、错误分类、幂等、跨用户、租约恢复和鉴权文件访问。 - 验证 SSRF、密钥、CSRF/session、日志脱敏、优雅退出和陈旧 worker CAS。 - 更新长期 Wiki、Deployment-and-Operations、实际运行命令、限制和回退步骤。 - 形成 MVP-0 集成证据,等待用户验收;不代替各子工单验收。 ### 不做 - 不新增功能或顺手修复超出既有工单范围的问题;发现缺陷回到对应单元工单或新建 Bug。 - 不调用真实上游额度,不连接生产/共享数据库,不发布生产。 - 不关闭 MVP #4 或 Epic #3;只有用户明确验收 MVP 后才关闭父工单。 ## 已确认方案 - 使用 mock 上游和构造用户/图片;所有密钥均为测试环境临时值且不写证据正文。 - 先验证安全和环境前置,再执行集成链路;失败时处理首个可定位错误。 - 将每个 MVP 验收条目映射到命令、日志摘要、数据库断言或浏览器证据。 预计修改文件: - 必要的集成/E2E 测试与 fixture - `docs/` 对应 Wiki 镜像 - `docs/10-deployment-and-operations.md` 对应 Wiki 更新 - 不创建 `docs/task/`,除非用户另行要求导出 ## 需求变化记录 无。实现中若范围、接口、数据、依赖、验收或风险发生变化,必须先更新本工单;改变已确认结果时重新等待用户确认。 ## 设计与原型门禁 - 修改类型:非 UI - 所需设计证据:已确认的架构、数据、安全或流程设计;不要求 UI 原型 - 事实来源:核心 Wiki 与父工单 #4 - 状态:已确认;具体实现差异仍须按工单变化规则处理 - 无需 UI 原型原因:本工单不改变用户界面 ## 文档影响 - [x] 更新 Project-Profile、Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations 和 Product-Requirements-Overview 中实际发生变化的页面 - [x] Wiki 先改、回读 revision,再同步核心镜像 - [ ] 不影响长期文档 ## 交付文档影响 - [x] 更新部署与运行文档,受众:开发、测试和运维 - [x] 需要用户做 MVP-0 人工验收 - [ ] 发布生产(明确不在本工单范围) ## 验收标准 - [x] 文本和图片各成功一次;pending/running/终态正确且终态停止轮询。 - [x] rendered_prompt、attempts、latency 或失败 error 字段完整。 - [x] 幂等、跨用户任务/文件、租约重领和旧 token CAS 逐项通过。 - [x] 400/401/策略拒绝与 429/5xx/超时/连接分类正确,MVP-0 不换家。 - [x] SSRF 全矩阵、API Key 密文 key_id、CSRF/session 和日志脱敏通过。 - [x] 图片鉴权访问、缩略图和文件原子落位通过。 - [x] 375/768/1024/1440 浏览器 E2E、键盘和 44px 目标通过。 - [x] 空 MySQL 8 up/down/up、Go build/vet/test、优雅退出和重启恢复通过。 - [x] Wiki、核心镜像、提交、任务归档和未验证项证据完整,工单停在待验收。 ## 验证方式 - `go build ./...` - `go vet ./...` - `go test -race ./...` - MySQL 8 全量迁移 up/down/up 与并发集成测试 - Playwright 全状态、多视口和跨用户 E2E - `python dev_scripts/harness.py check --strict` - `python -m unittest discover -s tests -v` - `python dev_scripts/harness.py sync --check` - `git diff --check` 未执行或因环境不足无法执行的验证必须如实回写,不得把预期结果记为通过。 ## 风险和回退 - 高风险:本工单覆盖数据库、安全、并发和完整用户流程;任何真实数据、真实额度或发布操作都必须停止并另行授权。 - 风险:本机环境与目标版本不符时不能降级验收标准,应回到环境工单处理。 - 回退:停止服务、使用已验证 down 回退隔离库、回退对应子工单提交;不对生产数据执行回退。 ## 实施与验证证据(2026-08-21) - 集成检查发现 `portal/main.go` 未接入已有 worker,按 #10 已确认设计建立并实施缺陷 #15;没有改变 UI、API、schema、状态机或 SSRF 边界。 - 实现与文档镜像提交:`1ad8dca9cf9d4ac671a17193435baf3326682f66`,已推送到 `origin/main`。 - MySQL 8.4.8 专用可丢弃库完成 `up → seed×2 → down -all → up → seed×2`;计数稳定为 1 用户、1 Provider、2 ProviderModel、2 Prompt,down 后业务表 0。最终专用库已撤权并删除,确认剩余数据库数 0;既有 `chorus_test` 未执行 down/drop。 - `go build ./...`、`go vet ./...`、`go test -race -count=1 -p=1 ./...` 全部通过。MySQL 集成覆盖文本/图片 mock 成功、rendered_prompt、attempt/latency、幂等、跨用户、租约重领、旧 token CAS、鉴权文件、原图/缩略图和原子落位。 - retryable 400/401/策略拒绝及 429/5xx/超时/连接、SSRF 矩阵、AES-GCM key_id、session/CSRF、日志/错误脱敏均包含在全量 race 测试并通过;没有调用真实 Provider。 - Playwright 四视口运行 8 项:5 项通过,3 项为“终态流程只在 desktop-small 运行”的预期跳过;四视口响应式主流程均通过,desktop-small 额外通过 pending/running、文本成功、图片成功、失败终态和终态停止轮询。 - 真实内嵌 worker 进程从隔离库认领 6 条 pending 并写终态;回环 Provider 在连接前被 SSRF 拦截。测试前后的两个 portal 前台进程均通过 `Ctrl+C` 干净退出。 - Harness strict、42 项 Python 测试、`git diff --check`、Wiki 回读和核心镜像一致性通过。 - Wiki revision:Project Profile `79ad76521eb7`;Architecture `b61f12999ae1`;Local Development `31d2d641a46d`;Deployment `80dac2704377`;Product Requirements `fa500788e6c0`。 - 未验证:真实 Linux/systemd/nginx、生产 TERM/重启、备份恢复、真实 Provider 和生产发布,均保持首次发布门禁,不宣称已上线。 - 清理遗留:命令策略拒绝递归删除仓库外 `D:\OPC\chorus-tools\e2e-13-current`;其中仅有本次临时 portal 可执行文件、构造图片和存储 metadata,无凭据且不在 Git。该目录不影响运行或验收,可人工删除。 ## 验收结论 - 用户于 2026-08-21 明确确认 #13 验收通过。 - 实现提交:`1ad8dca9cf9d4ac671a17193435baf3326682f66`;验收文档提交:`3b54d50`,均已推送到 `main`。 - 任务归档 revision:`166a0a72f28af482fee03fb76cbd4a7ad76c3622`。 - 工单已完成并关闭;MVP #4 仍等待单独验收。
Author
Owner

2026-08-21 集成检查发现:portal/worker 已实现,但 portal/main.go 未组装或运行 worker,真实提交会停留在 pending。该问题属于 #10 已确认行为的实现遗漏,已建立缺陷 #15 并关联本工单;#13 将在不放宽 SSRF、不调用真实上游的前提下,使用修复后的候选版本继续验收。

2026-08-21 集成检查发现:`portal/worker` 已实现,但 `portal/main.go` 未组装或运行 worker,真实提交会停留在 pending。该问题属于 #10 已确认行为的实现遗漏,已建立缺陷 #15 并关联本工单;#13 将在不放宽 SSRF、不调用真实上游的前提下,使用修复后的候选版本继续验收。
Author
Owner

任务归档已创建并在线回读:Task-13-完成-MVP-0-集成验收与运行闭环,revision 30fb4654f67c154ff44096cbd95db4fcc9c4d2c2。核心 Wiki 镜像 sync --check 通过;未导出 docs/task/。工单保持待验收。

任务归档已创建并在线回读:`Task-13-完成-MVP-0-集成验收与运行闭环`,revision `30fb4654f67c154ff44096cbd95db4fcc9c4d2c2`。核心 Wiki 镜像 `sync --check` 通过;未导出 `docs/task/`。工单保持待验收。
ila closed this issue 2026-08-21 14:07:55 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#13