mvp: MVP-0 单上游安全异步生成闭环 #4

Closed
opened 2026-08-20 16:41:43 +08:00 by ila · 6 comments
Owner

基本信息

  • 类型:MVP
  • 所属 Epic:#3
  • 阶段:已完成
  • 原始需求来源:用户对话与 Product-Requirements-Overview
  • 建立时间:2026-08-20

MVP 目标

受控种子用户能够登录 portal,提交文本或带图片的生成请求,立即看到排队状态;portal 内 worker 使用唯一启用的 ProviderModel 异步执行,用户可持续查看状态并通过鉴权访问文本或图片结果。系统具备最小但完整的安全、幂等、租约恢复、错误分类、持久化和响应式体验。

包含范围

  • 可逆迁移:users、providers、provider_models、prompt_templates、generations、generation_inputs、generation_outputs,含索引、外键和唯一约束。
  • core 只使用 GORM/标准库;platform 提供 SSRF 安全 HTTP、本地存储、缩略图和 AES-GCM。
  • chat、images_edits 和唯一启用 ProviderModel;默认 Prompt 模板使用已确认的 {{.UserPrompt}} 规则。
  • MySQL 8 SKIP LOCKED、lease owner/token/until、过期 running 原子重领、最终 CAS、attempt/error 落库。
  • 种子用户登录、桌面双栏/手机单列、异步提交、HTMX 轮询和鉴权结果访问。
  • portal 内 worker、优雅退出、可重复种子命令和 mock 上游自动测试。

排除范围

  • 公开注册、找回密码、邮件验证、点数和 API Key 导航/功能。
  • 图片角色/备注编辑、拖拽排序、历史无限滚动和移动抽屉。
  • 多 Provider、熔断、故障转移、images、gemini。
  • go-admin/admin-ui、限流、清理任务和真实上游反复试错。

阶段与单元任务

  • #2 制作 MVP-0 用户端生成页原型(2026-08-20 验收通过)
  • #5 chore: 准备 MVP-0 可复现开发与测试环境(2026-08-21 验收通过)
  • #6 feat: 初始化 Go 项目骨架与可逆数据库迁移(2026-08-21 验收通过)
  • #7 feat: 实现核心领域模型与 Prompt 渲染(2026-08-21 验收通过)
  • #8 feat: 实现 SSRF 安全 HTTP、密钥加密与本地存储(2026-08-21 验收通过)
  • #9 feat: 实现 MySQL 租约队列与 CAS 状态机(2026-08-21 验收通过)
  • #10 feat: 实现 Provider 协议、mock 上游与内嵌 worker(2026-08-21 验收通过)
  • #11 feat: 实现 portal 认证、异步提交与鉴权查询(2026-08-21 验收通过)
  • #12 feat: 按确认原型实现 portal 用户界面(2026-08-21 验收通过)
  • #13 test: 完成 MVP-0 集成验收与运行闭环(2026-08-21 验收通过)
  • #15 fix: 将现有 worker 接入 portal 运行与优雅退出(2026-08-21 验收通过)
  • #14 feat: 增加 Windows 本地开发启动脚本(2026-08-21 验收通过)

生产实现已拆分为上述单元任务;严格按前置依赖实施,最终由集成验收工单汇总,不在父工单复制子任务过程。

集成风险和回退

  • 设计未确认前不得启动 portal 生产实现;#2 是用户端实现门禁。
  • 租约时长、上传阈值、首个 Provider/模型等未确认生产值必须保持配置门禁,不得猜测上线。
  • SSRF、密钥、跨用户访问和 CAS 属于高风险边界,各自在单元工单和集成验收中保留专项测试。
  • 任一子任务失败时只回退对应提交和经验证的 down 迁移,不以 AutoMigrate 修补生产表。

