Clone
57
Product-Requirements-Overview
ila edited this page 2026-08-29 21:42:42 +08:00
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.

产品需求总览

2026-08-22 范围变更:完全移除用户点数

用户已确认完全移除用户点数。数据库、接口、生成链路、管理端和用户端均不包含点数、余额、扣费、退款、充值、发放或配额;未来确需增加时必须建立新 Epic 并重新确认。设计变更工单 #31 与快照 prototypes/31/v1/index.html 已于 2026-08-22 经用户验收;#24 的设计门禁已解除,可按确认范围恢复实施。

本页用途

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

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

事实来源边界

信息 唯一事实来源 本页怎样记录
项目目标、用户、范围和技术基线 Project-Profile 链接和一句话摘要
长期功能需求、业务规则和系统边界 对应 Wiki 主题页 需求领域和详情链接
单次实现范围、变化和验收标准 Gitea 单元任务工单 工单编号和当前状态
已完成方案、测试、提交和遗留问题 Gitea 单元任务工单 验收入口
与版本绑定的原型、设计图或交互稿 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、#21、#22、#23 和 #28 已于 2026-08-21~2026-08-22 验收完成;#24 已于 2026-08-22 验收交付;#25 已于 2026-08-23 验收交付;#26 已于 2026-08-23 通过用户验收;#27 及集成验收发现的 #32、#33、#34 已于 2026-08-24 通过用户验收;MVP-1 已于 2026-08-24 通过汇总工单 #19 的用户验收。其中 #23 已交付管理 API 基线;#24 按 #30 风险决策改为明文凭据与单条回显,并完成固定 go-admin-ui 页面、Casbin/菜单集成、脱敏审计和默认禁用的连通性探测门禁;portal 的 MVP-1 提交契约与游标已由 #25 验收交付,用户页面已由 #26 于 2026-08-23 验收交付。

