# Dada 产品需求文档

| 项目 | 内容 |
| --- | --- |
| 产品代号 | Dada |
| 文档类型 | 产品需求文档（PRD） |
| 文档版本 | 1.10 |
| 文档状态 | P0-A 本机测试需求冻结稿 |
| 更新日期 | 2026-07-24 |
| 首发形态 | P0-A 仅在项目方当前 Windows 电脑上以 localhost 单机运行并验收；P0-B 为与公司系统合并后的远程受控内测 |
| 当前交付范围 | 仅 P0-A；P0-B 只保留未来开放门槛和不可弱化约束，不属于当前开发交付 |
| 首发语言 | 简体中文 |

## 1. 文档定位

本文件定义 Dada 第一阶段产品的目标、范围、用户流程、功能要求、业务规则、产品数据契约、异常状态和验收标准。

本文件不包含：

- 技术架构、框架、数据库和部署方案；
- UI 配色、视觉规范和页面高保真设计；
- TDD、详细测试用例、开发排期和任务拆分；
- 任何 API 密钥、访问令牌或其他凭据。

后续文档分别为 FeatureSummary.md、DevelopmentPlan、UIDesign.md、tdd.md 和 tasks.md。若后续文档与本 PRD 冲突，以本 PRD 的产品范围和业务规则为准，除非本 PRD 正式升版。

后续文档不得把 P0-A 描述为云端保存、对象存储、跨设备继续处理、手机访问或任一设备再次下载。P0-A 统一使用“本地后端保存”“同机访问”和“同机再次下载”等阶段准确措辞。FeatureSummary.md 与 DevelopmentPlan.md 必须声明其输入 PRD 版本；PRD 升版后，两份下游文档在重新同步并冻结前不得作为开发或设计基准。

## 2. 产品概述

### 2.1 产品目标

Dada 是一个面向小红书内容创作者的图片创作工具。P0-A 以本机网页、本地后端和本机磁盘组成的单机测试版运行；用户可以先通过 AI 生成一张图片，再在同一项目中添加、编辑文字模板与贴纸，最终导出符合常用小红书图片比例的高清 JPG 或 PNG。P0-B 才进入与公司系统合并后的远程部署阶段。

P0 必须跑通以下闭环：

1. 用户通过邀请码和邮箱验证码注册；
2. 用户选择模型、输入提示词，并可按模型能力添加参考图；
3. 系统生成一张图片并保存到项目历史；
4. 用户在当前阶段支持的网页编辑器中调整底图，添加文字和贴纸；
5. 项目自动保存；
6. 用户导出无水印高清 JPG 或 PNG；
7. 用户可在当前阶段支持的环境继续处理项目或重新下载成品。

### 2.2 核心用户

核心用户为需要快速制作小红书封面或笔记配图的个人内容创作者。

典型需求：

- 不依赖专业设计软件完成一张可发布图片；
- 在多个图片模型之间选择；
- 使用接近小红书操作逻辑的文字模板、字体和贴纸；
- 保留可编辑项目并再次下载成品。

### 2.3 核心价值

- 将 AI 生图和社交图片编辑合并为连续工作流；
- 提供已归档的文字、字体、普通贴纸、色卡和动态贴纸；
- 保留图层级可编辑状态，而不是只保存合成图；
- 使用额度、并发和项目数量限制控制内测成本。

### 2.4 成功标准

P0 的首要成功标准是完整任务成功率，即测试用户可以在不依赖人工代操作的情况下完成注册、生成、编辑、保存和导出。

P0 分为两个发布门槛：

- P0-A 本机测试：仅在项目方当前 Windows 电脑运行，由项目方控制的 1 个超级管理员账号和 1 个普通账号完成人工验收，普通账号系统上限为 10，只向普通用户展示已经通过首轮验收的复杂模板白名单；跨普通用户隔离由测试程序临时创建第二个普通账号验证，不要求朋友或第二个真实用户参与；
- P0-B 公司合并后阶段：最多 50 个普通账号，全部 332 个文字模板、86 个字体面板项、1,407 张普通贴纸、16 个色卡和 35 个动态贴纸均通过全量验收，并完成正式存储、远程部署、数据隔离与移动端能力验收。

P0 不设“必须在几分钟内完成”的产品目标，也不承诺公开服务 SLA。核心白名单门槛和完整 P0 门槛分别以本文件对应场景全部通过为准。

## 3. 发布阶段与优先级

### 3.1 P0-A：本机核心白名单测试

P0-A 只在项目方当前 Windows 电脑运行本地网页、本地后端和本机磁盘存储。本地后端只监听 localhost 回环地址，不监听局域网网卡地址；不支持手机、局域网、远程访问或朋友远程注册，也不使用 COS、公司对象存储、公司服务器、备案域名或 HTTPS。P0-A 由项目方控制的 1 个超级管理员账号和 1 个普通账号完成人工验收，不要求朋友参与，也不要求招满 10 人。系统最多开放 10 个普通账号；超级管理员不占普通账号名额。跨普通用户的数据隔离和资源越权由测试程序在同一电脑的隔离浏览器配置中临时创建第二个普通账号完成，测试结束后清理该账号。P0-A 必须跑通完整产品闭环，但只向普通用户展示以下已经验收的复杂模板：

- 文字模板：FLOWER001 至 FLOWER008、H001 至 H008、TAG001 至 TAG007、TAG051、SIMPLE001 至 SIMPLE008，共 32 个；
- 字体：上述白名单模板实际引用的全部字体面板项，并强制包含 FONT081；
- 色卡：COLOR001、COLOR002、COLOR008、COLOR016；
- 动态贴纸：DYN001、DYN002、DYN003、DYN004、DYN007、DYN008、DYN011、DYN012、DYN015、DYN016；
- 普通贴纸：part1 至 part25 的全部 1,407 张 PNG。

白名单外复杂模板必须完成导入和注册，但默认停用且不向普通用户展示。只有超级管理员明确指定的普通测试账号可以查看被授权的内部测试批次；该授权不授予后台、调点、私有内容查看或其他管理员权限。

白名单覆盖矩阵如下。一个模板可以同时覆盖多个机制，正式验收以对应资源和快照为准：

| 白名单范围 | 主要覆盖理由 |
| --- | --- |
| FLOWER001 至 FLOWER008 | 花字资源结构、材质与装饰资源、缺失预览，以及 FLOWER007 的合法 parameter_only 类型 |
| H001 至 H008 | 多行默认文本、多字体、双 Prefab、多贴图与大资源包；其中 H005 覆盖默认换行，H006 覆盖四字体与双 Prefab |
| TAG001 至 TAG007、TAG051 | 标签结构、材质与贴图，以及 TAG051 的 mapped_zip_deduplicated 去重映射 |
| SIMPLE001 至 SIMPLE008 | 简约模板、双 Prefab、多材质、缺失预览与大资源包 |

P0-A 同时包含：

- 分开的邀请码注册和邮箱验证码登录入口、30 天登录状态；
- 创作署名与社交 ID；
- 初始点数、生成扣点和超级管理员调点；
- 三个指定图片模型；
- 文字加参考图的单图生成；
- 单张画布、项目历史和本地后端自动保存；
- Windows Chrome 和 Edge 中的完整编辑器；
- 高清 JPG/PNG 导出；
- 基础运营后台和私有内容访问审计。

P0-A 本地测试页或设置区域必须明确显示：“测试数据仅保存在本机，不自动备份，也不会迁移到正式系统。”

### 3.2 P0-B：公司系统合并后的完整 P0

P0-B 是公司系统合并后的未来阶段。本版仅定义其对普通用户开放前必须满足的门槛和不可弱化产品约束；P0-B 的功能实现、排期和验收不属于当前 P0-A 必交付范围，也不得阻止 P0-A 完成。未经未来单独立项，不得因为本节保留手机完整编辑、远程部署或正式存储要求，就把这些能力纳入当前开发任务。

完整 P0 最多开放 50 个普通账号。除 P0-A 的全部能力外，必须完成：

- 全部 332 个文字模板与 86 个字体面板项的真实资源渲染；
- 全部 16 个色卡和 35 个动态贴纸的参数渲染；
- 全量视觉回归、人工复核和支持浏览器验收；
- 与公司系统完成合并，并定版正式存储后端、远程服务器、域名、HTTPS、数据隔离和移动端访问；
- 手机竖屏和横屏完整编辑器；
- 白名单外复杂模板允许在后台和内部测试账号中分批验收、分批标记通过，但所有剩余复杂模板全部通过后才一次性向普通用户启用，不逐批公开。

P0-B 的以下条件是未来对普通用户开放门槛。未来单独立项后可以提前进行内部开发、导入、预览和验收；在当前 P0-A 交付中不要求提前实施。扩大普通账号上限并向普通用户开放全部复杂模板前，必须同时满足：

- P0-A 全部适用验收场景已经通过；
- 332 个文字模板、86 个字体面板项、1,407 张普通贴纸、16 个色卡和 35 个动态贴纸完成全量验收；
- AC-26 全量模板视觉回归和 AC-37 手机横竖屏完整编辑通过；
- 白名单外复杂模板全部为 passed，正式开放操作将这些模板一次性切换为 enabled，不逐批公开；
- 普通账号阶段上限已经配置并验证为 50；
- 浏览器公开 manifest 不包含 internal_preview_asset；
- 三个模型在最后一次契约相关配置变化后，contract_validation_status 均为 verified。
- 公司系统合并方案、正式存储后端、远程服务器、域名、HTTPS、正式数据隔离和移动端访问均已定版并通过验收；P0-A 本机测试数据不迁移。

任一条件不满足时系统继续保持 P0-A 的普通用户可见范围和 10 个普通账号上限，不能只扩大人数或只开放部分模板来宣称进入 P0-B。

### 3.3 P1：内测后的明确增强

P1 包含：

- 上传本地图片作为编辑底图；
- 新建纯色或渐变空白画布；
- 为普通静态贴纸补充标题和关键词后开放搜索；
- 移除邀请码前的公开注册准备；
- 从个人认证高德 Key 迁移到公司主体的正式运营评估；
- 面向公开注册的正式地区合规方案和完整条款升级。

### 3.4 明确不做

以下功能不属于 P0 或当前已承诺的 P1：

- 支付、充值、订阅、订单和退款；
- 网页内直接发布到小红书；
- 小红书账号绑定；
- 多页图组、批量画布和批量导出；
- 公开作品广场、评论、点赞和社区推荐；
- 独立普通文字入口；
- 用户上传自定义贴纸；
- AI 生成贴纸；
- 动态贴纸、GIF 或视频导出；
- 笔记标题、正文和话题标签生成；
- 整版封面或海报模板；
- AI 提示词优化；
- 局部重绘、擦除、扩图和背景移除；
- 专业调色工具，如曲线、HSL、蒙版和局部调整；
- 实时多人协作；
- 项目版本历史；
- 文字或贴纸编组；
- 图层面板、元素隐藏和元素锁定。

## 4. 用户与权限

### 4.1 访客

通过浏览器支持检查的访客可以：

- 查看登录和注册入口；
- 输入邮箱验证码完成登录；
- 使用有效邀请码注册。

访客不能：

- 调用生图模型；
- 查看任何用户项目；
- 访问编辑器或运营后台。

### 4.2 注册用户

注册用户可以：

- 使用个人点数调用已启用模型；
- 创建、编辑、导出、删除和恢复自己的项目；
- 管理创作署名和社交 ID；
- 查看个人点数余额和点数变动；
- 注销账号。

所有项目默认私有。其他普通用户不能通过项目 ID、图片地址或搜索访问这些内容。

### 4.3 超级管理员

P0 只有 super_admin 一种后台角色，允许存在多个后台账号，且所有后台账号权限相同。P0-A 管理员邮箱由本地后端安全配置中的白名单决定，具体邮箱不得写入 PRD、Git、前端代码或前端配置。超级管理员不开放自助注册，不使用普通邀请码，也不能由普通账号提升而来；详细创建、登录、停用和恢复规则见 AUTH-07。

超级管理员可以：

- 查看和搜索用户；
- 调整用户点数；
- 暂停或恢复用户账号；
- 创建、停用和限制邀请码；
- 查看生成任务状态和用量；
- 启用、停用和配置模型；
- 上传与管理普通静态贴纸；
- 调整复杂模板的启停、分类顺序和展示顺序；
- 按需查看用户图片和完整提示词。

生成记录列表默认只显示元数据。超级管理员可以直接打开私有图片或完整提示词，不要求二次确认或填写原因；每次打开都必须自动记录管理员、时间、目标记录和查看内容类型。审计记录在 180 天保留期内不可修改或人工删除，到期后由系统清理。

超级管理员首次进入私有内容查看区域时必须看到一次全局规则提示。确认状态按“super_admin 身份 + 告知版本”持久记录，不按浏览器、标签页或会话记录；同一身份确认同一版本后不重复显示，告知文案升版后必须重新提示。每个查看入口必须明确标注“打开并记录审计”。全局提示确认不替代逐次自动审计，也不增加逐次填写原因的要求。

## 5. 信息架构与主流程

### 5.1 未登录入口

任何访问者进入 Dada 产品功能前，系统必须先检查当前浏览器是否属于 P0-A 支持环境。只有运行本地后端的同一台 Windows 电脑上的当前稳定版 Chrome 和 Edge 可以继续进入登录、邀请码注册或其他产品入口。

其他浏览器或不受支持的浏览器版本必须直接进入“浏览器不受支持”引导页。该页面只说明受支持的浏览器及使用受支持浏览器重新打开 localhost 的方式，不提供“仍然继续”入口；阻断状态下不得进入登录、注册、项目、编辑器、运营后台或任何其他产品功能。本规则不增加手机、局域网、远程或跨设备支持。

通过浏览器检查后，未登录用户首先看到登录或邀请码注册入口，不要求独立营销落地页。

### 5.2 登录后工作台

登录后默认进入创作工作台，工作台包含：

- AI 生图输入区；
- 当前模型和本次点数消耗；
- 当前点数余额；
- 最近项目入口；
- 进入全部项目列表的入口。

### 5.3 新建项目流程

1. 用户输入提示词；
2. 用户选择模型；
3. 用户选择画布比例；
4. 用户按当前模型能力添加参考图；
5. 用户确认本次点数消耗；
6. 用户提交生成；
7. 系统创建草稿项目和生成任务；
8. 生成成功后，结果加入项目生成历史；
9. 用户可选择“继续编辑”进入本机完整编辑器，或下载原始生成图。

“新建创作”入口永远创建新项目，不默认追加到最近项目。

### 5.4 项目内继续生成

1. 用户从已有项目选择“继续生成”；
2. 系统沿用该项目固定画布比例；
3. 用户选择支持该比例的启用模型并提交；
4. 成功图片追加到该项目生成历史；
5. 当前项目达到 10 张成功图时阻止追加，但不影响用户通过“新建创作”创建其他项目。

### 5.5 编辑流程

1. AI 结果作为底图进入画布；
2. 用户可裁剪、适配、定位和调色；
3. 用户从文字模板或贴纸分区添加元素；
4. 用户在画布上移动、缩放、旋转和调整层级；
5. 已提交的修改自动保存；
6. 用户导出 JPG 或 PNG。

### 5.6 设备与访问流程

P0-A 是单机单设备测试版：

- 只能从运行本地后端的同一台 Windows 电脑通过 localhost 访问；
- 不显示手机、局域网、远程访问或跨设备继续编辑入口；
- 同一电脑可以使用独立 Chrome/Edge 浏览器配置分别登录 super_admin、普通账号和测试程序临时账号；
- 多标签页仍遵守 state_version 冲突规则，但 P0-A 不承诺跨设备会话或项目同步；
- 项目、生成图和成品只保存在本机；需要长期保留的原始生成图或 JPG/PNG 成品由用户主动下载；
- P0-A 不提供可编辑项目包、数据库、账号、点数、审计日志或素材关系的导出、导入或迁移，下载图片仅作为用户留存文件，不作为 P0-B 正式系统的数据迁移来源。

P0-B 才恢复远程和多设备产品能力：

- 公司系统合并和远程部署完成后，受支持设备可通过正式域名访问；
- 手机竖屏和横屏支持与电脑等价的完整编辑，旋转屏幕不得丢失当前编辑状态；
- 桌面键盘操作必须有可发现的手机触控按钮或手势替代；
- 任一设备创建或编辑的项目可以在其他受支持设备继续处理，但必须遵守多端冲突规则。

## 6. 账号与认证需求

### AUTH-01 邀请码注册

P0 仅允许持有效邀请码的用户注册。注册和登录使用两个独立入口，不自动把用户静默切换到另一流程。

邀请码可以配置最大使用次数、有效期和启停状态。注册时：

1. 发送验证码前校验邀请码当前有效；
2. 发送验证码前校验当前阶段占用名额的普通账号总量未达到 P0-A 的 10 人或完整 P0 的 50 人上限；
3. 验证码、注册资料和告知同意均通过后，再次校验邀请码和阶段账号上限；
4. 账号创建与邀请码使用次数递增必须在同一原子操作中成功；
5. 账号未创建时不消耗邀请码次数。

账号名额规则：

- active 和 suspended 普通账号均占用当前阶段名额；
- deleted 普通账号释放名额，但历史累计创建数量继续保留在后台统计中；
- 预置或创建的 super_admin 不占普通账号名额，也不使用普通邀请码；
- 暂停账号不能通过释放名额绕过内测人数限制。

### AUTH-02 邮箱验证码

注册和登录均采用邮箱验证码，不使用密码，但分别从“注册”和“登录”入口发起。

业务规则：

- 验证码一次性有效；
- 验证码有效期为 10 分钟；
- 同一邮箱 60 秒内不能重复发送；
- 连续失败或高频请求必须触发频率限制；
- 验证码、邀请码和会话令牌不得写入项目数据或日志正文。

认证状态按以下规则处理：

| 入口与账号状态 | 产品行为 |
| --- | --- |
| 注册入口 + 未注册邮箱 + 有效邀请码 | 发送验证码，验证后允许创建账号 |
| 注册入口 + 已注册邮箱 | 不重复创建账号，明确提示前往登录 |
| 注册入口 + 已暂停邮箱 | 不创建账号，明确提示账号已暂停并联系管理员 |
| 登录入口 + active 账号 | 发送验证码，验证后创建会话 |
| 登录入口 + 未注册或已注销邮箱 | 不创建会话，明确提示前往注册 |
| 登录入口 + suspended 账号 | 不创建会话，明确提示账号已暂停并联系管理员 |

已注销邮箱在注册入口中按未注册邮箱处理，可使用新的有效邀请码创建全新账号。

### AUTH-03 注册资料

注册时必须填写：

- 创作署名：用于用户类贴纸中的展示昵称；
- 社交 ID：用于需要账号格式的贴纸，展示时最多保留一个前导 @；
- 勾选同意简短的《内测使用与隐私告知》。

创作署名和社交 ID 与 Dada 内部账号标识分离，用户可在账号设置中修改，也可在单个贴纸实例中临时覆盖。

### AUTH-04 登录状态

受信设备登录状态保持 30 天。以下情况必须立即失效：

- 用户主动退出；
- 用户注销账号；
- 管理员暂停账号；
- 系统检测到会话无效。

### AUTH-05 账号暂停

账号暂停后：

- 用户不能继续生成、编辑或导出；
- 已登录会话立即失效；
- 项目在账号恢复前保持私有保存；
- 超级管理员可以恢复账号。

### AUTH-06 账号注销

用户确认注销后立即执行：

- 使所有会话失效；
- 删除账号资料；
- 删除所有项目、参考图、生成图、原始坐标和导出成品；
- 删除未使用点数；
- 无法恢复账号。

注销完成后，同一邮箱可使用新的有效邀请码注册全新账号，但不得恢复旧账号资料、项目、点数、署名或任何历史内容。

注销后的数据处理规则：

