Files
chorus/docs/09-product-requirements-overview.md
T

20 KiB
Raw Blame History

generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Product-Requirements-Overview wiki_url: https://git.ilapage.cn/OPC/chorus/wiki/Product-Requirements-Overview.- wiki_revision: d9a3bfa00c4ba24a5239e68e8fa28cc78641230e synchronized_at: 2026-08-21T09:03:56Z

产品需求总览

本页用途

本页是产品需求的统一导航入口,帮助项目负责人、Agent 和初级维护者快速回答:项目有哪些长期需求、当前状态是什么、详细规则和实施证据在哪里。

本页只保存稳定摘要、状态和链接,不复制完整工单、主题文档或聊天内容。需求详情仍在对应事实来源维护,避免形成两份不一致的正式需求。

事实来源边界

信息 唯一事实来源 本页怎样记录
项目目标、用户、范围和技术基线 Project-Profile 链接和一句话摘要
长期功能需求、业务规则和系统边界 对应 Wiki 主题页 需求领域和详情链接
单次实现范围、变化和验收标准 Gitea 单元任务工单 工单编号和当前状态
已完成方案、测试和遗留问题 Wiki 任务归档 验收入口
与版本绑定的原型、设计图或交互稿 Git 中的 design/ 或 prototypes/ 路径、版本和确认状态
外部原型 原型平台 链接、版本或确认日期;重要版本保留可追溯快照

不保存完整聊天记录、Agent 内部推理、密码、令牌、个人数据或生产数据。

当前需求索引

工单 #1 已完成长期技术基线整理和验收。项目由 Epic #3 统一跟踪;MVP-0 #4 已于 2026-08-21 验收完成。MVP-1 #19 的设计门禁已完成:技术设计 #16 已于 2026-08-21 验收通过;管理端原型 #17 的 prototypes/17/v1/index.html 已于 2026-08-21 通过用户验收,用户端原型 #18 的 prototypes/18/v1/index.html 已于 2026-08-21 通过用户验收。生产实现与集成验收单元工单已建立:#20~#28。#20 已于 2026-08-21 验收完成;#21~#28 待实施并按依赖顺序推进,其中 #28 负责以仓库外环境变量安全初始化管理员账号。当前已交付边界仍是 mock 验证的唯一 ProviderModel chat/images_edits 闭环。