MVP 验收标准

  • 文本和图片各成功一次;pending、running 和终态界面正确,终态停止轮询。
  • rendered_prompt、attempts、latency 或失败 error 字段完整。
  • 相同用户幂等重放不创建第二条任务,不同用户不可读取对方任务或文件。
  • 过期 running 被新 token 原子重领,旧 worker 最终写入影响 0 行。
  • 400/401/策略拒绝立即失败;429/5xx/超时/连接错误分类正确。
  • 私网、IPv6、redirect、代理和恶意结果 URL 被 SSRF 策略覆盖。
  • Provider API Key 密文含 key_id,日志和响应无明文;浏览器写请求有 CSRF,会话安全。
  • 图片输出通过鉴权访问且有缩略图,文件原子落位。
  • 375、768、1024 和桌面宽屏无主区域横向滚动,主要操作支持键盘和 44px 触控目标。
  • 空 MySQL 8 完成 up/down/up;Go 构建、vet、测试和浏览器 E2E 通过。
  • 全部单元任务经用户验收后,完成一次独立 MVP-0 集成验收再关闭本工单。

MVP 验收结论

  • 用户于 2026-08-21 明确确认 #4 验收通过。
  • #2、#5~#15 中属于 MVP-0 的设计、环境、实现、启动脚本、缺陷修复和独立集成验收均已逐项验收。
  • 用户在验收前已知并确认当前边界:MVP-0 具备唯一 ProviderModel 的 chat/images_edits 调用与 mock 验证,但不包含真实 Provider/API Key 的受支持配置入口、管理页面、多 Provider 故障转移或文生图 images;这些不作为本次验收失败项。
  • 实现基线提交 1ad8dca9cf9d4ac671a17193435baf3326682f66,#13/#15 验收文档提交 3b54d50,均已推送到 main。
  • MVP-0 验收通过后仅关闭 #4;Epic #3 保持开启,后续范围必须另建并确认 MVP/单元工单。
  • 验收文档提交:cf84168;任务归档 revision:3ae5376eecec0e5257cbbe134405ba3f5c4d5ee5。