- 邮箱、账号资料、提示词、参考图、生成图、项目、原始坐标和导出成品立即删除；
- 匿名生成和点数事件明细保留 180 天，可保留随机匿名主体、时间、模型、成功或失败、错误类别和点数变化；
- 匿名事件不得保留邮箱、IP、提示词、图片、项目 ID、生成任务原 ID或其他可恢复内容；
- 私有内容访问审计保留执行查看的超级管理员身份，被注销用户和目标记录替换为不可反推的随机标识，并在原访问事件发生 180 天后由系统删除；
- 匿名事件在注销后最多保留 180 天；
- 不可回溯到个人或单次作品的汇总统计可以长期保留。

### AUTH-07 超级管理员创建与登录

P0-A 的超级管理员由本地后端安全配置中的邮箱白名单控制。具体邮箱、验证码、会话令牌和恢复配置均不得进入 PRD、Git、前端代码、前端配置、素材 manifest 或本机数据日志。

本节所称“部署人员”不是 Dada 用户或后台角色，不进入 UserProfile.role，没有 Dada 登录入口、后台会话或产品权限。P0-A 中由项目方作为本机配置维护者管理本地后端安全配置；P0-B 中该职责由公司既有运维流程承接。配置变更在 Dada 读取并生效时，由系统写入不包含人员身份或安全配置内容的审计记录。

业务规则：

- 超级管理员使用与普通用户分离的后台入口，并通过邮箱验证码登录，不使用密码；
- 后台在发送验证码前校验邮箱白名单，非白名单邮箱直接拒绝，不发送验证码，也不泄露完整白名单；
- 白名单邮箱首次完成验证码验证后创建 super_admin，后续从同一后台入口登录；
- 白名单允许包含多个邮箱；后台不提供管理员邀请、添加或普通账号提升功能，增加管理员只能由部署人员修改当前阶段的后端安全配置；
- 超级管理员不使用普通邀请码、不占普通账号上限，普通账号即使邮箱后来进入白名单也不能原地提升，必须由部署人员先解决账号身份冲突后再按受控管理员流程创建独立管理员身份；
- 管理员会话保持 30 天；主动退出、账号停用、邮箱被移出白名单或会话无效时立即失效；
- 任一超级管理员可以停用其他超级管理员，相关操作必须审计；系统不设置“最后一个管理员”保护，允许全部管理员被停用；
- 全部管理员被停用或移出白名单后，后台不提供自助恢复，只能由部署人员通过当前阶段的后端安全配置恢复受控管理员入口；
- 管理员账号创建、登录结果、停用和恢复均形成不可修改的后台操作审计；当前阶段后端安全配置中的管理员白名单、身份冲突处理或恢复配置生效时，以 system 身份形成审计，按 ADMIN-09 和 AdminOperationLog 保留 180 天。

## 7. 点数与额度需求

### CREDIT-01 初始点数

新注册用户默认获得 10 点。初始点数由后台配置，P0 默认值为 10。

每个账号同时维护：

- available_balance：可用于新任务的点数，可因超级管理员调点变为负数；
- reserved_balance：已被运行中任务冻结的点数，只能由对应任务提交或释放。

### CREDIT-02 模型点数

每个模型的单次生成点数由后台独立配置。P0 初始默认均为 1 点，超级管理员可根据真实成本调整。

生成按钮附近必须在提交前显示：

- 当前模型；
- 本次消耗点数；
- 当前可用点数；
- 当前冻结点数；
- 生成后的预计可用点数。

### CREDIT-03 原子扣点

提交生成时以原子操作把本次所需点数从 available_balance 转入 reserved_balance。

- 生成成功：对应点数从 reserved_balance 转为已扣点；
- 上游失败、超时或安全拒绝：对应点数从 reserved_balance 返还 available_balance；
- 页面关闭或刷新：不改变任务与冻结状态；
- 重复提交不能产生重复任务或重复扣点；
- 生成并发、重试和任务结算本身不得使 available_balance 变为负数。

### CREDIT-04 余额不足

available_balance 低于所选模型单次点数时：

- 禁用生成提交；
- 明确显示所需点数、当前可用点数和冻结点数；
- 不创建上游任务；
- P0 仅提示联系管理员，不提供充值入口。

### CREDIT-05 点数流水

用户可以查看个人点数变动。每条记录至少包含：

- 变动类型；
- 变动数量；
- 变动前后的 available_balance 和 reserved_balance；
- 关联模型或管理员操作；
- 管理员调点原因；
- 时间；
- 成功、释放或撤销状态。

### CREDIT-06 超级管理员调点

- 增加或扣减点数只修改 available_balance，不得修改 reserved_balance；
- 超级管理员可以把 available_balance 调整为负数；
- 负余额必须如实向用户显示，后续增加点数先抵扣负余额；
- available_balance 再次达到所选模型成本前，用户不能提交新生成；
- 每次调点必须记录超级管理员、原因、数量、调整前后余额和时间；
- 除超级管理员调点外，任何系统流程不得制造负余额。

## 8. AI 生图需求

### GEN-01 支持模型

P0 支持以下模型标识：

| 模型标识 | P0-A 初始配置默认 | 选择方式 |
| --- | --- | --- |
| gemini-3.1-flash-image-preview | 是 | 用户手动选择 |
| gemini-3-pro-image-preview | 否 | 用户手动选择 |
| gpt-image-2 | 否 | 用户手动选择 |

后台可以停用任何模型。停用后：

- 新任务不能选择该模型；
- 历史记录仍显示原模型名；
- 已使用该模型生成的项目和图片保持可用。

后台配置必须始终存在且只存在一个已启用的默认模型。超级管理员主动停用当前默认模型时，必须在同一原子操作中指定另一个已启用模型作为新默认模型；替代模型缺失、未启用或不合法时，整个操作失败，原模型启停和默认状态均保持不变，不允许出现部分更新或无默认模型状态。

每个 ModelConfig 必须配置唯一正整数 recommendation_priority，数值 1 表示最高推荐优先级，不允许不同模型并列。后端只在当前运行时可用于新任务的模型中按推荐优先级由高到低（即数值由小到大）返回一个推荐模型；没有运行时可用模型时返回空推荐，并进入既有生成禁用或失败状态。运行时推荐是派生结果，不是第二个后台默认状态，也不得写回 ModelConfig。外部服务临时不可用、AI 网关余额不足、契约失效或其他运行时降级只改变运行时可用性，不得改写 ModelConfig.enabled、is_default 或后台配置的 recommendation_priority。具体 API 字段和响应结构由后续 DevelopmentPlan 同步，不属于本 PRD 的产品契约范围。

### GEN-02 统一基础输入

生图面板只提供所有模型都能映射的基础输入：

- 提示词；
- 模型；
- 画布比例；
- 参考图；
- 生成按钮。

P0 不展示负面提示词、种子、采样器或模型专属高级参数。

### GEN-03 提示词

- 支持简体中文自由输入；
- P0 不提供模板、示例、自动补全或 AI 优化；
- 提示词长度上限由 ModelConfig 决定；
- 超出上限时在客户端阻止提交并说明限制。

### GEN-04 画布比例

P0 支持：

| 比例 | 标准像素 |
| --- | ---: |
| 3:4 | 1080 × 1440 |
| 1:1 | 1080 × 1080 |
| 4:3 | 1440 × 1080 |
| 9:16 | 1080 × 1920 |

3:4 为默认比例。

每个模型通过 ModelConfig 声明支持的比例。切换到不支持当前比例的模型时，系统必须要求用户选择该模型支持的比例，不能静默改动。

项目首次创建时确定 canvas_ratio 和 canvas_size，此后不可修改。项目内“继续生成”只能选择支持项目既有比例的模型；用户需要其他比例时必须通过“新建创作”创建新项目。

### GEN-05 参考图

- 参考图为可选项；
- 支持 JPG、PNG 和 WebP；
- 数量上限、单文件大小和总大小由当前模型配置；
- 切换模型后若现有参考图超过新模型上限，必须要求用户移除超出部分；
- 用户在提交生成前选择的本地参考图只存在于当前页面内存，不上传且不写入浏览器持久化存储；
- 点击提交生成时才上传参考图，并绑定到本次 GenerationJob；
- 每个成功、失败或被拒绝的 GenerationJob 保留提交时的参考图关系，不因后续重试而替换；
- 相同项目内重试时可以复用已有参考图资源，但每个任务仍保存自己的关系快照；
- 删除项目或注销账号时按对应规则删除参考图。

### GEN-06 每次结果

每次生成只返回并保存一张候选图。

### GEN-07 并发限制

同一账号同时只能有一个运行中的生图任务。任务运行时再次提交必须被阻止，并提供返回当前任务的入口。

### GEN-08 任务状态

生成任务状态为：

- queued：已创建，等待调用；
- running：上游处理中；
- succeeded：已获得并保存图片；
- failed：技术失败或超时；
- rejected：上游安全策略拒绝。

页面刷新或切换设备后，用户仍能看到当前任务的真实状态。P0 不展示虚假的百分比进度。

### GEN-09 失败处理

失败状态必须：

- 显示可理解的错误类别；
- 不暴露上游密钥、原始堆栈或内部地址；
- 释放冻结点数；
- 保留用户提示词和草稿项目；
- 允许用户在失败页或当前草稿中重新提交；
- 重试只新增 GenerationJob，不创建新项目。

### GEN-10 内容安全

P0 依赖模型供应商的安全策略，不建设人工内容审核流程。

当供应商拒绝请求时：

- 任务状态为 rejected；
- 不保存违规输出；
- 不扣点；
- 向用户显示不包含敏感内部细节的拒绝提示。

### GEN-11 生成历史

每个项目最多保留 10 张成功生成图。

- 用户可删除单张历史图；
- 达到 10 张后必须先删除旧图才能在该项目继续生成；
- 工作台“新建创作”不受其他项目生成历史上限影响，但仍受 20 个项目上限约束；
- 当前作为底图的图片不能直接删除，除非先切换底图；
- 每张历史图保留模型、比例、提示词、参考图关系、生成时间和点数记录；
- 同一项目内所有历史图比例必须与项目固定比例一致。

### GEN-12 更换底图

切换到项目内另一张生成历史图时：

- 保留所有文字和贴纸覆盖层；
- 元素的位置和尺寸按相同画布比例保留；
- 底图的裁剪、适配和调色状态重置为新底图默认状态；
- 已有色卡按 COL-04 重新提取；
- 切换动作进入撤销历史并触发自动保存。

### GEN-13 AI 网关契约验证门槛

取得网关图片 API 文档、脱敏调用示例或平台支持确认之前，可以并行开发编辑器、素材、认证等独立模块，但不得按猜测定版 AI 适配器、ModelConfig 路由、参考图协议或点数结算联调。

三个模型分别完成以下验证并保存脱敏证据后，才能解除 AI 契约阻塞：

- 纯文字生成一张底图；
- 按模型能力使用参考图生成；
- 3:4、1:1、4:3、9:16 四种比例；
- 技术失败、超时和安全拒绝；
- 返回图片的格式、尺寸和获取方式；
- 请求是同步还是异步，以及异步任务查询方式；
- 错误映射、任务状态与冻结点数释放语义。

不得假设三个模型使用相同图片端点或参数格式。

模型端点、请求字段、参考图协议、响应结构、同步或异步模式、任务查询方式或上游错误协议发生变化时，必须立即把对应模型的 contract_validation_status 重置为 unverified，并重新执行 AC-40。显示名称、点数等不改变上游调用协议的配置变化不触发该重验规则。

### GEN-14 提交时配置复核

生图页面必须保存用户确认时的 model_config_version 和 confirmed_credit_cost。服务端收到提交时重新读取当前 ModelConfig，并核对模型启停、点数、支持比例、参考图限制和提示词限制。

- 当前配置与用户确认版本一致时，才允许创建任务并冻结点数；
- 点数、比例、参考图限制、提示词限制或启停状态发生变化时，本次提交必须拒绝；
- 拒绝时不创建 GenerationJob、不调用上游、不冻结点数；
- 页面显示最新配置并要求用户重新确认，不能静默按更高点数或不同限制继续；
- 已经成功提交的任务继续按提交时保存的配置快照结算。

### GEN-15 AI 网关余额影响范围

AI 网关余额不足不等同于 Dada 点数不足。系统根据网关返回结果和后台配置确定真实上游影响范围：

- 能明确确认某一模型额度不足或仅该模型受影响时，只把该模型标记为运行时不可用于新任务；
- 只能确认共享网关账户余额不足，或无法可靠判断模型级影响范围时，把所有依赖同一网关结算账户的模型标记为运行时不可用于新任务；
- 因网关余额不足而失败的已提交任务必须进入失败状态，并且只释放一次对应 reserved_balance，不消耗用户点数；
- 运行时不可用后向超级管理员显示影响范围和检测时间，不得自动充值或用 Dada 点数继续制造无法支付的上游调用，也不得改写后台配置的默认模型、enabled 或 recommendation_priority；
- 只有确认真实网关余额已经恢复后，超级管理员才能恢复受影响模型的运行时可用状态，恢复操作必须审计。

### GEN-16 产品级生成错误分类

Dada 使用稳定的 GenerationErrorCategory 统一三个模型的提交和执行错误。上游原始错误码、堆栈和内部地址不得直接面向用户展示。失败或拒绝的 GenerationJob 必须保存 error_category；queued、running 和 succeeded 任务不保存错误分类。提交前被阻止时不创建 GenerationJob，但提交响应仍返回对应 error_category。

| error_category | 产品含义 | 用户下一步 | 任务与点数 |
| --- | --- | --- | --- |
| upstream_timeout | 上游超时 | 使用原输入重试 | failed，释放冻结点 |
| upstream_failed | 上游临时失败 | 稍后重试 | failed，释放冻结点 |
| safety_rejected | 供应商安全拒绝 | 修改提示词或参考图 | rejected，释放冻结点 |
| model_disabled | 模型因普通启停规则不可用 | 选择其他模型或等待 | 不创建任务、不冻结点 |
| gateway_balance_insufficient | 真实网关余额不足 | 选择未受影响模型或联系管理员 | 未创建则不冻结；已创建则 failed 并释放 |
| gateway_contract_invalid | 网关契约未验证或失效 | 选择其他模型或联系管理员 | 未创建则不冻结；已创建则 failed 并释放 |
| reference_invalid | 参考图格式、大小、数量或内容无效 | 更换或移除参考图 | 未创建则不冻结；已创建则 failed 并释放 |
| unknown_retryable | 未知但判断为临时错误 | 稍后重试 | failed，释放冻结点 |
| unknown_non_retryable | 未知且不应反复重试 | 联系管理员 | failed，释放冻结点 |

已知禁用原因是网关余额或契约状态时，gateway_balance_insufficient 或 gateway_contract_invalid 优先于通用 model_disabled。用户点数不足、ModelConfig 版本变化、已有并发任务、项目上限、生成历史上限以及 P0-A 本机存储 full 或 unavailable 继续使用现有确定性业务阻止规则，不扩入本错误分类。

ModelConfig.error_mapping_profile 负责把各供应商的错误映射到上述固定分类。P0 后台可以调整上游错误映射，但不能新增临时分类；映射变化必须产生新的 config_version。UIDesign.md 可以确定中文文案，但不能改变分类对应的重试、修改输入、选择模型或联系管理员动作。

## 9. 项目与持久化保存

### PROJECT-01 项目创建

工作台“新建创作”首次提交时始终创建新的草稿项目。项目即使生成失败也保留提示词和当前配置，方便重试。失败页或该草稿中的“重试”复用原项目并只新增 GenerationJob；只有用户再次主动进入工作台“新建创作”才创建其他项目。

已有项目的“继续生成”只创建新的 GenerationJob，不创建新项目；成功结果追加到该项目历史，失败时保留原项目和本次配置。

没有任何成功生成图的失败草稿支持在项目列表中多选并批量移入回收站；包含成功生成图的项目不进入该快捷批量操作。

### PROJECT-02 项目命名

项目名称默认由提示词摘要和创建日期生成，用户可以随时重命名。

### PROJECT-03 项目数量

每个用户最多拥有 20 个 status=active 的项目。status=trashed 和 status=purged 均不占活动项目名额；达到 20 个 active 项目后阻止创建新项目。

### PROJECT-04 自动保存

自动保存对象为最新可编辑项目状态，而不是仅保存合成图。

自动保存发生在：

- 文字或样式点击“完成”；
- 元素移动、缩放、旋转或多选移动结束；
- 元素添加、复制、删除或层级变化；
- 底图裁剪、调色或切换确认；
- 项目重命名；
- 撤销或重做完成。

保存队列遵守以下规则：

- 一次已提交操作结束后等待 1 秒，将连续变化合并为当前最新项目状态；
- 同一项目同一时间最多一个保存请求在途；
- 请求在途期间的新变化合并到下一次最新状态，不逐条并发发送；
- 保存失败时显示“未保存”，页面保持打开期间在网络恢复后自动重试；
- 不把未保存画布、提示词、私有图片引用或编辑内容写入 localStorage、IndexedDB 或 Cache Storage；
- 刷新页面等同离开页面；强制刷新、关闭页面或浏览器崩溃后，只恢复最后一次后端 save_status=saved 的状态，不恢复未保存修改；
- 保存成功前不能继续显示“已保存”。

### PROJECT-05 离开页面

项目存在未提交或未保存修改时：

- 站内跳转必须提供“保存并离开”“放弃修改”“取消”三个选项；
- 选择“保存并离开”后，必须提交当前编辑态并等待保存成功；
- 刷新或关闭页面时使用浏览器离开警告并尝试最后一次保存；
- 用户明确放弃、强制刷新、强制关闭或浏览器崩溃后，未保存修改丢失；重新打开项目时只加载最后一次后端 saved 状态。

### PROJECT-06 撤销与重做

- 仅保留当前编辑会话的多步撤销和重做；
- 重新打开项目后撤销栈为空；
- 一次连续拖拽作为一个操作；
- 一次文字编辑从进入编辑到点击完成作为一个操作；
- 取消编辑不进入撤销历史。

### PROJECT-07 多端冲突

P0 不支持同一项目多人协作。P0-A 在同一电脑的多个标签页编辑同一项目时必须比较 state_version；P0-B 扩展到多个设备。

旧页面检测到后端已有较新版本后：

- 立即停止自动保存并进入只读冲突状态；
- 不允许继续编辑、覆盖后端状态或另存为项目副本；
- 允许用户把旧页面当前画面本地导出一次，导出结果不更新后端成品；
- 用户确认放弃本地修改后，刷新加载后端最新版本。

### PROJECT-08 删除与恢复

用户删除项目后：

- 项目进入回收站；
- 系统按删除时间计算 purge_at = deleted_at + 720 小时，在 purge_at 前可以恢复；
- 到达 purge_at 后，用户侧立即视为 purged 且不可恢复，即使本机文件物理清理仍在异步队列中；
- 用户可以在 purge_at 前主动永久删除，确认后立即进入不可恢复的 purged 状态；
- purged 项目的项目数据、生成图、参考图、原始坐标和导出成品进入异步物理清理；
- 恢复操作只有在当前 active 项目少于 20 个时才能把项目从 trashed 改为 active；活动项目已达 20 个时阻止恢复，项目继续保持 trashed，原 deleted_at 和 purge_at 不变，用户必须先释放活动项目名额。

### PROJECT-09 项目可见性

- 项目默认且始终私有；
- P0 不提供公开链接；
- P0 不提供作品广场；
- P0-A 参考图、生成图和导出成品必须通过本地后端登录鉴权接口访问，不能从静态公开目录直接读取；
- P0-B 的正式私有资源访问方案必须在公司系统合并时重新定版；
- 私有资源地址不得通过猜测获得未授权访问。

## 10. 编辑器通用需求

### EDITOR-01 设备范围

P0-A 完整编辑器只支持运行本地后端的同一台 Windows 电脑上的 Chrome 和 Edge，不提供手机网页、局域网或远程访问能力。

P0-B 才正式支持手机完整编辑器：

- 手机竖屏和横屏均可完成底图、文字、贴纸、多选、层级、撤销重做和导出；
- 屏幕旋转只改变布局，不提交、取消或丢失当前编辑状态；
- 手机使用适配小屏的面板、触控按钮和手势，不得以“请使用电脑”替代功能；
- 电脑键盘快捷键不要求手机模拟键盘，但必须有等价触控操作。

