chore: establish frozen P0-A baseline

This commit is contained in:
suyx
2026-07-27 16:54:58 +08:00
commit 67e7a17d96
17 changed files with 46599 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
# JavaScript dependencies and package-manager caches
node_modules/
.pnpm-store/
# Build and compiler output
dist/
build/
.build/
.vite/
*.tsbuildinfo
# Test and verification output
coverage/
artifacts/
playwright-report/
test-results/
.playwright/
# .NET and Visual Studio output
bin/
obj/
.vs/
*.user
*.suo
# Dada runtime data (must remain outside source control)
LocalDataRoot/
.dada-local/
*.sqlite
*.sqlite-shm
*.sqlite-wal
*.db
*.log
logs/
staging/
# Credentials and machine-local configuration
.env
.env.*
!.env.example
*.local
secrets/
credentials/
# Editor and operating-system metadata
.idea/
.vscode/
.DS_Store
Thumbs.db
Desktop.ini
Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

+30088
View File
File diff suppressed because it is too large Load Diff
+1022
View File
File diff suppressed because it is too large Load Diff
+260
View File
@@ -0,0 +1,260 @@
# Dada Feature Summary 1.1 版本
## 1. 文档定位
| 项目 | 说明 |
| --- | --- |
| 唯一需求来源 | `PRD.md` v1.10,状态为“P0-A 本机测试需求冻结稿” |
| 当前交付 | 仅 P0-A |
| 文档用途 | 为后续 `DevelopmentPlan.md` 提供范围导航、需求索引、状态与契约入口;不替代 PRD,不增加或重新解释需求 |
| 冲突处理 | 本文与 PRD 不一致时以 PRD 为准;产品行为变化必须先升版 PRD |
| 非本文件职责 | 不定义技术选型、数据库/API 结构、UI 细节、测试步骤或任务拆分 |
P0-A 是只在项目方当前 Windows 电脑运行的单机测试版:本地网页连接本地后端,本地后端只监听 localhost,并把业务数据保存到本机 `LocalDataRoot`。正式支持环境仅为该电脑上的当前稳定版 Chrome 和 Edge;其他浏览器及不受支持的 Chrome/Edge 版本只能进入无绕过入口的“浏览器不受支持”引导页,不能进入任何产品功能。
页面或设置区域必须持续显示:
> 测试数据仅保存在本机,不自动备份,也不会迁移到正式系统。
## 2. 产品目标与核心闭环
Dada 面向受邀的图片创作者。普通用户通过邀请码和邮箱验证码注册,填写创作署名与社交 ID,使用三个 AI 模型之一生成底图,在电脑画布中添加和编辑文字模板、普通贴纸、色卡及动态贴纸,由本地后端自动保存项目,最后下载 JPG/PNG 成品;用户也可在同一电脑再次打开项目、查看历史并下载原始生成图或已保存的最新成品。
核心闭环为:
`邀请注册或邮箱登录 -> 查看点数与模型限制 -> AI 生图 -> 电脑画布编辑 -> 本地后端自动保存 -> 下载 JPG/PNG -> 同机继续处理或再次下载`
P0-A 的目标是验证上述完整闭环、三模型契约、点数原子结算、素材还原、本机数据边界、管理员运营和审计能力,不以远程部署或扩大参与人数代替产品验收。
## 3. 阶段边界
| 范围 | 定位 | 关键边界 |
| --- | --- | --- |
| P0-A,当前交付 | 当前 Windows 电脑上的 localhost 单机测试版 | 本地网页、本地后端、本机磁盘;最多 10 个普通账号;电脑完整编辑;核心复杂模板白名单;全部 1,407 张初始规范普通贴纸;只允许本机当前稳定版 Chrome/Edge 进入产品,其他浏览器和不支持版本硬阻断 |
| P0-B,未来阶段 | 公司系统合并后的完整 P0 | 最多 50 个普通账号;全部规定素材一次性公开;正式存储与远程部署;正式数据隔离;手机完整编辑;必须满足第 10 节全部门槛后另行开放 |
| P1,后续候选 | 不属于 P0-A | 上传本地底图、空白纯色/渐变画布、为既有普通贴纸补标题和关键词后开放搜索、公开注册准备、高德公司主体迁移评估、公开合规与完整条款 |
| 明确不做 | 当前 PRD 已排除 | 付费订阅和在线支付、小红书账号绑定或直接发布、多页图组和批量生成、社区、脱离模板的普通文字、用户上传自定义贴纸、AI 生成贴纸、GIF/视频导出、复制生成、完整封面模板、提示词优化、局部重绘、去背景、专业调色、协作、项目版本历史、分组及图层面板/隐藏/锁定 |
P0-A 不提供手机、局域网、远程访问或跨设备流程,不使用 COS、公司对象存储、公司服务器、备案域名、HTTPS 站点或其他远程文件存储。P0-A 后端仍需从本机向 AI 网关、Resend 和高德发起必要的外网 HTTPS 请求。
## 4. 用户与权限边界
| 身份或主体 | 能力边界 |
| --- | --- |
| 访客 | 通过浏览器支持检查后可访问独立注册和登录入口;未登录时只能读取 `public_release_asset` 的公开只读资源,不能访问项目、私有图片、内部预览或后台;未通过检查时只能看到无继续入口的阻断引导页 |
| 普通用户 | 通过有效邀请码和 Resend 邮箱验证码注册,或以已注册邮箱验证码登录;管理自己的资料、点数、项目、生成历史、私有资源和导出;不能访问其他用户内容或后台 |
| 获内部预览授权的普通用户 | 仍是普通用户,只能额外查看 `AssetPreviewGrant` 授权批次中 `internal_preview``passed` 的复杂模板;不获得后台、调点、模型配置、邀请码或私有内容权限 |
| `super_admin` | P0 唯一后台角色;管理邀请码、账号状态、点数、模型配置、普通贴纸、素材版本、内部预览、生成记录、辅助服务和审计;确认私有内容告知后按规定打开私有内容并产生独立访问审计;可确认并显式清理符合条件的无引用历史上传贴纸文件 |
| 部署人员 | 维护当前阶段后端安全配置;不是 Dada 用户或后台角色,没有产品账号、登录入口、后台会话或产品权限;配置生效由 `system` 审计 |
P0 允许存在多个权限相同的 `super_admin`,第二个白名单邮箱可创建独立备用管理员。P0-A 人工验收固定使用项目方控制的 1 个 `super_admin` 和 1 个普通账号;跨普通用户隔离由测试程序在同机独立浏览器配置中临时创建第二个普通账号验证并清理。`super_admin` 不占普通账号名额。
私有内容区域的全局提示确认按“`super_admin` 身份 + 告知版本”持久记录,不按浏览器、标签页或会话记录;同一身份确认同一版本后不重复显示,告知文案升版后重新提示。该确认不替代逐次审计,每次打开图片或完整提示词仍写入独立 `PrivateContentAccessLog`
账号状态只有 `active``suspended``deleted``active``suspended` 普通账号占用名额,`deleted` 释放名额;注销后旧数据不可恢复,原邮箱只能用新邀请码创建全新账号。
## 5. P0-A 功能摘要与追踪矩阵
下表只承担 PRD 与 AC 导航作用。AC 索引已按第 22 节分类表过滤,不把未来 P0-B 场景纳入当前实现。
| 模块 | P0-A 摘要 | PRD 索引 | 当前 AC 索引 |
| --- | --- | --- | --- |
| 邀请注册与邮箱登录 | 独立注册/登录入口;邀请码在发码前校验;Resend 验证码;30 天会话;创作署名、社交 ID 和版本化内测告知;管理员邮箱白名单与独立后台认证。开发环境可由初始化脚本预置一个普通测试账号,但正式认证验收必须真实调用 Resend,预置账号不能作为验收证据 | AUTH-01 至 AUTH-07 | AC-01、02、22、33、41、45、47、49 |
| 点数与原子结算 | 新用户默认 10 点;模型默认每次 1 点且可配置;维护 `available_balance``reserved_balance`;提交时原子冻结,成功只提交一次,失败/拒绝只释放一次;只有带原因和流水的管理员调点可使可用余额为负 | CREDIT-01 至 CREDIT-06 | AC-03 至 05、28、29、40、51、53、55 |
| 三模型 AI 生图 | 支持 `gemini-3.1-flash-image-preview``gemini-3-pro-image-preview``gpt-image-2`;输入仅含提示词、模型、比例、可选参考图和生成按钮;比例为 3:4、1:1、4:3、9:16;每次一张图。同账号同时只能有一个 `queued``running` 任务,再次提交返回当前任务,不创建第二个任务或重复冻结点数。后台始终恰好有一个已启用默认模型,停用当前默认模型必须原子指定合法替代默认模型。每个模型具有唯一正整数 `recommendation_priority`;运行时只在当前可用于新任务的模型中按数值由小到大返回推荐模型,无可用模型时返回空推荐,运行时降级不得回写启停、默认或推荐优先级。三个模型必须分别完成契约验证,不能按名称推断相同协议 | GEN-01 至 GEN-16、ADMIN-03 | AC-03 至 06、28、30、34、40、41、44、51、53、55 |
| 项目、历史、保存与冲突 | 新建创作建立项目,项目内继续生成只追加历史;项目比例创建后固定;最多 20 个 active 项目、每项目 10 张成功图。默认名来自提示词摘要和创建日期,用户可重命名并触发自动保存。无成功图的 `failed_empty` 草稿可批量移入回收站,含成功图的项目不得混入该快捷操作。删除后保留 720 小时;P0-A 只处理同机多标签 `state_version` 冲突 | PROJECT-01 至 PROJECT-09、GEN-11、GEN-12 | AC-03 至 07、20、21、34、35、AC-36 的 P0-A 子集、AC-38 的 P0-A 子集、43、44、55、56 |
| 电脑画布与底图编辑 | 任何产品功能前先执行浏览器支持检查;仅本机当前稳定版 Chrome/Edge 可进入完整编辑器,其他浏览器和不支持版本硬阻断且无继续入口。编辑器支持选择、移动、缩放、旋转、翻转、透明度、复制、层级、对齐吸附、循环选择、长按候选、多选和框选;无图层面板。覆盖元素最多 50 个。底图支持裁剪、适配、亮度、对比度、饱和度、色温和固定滤镜;换底图保留覆盖元素并重置底图编辑状态 | EDITOR-01 至 EDITOR-09、GEN-12、NFR-01 | AC-07、14、20、24、27、32、35、AC-36 的 P0-A 子集 |
| 文字模板与字体 | 添加文字必须先选模板;P0-A 仅公开 32 个白名单模板及其实际引用字体,并包含 FONT081。模板按分类和 catalog 稳定顺序展示,支持显示名称搜索和账号级最近使用;切换模板保留文本、换行和变换;支持内容、填充、描边、背景、对齐、行距和字距等冻结能力。普通贴纸关键词搜索仍属于 P1 | TEXT-01 至 TEXT-14 | AC-09 至 12、19、32 |
| 25 个普通贴纸 part | 初始规范素材为 part1 至 part25 的 1,407 张 PNG,色卡和动态贴纸不计入这些 part。支持虚拟列表、懒加载和账号级最近使用。`super_admin` 可上传 PNG/WebP,配置稳定 ID、既有 part、顺序、启停和可选内部名称;上传原图及 Dada 生成的缩略图写入 `LocalDataRoot` 并计入 `managed_content_bytes`,只读规范素材库不计入。`full/unavailable` 阻断上传、缩略图生成和其他受管二进制写入。无引用历史上传文件只能由 `super_admin` 确认并审计后显式清理;下架只阻止新添加,已有项目按保存版本继续渲染 | STATIC-01 至 STATIC-04、ADMIN-06、第 17.7、17.19 节 | AC-13、14、27、31、32、41、46、48、50、55 |
| 色卡与动态贴纸 | P0-A 色卡仅启用 COLOR001、COLOR002、COLOR008、COLOR016;从当前底图未经裁剪、调色和滤镜处理的原始图片中在浏览器本地稳定提取五色,裁剪、调色或滤镜变化不重新提取。动态贴纸仅启用 DYN001-004、007、008、011、012、015、016,编辑时注入时间、地点或身份数据,导出为静态内容。DYN004 在调用定位前先告知原始坐标会保存到项目并显示在成品中,用户确认后才调用定位;DYN012 使用 FONT081 并标明替代字体 | COL-01 至 COL-05、DYN-01 至 DYN-09 | AC-07、AC-15 的 P0-A 子集、AC-16 至 19、32、41、47 |
| 导出 | 客户端按画布真实像素合成 JPG/PNG,无 Dada 水印;未提交文字或样式修改需确认,确认后形成一次撤销记录并导出,取消则不提交也不导出。下载文件与写入 `LocalDataRoot` 的成品必须来自同一次合成;每种格式只保留最新一份。后端持久化失败时仍可下载,但不得更新 `latest_exports` | EXPORT-01 至 EXPORT-06 | AC-23 的 P0-A 子集、24、27、35、AC-38 的 P0-A 子集、55、56 |
| 运营后台 | 邀请码、账号状态、点数、模型默认与推荐配置、普通贴纸及无引用历史文件显式清理、素材版本、内部预览批次与授权、生成记录、辅助服务、操作审计和私有内容访问;私有内容列表默认隐藏正文,区域提示按管理员身份与告知版本持久确认,文案升版后重新提示,每次打开仍记录独立审计。P0 只有一种后台角色,但可有多个管理员账号 | AUTH-07、CREDIT-06、ADMIN-01 至 ADMIN-09 | AC-25、29 至 31、41、42、45、47、49 至 52、55 |
| 素材发布与内部预览 | 复杂模板按稳定 ID、版本和发布状态注册;P0-A 普通用户只见已通过且已启用的白名单。授权测试账号可见授权批次中的 `internal_preview``passed`;剩余 `full_p0` 模板可分批验收,但不能逐批向普通用户公开。公开、内部预览、用户私有三类资源严格隔离 | STATIC-04、ADMIN-06、ADMIN-07、NFR-07、第 17.6、17.11 至 17.14 节、第 18 节 | AC-31、32、41、42、46、48 |
| 本机数据与资源访问 | `LocalDataRoot` 与只读素材根目录分离;业务数据、后台上传普通贴纸原图和缩略图由本地后端写入本机磁盘,后两类计入 `managed_content_bytes`,只读规范素材库不计入。浏览器只用资源 ID 访问,不得取得目录绝对路径。`LocalBackendStorageState` 执行 5 GB 内容上限及 80%/90% 预警;`full/unavailable` 阻断新增受管二进制写入,历史上传贴纸文件不得自动清理,物理清理并重新计量后才更新容量状态。数据不自动备份、不迁移、不提供可编辑项目归档 | PROJECT-04 至 PROJECT-09、STATIC-04、ADMIN-06、NFR-07、NFR-09、第 17.19、18.9、18.10、23.4 节 | AC-20、24、31、35、AC-36 的 P0-A 子集、41、46、48、50、55、56 |
| 隐私、审计与免费服务边界 | API 密钥只在本地后端安全配置;用户内容私有;私有内容区域提示按 `super_admin` 身份与告知版本持久确认,告知升版后重新提示且每次打开继续写访问审计;注销立即删除业务内容,匿名事件和审计最多保留 180 天;Resend 与高德达到应用硬上限或供应商不可用时硬停止,不启用付费备用、自动购买或自动扩容;AI 网关不开自动充值 | PRIV-01 至 PRIV-06、NFR-05、NFR-08、ADMIN-05、ADMIN-08、ADMIN-09、第 23.1 至 23.5 节 | AC-22、25、39 至 41、47、49 至 53、56 |
v1.10 重点变更的 AC 导航为:AC-24(不支持浏览器硬阻断)、AC-25(私有内容告知持久化与逐次审计)、AC-30(默认模型原子替换与运行时推荐)、AC-31(贴纸容量、写入阻断与显式清理)、AC-50(贴纸清理审计)、AC-51(运行时不可用不回写模型配置)和 AC-55(本机容量计量与恢复)。
### 5.1 P0-A 复杂素材白名单
| 类型 | 当前普通用户可见范围 |
| --- | --- |
| 文字模板 | FLOWER001-008、H001-008、TAG001-007、TAG051、SIMPLE001-008,共 32 个 |
| 字体 | P0-A 仅显示白名单模板实际引用的字体面板项,并强制包含 FONT081;不显示白名单之外的其他字体项 |
| 色卡 | COLOR001、COLOR002、COLOR008、COLOR016,共 4 个 |
| 动态贴纸 | DYN001、DYN002、DYN003、DYN004、DYN007、DYN008、DYN011、DYN012、DYN015、DYN016,共 10 个 |
| 普通贴纸 | part1 至 part25 的 1,407 张初始规范 PNG 全量可见;P0-A 不支持普通贴纸关键词搜索,该能力属于 P1 |
白名单外复杂模板必须先注册,但对未授权普通用户不可发现;获授权内部测试账号仍可查看其授权批次中的 `internal_preview``passed` 模板。`full_p0` 模板可以分批进入 `passed`,只能在 P0-B 全部门槛满足后一次性改为 `enabled`
## 6. 关键状态与规则
| 对象 | 状态与导航规则 |
| --- | --- |
| 浏览器支持检查 | 本机当前稳定版 Chrome/Edge 通过检查后才可进入产品;其他浏览器或不受支持版本只进入“浏览器不受支持”引导页,不提供继续或绕过入口 |
| 账号 | `active``suspended``deleted`;暂停账号不能注册或登录,注销立即失效且旧数据不可恢复 |
| `UserProfile` 私有内容告知确认 | 确认按 `super_admin` 身份与告知版本持久记录;同一版本不因新标签页、重启或重新登录重复提示,告知升版后重新提示;每次打开私有内容仍独立写入 `PrivateContentAccessLog` |
| `ModelConfig` 默认与推荐 | 所有配置中始终恰好有一个已启用默认模型;停用当前默认模型与指定合法替代模型必须原子成功或整体失败。`recommendation_priority` 为不并列的唯一正整数,1 最高;缺失、非正整数或重复时整次配置保存失败且不部分写入。运行时推荐只从当前可用于新任务的模型派生,无可用模型时为空,不形成第二个默认状态或回写配置 |
| `GenerationJob` | `queued``running``succeeded``failed``rejected`;同账号已有 `queued``running` 时不创建第二个任务;成功只提交一次冻结点,失败或拒绝只释放一次 |
| `Project` | `active``trashed``purged`;只有 active 计入 20 个上限,trashed 在 `deleted_at + 720 小时` 前可在名额允许时恢复,purged 用户侧不可恢复 |
| `save_status` | `saved``dirty``saving``failed``conflicted`;刷新、关闭或崩溃后只恢复最后一次本地后端 `saved` 状态,浏览器不保存可恢复的私有草稿 |
| `TemplateRegistry.release_status` | `imported``internal_preview``passed``enabled``disabled`;授权测试账号可见授权批次中的 `internal_preview``passed``full_p0` 不得据此逐批公开 |
| `ExternalServiceUsage.service_status` | `active``paused_quota``paused_provider``disabled`;发布前送达测试失败只阻止发布,不创建运行时质量状态。只有免费周期或供应商可用条件重新满足后,`super_admin` 才能恢复暂停服务并留下后台审计 |
| `GatewayBalanceState` | 余额为可用、不足或无法可靠确认;影响范围为模型、账户或未知。模型级只把对应模型标记为运行时不可用,账户级或未知处理共享结算账户的全部模型;不得改写 `ModelConfig.enabled``is_default``recommendation_priority`,确认真实余额恢复后才可由 `super_admin` 恢复运行时可用状态并审计 |
| `LocalBackendStorageState` | `capacity_notice_level``normal``warning``critical``storage_status``active``full``unavailable`。受管内容包含后台上传普通贴纸原图和缩略图,不含只读规范素材;`full/unavailable` 阻断上传和缩略图生成,清理后的容量状态只在物理清理和重新计量后更新,详见第 8 节 |
| 历史上传贴纸清理 | 只允许 `super_admin` 确认并显式清理不再被任何已发布版本或项目引用的原图/缩略图;仍有引用时拒绝整个操作,清理请求、校验和结果均审计,物理清理与重新计量前不更新容量状态 |
### 6.1 九类生成错误
| 分类 | 用户动作 | 任务与点数 |
| --- | --- | --- |
| `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`,释放冻结点 |
`reference_invalid` 沿用 PRD 的“参考图格式、大小、数量或内容无效”边界;供应商安全策略拒绝提示词或参考图时使用 `safety_rejected`。三个模型共用固定分类。P0 使用统一 `config_version`,错误映射变化递增该版本,不拆分错误映射版本;后台不能新增、重命名或删除分类。
## 7. 十九个产品数据契约导航
本节只说明用途,不复制或重新设计字段。
| 契约 | 用途 |
| --- | --- |
| `UserProfile` | 账号身份、资料、角色、状态、注册告知同意、`super_admin` 最近确认的私有内容告知版本与时间,以及注销时间的产品记录 |
| `ModelConfig` | 每模型启停、唯一已启用默认模型、唯一正整数推荐优先级、点数、输入限制、网关路由、契约验证和统一版本复核 |
| `Project` | 项目比例、底图、生成历史、画布、最新成品、版本和保存状态;同时表达 `draft_state``batch_deletable`、回收站时间及清理边界 |
| `GenerationJob` | 每次生成的配置快照、任务状态、参考图关系、点数和错误分类 |
| `CanvasElement` | 文字、普通贴纸、色卡和动态贴纸的通用画布状态与类型专用数据 |
| `TemplateRegistry` | 复杂模板稳定 ID、资源版本、验证、批次、发布层级和可见状态 |
| `StaticStickerCatalog` | 普通贴纸稳定 ID、既有 part、顺序、资源引用、版本、启停状态与 `bundled_read_only/admin_uploaded` 来源分类;后台上传文件受容量计量和无引用显式清理规则约束 |
| `DynamicStickerData` | 动态贴纸类型、原始/格式化值、覆盖值及 DYN004 授权坐标 |
| `CreditAccount``CreditLedger` | 可用/冻结余额,以及初始化、管理员调点、冻结、提交和释放的不可变流水 |
| `PrivateContentAccessLog` | `super_admin` 每次打开私有图片或完整提示词时产生的独立 180 天审计,不因全局提示已确认而省略 |
| `AnonymousRetainedEvent` | 注销后保留的不可回溯随机主体事件和有限统计字段 |
| `AssetReleaseManifest` | 版本化素材清单、哈希、资源类别与 P0-A `local_filesystem` 发布引用 |
| `AssetPreviewGrant` | 普通测试账号对指定内部模板批次的限时授权与撤销 |
| `ClientCachePolicy` | 公开素材主动缓存 150 MB 上限、LRU 和私有内容禁存规则 |
| `ExternalServiceUsage` | Resend/高德的周期用量、硬上限、暂停原因和恢复状态 |
| `AdminOperationLog` | 除私有内容查看外的后台敏感操作、普通贴纸历史文件清理请求/引用校验/结果,以及系统配置生效审计 |
| `GatewayBalanceState` | 网关余额、影响范围、运行时不可用模型和人工确认恢复;不改写模型启停、默认或推荐优先级 |
| `GenerationErrorCategory` | 三模型共享的固定错误、用户动作、重试和点数口径 |
| `LocalBackendStorageState` | P0-A 本机受管内容容量、80%/90% 提醒、5 GB 硬上限、可用状态和重计量时间;计入后台上传贴纸原图/缩略图,不计只读规范素材,清理完成后才更新状态 |
## 8. 本机数据与资源访问边界
### 8.1 `LocalDataRoot`
- `LocalDataRoot` 默认位于当前 Windows 用户的应用数据目录,由本地后端解析;必须可配置,且不得位于 Git 仓库、项目目录、用户主动下载目录或只读素材根目录。
- 本机数据库、账号、项目、参考图、生成图、导出成品、审计日志、派生文件,以及后台上传的普通贴纸原图和 Dada 生成的缩略图写入 `LocalDataRoot`。浏览器只通过资源 ID 和本地后端鉴权接口访问私有文件。
- 浏览器不得通过 `file://`、本机绝对路径或 File System Access API 读取 `LocalDataRoot` 或素材根目录;用户主动用标准文件选择器选择参考图不受此限制。
- 未保存画布、提示词、私有图片引用和编辑内容只存在当前页面内存,不写入 `localStorage``IndexedDB` 或 Cache Storage。强制刷新、关闭或崩溃后只恢复最后一次本地后端 `saved` 状态。
- P0-A 不创建自动备份,不提供可编辑项目包、数据库、账号、点数、审计日志或素材关系的导出/导入,也不把本机业务数据迁移到 P0-B。用户只能主动下载原始生成图和 JPG/PNG 成品。
- P0-A 不对本机文件实施 Dada 应用层加密,依赖当前 Windows 用户登录和文件系统权限;机器损坏、重装或删除 `LocalDataRoot` 后不可由 Dada 恢复。
### 8.2 容量与可用性
`hard_limit_bytes` 固定为 5,368,709,120 字节,对用户显示 5 GB。`managed_content_bytes` 统计参考图、生成图、导出成品、派生二进制文件,以及 `super_admin` 后台上传的普通贴纸原图和 Dada 生成的缩略图;不统计产品随安装包提供或通过本机安全配置原地引用的只读规范素材库、应用代码、150 MB 浏览器公开素材缓存、数据库元数据、审计记录或用户下载目录。
| 条件 | 状态与行为 |
| --- | --- |
| 低于 80% 且目录可写 | `normal` / `active`,正常写入 |
| 达到 80% 且低于 90% | `warning`,非阻断提醒;继续允许生图、保存、后台贴纸原图上传和缩略图生成,不自动删除 |
| 达到 90% 且低于 5 GB | `critical`,持续清理提醒;仍允许生图、保存、后台贴纸原图上传和缩略图生成,不自动删除 |
| 已达到或本次写入预计超过 5 GB | `full`;不创建新任务、不调用 AI、不冻结点数,不持久化新参考图、`latest_exports`、后台贴纸原图、缩略图或其他受管二进制内容;仍可编辑已有项目、读取和下载已有内容、只下载客户端导出、永久删除项目及显式清理符合条件的无引用历史贴纸文件 |
| `LocalDataRoot` 不可写或系统磁盘已满 | `unavailable`;停止新增写入、后台贴纸上传、缩略图生成和 AI 调用,保留已有项目及素材的查看、下载和删除入口 |
`warning``critical` 的清理引导顺序固定为:下载需保留的成品、永久删除不需要的项目或由 `super_admin` 显式清理符合条件的无引用历史贴纸文件、等待物理清理和重新测量、恢复后继续生成。历史上传原图和缩略图不得自动清理;只有不再被任何已发布版本或项目引用时,才能由 `super_admin` 确认后显式清理,清理请求、引用校验与结果必须写入不可修改的 `AdminOperationLog`,仍有引用时拒绝整个操作。只有物理清理完成并重新计量后,才能更新 `managed_content_bytes``capacity_notice_level``storage_status``last_measured_at`;容量低于硬上限且目录可写时才能恢复 `active`
### 8.3 素材原地只读复用
P0-A 通过本地后端安全配置解析以下 `%USERPROFILE%` 路径。解析后的绝对路径不得进入 Git、普通项目数据或浏览器响应。
| 素材 | 只读入口 |
| --- | --- |
| 总交接 | `%USERPROFILE%\Desktop\sticker_web_handoff\STICKER_WEB_REPLICATION_HANDOFF.md` |
| 机器总 manifest | `%USERPROFILE%\Desktop\sticker_web_handoff\sticker_web_catalog_manifest.json` |
| 完整性报告 | `%USERPROFILE%\Desktop\sticker_web_handoff\sticker_archive_validation_20260722.json`,当前 `all_valid=true` |
| 文字模板 | `%USERPROFILE%\Desktop\sticker_text\模板\单模板归档`;分类 `catalog.csv``templates/<ID>/metadata.json` |
| 字体 | `%USERPROFILE%\Desktop\sticker_text\字体\面板全量采集\font_panel_full_20260722``reports/font_panel_catalog.csv` 与单字体 `metadata.json` |
| 文字行为资料 | `%USERPROFILE%\Desktop\sticker_text\键盘``%USERPROFILE%\Desktop\sticker_text\样式` |
| 普通贴纸 | `%USERPROFILE%\Desktop\贴纸素材``sticker_part1``sticker_part25`,共 1,407 张 PNG |
| 色卡 | `%USERPROFILE%\Desktop\sticker_colour\单模板归档``catalog.csv``styles/<ID>/metadata.json` |
| 动态贴纸 | `%USERPROFILE%\Desktop\sticker_interactive\单模板归档``catalog.csv``templates/<ID>/metadata.json` |
约 3.57 GB 规范素材在原目录只读复用,不复制全库、不提交 Git、不放入 `LocalDataRoot`,也不计入 `managed_content_bytes`。后台上传的普通贴纸原图和缩略图写入 `LocalDataRoot` 并计入容量,不得写回只读素材根目录。Git 只保存版本化 manifest、catalog、metadata、版本号和哈希。普通贴纸当前缺少统一 catalog,开发准备需生成 `StaticStickerCatalog`,但不得改写源素材。目录移动、改名、不可读或校验失败时,只暂停依赖功能并提示重新配置,不修改代码或自动复制素材。
## 9. P0-A 验收分类与发布准备
### 9.1 第 22 节 AC 分类
| 分类 | AC 范围 | `DevelopmentPlan.md` 处理规则 |
| --- | --- | --- |
| P0-A 必验 | AC-01 至 AC-07、AC-09 至 AC-14、AC-16 至 AC-22、AC-24 至 AC-25、AC-27 至 AC-35、AC-39 至 AC-53、AC-55 至 AC-56 | 必须拆入当前开发与验收任务 |
| 通用规则,当前只验 P0-A 子集 | AC-15、AC-23、AC-36、AC-38 | 只拆入下表列出的本机操作和预期 |
| P0-B 门槛与未来验收 | AC-08、AC-26、AC-37、AC-54 | 不属于当前交付,不得拆入当前迭代或阻止 P0-A 完成 |
AC-15、AC-23、AC-36、AC-38 的完整规则仍保留在 PRD;本节只筛选当前 P0-A 验收子集,并未删除其余规则。
四个通用 AC 的当前子集为:
| AC | P0-A 当前子集 |
| --- | --- |
| AC-15 | 仅验 COLOR001、COLOR002、COLOR008、COLOR016 四种色卡及其共同提色、换底图更新和原始底图边界 |
| AC-23 | 在四种比例导出 JPG/PNG,验证像素、画布一致性、未提交修改确认、每格式最新一份和同一电脑再次下载 |
| AC-36 | 仅验同一台 Windows 电脑两个标签页的 `state_version` 冲突、旧页只读、一次本地导出和刷新本地后端最新版本 |
| AC-38 | 仅验本机“暂无导出成品”空状态、进入编辑并导出、下载原始生成图,以及不自动创建默认成品 |
### 9.2 P0-A 启动门槛
AC-41 必须在实际验收开始前通过,重点包括:
- 本地网页和本地后端可启动,后端只监听 localhost,局域网地址和其他设备不能访问。
- 第 18 节素材根目录可读,manifest 与素材文件校验通过,且未复制第二套约 3.57 GB 全量素材。
- `LocalDataRoot` 独立、可写、未硬编码用户名;80%/90% 预警和 5 GB 限制可用。
- 正式验收账号真实调用 Resend;发信域名验证完成,QQ、163、企业邮箱各 20 封至少 19 封在 2 分钟内送达;应用硬上限为每天 80 封、每月 2,400 封,不配置付费备用通道。
- 高德个人 Web 服务 Key 的接口、绑定、安全限制和每月 1,000 次应用硬上限实测通过。
- AI 网关不开自动充值,三个模型的 AC-40 完整契约矩阵通过,模型级/账户级/未知影响范围的余额停用与恢复规则可用。
- 版本化内测告知、本机数据风险提示、150 MB 公开素材缓存上限和私有状态禁存通过。
- AI 网关、Resend、高德所需外网 HTTPS 调用可用,任何 API 密钥均未进入 PRD、Git、前端、manifest 或本机数据日志。
任一启动门槛失败时不得开始 P0-A 实际验收。开发初始化账号只用于并行开发,不能替代 AUTH-01、AUTH-02、AUTH-07、AC-01、AC-33、AC-41 或 AC-49。
## 10. P0-B 未来开放门槛
P0-B 仅作为未来阶段的不可弱化门槛记录,不是当前功能或当前完成条件。未经未来单独立项,不得纳入当前开发任务。向普通用户开放前必须同时满足:
- P0-A 验收已通过。
- 全量 332 个文字模板、86 个字体面板项、1,407 张初始规范普通贴纸、16 个色卡和 35 个动态贴纸完成规定验收。
- AC-26 全量跨平台视觉回归和 AC-37 手机横竖屏完整编辑通过。
- 所有白名单外复杂模板均为 `passed`,随后一次性切换为 `enabled`,不得逐批向普通用户开放。
- 普通账号阶段上限切换并验证为 50;公开 manifest 始终不含 `internal_preview_asset`
- 三个模型在最后一次契约相关配置变化后均为 `verified`
- 公司系统合并、正式存储后端、远程服务器、域名、HTTPS、正式数据隔离和移动端访问方案均已定版并验收。
- P0-A 本机账号、项目、点数、审计日志和素材关系不自动或手动导入 P0-B;用户下载的图片不是迁移包。
不能通过只扩大人数、只开放部分模板或只完成手机编辑来宣称进入 P0-B。AC-08、AC-26、AC-37、AC-54 及 AC-15/23/36/38 中的 P0-B 子集须在未来单独立项。
## 11. 后续 DevelopmentPlan 输入约束
以下条目仅作为 `DevelopmentPlan.md` 必须处理的约束索引。它们不代表实现顺序、技术选型或任务拆分;`DevelopmentPlan.md` 必须在完整阅读 PRD v1.10 和本文件后编写,并至少处理以下工程主题:
1. localhost 单机部署边界、启动方式、本地后端回环监听、进程与故障恢复,不引入 P0-B 基础设施。
2. 邀请码、Resend 验证码、30 天会话、管理员白名单、多 `super_admin`、开发初始化账号隔离和正式验收切换。
3. 点数事务、任务幂等、`queued/running` 单任务约束、提交时 `ModelConfig` 复核、默认模型原子替换、`recommendation_priority` 与运行时推荐、结算与失败释放。
4. 三模型独立适配器、脱敏契约证据、同步/异步差异、参考图生命周期、统一 `config_version` 和九类错误映射。
5. 项目/历史/失败草稿、自动保存、同机多标签冲突、撤销重做、回收站 720 小时与资源异步清理。
6. Chrome/Edge 支持版本硬检查与无绕过阻断、画布渲染、字体加载、导出一致性、50 元素性能预算及固定浏览器版本、Windows 版本、DPR、视口和动画基准;具体环境在后续 `tdd.md` 记录。
7. 只读素材根目录发现、manifest/catalog/metadata 校验、`StaticStickerCatalog` 生成、`asset_origin`、后台上传贴纸原图/缩略图、无引用显式清理、资源版本化、三类访问隔离和浏览器资源 ID 接口。
8. `LocalDataRoot` 布局、`LocalBackendStorageState` 计量与写入前预判、后台贴纸容量归属、80%/90% 提示、5 GB 硬停止、`full/unavailable` 上传与缩略图阻断、物理清理后重新计量、数据库/日志目录不可写、日志轮转和 180 天清理。
9. JPG/PNG 单次合成、下载与本地后端持久化一致性、失败降级及“只下载图片、无项目归档/迁移”的产品边界。
10. Resend、高德和 AI 网关的免费或余额硬停止、运行时不可用不回写模型默认/推荐配置、无自动费用、管理员确认恢复及审计。
11. 私有资源鉴权、按 `super_admin` 身份与告知版本持久确认私有内容提示、逐次访问审计、注销删除、匿名保留、密钥隔离和本机数据风险告知。
12. 严格按第 22 节 AC 分类进行任务拆分和测试分层;当前只实现 P0-A 必验项及 AC-15/23/36/38 的 P0-A 子集。
素材授权台账在正式公开或商业化前补齐,不改变当前 P0-A 或未来 P0-B 的既定阻塞规则。后续文档不得把 P0-B 门槛弱化为分批开放,也不得把未来能力写入当前 P0-A 实现。
+3008
View File
File diff suppressed because it is too large Load Diff
+1402
View File
File diff suppressed because it is too large Load Diff
+9361
View File
File diff suppressed because it is too large Load Diff
+391
View File
@@ -0,0 +1,391 @@
# Dada P0-A 开发任务计划
| 文档项 | 内容 |
| --- | --- |
| 文档版本 | 1.1 |
| 编写日期 | 2026-07-27 |
| 当前交付 | 仅 P0-A Windows 本机测试版 |
| 产品需求唯一权威 | `PRD.md` v1.10 |
| 功能导航 | `FeatureSummary.md` 1.1 |
| 工程基线 | `DevelopmentPlan.md` 1.1 |
| UI 基线 | `UIDesign.md` 1.0 |
| TDD 基线 | 哈希锁定的 `tdd.md`,文件内版本 1.4,89 个测试族、117 个规范 case |
| 低保真基线 | `Dada-P0A-LowFi.pen``Dada-LowFi-Preview/` |
| 机器可读任务记录 | `tasks.manifest.json`,逐任务固定 requirements、AC、DevelopmentPlan 章节、case、模块、TDD 动作、命令、证据与 UI 映射 |
| 当前状态 | 开发尚未开始;所有任务初始为 `not_started``RELEASE.json` 尚不存在 |
| 文档职责 | 把 WP-0 至 WP-7 拆为可执行开发任务,固定依赖、产出、测试归属和完成门禁;不修改需求、架构、UI 或测试语义 |
## 1. 冻结输入与解释规则
### 1.1 输入校验
| 输入 | 版本 | SHA-256 |
| --- | --- | --- |
| `PRD.md` | 1.10 | `31F93674DF1A90B557FEE3AA9E74FB084E246CA8FE09F6BD4B1DC9D56D606565` |
| `FeatureSummary.md` | 1.1 | `6F80E272AAB08A5525B54501D83F16A4F6A7A170596947BBC25F1DA54F2FE844` |
| `DevelopmentPlan.md` | 1.1 | `7C579E9DF8D00DA9333F587D05FC966123437EE68575D87D73C903C1487FA9D6` |
| `UIDesign.md` | 1.0 | `0C449DF833E5471843E17EB74F5B470EBC955F117CAF1D79AC9C0EF90DE763F0` |
| `tdd.md` | 文件内版本 1.4 | `41EABEE330122FFB44752F834A97EAAE5C1CF35B99CB33B61AE6889077F96BFD` |
| `Dada-P0A-LowFi.pen` | Pencil 2.1419 个顶层画板 | `A352C8F205E9399EB2E6306176253AF6FF65DDDBB9FDCEA2E2FE13E3C3459975` |
用户输入把该 `tdd.md` 称为 1.3,但给出的 SHA-256 与当前文件完全一致,而文件头为 1.4。任务计划以哈希锁定的实际文件为准,因此后文统一登记为 1.4;不得把同一哈希改写为 1.3。
8 张低保真预览 PNG 的哈希已与 `tdd.md` 第 1.2.2 节一致。`.pen` 的 19 个顶层画板中,`Z8p3I` Canvas Index 只作设计资产索引,不属于产品页面;其余画板只约束相应页面的布局参考,不替代 `UIDesign.md` 的页面全集和文案权威。
### 1.2 权威与变更处理
1. 产品范围、状态、权限、业务规则、数据语义和 AC 结果只由 `PRD.md` 决定。
2. `FeatureSummary.md` 只用于导航十三个功能模块、十九个契约、状态和 AC。
3. `DevelopmentPlan.md` 固定技术栈、组件边界、API、SQLite、事务、进程、存储和 WP 顺序;任务不得重新选型或留下实现二选一。
4. `UIDesign.md` 固定页面、控件、文案、焦点、状态和视觉规则;低保真只作布局和层级参考。
5. `tdd.md` 固定 Red-Green-Refactor、89 个父测试族、117 个规范 case、证据和门禁。本计划不合并、删除或弱化 case。
6. 四份全局 Markdown 任一哈希变化时,全部任务停止产出通过证据并按 `tdd.md` 标记受影响项为 `source_changed`。低保真变化按 frame 影响范围局部失效;范围不可判定时失效全部 UI、视觉和 E2E 证据。
## 2. 任务执行协议
### 2.1 状态与基本单位
任务状态沿用 `tdd.md``not_started``red``green``externally_blocked``passed``source_changed`。一个开发任务可以拥有多个父测试族,但每个父测试族在本计划中只有一个开发任务主责;`tdd.md` 第 6.9 节中属于该父族的全部规范 case 自动归属同一任务。
每个任务按固定顺序执行:
1. 校验冻结输入哈希和上游依赖状态。
2. 从所属规范 case 建立最小失败测试,保存 `red_reason`、禁止副作用和 Red 证据。
3. 只实现使测试通过的最小行为,不添加 PRD 之外的入口、状态、配置或回退。
4. 运行本层、所属 WP、跨 WP 依赖和安全脱敏回归。
5. 在测试持续 Green 时重构,不改变 OpenAPI、Schema、事务或 UI 行为。
6. 写入 `artifacts/tdd/<run_id>/` 证据;缺 Red、最终 Green 或必要人工/真实证据时不得标记 `passed`
### 2.2 Definition of Ready
任务进入 `red` 前必须同时满足:
- 冻结哈希一致,受影响源没有未处理的 `source_changed`
- 规范 case 的需求 ID、AC、fixture、层级、禁止副作用和证据目录已确定;
- 外部调用使用 mock;真实验证只通过显式 `pnpm validate:external` 执行;
- 测试使用临时 SQLite、临时 LocalDataRoot、独立浏览器 profile 和脱敏 fixture,不读取真实业务实例。
硬依赖未 Green 时,下游可以编写并执行只针对已冻结契约、独立 fixture 或 mock 接口的 Red 测试,也可以完成 mock 接线;不得进入依赖真实上游行为的最小 Green 实现,更不得标记 Green、passed 或工作包完成。硬依赖 Green 是从 Red 进入 Green 的前置条件,不是建立 Red 的前置条件。
### 2.3 Definition of Done
单个任务达到 `green` 必须满足:
- 所属父测试族及全部规范 case 已保存可复现 Red 和最终 Green 结果;
- 所有固定层级分别通过,不能用 E2E 代替 DB/API,也不能用 mock 代替 EXT-REAL
- 状态、响应、持久化、文件、UI 和禁止副作用均有断言;
- `evidence_refs` 完整且脱敏扫描通过;
- 所属 WP 回归和本计划第 5 节的跨包契约回归通过;
- 没有 P0-B、P1 或明确不做能力混入。
任务含 EXT-REAL 或 MANUAL 层级时,本地自动化 Green 后可以进入 `externally_blocked`;只有真实/人工证据齐全才为 `passed`。WP 只有在本 WP 所有任务达到其规定门禁、且“不能提前宣告”条件全部消除后才能完成。
### 2.4 仓库级测试接口前置
WP-0 必须建立并持续维护以下脚本:`pnpm test:unit``test:integration``test:api``test:worker``test:e2e``test:visual``test:performance``test:security``test:package``validate:tdd-trace``test:all``validate:external`。任一失败返回非零;普通 CI 不运行真实外部验证。
## 3. 依赖顺序与并行边界
| 阶段 | 可执行工作 | 硬门禁 |
| --- | --- | --- |
| A | WP-0 全部任务 | 无上游;WP-0 Green 后才开放业务实现完成声明 |
| B | WP-1WP-5 的只读编译器、catalog 和资源路由骨架可启动 | WP-1 依赖 WP-0WP-5 依赖 WP-0 |
| C | WP-2WP-5 继续 | WP-2 依赖 WP-0、WP-1 |
| D | WP-3、WP-4、WP-5 可并行;WP-4 最终素材视觉集成等待 WP-5 | WP-3/WP-4 依赖 WP-2WP-5 最终 renderer 集成依赖 WP-4 |
| E | WP-6 | 依赖 WP-1、WP-2、WP-5;模型页最终状态另依赖 WP-3 |
| F | WP-7 | WP-0 至 WP-6 Green、三个外部阻塞具备真实验证条件 |
依赖未 Green 时,下游可以先写 Red、Schema fixture 或 mock 接线,但不能标记 Green。AI 网关、Resend、高德和最终真实 Chrome/Edge 是发布外部门禁,不阻止其本地状态机和 mock 分支开发,但不得伪装成已完成集成。
## 4. 可执行开发任务
### 4.1 WP-0 基础工程与本机边界
主责范围:PRIV-01、PRIV-02、NFR-01、NFR-07、NFR-09AC-24、AC-46、AC-55、AC-56。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP0-01` 工程骨架与冻结依赖 | 无 | 建立 pnpm monorepo、唯一 lockfile、React/Vite/TypeScript、Fabric、Fastify、TypeBox、Drizzle/better-sqlite3、Node Worker 和 .NET 8 Supervisor 最小可运行骨架;接通第 2.4 节脚本入口 | `TDD-WP0-DEP-001` | 精确版本安装、类型检查、React/Fabric 渲染、Fastify、native 模块和随包 Node 预检通过;失败时先修订 DevelopmentPlan,不得私自换栈 |
| `TASK-WP0-02` Schema、OpenAPI 与事件基线 | `TASK-WP0-01` | 建立 TypeBox 单一 Schema 来源、OpenAPI 3.1、生成客户端、统一错误信封、correlation ID、SSE 非敏感事件和 REST refetch/bootstrap | `TDD-WP0-API-001``TDD-WP0-EVT-001` | OpenAPI snapshot 与运行校验一致;事件不承载业务真相或私有正文;断线/缺号恢复通过 |
| `TASK-WP0-03` 回环访问与浏览器硬门禁 | `TASK-WP0-02` | 固定 `127.0.0.1:43121`、Host/Origin/CORS 防护、最小 gate shell、UA-CH 交叉校验、24 小时短期支持 Cookie、全产品路由前置 426 门禁 | `TDD-WP0-BND-001``TDD-WP0-BRW-001``TDD-WP0-BRW-002` | 局域网/其他 Host/Origin、非 Windows、其他品牌、错误 major、UA-CH 缺失/冲突和直调 API 均不可进入;支持分支最终 passed 等待 WP-7 真实记录 |
| `TASK-WP0-04` LocalDataRoot 与本机数据边界 | `TASK-WP0-01` | 建立目录布局、路径规范化、资源 ID 隔离、data_missing、只读素材根校验、无备份/无归档/无迁移边界和固定本机风险提示接线 | `TDD-WP0-DATA-001``TDD-WP0-DATA-002` | 违规目录、符号链接和路径逃逸拒绝;已初始化根缺失不自动重建;浏览器不见绝对路径;产品无业务导入/项目包/恢复入口 |
| `TASK-WP0-05` 容量状态、预留与文件一致性 | `TASK-WP0-02``TASK-WP0-04` | 实现 LocalBackendStorageState、精确阈值、storage reservation、staging 流式校验、同卷原子改名、managed file、补偿队列、启动对账和物理删除后重测 | `TDD-WP0-STO-001``TDD-WP0-STO-002``TDD-WP0-STO-003``TDD-WP0-FILE-001` | 写前只用 `>` 拒绝,恰好 5 GB 写入成功后 full;超限零副作用;full/unavailable 动作不同;未物理删除前不减字节 |
| `TASK-WP0-06` 公开客户端缓存 | `TASK-WP0-02``TASK-WP0-04` | 建立 150 MiB public allowlist LRU、Cache Storage/IndexedDB 元数据、写前淘汰和 Service Worker 路由边界 | `TDD-WP0-CACHE-001` | 逐场景枚举实际浏览器存储;internal/private/项目/提示词/未保存草稿均不进入持久缓存 |
| `TASK-WP0-07` Supervisor、凭据和运行诊断 | `TASK-WP0-01``TASK-WP0-04``TASK-WP0-05` | 实现单实例 mutex、固定端口检查、API/Worker 启停与有限重启、15 秒退出、Credential Manager 匿名管道注入、托盘状态、离线配置命令和脱敏诊断 | `TDD-WP0-SUP-001``TDD-WP0-SEC-001` | 第二实例、端口占用、startup/api/worker degraded、凭据缺失/清除/重启和子进程残留均有确定行为;不动态换端口、不泄露凭据 |
| `TASK-WP0-08` 日志、轮转和不可写联动 | `TASK-WP0-05``TASK-WP0-07` | 建立 API/Worker/Supervisor JSONL 白名单日志、10 MiB/10 文件/30 天轮转、诊断复用脱敏器和日志不可写状态联动 | `TDD-WP0-LOG-001` | 日志不含密钥、邮箱、提示词、图片、绝对路径或供应商原文;日志不可写进入 unavailable 并阻断 AI |
| `TASK-WP0-09` 隔离 CI 与便携包 | `TASK-WP0-01``TASK-WP0-08` | 配置 Windows Gitea Runner 隔离流水线;生成 Dada.exe、随包 Node、API/Worker、迁移、资源元数据、`RELEASE.json` 占位规则、`START-HERE.txt`、ZIP 和 SHA-256 | `TDD-WP0-PKG-001` | CI 不读真实凭据、LocalDataRoot 或 3.57 GB 归档;包固定 43121、零真实配置/路径;正式 RELEASE 记录在 WP-7 冻结 |
WP-0 结束时运行:`test:unit``test:integration``test:api``test:worker``test:security``test:package` 和所属 E2E。真实浏览器支持记录尚未冻结时,AC-24 只能保持 Green 或 externally_blocked,不能 passed。
### 4.2 WP-1 认证、权限、数据模型与审计基础
主责范围:AUTH-01 至 AUTH-07、PRIV-03、PRIV-04、PRIV-06、NFR-04AC-01、AC-02、AC-22、AC-33、AC-39、AC-45、AC-49。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP1-01` 认证数据与邀请注册事务 | WP-0 | 建立 UserProfile、邀请码、验证码挑战、普通账号初始点数/registration_grant、幂等键与事务;接入 Resend mock | `TDD-WP1-AUTH-001``TDD-WP1-AUTH-002` | 发码前/建号前复核;有效注册一次提交;无效、过期、停用、耗尽邀请零副作用 |
| `TASK-WP1-02` 登录状态机、会话与登录画面 | `TASK-WP1-01` | 实现注册/登录分离入口、未注册/已注册/已注销/suspended 状态、10 分钟验证码、60 秒重发、30 天 opaque session、CSRF 和退出/暂停/注销撤销;按 `Z0pf8` 落实普通用户登录布局、艺术带、管理员文字入口、固定本机提示和焦点 | `TDD-WP1-AUTH-003``TDD-WP1-AUTH-004` | 六类身份状态不静默换流程;验证码不可复用;会话撤销即时生效;普通与管理员 audience 分离;登录页状态与布局证据齐全 |
| `TASK-WP1-03` 注册展开态、内测告知与账号名额 | `TASK-WP1-01``TASK-WP1-02` | 实现版本化内测告知、必选确认、资料字段、active+suspended 普通账号 10 人上限、deleted 释放和 super_admin 不占名额;按 `DVPM8` 落实邀请/邮箱只读摘要、资料、告知和注册主动作 | `TDD-WP1-NOTICE-001``TDD-WP1-SLOT-001` | 告知覆盖 PRD 固定事项;未同意不建号;第 11 个普通账号被阻断;多个同权限 super_admin 合法;注册展开态状态与布局证据齐全 |
| `TASK-WP1-04` 管理员白名单与安全配置生效 | WP-0、`TASK-WP1-01``TASK-WP1-02` | 实现 HMAC 管理员白名单、独立管理员认证、多管理员、安全配置 revision、原子应用/回滚、system 审计和离线恢复边界 | `TDD-WP1-ADM-001``TDD-WP1-CFG-001` | 非白名单发码前拒绝;普通账号不能原地提升;配置失败不部分生效;部署人员不成为产品角色或审计 actor |
| `TASK-WP1-05` 注销、匿名保留与物理清理 | `TASK-WP1-01``TASK-WP1-04` | 实现注销事务、立即撤权与断链、邮箱释放、匿名事件、物理清理队列和最长 180 天保留 | `TDD-WP1-DEL-001``TDD-WP1-DEL-002` | 旧数据不可恢复;原邮箱只能新邀请新建;匿名事件不可反查;注销不延长私有访问审计期限 |
| `TASK-WP1-06` 两类审计基础不可变性 | WP-0、`TASK-WP1-04``TASK-WP1-05` | 建立 AdminOperationLog 与 PrivateContentAccessLog 表、append-only trigger、合法 retention/privacy purge 作用域和非敏感摘要 | `TDD-WP1-AUD-001` | 普通连接不能改删;两类日志不混用;正文、图片、密钥和路径不进入审计 |
WP-1 的认证 UI 同步实现 `user-auth``admin-auth` 的正常、加载、失败和禁用状态。Resend mock Green 不等于正式认证 passed;真实送达与正式账号链由 WP-7 完成。
### 4.3 WP-2 项目、点数与 GenerationJob
主责范围:CREDIT-01 至 CREDIT-06、PROJECT-01 至 PROJECT-09、GEN-03 至 GEN-06、GEN-11、GEN-12、GEN-14、GEN-16、NFR-05AC-03 至 AC-06、AC-20、AC-21、AC-28、AC-29、AC-34、AC-35、AC-36 P0-A 子集、AC-38 P0-A 子集、AC-43、AC-44、AC-51、AC-53。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP2-01` 项目、历史、失败草稿与空工作台 | WP-0、WP-1 | 实现新建项目、项目内追加、固定比例、20 active、10 成功图、默认命名/重命名、failed_empty 重试和批量入回收站;按 `WbDYT` 落实无项目工作台艺术带、生成表单和空任务区 | `TDD-WP2-PROJ-001``TDD-WP2-PROJ-005` | 新建/追加/上限不混淆;重试只新建任务;有成功图项目不能进入 failed_empty 批量操作;艺术带仅在无项目工作台出现 |
| `TASK-WP2-02` 自动保存与多标签冲突 | `TASK-WP2-01` | 实现 Dada Canvas Schema、1 秒 debounce、单请求在途、最新快照合并、If-Match CAS、dirty/saving/saved/failed/conflicted、离开守卫和一次冲突本地导出 | `TDD-WP2-PROJ-002``TDD-WP2-PROJ-004` | 旧标签不能覆盖或另存副本;冲突页只读且仅一次本地导出,不写 latest;刷新只恢复 saved |
| `TASK-WP2-03` 回收站、恢复与 purge | `TASK-WP2-01`、WP-0 文件清理 | 实现 trashed、精确 `+720h` purge_at、20 active 恢复限制、立即撤权和异步物理清理 | `TDD-WP2-PROJ-003` | 满 20 时保持 trashed;purged 后立即不可读;删除排队不伪造容量下降 |
| `TASK-WP2-04` 点数账户、流水与管理员调点 | WP-1、WP-0 SQLite | 实现 available/reserved、reserve/commit/release、不可变 ledger、operation_key、余额不足和带原因的 admin adjustment | `TDD-WP2-CRED-001``TDD-WP2-CRED-002` | 生成流程 available 不为负;结算一次;调点只改 available、可为负,reserved 不变,流水和审计同事务 |
| `TASK-WP2-05` 生成提交、单任务、参考图与生成中工作台 | `TASK-WP2-01``TASK-WP2-04`、WP-0 存储 | 实现 multipart 提交、config/cost 复核、`BEGIN IMMEDIATE`、活动任务部分唯一索引、参考图内存态/流式提交/关系快照、幂等和 412 重确认;按 `d99Lo` 落实生成中工作台、当前任务、冻结点数、critical 容量条和禁用提交 | `TDD-WP2-GEN-001``TDD-WP2-GEN-003``TDD-WP2-REF-001` | 同账号只建一个活动任务;第二提交返回当前任务且不建项目/关系/冻结;过期配置和无效参考图零持久副作用;生成中页面不显示假进度且提交动作按状态禁用 |
| `TASK-WP2-06` 任务终态、九类错误与网关余额影响 | `TASK-WP2-04``TASK-WP2-05`WP-3 Adapter 接口 mock | 实现成功/失败/rejected、输出落盘与一次结算、固定九类错误、用户动作、GatewayBalanceState model/account/unknown 影响和 pending_manual_review | `TDD-WP2-GEN-002``TDD-WP2-BAL-001``TDD-WP2-ERR-001` | `reference_invalid``safety_rejected` 分离;供应商原文不泄露;runtime 变化不回写 ModelConfig;用户点数只释放一次 |
| `TASK-WP2-07` 原图与 latest export 服务 | `TASK-WP2-01``TASK-WP2-02`、WP-0 存储 | 实现历史原图下载、latest JPG/PNG 资源关系、同 Blob 上传、后端失败矩阵和无导出成品空态 | `TDD-WP2-EXP-001``TDD-WP2-EXP-002` | 客户端下载与后端保存结果独立;失败保留旧 latest;从未导出不自动合成;不承诺跨设备下载 |
WP-2 同步交付 `workspace``current-task``projects``project-detail``credits``settings` 的业务接线。真实模型完成态与真实点数结算仍依赖 WP-3,不得用 Adapter mock 宣告 AC-40。
### 4.4 WP-3 三模型契约验证与适配
主责范围:GEN-01、GEN-02、GEN-07 至 GEN-10、GEN-13、GEN-15、ADMIN-03AC-30、AC-40。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP3-01` ModelConfig 集合与原子替换 | WP-2 | 实现三模型固定 seed、immutable config_version/config_set、恰好一个 enabled default、唯一正整数 priority、完整集合 CAS、替代默认错误和审计 | `TDD-WP3-MDL-001``TDD-WP3-MDL-002` | 初始 1/2/3 优先级;缺失/非正/重复/零或多默认整批拒绝;切换无可见中间态;失败原集合不变 |
| `TASK-WP3-02` 独立 runtime 与推荐模型 | `TASK-WP3-01`、WP-2 余额状态 | 实现 runtime reason/version、configured default/runtime/recommended 三层读取、空推荐、人工恢复和余额影响审计 | `TDD-WP3-MDL-003``TDD-WP3-BAL-001` | 降级/恢复不改 enabled/default/priority;推荐只从可用候选派生;成本核对不补扣用户点数 |
| `TASK-WP3-03` 三个独立 Adapter 与契约证据 | `TASK-WP3-01`、WP-2 Generation 接口 | 分别实现三个 Adapter、纯文字/参考图/四比例、同步/异步、响应、一图、错误映射;配置字段变化令对应模型 unverified;提供 mock 和受控真实验证 | `TDD-WP3-ADP-001``TDD-WP3-ADP-002` | 三模型 fixture/证据不得共用;完整重验前不可恢复 verified;真实证据未齐时任务保持 externally_blocked |
| `TASK-WP3-04` Worker 租约、崩溃恢复与结算接线 | `TASK-WP3-03``TASK-WP2-06` | 实现领取、租约、心跳、poll、崩溃恢复、无安全引用的 unknown_retryable、一次 release 和人工成本核对 | `TDD-WP3-WRK-001` | 有上游引用只 poll、不重新 submit;未知结果终止用户任务且不双结算;Worker degraded 禁止新任务 |
WP-3 本地 mock 全 Green 后,如任一模型缺最后一次配置对应的真实证据,整个 WP-3 保持 `externally_blocked`AC-30 的纯配置行为可 GreenAC-40 不得 passed。
### 4.5 WP-4 桌面编辑器与导出
主责范围:EDITOR-01 至 EDITOR-09、TEXT-01 至 TEXT-14、COL-01 至 COL-05、DYN-01 至 DYN-09、EXPORT-01 至 EXPORT-06、NFR-03、NFR-06AC-07、AC-09 至 AC-12、AC-14、AC-16 至 AC-19、AC-23 P0-A 子集、AC-27、AC-32。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP4-01` 编辑器壳、Canvas Schema 与底图 | WP-2;使用 WP-5 稳定 fixture | 按 UIDesign/低保真实现三栏编辑器、顶部/底部状态、Fabric 转换边界、底图填充/适配/裁剪/调色/滤镜/恢复原图和换底图 | `TDD-WP4-BG-001``TDD-WP4-BG-002` | 底图参数可预览、提交、撤销、保存、重开和导出一致;换图保留覆盖层、重置底图处理并刷新色卡 |
| `TASK-WP4-02` 画布选择、变换与普通贴纸 | `TASK-WP4-01` | 实现循环选择、长按候选、多选/框选、移动/缩放/旋转/翻转/透明度/复制/层级/吸附、撤销重做和 50 元素双端限制 | `TDD-WP4-CAN-001``TDD-WP4-STK-001` | 50 元素可编辑保存导出,第 51 个被阻断;无图层面板、隐藏、锁定、编组;动态 UI 不改变工具尺寸 |
| `TASK-WP4-03` 文字模板、字体与属性 | `TASK-WP4-01`WP-5 模板/字体 fixture | 实现必须先选模板、四类/显示名搜索/catalog 顺序/账号最近使用、多行内容、模板切换、FontFace ready、字号/缩放、填充/描边/背景/对齐/行距/字距和一次提交撤销 | `TDD-WP4-TXT-001``TDD-WP4-TXT-002``TDD-WP4-TXT-003` | 文本/换行/变换按规则保留;真实字体缺失使模板 unavailable;不提供普通文字或普通贴纸关键词搜索;不静默回退 |
| `TASK-WP4-04` 色卡与动态贴纸 provider | `TASK-WP4-01`WP-5 声明式资源 | 实现 `mmcq-v1` 确定五色、四个色卡 renderer、时间/地点/身份 provider、DYN004 先确认后定位、坐标保存/清理、DYN012 FONT081 标记 | `TDD-WP4-COL-001``TDD-WP4-DYN-001``TDD-WP4-DYN-002``TDD-WP4-DYN-003` | 色卡只读原始底图且网络上传为 0;时间值重开不漂移;拒绝定位调用为 0;身份前缀一个 `@`DYN012 不静默换字体 |
| `TASK-WP4-05` 客户端导出与结果弹层 | `TASK-WP4-01``TASK-WP4-04``TASK-WP2-07` | 实现四比例真实像素、sRGB、JPG 80-100/默认 92、PNG 无损、无水印、未提交修改确认、同一 Blob 下载/上传和四结果组合 UI | `TDD-WP4-EXP-001` | 确认未提交修改只形成一次撤销并进入自动保存;导出本身不额外建撤销;后端失败不撤回已成功下载 |
| `TASK-WP4-06` 键盘、焦点与语义可访问性 | `TASK-WP4-01``TASK-WP4-05` | 落实 skip link、焦点顺序、ARIA/live region、弹层焦点/返回、画布外等价控件、200% 缩放和 axe | `TDD-WP4-A11Y-001` | axe critical/serious 为 0;状态不只靠颜色;异步更新不抢焦点;最长文案、弹层和主动作可达 |
| `TASK-WP4-07` 视觉与性能预算 | `TASK-WP4-01``TASK-WP4-06`;最终素材依赖 WP-5 | 建立固定 Canvas/字体/动态值、Chrome/Edge 截图 diff、50 元素交互、自动保存、编辑器打开、导出、内存和 DOM 性能 harness | `TDD-WP4-VIS-001``TDD-WP4-PERF-001` | 边界偏差、显著像素和全部性能预算符合 tdd;已知替代人工复核;不得通过放宽超时、减元素或降尺寸掩盖失败 |
WP-4 以 `editor``export` 为主 UI 单元,并回归 `workspace``project-detail` 的进入/返回、保存和 latest 状态。占位字体、未校验模板或只在一个浏览器通过时不能完成。
### 4.6 WP-5 素材转换、发布与 P0-A 白名单
主责范围:STATIC-01 至 STATIC-04、ADMIN-06、ADMIN-07、PRIV-05、NFR-02AC-13、AC-15 P0-A 子集、AC-31、AC-42、AC-48。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP5-01` 只读素材编译器 | WP-0 | 建立 TypeScript CLI,只读读取规范 manifest/catalog/metadata,输出 TemplateRenderModel、版本化元数据、最小 derived 产物和源前后校验报告;不执行 Lua/Prefab | `TDD-WP5-MAN-001` | 源文件哈希/时间不变;不读证据目录;不复制全库或形成等价派生副本;内容哈希去重复用 |
| `TASK-WP5-02` 普通贴纸 catalog 与虚拟目录 | `TASK-WP5-01` | 构建 part1-25 的 1,407 项 StaticStickerCatalog,保留三组重复、稳定 ID/顺序/哈希/尺寸/MIME/缩略图引用;接入虚拟列表和懒加载 | `TDD-WP5-CAT-001` | 计数、part、重复和顺序精确;原图按需加载;DOM 只保留视口和两屏缓冲 |
| `TASK-WP5-03` 复杂资源注册与 P0-A 白名单 | `TASK-WP5-01`;与 WP-4 renderer 契约联调 | 导入注册 332 文字、86 字体项、16 色卡、35 动态;公开 manifest 只启用 32 文字、实际字体+FONT081、COLOR001/002/008/016、10 动态和 1,407 普通贴纸 | `TDD-WP5-WHITE-001``TDD-WP5-COL-001` | 白名单外复杂素材不对普通用户可见;四种色卡消费同一五色;色卡/动态不计入 25 part;不把 full_p0 分批公开 |
| `TASK-WP5-04` Immutable manifest 与三类资源隔离 | `TASK-WP5-01``TASK-WP5-03`、WP-0 gate/cache | 实现 release_version、manifest/file SHA-256、public/preview/private 三类路由、鉴权、no-store/immutable 缓存和不可推导资源 URL | `TDD-WP5-RES-001``TDD-WP5-CACHE-001` | public manifest 不含 internal/private;浏览器不见绝对路径;SW/Cache/IndexedDB 实际枚举无私有或预览内容 |
| `TASK-WP5-05` 后台普通贴纸上传与版本发布 | `TASK-WP5-02``TASK-WP5-04`、WP-0 存储 | 实现 PNG/WebP 流式校验、stable ID/part/顺序、原图与缩略图独立预留/计量、immutable release 切换和旧版本保留 | `TDD-WP5-UPL-001` | 两类文件均计入 5 GBfull/unavailable 阻断;恰好等于上限允许提交后 full;不把既有归档复制进 managed-assets |
| `TASK-WP5-06` 历史贴纸显式清理 | `TASK-WP5-05`、WP-2 project_asset_refs、WP-1 审计 | 实现候选查询、同管理员确认、短期 snapshot、`BEGIN IMMEDIATE` 全引用复核、整批拒绝/排队、Worker 物理删除、重计量和全阶段审计 | `TDD-WP5-CLN-001` | 有任一 release/active/trashed/待发布引用则整批拒绝;排队不减容量;无自动清理;物理删除和重测后才恢复 |
| `TASK-WP5-07` 内部预览授权生命周期 | `TASK-WP5-03``TASK-WP5-04`、WP-1 会话 | 实现批次、AssetPreviewGrant、active/revoked/expired、每次授权校验、随机 manifest item ID、撤销即时阻断和既有项目按版本渲染 | `TDD-WP5-PREV-001` | 授权不改变普通用户角色;不出现后台能力;撤销/到期阻断新取用但不破坏已保存项目 |
真实约 3.57 GB 归档只在受控 release job 只读校验,日常 CI 使用小型合成 fixture。WP-5 的最终人工视觉通过依赖 WP-4 renderer;两者可并行开发但不能相互用占位实现宣告完成。
### 4.7 WP-6 运营后台与内部运营控制
主责范围:ADMIN-01、ADMIN-02、ADMIN-04、ADMIN-05、ADMIN-08、ADMIN-09、NFR-08AC-25、AC-47、AC-50、AC-52。模型配置、点数和素材能力分别复用 WP-3、WP-2、WP-5,不转移唯一主责。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Green / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP6-01` 后台壳、权限与安全摘要 | WP-1、WP-2、WP-5 | 按 UIDesign 实现独立 `/admin` 路由域、侧栏/总览、用户、邀请码、点数、素材、预览、生成记录入口和 active super_admin 服务端授权 | `TDD-WP6-ADM-001` | 普通/预览账号无法进入;管理员与普通 session 域分离;默认列表只含脱敏摘要;无敏感配置回显 |
| `TASK-WP6-02` 私有内容告知与逐次访问 | `TASK-WP6-01`、WP-1 UserProfile/审计 | 实现当前 notice version bootstrap、身份+版本持久 ack、428 区域门禁、升版重阻断、“打开并记录审计”和先审计后返回内容 | `TDD-WP6-PRIV-001``TDD-WP6-PRIV-002` | 跨标签、重启、重登和 Chrome/Edge 同版本不重复;hover/预取不打开;每次点击独立记录;审计失败不返回内容;不要求逐次填写原因 |
| `TASK-WP6-03` 免费服务硬停止与恢复 | `TASK-WP6-01`、WP-1/2 事务基础 | 实现 Resend 每日/月度、高德月度用量领取,paused_quota/provider、上限只可下调、健康检查和 super_admin 人工恢复 | `TDD-WP6-SVC-001``TDD-WP6-SVC-002` | 第 81/1001 次不调用;不得提高固定上限、启用收费、自动恢复/扩容;高德暂停只影响 DYN004 自动定位 |
| `TASK-WP6-04` 敏感操作审计与保留 | `TASK-WP6-01``TASK-WP6-03`、WP-5 清理 | 把用户、点数、邀请、模型、素材、预览、服务、余额恢复和贴纸清理各阶段纳入同事务 AdminOperationLog;实现 180 天 Worker 清理 | `TDD-WP6-AUD-001` | 两类审计严格分离、180 天内不可改删、贴纸清理请求/复核/拒绝或排队/物理结果齐全且不含正文 |
| `TASK-WP6-05` 模型/服务/存储状态与诊断 | `TASK-WP6-01`、WP-0 诊断、WP-3 runtime | 实现总览、模型、服务与存储页面的 configured default/runtime/recommended 三列、Worker/网关/Resend/高德/storage 状态、REST refetch 和复制诊断 | `TDD-WP6-STATE-001``TDD-WP6-DIAG-001` | 推荐可 null;runtime 变化不回写配置;只显示稳定非敏感字段和逻辑位置;无密钥、邮箱、路径、正文或供应商原文 |
WP-6 必须覆盖 `admin-overview``admin-users``admin-invites``admin-models``admin-assets``admin-preview``admin-generations``admin-services-storage``admin-audit`。后台按钮的禁用态不替代服务端授权、CAS、事务或审计。
### 4.8 WP-7 P0-A 验收准备与发布
主责范围:PRD 第 22 节全部 52 项当前 AC 和第 23 节发布门槛;产品 AC 唯一主责仍留在 WP-0 至 WP-6WP-7 只主责 AC-41 并汇总发布证据。
| 任务 | 硬依赖 | 实现与产出 | 唯一主责测试族 | Passed / 禁止提前宣告 |
| --- | --- | --- | --- | --- |
| `TASK-WP7-01` 候选制品与候选浏览器记录 | WP-0 至 WP-6 Green | 从候选便携包和当前安装的真实 Chrome/Edge 可执行文件生成 `artifacts/tdd/<run_id>/release-candidate.json`,记录 Windows build、品牌、major、full version、记录时间、候选制品哈希和固定端口;生成候选 ZIP 与候选 `START-HERE.txt`,但不写最终 `RELEASE.json` | 支撑任务,不新增父测试族;最终发布验收由 `TASK-WP7-07` 主责 | 候选记录字段完整、脱敏且与候选制品一致;只作为后续精确环境输入,不能标记发布冻结或替代最终 RELEASE 证据 |
| `TASK-WP7-02` 三模型真实契约验收 | `TASK-WP7-01`、WP-3 Green、受控凭据 | 对三个模型分别运行纯文字、参考图、四比例、同步/异步、响应、九类错误、结算和契约变化重验,保存脱敏证据 | `TDD-WP7-EXT-001` | 每个模型独立证据齐全且匹配最后配置;任一失败保持 externally_blocked;不共享 verified 标记 |
| `TASK-WP7-03` Resend 真实发布门槛 | `TASK-WP7-01`、WP-1/WP-6 Green、受控域名 | 核验 SPF/DKIM、免费规则;QQ/163/企业邮箱各 20 封至少 19 封在 2 分钟内送达;用正式链完成普通/管理员认证 | `TDD-WP7-EXT-002` | 人工统计脱敏;开发预置账号和 mock 不能作为证据;未达门槛不启动实际 P0-A 验收 |
| `TASK-WP7-04` 高德真实发布门槛 | `TASK-WP7-01`、WP-4/WP-6 Green、受控 Key | 核验定位/逆地理、QPS、白名单、安全限制、每月 1,000 次硬停止和 DYN004 确认流程 | `TDD-WP7-EXT-003` | 真实测试坐标不关联真实项目;不发第 1001 次;不启用付费或自动扩容;失败保持 externally_blocked |
| `TASK-WP7-05` 候选精确环境 UI、视觉、性能与可访问性验收 | `TASK-WP7-01``TASK-WP7-04` | 严格使用候选记录中的两个真实 full version,在 1920×1080、DPR 1、100%/200% 下重跑 AC-24、AC-32、全部 E2E、视觉、性能、下载、文件选择和逐个非 N/A 页面状态;按 frame 对照低保真 | `TDD-WP7-UI-001` | 22 个 coverage unit 全部有证据;候选环境与记录任何漂移均使本任务重跑;无独立 Pencil frame 的页面不漏测;Canvas Index 不计产品页 |
| `TASK-WP7-06` 追踪闭环与最终 AC 预冻结验收 | `TASK-WP7-01``TASK-WP7-05` | 运行 `test:all``validate:tdd-trace`;汇总候选制品、外部、UI/视觉/性能证据;用固定 super_admin/普通账号及正常链创建临时第二普通账号完成 52 AC;确认候选浏览器字段在验收期间未漂移 | `TDD-WP7-AC-001` | 52/52 当前 AC passed109 需求 ID、13 模块、19 契约、9 错误、89/89 父族、117/117 case 完整;未来四项不计入;未通过时不得写最终 `RELEASE.json` |
| `TASK-WP7-07` 最终 RELEASE 冻结、制品生成与泄漏扫描 | `TASK-WP7-06` | 验收通过后把未漂移的候选浏览器记录写入最终 `RELEASE.json`,生成最终 ZIP、SHA-256 和 `START-HERE.txt`;把 RELEASE SHA-256 写入最终 `evidence.json`;扫描源码、Git、最终 ZIP、DB 配置、manifest、日志、截图、trace/evidence,并执行最终 package/support-gate smoke | `TDD-WP7-REL-001``TDD-WP7-SEC-001` | 最终记录、制品、Windows build、两个 full version、固定 major 和端口一致;零真实敏感值/用户绝对路径;最终写入或扫描失败时不得发布,且不能沿用候选 passed 状态冒充最终冻结 |
任一真实外部门槛失败时,不得开始 P0-A 实际验收,也不得把 WP-7 或整体发布标记 passed。
## 5. 跨工作包集成任务
下列集成门禁不创建新的产品主责或测试族;由上游任务交付接口,下游任务消费并共同回归:
| 集成门禁 | 上游 -> 下游 | 必须证明 |
| --- | --- | --- |
| `INT-01` 存储状态与项目 | WP-0 -> WP-2 | full 可纯 JSON 保存、unavailable 拒绝新增后端写;项目只保存已提交资源 ID;删除完成后物理重测 |
| `INT-02` 存储状态与导出 | WP-0 -> WP-2/WP-4 | 客户端下载与 latest 上传解耦;full/unavailable 不覆盖旧 latest;失败不撤回已下载文件 |
| `INT-03` 存储状态与素材 | WP-0 -> WP-5 | 只读归档不复制;managed/derived 受 5 GB 约束;原图/缩略图独立预留和计量 |
| `INT-04` 浏览器 gate | WP-0 -> WP-1 至 WP-7 | 全部产品 HTML、bundle 和 API 均在 gate 后;阻断页不读取身份、业务、资源或容量 |
| `INT-05` 安全配置应用 | WP-0 -> WP-1/WP-6 | API 原子应用后才生效;离线执行者无产品角色;失败无部分生效且有允许的 system 审计 |
| `INT-06` 任务诊断 | WP-2 -> WP-3/WP-6 | 未知上游结果进入成本核对,不新增用户任务状态、不补扣点数、不泄露供应商原文 |
| `INT-07` 模型三层状态 | WP-3 -> WP-2/WP-6 | configured default、runtime availability、recommended 独立;runtime 降级不改配置;推荐可空 |
| `INT-08` 私有告知 | WP-1 -> WP-6 | UserProfile 按身份+版本持久;区域服务端门禁;每次打开仍先写独立访问审计 |
| `INT-09` 贴纸引用与清理 | WP-2/WP-5 -> WP-6/WP-0 | release、active/trashed 项目和待发布引用阻止整批清理;排队不减容量;物理删除后重测 |
| `INT-10` 编辑器真实素材 | WP-5 -> WP-4/WP-7 | 编辑预览与导出使用同一声明式 renderer/版本/字体;白名单、替代项和 Chrome/Edge 视觉证据一致 |
任一 `INT-*` 失败时,涉及的上下游任务均不能超过 Green;若失败来自真实环境或外部依赖,则保持 externally_blocked,不以局部 mock 结果覆盖。
## 6. 页面与状态交付归属
### 6.1 UIDesign coverage unit 归属
| coverage unit | 实现主责任务 | 最终证据任务 |
| --- | --- | --- |
| `support-gate` | `TASK-WP0-03` | `TASK-WP7-05` |
| `user-auth` | `TASK-WP1-02``TASK-WP1-03` | `TASK-WP7-03``TASK-WP7-05` |
| `workspace` | `TASK-WP2-01``TASK-WP2-05` | `TASK-WP7-05` |
| `current-task` | `TASK-WP2-05``TASK-WP2-06``TASK-WP3-04` | `TASK-WP7-05` |
| `projects` | `TASK-WP2-01``TASK-WP2-02``TASK-WP2-03` | `TASK-WP7-05` |
| `project-detail` | `TASK-WP2-01``TASK-WP2-03``TASK-WP2-07` | `TASK-WP7-05` |
| `editor` | `TASK-WP4-01``TASK-WP4-02``TASK-WP4-03``TASK-WP4-04``TASK-WP4-05``TASK-WP4-06``TASK-WP4-07` | `TASK-WP7-05` |
| `export` | `TASK-WP2-07``TASK-WP4-05` | `TASK-WP7-05` |
| `credits` | `TASK-WP2-04` | `TASK-WP7-05` |
| `settings` | `TASK-WP0-04``TASK-WP1-05` | `TASK-WP7-05` |
| `preview-user-variant` | `TASK-WP5-04``TASK-WP5-07` | `TASK-WP7-05` |
| `admin-auth` | `TASK-WP1-04` | `TASK-WP7-03``TASK-WP7-05` |
| `admin-overview` | `TASK-WP6-01``TASK-WP6-05` | `TASK-WP7-05` |
| `admin-users` | `TASK-WP6-01``TASK-WP2-04` | `TASK-WP7-05` |
| `admin-invites` | `TASK-WP6-01``TASK-WP1-01` | `TASK-WP7-05` |
| `admin-models` | `TASK-WP3-01``TASK-WP3-02``TASK-WP6-05` | `TASK-WP7-05` |
| `admin-assets` | `TASK-WP5-05``TASK-WP5-06``TASK-WP6-01` | `TASK-WP7-05` |
| `admin-preview` | `TASK-WP5-07``TASK-WP6-01` | `TASK-WP7-05` |
| `admin-generations` | `TASK-WP6-02` | `TASK-WP7-05` |
| `admin-services-storage` | `TASK-WP6-03``TASK-WP6-05` | `TASK-WP7-05` |
| `admin-audit` | `TASK-WP6-04` | `TASK-WP7-05` |
| `system-ui` | `TASK-WP0-07``TASK-WP0-08``TASK-WP0-09` | `TASK-WP7-05``TASK-WP7-07` |
所有 coverage unit 的正常、空/加载、失败/禁用及适用的冲突/容量/特殊状态以 `tdd.md` 第 11.1 节为准。`UIDesign.md` 中没有独立低保真 frame 的页面仍必须实现和留证;预览 PNG 不得通过 OCR 反推固定文案。
### 6.2 Pencil 产品 frame 映射
下表覆盖 `.pen` 中全部 18 个产品 frame。状态范围只定位实现与证据,不替代 `UIDesign.md` 的完整状态矩阵;同一 frame 同时承载两个 coverage unit 时在 `page_id` 中并列。
| page_id | frame ID | 画板名 | 实现主任务 | 必须覆盖的状态范围 |
| --- | --- | --- | --- | --- |
| `user-auth` | `Z0pf8` | 01A 普通用户登录 | `TASK-WP1-02` | 登录正常;字段初始空;发码/登录加载;验证码、Resend 和身份状态失败;管理员入口、固定本机提示、艺术带与焦点 |
| `user-auth` | `DVPM8` | 01B 注册展开态 | `TASK-WP1-03` | 邀请与邮箱已验证摘要;资料和告知未完成/完成;注册中;名额、邀请、验证码和提交失败;主动作禁用 |
| `workspace` | `WbDYT` | 02A 空工作台 | `TASK-WP2-01` | 无项目艺术带;生成表单、推荐模型、四比例与空任务;模型/项目加载;模型、点数、参考图和容量禁用 |
| `workspace``current-task` | `d99Lo` | 02B 生成中工作台 | `TASK-WP2-05` | queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认 |
| `projects` | `zXyG9` | 03A 项目列表 | `TASK-WP2-01` | active/trashed、筛选、多选 failed_empty;空/骨架;20 active、恢复/批量禁用;多标签和容量提示 |
| `project-detail` | `v2Qbu` | 03B 项目详情 | `TASK-WP2-01` | 历史、固定比例、继续生成、编辑、原图/latest;无成功图/无成品;10 图上限、资源失败和容量状态 |
| `editor` | `bHQnJ` | 04A 三栏编辑器 | `TASK-WP4-01` | 三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable |
| `export` | `i9upg7` | 04B 导出弹层 | `TASK-WP4-05` | JPG/PNG、质量、尺寸;合成/持久化加载;未提交确认;四类失败结果;冲突一次下载和 full/unavailable |
| `credits` | `YlKzE` | 05A 点数明细 | `TASK-WP2-04` | available/reserved、流水和分页;无流水/加载;失败保留安全摘要;负 available 如实显示且无购买入口 |
| `settings` | `Ws5E0` | 05B 设置与本机数据 | `TASK-WP1-05` | 资料、本机数据、容量摘要和固定文案;加载/保存失败;full/unavailable;注销确认、处理中和返回登录 |
| `admin-overview` | `e4e2Kz` | 06A 后台总览 | `TASK-WP6-01` | 名额、任务、成本核对、服务/容量和审计摘要;骨架/空事件;聚合失败;三模型状态分列和待处理事项 |
| `admin-models` | `YVfVG` | 06B 模型配置 | `TASK-WP6-05` | 完整三模型集合、default/runtime/recommended;加载;空推荐;替代/priority 禁用;CAS 冲突和整套回滚 |
| `admin-assets` | `A28V3c` | 06C 素材与历史清理 | `TASK-WP5-06` | 上传/版本/候选;无上传/无候选;格式/编译/权限失败;full/unavailable;引用冲突、排队、物理删除和重计量 |
| `admin-generations` | `OnsiT` | 06D 生成记录与私有告知 | `TASK-WP6-02` | 默认隐藏正文;身份+版本告知;逐次打开;空记录/审计写入加载;428、审计失败、升版重阻断 |
| `admin-services-storage` | `L3lde2` | 06E 服务与存储 | `TASK-WP6-05` | Resend/高德/网关/Worker/LocalDataRoot;指标加载;paused/degraded/unavailable;恢复前置、清理排队和重计量 |
| `admin-audit` | `DlCpN` | 06F 私有内容访问审计 | `TASK-WP6-04` | 两类独立审计、游标和 180 天;空/加载;查询失败;不可编辑删除;无正文、图片、密钥和路径 |
| `support-gate` | `u1adni` | 07A 浏览器硬阻断 | `TASK-WP0-03` | 四种阻断 reason、支持品牌/major、最小诊断;bundle/API 无绕过;无业务空态、身份或容量读取 |
| `system-ui` | `awt96` | 07B Windows 辅助系统界面 | `TASK-WP0-07` | 托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作 |
`Z8p3I` 00 Canvas Index 是非产品索引,仅由 `TASK-WP7-05` 校验设计资产清单,不计产品页面、实现任务或完成率。低保真中的版本、账号、点数、容量和时间均为示例值,运行状态必须来自 fixture,最终浏览器版本必须来自候选记录和验收后冻结的 `RELEASE.json`
### 6.3 UIDesign-only 页面映射
以下 5 个 coverage unit 没有独立 Pencil 产品 frame,但仍是完整实现与证据范围;不得因无画板而跳过。
| page_id | frame ID | 画板名 | 实现主任务 | 必须覆盖的状态范围 |
| --- | --- | --- | --- | --- |
| `preview-user-variant` | `UIDesign-only` | 无独立画板 | `TASK-WP5-07` | 有效授权、无授权/空批次、加载、撤销/过期阻断;不出现后台权限;全局容量条 |
| `admin-auth` | `UIDesign-only` | 无独立画板 | `TASK-WP1-04` | 白名单邮箱验证码、字段空/加载、非白名单、停用/移除、Resend 失败;独立 audience 与返回普通登录 |
| `admin-users` | `UIDesign-only` | 无独立画板 | `TASK-WP6-01` | 脱敏列表/详情、暂停恢复/调点、空/筛选空/骨架、原因缺失和状态禁用、负 available |
| `admin-invites` | `UIDesign-only` | 无独立画板 | `TASK-WP6-01` | 创建/停用/期限/次数/脱敏复制、空/骨架、名额满、过期/耗尽、请求失败和幂等/CAS 结果 |
| `admin-preview` | `UIDesign-only` | 无独立画板 | `TASK-WP5-07` | 批次、模板状态、授权/撤销/到期、空/骨架、非法转换/发布失败;不出现 P0-B 全量开放 |
## 7. 追踪与完成门禁
### 7.1 机器可读任务记录
`tasks.manifest.json` 是本计划的逐任务执行记录,不是新的需求、架构或测试来源。每个任务对象必须包含:`task_id``work_package``dependencies``requirements``acceptance_criteria``development_plan_sections``modules``parent_families`、完整 `case_ids`、逐父族 `first_red``minimal_green``refactor_scope``validation_commands``evidence_directories``automation``release_gate``ui_scope`
manifest 必须满足:
- 52 个任务全部有独立记录;`TASK-WP7-01` 是不新增父族/case 的候选发布支撑任务,其余任务按本计划拥有父测试族;
- 117 个具体 case_id 恰好各出现一次并映射到其已知父族,不只依赖运行时模糊匹配;
- requirements、AC、首个 Red、最小 Green 和层级从当前 `tdd.md` 的父族/case 定义确定性取得,不能由任务实现者自行补写;
- DevelopmentPlan 章节、模块边界、Refactor 范围和 UI scope 由本计划固定;模块路径尚未在上游冻结时只使用已冻结组件名,不擅自固化目录结构;
- `tasks.md``tasks.manifest.json` 或任一冻结输入变化时,追踪校验先比较哈希与集合,再决定受影响任务状态,不能只更新 manifest 哈希。
### 7.2 数量闭环
| WP | 开发任务 | 本计划唯一归属父测试族 | `tdd.md` 规范 case | 当前 AC 唯一主责 |
| --- | ---: | ---: | ---: | ---: |
| WP-0 | 9 | 17 | 20 | 4 |
| WP-1 | 6 | 11 | 13 | 7 |
| WP-2 | 7 | 15 | 30 | 16 |
| WP-3 | 4 | 7 | 10 | 2 |
| WP-4 | 7 | 15 | 17 | 13 |
| WP-5 | 7 | 9 | 9 | 5 |
| WP-6 | 5 | 8 | 11 | 4 |
| WP-7 | 7 | 7 | 7 | 1 |
| 合计 | 52 | 89 | 117 | 52 |
`pnpm validate:tdd-trace` 必须从结构化来源或确定性解析验证:
- 本计划列出的父测试族集合与 `tdd.md` 第 6.1 至 6.8 节完全相等,恰为 89 个,且每个只归属一个开发任务;
- 第 6.9 节 117 个 case 都能按稳定正则映射到已知父族,89/89 父族至少一个 case;
- `tasks.manifest.json` 中 52 个任务齐全,117 个 case_id 各出现一次,任务的 derived automation/release_gate 与父族层级一致;
- 52 个当前 AC 恰有一个 WP 主责,AC-08、AC-26、AC-37、AC-54 不得进入当前 passed 统计;
- 109 个当前 PRD 需求 ID、十三个功能模块、十九个数据契约、九类 GenerationErrorCategory 和 22 个 UI coverage unit 均有落点;
- `.pen` 的 18 个产品 frame ID 各有 page_id、主任务和状态范围;5 个无独立画板 coverage unit 明确标为 `UIDesign-only`
- 每个 case 的必填字段、派生 `automation``release_gate`、逐层状态和证据目录非空且未被人工改写。
### 7.3 工作包完成检查
| WP | 自动门禁 | 真实/人工门禁 | 不能提前宣告 |
| --- | --- | --- | --- |
| WP-0 | 单元、API、存储、Supervisor、安全、打包 Green | 最终浏览器记录在 WP-7 | 固定依赖、回环、容量等号、日志/诊断/凭据、无备份不迁移任一未过 |
| WP-1 | 认证状态机、事务、会话、名额、注销、审计 Green | Resend 正式认证 | 预置账号或 mock 邮件不得替代真实认证 |
| WP-2 | 项目、点数、任务、参考图、冲突、错误 Green | 真实模型完成态依赖 WP-3 | mock 成功不得替代真实模型结算 |
| WP-3 | 配置集合、runtime、Adapter mock、Worker 恢复 Green | 三模型独立真实契约 | 任一模型未匹配最后配置完成全矩阵 |
| WP-4 | 编辑器、导出、a11y、性能 harness Green | 最终视觉依赖 WP-5 真实白名单 | 占位字体/资源或单浏览器通过 |
| WP-5 | 编译、目录、隔离、缓存、上传、清理 Green | 真实归档只读校验与人工视觉 | 自动清理、引用未清、排队即减量或逐批公开 full_p0 |
| WP-6 | 后台、告知、审计、服务、存储 Green | 真实服务恢复与正式身份流程 | 浏览器状态代替后端确认、逐次审计缺失、敏感信息回显 |
| WP-7 | 候选记录、`test:all`、追踪和预冻结 AC Green | 精确 full version UI/视觉/性能、AI、Resend、高德通过后才写最终 RELEASE;最终制品扫描通过 | 候选记录被当作最终 RELEASE,或任一外部门槛、页面状态、AC、最终哈希/扫描未完成 |
### 7.4 P0-A 最终完成定义
只有同时满足以下条件,开发任务计划才完成:
1. WP-0 至 WP-7 全部达到各自门禁,所有任务为 `passed`,没有 `source_changed``red``green``externally_blocked` 遗留。
2. 89/89 父测试族、117/117 规范 case 及参数分支均有可复现 Red、最终 Green/Passed 和脱敏证据。
3. 52/52 当前 AC passed109 个需求 ID、十三个模块、十九个契约和九类错误全部闭环;`reference_invalid``safety_rejected` 证据分离。
4. 存储精确阈值、等号写入、超限零副作用、原图/缩略图计量、full/unavailable 动作和物理删除后重测全部通过。
5. ModelConfig 始终恰好一个 enabled default、priority 唯一正整数;runtime 不回写配置;recommended 可为空。
6. 私有告知按 super_admin 身份+版本持久,升版重阻断;每次私有图片/完整提示词打开仍先写独立审计。
7. 浏览器实际枚举确认 SW、Cache Storage 和 IndexedDB 不含 internal/private、项目、提示词或未保存草稿。
8. 临时第二普通账号通过正常邀请/验证码链创建,完成跨用户隔离后正常注销并进入规定清理路径。
9. 22 个 UI coverage unit 的全部适用状态在最终 Chrome/Edge、1920×1080、100%/200% 下无不可用重叠,焦点、文案、视觉、50 元素和四比例导出通过。
10. 三模型、Resend、高德真实门槛通过;没有自动充值、收费备用、自动恢复或自动扩容。
11. 最终 ZIP、SHA-256、`RELEASE.json``START-HERE.txt`、固定端口和真实浏览器记录一致,局域网、其他设备及不支持浏览器不能进入产品。
12. 代码、制品、日志、配置、manifest、截图、trace 和证据零真实凭据、验证码、会话令牌、管理员真实邮箱、完整私有内容和硬编码用户绝对路径。
13. 普通用户主框架和设置区持续原样显示:“测试数据仅保存在本机,不自动备份,也不会迁移到正式系统。”
## 8. 当前计划明确不包含
- 不创建 AC-08、AC-26、AC-37、AC-54 或任一 P0-B 当前开发任务。
- 不实现手机、局域网、远程访问、跨设备、公司系统合并、对象存储、产品 HTTPS、云备份、项目归档、数据迁移或恢复。
- 不实现 P1 的本地底图上传、空白画布、普通贴纸关键词搜索、公开注册准备、高德主体迁移或正式合规条款。
- 不实现支付、订阅、自动充值、批量生成/导出、复制生成、社区、普通文字、用户自定义贴纸、AI 贴纸、GIF/视频、直发小红书、局部编辑、协作、版本历史、编组或图层面板。
- 不重新选择技术栈,不引入 Docker、Redis、远程数据库/队列、对象存储、外部日志/指标、自动更新或自动扩容。
- 不在本计划中虚构人员、日历工期或故事点。排期只有在团队规模、可用工时、外部凭据窗口和真实设备排期确定后,基于本任务依赖图另行制定。
+1017
View File
File diff suppressed because it is too large Load Diff