## 基本信息 - 类型:MVP - 所属 Epic:#3 - 阶段:已完成 - 原始需求来源:用户对话与 Product-Requirements-Overview - 建立时间:2026-08-20 ## MVP 目标 受控种子用户能够登录 portal,提交文本或带图片的生成请求,立即看到排队状态;portal 内 worker 使用唯一启用的 ProviderModel 异步执行,用户可持续查看状态并通过鉴权访问文本或图片结果。系统具备最小但完整的安全、幂等、租约恢复、错误分类、持久化和响应式体验。 ## 包含范围 - 可逆迁移:`users`、`providers`、`provider_models`、`prompt_templates`、`generations`、`generation_inputs`、`generation_outputs`,含索引、外键和唯一约束。 - core 只使用 GORM/标准库;platform 提供 SSRF 安全 HTTP、本地存储、缩略图和 AES-GCM。 - `chat`、`images_edits` 和唯一启用 ProviderModel;默认 Prompt 模板使用已确认的 `{{.UserPrompt}}` 规则。 - MySQL 8 SKIP LOCKED、lease owner/token/until、过期 running 原子重领、最终 CAS、attempt/error 落库。 - 种子用户登录、桌面双栏/手机单列、异步提交、HTMX 轮询和鉴权结果访问。 - portal 内 worker、优雅退出、可重复种子命令和 mock 上游自动测试。 ## 排除范围 - 公开注册、找回密码、邮件验证、点数和 API Key 导航/功能。 - 图片角色/备注编辑、拖拽排序、历史无限滚动和移动抽屉。 - 多 Provider、熔断、故障转移、`images`、`gemini`。 - go-admin/admin-ui、限流、清理任务和真实上游反复试错。 ## 阶段与单元任务 - [x] #2 制作 MVP-0 用户端生成页原型(2026-08-20 验收通过) - [x] #5 chore: 准备 MVP-0 可复现开发与测试环境(2026-08-21 验收通过) - [x] #6 feat: 初始化 Go 项目骨架与可逆数据库迁移(2026-08-21 验收通过) - [x] #7 feat: 实现核心领域模型与 Prompt 渲染(2026-08-21 验收通过) - [x] #8 feat: 实现 SSRF 安全 HTTP、密钥加密与本地存储(2026-08-21 验收通过) - [x] #9 feat: 实现 MySQL 租约队列与 CAS 状态机(2026-08-21 验收通过) - [x] #10 feat: 实现 Provider 协议、mock 上游与内嵌 worker(2026-08-21 验收通过) - [x] #11 feat: 实现 portal 认证、异步提交与鉴权查询(2026-08-21 验收通过) - [x] #12 feat: 按确认原型实现 portal 用户界面(2026-08-21 验收通过) - [x] #13 test: 完成 MVP-0 集成验收与运行闭环(2026-08-21 验收通过) - [x] #15 fix: 将现有 worker 接入 portal 运行与优雅退出(2026-08-21 验收通过) - [x] #14 feat: 增加 Windows 本地开发启动脚本(2026-08-21 验收通过) 生产实现已拆分为上述单元任务;严格按前置依赖实施,最终由集成验收工单汇总,不在父工单复制子任务过程。 ## 集成风险和回退 - 设计未确认前不得启动 portal 生产实现;#2 是用户端实现门禁。 - 租约时长、上传阈值、首个 Provider/模型等未确认生产值必须保持配置门禁,不得猜测上线。 - SSRF、密钥、跨用户访问和 CAS 属于高风险边界,各自在单元工单和集成验收中保留专项测试。 - 任一子任务失败时只回退对应提交和经验证的 down 迁移,不以 AutoMigrate 修补生产表。 ## MVP 验收标准 - [x] 文本和图片各成功一次;pending、running 和终态界面正确,终态停止轮询。 - [x] `rendered_prompt`、`attempts`、latency 或失败 error 字段完整。 - [x] 相同用户幂等重放不创建第二条任务,不同用户不可读取对方任务或文件。 - [x] 过期 running 被新 token 原子重领,旧 worker 最终写入影响 0 行。 - [x] 400/401/策略拒绝立即失败;429/5xx/超时/连接错误分类正确。 - [x] 私网、IPv6、redirect、代理和恶意结果 URL 被 SSRF 策略覆盖。 - [x] Provider API Key 密文含 key_id,日志和响应无明文;浏览器写请求有 CSRF,会话安全。 - [x] 图片输出通过鉴权访问且有缩略图,文件原子落位。 - [x] 375、768、1024 和桌面宽屏无主区域横向滚动,主要操作支持键盘和 44px 触控目标。 - [x] 空 MySQL 8 完成 up/down/up;Go 构建、vet、测试和浏览器 E2E 通过。 - [x] 全部单元任务经用户验收后,完成一次独立 MVP-0 集成验收再关闭本工单。 ## MVP 验收结论 - 用户于 2026-08-21 明确确认 #4 验收通过。 - #2、#5~#15 中属于 MVP-0 的设计、环境、实现、启动脚本、缺陷修复和独立集成验收均已逐项验收。 - 用户在验收前已知并确认当前边界:MVP-0 具备唯一 ProviderModel 的 `chat`/`images_edits` 调用与 mock 验证,但不包含真实 Provider/API Key 的受支持配置入口、管理页面、多 Provider 故障转移或文生图 `images`;这些不作为本次验收失败项。 - 实现基线提交 `1ad8dca9cf9d4ac671a17193435baf3326682f66`,#13/#15 验收文档提交 `3b54d50`,均已推送到 `main`。 - MVP-0 验收通过后仅关闭 #4;Epic #3 保持开启,后续范围必须另建并确认 MVP/单元工单。 - 验收文档提交:`cf84168`;任务归档 revision:`3ae5376eecec0e5257cbbe134405ba3f5c4d5ee5`。
Author
Owner