### EDITOR-02 画布与底图

底图支持：

- 填充画布；
- 完整适应画布；
- 裁剪；
- 缩放；
- 定位；
- 从项目生成历史中更换。

P0 不能上传本地图片作为底图，也不能创建空白画布。

### EDITOR-03 底图调色

P0 提供：

- 亮度；
- 对比度；
- 饱和度；
- 色温；
- 锐度；
- 预设滤镜；
- 一键恢复原图。

滤镜名称、缩略图和具体视觉值由 UIDesign.md 定义。PRD 要求所有调节可撤销、可保存并反映在导出结果中。

### EDITOR-04 元素上限

单张画布最多包含 50 个覆盖元素。覆盖元素包括文字模板、普通贴纸、色卡贴纸和动态贴纸，不包含底图。

达到上限后不能继续添加，必须提示用户删除现有元素。

### EDITOR-05 单选与多选

支持：

- 点击或轻点优先选择命中区域中 z_index 最高的元素；
- 在同一点连续点击或轻点时，按 z_index 从高到低循环选择候选元素；
- 长按重叠区域时，显示仅包含该命中点候选元素的临时列表，通过文字内容、元素类型或缩略图区分；
- 桌面 Shift 点击追加或移除选择；
- 电脑提供可见的“多选模式”；P0-B 手机完整编辑器提供等价触控多选模式，用于逐个追加或移除选择；
- 框选多个元素；
- 多选元素整体移动、复制或删除。

选择循环在用户移动指针、开始拖拽或点击其他位置后重置。候选列表不是完整图层面板，不显示未命中该点的元素，也不提供全局排序。

不支持编组。多选状态下不能合并不同文字元素的样式编辑。

### EDITOR-06 画布变换

所有覆盖元素支持：

- 移动；
- 等比缩放；
- 旋转；
- 复制；
- 删除；
- 置顶；
- 上移一层；
- 下移一层；
- 置底。

普通贴纸额外支持水平翻转和元素透明度。

### EDITOR-07 对齐辅助

移动元素时提供画布中心线、边缘和其他元素的吸附提示。辅助线只用于编辑，不进入导出图片。

### EDITOR-08 键盘操作

桌面端至少支持：

- 撤销与重做；
- Delete 或 Backspace 删除选中元素；
- 方向键微移；
- Shift 加方向键大步移动；
- 复制与粘贴内部画布元素；
- 多选修饰键。

具体快捷键展示方式由 UIDesign.md 定义。

P0-B 手机完整编辑器必须为撤销、重做、删除、复制、层级调整和多选提供触控入口；需要拖拽的操作必须兼容单指触控，并避免与页面滚动无意冲突。

### EDITOR-09 不提供图层面板

P0 不提供常驻或展示全部元素的图层面板，不提供元素锁定或隐藏。长按命中点出现的候选列表不视为图层面板。所有元素必须能通过循环选择、候选列表或框选触达。

## 11. 文字系统

### TEXT-01 规范素材范围

完整 P0 接入全部 332 个文字模板：

| 分类 | 数量 | 稳定 ID |
| --- | ---: | --- |
| 花字 | 145 | FLOWER001 至 FLOWER145 |
| 标题 | 119 | H001 至 H119 |
| 标签 | 51 | TAG001 至 TAG051 |
| 简约 | 17 | SIMPLE001 至 SIMPLE017 |

其中 330 个为 ZIP 资源模板，FLOWER007“好柿花生”和 FLOWER025“分享瞬间”为 parameter_only 模板。它们没有 ZIP 是合法状态，不能按资源缺失处理。

### TEXT-02 添加文字

P0 添加文字必须先选择一个模板，不提供独立普通文字入口。

模板列表支持：

- 按花字、标题、标签、简约分类；
- 按显示名称搜索；
- 按 catalog.csv 的稳定顺序展示；
- 记录账号级最近使用。

### TEXT-03 文字内容

- 支持输入和替换文字；
- 支持 UTF-8 多行文本；
- 保留换行符；
- 编辑中可以暂时为空；
- 点击完成时若内容为空，提示用户输入内容或删除该元素。

### TEXT-04 字体

完整 P0 展示 86 个字体面板项，对应 85 份唯一字体二进制。即使两个面板项共用同一字体文件，也保留各自稳定 ID 和面板顺序。

字体规则：

- 模板自带字体用于模板默认视觉；
- 字体面板用于用户主动覆盖；
- 字体缩略图仅用于名称预览；
- 实际渲染必须加载归档字体文件；
- 用户选择字体后保留当前模板的其他样式。

有效字体规则为：

effectiveFont = 用户主动选择字体，否则使用模板默认字体。

### TEXT-05 模板切换

已有文字元素切换模板时：

- 保留文本内容和换行；
- 重置字体为新模板默认字体；
- 重置颜色、描边、背景、对齐、行距和字距为新模板默认值；
- 保持画布位置、旋转和整体视觉尺寸；
- 作为一次可撤销操作提交。

### TEXT-06 文字大小

用户可以：

- 通过画布控制柄缩放文字；
- 通过数值字号精确设置；
- 两种操作保持同步；
- 文字框随内容、换行和字号重新测量，不能裁掉可见文字。

### TEXT-07 颜色

文字填充色、描边色和背景色均支持：

- 参考预设色；
- 自定义色盘；
- 十六进制颜色输入。

已验证参考值包括：

- 红色填充：#FA5751；
- 黑色描边：#000000；
- 亮黄色背景：#FFE62C。

### TEXT-08 描边

- 支持开启或关闭描边；
- 描边宽度范围为 0 至 12；
- 描边颜色与填充颜色独立；
- 描边变化不能下载或替换模板资源。

### TEXT-09 背景

- 支持开启或关闭文字背景；
- 背景颜色独立于文字填充；
- 背景透明度范围为 0% 至 100%；
- 背景透明度只影响背景，不影响文字；
- 复合预设可以一次更新填充、描边和背景。

### TEXT-10 对齐

支持三种水平对齐：

- 左对齐；
- 居中；
- 右对齐。

### TEXT-11 行距

- 有效范围：1.0 至 1.9；
- 步长：0.1；
- 未显式修改时使用模板默认值；
- 归档中的 -1.0 是“未设置”哨兵，不能直接作为渲染值。

### TEXT-12 字距

- 有效范围：1.0 至 20.0；
- 步长：1.0；
- 未显式修改时使用模板默认值；
- 归档中的 -1.0 是“未设置”哨兵。

### TEXT-13 编辑提交

进入文字内容或样式编辑后：

- 所有修改实时预览；
- 点击“完成”后形成一次撤销记录并触发自动保存；
- 点击“取消”恢复进入编辑前状态；
- 滑杆的每个中间值不单独进入撤销历史。

### TEXT-14 真实资源渲染

文字模板不能使用预览 PNG 代替真实渲染。必须依据模板 metadata.json、资源包、Prefab 转换结果、样式参数和字体文件还原。

## 12. 贴纸系统

### 12.1 总体结构

贴纸功能由三个相互独立的系统组成：

- 普通静态贴纸库：固定为 part1 至 part25，共 25 个普通贴纸 part；
- 色卡贴纸系统：按 COLOR 稳定 ID 管理，不计入普通贴纸 part；
- 动态数据贴纸系统：按 DYN 稳定 ID 管理，不计入普通贴纸 part。

历史交接资料中的 part26 和 part27 仅用于说明素材来源批次，不作为产品运行时的普通贴纸 part。三个区域必须在产品上保持独立，不能把色卡或动态贴纸降级为普通图片。

### STATIC-01 普通贴纸范围

P0 接入本地后端安全配置所引用的 `%USERPROFILE%\Desktop\贴纸素材` 中全部 1,407 张 PNG。

业务规则：

- 保留原 part1 至 part25；
- 保留所有原始文件；
- part18 与 part25 的 3 组重复图片仍作为两份入口展示和保存；
- 不静默去重；
- 不根据文件名猜测贴纸含义。

### STATIC-02 普通贴纸目录

由于现有文件名主要为哈希且没有关键词，P0 支持：

- 按 part 浏览；
- 保持 part 内稳定顺序；
- 账号级最近使用；
- 后台上下架。

加载规则：

- 进入普通贴纸面板时只加载 part 列表和首屏必要数据，不预下载 1,407 张原图；
- 每个 part 使用虚拟列表，只渲染可视区域及少量缓冲项；
- 缩略图按视口懒加载，离开可视范围的列表节点可回收；
- 贴纸原图只在加入画布或导出确有需要时按需加载；
- 最近使用区域同样优先加载缩略图，不因最近使用而批量预取原图。

P0 不支持普通贴纸关键词搜索。

### STATIC-03 普通贴纸编辑

普通贴纸支持：

- 移动；
- 等比缩放；
- 旋转；
- 水平翻转；
- 0% 至 100% 透明度；
- 复制；
- 删除；
- 层级调整；
- 多选移动。

### STATIC-04 后台上传

超级管理员可以上传 PNG 或 WebP 普通贴纸，并配置：

- 稳定素材 ID；
- 所属 part；
- part 内顺序；
- 启用或停用；
- 可选的内部名称。

超级管理员上传的普通静态贴纸原图及由 Dada 生成的缩略图写入 LocalDataRoot，并从首次物理写入起计入 managed_content_bytes。产品随安装包提供或通过第 18 节本机安全配置原地引用的只读规范素材库不计入 managed_content_bytes，也不得因后台上传而复制进 LocalDataRoot。

storage_status 为 full 或 unavailable 时，后台必须阻止继续上传原图、生成缩略图或写入其他受管二进制内容；已经存在的普通贴纸仍按其权限、启停和版本规则读取。

超级管理员可以显式清理不再被任何已发布版本或项目引用的历史上传原图和缩略图。清理前必须展示确认，系统必须再次校验引用关系并形成不可修改的 AdminOperationLog；不得自动清理，不得删除仍被任何已发布版本或项目引用的文件。只有物理清理完成并重新计量后，才能更新 managed_content_bytes、capacity_notice_level、storage_status 和 last_measured_at。

P0 后台不能直接上传文字模板、色卡渲染器、Lua、Prefab 或复杂动态资源包。

## 13. 色卡贴纸

### COL-01 范围

完整 P0 接入 COLOR001 至 COLOR016，对应稳定网页样式 style_01 至 style_16。P0-A 只启用第 3.1 节规定的四个色卡 ID。

### COL-02 五色提取

- 色卡从当前底图未经裁剪、调色和滤镜处理的原始图片提取五个主要颜色；
- 提取在浏览器本地执行；
- 不因色卡功能额外上传底图；
- 提取结果必须可重复，不能在同一图片上随机变化；
- 色卡可以使用额外固定背景色或装饰色，但用户图片调色板为五色。

### COL-03 样式映射

- style_01 与原生 TYPE_1 有单样本确认；
- style_02 至 style_16 保持当前网页稳定顺序；
- style_02 至 style_16 不宣称与小红书内部 TYPE 编号逐项准确对应；
- 色值只要求接近当前确定性网页实现，不承诺与小红书原生 ColorExtract 模型逐色一致。

### COL-04 刷新规则

- 首次插入时从当前底图提取五色；
- 用户更换项目底图时，已有色卡自动重新提取；
- 裁剪、调色或滤镜变化不触发重新提取；
- P0 不提供手动吸色或手动刷新按钮；
- 色卡面板标题旁提供信息图标，说明“色卡基于原始底图，更换底图时更新，不随裁剪、调色和滤镜变化”。

### COL-05 编辑

生成后的色卡作为独立画布元素，支持移动、缩放、旋转、复制、删除和层级调整。

## 14. 动态贴纸

### DYN-01 范围

完整 P0 接入 DYN001 至 DYN035，分类如下：

| 分类 | 数量 |
| --- | ---: |
| 地点/POI | 6 |
| 时间/日期 | 7 |
| 用户昵称/ID | 21 |
| 综合信息 | 1 |

P0-A 只启用第 3.1 节规定的十个动态贴纸 ID。

原始 inventory 中没有动态绑定的额外目录不计入这 35 个模板。

### DYN-02 数据按需提供

每个模板只能要求和显示其真实消费的字段。通用 Lua 中存在但当前 Prefab 不消费的相机、日期或位置字段不能变成无关的用户表单。

### DYN-03 时间数据

- 插入时间贴纸时使用用户浏览器的本地当前日期和时间；
- 用户可以在提交前修改日期和时间；
- 项目保存用户确认后的值；
- 重新打开项目后不自动改成新的当前时间。

### DYN-04 地点数据

地点贴纸支持：

- 用户授权浏览器定位；
- 通过部署时配置的地理编码服务转换地点；
- 用户手动修改地点名称；
- 定位拒绝、失败或供应商不可用时回退到手动输入。

系统不能读取密码、Cookie、认证令牌或与定位无关的浏览器数据。

### DYN-05 坐标保存

DYN004 会把经纬度作为可见贴纸内容。

当用户选择 DYN004 并授权定位时：

- 在调用浏览器定位权限前显示一次 Dada 自有提示，明确说明原始经纬度会保存到当前项目并显示在导出成品中；
- 用户确认后才调用浏览器定位，不再要求取得坐标后的第二次确认；
- 保存原始坐标和用户可见格式化值；
- 用户可以手动修改可见文本；
- 坐标只属于当前私有项目；
- 删除项目或注销账号时按对应规则删除。

用户拒绝 Dada 自有提示或浏览器定位时，不调用或停止调用定位，也不能自动插入 DYN004。用户可以改用仅显示地点名称的其他模板；其他地点模板默认只保存用户确认的地点文字，不保存原始坐标。

### DYN-06 用户身份数据

用户类贴纸默认使用注册资料中的：

- 创作署名；
- 社交 ID。

用户可以在单个贴纸中覆盖显示值，覆盖不自动修改账号资料。

需要 @ 前缀的模板由模板格式化规则添加，不能重复显示 @@。

### DYN-07 静态导出

动态贴纸只在编辑器内按数据生成视觉内容。导出 JPG 或 PNG 后：

- 文字和图形成为静态像素；
- 地点、账号或时间不可点击；
- 不创建小红书平台内的真实 POI、话题或账号链接。

### DYN-08 DYN012 字体替代

DYN012 引用的 DIN_MediumAlternate.otf 当前缺失。

P0 使用字体面板 FONT081，即 Lexend Deca，作为明确替代：

- 产品和测试记录必须标记为替代字体；
- 不能宣称为原字体；
- 后续获得合法原字体后可通过模板资源升版替换。

### DYN-09 运行时边界

Android Capa Prefab 和 Lua 仅作为布局、格式化和字段绑定参考。网页产品不得直接执行这些 Android 运行时文件，必须使用转换后的受控模板模型。

## 15. 导出需求

### EXPORT-01 格式

支持：

- JPG；
- PNG。

### EXPORT-02 尺寸

导出像素必须与项目画布规格完全一致：

- 3:4 为 1080 × 1440；
- 1:1 为 1080 × 1080；
- 4:3 为 1440 × 1080；
- 9:16 为 1080 × 1920。

### EXPORT-03 质量

- 导出使用 sRGB；
- 不添加 Dada 水印；
- PNG 使用无损导出；
- JPG 质量可在 80 至 100 之间选择，默认值为 92；
- 导出结果必须与画布中已提交状态一致；
- 若存在未提交文字或样式修改，必须提示“将应用当前修改并导出”；
- 用户确认后把当前编辑形成一次撤销记录，并等待本地画布渲染稳定后导出；
- 用户取消确认时不提交编辑，也不导出。

### EXPORT-04 最新成品

每个项目按格式保存最新一份成品：

- 正常导出由当前客户端根据已提交画布状态完成合成；
- P0-A 客户端将同一成品提供给用户下载并通过本地后端保存到 LocalDataRoot；P0-B 的正式上传方式由后续方案定版；
- 再次导出 JPG 覆盖上一次 JPG；
- 再次导出 PNG 覆盖上一次 PNG；
- 不保存完整导出版本历史；
- 删除项目时一并处理；
- P0-A 可在同一电脑重新下载，P0-B 才支持其他受支持设备再次下载；
- 从未导出过对应格式时，不自动生成成品。

没有任何已保存导出成品时，成品区域显示“暂无导出成品”，并提供“进入编辑并导出”和“下载原始生成图”。

### EXPORT-05 失败

导出失败时：

- 不覆盖上一份成功成品；
- 显示失败原因和重试入口；
- 不改变项目可编辑状态。

### EXPORT-06 后端保存失败时的本地导出

当前画布能够在浏览器正确合成、但后端项目保存失败时：

- 允许用户把当前画面导出并下载到本机；
- 明确提示项目和后端最新成品尚未更新；
- 本地下载不得覆盖后端上一次成功成品；
- 成品上传失败时也不得更新 latest_exports；
- 页面保持打开期间继续重试项目保存；
- 用户刷新、关闭页面或浏览器崩溃后，只恢复最后一次后端 saved 状态，不恢复本地导出时仍未保存的编辑状态。

## 16. 运营后台

### ADMIN-01 用户管理

超级管理员可以：

- 按邮箱、状态或内部账号标识查询用户；
- 查看注册时间、最近活动、项目数量和生成用量；
- 增加或扣减点数；
- 调点时填写必填原因，并允许把 available_balance 调整为负数；
- 暂停或恢复账号。

### ADMIN-02 邀请码

超级管理员可以：

- 创建邀请码；
- 设置最大使用次数；
- 设置有效期；
- 停用邀请码；
- 查看已使用次数。

### ADMIN-03 模型管理

超级管理员可以配置：

- 模型标识和展示名；
- 是否启用；
- 是否为默认模型；
- 推荐优先级，使用唯一正整数且 1 为最高，不允许并列；
- 路由类型；
- 支持的比例；
- 参考图数量和文件限制；
- 提示词长度上限；
- 单次点数；
- 超时配置；
- 版本化 error_mapping_profile，用于把供应商错误映射到固定的 GenerationErrorCategory。

任何影响模型启停、用户确认或任务结算的配置保存后必须生成新的 config_version，旧版本不能被原地静默改写。

后台配置必须始终存在且只存在一个已启用的默认模型。超级管理员主动停用当前默认模型时，必须在同一原子操作中指定另一个已启用模型作为新默认模型；未提供合法替代模型时，整个操作失败，不修改任何模型的启停、默认或推荐优先级。外部服务临时不可用、网关余额不足或其他运行时降级不得改写后台配置的默认模型或推荐优先级。

recommendation_priority 缺失、不是正整数或与其他模型重复时，整个模型配置保存操作失败，不允许部分写入。

后台只能配置上游错误到现有分类的映射，不能新增、重命名或删除 GenerationErrorCategory。模型端点、请求字段、参考图协议、响应结构、异步模式、任务查询或错误协议变化时，保存配置必须同时把 contract_validation_status 重置为 unverified。

后台不能显示完整 API 密钥。

### ADMIN-04 生成记录

默认列表显示：

- 用户标识；
- 模型；
- 状态；
- 创建和完成时间；
- 耗时；
- 点数状态；
- 错误类别。

图片和完整提示词默认隐藏。

### ADMIN-05 私有内容访问审计

超级管理员首次进入私有内容查看区域时必须看到一次全局规则提示。提示确认按“super_admin 身份 + 告知版本”持久记录，不按浏览器、标签页或会话记录；同一身份确认同一告知版本后不重复显示，告知文案升版后必须重新提示。图片和完整提示词入口必须显示“打开并记录审计”；点击后不再显示逐次确认，也不要求填写查看原因。每次打开必须自动记录：

- 管理员账号；
- 被查看的任务或项目；
- 访问时间；
- 查看内容类型。

全局提示确认不能替代任何一次 PrivateContentAccessLog。审计记录在 180 天保留期内不可修改或人工删除，到期后由系统清理。只有 super_admin 可以查看审计后台，普通用户不能访问。

### ADMIN-06 普通贴纸管理

超级管理员可以：

- 上传 PNG/WebP；
- 选择 part；
- 调整 part 内顺序；
- 启用或下架；
- 查看尺寸和文件状态。

下架只阻止新项目添加。已有项目必须继续正确渲染原贴纸，直至项目被删除。

