# Dada P0-A 开发任务计划

| 文档项 | 内容 |
| --- | --- |
| 文档版本 | 1.2 |
| 编写日期 | 2026-07-27 |
| 当前交付 | 仅 P0-A Windows 本机测试版 |
| 产品需求唯一权威 | `PRD.md` v1.10 |
| 功能导航 | `FeatureSummary.md` 1.1 |
| 工程基线 | `DevelopmentPlan.md` 1.2 |
| UI 基线 | `UIDesign.md` 1.1 |
| TDD 基线 | 哈希锁定的 `tdd.md`，文件内版本 1.5，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.2 | `76CCC786E910F3E503921AEF5B9BD22976E364184BA8C0062CDCF1C5F376AC0A` |
| `UIDesign.md` | 1.1 | `40A9EA29B921989877A01253A686F12A0EDE93454F8A23ADD5C0511616FCC35C` |
| `tdd.md` | 文件内版本 1.5 | `894165E188D9B821F81E1E1418011D38D3591873DDD5A23BA8C271C322B2F66E` |
| `Dada-P0A-LowFi.pen` | Pencil 2.14，19 个顶层画板 | `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`。
7. 在独立任务分支形成任务提交，推送到 `intelligrow` 组织仓库的同名 Gitea 远端分支，核对远端哈希与本地提交一致并记录交付证据；推送未成功前不得标记 `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 或明确不做能力混入。
- 任务改动已形成范围明确的本地 Git 提交，且完整提交 SHA、Gitea 组织仓库、远端分支和远端哈希核对结果已记录；个人命名空间、本地未提交、推送失败或远端哈希不一致均不满足交付条件。

任务含 EXT-REAL 或 MANUAL 层级时，本地自动化 Green 后可以进入 `externally_blocked`；只有真实/人工证据齐全且 Gitea 远端交付核对通过才为 `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-1；WP-5 的只读编译器、catalog 和资源路由骨架可启动 | WP-1 依赖 WP-0；WP-5 依赖 WP-0 |
| C | WP-2；WP-5 继续 | WP-2 依赖 WP-0、WP-1 |
| D | WP-3、WP-4、WP-5 可并行；WP-4 最终素材视觉集成等待 WP-5 | WP-3/WP-4 依赖 WP-2；WP-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-09；AC-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-04；AC-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-05；AC-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-03；AC-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 的纯配置行为可 Green，AC-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-06；AC-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-02；AC-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 GB；full/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-08；AC-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-6，WP-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 passed；109 需求 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 passed，109 个需求 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、远程数据库/队列、对象存储、外部日志/指标、自动更新或自动扩容。
- 不在本计划中虚构人员、日历工期或故事点。排期只有在团队规模、可用工时、外部凭据窗口和真实设备排期确定后，基于本任务依赖图另行制定。