需求领域 用户与场景 需求状态 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 路由与故障转移 单上游故障时继续服务 已交付(#27 已验收) MVP-1 #19 架构、业务规则 #16 技术设计 #16 架构/API/数据/状态设计于 2026-08-21 已确认
管理端配置与记录 运营配置模型、路由池并排障 已交付(#24 已验收) MVP-1 #19 本页“管理端页面” #17 管理端原型 prototypes/17/v1/index.html,v1,2026-08-21 用户已确认
图片角色编辑 用户编辑 role_rule、角色、备注与顺序 后端与页面均已交付(#25、#26 已验收) MVP-1 #19 业务规则“提示词与上传” #18 用户端原型 prototypes/18/v1/index.html,v1,2026-08-21 用户已确认
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 策略覆盖。
  • Provider Key 按当前已确认风险决策保存;列表、日志和普通响应不含完整值,单条读取禁止缓存;浏览器写请求有 CSRF,会话安全。
  • 图片输出通过鉴权访问且有缩略图;文件原子落位。
  • 375/768/1024/1440 无主区域横向滚动,所有主要操作可用键盘和 44px 触控目标完成。
  • 迁移在空 MySQL 8 完成 up/down/up;Go 构建、vet、测试和浏览器 E2E 通过。

MVP-1:可用性与运营

汇总工单为 #19,设计门禁与 #20~#26、#28 的单元验收已完成;#27 集成验收及其发现的 #32~#34 已于 2026-08-24 通过用户验收;MVP-1 已于 2026-08-24 通过 #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 命令安全初始化管理员账号。#27 已在隔离 MySQL 8 与 mock 上游覆盖 images、images_edits、gemini 全链路,并完成管理端与 portal 浏览器回归;未获单独授权,因此没有调用真实 Provider。

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;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 页面;
  • 当前或主要实施工单;
  • 原型状态或明确写“无”;
  • 已交付时的 Gitea 工单与验收入口。

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

原型与设计资产

原型门禁

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

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

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

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

线上原型与按需 HTML 快照

需要完整原型门禁的新页面、独立用户功能、重大交互或导航变化,默认直接通过 Quant-UX 或等效设计工具的线上版本审核。可编辑设计源仍以原设计工具为准,工单记录可访问链接、版本/revision、复制版本或确认日期、审核版本识别方式、确认人、确认时间和覆盖范围。

线上链接无法访问或无法区分审核版本时停止审核,等待用户确认等效方案;不能为了节省时间把不稳定链接直接当作已确认原型。页面结构、流程、状态、权限、异常处理或验收结果变化时更新线上版本并重新确认。

只有用户明确要求 导出原型 #N、导出全部原型,或项目专用规则要求离线交付时,才把确认版本导出到 prototypes/<工单号>/<版本>/index.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、键盘排序与历史增量加载/失败恢复/到底状态。
  • 外部 Quant-UX、Figma 等原型记录可访问链接、审核版本识别方式、负责人和适用需求;只有用户或项目专用规则明确要求时才保存本地快照。
  • 原型必须标记“草稿、已确认、已废弃”之一。草稿不能作为正式实现依据;已废弃原型保留状态和替代入口,不让 Agent 误用。
  • 原型只表达界面和交互意图,不能代替文字业务规则、安全边界、异常处理和验收标准。
  • 没有原型时写“无”和原因,不创建空图片、空目录或占位原型。
  • 原型包含账号、个人信息或生产数据时必须先脱敏;凭据不得进入原型或截图。

状态规则

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

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

更新时机

以下情况必须更新本页:

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

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

最小验收清单

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

2026-08-22 Provider 凭据需求变更

用户在获知明文存储和回显风险后明确接受风险:Provider API Key 保存后允许管理员在单个 Provider 编辑页主动查看和隐藏,目标存储形式改为明文。列表仍只展示是否已配置,不批量读取完整密钥;读取失败、无权限、加载和无凭据状态必须可恢复且可访问。

设计变更由 #30 跟踪,新快照 prototypes/30/v1/index.html 已于 2026-08-22 通过用户验收。原 #17 v1 的“API Key 只写不可回显”部分被本变更取代,其余管理端设计继续有效。原型确认门禁已通过;#24 已按本节边界完成生产存储、接口和管理页面并通过验收。

#24 管理端交付状态(2026-08-22,已验收)

固定 go-admin-ui 已导入仓库并实现 Provider、ProviderModel、PromptTemplate、Users CRUD,以及路由池、Provider 健康/主动探测和生成详情页面。Provider Key 按 #30 明文落库并仅在单条页面主动回显;用户页按 #31 完全移除点数、余额和配额。实现已通过 Go build/vet/test、前端 lint/32 个单测/生产构建、MySQL 8 migration up/down/up、管理 API 集成测试和真实账号密码/菜单/API 联调;浏览器实例不可用,未生成生产页面自动化截图,用户于 2026-08-22 完成人工验收并确认 #24 通过。

#25 portal 提交契约交付状态(2026-08-23,已验收)

portal 已按 #16/#18 实现活动路由与模板快照、image_generate/image_edit metadata、一一对应的图片角色备注、固定 Prompt 覆盖顺序,以及 user_id 作用域的 HMAC 游标历史。实现不调用上游,不包含用户点数,也不改变登录和页面交互;后者继续由 #26 负责。实现已通过 Go build/vet/test/race 和本机 MySQL 8.4.8 隔离集成测试,用户于 2026-08-23 明确确认 #25 验收通过。

#26 portal 用户界面交付状态(2026-08-23,已验收)

portal 已按 #18 v1 原型实现文生图与图片编辑切换、role_rule、每图 primary/reference 角色、备注、拖动及键盘等价排序、Prompt 构成说明,以及基于 #25 HMAC 游标的历史无限加载。提交继续保持同步落库且不调用上游,不包含用户点数。候选已通过前端生产构建、Go build/vet/test/race、本机 MySQL 8.4.8 隔离集成,以及 375/768/1024/1440 Playwright E2E;浏览器覆盖提交、角色顺序与备注落库、增量历史失败恢复、终态、认证失效、44px 目标、reduced-motion 和无横向溢出。#26 已于 2026-08-23 通过用户验收;MVP-1 跨模块集成验收由 #27 收口。

#27 MVP-1 集成验收状态(2026-08-24,已验收)

#27 已使用 admin/config/settings.yml 只读派生的固定隔离库 chorus_test,完成 MVP-0 数据 up/down/up、根模块和 admin 模块 build/vet/test、worker race、admin-ui 正式构建与 Chromium 登录、portal 多视口 Playwright、Harness 严格检查。新增 MySQL + mock worker 覆盖 images、images_edits、gemini,并核对 generation、attempt、output、对象归属、权限和敏感信息边界。集成验收发现的 admin-ui 验证码残留 #32、生产 runtime 缺失 #33、SCSS 运行时导入白屏 #34 均已单独建单、最小修复并通过回归,于 2026-08-24 与 #27 一并通过用户验收。MVP-1 已于 2026-08-24 通过 #19 汇总验收。未调用真实 Provider;该项只有在用户单独授权后才能执行。

#19 MVP-1 汇总验收状态(2026-08-24,已验收)

MVP-1 的设计、生产实现、变更工单和跨模块集成验收均已完成;用户于 2026-08-24 明确确认 #19 验收通过。交付范围包括多 Provider 路由/熔断/故障转移、多协议 mock 链路、运营管理端、portal 图片角色编辑与历史体验。真实 Provider 连通性仍未执行,后续如需验证必须单独授权。

MVP-2 API 开放与治理(2026-08-24,设计与原型已确认)

用户已确认 MVP-2 面向现有受控用户交付安全的 API Key、OpenAPI 生成接口、用户/API Key/Provider 限流、审计和必要的用户端/管理端页面;不开放注册,不实施自动数据删除,不增加计费、点数或每日配额。汇总工单为 #35。用户于 2026-08-24 验收通过技术设计 #36 和界面原型 #37;已确认快照为 prototypes/37/v1/index.html。

生产实现拆单门禁已经解除,但功能尚未实现或交付。下一步按 #36 的认证、API、数据、限流、审计和迁移设计,以及 #37 v1 的页面结构、权限、流程和异常状态,建立生产实现单元工单并按依赖顺序实施。

用户端仅账号登录(#50)

用户于 2026-08-24 确认终端用户 Portal 直接停用邮箱登录,只保留独立账号和密码。users.username 是规范化后唯一的登录标识,历史用户迁移为 user_<id>;邮箱继续作为资料显示但不参与认证。不开放注册、找回密码、账号自助修改或管理员/终端用户凭据复用。

MVP-2 集成验收完成状态(2026-08-25)

MVP-2 的 API Key、OpenAPI v1、三维限流、安全审计、Portal 页面和管理页面已完成单元交付,#47 已执行跨模块集成验收,已于 2026-08-25 通过人工验收。范围仍不包含公开注册、自动数据删除、计费、点数、余额或每日配额。

集成验收使用可丢弃 MySQL 8 chorus_test、构造用户、构造文件和 mock Provider,覆盖迁移 up/down/up、数据库哈希与一次性 Key 回显、撤销立即生效、OpenAPI 鉴权/幂等/越权、429 与 Retry-After、Provider 延后队列、审计脱敏、管理员治理和四视口 Portal E2E。未调用真实 Provider,也未使用生产或真实用户数据。

验收发现并修复两个阻塞缺陷:#52 统一首次与重复管理撤销的数据库时间精度;#53 按外键顺序清理 Portal E2E 产生的安全审计。两项均已提交并通过人工验收。 MVP-2 父工单 #35 仍等待用户单独确认后关闭;本节只记录 #47 跨模块集成验收及其缺陷 #52、#53 已通过。

生成记录耗时与信息边界(#65)

  • Portal 生成历史以“状态 · 耗时 · 相对时间”展示:终态显示固定总耗时,pending 显示实时已等待,running 显示实时已用时;当前结果头部采用相同口径。
  • Portal 图片结果显示格式、分辨率和文件大小。终端用户侧不展示 Provider、模型、attempt、内部错误码或渲染 Prompt。
  • Admin 生成记录默认只显示全宽列表;双击记录或点击“查看”后从右侧抽屉显示详情,桌面约占 45%,窄屏接近全宽,关闭后不保留空详情区域。列表显示用户账号、中文生成类型、总耗时和创建时间;详情派生总耗时、排队耗时、处理耗时与 Provider 上游耗时,并显示提交、开始、完成的本地时间。
  • Admin 时间线把 lease、本地限流等标记为系统事件,不占 Provider 尝试序号;Provider 尝试显示持久化序号、Provider/模型名称、单次耗时和状态。
  • 旧记录的缺失、畸形或逆序时间采用安全兜底,不显示负耗时,也不导致页面异常。耗时只从既有时间戳和 latency_ms 派生,不持久化重复字段。

管理员创建受控终端用户(#73)

为减少日常通过 seed 或数据库建号的操作,管理端增加受控终端用户创建和密码重置能力;Portal 继续不开放注册、找回密码或邮件验证。该能力复用现有终端用户页和对话框规范,保持管理员与终端用户分表,创建与密码重置受 JWT/Casbin 保护并写脱敏审计。工单 #73 已于 2026-08-28 通过用户验收并交付。

Portal 可控自助注册(#75 / #76,2026-08-29)

Portal 在现有受控用户模式上增加可由管理员开关的账号自助注册。迁移后的默认状态是关闭;关闭时登录页不显示注册入口,注册页返回 404,注册接口返回 403。管理员在“用户与访问 → 终端用户”开启后,访客可使用账号、昵称、密码和密码确认注册,不要求邮箱;注册成功立即建立 Portal 会话。密码长度统一为 6–1024 个 Unicode 字符。

该开关只影响访客自助注册,不影响已有终端用户登录,也不影响管理员创建、停用或重置终端用户密码。项目仍不开放邮箱登录,不合并管理员与终端用户账号表,不增加计费、点数、每日配额或公开用户目录。注册页面和管理开关沿用 #78 v1 原型;生产候选实现由 #79–#83 交付并等待用户集成验收。