后台上传的普通贴纸原图和缩略图计入 managed_content_bytes。storage_status 为 full 或 unavailable 时，后台必须禁用上传、缩略图生成和其他受管二进制写入入口，但仍允许按权限查看已有素材。

超级管理员可以在确认后清理不再被任何已发布版本或项目引用的历史上传原图和缩略图。后台必须在执行前重新校验引用关系；仍被引用时拒绝整个清理操作。系统不得自动清理，清理请求、校验结果和最终结果必须写入不可修改的 AdminOperationLog。只有物理清理完成并重新计量后，后台容量汇总和 LocalBackendStorageState 才能更新。

### ADMIN-07 复杂模板管理

文字、字体、色卡和动态贴纸通过经过校验的版本化资源包发布。后台只支持：

- 启用或停用；
- 分类顺序；
- 展示顺序；
- 查看当前资源版本和校验状态。

后台不提供可视化模板编辑器。

复杂模板允许按测试批次导入和验收。超级管理员可以：

- 创建或关闭内部测试批次；
- 把指定模板标记为 imported、internal_preview、passed、enabled 或 disabled；
- 将指定普通账号授权到指定测试批次并设置有效期；
- 随时撤销预览授权。

普通账号获得内部预览授权后，只能在素材面板中看到对应批次，不能访问运营后台、调点、模型配置、邀请码、生成记录或私有内容。白名单外模板即使分批 passed，也必须等全部剩余复杂模板通过后才可在 P0-B 一次性向普通用户 enabled。

### ADMIN-08 基础数据

后台至少显示：

- 当前占名额普通账号数，并分别显示 active 与 suspended；
- 历史累计创建普通账号数和已注销普通账号数；
- super_admin 数量，且明确不计入普通账号上限；
- 活跃用户数；
- 各模型生成次数、成功率和失败率；
- 已扣点与已释放点数；
- 项目和图片存储数量；
- P0-A managed_content_bytes（包含后台上传的普通贴纸原图和缩略图）、5 GB 硬上限、capacity_notice_level、storage_status 和素材根目录可用状态，但不向后台回显本机绝对路径；
- 最常使用的文字模板和贴纸 part；
- Resend 当日与当月用量、硬上限、供应商可用状态和暂停原因；
- 高德当月用量、硬上限和暂停原因；
- AI 网关余额可用、不足或未知状态，以及当前识别的模型级、账户级或未知影响范围，但不提供自动充值入口。

super_admin 只有在新的免费周期开始或供应商恢复后，才可以恢复被暂停的辅助服务。AI 网关余额不足造成的模型运行时不可用状态必须在真实余额确认恢复后才能解除。后台不能提高 Resend 或高德的 P0 硬上限，也不能开启付费通道。

### ADMIN-09 后台操作审计

以下敏感操作必须形成不可修改的 AdminOperationLog：

- 管理员账号首次创建、登录结果、停用、恢复和白名单状态生效；
- 普通用户账号暂停或恢复、点数调整；
- 邀请码创建、停用和限制变更；
- 模型路由、点数、比例、参考图限制、启停、默认模型、推荐优先级和余额恢复；
- 普通贴纸与复杂模板的上传、版本发布、排序、启停和测试批次变更，以及普通贴纸历史原图和缩略图清理的请求、引用校验与结果；
- AssetPreviewGrant 的授予、撤销和到期配置；
- Resend、高德等辅助服务的硬上限下调、暂停和恢复。

超级管理员通过后台执行的操作使用 actor_type=super_admin，并以管理员账号标识作为 actor_ref。当前阶段后端安全配置中的管理员白名单、身份冲突处理或恢复配置被 Dada 读取并生效时使用 actor_type=system，actor_ref 固定为 backend_secure_config；不得记录执行配置变更的人员身份、白名单内容、密钥或其他安全配置值。

私有图片或完整提示词查看继续写入独立的 PrivateContentAccessLog，不要求在 AdminOperationLog 中重复保存私有内容或目标正文。两类日志均不得记录验证码、API 密钥、会话令牌、完整提示词、图片内容或其他不必要的私有正文；除系统按保留期清理外，任何管理员和后台功能均不能修改或删除记录。

## 17. 产品数据契约

本节定义产品语义，不指定数据库表、API JSON 或代码类型。

### 17.1 UserProfile

| 字段 | 含义 |
| --- | --- |
| user_id | Dada 内部不可猜测标识 |
| email | 登录邮箱 |
| creator_name | 创作署名 |
| social_id | 成品展示用社交 ID |
| role | user 或 super_admin |
| account_status | active、suspended 或 deleted |
| counts_toward_stage_limit | 普通账号为 true，super_admin 为 false |
| available_balance | 可用于新任务的点数，超级管理员调点时可为负数 |
| reserved_balance | 运行中任务冻结点数，不能被管理员直接修改 |
| private_content_notice_version | super_admin 最近确认的私有内容区域告知版本；普通用户为空 |
| private_content_notice_acknowledged_at | super_admin 确认该告知版本的时间；普通用户为空 |
| created_at | 注册时间 |

### 17.2 ModelConfig

| 字段 | 含义 |
| --- | --- |
| model_id | 上游模型标识 |
| display_name | 前台名称 |
| config_version | 每次影响用户确认或任务结算的配置变更均递增 |
| route_profile | 网关路由和协议配置 |
| gateway_account_ref | 不包含密钥的网关结算账户引用，用于判断共享账户的模型停用范围 |
| error_mapping_profile | 版本化供应商错误映射，只能指向固定 GenerationErrorCategory |
| enabled | 是否允许新任务 |
| is_default | 是否为后台配置默认模型；所有配置中必须始终恰好有一个已启用默认模型 |
| recommendation_priority | 运行时推荐顺序使用的唯一正整数；1 为最高优先级，不允许模型间并列 |
| credit_cost | 单次点数 |
| supported_ratios | 支持比例 |
| reference_limits | 参考图数量、格式和大小限制 |
| prompt_limit | 提示词长度限制 |
| safety_source | 当前依赖的供应商安全策略 |
| contract_validation_status | unverified、verified 或 blocked；契约相关配置变化后立即重置为 unverified |
| contract_evidence_ref | 三模型网关脱敏验证证据引用 |

### 17.3 Project

| 字段 | 含义 |
| --- | --- |
| project_id | 私有项目标识 |
| owner_id | 项目所有者 |
| name | 可修改项目名 |
| canvas_ratio | 创建后不可修改的画布比例 |
| canvas_size | 固定导出像素 |
| active_background_id | 当前生成历史底图 |
| background_adjustments | 裁剪、适配和调色状态 |
| canvas_elements | 文字和贴纸元素，最多 50 个 |
| latest_exports | 最新 JPG 和 PNG |
| state_version | 自动保存和冲突检测版本 |
| save_status | saved、dirty、saving、failed 或 conflicted |
| status | active、trashed 或 purged；只有 active 计入 20 个活动项目上限 |
| draft_state | generating、failed_empty 或 has_success_output |
| batch_deletable | 仅没有成功生成图的 failed_empty 草稿为 true |
| deleted_at / purge_at | 进入回收站时间，以及精确增加 720 小时后的不可恢复时间 |
| created_at / updated_at | 创建与更新时间 |

### 17.4 GenerationJob

| 字段 | 含义 |
| --- | --- |
| generation_id | 任务标识 |
| project_id | 所属项目 |
| model_id | 实际模型 |
| model_config_version | 用户确认并提交时使用的配置版本 |
| confirmed_credit_cost | 用户提交前确认的点数成本 |
| prompt | 用户提示词 |
| ratio | 请求比例 |
| reference_assets | 私有参考图关系 |
| status | queued、running、succeeded、failed、rejected |
| reserved_credits | 冻结点数 |
| final_credit_state | 扣除或释放 |
| output_asset | 成功图片 |
| error_category | 引用 GenerationErrorCategory；failed 或 rejected 时必填，queued、running 或 succeeded 时为空 |
| created_at / finished_at | 任务时间 |

### 17.5 CanvasElement

共有字段：

- element_id；
- type；
- template_or_asset_id；
- position；
- scale；
- rotation；
- z_index；
- opacity；
- created_at。

type 取值：

- text_template；
- static_sticker；
- color_card；
- dynamic_sticker。

文字元素额外保存内容、模板 ID、字体覆盖、字号和样式参数。色卡保存当前五色结果和 style ID。动态贴纸保存模板真实消费的字段、格式化值，以及 DYN004 经授权的原始坐标。

### 17.6 TemplateRegistry

复杂模板注册项至少包含：

- 稳定 ID；
- family；
- category；
- display_name；
- default_text；
- resource_class；
- resource_version；
- canonical resource reference；
- default font；
- preview reference；
- required dynamic fields；
- release_status；
- test_batch_ids；
- display order；
- validation status。

release_status 取值为 imported、internal_preview、passed、enabled 或 disabled。复杂模板额外包含 release_tier，取值为 alpha_whitelist 或 full_p0。

- P0-A 普通用户只可见 alpha_whitelist、validation status 为 passed 且 release_status 为 enabled 的模板；
- 指定内部测试账号可见授权批次中 release_status 为 internal_preview 或 passed 的模板；
- full_p0 模板可以分批进入 passed，但必须在全部剩余复杂模板通过后一次性改为 enabled；
- disabled 对所有普通账号和内部测试账号隐藏，但已有项目仍按其资源版本渲染。

### 17.7 StaticStickerCatalog

普通贴纸目录至少包含：

- 稳定贴纸 ID；
- part 编号；
- part 内顺序；
- 原始文件名；
- 相对资源路径；
- thumbnail reference；
- 文件格式；
- 宽高；
- 文件哈希；
- enabled；
- resource version；
- asset_origin：bundled_read_only 或 admin_uploaded。

普通贴纸目录项属于 public_release_asset；目录和缩略图可以公开只读，但不能由公开目录推导用户私有资源地址。

asset_origin 为 admin_uploaded 时，原图和由 Dada 生成的缩略图存放在 LocalDataRoot 并计入 managed_content_bytes；asset_origin 为 bundled_read_only 时，资源属于产品随安装包提供或通过第 18 节安全配置原地引用的只读规范素材库，不计入 managed_content_bytes。历史上传原图和缩略图只有在不再被任何已发布版本或项目引用时才可显式清理。

重复文件仍使用不同贴纸 ID 和目录条目。

### 17.8 DynamicStickerData

动态数据提供器按模板需要提供以下受控字段：

- 时间和日期；
- 地点名称、城市或英文城市名；
- 经授权的经纬度；
- 创作署名；
- 社交 ID；
- 模板明确消费的格式化派生值。

不得因为通用脚本包含字段，就要求用户填写当前模板不使用的信息。

### 17.9 CreditAccount 与 CreditLedger

CreditAccount 至少包含 available_balance、reserved_balance 和更新时间。每次点数变化必须形成不可静默修改的流水，流水至少包含类型、数量、操作前后两类余额、关联任务或管理员、管理员调点原因和时间。

流水类型支持：

- registration_grant；
- generation_reserve；
- generation_commit；
- generation_release；
- admin_adjustment。

### 17.10 PrivateContentAccessLog

记录超级管理员查看私有内容的事件，至少包含管理员账号、目标、访问时间、查看内容类型和 expires_at。expires_at 固定为访问事件发生后 180 天。记录在保留期内不可修改或人工删除，到期后由系统清理。

用户注销后，管理员账号继续保留，用户和目标替换为不可反推的随机匿名标识；注销不会延长原日志的 expires_at。

### 17.11 AnonymousRetainedEvent

注销后保留的匿名事件明细至少定义：

- anonymous_subject_id：注销时生成且不保留身份映射的随机标识；
- event_type；
- model_id；
- outcome 和 error_category；
- credit_delta；
- occurred_at；
- expires_at：不晚于注销时间后 180 天。

该对象不得包含邮箱、IP、提示词、图片、项目 ID、原任务 ID 或其他可恢复内容。

### 17.12 AssetReleaseManifest

版本化素材发布清单至少包含：

- release_version；
- storage_backend；
- storage_base_ref；
- 资源稳定 ID、相对路径、大小和哈希；
- access_class：public_release_asset、internal_preview_asset 或 private_user_asset；
- catalog 与 metadata 版本；
- release_tier；
- validation_status；
- created_at。

AssetReleaseManifest 是后端内部资源清单，可以用 access_class 区分资源。浏览器可读取的公开 manifest 是其受控导出，只能包含 public_release_asset。P0-A 的 storage_backend 固定为 local_filesystem，storage_base_ref 只引用本地安全配置中的素材根目录，不向浏览器暴露本机绝对路径。internal_preview_asset 不得进入公开 manifest，其资源路径不得仅由模板稳定 ID 推导；授权账号只能通过本地后端按 AssetPreviewGrant 下发的授权 manifest 和登录鉴权资源接口访问。private_user_asset 的路径和可推导标识同样不得进入公开导出，必须通过所有者登录鉴权或经审计的超级管理员访问。P0-A 运行时依赖发布清单和本机只读素材根目录，不依赖公司对象存储；P0-B 的 storage_backend 和 storage_base_ref 必须在公司系统合并时重新定版，且不得在本版预设为 COS。

### 17.13 AssetPreviewGrant

内部素材预览授权至少包含：

- grant_id；
- user_id：被授权的普通账号；
- test_batch_id；
- granted_by：执行授权的 super_admin；
- granted_at / expires_at；
- status：active、revoked 或 expired。

AssetPreviewGrant 不改变 UserProfile.role，不进入公开素材 manifest，也不能授予批次预览以外的任何权限。P0-A 本地后端每次下发内部预览 manifest 或读取内部预览资源前必须重新校验登录状态和授权；授权被撤销、到期或账号被停用后不得再取得资源。P0-B 若采用短时地址，必须在公司系统合并方案中重新定义有效期和撤销语义。

### 17.14 ClientCachePolicy

客户端主动持久缓存策略至少包含：

- max_public_cache_bytes：157,286,400 字节，对用户显示为 150 MB 上限；
- current_public_cache_bytes；
- eviction_policy：LRU；
- cached_release_version；
- last_eviction_at。

只有 public_release_asset 中的公开缩略图、公开模板转换产物和公开字体可以进入该缓存。internal_preview_asset、提示词、私有图片引用、项目状态、未保存编辑内容、验证码和会话令牌不得进入该缓存。用户主动下载到系统下载目录的图片不属于 Dada 缓存。

### 17.15 ExternalServiceUsage

免费辅助服务用量至少包含：

- service_id：resend_email 或 amap_web_service；
- period_type 与 period_start；
- hard_limit；
- used_count；
- service_status：active、paused_quota、paused_provider 或 disabled；
- pause_reason；
- updated_at。

service_status 只使用上述四种状态，不设置独立的运行时邮件质量降级状态。达到 hard_limit 后必须先把服务状态改为 paused_quota，再拒绝后续调用；Resend 接口不可用、明确退信故障或其他供应商异常统一使用 paused_provider，并通过 pause_reason 记录非敏感错误类别。发布前人工送达测试失败只阻止发布，不写入运行时 service_status。P0 不设计支付、自动购买、自动充值或自动扩容状态。

### 17.16 AdminOperationLog

后台敏感操作审计至少包含：

- log_id；
- actor_type：super_admin 或 system；
- actor_ref：super_admin 使用管理员账号标识，system 使用 backend_secure_config 等固定非个人来源标识；
- operation_type；
- target_type 和不可猜测的 target_ref；
- result：succeeded 或 failed；
- before_summary / after_summary：仅保存完成审计所需的非敏感状态摘要；
- occurred_at；
- expires_at：固定为 occurred_at 后 180 天。

记录在保留期内不可修改或人工删除，到期后由系统清理。不得记录验证码、API 密钥、会话令牌、完整提示词、图片内容或其他不必要的私有正文。私有内容查看使用 PrivateContentAccessLog，不在本对象中重复保存。

### 17.17 GatewayBalanceState

AI 网关余额状态至少包含：

- gateway_account_ref：不包含密钥的网关结算账户配置引用；
- balance_status：available、insufficient 或 unknown；
- impact_scope：model、account 或 unknown；
- affected_model_ids；
- runtime_unavailable_model_ids；
- detected_at 和 last_confirmed_at；
- recovery_status：not_required、awaiting_confirmation 或 confirmed；
- source_category：用于说明来自网关响应、后台配置或人工确认的非敏感类别。

impact_scope 为 model 时仅把明确受影响模型标记为运行时不可用；为 account 或 unknown 时把所有共享 gateway_account_ref 的模型标记为运行时不可用。该状态不得改写 ModelConfig.enabled、is_default 或 recommendation_priority。恢复运行时可用状态前必须把余额恢复确认为 confirmed，并形成 AdminOperationLog。

### 17.18 GenerationErrorCategory

生成提交响应和失败任务使用同一套固定产品错误注册表。每个分类至少定义：

- category_id：GEN-16 固定的九个 error_category 之一；
- task_outcome：not_created、failed、rejected 或 failed_or_not_created；
- user_action：retry_same_input、wait_and_retry、edit_input、choose_model_or_contact_admin 或 contact_admin；
- retry_policy：immediate、after_wait、after_edit、after_model_change 或 none；
- credit_behavior：no_reserve 或 release_if_reserved；
- message_key：供 UIDesign.md 绑定用户文案的稳定键。

该注册表在 P0 中不是后台可编辑素材。ModelConfig.error_mapping_profile 只能把上游结果映射到现有 category_id；不得把供应商原始错误码、错误正文、堆栈或内部地址作为用户消息。提交前错误返回分类但不创建 GenerationJob；任务创建后的 failed 或 rejected 必须记录分类并只释放一次冻结点数。

### 17.19 LocalBackendStorageState

P0-A 本机内容存储状态至少包含：

| 字段 | 含义 |
| --- | --- |
| storage_backend | 固定为 local_filesystem |
| data_root_ref | LocalDataRoot 的安全配置引用，不保存硬编码用户名或对前端暴露绝对路径 |
| managed_content_bytes | Dada 管理的参考图、生成图、成品、派生二进制文件，以及后台上传的普通贴纸原图和缩略图当前总字节数 |
| hard_limit_bytes | 固定为 5,368,709,120 字节，对用户显示为 5 GB |
| capacity_notice_level | normal、warning 或 critical；按 managed_content_bytes 与硬上限比例确定 |
| storage_status | active、full 或 unavailable |
| last_measured_at | 最近一次容量测量时间 |

LocalDataRoot 默认位于当前 Windows 用户的应用数据目录，必须可配置，且不得放在 Git 仓库或项目目录中。P0-A 的本机数据库、账号、项目、参考图、生成图、导出成品、审计日志和派生文件均写入 LocalDataRoot。

LocalDataRoot 是本地后端管理的文件系统存储，不是浏览器 localStorage、IndexedDB 或 Cache Storage。后端把已提交项目状态写入本机磁盘，不改变“浏览器不得持久化私有草稿、提示词或图片引用”的规则。

managed_content_bytes 只统计 Dada 管理的参考图、生成图、导出成品、派生二进制文件，以及 super_admin 通过后台上传的普通静态贴纸原图和由 Dada 生成的缩略图。产品随安装包提供或通过第 18 节本机安全配置原地引用的只读规范素材库、应用代码、157,286,400 字节的浏览器公开素材缓存、数据库元数据、审计记录和用户主动下载目录均不计入。5 GB 是整个 P0-A 本机实例的内容硬上限，不按账号重复计算。

数据库元数据、审计记录、诊断日志和错误日志不计入 5 GB 内容额度，也不在本版增加单独文件大小硬上限。DevelopmentPlan 必须定义 180 天审计清理的执行机制、诊断与错误日志轮转，以及数据库或日志目录不可写时把 storage_status 切换为 unavailable 的处理，防止这些文件无限增长或写入失败后继续调用 AI。

capacity_notice_level 按以下固定阈值计算：

- normal：managed_content_bytes 低于 4,294,967,296 字节，即低于硬上限的 80%；
- warning：managed_content_bytes 达到 4,294,967,296 字节且低于 4,831,838,208 字节，即达到 80% 且低于 90%；显示非阻断容量提醒；
- critical：managed_content_bytes 达到 4,831,838,208 字节且低于 5,368,709,120 字节，即达到 90% 且尚未满额；持续显示清理提醒。