层级初始化证据:

  • 所属 Epic:#3
  • 当前单元任务:#2(用户端原型设计,待确认)
  • Product-Requirements-Overview Wiki revision:7f387b9eb3c6bbd993028974271ca515156cfdcc
  • 核心镜像提交并推送:fc471f426e2d10d107878cc31275d3b77ec57109
层级初始化证据: - 所属 Epic:#3 - 当前单元任务:#2(用户端原型设计,待确认) - Product-Requirements-Overview Wiki revision:`7f387b9eb3c6bbd993028974271ca515156cfdcc` - 核心镜像提交并推送:`fc471f426e2d10d107878cc31275d3b77ec57109`
Author
Owner

子任务进度:#2 已完成 v1 原型、测试、提交和 Wiki 归档,当前为“待验收”。MVP-0 清单保持未勾选,待用户明确验收 #2 后再同步。

子任务进度:#2 已完成 v1 原型、测试、提交和 Wiki 归档,当前为“待验收”。MVP-0 清单保持未勾选,待用户明确验收 #2 后再同步。
Author
Owner

#2 已于 2026-08-20 通过用户验收并关闭,清单已勾选。确认版本为 prototypes/2/v1/index.html;后续 portal 生产实现必须另建单元工单,不在 #2 中继续修改。

#2 已于 2026-08-20 通过用户验收并关闭,清单已勾选。确认版本为 `prototypes/2/v1/index.html`;后续 portal 生产实现必须另建单元工单,不在 #2 中继续修改。
Author
Owner

生产实现拆分已完成:

  • 单元工单:#5–#13,均已登记到本工单清单。
  • 环境门禁:#5 保持“待确认”,执行前需确认本机安装或容器路线。
  • 生产代码:尚未开始;#6–#13 受各自前置依赖约束。
  • Product-Requirements-Overview revision:54272b7b209f07a314db23be1de81f16aca63f3b
  • 核心镜像提交:23d53f4a0ebbb6621e80282db431b3f04f6de130,已推送 main
  • 验证:严格 Harness、42 个单元测试、16 个核心 Wiki 映射和 git diff --check 均通过。
  • 本次仅建单和同步索引,不创建任务归档,不导出 docs/task/。
生产实现拆分已完成: - 单元工单:#5–#13,均已登记到本工单清单。 - 环境门禁:#5 保持“待确认”,执行前需确认本机安装或容器路线。 - 生产代码:尚未开始;#6–#13 受各自前置依赖约束。 - Product-Requirements-Overview revision:`54272b7b209f07a314db23be1de81f16aca63f3b` - 核心镜像提交:`23d53f4a0ebbb6621e80282db431b3f04f6de130`,已推送 `main` - 验证:严格 Harness、42 个单元测试、16 个核心 Wiki 映射和 `git diff --check` 均通过。 - 本次仅建单和同步索引,不创建任务归档,不导出 `docs/task/`。
Author
Owner

MVP-0 集成候选已完成:#13 与执行中发现的组合根修复 #15 均已实现、测试、提交、推送并归档,目前等待用户验收。父工单清单保持未勾选,不关闭 MVP。

MVP-0 集成候选已完成:#13 与执行中发现的组合根修复 #15 均已实现、测试、提交、推送并归档,目前等待用户验收。父工单清单保持未勾选,不关闭 MVP。
Author
Owner

用户已于 2026-08-21 验收 #13 和 #15。MVP-0 全部子工单与独立集成验收现已通过,清单已同步;父工单 #4 保持开启,等待用户单独确认 MVP-0 最终验收。

用户已于 2026-08-21 验收 #13 和 #15。MVP-0 全部子工单与独立集成验收现已通过,清单已同步;父工单 #4 保持开启,等待用户单独确认 MVP-0 最终验收。
ila closed this issue 2026-08-21 14:18:21 +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#4