# 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.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//` 证据;缺 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-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//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、远程数据库/队列、对象存储、外部日志/指标、自动更新或自动扩容。 - 不在本计划中虚构人员、日历工期或故事点。排期只有在团队规模、可用工时、外部凭据窗口和真实设备排期确定后,基于本任务依赖图另行制定。