warning 和 critical 均不阻止生图、参考图持久化、最新成品保存、后台普通贴纸原图上传或缩略图生成，也不得触发自动删除。critical 提示必须按以下顺序引导用户：先下载需要保留的成品，再永久删除不需要的项目，并可由 super_admin 确认清理符合条件的无引用历史贴纸文件，随后等待物理清理和容量重新测量，storage_status 恢复 active 后继续生成。告警展示、容量监控和物理清理队列的工程实现由 DevelopmentPlan 定义，但不得改变阈值、阻断条件或人工清理顺序。

- 达到或预计本次写入后超过 hard_limit_bytes 时，storage_status 为 full；系统不得自动删除任何文件，必须阻止新生图、参考图持久化、latest_exports 保存、后台普通贴纸原图上传、缩略图生成和其他受管二进制写入，并且不得创建 AI 任务、调用上游或冻结点数；
- full 状态仍允许编辑已有项目、按既有权限查看和下载已有文件、永久删除项目释放空间、显式清理符合条件的历史普通贴纸原图和缩略图，以及只下载但不更新 latest_exports 的客户端导出；
- LocalDataRoot 不可写或系统磁盘已满时，storage_status 为 unavailable；系统停止新增写操作、后台普通贴纸原图上传、缩略图生成和 AI 调用，但保留已有项目及素材的查看、下载和删除入口；
- 普通贴纸历史文件不得自动清理。只有不再被任何已发布版本或项目引用的后台上传原图和缩略图才可由 super_admin 确认后显式清理；清理必须形成不可修改的 AdminOperationLog，仍有引用时必须拒绝；
- 对项目文件或普通贴纸历史文件执行清理后，只有物理清理完成并重新计量，系统才可更新 managed_content_bytes、capacity_notice_level、storage_status 和 last_measured_at；LocalDataRoot 可写且容量低于硬上限时才能恢复 active；
- P0-A 不创建自动备份，本机测试账号、项目、内容和日志均视为可丢失，不自动或手动迁移到公司正式系统；需要保留的原始生成图或 JPG/PNG 成品由用户主动下载；
- P0-A 不对本机文件实施 Dada 应用层加密，依赖当前 Windows 用户登录和文件系统权限保护。

## 18. 素材来源与运行边界

### 18.1 总交接入口

以下路径表示 2026-07-23 当前机器上的素材交接默认位置，使用 Windows `%USERPROFILE%` 占位符，不包含具体用户名。P0-A 通过本地后端安全配置解析并引用这些素材根目录，原地只读复用；解析后的绝对路径不得写入 PRD、Git、普通项目数据或浏览器响应：

- 交接说明：%USERPROFILE%\Desktop\sticker_web_handoff\STICKER_WEB_REPLICATION_HANDOFF.md
- 机器总入口：%USERPROFILE%\Desktop\sticker_web_handoff\sticker_web_catalog_manifest.json
- 完整性报告：%USERPROFILE%\Desktop\sticker_web_handoff\sticker_archive_validation_20260722.json

当前完整性报告 all_valid 为 true。

### 18.2 文字模板

- 根目录：%USERPROFILE%\Desktop\sticker_text\模板\单模板归档
- 规范入口：各分类 catalog.csv 和 templates/<ID>/metadata.json

### 18.3 字体

- 根目录：%USERPROFILE%\Desktop\sticker_text\字体\面板全量采集\font_panel_full_20260722
- 规范入口：reports/font_panel_catalog.csv 和单字体 metadata.json

### 18.4 文字行为资料

- 输入资料：%USERPROFILE%\Desktop\sticker_text\键盘
- 样式资料：%USERPROFILE%\Desktop\sticker_text\样式

### 18.5 普通贴纸

- 根目录：%USERPROFILE%\Desktop\贴纸素材
- 当前结构：sticker_part1 至 sticker_part25
- 当前数量：1,407 张 PNG

普通贴纸当前缺少统一 catalog，开发准备阶段必须生成 StaticStickerCatalog，但不得改写原始素材。

### 18.6 色卡

- 根目录：%USERPROFILE%\Desktop\sticker_colour\单模板归档
- 规范入口：catalog.csv 和 styles/<ID>/metadata.json

### 18.7 动态贴纸

- 根目录：%USERPROFILE%\Desktop\sticker_interactive\单模板归档
- 规范入口：catalog.csv 和 templates/<ID>/metadata.json

### 18.8 只读规则

- 规范归档是运行素材转换的唯一输入；
- 历史 PB、截图、录像、采集批次和对账目录仅为证据层；
- 产品运行时不读取证据层；
- 不删除、覆盖或原地改写历史资源；
- 规范目录中的硬链接资源按只读处理；
- 需要修正模板时通过新资源版本发布。

### 18.9 P0-A 本机素材交付

- 现有约 3.57 GB 规范素材通过第 18.1 节的 manifest 和本节各素材根目录原地只读复用，不复制全库，不提交到 Git，也不放入 LocalDataRoot；
- Git 只保存版本化 AssetReleaseManifest、catalog、metadata、版本号和哈希；
- 素材根目录由本地后端安全配置管理，代码和普通项目数据不得硬编码当前用户名或桌面绝对路径；
- 浏览器只能使用资源 ID 调用本地后端接口，不得通过 file://、本机绝对路径或 File System Access API 直接读取素材根目录；本地后端响应不得回显素材根目录绝对路径；
- 目录移动、改名、不可读或清单校验失败时，相关素材功能进入 unavailable 并提示重新配置路径，不修改代码、不自动复制素材；
- 本地后端根据 manifest 提供 public_release_asset 的公开只读接口，并对 internal_preview_asset 执行登录状态和 AssetPreviewGrant 校验；
- 发布新资源版本时创建新的 manifest 与版本引用，不覆盖已经被项目引用的旧版本；
- 产品随安装包提供或由本机安全配置原地引用的只读规范素材库不计入 managed_content_bytes；super_admin 后台上传的普通贴纸原图和缩略图必须存放在 LocalDataRoot 并计入 managed_content_bytes，不得写回只读素材根目录；
- 开发准备产生的临时转换文件必须计入 LocalBackendStorageState 的派生二进制文件，确认不再使用后可以显式清理，但不得改写素材源目录；
- P0-B 的正式存储、制品发布、CI 获取和资源交付格式由公司系统合并方案重新定版，本版不假设使用 COS 或任何特定对象存储。

### 18.10 P0-A 本机数据目录

- LocalDataRoot 与只读素材根目录严格分离；
- 默认位置使用当前 Windows 用户的应用数据目录，由本地后端解析，不硬编码用户名；
- 本机数据库、账号、项目、参考图、生成图、导出成品、审计日志和派生文件写入 LocalDataRoot；
- LocalDataRoot 不得位于 Git 仓库、项目目录或用户主动下载目录；
- 浏览器只能使用资源 ID 通过本地后端鉴权接口访问 LocalDataRoot 中的私有文件，不得获得绝对路径，也不得通过 file:// 或 File System Access API 直接读取；用户主动使用标准文件选择器选择参考图不受此限制；
- 删除项目、回收站到期和账号注销均按本 PRD 规则删除相关本机文件；用户侧不可恢复后，物理文件可以由本地后端异步清理；
- 删除 LocalDataRoot 或重新安装时不提供自动恢复；P0-A 不创建自动备份，也不向 P0-B 自动或手动导入测试账号、项目或日志；
- P0-A 不提供可编辑项目包、数据库、账号、点数、审计日志或素材关系的导出与导入。用户只能主动下载原始生成图和 JPG/PNG 成品，且这些图片不作为 P0-B 正式系统的数据迁移来源。

## 19. 隐私、安全与合规要求

### PRIV-01 API 密钥

- P0-A API 密钥只能存在于本地后端安全配置；P0-B 迁移到公司正式安全配置；
- 不进入前端包；
- 不进入 PRD、日志、项目或错误提示；
- 后台不能回显完整密钥。

### PRIV-02 用户内容

- 提示词、参考图、生成图和项目状态均为私有内容；
- 发往 AI 网关、Resend 和高德的外部传输必须使用 HTTPS；P0-A 浏览器与 localhost 本地后端之间不作为远程公开传输；
- 存储访问必须按项目所有者鉴权；
- P0-A 私有资源只能通过本地后端登录鉴权接口访问，不能进入公开素材 manifest 或本地公开静态目录；
- 浏览器不得通过 file://、本机绝对路径或 File System Access API 直接读取素材根目录、LocalDataRoot 或私有文件；本地后端接口使用资源 ID 且不得回显绝对路径；用户主动使用标准文件选择器选择参考图不受影响；
- 未保存画布、提示词、私有图片引用和编辑内容不得写入 localStorage、IndexedDB 或 Cache Storage；
- 超级管理员查看内容必须自动审计；记录在 180 天保留期内不可修改或人工删除，到期后由系统清理。

### PRIV-03 定位

- DYN004 请求浏览器定位前必须说明坐标会保存到项目并显示在导出成品中；
- 用户拒绝后仍可手动输入地点；
- 用户拒绝 Dada 提示后不得调用浏览器定位或自动插入 DYN004；
- 只有 DYN004 在一次明确提示并取得同意后保存原始坐标；
- 坐标不用于广告、用户画像或公开搜索。

### PRIV-04 第三方处理

简短《内测使用与隐私告知》必须告知用户：

- 提示词、参考图和必要参数会发送到所选图片模型服务；
- 邮箱验证码由 Resend 处理；
- 定位可能发送到个人认证的高德 Web 服务；
- P0-A 图片、字体和模板素材从项目方电脑上的只读素材根目录经本地后端提供，账号、项目和生成内容保存在 LocalDataRoot；P0-B 的正式存储在公司系统合并时重新告知；
- P0-A 测试数据依赖当前 Windows 用户登录和文件系统权限保护，Dada 不提供应用层加密或云备份；机器损坏、重装或 LocalDataRoot 被删除后数据不可恢复，重要原始生成图和 JPG/PNG 成品需要用户主动下载；
- 超级管理员在排障或管理场景下可以直接查看私有内容且操作会被记录；
- 注销时内容立即删除，匿名事件和访问审计最多保留 180 天。

P0-A 本地测试页或设置区域还必须明确告知：“测试数据仅保存在本机，不自动备份，也不会迁移到正式系统。”

### PRIV-05 素材授权

项目方已确认当前素材获得公开使用授权。授权记录整理暂不作为 P0-A 或 P0-B 阻塞门槛；正式公开注册或商业化前必须保留可核查记录，并明确字体、贴纸和模板的来源、商用、再分发和二次创作导出范围。该假设不构成对法律风险的绝对保证。

### PRIV-06 内测告知版本

- 注册必须勾选同意简短《内测使用与隐私告知》；
- 告知必须具有版本号和生效日期，账号记录用户同意的版本与时间；
- P0 不要求单独生成完整法律条款，但简短告知不得省略 PRIV-04 的处理方和数据用途；
- 正式公开注册前必须升级并重新评估完整服务条款与隐私政策。

## 20. 非功能需求

### NFR-01 支持环境

P0-A 只正式支持运行本地后端的同一台 Windows 电脑上的当前稳定版 Chrome 和 Edge，且只能通过 localhost 访问。P0-A 不支持 macOS Safari、iOS Safari、Android Chrome、手机、局域网、远程访问或跨设备流程。

P0-A 必须在进入任何产品功能前硬性检查浏览器支持状态。非当前支持版本的 Chrome/Edge 以及其他浏览器只能进入浏览器不受支持引导页，不得继续进入登录、注册、项目、编辑器或运营后台；引导页不得提供绕过或“仍然继续”入口。

P0-B 在完成公司系统合并与远程部署验收后，计划支持发布时当前稳定版的 Windows Chrome、Windows Edge、macOS Safari、iOS Safari 和 Android Chrome，其中手机竖屏与横屏提供完整编辑。各阶段均不承诺兼容验收时的前一稳定版或更旧版本。

### NFR-02 视觉一致性

同一发布阶段中提供相同编辑能力的支持环境必须保持：

- 相同字体选择；
- 相同换行；
- 相同布局；
- 相同颜色、描边、背景和元素尺寸；
- 相同导出像素。

阶段范围按以下规则执行：

- P0-A 只对核心白名单文字模板及其字体、4 个色卡和 10 个动态贴纸，在本机 Windows Chrome 与 Edge 当前稳定版之间执行视觉一致性验收，对应 AC-32；
- P0-B 才对全部 332 个文字模板、86 个字体项、16 个色卡和 35 个动态贴纸，在 Windows Chrome/Edge、macOS Safari、iOS Safari 和 Android Chrome 当前稳定版中执行全量视觉回归，对应 AC-26；
- P0-B 的全量和跨平台回归结果不属于 P0-A 完成条件。

视觉回归使用固定浏览器版本、操作系统、视口、DPR、字体加载完成状态、动画状态和确定动态数据生成基准图。

- 元素边界相对基准图偏差不得超过 2px；
- 任一颜色通道绝对差异超过 16/255 的像素视为显著差异；
- 显著差异像素不得超过画布总像素的 1%；
- 超过任一阈值必须人工复核，不能自动判定通过；
- DYN012、style_02 至 style_16 和其他已知替代或近似项无论是否低于阈值均需人工复核。

### NFR-03 编辑性能

P0-A 电脑完整编辑器和 P0-B 电脑完整编辑器在包含 50 个元素的标准画布中：

- 选择和移动元素不能出现持续无响应；
- 画布控件不能因动态内容改变尺寸而跳动；
- 自动保存不能阻塞正在进行的本地画布操作；
- 导出失败不能破坏项目状态。

P0-B 手机完整编辑器采用两级门槛：

- 20 个混合元素为常规画布，选择、移动、缩放、旋转、撤销重做和面板操作不得出现持续无响应或操作丢失；
- 50 个混合元素为压力上限，必须能完成选择、修改、保存和导出；
- 50 元素压力模式允许关闭实时辅助线或降低编辑预览分辨率，但必须明确提示，不得删除元素、改变布局或降低最终导出分辨率与质量；
- 手机旋转屏幕不得改变画布内容、选区、撤销栈或未保存状态。

具体性能预算由 DevelopmentPlan 定义。

### NFR-04 内测容量

P0-A 人工验收固定使用项目方控制的 1 个超级管理员账号和 1 个普通账号，不要求朋友参与或招满 10 人。跨普通用户隔离验收由测试程序在同一电脑的独立浏览器配置中临时创建第二个普通账号，按普通权限和名额规则运行，完成后清理。系统最多开放 10 个普通账号，P0-B 最多开放 50 个普通账号。active 和 suspended 普通账号占名额，deleted 普通账号释放名额，super_admin 不占普通账号名额。同账号仅一个运行中生成任务，系统必须具备用量、失败和本机存储状态监控。

### NFR-05 数据完整性

- 点数扣减必须原子化；
- 只有带完整流水的超级管理员调点可以使 available_balance 为负数，生成与结算流程不得制造负数；
- 自动保存必须有明确成功或失败状态；
- 项目资源与项目状态必须保持引用一致；
- 素材下架不能破坏已有项目；
- 账号注销不能残留可恢复作品；
- AdminOperationLog 和 PrivateContentAccessLog 在 180 天保留期内不得被后台修改或人工删除，到期后必须由系统清理。

### NFR-06 可访问性基础

- 关键按钮必须可用键盘访问；
- 控件不能只依赖颜色表达状态；
- 图片上传、生成状态和错误必须有文字说明；
- 图标名称和焦点顺序由 UIDesign.md 明确。

### NFR-07 客户端存储上限

- Dada 主动建立的公开素材持久缓存硬上限为 157,286,400 字节，对用户显示为 150 MB；
- 缓存采用 LRU 淘汰，资源升版后优先清理不再引用的旧版本；
- 不预下载全量文字模板、普通贴纸、色卡、动态贴纸或字体；
- 用户主动下载到系统下载目录的成品不计入 Dada 缓存；
- 浏览器自身不受 Dada 控制的通用 HTTP 缓存不计入应用内计数，但 Dada 不能借此建立第二套应用持久缓存。

### NFR-08 辅助服务零新增自动费用

- P0-A 使用项目方现有电脑、本机磁盘和用户主动配置的 AI 生图额度，不接入会自动转为付费的辅助服务；
- 邮件和高德达到应用侧硬上限时必须暂停对应调用，不能购买流量、自动充值或自动扩容；
- AI 网关不得开启自动充值；模型级余额不足只把对应模型标记为运行时不可用，账户级或无法确定影响范围时把共享该网关结算账户的全部模型标记为运行时不可用，不改写后台默认模型；
- P0 不承诺 AI 调用成本为零；P0-B 公司基础设施费用需在合并方案中另行确认。

### NFR-09 P0-A 本机运行边界

- 本地后端只监听 localhost 回环地址，不监听局域网地址，也不提供公网映射；
- LocalDataRoot 必须位于项目目录和 Git 仓库之外，并使用当前 Windows 用户权限读写；
- P0-A 不创建本机自动备份，不承诺恢复被删除的数据目录或操作系统故障后的测试数据；
- 既有约 3.57 GB 素材原地只读使用，不复制到 LocalDataRoot；
- API 密钥只进入本地后端安全配置，不写入仓库、前端、manifest 或本机数据日志。
- DevelopmentPlan 必须定义审计清理、诊断与错误日志轮转，以及数据库或日志目录不可写时进入 unavailable 的实现；本版不规定数据库或日志文件大小硬上限。

## 21. 异常与边界状态

