Files
tyx_AI_xhs/tasks.md
T
suyx 4d1ec8ba7e
Dada P0-A isolated Windows CI / validate-and-package (push) Failing after 1m5s
feat: complete TASK-WP5-03 asset allowlist
2026-08-03 18:24:16 +08:00

394 lines
51 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.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`
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-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、远程数据库/队列、对象存储、外部日志/指标、自动更新或自动扩容。
- 不在本计划中虚构人员、日历工期或故事点。排期只有在团队规模、可用工时、外部凭据窗口和真实设备排期确定后,基于本任务依赖图另行制定。