需求领域 用户与场景 需求状态 MVP 详细说明 实施工单 设计证据
核心生成域与单上游 用户提交提示词/原图得到结果 已交付(#6~#10、#13、#15 已验收) MVP-0 #4 架构、业务规则 #6 迁移、#7 core、#8 platform、#9 queue、#10 worker 架构/数据/状态设计已确认
用户端生成页 种子用户登录并完成一次异步生成 已交付(#11~#13 已验收) MVP-0 #4 本页“用户端布局与状态” #11 portal 后端、#12 用户界面 原型设计 #2;prototypes/2/v1/index.html,2026-08-20 用户已确认
默认 prompt template 系统以数据配置而非硬编码合成提示词 已交付(#7/#13 已验收) MVP-0 #4 业务规则 #7 2026-08-20 已确认中性模板与 {{.UserPrompt}}
多 Provider 路由与故障转移 单上游故障时继续服务 已确认(#16 已验收,待实现) MVP-1 #19 架构、业务规则 #16 技术设计 #16 架构/API/数据/状态设计于 2026-08-21 已确认
管理端配置与记录 运营配置模型、路由池并排障 原型已确认(#17) MVP-1 #19 本页“管理端页面” #17 管理端原型 prototypes/17/v1/index.html,v1,2026-08-21 用户已确认
图片角色编辑 用户编辑 role_rule、角色、备注与顺序 原型已确认(#18) MVP-1 #19 业务规则“提示词与上传” #18 用户端原型 prototypes/18/v1/index.html,v1,2026-08-21 用户已确认
点数只读与发放 用户看余额、管理员发放留痕 已确认 MVP-2 业务规则“点数与范围” 待建 原型待确认
API Key 与程序调用 外部程序提交与查询任务 已确认 MVP-2 本页“程序化调用” 待建 API/权限设计
限流、保留期、公开注册 治理滥用和磁盘;决定是否开放用户获取 待确认(阈值/流程) MVP-2 或后续 业务规则“需要补充什么” 待建 安全/运维/认证设计

MVP 分期

原则:先完成可观测、可恢复、安全的单上游闭环,再增加可用性与运营能力,最后开放治理能力。前一期的验收门禁未通过,不进入下一期。

MVP-0:最小闭环

范围:

  1. 可逆迁移:users、providers、provider_models、prompt_templates、generations、generation_inputs、generation_outputs,含明确索引、外键和唯一约束。
  2. core 仅使用 GORM/标准库;platform 提供安全 HTTP、本地存储、缩略图和 AES-GCM 实现。
  3. chat 与 images_edits;唯一启用 ProviderModel,不做多家故障转移。
  4. SKIP LOCKED、lease owner/token/until、过期 running 原子重领、最终 CAS、attempt/error 落库。
  5. prompt_templates 提供已确认的默认配置;第一张图片自动 primary,其余 reference。
  6. portal 只提供受控种子用户登录、桌面双栏与移动单列、异步提交、HTMX 轮询和鉴权结果访问。
  7. worker 在 portal 内运行并优雅退出;配置使用可重复种子命令,自动测试连接 mock 上游。

MVP-0 非目标:

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

验收:

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

MVP-1:可用性与运营

汇总工单为 #19,设计门禁已完成,生产实现单元工单已建立并等待实施:

  • #16 路由、Provider、迁移、API、状态和测试设计(2026-08-21 验收通过);
  • #17 固定 go-admin/go-admin-ui 的 CRUD 与三个定制页原型(prototypes/17/v1/index.html,2026-08-21 用户验收通过);
  • #18 文生图、图片 role_rule/role/note/排序与历史无限滚动原型(prototypes/18/v1/index.html,2026-08-21 用户验收通过)。

稳定范围仍包括加权路由、gobreaker、最多 N 家故障转移、images/gemini、受审计有冷却的单次真实连通性测试和完整 retryable 测试。技术设计与两个原型均已确认;生产工单已按数据库、路由/worker、协议、安全管理端、portal 和集成验收拆分;新增 #28 以仓库外环境变量和显式 bootstrap 命令安全初始化管理员账号。执行须遵守各自依赖。

MVP-2:治理与开放

  • API Key/openapi、点数只读与发放账本;
  • 用户和 Provider 维度限流、配置审计;
  • 经确认的保留期与清理任务;
  • 移动端历史抽屉;
  • 公开注册只有在注册、验证、找回、反滥用和赠送策略单独确认后才进入范围,不能默认随 MVP-2 开放。

已锁定决策

  1. Go 重写,只迁移设计,不复用 cmhub Django 代码。
  2. 管理端来源固定为:
    • go-admin f06540883b41d03782bb6b2c4150f298f328c6b6
    • go-admin-ui 67d393d713877572fab0b897296a4c1d525fc81d
    • go-admin-doc 424855aacf6905f3fde860c3331385cb25529a0d
  3. go-admin-ui 实际是 Vue 3.5.41 + Element Plus 2.14.4 + Vue CLI 5.0.9,不按 Vue 2/Vite 设计。
  4. 生产表结构、sys_* 和菜单/API 种子全部经可逆 migrations;AutoMigrate 仅可在隔离可丢弃库作研究参考。
  5. 管理端代码生成采用“SQL → 隔离库 → 导表 → 预览/生成 → 人工审查 → 配置转可逆 SQL”;生产无 dev-tools。
  6. 用户端采用 html/template + HTMX + Alpine + Tailwind;不做 SPA。
  7. core 只依赖 GORM/标准库,gobreaker/imaging 在 platform。
  8. 不引入 Redis/MQ,使用 MySQL 8 SKIP LOCKED + token/CAS。
  9. 点数只读,不参与生成;管理员和终端用户分表。
  10. 生成同步提交不调用上游,所有上游调用只在 worker。
  11. api_type 和协议能力归 ProviderModel,不归 Provider。

用户端布局与状态

桌面(>=1024px)采用历史列表 + 主工作区双栏;平板可收窄历史区;MVP-0 手机使用单列顺序布局,不依赖尚未实现的抽屉。首屏必须能看到当前结果/状态和输入动作,固定元素不能遮住滚动内容。

MVP-0 导航只显示已实现的生成入口、必要账户操作和退出;点数/API Key 不显示空入口。图片区只显示上传顺序,第一张自动主体,其余参考,不展示不可用的角色/拖拽控件。

状态 必须呈现
首次/空历史 可直接开始的输入区和简洁空状态,不伪造示例结果
上传校验失败 对应文件、明确原因、修正方式;焦点到首个错误
pending “排队中”,可区分尚未执行
running “生成中”,轮询更新但布局不跳动
succeeded image 缩略图、查看/下载;原图访问经鉴权
succeeded text 可读文本和复制动作,复制结果有反馈
failed 脱敏错误、是否可重试的明确操作
轮询网络错误 保留当前内容,提示重试,不把任务误标 failed
认证过期 停止轮询,引导重新登录,登录后返回原上下文
历史到底 明确结束,不持续显示 loading

交互验收:

  • 375、768、1024px 和桌面宽屏均无不合理横向滚动、遮挡和文字溢出;
  • 交互目标至少 44×44px,输入有持久 label,错误不只靠颜色;正文对比度至少 4.5:1,非文本控件/焦点边界至少 3:1;
  • 图标按钮使用既有 Lucide/Element Plus 图标并有可访问名称;
  • 所有功能可键盘操作;MVP-1 拖拽提供上移/下移等价操作;
  • 路由/片段替换后管理焦点,状态更新使用合适的 aria-live,toast 不抢焦点;
  • 动效尊重 prefers-reduced-motion,loading 不造成布局位移;
  • 页面实现前必须完成版本化 HTML 原型并由用户确认状态、响应式、权限和异常覆盖。

管理端页面

代码生成基于固定 go-admin-ui 的既有表导入:

  • CRUD:providers、provider_models、prompt_templates、users;point_accounts/api_keys 到对应 MVP 再生成。
  • 定制页:路由池编排、Provider 健康、生成记录详情。
  • 标准 CRUD 可用一个明确复用固定 go-admin 视觉/交互的代表性原型覆盖同类页面;定制页分别覆盖加载、空、错误、权限和边界状态。
  • 生成记录默认不展示 API Key、完整敏感错误或不必要的真实用户输入。
  • 定制页数量明显超过三个时重新评估维护成本,但不以先前错误的前端版本判断作为依据。

Provider 连通性测试是明确的运营动作:保存配置后由授权管理员点击,发出一次最小低成本请求,显示脱敏结果,记录审计并限制冷却;它不是保存时自动触发,也不用于 CI。

程序化调用

MVP-2 的 API Key 存哈希、身份仍属于 users。提交、查询、幂等、错误码、限流和跨用户授权在独立 API 设计工单确认;浏览器 Cookie/CSRF 与 API Key 认证链不得混用。

明确不做

计费扣点、充值与支付回调、汇率、软件授权与设备绑定、内容审核、cmshopee 专用端点、每日生成配额。

风险与待定

  • 上传数量/大小/MIME/像素、超时/lease/worker、限流的生产值;
  • 首个真实 Provider/模型和连通性测试最小请求;
  • 生成物保留期、备份、磁盘告警、RPO/RTO;
  • 未来公开注册及账号验证/找回/反滥用流程;
  • 固定 go-admin 版本后续升级策略;升级必须重新审查生成器权限和技术栈,不能静默漂移。

登记规则

每一行代表一项长期需求或稳定需求领域,不代表一个普通 Bug。至少填写:

  • 清楚、稳定的需求名称;
  • 谁在什么场景下需要它;
  • 当前状态和所属版本、MVP 或发布范围;
  • 唯一的详细 Wiki 页面;
  • 当前或主要实施工单;
  • 原型状态或明确写“无”;
  • 已交付时的任务归档或验收入口。

需求正文、接口细节、业务规则和验收标准只在各自事实来源修改。本页使用一至两句话摘要并链接过去,不复制大段内容。

原型与设计资产

原型门禁

先选择最低成本、足以确认需求的设计证据:

修改类型 是否建单 原型或替代证据
纯界面显示文案,且不改变语义、流程、权限、状态、接口、高风险文字、国际化键、程序标识符、布局或可访问性 否 无原型,只做最小界面检查
现有界面的小范围样式或布局调整 是 标注截图、低保真图或明确复用的现有规范
新组件但沿用现有设计体系 是 组件状态和边界说明,按需提供低保真图
新页面、独立用户功能、重大交互或导航变化 是 Quant-UX 或其他工具制作并经用户确认的可审阅原型
后端、接口、数据或定时任务 是 架构、API、数据、状态或流程设计,不强制 UI 原型
恢复既有确认行为的 Bug 是 原设计、截图、复现步骤或已有验收证据

“文字豁免”只指用户看到的显示文案,不包括代码组件名、类名、变量、API 字段、数据库字段或国际化键。任何条件不明确时都要建单。

新增页面、独立用户功能、重大交互或导航变化的顺序固定为:确认文字需求 → 制作可审阅原型 → 用户确认原型和覆盖范围 → 建立或放行实现工单 → 编写生产代码。原型发生影响页面结构、主要流程、状态、权限、异常处理或验收结果的变化时,必须重新确认。

本地 HTML 审核快照

需要完整原型门禁的新页面、独立用户功能、重大交互或导航变化,在用户审核前把 Quant-UX 或等效设计源的待审核版本生成到 prototypes/<工单号>/<版本>/index.html。版本目录内的资源使用相对路径,快照应在本地可浏览;如果必须启动静态服务,在工单记录最小启动命令。可编辑设计源仍以原设计工具为准,Git HTML 是不可覆盖的版本化审核证据,Wiki 和工单负责索引。

已确认快照不得原位覆盖。页面结构、流程、状态、权限、异常处理或验收结果变化时创建新版本目录、重新导出并重新确认。审核前检查页面、交互和资源完整性,并删除凭据、账号、个人信息和生产数据。纯显示文案、小范围 UI、非 UI 需求和恢复既有行为的 Bug 不强制生成 HTML。

设计工具无法生成可用 HTML 时,工单记录限制并停止审核,等待用户确认等效的本地可浏览方案;不能把难以访问的线上链接直接当作已确认原型。

原型确认记录

原型或替代设计证据至少记录链接/路径、版本/revision或确认日期、状态、确认人、确认时间和覆盖范围。外部原型需要保留可追溯版本;重要已确认版本按需保存快照。没有 UI 原型时,记录采用的技术设计或无需原型的原因。

  • 与代码版本绑定的图片、HTML 交互稿和设计源文件放入 Git 的 design/ 或 prototypes/,不要手工放入 Wiki 镜像目录 docs/。
  • #17 管理端运营原型:prototypes/17/v1/index.html,v1,2026-08-21,状态“已确认”;由用户于 2026-08-21 验收通过,覆盖四类标准 CRUD、路由池编排、Provider 健康/主动探测、生成记录详情,以及加载、空、错误、无权限和边界状态。
  • #18 用户端增强原型:prototypes/18/v1/index.html,v1,2026-08-21,状态“已确认”;由用户于 2026-08-21 验收通过,覆盖文生图、图片编辑、role_rule 覆盖、每图 role/note/order、键盘排序与历史增量加载/失败恢复/到底状态。
  • 外部 Figma 等原型记录可访问链接、版本或确认日期、负责人和适用需求;重要的已确认版本保留可追溯快照。
  • 原型必须标记“草稿、已确认、已废弃”之一。草稿不能作为正式实现依据;已废弃原型保留状态和替代入口,不让 Agent 误用。
  • 原型只表达界面和交互意图,不能代替文字业务规则、安全边界、异常处理和验收标准。
  • 没有原型时写“无”和原因,不创建空图片、空目录或占位原型。
  • 原型包含账号、个人信息或生产数据时必须先脱敏;凭据不得进入原型或截图。

状态规则

需求状态使用:待确认、已确认、开发中、待验收、已交付、已停止。

  • 方案未确认时为“待确认”;用户确认后才能进入“已确认”。
  • 开始执行单元任务后为“开发中”;实现完成并等待用户确认时为“待验收”。
  • 用户明确验收后改为“已交付”。
  • 需求取消或被替代时改为“已停止”,并链接原因和替代需求,不删除历史记录。
  • 一个需求领域包含多个任务时,以尚未完成的关键任务决定状态,并在状态中简短说明。

更新时机

以下情况必须更新本页:

  1. 用户确认新的长期产品需求或新需求领域;
  2. 需求进入开发、待验收、已交付或已停止;
  3. 需求的正式 Wiki、主要工单、原型或验收入口变化;
  4. 原型从草稿变为已确认或已废弃;
  5. MVP、版本范围或用户场景发生变化。

普通内部重构、小缺陷和不改变长期能力的任务只保留在工单,不必进入本页。

最小验收清单

  • 新成员能从本页找到每项长期需求的详细说明。
  • 状态与相关 Gitea 工单一致。
  • 每项已交付需求具有验收入口。
  • 原型具有路径或链接、版本和确认状态,或者明确写“无”。
  • 本页没有复制完整工单或主题文档。
  • 草稿原型没有被描述为正式需求。
  • 不包含凭据、个人数据或生产数据。