| 场景 | 预期产品行为 |
| --- | --- |
| 邀请码无效或过期 | 阻止注册并说明原因 |
| 已注册邮箱再次注册 | 不重复创建账号，明确引导登录 |
| 未注册或已注销邮箱尝试登录 | 不创建会话，明确引导使用邀请码注册 |
| 暂停账号注册或登录 | 不创建账号或会话，明确提示联系管理员 |
| 非管理员白名单邮箱尝试后台登录 | 发送验证码前拒绝，不创建管理员账号或会话 |
| 管理员被停用或移出白名单 | 已有管理员会话立即失效，不允许继续后台操作 |
| 全部管理员被停用 | 后台不提供自助恢复，只能由部署人员通过当前阶段的后端安全配置恢复 |
| 验证码错误或过期 | 不创建会话，允许按频率限制重试 |
| 点数不足 | 不创建任务，不调用上游 |
| 超级管理员扣点超过可用余额 | available_balance 可变为负数，reserved_balance 不变并记录完整流水 |
| 模型被停用 | 从新任务选择中移除，历史仍可见 |
| 超级管理员停用当前默认模型但未提供合法替代模型 | 原子操作整体失败，原启停、默认和推荐优先级均不变 |
| 模型推荐优先级缺失、非正整数或重复 | 整个模型配置保存失败，不允许部分写入 |
| 后台默认模型运行时不可用 | 不改写配置默认模型；在其他运行时可用模型中按 recommendation_priority 返回推荐模型，没有可用模型时返回空推荐并进入既有生成禁用或失败状态 |
| 当前比例不被模型支持 | 要求重新选择比例 |
| 参考图数量超出模型限制 | 阻止提交并指出超出数量 |
| 提交时 ModelConfig 已变化 | 不创建任务或冻结点数，显示最新配置并要求重新确认 |
| 已有运行中任务 | 返回当前任务，不创建第二个 |
| upstream_timeout、upstream_failed 或 unknown_retryable | 进入 failed，释放点数，保留草稿并按分类提供重试 |
| AI 网关明确为模型级余额不足 | 释放任务冻结点数，只把明确受影响模型标记为运行时不可用，不改写后台默认模型 |
| AI 网关账户级余额不足或影响范围未知 | 释放任务冻结点数，把共享该网关结算账户的全部模型标记为运行时不可用，不改写后台默认模型 |
| safety_rejected | 进入 rejected，不保存输出，释放点数并要求修改输入 |
| 生成历史达到 10 张 | 要求删除旧图后再生成 |
| active 项目达到 20 个 | 阻止创建或恢复；trashed 项目保持原 purge_at，要求先释放活动项目名额 |
| 强制刷新、关闭或浏览器崩溃 | 丢弃未保存修改，重新打开时只加载最后一次后端 saved 状态 |
| 画布达到 50 个元素 | 阻止添加并提示删除元素 |
| 自动保存失败 | 显示未保存，允许重试 |
| 多标签或多设备版本冲突 | 旧页面只读，可本地导出一次，之后刷新后端最新版；P0-A 只验收同机多标签 |
| 定位被拒绝 | 回退到地点手动输入 |
| 地理编码失败 | 保留手动输入，不阻塞其他编辑 |
| 字体资源失败 | 显示模板不可用或明确回退，不能无提示换字形 |
| 导出失败 | 保留上次成功成品和当前项目 |
| 非当前支持版本 Chrome/Edge 或其他浏览器访问 P0-A | 直接显示浏览器不受支持引导页，不进入任何产品功能且不提供继续入口 |
| 非本机、局域网或远程地址尝试访问 P0-A | 无法连接本地后端，产品不显示远程或移动端入口 |
| P0-B 手机旋转屏幕 | 自适应重排，不丢失画布、撤销栈或未保存状态 |
| 超级管理员查看私有内容 | 按 super_admin 身份与告知版本持久记录首次提示确认；同版本不重复、文案升版后重新提示，每次点击“打开并记录审计”仍生成独立不可篡改审计 |
| 后端保存失败但浏览器可渲染 | 允许下载本地导出，不更新后端成品 |
| 项目没有导出成品 | 显示明确空状态，不自动导出 |
| Resend 达到硬上限或供应商接口不可用 | 暂停注册和需要新验证码的登录，显示真实状态并通知超级管理员 |
| 高德达到每月硬上限或不可用 | 停用 DYN004 自动定位，保留其他不依赖定位的能力 |
| 公开素材缓存达到 150 MB | 按 LRU 淘汰旧资源后再缓存，不写入任何私有状态 |
| 本机内容达到 80% 且低于 90% | 显示非阻断容量提醒，继续允许生图、保存、后台贴纸上传和缩略图生成，不自动删除 |
| 本机内容达到 90% 且低于 5 GB | 持续显示清理提醒，按下载成品、永久删除项目或显式清理符合条件的无引用贴纸文件、等待清理重测、恢复后继续生成的顺序引导，不自动删除 |
| 本机内容达到 5 GB | 不自动删除；阻止新生图、参考图持久化、最新成品保存、后台普通贴纸原图上传、缩略图生成和其他受管二进制写入，保留编辑、已有内容读取、下载和符合规则的显式清理 |
| LocalDataRoot 不可写或系统磁盘已满 | storage_status 进入 unavailable，停止新增写入、后台贴纸上传、缩略图生成和 AI 调用，保留已有内容查看、下载和删除 |
| 超级管理员清理后台上传贴纸历史文件 | 只允许清理无任何已发布版本或项目引用的原图和缩略图；要求确认并审计，物理清理和重新计量完成前不更新容量状态 |
| 素材根目录移动、改名或不可读 | 只暂停依赖该目录的素材功能并提示重新配置，不修改代码或自动复制素材 |
| 浏览器尝试直接读取本机素材或私有目录 | 阻止 file://、绝对路径和 File System Access API 访问，要求通过本地后端资源 ID 接口 |

## 22. 场景式验收标准

本节 AC 按当前交付阶段分为三类：

| 分类 | AC 范围 | 当前 P0-A DevelopmentPlan 处理规则 |
| --- | --- | --- |
| P0-A 必验 | AC-01–07、AC-09–14、AC-16–22、AC-24–25、AC-27–35、AC-39–53、AC-55–56 | 必须拆入当前开发与验收任务 |
| 通用规则、当前只验 P0-A 子集 | AC-15、AC-23、AC-36、AC-38 | 只拆入各场景明确写出的 P0-A 操作和预期；P0-B 子集留待未来单独立项 |
| P0-B 门槛与未来验收 | AC-08、AC-26、AC-37、AC-54 | 不属于当前 P0-A 开发交付，不得拆入当前迭代，也不得阻止 P0-A 完成 |

DevelopmentPlan 按 AC 编号拆任务时必须先应用本表，不能因为某个 AC 位于同一章节或包含完整 P0 描述，就把 P0-B 能力纳入当前 P0-A。未来 P0-B 单独立项后仍须执行其专属 AC 及通用场景中的 P0-B 子集。

### AC-01 有效邀请注册

前置条件：超级管理员创建了未过期且未达使用上限的邀请码，当前阶段占用名额的普通账号总量未达上限。

操作：

1. 新用户进入独立注册入口并输入邀请码和邮箱；
2. 系统在发送验证码前确认邀请码有效；
3. 用户输入有效验证码并填写创作署名和社交 ID；
4. 用户勾选同意当前版本《内测使用与隐私告知》；
5. 系统原子创建账号并占用一次邀请码。

预期：

- 账号创建成功；
- 默认获得 10 点；
- 邀请码只增加一次已使用次数；
- 登录状态保持 30 天；
- 进入创作工作台。

### AC-02 无效邀请注册

前置条件：邀请码不存在、过期、停用或已达使用上限。

操作：用户在注册入口提交邀请码和邮箱。

预期：

- 注册失败；
- 不发送验证码；
- 不创建账号；
- 不赠送点数；
- 显示明确原因。

### AC-03 生成成功

前置条件：用户 available_balance 足够，当前没有运行中任务。

操作：

1. 选择启用模型；
2. 输入提示词；
3. 选择比例和合法参考图；
4. 从工作台“新建创作”提交生成。

预期：

- 创建一个任务；
- 冻结正确点数；
- 成功后保存一张图片；
- 点数转为已扣除；
- 图片加入当前项目历史；
- 创建的是一个新项目；
- 用户可以继续编辑。

### AC-04 生成失败退款

前置条件：上游失败、超时或安全拒绝。

操作：用户提交生成并等待结果，然后从失败页重试。

预期：

- 任务进入 failed 或 rejected；
- 冻结点数全部释放；
- 不产生成功图片；
- 提示词和草稿项目保留；
- 重试在同一项目内只新增 GenerationJob，不创建第二个项目；
- 用户也可以返回工作台主动“新建创作”创建其他项目。

### AC-05 并发限制

前置条件：账号已有 queued 或 running 任务。

操作：用户再次点击生成。

预期：

- 不创建第二个任务；
- 不再次冻结点数；
- 提供返回当前任务的入口。

### AC-06 生成历史上限

前置条件：项目已有 10 张成功生成图。

操作：用户从该项目的“继续生成”入口尝试再次生成。

预期：

- 阻止提交；
- 提示先删除旧历史图；
- 删除非当前底图后可继续生成。
- 用户仍可通过工作台“新建创作”创建其他比例的新项目。

### AC-07 更换底图

前置条件：画布已有文字、普通贴纸、色卡和动态贴纸。

操作：用户切换到另一张项目历史图。

预期：

- 所有覆盖元素保留；
- 普通文字和贴纸位置不变；
- 新底图比例与项目固定比例一致；
- 色卡重新提取五色；
- 新底图调色状态使用默认值；
- 操作可撤销并自动保存。

### AC-08 P0-B 文字模板全量加载

前置条件：准备从 P0-A 升级到完整 P0。

操作：系统读取四类 catalog.csv 并完成全量模板验证。

预期：

- 展示 145 个花字、119 个标题、51 个标签和 17 个简约模板；
- 共 332 个；
- FLOWER007 和 FLOWER025 不因缺少 ZIP 被判为失败；
- 列表按稳定 ID 和 catalog 顺序工作；
- 白名单外模板可以按批次进入 internal_preview 或 passed，未授权普通账号不能发现；
- 全部通过后一次性启用，不逐批向普通用户开放。

### AC-09 文字内容与换行

前置条件：用户已选择文字模板。

操作：输入两行文字并点击完成。

预期：

- 画布显示两行；
- 换行保存到项目；
- 重新打开项目后内容一致；
- 导出内容一致。

### AC-10 模板切换

前置条件：用户已输入多行文字并修改样式。

操作：切换到另一文字模板。

预期：

- 文本和换行保留；
- 使用新模板默认字体和样式；
- 画布位置、旋转和整体尺寸保留；
- 可以撤销回原模板和样式。

### AC-11 字体覆盖

操作：完整 P0 用户从 86 个字体项中选择字体；P0-A 用户只使用白名单模板实际引用字体及 FONT081。

预期：

- 实际渲染加载归档字体文件；
- 模板颜色、描边和装饰保留；
- 共享同一字体二进制的两个面板项仍保持各自入口；
- 重新打开项目后字体一致。

### AC-12 文字样式

操作：用户设置自定义填充色、描边色与宽度、背景色与透明度、对齐、行距和字距。

预期：

- 行距只能在 1.0 至 1.9 间按 0.1 调整；
- 字距只能在 1.0 至 20.0 间按 1.0 调整；
- 背景透明度不影响文字；
- 点击完成后作为一次撤销记录；
- 导出与画布一致。

### AC-13 普通贴纸全量加载

操作：用户在弱网条件下打开贴纸面板，依次进入 part1 至 part25、滚动列表并把贴纸加入画布。

预期：

- 共显示 1,407 张普通 PNG；
- 3 组重复资源在各自 part 中均存在；
- 不按文件名生成虚假标题；
- 用户可浏览和查看最近使用；
- 面板使用虚拟列表，未滚动到的缩略图不提前加载；
- 未加入画布的贴纸原图不因打开 part 而批量下载；
- 加入画布后才按需取得原图，滚动过程不持续增加 DOM 节点。

### AC-14 普通贴纸编辑

操作：用户添加贴纸并移动、缩放、旋转、翻转、调透明度、复制和调整层级。

预期：

- 每个操作正确反映画布和导出；
- 操作可撤销；
- 自动保存后重新打开结果一致。

### AC-15 分阶段色卡

前置条件：画布有底图。P0-A 启用 COLOR001、COLOR002、COLOR008、COLOR016；P0-B 未来启用全部 16 种色卡。

操作：当前 P0-A 用户依次添加 4 种白名单色卡；未来 P0-B 再依次添加全部 16 种色卡样式。

预期：

- 每个色卡提取相同的五色调色板；
- P0-A 的 4 种白名单布局均可生成；P0-B 子集验收时全部 16 种布局均可生成；
- 更换底图后自动更新；
- 裁剪、调色或滤镜变化不更新已有色卡；
- 面板信息图标准确解释其基于原始底图；
- 不因色卡提取额外上传底图。

### AC-16 动态时间贴纸

操作：用户添加时间贴纸，修改日期时间并提交。

预期：

- 默认使用浏览器本地当前值；
- 使用用户修改后的值渲染；
- 重新打开项目不自动改变；
- 导出为不可点击的静态内容。

### AC-17 动态地点贴纸

操作：

1. 用户选择 DYN004；
2. Dada 在调用定位前说明原始坐标会保存并显示在成品中；
3. 用户确认并授权浏览器定位；
4. 系统解析地点；
5. 用户修改地点文字并插入。

预期：

- 普通地点模板保存确认后的地点文字；
- DYN004 只提示一次并保存原始坐标；
- 用户拒绝 Dada 提示时不调用定位，也不自动插入 DYN004；
- 用户可改用仅保存地点文字的其他地点模板；
- 删除项目或注销账号后坐标按规则删除。

### AC-18 身份贴纸

操作：用户添加普通署名贴纸和带 @ 的社交 ID 贴纸。

预期：

- 默认读取注册资料；
- @ 前缀不重复；
- 单贴纸覆盖不修改账号资料；
- 导出为静态视觉内容。

### AC-19 DYN012

操作：用户添加 DYN012。

预期：

- 使用 FONT081 Lexend Deca；
- 模板仍可编辑和导出；
- 测试结果明确标注为替代字体；
- 不宣称使用 DIN_MediumAlternate.otf。

### AC-20 自动保存与撤销

操作：

1. 用户在 1 秒内连续完成多次画布操作；
2. 执行撤销和重做；
3. 等待自动保存；
4. 模拟一次保存失败后恢复网络；
5. 记录当前后端 saved 状态，再断网创建未保存修改并尝试正常刷新；
6. 取消离开警告后继续修改，再分别模拟强制刷新和浏览器崩溃；
7. 重新打开项目。

预期：

- 当前会话撤销和重做顺序正确；
- 同一时间只有一个保存请求，连续变化合并到最新状态；
- 后端保存最终已提交状态；
- 正常刷新被离开警告拦截并尝试最后一次保存；
- 强制刷新或崩溃后重新打开时，只恢复最后一次后端 saved 状态且撤销栈为空；
- 保存失败时不显示已保存，页面保持打开后自动重试；
- 浏览器持久化存储中不存在未保存项目副本。

### AC-21 项目删除与恢复

操作：

1. 用户删除项目；
2. 把其他 active 项目补到 20 个，并在 deleted_at 后 720 小时内尝试恢复；
3. 删除一个 active 项目释放名额，再次恢复；
4. 再次删除并主动永久删除；
5. 另一个项目等待到 purge_at。

预期：

- 删除后释放活动项目名额；
- 20 个 active 项目已满时恢复被阻止，待恢复项目继续保持 trashed，原 deleted_at 和 purge_at 不变；
- 释放活动项目名额后，purge_at 前可以恢复为 active；
- 主动永久删除后立即不可恢复；
- 到达 purge_at 后即使物理清理任务尚未完成，用户侧也不可恢复；
- 关联生成图、参考图、坐标和导出成品进入异步物理清理。

### AC-22 账号注销

操作：用户确认注销。

预期：

- 所有会话立即失效；
- 账号和所有作品立即删除；
- 旧账号和作品无法恢复；
- 原邮箱可以使用新邀请码创建全新账号；
- 匿名事件和访问审计按 180 天规则保留且不能恢复用户内容。

### AC-23 导出

操作：在仍有未提交文字修改时确认提交，并分别在四种比例导出 JPG 和 PNG。

预期：

- 像素尺寸准确；
- 无 Dada 水印；
- 画布元素无错位、缺字或裁切；
- 未提交文字经确认后进入撤销历史并出现在导出中；
- 每种格式只保留最新一份；
- P0-A 可在同一电脑再次下载；P0-B 可在任一受支持设备再次下载。

### AC-24 P0-A 本机访问边界

操作：在项目方 Windows 电脑启动本地后端，分别从该电脑的 localhost、该电脑的局域网 IP、同一局域网内另一设备和手机尝试访问；再在本机当前稳定版 Chrome、Edge、其他浏览器和不受支持的 Chrome/Edge 版本中检查产品入口，并尝试从不受支持引导页继续进入登录、项目、编辑器和运营后台。

预期：

- localhost 在本机 Windows Chrome 和 Edge 当前稳定版中可用，并可完成注册登录、生图、编辑、项目管理和导出；
- 其他浏览器和不受支持的 Chrome/Edge 版本直接进入浏览器不受支持引导页，只说明支持环境及重新打开方式；
- 引导页没有“仍然继续”或其他绕过入口，且不能进入登录、注册、项目、编辑器、运营后台或任何产品功能；
- 本地后端只监听回环地址，通过局域网 IP、另一设备或手机均不能访问；
- P0-A 页面不显示手机、局域网、远程访问或跨设备继续编辑能力；
- 页面或设置区域显示“测试数据仅保存在本机，不自动备份，也不会迁移到正式系统。”；
- 不要求备案域名、HTTPS、公司服务器或对象存储即可完成 P0-A 验收。

### AC-25 管理员私有内容访问

操作：super_admin 首次进入私有内容区域并确认当前告知版本，随后在新标签页、重启浏览器和重新登录后再次进入；再升级告知文案版本并进入区域；最后从生成记录打开图片或完整提示词。

预期：

- 内容不会在列表中默认展示；
- 首次进入私有内容区域时显示一次全局规则提示，确认状态按 super_admin 身份和告知版本持久记录；
- 同一告知版本在新标签页、新会话或其他本机受支持浏览器中不重复显示，告知文案升版后必须重新提示；
- 每个入口显示“打开并记录审计”；
- 不要求二次确认或查看原因即可打开；
- 自动产生包含管理员、目标、时间、内容类型和 expires_at 的 PrivateContentAccessLog；
- 全局提示是否已确认不影响每次打开均创建独立 PrivateContentAccessLog；
- 审计记录在 180 天内不能修改或人工删除，到期后由系统清理；
- 只有 super_admin 可以访问审计后台。

### AC-26 全量模板视觉回归

前置条件：P0-B 已经未来单独立项并进入内部验收环境。本场景不属于 P0-A 验收范围，缺少本场景结果不阻止 P0-A 完成，但必须阻止 AC-54 的 P0-B 普通用户开放。

操作：

- 使用固定画布、默认文字和确定数据渲染全部 332 个文字模板、16 个色卡和 35 个动态贴纸；
- 生成截图；
- 自动比较并人工复核。

预期：

- 所有模板均可加载；
- 字体、布局、换行、颜色、描边和装饰与归档参考结构一致；
- Windows Chrome/Edge、macOS Safari、iOS Safari 和 Android Chrome 当前稳定版结构一致；
- 元素边界偏差不超过 2px；
- 单通道差异超过 16/255 的显著像素不超过画布的 1%；
- style_02 至 style_16 和 DYN012 的已知近似或替代必须在报告中标明。

### AC-27 50 元素画布

前置条件：P0-A 或 P0-B 电脑完整编辑器。

操作：

1. 在画布添加 50 个混合元素；
2. 多选并移动；
3. 导出；
4. 尝试添加第 51 个元素。

预期：

- 前 50 个元素可编辑、保存和导出；
- 第 51 个被阻止；
- 页面不持续无响应；
- 不破坏已有项目。

### AC-28 余额不足

前置条件：用户 available_balance 低于所选模型的单次点数。

操作：用户填写合法提示词并尝试提交生成。

预期：

- 生成按钮不可提交；
- 显示当前可用点数、冻结点数、本次所需点数和联系管理员的提示；
- 不创建生成任务；
- 不调用上游模型；
- 不产生点数流水或余额变化。

### AC-29 超级管理员调点与原子扣减

操作：

1. 超级管理员为指定用户增加点数并填写原因；
2. 用户同时发起两个生成提交；
3. 在任务仍冻结点数时，超级管理员扣减超过 available_balance 的点数。

预期：

- 每次超级管理员调整均形成独立流水，记录管理员、原因、变动前后余额和时间；
- 同一账号只创建一个生成任务并只冻结一次点数；
- reserved_balance 不因管理员调点变化；
- available_balance 可以因管理员操作变为负数并向用户显示；
- 生成并发和任务结算本身不会额外制造负数；
- 生成成功时冻结点数只提交一次，失败时只释放一次；
- 用户可以查看自己的调整和生成点数流水。

### AC-30 模型启停与配置

前置条件：三个模型均已建立独立 ModelConfig。

操作：

1. 用户打开生图页并确认当前模型点数和限制；
2. 超级管理员修改该模型的点数、比例或参考图上限；
3. 用户不刷新旧页面直接提交；
4. 用户重新确认最新配置并提交；
5. 超级管理员先尝试停用当前默认模型但不提供合法替代模型，再在同一操作中指定另一个已启用模型作为新默认模型并停用原默认模型；
6. 先尝试保存缺失、非正整数或重复的 recommendation_priority，再为三个模型配置互不重复的正整数，并分别模拟后台默认模型运行时不可用、全部模型运行时不可用和外部服务恢复；
7. 超级管理员修改 error_mapping_profile，再修改模型端点或响应协议。

预期：

- 旧页面提交被拒绝，不创建任务、不调用上游且不冻结点数；
- 页面显示最新配置并要求用户重新确认；
- 重新确认后才使用最新启用配置创建任务；
- 未提供合法替代模型时整个停用操作失败，原模型启停、默认和推荐优先级均不变；
- 提供另一个已启用模型后，停用原默认模型和设置新默认模型在同一原子操作中成功，系统始终恰好有一个已启用默认模型；
- recommendation_priority 只能使用唯一正整数，1 为最高，不允许并列；
- recommendation_priority 缺失、非正整数或重复时整个保存失败，不产生部分配置更新；
- 后台默认模型运行时不可用时，ModelConfig.enabled、is_default 和 recommendation_priority 均不改变，后端按优先级返回其他运行时可用模型；全部模型不可用时返回空推荐并进入既有生成禁用或失败状态；
- 外部服务恢复只恢复运行时可用状态，不改写后台默认模型或推荐优先级；
- 停用后该模型不可创建新任务；
- 停用前已经提交的任务继续完成并按提交时配置结算；
- error_mapping_profile 只能映射到固定 GenerationErrorCategory，保存后生成新的 config_version；
- 模型端点或响应协议变化后 contract_validation_status 立即重置为 unverified；
- 后台不显示完整 API 密钥。

### AC-31 素材上下架与版本发布

操作：

1. 超级管理员上传合法的普通 PNG 或 WebP，指定 part、顺序并上架；
2. 用户把该素材加入项目；
3. 超级管理员将素材下架；
4. 检查上传原图和生成缩略图对 managed_content_bytes 的影响；
5. 分别在 storage_status 为 full 和 unavailable 时尝试上传原图、生成缩略图和读取已有贴纸；
6. 分别尝试清理仍被已发布版本或项目引用的文件，以及不再被任何已发布版本或项目引用的历史上传原图和缩略图；
7. 超级管理员尝试发布校验失败的复杂模板资源包，再发布校验通过的新版本。

预期：

- 上架后的普通贴纸按指定 part 和顺序出现；
- 后台上传的普通贴纸原图和缩略图均计入 managed_content_bytes，产品只读规范素材库不计入；
- full 或 unavailable 时不能上传原图、生成缩略图或写入其他受管二进制内容，但已有贴纸仍可按权限读取；
- 下架后不能添加到新项目，但已有项目仍可渲染和导出；
- 非法格式、缺失文件或哈希不一致的资源被拒绝；
- 校验失败的复杂模板资源包不能启用；
- 校验通过的新版本可启用，且保留稳定模板 ID、版本号和发布记录；
- 后台不能直接修改复杂模板内部样式；
- 仍被任何已发布版本或项目引用的原图或缩略图不能清理；无引用历史文件只有在 super_admin 明确确认后才能清理；
- 清理请求、引用校验和结果形成不可修改的 AdminOperationLog，不发生自动清理；
- 只有物理清理完成并重新计量后，managed_content_bytes 和 LocalBackendStorageState 才更新。

### AC-32 P0-A 核心白名单与视觉一致性

前置条件：系统处于普通账号上限 10 个的 P0-A 阶段，普通用户没有内部预览授权。

操作：普通用户浏览文字、字体、色卡、动态贴纸和普通贴纸面板；再使用固定画布、默认文字、确定动态数据、固定视口和 DPR，分别在本机 Windows Chrome 与 Edge 当前稳定版中渲染全部 P0-A 核心白名单复杂模板并比较结果。

预期：

- 只显示 FLOWER001–008、H001–008、TAG001–007、TAG051、SIMPLE001–008；
- 字体只显示上述模板实际引用项并包含 FONT081；
- 只显示 COLOR001、COLOR002、COLOR008、COLOR016；
- 只显示 DYN001–004、DYN007、DYN008、DYN011、DYN012、DYN015、DYN016；
- part1 至 part25 的 1,407 张普通贴纸全部显示；
- 白名单外复杂模板已经注册但对该普通用户不可发现；
- 第 11 个占用名额的普通账号被阻止创建；
- super_admin 不占普通账号名额。
- P0-A 白名单文字模板及其字体、4 个色卡和 10 个动态贴纸在 Windows Chrome 与 Edge 中均可加载；
- 两个浏览器中的字体、换行、布局、颜色、描边、装饰和导出像素保持一致；
- 元素边界偏差、显著颜色差异和人工复核规则遵守 NFR-02；
- 本场景不要求 macOS Safari、iOS Safari、Android Chrome 或白名单外复杂模板通过。

### AC-33 认证状态机

操作：分别测试未注册、已注册、已注销和 suspended 邮箱在注册与登录两个入口的行为。

预期：

- 未注册邮箱只可通过有效邀请码注册；
- 已注册邮箱重复注册时明确引导登录且不消耗邀请码；
- 未注册或已注销邮箱登录时明确引导注册；
- suspended 邮箱不能注册或登录，并明确提示联系管理员；
- 已注销邮箱可用新邀请码创建全新账号，旧数据不恢复；
- 账号创建与邀请码次数增加保持原子一致。

### AC-34 新建、追加与固定比例

操作：

1. 从工作台连续使用两次“新建创作”；
2. 从其中一个项目使用“继续生成”；
3. 尝试在项目内切换比例。

预期：

- 两次新建产生两个项目；
- 项目内继续生成只追加历史，不创建第三个项目；
- 追加生成只能沿用项目比例；
- 改比例入口引导新建项目；
- 一个项目达到 10 张不会阻止创建另一个项目。

### AC-35 保存失败、离开与本地导出

操作：用户在有未保存修改时使本地后端保存失败、尝试离开页面并导出，再分别强制刷新、关闭页面和模拟浏览器崩溃；另一次正常导出中模拟成品写入 LocalDataRoot 失败。

预期：

- 未保存画布、提示词、私有图片引用和编辑内容只存在当前页面内存，不写 localStorage、IndexedDB 或 Cache Storage；
- 页面保持打开时自动重试；
- 站内离开提供保存并离开、放弃和取消；
- 后端保存失败时仍可本地下载当前 JPG/PNG；
- 正常导出由客户端合成，同一文件用于下载和写入 LocalDataRoot；
- 项目保存或成品持久化失败时，本地导出不更新后端 latest_exports；
- 强制刷新、关闭或崩溃后重新打开，只恢复最后一次后端 saved 状态；
- 浏览器持久化存储中不存在可用于恢复的私有项目草稿。

### AC-36 多标签与 P0-B 多设备冲突

前置条件：P0-A 只验收同一台 Windows 电脑中的多标签冲突。P0-B 另用电脑和手机执行的多设备冲突属于未来验收，不是 P0-A 完成条件。

操作：P0-A 在同机两个标签页同时基于同一 state_version 编辑；未来 P0-B 再使用不同电脑和手机重复该场景。较新的页面先保存，旧页面后保存。

预期：

- 旧版本页面进入只读冲突状态；
- 不允许覆盖后端状态或另存项目副本；
- 允许本地导出一次且不更新后端成品；
- 用户确认后刷新到电脑保存的最新版本。

### AC-37 P0-B 手机横竖屏完整编辑

前置条件：系统处于 P0-B 内部验收环境，尚未要求向普通用户开放 P0-B。

操作：分别在 iOS Safari 和 Android Chrome 当前稳定版中编辑 20 元素常规画布和 50 元素压力画布，并在编辑中旋转屏幕。

预期：

- 20 元素画布在竖屏和横屏均能完成全部编辑与导出，不出现持续无响应或操作丢失；
- 50 元素画布可完成选择、修改、保存和导出；
- 50 元素时允许关闭实时辅助线或降低编辑预览分辨率，但必须提示且不得改变最终导出；
- 旋转后画布、选区、撤销栈和未保存状态不变；
- 工具栏和面板不重叠、不溢出；
- 触控多选、循环选择、长按候选列表和框选可用。

### AC-38 无导出成品

前置条件：项目已有生成图但从未导出。

操作：P0-A 用户在本机打开成品下载区域；P0-B 在各受支持设备重复该场景。

预期：

- 显示“暂无导出成品”；
- P0-A 本机提供进入编辑并导出以及下载原始生成图；
- P0-B 电脑和手机提供等价入口；
- 系统不自动生成默认 PNG 或 JPG。

### AC-39 注销后匿名保留

操作：注销一个曾生成图片且被超级管理员查看过内容的账号。

预期：

- 个人资料、内容、项目、坐标和业务原 ID 立即删除；
- 匿名事件只保留随机主体、时间、模型、结果、错误类别和点数变化；
- 私有访问审计保留超级管理员身份，被查看用户和目标断链；
- 匿名事件在注销 180 天后删除，私有访问审计在各自访问事件发生 180 天后删除，注销不延长访问审计期限；
- 长期汇总统计不能回溯到个人或单次作品。

### AC-40 三模型网关契约

操作：对三个模型分别执行纯文字、参考图、四种比例、失败、超时和安全拒绝验证；在某一模型验证通过后，修改其端点、请求字段、参考图协议、响应结构、同步或异步模式、任务查询方式或错误协议中的任一项。

预期：

- 每个模型形成独立脱敏证据；
- 明确同步或异步模式、图片返回格式和任务查询方式；
- 错误状态正确映射，冻结点数只提交或释放一次；
- 未验证模型的 contract_validation_status 不能设为 verified；
- 不因一个模型成功而推断另外两个模型协议相同；
- 任一契约相关配置变化后，对应模型立即重置为 unverified，必须重新执行本场景才能恢复 verified。

### AC-41 P0-A 本机测试准备

操作：在使用项目方控制的 1 个超级管理员账号和 1 个普通账号执行 P0-A 人工验收前完成发布检查。

预期：

- 本地网页与本地后端可启动，后端只监听 localhost，局域网和其他设备无法访问；
- 第 18 节现有素材根目录可读，manifest 与素材文件校验通过，且没有复制第二套约 3.57 GB 全量素材；
- LocalDataRoot 位于项目目录和 Git 仓库之外、可写且未硬编码 Windows 用户名，LocalBackendStorageState 的 80%/90% 预警和 5 GB 限制可用；
- Resend 发信域名完成验证，QQ、163 和企业邮箱分别 20 封中至少 19 封在 2 分钟内送达；
- Resend 每天 80 封、每月 2,400 封的应用硬上限与暂停状态可用，未配置付费备用通道；
- 正式验收的普通账号与超级管理员认证真实调用 Resend；开发环境预置普通测试账号不能替代 AC-01、AC-33、AC-41 或 AC-49；
- 个人认证高德 Web 服务 Key 的定位、逆地理编码、绑定、安全限制和每月 1,000 次硬上限实测通过；
- AI 网关未开启自动充值，模型级、账户级和未知影响范围的余额不足运行时不可用规则可用，且不改写后台默认模型；
- AI 网关完整矩阵通过；
- 注册页展示并记录用户同意的《内测使用与隐私告知》版本；
- 注册告知和本地测试提示明确说明数据由当前 Windows 用户登录和文件系统权限保护、不提供应用层加密或云备份、机器损坏/重装/LocalDataRoot 删除后不可恢复，并提示主动下载重要图片；
- Dada 主动公开素材缓存的 150 MB 硬上限和私有状态禁存规则通过；
- AI 网关、Resend 和高德的必要外网 HTTPS 调用在本机可用，所有 API 密钥均未进入 PRD、Git、前端、manifest 或本机数据日志；
- 页面或设置区域显示本机数据无自动备份且不迁移的固定提示；
- 任一门槛失败时不得开始 P0-A 实际验收。

### AC-42 内部模板分批预览

操作：

1. super_admin 创建一个测试批次并加入白名单外模板；
2. 只把项目方指定的一个普通测试账号授权到该批次；
3. 授权账号、未授权普通账号和 super_admin 分别访问素材面板、公开 manifest 和服务端授权 manifest；
4. 尝试根据模板稳定 ID 推导本机资源接口或文件路径，并通过 file://、本机绝对路径和 File System Access API 绕过本地后端直接读取；
5. 撤销授权后再次请求内部预览 manifest 和资源接口。

预期：

- 授权普通账号可以看到该批次中 internal_preview 或 passed 的模板；
- 未授权普通账号不能发现模板、批次或资源地址，公开 manifest 不包含 internal_preview_asset；
- 未公开资源路径不能仅由模板稳定 ID 推导；
- 授权账号只能使用资源 ID 通过本地后端授权 manifest 和登录鉴权资源接口加载资源，浏览器不能获得绝对路径，也不能通过 file:// 或 File System Access API 直接读取；
- 预览授权不提供后台、调点、模型配置、邀请码或私有内容权限；
- 撤销后普通账号立即失去新添加入口且不能再取得资源，已有项目仍按保存的资源版本渲染；
- internal_preview_asset 不进入 Dada 的公开素材持久缓存；
- 全部剩余复杂模板通过前，不向普通用户逐批公开。

### AC-43 失败草稿重试与批量删除

操作：用户在同一失败草稿中连续重试三次，再创建多个无成功图片的失败草稿并执行批量删除。

预期：

- 同一草稿的三次重试产生三个新 GenerationJob，但项目数量不增加；
- 每个失败任务独立释放冻结点数；
- 多个 failed_empty 草稿可以一次移入回收站并释放活动项目名额；
- 包含任一成功生成图的项目不能混入失败草稿快捷批量删除；
- 用户主动回到工作台“新建创作”时仍创建新项目。

### AC-44 参考图生命周期

操作：

1. 用户选择参考图但不提交并刷新页面；
2. 重新选择参考图并提交失败任务；
3. 更换参考图后在同一草稿重试成功；
4. 删除项目并等待物理清理。

预期：

- 未提交参考图不上传，也不出现在 localStorage、IndexedDB 或 Cache Storage；
- 失败任务保存其提交时参考图关系；
- 成功重试保存新一组关系，不覆盖失败任务快照；
- 两组参考图始终为私有资源；
- 项目进入 purged 后关系立即不可访问，资源随后由异步任务删除。

### AC-45 内测账号名额

操作：P0-A 在同一 Windows 电脑上使用独立浏览器配置，先用项目方控制的 1 个 super_admin 和 1 个普通账号完成人工验收；测试程序临时创建第二个普通账号执行跨用户项目、图片、内部预览和本地鉴权接口越权测试，再清理该账号；随后创建普通 active、普通 suspended、普通 deleted 和 super_admin 账号，达到 P0-A 的 10 个普通账号名额后继续注册。

预期：

- active 和 suspended 普通账号都占名额；
- super_admin 不占普通账号名额且不消耗普通邀请码；
- 临时账号只有普通用户权限，不能访问另一普通账号的项目、图片、内部预览授权或私有文件接口，测试完成后被清理；
- P0-A 不要求朋友或第二个真实普通用户参与；
- 第 11 个占用名额的普通账号不能创建；
- 普通账号注销为 deleted 后释放一个名额，新用户可注册；
- 后台历史累计创建账号数不因注销减少。

### AC-46 客户端缓存上限

操作：连续浏览足以超过 150 MB 的公开缩略图、模板转换产物和字体，并检查浏览器的 Dada 应用存储。

预期：

- Dada 主动持久缓存不超过 157,286,400 字节；
- 超限前按 LRU 淘汰最久未用资源；
- 不预下载全量素材；
- 旧发布版本优先淘汰且当前画布所需资源仍可重新按需加载；
- 缓存中不存在 internal_preview_asset、提示词、私有图片引用、项目状态或未保存编辑内容；
- 用户主动下载的成品不计入缓存上限。

### AC-47 免费辅助服务硬停止

操作：

1. 分别模拟 Resend 达到每天 80 封、每月 2,400 封；
2. 分别模拟 Resend 接口不可用、明确退信故障和其他供应商异常；
3. 在发布前人工送达测试中模拟某类邮箱 20 封中只有 18 封在 2 分钟内送达；
4. 模拟高德当月达到 1,000 次调用；

预期：

- Resend 达到任一上限后进入 paused_quota，暂停注册和需要新验证码的登录，不发送第 81 封或超过月上限的邮件；
- Resend 接口不可用、明确退信故障或其他供应商异常进入 paused_provider，通过 pause_reason 区分非敏感错误类别，不创建验证码发送成功假状态；
- 发布前人工送达测试未达到每类 19/20 的门槛时阻止 P0-A 发布，但不创建运行时质量暂停状态；
- 已存在且有效的 30 天会话继续使用，页面不显示验证码发送成功假状态；
- 系统不切换到腾讯云 SES 或其他收费邮件通道；
- 高德不发起第 1,001 次调用，DYN004 自动定位停用，其他手动地点或非地点功能可用；
- 系统不保存或计算运行时“最近 20 封”滚动送达率，不建立 EmailVerificationEvent；
- 所有暂停均记录原因并通知 super_admin，恢复必须在免费额度或供应商可用状态重新满足后进行。

### AC-48 三类素材与私有资源隔离

操作：在本机不同浏览器账号中，未登录访问公开素材 manifest 和缩略图，再尝试从稳定 ID 推导内部预览资源接口或本机路径，通过 file://、本机绝对路径和 File System Access API 直接读取，并使用未授权账号和其他用户会话访问内部预览素材、参考图、生成图与导出成品。

预期：

- public_release_asset 可以公开只读并长期缓存；
- 公开 manifest 不包含 internal_preview_asset、private_user_asset 路径或可推导标识；
- internal_preview_asset 路径不得仅由稳定 ID 推导，只能通过本地后端授权 manifest 和登录鉴权接口访问；
- 未登录、未授权和错误用户均不能访问内部预览或私有资源；浏览器不能取得或直接使用本机绝对路径，file:// 和 File System Access API 均不能绕过本地后端鉴权；
- 正确所有者通过本地后端登录鉴权接口可以访问；
- 私有资源访问策略不影响已有项目正常渲染和下载。

### AC-49 超级管理员认证与恢复

操作：依次使用白名单外邮箱、白名单内新邮箱和第二个白名单邮箱访问独立后台入口；完成首次验证和后续登录，等待或模拟 30 天会话到期，再将一个管理员移出白名单并停用全部管理员；最后由部署人员修改当前阶段的后端安全配置并让 Dada 读取生效。

预期：

- 白名单外邮箱在发送验证码前被拒绝，不创建管理员账号或会话；
- 白名单内邮箱首次验证后创建 super_admin，第二个白名单邮箱可创建独立备用 super_admin；
- 普通账号不能通过后台、邀请码或角色修改被提升为 super_admin；
- 管理员会话最长保持 30 天，主动退出、停用或移出白名单后立即失效；
- super_admin 不占普通账号名额；
- 允许全部管理员被停用，此后后台无自助恢复入口，只有部署人员修改当前阶段的后端安全配置后才能恢复；
- 部署人员不是 Dada 用户或后台角色，不能创建对应产品账号、登录后台或获得产品权限；
- 管理员创建、登录结果、停用、移出白名单和恢复均形成审计；
- 后端安全配置生效事件记录为 actor_type=system、actor_ref=backend_secure_config，且不包含部署人员身份、白名单内容或安全配置值。

### AC-50 后台敏感操作审计

操作：分别执行调点、账号状态变更、邀请码变更、模型配置、素材启停、普通贴纸历史文件清理及引用校验、预览授权、辅助服务恢复和私有内容查看，再尝试从后台修改或删除日志并推进时间超过 180 天。

预期：

- 除私有内容查看外的敏感操作写入 AdminOperationLog；
- 普通贴纸历史文件清理的请求、引用校验、成功或拒绝结果均被审计；
- 私有内容查看只写入独立的 PrivateContentAccessLog，不在普通操作日志中重复保存私有正文；
- 超级管理员后台操作使用 actor_type=super_admin，后端安全配置生效事件使用 actor_type=system，不存在第三种 Dada 审计角色；
- 日志包含执行者、操作、目标摘要、结果、发生时间和 expires_at；
- 日志不包含验证码、API 密钥、会话令牌、完整提示词、图片内容或不必要的私有正文；
- 180 天内任何管理员均不能修改或人工删除日志；
- 到期后系统自动清理两类日志。

### AC-51 AI 网关余额影响范围

操作：分别模拟网关明确返回单模型余额不足、明确返回共享账户余额不足，以及只能确认余额问题但无法判断影响范围；随后补充余额并确认恢复。

预期：

- 单模型影响只把对应模型标记为运行时不可用；
- 账户级影响把共享该 gateway_account_ref 的全部模型标记为运行时不可用；
- 未知影响范围按账户级处理，把共享账户的全部模型标记为运行时不可用；
- 三种失败都只释放一次相关 GenerationJob 的 reserved_balance，不扣用户点数；
- 系统不自动充值；
- 三种情况均不改写 ModelConfig.enabled、is_default 或 recommendation_priority；
- 未确认真实余额恢复前不能恢复运行时可用状态，恢复操作形成 AdminOperationLog。

### AC-52 免费额度下调

操作：模拟 Resend 或高德供应商免费额度低于当前应用侧 hard_limit，再分别尝试下调和提高运行上限，并尝试启用收费服务。

预期：

- 运行配置可以在不扩大能力的前提下直接下调 hard_limit，无需升版 PRD；
- 下调形成配置审计和发布检查记录，且新上限立即阻止超额调用；
- 提高 hard_limit、启用收费通道或自动扩容必须先升版 PRD，不能只改后台或运行配置。

### AC-53 产品级生成错误分类

操作：对三个模型的提交和执行链路分别模拟 upstream_timeout、upstream_failed、safety_rejected、model_disabled、gateway_balance_insufficient、gateway_contract_invalid、reference_invalid、unknown_retryable 和 unknown_non_retryable，并让供应商返回包含原始错误码、错误正文、堆栈或内部地址的响应。

预期：

- 三个模型把等价错误映射为相同的 GenerationErrorCategory，前台、GenerationJob、后台生成记录和统计使用同一 category_id；
- upstream_timeout、upstream_failed 和 unknown_retryable 进入 failed，并按规定提供原输入重试或稍后重试；
- safety_rejected 进入 rejected 并要求修改输入；
- model_disabled 在提交前阻止任务，并要求选择其他模型或等待；
- gateway_balance_insufficient 和 gateway_contract_invalid 优先于通用 model_disabled，要求选择其他模型或联系管理员；
- reference_invalid 要求更换或移除参考图；
- unknown_non_retryable 不提供重复重试入口，提示联系管理员；
- 提交前阻止时不创建任务或冻结点数，任务创建后失败或拒绝时只释放一次冻结点数；
- queued、running 和 succeeded 任务的 error_category 为空；
- 页面不显示供应商原始错误码、错误正文、堆栈或内部地址；
- 后台不能创建、重命名或删除固定分类。

### AC-54 P0-B 对普通用户开放门槛

操作：依次让 P0-A 验收、全量素材验收、AC-26、AC-37、白名单外模板 passed 状态、50 人账号上限、公开 manifest 隔离、任一模型 verified 状态、公司系统合并方案、正式存储后端、远程服务器、域名、HTTPS、正式数据隔离或移动端访问中的任一条件缺失，再尝试向普通用户开放 P0-B；最后满足全部条件并执行正式开放。

预期：

- 任一门槛缺失时，普通用户继续处于 P0-A，只能看到核心白名单且普通账号上限保持 10；
- 内部开发、模板导入、内部预览和验收不受普通用户开放门槛阻止；
- 公开 manifest 始终不包含 internal_preview_asset；
- 任一模型在最后一次契约相关配置变化后不是 verified 时不得开放；
- AC-26 或 AC-37 尚未执行或未通过时不影响 P0-A 完成，但必须阻止 P0-B 向普通用户开放；
- 公司系统合并、正式存储、远程部署、域名、HTTPS、数据隔离和移动端访问任一方案未定版或未验收时不得开放；
- 全部条件满足后，白名单外 passed 模板一次性切换为 enabled，普通账号阶段上限切换并验证为 50；
- 不能通过只扩大人数、只开放部分模板或只完成手机编辑来宣称进入 P0-B。

### AC-55 P0-A 本机存储状态

操作：依次模拟 LocalDataRoot 正常可写且 managed_content_bytes 低于 4,294,967,296 字节、达到 4,294,967,296 字节、达到 4,831,838,208 字节、达到 5,368,709,120 字节、本次写入预计超过上限、LocalDataRoot 不可写和系统磁盘已满；在各状态下尝试生图、提交参考图、保存最新成品、上传普通贴纸原图、生成缩略图、写入其他受管二进制内容、编辑项目、读取和下载已有内容、只下载本地导出、永久删除项目，以及清理有引用和无引用的历史上传贴纸文件。

预期：

- 低于 80% 且目录可写时 capacity_notice_level 为 normal、storage_status 为 active，正常写入并更新 managed_content_bytes 和 last_measured_at；
- 达到 80% 且低于 90% 时 capacity_notice_level 为 warning，显示非阻断提醒，生图、参考图、成品保存、后台贴纸上传和缩略图生成仍可继续；
- 达到 90% 且低于 5 GB 时 capacity_notice_level 为 critical，持续显示清理提醒，但仍不阻止生图、保存、后台贴纸上传或缩略图生成；
- critical 提示按“下载需要保留的成品、永久删除不需要的项目或由 super_admin 显式清理符合条件的无引用贴纸文件、等待物理清理和容量重新测量、恢复后继续生成”的固定顺序引导；
- warning 和 critical 均不自动删除文件；
- 达到或预计超过 5 GB 时进入 full，不创建新 GenerationJob、不调用 AI 网关、不冻结点数，也不持久化新参考图、latest_exports、后台上传普通贴纸原图、缩略图或其他受管二进制内容；
- full 状态不自动删除任何文件，仍允许编辑已有项目、读取和下载已有内容、只下载但不更新 latest_exports 的客户端导出、永久删除项目，以及显式清理符合条件的无引用历史上传贴纸文件；
- LocalDataRoot 不可写或系统磁盘已满时进入 unavailable，停止新增写操作、后台贴纸上传、缩略图生成和 AI 调用，但保留已有项目及素材的查看、下载和删除入口；
- 仍被任何已发布版本或项目引用的历史原图或缩略图不能清理；无引用文件的显式清理要求确认并形成不可修改审计；
- 物理清理完成前 managed_content_bytes、capacity_notice_level、storage_status 和 last_measured_at 均不因该清理更新；重新计量后只有容量低于硬上限且目录可写才恢复 active；
- 后台上传的普通静态贴纸原图和缩略图计入 managed_content_bytes；产品随安装包提供或通过第 18 节安全配置原地引用的只读规范素材库、应用代码、150 MB 浏览器公开素材缓存、数据库元数据、审计记录和用户下载目录均不计入。

### AC-56 P0-A 数据可丢失与不迁移

操作：确认系统未配置自动备份；主动下载原始生成图和 JPG/PNG 成品，尝试导出可编辑项目包、数据库、账号、点数、审计日志和素材关系；分别模拟删除 LocalDataRoot 和重新安装 P0-A；再启动 P0-B 公司系统合并环境并尝试自动或手动导入 P0-A 数据。

预期：

- P0-A 不创建或宣称存在本机自动备份；
- 用户可以主动下载原始生成图和 JPG/PNG 成品，但系统不提供可编辑项目包、数据库、账号、点数、审计日志或素材关系的导出与导入入口；
- 删除 LocalDataRoot 或重新安装后，本机测试账号、项目、图片和日志不可由 Dada 自动恢复；
- 用户主动下载到下载目录的成品不随 LocalDataRoot 删除；
- P0-B 不自动或手动导入 P0-A 本机账号、项目、点数、审计日志或素材关系，下载图片也不被识别为正式迁移包；
- 页面或设置区域始终明确显示“测试数据仅保存在本机，不自动备份，也不会迁移到正式系统。”

## 23. 外部依赖与发布门槛

### 23.1 AI 网关

网关地址：

https://oneapi.intelligrow.cn

已确认三个模型标识在平台模型广场存在，但公开资料不足以确认图片端点、参考图字段和错误格式。

AI 相关契约定版前必须取得以下任一信息：

- 平台提供的图片 API 文档；
- 脱敏 curl 或代码示例；
- 通过平台支持确认的请求与响应格式。

不得只根据模型名称假设三个模型使用相同端点。编辑器、素材和认证模块可以并行开发，但三模型 AC-40 未通过前，AI 适配器、ModelConfig 路由和点数结算联调不得宣告完成。

AI 网关使用项目方主动配置的既有额度，不得开启自动充值。能确认模型级余额影响时只把对应模型标记为运行时不可用；只能确认共享账户余额不足或无法判断影响范围时，把所有依赖同一 gateway_account_ref 的模型标记为运行时不可用。该运行时状态不得改写后台配置的默认模型、enabled 或 recommendation_priority。余额不足导致的任务失败必须释放对应冻结点数，不能通过后台点数继续制造无法支付的真实上游调用。只有确认真实余额恢复后才能由超级管理员恢复运行时可用状态，检测和恢复均按 GatewayBalanceState 与 AdminOperationLog 记录。

### 23.2 邮件服务

P0 使用 Resend 发送邮箱验证码。

- 使用自有域名或子域名作为发信域名；
- 按 Resend 要求完成 SPF 和 DKIM 验证；
- API 密钥只放在 P0-A 本地后端安全配置；P0-B 再迁移到公司正式安全配置；
- 只使用 Resend 免费档，不配置付费升级、按量超额或收费备用邮件供应商；
- 应用侧发送硬上限为每天 80 封、每个自然月 2,400 封；
- 达到任一硬上限后停止发送，暂停注册和需要新验证码的登录，已存在且仍有效的 30 天会话不受影响；
- 发布前对 QQ、163 和至少一种企业邮箱各发送 20 封测试邮件，每类至少 19 封在 2 分钟内送达；
- Resend 接口不可用、明确退信故障或其他供应商异常时进入 paused_provider，使用 pause_reason 区分非敏感错误类别，暂停需要新验证码的流程，不创建验证码假成功状态，也不切换到付费通道。

P0 不建立逐封 EmailVerificationEvent，也不保存或计算运行时“最近 20 封”的滚动送达率。发布前送达测试保留人工结果；未达到每类 19/20 的门槛时阻止 P0-A 发布，但不写入运行时 service_status。运行期只保留 ExternalServiceUsage 定义的额度计数、供应商可用状态和暂停原因，验证码明文不得进入任何日志。

为避免邮件联调阻塞编辑器等独立模块开发，DevelopmentPlan 可以定义仅开发环境可用的本地初始化脚本，预置一个普通测试账号。该脚本不得进入正常产品入口，不得在正式 P0-A 验收环境启用，也不能作为 AUTH-01、AUTH-02、AUTH-07、AC-01、AC-33、AC-41 或 AC-49 的通过证据。P0-A 正式认证验收必须真实调用 Resend；域名验证、发送或送达失败继续属于 P0-A 启动门槛失败。

Resend 当前公开免费档为每月 3,000 封、每天 100 封，P0 应用侧上限为其保守子集；发布前必须再次核对免费规则。如免费额度低于应用侧上限，可在不扩大能力的前提下直接下调运行 hard_limit，无需升版 PRD，但必须形成配置审计和发布检查记录；提高上限或启用收费服务必须升版 PRD。

参考：[Resend 域名要求](https://resend.com/docs/dashboard/domains/introduction)、[Resend Pricing](https://resend.com/pricing)。腾讯云 SES 不作为备用服务，因为其免费额度用完后会转为后付费；参考：[腾讯云邮件推送价格说明](https://cloud.tencent.com/document/product/1288/47930)。

### 23.3 地理编码服务

P0 使用个人认证的高德 Web 服务 Key 提供中国大陆地点的地理编码和逆地理编码。开放 DYN004 自动定位前必须确认个人 Key 的可用接口、月免费配额、QPS、绑定方式、IP 或域名白名单、安全限制和当前使用场景均符合要求。

- P0 应用侧每个自然月最多调用 1,000 次高德 Web 服务；
- 达到硬上限后停止调用，不购买流量包、不使用账户余额继续调用；
- 达到上限、高德不可用或 Key 核验不通过时停用 DYN004 自动定位；
- 其他仅需地点文字的模板继续允许手动输入，不阻塞不需要地点的编辑操作；
- 发布前必须再次核对官方免费配额；如免费额度低于应用侧上限，可在不扩大能力的前提下直接下调运行 hard_limit，无需升版 PRD，但必须形成配置审计和发布检查记录；提高上限或启用收费服务必须升版 PRD。

正式公开注册前必须重新评估是否迁移到公司认证主体。

参考：[高德地理编码文档](https://lbs.amap.com/api/webservice/guide/api/georegeo/)、[高德基础服务计费说明](https://lbs.amap.com/pages/base_service_price)。

### 23.4 P0-A 本机部署与存储

- P0-A 由本机网页、本地后端和 LocalDataRoot 组成，只在项目方当前 Windows 电脑运行；
- 本地后端只监听 localhost，不监听局域网地址，不配置公网映射、公司服务器、域名、备案或 HTTPS；
- P0-A 不使用 COS、公司对象存储或其他远程文件存储；
- 规范素材通过本地安全配置引用第 18 节的现有根目录，按 manifest 原地只读复用，不复制全库；
- public_release_asset 由本地后端提供公开只读接口；internal_preview_asset 必须校验登录账号和 AssetPreviewGrant；private_user_asset 只允许所有者或经审计的 super_admin 通过本地鉴权接口读取；
- LocalDataRoot 默认使用当前 Windows 用户的应用数据目录，不放在 Git 仓库或项目目录，不硬编码用户名；
- LocalDataRoot 不做 Dada 应用层加密或自动备份，依赖当前 Windows 用户登录和文件权限；测试数据可丢失且不自动迁移到正式系统；
- 任何 API 密钥不得进入 Git、PRD、前端包、素材 manifest 或本机数据日志。

P0-B 的公司系统合并、正式存储后端、远程服务器、域名、HTTPS、数据隔离和移动端访问必须在后续 PRD 升版或 DevelopmentPlan 中重新定版。本版不得默认正式存储一定使用 COS。P0-A 与 P0-B 数据断代是已接受的预期结果：不提供 P0-A 可编辑项目包或业务数据的导出、导入和迁移，P0-B 不自动或手动导入 P0-A 的账号、项目、点数、审计日志或素材关系；用户主动下载的图片仅用于留存。

### 23.5 内测告知

注册页使用必选的简短《内测使用与隐私告知》，至少覆盖 AI 网关、Resend、高德、P0-A 本机存储、超级管理员访问、DYN004 坐标、账号注销、180 天匿名事件及审计日志规则。告知必须明确 P0-A 数据依赖当前 Windows 用户登录和文件系统权限保护，Dada 不提供应用层加密或云备份，机器损坏、重装或 LocalDataRoot 被删除后不可恢复，重要图片需要用户主动下载。P0-A 本地测试页或设置区域必须同时显示固定提示：“测试数据仅保存在本机，不自动备份，也不会迁移到正式系统。”

### 23.6 UI 设计

页面布局、色彩、图标、滤镜视觉、响应式细节和控件样式由 UIDesign.md 定义。UIDesign.md 不得覆盖或弱化本 PRD 的状态机、权限、异常行为、验收文案和禁用入口要求。UI 设计与 PRD 冲突时以本 PRD 为准；若产品确需改变行为，必须先升版 PRD，再同步更新 UI 设计。

## 24. 需求变更规则

以下变化必须升版 PRD，不能只在开发任务中临时决定：

- 增减 P0 模型；
- 改变后台默认模型原子替换、recommendation_priority 唯一排序或运行时推荐不回写配置的规则；
- 改变点数和失败扣点逻辑；
- 改变项目或历史数量上限；
- 改变 25 个普通贴纸 part 的结构；
- 将普通文字、用户上传贴纸或多页图组加入 P0；
- 改变超级管理员查看私有内容的权限；
- 改变私有内容区域提示按 super_admin 身份与告知版本持久确认，或以该确认替代逐次 PrivateContentAccessLog；
- 改变定位坐标保存规则；
- 改变账号注销或项目删除期限；
- 改变 P0-A 白名单、10 个普通账号上限、实际验收账号组合或剩余复杂模板一次性公开规则；
- 改变 P0-B 对普通用户开放门槛；
- 为 P0-A 增加手机、局域网、远程访问、公司服务器或远程存储，或取消 P0-B 手机完整编辑；
- 允许不受支持浏览器绕过 P0-A 浏览器引导页进入产品功能；
- 新增、删除、重命名 GenerationErrorCategory，或改变其任务状态、点数与用户动作映射；
- 改变 150 MB 客户端主动缓存上限或允许持久化用户私有编辑状态；
- 改变 P0-A 的 local_filesystem 存储后端、LocalDataRoot 位置边界、80%/90% 容量预警阈值、5 GB 内容硬上限、无自动备份、无项目归档或不迁移规则；
- 改变后台上传普通贴纸原图和缩略图计入 managed_content_bytes、只读规范素材不计入、引用保护、显式清理或物理清理后重计量规则；
- 增加收费辅助服务、自动充值、自动扩容或提高 Resend/高德应用侧硬上限；
- 改变匿名事件、AdminOperationLog 或 PrivateContentAccessLog 的 180 天保留期；
- 从受控内测改为公开注册。

Resend 或高德供应商免费额度下降时，允许在不扩大产品能力的前提下直接下调运行 hard_limit，并记录配置审计和发布检查结果，不要求仅为该下调升版 PRD。任何提高上限、增加收费服务、自动充值或自动扩容仍必须按上述规则升版。

## 25. 术语

| 术语 | 定义 |
| --- | --- |
| 底图 | 当前项目中作为画布背景的 AI 生成图 |
| 覆盖元素 | 文字模板、普通贴纸、色卡或动态贴纸 |
| 文字模板 | 包含可编辑文字、字体、装饰与样式规则的复合资源 |
| 普通贴纸 | 不依赖动态数据的 PNG/WebP 图像元素 |
| 色卡 | 从底图提取五色并按固定布局生成的参数贴纸 |
| 动态贴纸 | 在编辑时注入时间、地点或身份数据并静态导出的贴纸 |
| 生成历史 | 同一项目中保留的成功 AI 生成图片 |
| 创作署名 | 成品中显示的昵称，不等同于登录邮箱 |
| 社交 ID | 成品中显示的账号文本，不代表 Dada 内部账号标识 |
| 复杂模板 | 文字、色卡和动态贴纸等需要解析或参数渲染的资源 |
| P0-A | 仅在项目方当前 Windows 电脑通过 localhost 运行的单机测试版；由 1 个超级管理员账号和 1 个普通账号人工验收，跨用户隔离由同机测试程序临时账号验证，最多 10 个普通账号，只公开核心复杂模板白名单 |
| P0-B（完整 P0） | 与公司系统合并并完成正式存储、远程部署、数据隔离和移动端验收后，最多 50 个普通账号、全部规定素材一次性公开且支持手机完整编辑的阶段；开发与内部验收可提前进行 |
| 内部测试账号 | 由 super_admin 指定、只可预览授权素材批次的普通账号，不具有管理员权限 |
| 部署人员 | 当前阶段后端安全配置的维护者；P0-A 由项目方承担，P0-B 由公司既有运维流程承接；不是 Dada 用户或后台角色，没有 Dada 登录入口、后台会话或产品权限，配置生效时由 system 记录审计 |
| LocalDataRoot | P0-A 本地后端管理的数据根目录，默认位于当前 Windows 用户应用数据目录，独立于项目、Git 和只读素材目录 |
| LocalBackendStorageState | P0-A 本地后端文件存储的容量、预警与可用状态契约，不是浏览器 localStorage |
| 公开发布素材 | public_release_asset，P0-A 可通过本地后端公开只读接口加载和缓存的模板、字体、缩略图或普通贴纸 |
| 内部预览素材 | internal_preview_asset，不进入公开 manifest；P0-A 只能通过有效 AssetPreviewGrant、本地后端授权 manifest 和登录鉴权资源接口访问 |
| 用户私有资源 | private_user_asset，P0-A 只能由所有者或经审计的 super_admin 通过本地后端鉴权接口访问 |
| 主动持久缓存 | Dada 通过浏览器存储主动维护的公开素材缓存，硬上限 150 MB，不包括用户下载成品 |
| GenerationErrorCategory | 三个模型共用的固定产品错误分类，统一任务状态、点数处理、用户下一步和后台统计口径 |
| 可用点数 | available_balance，可用于新任务且可因超级管理员调点为负数 |
| 冻结点数 | reserved_balance，只能由对应生成任务提交或释放 |
| 受控内测 | 通过邀请码开放并受 P0-A 或完整 P0 人数上限约束的阶段 |
