Files
tyx_AI_xhs/tasks.manifest.json

9362 lines
683 KiB
JSON
Raw Permalink 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.
{
"schema_version": 1,
"document_version": "1.1",
"scope": "Dada P0-A Windows localhost only",
"generated_date": "2026-07-27",
"authority": {
"product": "PRD.md v1.10",
"engineering": "DevelopmentPlan.md v1.1",
"ui": "UIDesign.md v1.0",
"tdd": "tdd.md hash-locked file, internal version 1.4"
},
"source_hashes": {
"PRD.md": "31F93674DF1A90B557FEE3AA9E74FB084E246CA8FE09F6BD4B1DC9D56D606565",
"FeatureSummary.md": "6F80E272AAB08A5525B54501D83F16A4F6A7A170596947BBC25F1DA54F2FE844",
"DevelopmentPlan.md": "7C579E9DF8D00DA9333F587D05FC966123437EE68575D87D73C903C1487FA9D6",
"UIDesign.md": "0C449DF833E5471843E17EB74F5B470EBC955F117CAF1D79AC9C0EF90DE763F0",
"tdd.md": "41EABEE330122FFB44752F834A97EAAE5C1CF35B99CB33B61AE6889077F96BFD",
"Dada-P0A-LowFi.pen": "A352C8F205E9399EB2E6306176253AF6FF65DDDBB9FDCEA2E2FE13E3C3459975",
"tasks.md": "A8DC1B0CA98D0ACB9F3186F15219839A753A69B2D4CEA9F9B4D92EFE1444A568"
},
"module_boundary_policy": "modules are frozen DevelopmentPlan components; exact repository paths are intentionally not invented before WP-0 creates the monorepo layout",
"evidence_root": "artifacts/tdd/\u003crun_id\u003e/",
"task_count": 52,
"parent_family_count": 89,
"normative_case_count": 117,
"tasks": [
{
"task_id": "TASK-WP0-01",
"work_package": "WP-0",
"title": "工程骨架与冻结依赖",
"dependencies": {
"source_text": "无",
"task_ids": [
],
"work_packages": [
]
},
"requirements": [
"NFR-09"
],
"acceptance_criteria": [
"AC-24",
"AC-46",
"AC-55",
"AC-56"
],
"acceptance_criteria_role": "supporting",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-09、DevelopmentPlan 2.1、13.1",
"DevelopmentPlan WP-0 工程前置,supporting AC-24、46、55、56;不取得 AC 唯一主责"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"1.5 工程基础设施前置条件",
"2.1 固定技术基线",
"2.2 组件边界",
"3.4 环境关系",
"14.1 测试层级",
"15 WP-0"
],
"modules": [
"release-ci",
"web",
"api",
"worker",
"supervisor",
"shared-contracts"
],
"implementation_boundary": "建立 pnpm monorepo、唯一 lockfile、React/Vite/TypeScript、Fabric、Fastify、TypeBox、Drizzle/better-sqlite3、Node Worker 和 .NET 8 Supervisor 最小可运行骨架;接通第 2.4 节脚本入口",
"parent_families": [
"TDD-WP0-DEP-001"
],
"case_ids": [
"TDD-WP0-DEP-001-frozen-toolchain"
],
"first_red": [
{
"family_id": "TDD-WP0-DEP-001",
"assertion": "冻结依赖任一无法安装、加载或最小运行"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-DEP-001",
"assertion": "精确版本、TypeScript、React/Fabric、Fastify、better-sqlite3 native 和随包 Node 全通过;不私自替换技术栈"
}
],
"task_green_gate": "精确版本安装、类型检查、React/Fabric 渲染、Fastify、native 模块和随包 Node 预检通过;失败时先修订 DevelopmentPlan,不得私自换栈",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-ci, web, api, worker, supervisor, shared-contracts.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"PKG-SEC"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-DEP-001-frozen-toolchain/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP0-02",
"work_package": "WP-0",
"title": "Schema、OpenAPI 与事件基线",
"dependencies": {
"source_text": "TASK-WP0-01",
"task_ids": [
"TASK-WP0-01"
],
"work_packages": [
]
},
"requirements": [
"GEN-14",
"NFR-05",
"PROJECT-04"
],
"acceptance_criteria": [
"AC-20",
"AC-30"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-05、DevelopmentPlan 6.1、6.6",
"PROJECT-04、GEN-14、NFR-05、DevelopmentPlan 6.2、AC-20、30"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"6.1 通用协议",
"6.2 API 分组",
"6.6 新增稳定错误码",
"14.1 测试层级"
],
"modules": [
"shared-contracts",
"api",
"web"
],
"implementation_boundary": "建立 TypeBox 单一 Schema 来源、OpenAPI 3.1、生成客户端、统一错误信封、correlation ID、SSE 非敏感事件和 REST refetch/bootstrap",
"parent_families": [
"TDD-WP0-API-001",
"TDD-WP0-EVT-001"
],
"case_ids": [
"TDD-WP0-API-001-schema-envelope",
"TDD-WP0-EVT-001-rest-refetch"
],
"first_red": [
{
"family_id": "TDD-WP0-API-001",
"assertion": "TypeBox、OpenAPI、生成客户端或错误信封漂移"
},
{
"family_id": "TDD-WP0-EVT-001",
"assertion": "SSE 携带私有正文、被客户端当作业务真相或事件缺号后不恢复"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-API-001",
"assertion": "OpenAPI 3.1 snapshot 与运行验证一致;响应有 correlation IDdetails 只含白名单字段且不泄露内部信息"
},
{
"family_id": "TDD-WP0-EVT-001",
"assertion": "事件只含固定非敏感字段;客户端收到后 REST refetch;断线/缺号 bootstrap;配置和 runtime 版本分离"
}
],
"task_green_gate": "OpenAPI snapshot 与运行校验一致;事件不承载业务真相或私有正文;断线/缺号恢复通过",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: shared-contracts, api, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-API-001-schema-envelope/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-EVT-001-rest-refetch/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP0-03",
"work_package": "WP-0",
"title": "回环访问与浏览器硬门禁",
"dependencies": {
"source_text": "TASK-WP0-02",
"task_ids": [
"TASK-WP0-02"
],
"work_packages": [
]
},
"requirements": [
"NFR-01",
"NFR-09"
],
"acceptance_criteria": [
"AC-24",
"AC-41"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-01、AC-24",
"NFR-01、AC-24、41",
"NFR-09、AC-24"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.6 浏览器支持硬门禁",
"6.4 HTTP 语义",
"12.1 本机安全边界",
"13.3 可访问性基础",
"14.7 AC-24"
],
"modules": [
"api",
"web-support-gate",
"supervisor"
],
"implementation_boundary": "固定 127.0.0.1:43121、Host/Origin/CORS 防护、最小 gate shell、UA-CH 交叉校验、24 小时短期支持 Cookie、全产品路由前置 426 门禁",
"parent_families": [
"TDD-WP0-BND-001",
"TDD-WP0-BRW-001",
"TDD-WP0-BRW-002"
],
"case_ids": [
"TDD-WP0-BND-001-loopback-origin",
"TDD-WP0-BRW-001-real-supported",
"TDD-WP0-BRW-002-hard-block"
],
"first_red": [
{
"family_id": "TDD-WP0-BND-001",
"assertion": "API 接受非回环绑定、错误 Host/Origin 或 CORS"
},
{
"family_id": "TDD-WP0-BRW-001",
"assertion": "真实支持 Chrome/Edge 无法通过门禁"
},
{
"family_id": "TDD-WP0-BRW-002",
"assertion": "其他品牌、错误 major、UA-CH 缺失/冲突或直调 API 可进入产品"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-BND-001",
"assertion": "只绑定 127.0.0.1:43121;拒绝局域网、其他 Host/Origin,不创建防火墙入站规则"
},
{
"family_id": "TDD-WP0-BRW-001",
"assertion": "RELEASE.json 记录的两个真实 full version 通过并建立短期支持 Cookie,产品 API 每次复核品牌/major"
},
{
"family_id": "TDD-WP0-BRW-002",
"assertion": "全部返回 426 BROWSER_UNSUPPORTED,只有最小引导,无登录、资源、DB 业务读取或外部调用,无绕过令牌"
}
],
"task_green_gate": "局域网/其他 Host/Origin、非 Windows、其他品牌、错误 major、UA-CH 缺失/冲突和直调 API 均不可进入;支持分支最终 passed 等待 WP-7 真实记录",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, web-support-gate, supervisor.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"API",
"PKG-SEC",
"E2E",
"MANUAL"
],
"validation_commands": [
"pnpm test:api",
"pnpm test:security",
"pnpm test:package",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-BND-001-loopback-origin/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-BRW-001-real-supported/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-BRW-002-hard-block/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "support-gate",
"role": "implementation",
"frames": {
"frame_id": "u1adni",
"frame_name": "07A 浏览器硬阻断",
"primary_task": "TASK-WP0-03",
"mapped_state_scope": "四种阻断 reason、支持品牌/major、最小诊断;bundle/API 无绕过;无业务空态、身份或容量读取"
},
"applicable_states": {
"page_id": "support-gate",
"actor_entry": "所有主体,产品门禁前",
"normal": "四种阻断 reason、支持品牌/major、无继续入口",
"empty_loading": "N/A:引导无业务空态;身份不可判定属于阻断",
"failure_disabled": "bundle/API 均无法绕过;诊断仅最小字段",
"conflict_capacity_special": "N/A:不读取业务状态或容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/support-gate/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP0-04",
"work_package": "WP-0",
"title": "LocalDataRoot 与本机数据边界",
"dependencies": {
"source_text": "TASK-WP0-01",
"task_ids": [
"TASK-WP0-01"
],
"work_packages": [
]
},
"requirements": [
"AUTH-06",
"NFR-09"
],
"acceptance_criteria": [
"AC-24",
"AC-41",
"AC-55",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.19"
],
"requirement_ac_sources": [
"AUTH-06、NFR-09、AC-24、56",
"NFR-09、17.19、AC-41、55、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.2 Supervisor 生命周期",
"3.3 离线配置命令",
"4.1 固定目录布局",
"4.2 文件标识与路径隔离",
"9.2 项目、历史、失败草稿和回收站",
"12.1 本机安全边界"
],
"modules": [
"api",
"sqlite",
"local-data-root",
"web"
],
"implementation_boundary": "建立目录布局、路径规范化、资源 ID 隔离、data_missing、只读素材根校验、无备份/无归档/无迁移边界和固定本机风险提示接线",
"parent_families": [
"TDD-WP0-DATA-001",
"TDD-WP0-DATA-002"
],
"case_ids": [
"TDD-WP0-DATA-001-root-validation",
"TDD-WP0-DATA-002-no-backup-migration"
],
"first_red": [
{
"family_id": "TDD-WP0-DATA-001",
"assertion": "LocalDataRoot 位于仓库/项目/下载/素材根,或丢失后自动重建"
},
{
"family_id": "TDD-WP0-DATA-002",
"assertion": "产品出现自动备份、项目包、业务导入或 P0-B 迁移"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-DATA-001",
"assertion": "路径校验拒绝违规目录;已初始化根缺失进入 data_missing;浏览器只见资源 ID"
},
{
"family_id": "TDD-WP0-DATA-002",
"assertion": "只允许下载原始生成图和 JPG/PNG;删除根或重装不可恢复;固定本机风险文案持续显示"
}
],
"task_green_gate": "违规目录、符号链接和路径逃逸拒绝;已初始化根缺失不自动重建;浏览器不见绝对路径;产品无业务导入/项目包/恢复入口",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, local-data-root, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"PKG-SEC",
"E2E",
"MANUAL"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:security",
"pnpm test:package",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-DATA-001-root-validation/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-DATA-002-no-backup-migration/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "settings",
"role": "implementation",
"frames": {
"frame_id": "Ws5E0",
"frame_name": "05B 设置与本机数据",
"primary_task": "TASK-WP1-05",
"mapped_state_scope": "资料、本机数据、容量摘要和固定文案;加载/保存失败;full/unavailable;注销确认、处理中和返回登录"
},
"applicable_states": {
"page_id": "settings",
"actor_entry": "active 普通/内部预览账号",
"normal": "资料、本机数据、容量摘要、固定文案、注销",
"empty_loading": "资料/状态加载",
"failure_disabled": "保存失败;注销确认/处理中禁用重复提交",
"conflict_capacity_special": "full/unavailable 状态与允许动作;注销后返回登录"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/settings/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP0-05",
"work_package": "WP-0",
"title": "容量状态、预留与文件一致性",
"dependencies": {
"source_text": "TASK-WP0-02、TASK-WP0-04",
"task_ids": [
"TASK-WP0-02",
"TASK-WP0-04"
],
"work_packages": [
]
},
"requirements": [
"ADMIN-06",
"EXPORT-06",
"NFR-05",
"PROJECT-04"
],
"acceptance_criteria": [
"AC-31",
"AC-35",
"AC-44",
"AC-55"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.19"
],
"requirement_ac_sources": [
"17.19、AC-55",
"17.19、NFR-05、AC-35、55",
"17.19、NFR-05、AC-55",
"17.19、PROJECT-04、EXPORT-06、AC-55",
"ADMIN-06、17.19、AC-31、55",
"NFR-05、17.19、AC-44、55"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"4.3 文件与数据库一致性",
"4.4 LocalBackendStorageState 实现",
"5.3 支撑表",
"14.7 AC-55"
],
"modules": [
"api",
"worker",
"sqlite",
"local-data-root"
],
"implementation_boundary": "实现 LocalBackendStorageState、精确阈值、storage reservation、staging 流式校验、同卷原子改名、managed file、补偿队列、启动对账和物理删除后重测",
"parent_families": [
"TDD-WP0-FILE-001",
"TDD-WP0-STO-001",
"TDD-WP0-STO-002",
"TDD-WP0-STO-003"
],
"case_ids": [
"TDD-WP0-FILE-001-atomic-commit",
"TDD-WP0-STO-001-byte-thresholds",
"TDD-WP0-STO-002-equal-limit",
"TDD-WP0-STO-002-over-limit",
"TDD-WP0-STO-003-cleanup-remeasure",
"TDD-WP0-STO-003-full-matrix",
"TDD-WP0-STO-003-unavailable-matrix"
],
"first_red": [
{
"family_id": "TDD-WP0-FILE-001",
"assertion": "文件流、数据库事务或进程崩溃产生可读半文件、孤儿引用或计量漂移"
},
{
"family_id": "TDD-WP0-STO-001",
"assertion": "任一阈值使用模糊比例或边界错一字节"
},
{
"family_id": "TDD-WP0-STO-002",
"assertion": "写入预计量用 \u003e= 拒绝等号,或超限后仍有副作用"
},
{
"family_id": "TDD-WP0-STO-003",
"assertion": "full/unavailable 动作混淆或清理排队即减字节"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-FILE-001",
"assertion": "预检、staging 流式哈希/MIME、同卷原子改名、SQLite 提交、补偿队列和启动对账全覆盖;路径规范化拒绝 ..、符号链接逃逸和 manifest 外对象"
},
{
"family_id": "TDD-WP0-STO-001",
"assertion": "第 5.5 节七个精确字节值产生固定 notice/status"
},
{
"family_id": "TDD-WP0-STO-002",
"assertion": "\u003e 才拒绝;等于上限提交成功后 full;超限不创建任务、冻结、文件关系或上游调用"
},
{
"family_id": "TDD-WP0-STO-003",
"assertion": "full 允许 JSON 保存与客户端仅下载;unavailable 拒绝新增后端写;物理删除和重测前计量不变"
}
],
"task_green_gate": "写前只用 \u003e 拒绝,恰好 5 GB 写入成功后 full;超限零副作用;full/unavailable 动作不同;未物理删除前不减字节",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, local-data-root.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"UNIT",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:unit",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-FILE-001-atomic-commit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-001-byte-thresholds/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-002-equal-limit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-002-over-limit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-003-cleanup-remeasure/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-003-full-matrix/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-STO-003-unavailable-matrix/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP0-06",
"work_package": "WP-0",
"title": "公开客户端缓存",
"dependencies": {
"source_text": "TASK-WP0-02、TASK-WP0-04",
"task_ids": [
"TASK-WP0-02",
"TASK-WP0-04"
],
"work_packages": [
]
},
"requirements": [
"NFR-07"
],
"acceptance_criteria": [
"AC-46",
"AC-48"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.14"
],
"requirement_ac_sources": [
"NFR-07、17.14、AC-46、48"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.4 素材面板与公开缓存",
"10.6 三类资源隔离",
"12.1 本机安全边界"
],
"modules": [
"web",
"api",
"client-cache"
],
"implementation_boundary": "建立 150 MiB public allowlist LRU、Cache Storage/IndexedDB 元数据、写前淘汰和 Service Worker 路由边界",
"parent_families": [
"TDD-WP0-CACHE-001"
],
"case_ids": [
"TDD-WP0-CACHE-001-public-lru"
],
"first_red": [
{
"family_id": "TDD-WP0-CACHE-001",
"assertion": "应用缓存超过 157,286,400 字节或含私有/内部内容"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-CACHE-001",
"assertion": "LRU 在写前淘汰;只含 allowlist 公开资源;逐场景枚举 SW、Cache Storage、IndexedDB"
}
],
"task_green_gate": "逐场景枚举实际浏览器存储;internal/private/项目/提示词/未保存草稿均不进入持久缓存",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web, api, client-cache.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-CACHE-001-public-lru/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP0-07",
"work_package": "WP-0",
"title": "Supervisor、凭据和运行诊断",
"dependencies": {
"source_text": "TASK-WP0-01、TASK-WP0-04、TASK-WP0-05",
"task_ids": [
"TASK-WP0-01",
"TASK-WP0-04",
"TASK-WP0-05"
],
"work_packages": [
]
},
"requirements": [
"NFR-09",
"PRIV-01"
],
"acceptance_criteria": [
"AC-24",
"AC-41"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-09、AC-24、41",
"PRIV-01、AC-41"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.1 便携包布局",
"3.2 Supervisor 生命周期",
"3.3 离线配置命令",
"3.7 辅助系统界面契约",
"12.3 审计与敏感信息"
],
"modules": [
"supervisor",
"api",
"worker",
"windows-credential-manager"
],
"implementation_boundary": "实现单实例 mutex、固定端口检查、API/Worker 启停与有限重启、15 秒退出、Credential Manager 匿名管道注入、托盘状态、离线配置命令和脱敏诊断",
"parent_families": [
"TDD-WP0-SEC-001",
"TDD-WP0-SUP-001"
],
"case_ids": [
"TDD-WP0-SEC-001-credential-channel",
"TDD-WP0-SUP-001-lifecycle"
],
"first_red": [
{
"family_id": "TDD-WP0-SEC-001",
"assertion": "凭据进入参数、环境、文件、日志或错误"
},
{
"family_id": "TDD-WP0-SUP-001",
"assertion": "第二实例、端口占用、API/Worker 崩溃或退出留下残留进程"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-SEC-001",
"assertion": "Supervisor 通过继承匿名管道最小传递;API/Worker 分离;缺失、清除、重启和扫描全通过"
},
{
"family_id": "TDD-WP0-SUP-001",
"assertion": "mutex、固定端口、有限重启、degraded 状态、15 秒优雅退出和托盘允许动作符合 DevelopmentPlan"
}
],
"task_green_gate": "第二实例、端口占用、startup/api/worker degraded、凭据缺失/清除/重启和子进程残留均有确定行为;不动态换端口、不泄露凭据",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: supervisor, api, worker, windows-credential-manager.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"PKG-SEC",
"MANUAL"
],
"validation_commands": [
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-SEC-001-credential-channel/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-SUP-001-lifecycle/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "system-ui",
"role": "implementation",
"frames": {
"frame_id": "awt96",
"frame_name": "07B Windows 辅助系统界面",
"primary_task": "TASK-WP0-07",
"mapped_state_scope": "托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作"
},
"applicable_states": {
"page_id": "system-ui",
"actor_entry": "本机托盘/Supervisor,无产品角色",
"normal": "托盘、运行状态、打开 Dada、诊断、退出",
"empty_loading": "启动中;N/A 业务空态",
"failure_disabled": "启动失败、端口占用、API/Worker degraded,动作严格受限",
"conflict_capacity_special": "full/unavailable 只作脱敏告警;固定端口不动态切换"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/system-ui/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP0-08",
"work_package": "WP-0",
"title": "日志、轮转和不可写联动",
"dependencies": {
"source_text": "TASK-WP0-05、TASK-WP0-07",
"task_ids": [
"TASK-WP0-05",
"TASK-WP0-07"
],
"work_packages": [
]
},
"requirements": [
"NFR-09",
"PRIV-01",
"PRIV-02"
],
"acceptance_criteria": [
"AC-41",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"PRIV-01、02、NFR-09、AC-41、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"4.5 日志与数据库维护",
"12.3 审计与敏感信息"
],
"modules": [
"api",
"worker",
"supervisor",
"local-data-root"
],
"implementation_boundary": "建立 API/Worker/Supervisor JSONL 白名单日志、10 MiB/10 文件/30 天轮转、诊断复用脱敏器和日志不可写状态联动",
"parent_families": [
"TDD-WP0-LOG-001"
],
"case_ids": [
"TDD-WP0-LOG-001-rotation-redaction"
],
"first_red": [
{
"family_id": "TDD-WP0-LOG-001",
"assertion": "日志无限增长、含敏感数据或目录不可写后仍调用 AI"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-LOG-001",
"assertion": "10 MiB/10 文件/30 天轮转;白名单字段;写失败进入 unavailable 并阻断 AI"
}
],
"task_green_gate": "日志不含密钥、邮箱、提示词、图片、绝对路径或供应商原文;日志不可写进入 unavailable 并阻断 AI",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, supervisor, local-data-root.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"WRK",
"PKG-SEC"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:worker",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-LOG-001-rotation-redaction/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "system-ui",
"role": "implementation",
"frames": {
"frame_id": "awt96",
"frame_name": "07B Windows 辅助系统界面",
"primary_task": "TASK-WP0-07",
"mapped_state_scope": "托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作"
},
"applicable_states": {
"page_id": "system-ui",
"actor_entry": "本机托盘/Supervisor,无产品角色",
"normal": "托盘、运行状态、打开 Dada、诊断、退出",
"empty_loading": "启动中;N/A 业务空态",
"failure_disabled": "启动失败、端口占用、API/Worker degraded,动作严格受限",
"conflict_capacity_special": "full/unavailable 只作脱敏告警;固定端口不动态切换"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/system-ui/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP0-09",
"work_package": "WP-0",
"title": "隔离 CI 与便携包",
"dependencies": {
"source_text": "TASK-WP0-01 至 TASK-WP0-08",
"task_ids": [
"TASK-WP0-01",
"TASK-WP0-08"
],
"work_packages": [
]
},
"requirements": [
"NFR-01",
"NFR-09"
],
"acceptance_criteria": [
"AC-24",
"AC-41",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-01、09、AC-24、41、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.1 便携包布局",
"3.4 环境关系",
"14.1 测试层级",
"15 WP-0"
],
"modules": [
"release-ci",
"supervisor",
"api",
"worker",
"web"
],
"implementation_boundary": "配置 Windows Gitea Runner 隔离流水线;生成 Dada.exe、随包 Node、API/Worker、迁移、资源元数据、RELEASE.json 占位规则、START-HERE.txt、ZIP 和 SHA-256",
"parent_families": [
"TDD-WP0-PKG-001"
],
"case_ids": [
"TDD-WP0-PKG-001-portable-zip"
],
"first_red": [
{
"family_id": "TDD-WP0-PKG-001",
"assertion": "ZIP 缺组件、包含真实配置或动态换端口"
}
],
"minimal_green": [
{
"family_id": "TDD-WP0-PKG-001",
"assertion": "便携布局、SHA-256、START-HERE、RELEASE 记录和固定端口全部正确,制品零凭据"
}
],
"task_green_gate": "CI 不读真实凭据、LocalDataRoot 或 3.57 GB 归档;包固定 43121、零真实配置/路径;正式 RELEASE 记录在 WP-7 冻结",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-ci, supervisor, api, worker, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"PKG-SEC"
],
"validation_commands": [
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP0-PKG-001-portable-zip/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-0",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "system-ui",
"role": "implementation",
"frames": {
"frame_id": "awt96",
"frame_name": "07B Windows 辅助系统界面",
"primary_task": "TASK-WP0-07",
"mapped_state_scope": "托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作"
},
"applicable_states": {
"page_id": "system-ui",
"actor_entry": "本机托盘/Supervisor,无产品角色",
"normal": "托盘、运行状态、打开 Dada、诊断、退出",
"empty_loading": "启动中;N/A 业务空态",
"failure_disabled": "启动失败、端口占用、API/Worker degraded,动作严格受限",
"conflict_capacity_special": "full/unavailable 只作脱敏告警;固定端口不动态切换"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/system-ui/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-01",
"work_package": "WP-1",
"title": "认证数据与邀请注册事务",
"dependencies": {
"source_text": "WP-0",
"task_ids": [
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"AUTH-01",
"AUTH-02",
"AUTH-03",
"AUTH-04",
"NFR-04"
],
"acceptance_criteria": [
"AC-01",
"AC-02",
"AC-45"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"AUTH-01 至 04、AC-01",
"AUTH-01、02、AC-02",
"AUTH-01、NFR-04、AC-01、02、45"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CHALLENGE",
"FX-INVITE-EXPIRED",
"FX-INVITE-VALID"
],
"development_plan_sections": [
"5.2 十九个产品数据契约映射",
"6.2 API 分组",
"7.3 生成提交事务",
"9.1 邀请注册、验证码、会话和管理员"
],
"modules": [
"api",
"sqlite",
"resend-adapter",
"shared-contracts"
],
"implementation_boundary": "建立 UserProfile、邀请码、验证码挑战、普通账号初始点数/registration_grant、幂等键与事务;接入 Resend mock",
"parent_families": [
"TDD-WP1-AUTH-001",
"TDD-WP1-AUTH-002"
],
"case_ids": [
"TDD-WP1-AUTH-001-final-recheck-race",
"TDD-WP1-AUTH-001-valid-register",
"TDD-WP1-AUTH-002-invalid-invite"
],
"first_red": [
{
"family_id": "TDD-WP1-AUTH-001",
"assertion": "有效邀请注册任一步部分成功"
},
{
"family_id": "TDD-WP1-AUTH-002",
"assertion": "无效/过期/停用/耗尽邀请码仍发码或占用次数"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-AUTH-001",
"assertion": "发码前和建号前复核;账号、初始 10 点、registration_grant、告知版本和邀请码次数同事务一次提交"
},
{
"family_id": "TDD-WP1-AUTH-002",
"assertion": "不发码、不建号、不赠点,返回稳定原因且无副作用"
}
],
"task_green_gate": "发码前/建号前复核;有效注册一次提交;无效、过期、停用、耗尽邀请零副作用",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, resend-adapter, shared-contracts.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-001-final-recheck-race/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-001-valid-register/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-002-invalid-invite/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-invites",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "创建/停用/期限/次数/脱敏复制、空/骨架、名额满、过期/耗尽、请求失败和幂等/CAS 结果"
},
"applicable_states": {
"page_id": "admin-invites",
"actor_entry": "active super_admin",
"normal": "创建、停用、期限/次数、脱敏复制",
"empty_loading": "无邀请码;表格骨架",
"failure_disabled": "名额满、停用/过期/耗尽不可当可用;请求失败",
"conflict_capacity_special": "CAS/幂等结果;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-invites/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-02",
"work_package": "WP-1",
"title": "登录状态机、会话与登录画面",
"dependencies": {
"source_text": "TASK-WP1-01",
"task_ids": [
"TASK-WP1-01"
],
"work_packages": [
]
},
"requirements": [
"AUTH-01",
"AUTH-02",
"AUTH-04",
"AUTH-05",
"AUTH-06",
"AUTH-07"
],
"acceptance_criteria": [
"AC-22",
"AC-33",
"AC-49"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"AUTH-01、02、05、06、AC-33",
"AUTH-02、04、AC-33",
"AUTH-04 至 07、AC-22、33、49"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CHALLENGE"
],
"development_plan_sections": [
"6.2 API 分组",
"6.3 鉴权与会话",
"9.1 邀请注册、验证码、会话和管理员"
],
"modules": [
"api",
"sqlite",
"web"
],
"implementation_boundary": "实现注册/登录分离入口、未注册/已注册/已注销/suspended 状态、10 分钟验证码、60 秒重发、30 天 opaque session、CSRF 和退出/暂停/注销撤销;按 Z0pf8 落实普通用户登录布局、艺术带、管理员文字入口、固定本机提示和焦点",
"parent_families": [
"TDD-WP1-AUTH-003",
"TDD-WP1-AUTH-004"
],
"case_ids": [
"TDD-WP1-AUTH-003-entry-state-matrix",
"TDD-WP1-AUTH-004-challenge-guards",
"TDD-WP1-AUTH-004-session-revocation"
],
"first_red": [
{
"family_id": "TDD-WP1-AUTH-003",
"assertion": "注册/登录对未注册、已注册、已注销、suspended 邮箱静默切换流程"
},
{
"family_id": "TDD-WP1-AUTH-004",
"assertion": "验证码重用、过期仍有效或会话未及时撤销"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-AUTH-003",
"assertion": "六种状态严格按 PRD 分离入口;已注销邮箱只能新邀请重建且旧数据不恢复"
},
{
"family_id": "TDD-WP1-AUTH-004",
"assertion": "10 分钟一次性、60 秒重发、30 天会话;退出/暂停/注销/白名单移除立即撤销"
}
],
"task_green_gate": "六类身份状态不静默换流程;验证码不可复用;会话撤销即时生效;普通与管理员 audience 分离;登录页状态与布局证据齐全",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"API",
"E2E",
"DB"
],
"validation_commands": [
"pnpm test:api",
"pnpm test:e2e",
"pnpm test:integration",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-003-entry-state-matrix/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-004-challenge-guards/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUTH-004-session-revocation/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "user-auth",
"role": "implementation",
"frames": [
{
"frame_id": "Z0pf8",
"frame_name": "01A 普通用户登录",
"primary_task": "TASK-WP1-02",
"mapped_state_scope": "登录正常;字段初始空;发码/登录加载;验证码、Resend 和身份状态失败;管理员入口、固定本机提示、艺术带与焦点"
},
{
"frame_id": "DVPM8",
"frame_name": "01B 注册展开态",
"primary_task": "TASK-WP1-03",
"mapped_state_scope": "邀请与邮箱已验证摘要;资料和告知未完成/完成;注册中;名额、邀请、验证码和提交失败;主动作禁用"
}
],
"applicable_states": {
"page_id": "user-auth",
"actor_entry": "未登录普通入口",
"normal": "登录、分阶段注册、管理员文字入口、固定本机提示",
"empty_loading": "字段初始空;发码/验证/注册加载",
"failure_disabled": "Resend、验证码、邀请、名额、告知未完成;按钮禁用",
"conflict_capacity_special": "N/A:认证不消费存储容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/user-auth/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-03",
"work_package": "WP-1",
"title": "注册展开态、内测告知与账号名额",
"dependencies": {
"source_text": "TASK-WP1-01、TASK-WP1-02",
"task_ids": [
"TASK-WP1-01",
"TASK-WP1-02"
],
"work_packages": [
]
},
"requirements": [
"AUTH-01",
"AUTH-03",
"NFR-04",
"PRIV-04",
"PRIV-06"
],
"acceptance_criteria": [
"AC-01",
"AC-32",
"AC-41",
"AC-45",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"AUTH-01、NFR-04、AC-32、45",
"AUTH-03、PRIV-04、06、AC-01、41、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"6.3 鉴权与会话",
"9.1 邀请注册、验证码、会话和管理员",
"12.1 本机安全边界"
],
"modules": [
"api",
"sqlite",
"web"
],
"implementation_boundary": "实现版本化内测告知、必选确认、资料字段、active+suspended 普通账号 10 人上限、deleted 释放和 super_admin 不占名额;按 DVPM8 落实邀请/邮箱只读摘要、资料、告知和注册主动作",
"parent_families": [
"TDD-WP1-NOTICE-001",
"TDD-WP1-SLOT-001"
],
"case_ids": [
"TDD-WP1-NOTICE-001-registration-consent",
"TDD-WP1-SLOT-001-stage-limit"
],
"first_red": [
{
"family_id": "TDD-WP1-NOTICE-001",
"assertion": "未勾选、版本缺失或告知遗漏第三方/本机数据处理仍可注册"
},
{
"family_id": "TDD-WP1-SLOT-001",
"assertion": "suspended 不占名额、super_admin 占名额或第 11 人可注册"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-NOTICE-001",
"assertion": "告知含版本和生效日期,覆盖 AI 网关、Resend、高德、本机存储与无备份、管理员访问、DYN004、注销和 180 天规则;未同意不建号,成功时记录版本/时间"
},
{
"family_id": "TDD-WP1-SLOT-001",
"assertion": "active+suspended 普通账号最多 10deleted 释放;super_admin 不占且不用邀请码"
}
],
"task_green_gate": "告知覆盖 PRD 固定事项;未同意不建号;第 11 个普通账号被阻断;多个同权限 super_admin 合法;注册展开态状态与布局证据齐全",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"API",
"E2E",
"MANUAL",
"DB"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:api",
"pnpm test:e2e",
"pnpm test:integration",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-NOTICE-001-registration-consent/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-SLOT-001-stage-limit/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "user-auth",
"role": "implementation",
"frames": [
{
"frame_id": "Z0pf8",
"frame_name": "01A 普通用户登录",
"primary_task": "TASK-WP1-02",
"mapped_state_scope": "登录正常;字段初始空;发码/登录加载;验证码、Resend 和身份状态失败;管理员入口、固定本机提示、艺术带与焦点"
},
{
"frame_id": "DVPM8",
"frame_name": "01B 注册展开态",
"primary_task": "TASK-WP1-03",
"mapped_state_scope": "邀请与邮箱已验证摘要;资料和告知未完成/完成;注册中;名额、邀请、验证码和提交失败;主动作禁用"
}
],
"applicable_states": {
"page_id": "user-auth",
"actor_entry": "未登录普通入口",
"normal": "登录、分阶段注册、管理员文字入口、固定本机提示",
"empty_loading": "字段初始空;发码/验证/注册加载",
"failure_disabled": "Resend、验证码、邀请、名额、告知未完成;按钮禁用",
"conflict_capacity_special": "N/A:认证不消费存储容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/user-auth/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-04",
"work_package": "WP-1",
"title": "管理员白名单与安全配置生效",
"dependencies": {
"source_text": "WP-0、TASK-WP1-01、TASK-WP1-02",
"task_ids": [
"TASK-WP1-01",
"TASK-WP1-02"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"ADMIN-09",
"AUTH-07"
],
"acceptance_criteria": [
"AC-49",
"AC-50"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"AUTH-07、AC-49",
"AUTH-07、ADMIN-09、AC-49、50"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.3 离线配置命令",
"6.3 鉴权与会话",
"9.1 邀请注册、验证码、会话和管理员"
],
"modules": [
"supervisor",
"api",
"sqlite",
"windows-credential-manager",
"web-admin-auth"
],
"implementation_boundary": "实现 HMAC 管理员白名单、独立管理员认证、多管理员、安全配置 revision、原子应用/回滚、system 审计和离线恢复边界",
"parent_families": [
"TDD-WP1-ADM-001",
"TDD-WP1-CFG-001"
],
"case_ids": [
"TDD-WP1-ADM-001-admin-auth-boundary",
"TDD-WP1-CFG-001-secure-revision"
],
"first_red": [
{
"family_id": "TDD-WP1-ADM-001",
"assertion": "白名单外发码、普通账号提升或全部管理员停用后自助恢复"
},
{
"family_id": "TDD-WP1-CFG-001",
"assertion": "安全配置修订部分生效或泄露白名单/HMAC"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-ADM-001",
"assertion": "后台独立 audience;多管理员可用;恢复仅安全配置;部署人员无产品身份"
},
{
"family_id": "TDD-WP1-CFG-001",
"assertion": "完整验证后单一事务生效、撤销会话、system 审计和 revision 推进;失败整体回滚"
}
],
"task_green_gate": "非白名单发码前拒绝;普通账号不能原地提升;配置失败不部分生效;部署人员不成为产品角色或审计 actor",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: supervisor, api, sqlite, windows-credential-manager, web-admin-auth.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E",
"PKG-SEC"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-ADM-001-admin-auth-boundary/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-CFG-001-secure-revision/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-auth",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP1-04",
"mapped_state_scope": "白名单邮箱验证码、字段空/加载、非白名单、停用/移除、Resend 失败;独立 audience 与返回普通登录"
},
"applicable_states": {
"page_id": "admin-auth",
"actor_entry": "未登录后台入口",
"normal": "白名单邮箱验证码、独立 audience、返回普通登录",
"empty_loading": "字段空;发码/登录中",
"failure_disabled": "非白名单发码前阻断、停用/移除白名单、Resend 错误",
"conflict_capacity_special": "N/A:不显示普通创作或容量业务"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-auth/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-05",
"work_package": "WP-1",
"title": "注销、匿名保留与物理清理",
"dependencies": {
"source_text": "TASK-WP1-01 至 TASK-WP1-04",
"task_ids": [
"TASK-WP1-01",
"TASK-WP1-04"
],
"work_packages": [
]
},
"requirements": [
"AUTH-06"
],
"acceptance_criteria": [
"AC-22",
"AC-39",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.10",
"17.11"
],
"requirement_ac_sources": [
"AUTH-06、17.10、17.11、AC-22、39",
"AUTH-06、AC-22、39、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.2 项目、历史、失败草稿和回收站",
"12.2 账号注销"
],
"modules": [
"api",
"worker",
"sqlite",
"local-data-root",
"web"
],
"implementation_boundary": "实现注销事务、立即撤权与断链、邮箱释放、匿名事件、物理清理队列和最长 180 天保留",
"parent_families": [
"TDD-WP1-DEL-001",
"TDD-WP1-DEL-002"
],
"case_ids": [
"TDD-WP1-DEL-001-account-delete",
"TDD-WP1-DEL-002-anonymous-retention"
],
"first_red": [
{
"family_id": "TDD-WP1-DEL-001",
"assertion": "注销后仍可访问账号、项目、资源、坐标或会话"
},
{
"family_id": "TDD-WP1-DEL-002",
"assertion": "匿名事件可回溯或注销延长访问审计期限"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-DEL-001",
"assertion": "注销事务立即撤权和断链,物理内容异步清理,邮箱可作为全新账号重新注册"
},
{
"family_id": "TDD-WP1-DEL-002",
"assertion": "只保留允许字段和随机主体;匿名事件不晚于注销后 180 天;访问审计沿原 expires_at"
}
],
"task_green_gate": "旧数据不可恢复;原邮箱只能新邀请新建;匿名事件不可反查;注销不延长私有访问审计期限",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, local-data-root, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-DEL-001-account-delete/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-DEL-002-anonymous-retention/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "settings",
"role": "implementation",
"frames": {
"frame_id": "Ws5E0",
"frame_name": "05B 设置与本机数据",
"primary_task": "TASK-WP1-05",
"mapped_state_scope": "资料、本机数据、容量摘要和固定文案;加载/保存失败;full/unavailable;注销确认、处理中和返回登录"
},
"applicable_states": {
"page_id": "settings",
"actor_entry": "active 普通/内部预览账号",
"normal": "资料、本机数据、容量摘要、固定文案、注销",
"empty_loading": "资料/状态加载",
"failure_disabled": "保存失败;注销确认/处理中禁用重复提交",
"conflict_capacity_special": "full/unavailable 状态与允许动作;注销后返回登录"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/settings/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP1-06",
"work_package": "WP-1",
"title": "两类审计基础不可变性",
"dependencies": {
"source_text": "WP-0、TASK-WP1-04、TASK-WP1-05",
"task_ids": [
"TASK-WP1-04",
"TASK-WP1-05"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"ADMIN-05",
"ADMIN-09"
],
"acceptance_criteria": [
"AC-50"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.10",
"17.16"
],
"requirement_ac_sources": [
"ADMIN-05、09、17.10、17.16、AC-50"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"5.2 十九个产品数据契约映射",
"5.3 支撑表",
"9.6 运营后台与两类审计",
"12.3 审计与敏感信息"
],
"modules": [
"api",
"worker",
"sqlite"
],
"implementation_boundary": "建立 AdminOperationLog 与 PrivateContentAccessLog 表、append-only trigger、合法 retention/privacy purge 作用域和非敏感摘要",
"parent_families": [
"TDD-WP1-AUD-001"
],
"case_ids": [
"TDD-WP1-AUD-001-immutable-triggers"
],
"first_red": [
{
"family_id": "TDD-WP1-AUD-001",
"assertion": "普通连接可改删两类审计"
}
],
"minimal_green": [
{
"family_id": "TDD-WP1-AUD-001",
"assertion": "trigger 阻断 UPDATE/DELETE;仅保留期/隐私清理作用域可执行规定删除"
}
],
"task_green_gate": "普通连接不能改删;两类日志不混用;正文、图片、密钥和路径不进入审计",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"SQLite constraints, transactions, idempotency and side-effect assertions"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB"
],
"validation_commands": [
"pnpm test:integration",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP1-AUD-001-immutable-triggers/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-1",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP2-01",
"work_package": "WP-2",
"title": "项目、历史、失败草稿与空工作台",
"dependencies": {
"source_text": "WP-0、WP-1",
"task_ids": [
],
"work_packages": [
"WP-0",
"WP-1"
]
},
"requirements": [
"GEN-04",
"GEN-09",
"GEN-11",
"PROJECT-01",
"PROJECT-02",
"PROJECT-03"
],
"acceptance_criteria": [
"AC-03",
"AC-04",
"AC-06",
"AC-34",
"AC-43"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"PROJECT-01 至 03、GEN-04、11、AC-03、06、34",
"PROJECT-01、GEN-09、AC-04、43"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-PROJECT-ACTIVE-19",
"FX-PROJECT-EMPTY"
],
"development_plan_sections": [
"6.2 API 分组",
"9.2 项目、历史、失败草稿和回收站"
],
"modules": [
"api",
"sqlite",
"web"
],
"implementation_boundary": "实现新建项目、项目内追加、固定比例、20 active、10 成功图、默认命名/重命名、failed_empty 重试和批量入回收站;按 WbDYT 落实无项目工作台艺术带、生成表单和空任务区",
"parent_families": [
"TDD-WP2-PROJ-001",
"TDD-WP2-PROJ-005"
],
"case_ids": [
"TDD-WP2-PROJ-001-new-versus-continue",
"TDD-WP2-PROJ-005-failed-draft-retry"
],
"first_red": [
{
"family_id": "TDD-WP2-PROJ-001",
"assertion": "新建/继续生成/历史上限混淆项目数量或比例"
},
{
"family_id": "TDD-WP2-PROJ-005",
"assertion": "重试新建项目或成功项目混入 failed_empty 批量删除"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-PROJ-001",
"assertion": "每次“新建创作”新项目;继续生成只追加;比例固定;10 张历史阻断追加但不阻断新项目"
},
{
"family_id": "TDD-WP2-PROJ-005",
"assertion": "同一草稿每次重试只新增任务;仅无成功图草稿可批量入回收站"
}
],
"task_green_gate": "新建/追加/上限不混淆;重试只新建任务;有成功图项目不能进入 failed_empty 批量操作;艺术带仅在无项目工作台出现",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-001-new-versus-continue/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-005-failed-draft-retry/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "workspace",
"role": "implementation",
"frames": [
{
"frame_id": "WbDYT",
"frame_name": "02A 空工作台",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "无项目艺术带;生成表单、推荐模型、四比例与空任务;模型/项目加载;模型、点数、参考图和容量禁用"
},
{
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
}
],
"applicable_states": {
"page_id": "workspace",
"actor_entry": "active 普通/内部预览账号",
"normal": "生成表单、模型/点数/比例、最近项目",
"empty_loading": "无项目艺术带;模型/项目加载",
"failure_disabled": "服务/参考图/生成错误;模型、点数、单任务、历史/项目上限禁用",
"conflict_capacity_special": "model config 变化重确认;warning/critical 提示;full/unavailable 阻断新增"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/workspace/\u003cstate\u003e/"
},
{
"page_id": "projects",
"role": "implementation",
"frames": {
"frame_id": "zXyG9",
"frame_name": "03A 项目列表",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "active/trashed、筛选、多选 failed_empty;空/骨架;20 active、恢复/批量禁用;多标签和容量提示"
},
"applicable_states": {
"page_id": "projects",
"actor_entry": "active 普通/内部预览账号",
"normal": "active/trashed 列表、筛选、多选 failed_empty",
"empty_loading": "无项目/筛选空;稳定卡片骨架",
"failure_disabled": "列表失败保留旧数据;20 active、恢复/批量条件禁用",
"conflict_capacity_special": "多标签版本提示;删除排队不乐观减容量;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/projects/\u003cstate\u003e/"
},
{
"page_id": "project-detail",
"role": "implementation",
"frames": {
"frame_id": "v2Qbu",
"frame_name": "03B 项目详情",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "历史、固定比例、继续生成、编辑、原图/latest;无成功图/无成品;10 图上限、资源失败和容量状态"
},
"applicable_states": {
"page_id": "project-detail",
"actor_entry": "项目所有者",
"normal": "历史、固定比例、继续生成、编辑、原图/latest 下载",
"empty_loading": "无成功图草稿;历史/成品加载",
"failure_disabled": "10 图上限、当前底图不可删、无 latest、资源读取失败",
"conflict_capacity_special": "比例不可改;清理/容量状态不伪造资源可用性;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/project-detail/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-02",
"work_package": "WP-2",
"title": "自动保存与多标签冲突",
"dependencies": {
"source_text": "TASK-WP2-01",
"task_ids": [
"TASK-WP2-01"
],
"work_packages": [
]
},
"requirements": [
"EXPORT-05",
"EXPORT-06",
"PROJECT-04",
"PROJECT-05",
"PROJECT-06",
"PROJECT-07"
],
"acceptance_criteria": [
"AC-20",
"AC-35",
"AC-36"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.3"
],
"requirement_ac_sources": [
"PROJECT-04、05、EXPORT-06、AC-20、35",
"PROJECT-04、06、AC-20",
"PROJECT-04、17.3、AC-20",
"PROJECT-07、AC-36 P0-A 子集",
"PROJECT-07、EXPORT-05、AC-36 P0-A 子集"
],
"acceptance_scope_notes": [
"PROJECT-07、AC-36 P0-A 子集",
"PROJECT-07、EXPORT-05、AC-36 P0-A 子集"
],
"fixture_ids": [
"FX-PROJECT-CONFLICT"
],
"development_plan_sections": [
"7.5 项目保存并发",
"9.2 项目、历史、失败草稿和回收站"
],
"modules": [
"web",
"api",
"sqlite",
"shared-contracts"
],
"implementation_boundary": "实现 Dada Canvas Schema、1 秒 debounce、单请求在途、最新快照合并、If-Match CAS、dirty/saving/saved/failed/conflicted、离开守卫和一次冲突本地导出",
"parent_families": [
"TDD-WP2-PROJ-002",
"TDD-WP2-PROJ-004"
],
"case_ids": [
"TDD-WP2-PROJ-002-cas-success",
"TDD-WP2-PROJ-002-debounce",
"TDD-WP2-PROJ-002-save-failure-recovery",
"TDD-WP2-PROJ-004-conflict-export-once",
"TDD-WP2-PROJ-004-stale-tab"
],
"first_red": [
{
"family_id": "TDD-WP2-PROJ-002",
"assertion": "连续编辑并发保存、失败显示已保存或刷新恢复私有草稿"
},
{
"family_id": "TDD-WP2-PROJ-004",
"assertion": "旧标签覆盖、另存副本或多次冲突导出"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-PROJ-002",
"assertion": "1 秒 debounce、单请求在途、最新快照合并;失败重试;强制退出只恢复 saved,撤销栈为空"
},
{
"family_id": "TDD-WP2-PROJ-004",
"assertion": "CAS 返回 412;旧页只读;仅一次本地导出且不写 latest;刷新后端最新状态"
}
],
"task_green_gate": "旧标签不能覆盖或另存副本;冲突页只读且仅一次本地导出,不写 latest;刷新只恢复 saved",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web, api, sqlite, shared-contracts.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-002-cas-success/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-002-debounce/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-002-save-failure-recovery/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-004-conflict-export-once/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-004-stale-tab/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "projects",
"role": "implementation",
"frames": {
"frame_id": "zXyG9",
"frame_name": "03A 项目列表",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "active/trashed、筛选、多选 failed_empty;空/骨架;20 active、恢复/批量禁用;多标签和容量提示"
},
"applicable_states": {
"page_id": "projects",
"actor_entry": "active 普通/内部预览账号",
"normal": "active/trashed 列表、筛选、多选 failed_empty",
"empty_loading": "无项目/筛选空;稳定卡片骨架",
"failure_disabled": "列表失败保留旧数据;20 active、恢复/批量条件禁用",
"conflict_capacity_special": "多标签版本提示;删除排队不乐观减容量;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/projects/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-03",
"work_package": "WP-2",
"title": "回收站、恢复与 purge",
"dependencies": {
"source_text": "TASK-WP2-01、WP-0 文件清理",
"task_ids": [
"TASK-WP2-01"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"PROJECT-03",
"PROJECT-08"
],
"acceptance_criteria": [
"AC-21"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"PROJECT-03、08、AC-21"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-PROJECT-ACTIVE-20"
],
"development_plan_sections": [
"9.2 项目、历史、失败草稿和回收站",
"12.2 账号注销"
],
"modules": [
"api",
"worker",
"sqlite",
"local-data-root",
"web"
],
"implementation_boundary": "实现 trashed、精确 +720h purge_at、20 active 恢复限制、立即撤权和异步物理清理",
"parent_families": [
"TDD-WP2-PROJ-003"
],
"case_ids": [
"TDD-WP2-PROJ-003-trash-restore-purge"
],
"first_red": [
{
"family_id": "TDD-WP2-PROJ-003",
"assertion": "回收站计时、20 项目恢复或 purge 可恢复边界错误"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-PROJ-003",
"assertion": "purge_at 精确 +720 小时;满 20 保持 trashed;purged 立即不可访问并异步清理"
}
],
"task_green_gate": "满 20 时保持 trashedpurged 后立即不可读;删除排队不伪造容量下降",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, local-data-root, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-PROJ-003-trash-restore-purge/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "projects",
"role": "implementation",
"frames": {
"frame_id": "zXyG9",
"frame_name": "03A 项目列表",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "active/trashed、筛选、多选 failed_empty;空/骨架;20 active、恢复/批量禁用;多标签和容量提示"
},
"applicable_states": {
"page_id": "projects",
"actor_entry": "active 普通/内部预览账号",
"normal": "active/trashed 列表、筛选、多选 failed_empty",
"empty_loading": "无项目/筛选空;稳定卡片骨架",
"failure_disabled": "列表失败保留旧数据;20 active、恢复/批量条件禁用",
"conflict_capacity_special": "多标签版本提示;删除排队不乐观减容量;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/projects/\u003cstate\u003e/"
},
{
"page_id": "project-detail",
"role": "implementation",
"frames": {
"frame_id": "v2Qbu",
"frame_name": "03B 项目详情",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "历史、固定比例、继续生成、编辑、原图/latest;无成功图/无成品;10 图上限、资源失败和容量状态"
},
"applicable_states": {
"page_id": "project-detail",
"actor_entry": "项目所有者",
"normal": "历史、固定比例、继续生成、编辑、原图/latest 下载",
"empty_loading": "无成功图草稿;历史/成品加载",
"failure_disabled": "10 图上限、当前底图不可删、无 latest、资源读取失败",
"conflict_capacity_special": "比例不可改;清理/容量状态不伪造资源可用性;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/project-detail/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-04",
"work_package": "WP-2",
"title": "点数账户、流水与管理员调点",
"dependencies": {
"source_text": "WP-1、WP-0 SQLite",
"task_ids": [
],
"work_packages": [
"WP-0",
"WP-1"
]
},
"requirements": [
"ADMIN-01",
"ADMIN-09",
"CREDIT-01",
"CREDIT-02",
"CREDIT-03",
"CREDIT-04",
"CREDIT-05",
"CREDIT-06",
"GEN-09",
"GEN-10"
],
"acceptance_criteria": [
"AC-03",
"AC-04",
"AC-28",
"AC-29",
"AC-50"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"CREDIT-01 至 05、AC-03",
"CREDIT-03、05、GEN-09、10、AC-03、04、29",
"CREDIT-04、AC-28",
"CREDIT-05、06、ADMIN-01、09、AC-29、50"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-ACTOR-ADMIN-A",
"FX-CREDIT-ENOUGH",
"FX-CREDIT-INSUFFICIENT",
"FX-JOB-ACTIVE",
"FX-MODEL-VERIFIED"
],
"development_plan_sections": [
"7.3 生成提交事务",
"7.4 结算事务",
"9.6 运营后台与两类审计"
],
"modules": [
"api",
"sqlite",
"web-admin"
],
"implementation_boundary": "实现 available/reserved、reserve/commit/release、不可变 ledger、operation_key、余额不足和带原因的 admin adjustment",
"parent_families": [
"TDD-WP2-CRED-001",
"TDD-WP2-CRED-002"
],
"case_ids": [
"TDD-WP2-CRED-001-finalize-once",
"TDD-WP2-CRED-001-insufficient",
"TDD-WP2-CRED-001-reserve",
"TDD-WP2-CRED-002-admin-adjustment"
],
"first_red": [
{
"family_id": "TDD-WP2-CRED-001",
"assertion": "点数不足、重复结算或生成流程制造负数"
},
{
"family_id": "TDD-WP2-CRED-002",
"assertion": "管理员调点修改 reserved 或缺原因/审计"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-CRED-001",
"assertion": "不足不建任务/流水/上游;reserve/commit/release 各一次;生成流程 available 不为负"
},
{
"family_id": "TDD-WP2-CRED-002",
"assertion": "只改 available,可为负;原因、流水和 AdminOperationLog 同事务"
}
],
"task_green_gate": "生成流程 available 不为负;结算一次;调点只改 available、可为负,reserved 不变,流水和审计同事务",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web-admin.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-CRED-001-finalize-once/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-CRED-001-insufficient/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-CRED-001-reserve/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-CRED-002-admin-adjustment/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "credits",
"role": "implementation",
"frames": {
"frame_id": "YlKzE",
"frame_name": "05A 点数明细",
"primary_task": "TASK-WP2-04",
"mapped_state_scope": "available/reserved、流水和分页;无流水/加载;失败保留安全摘要;负 available 如实显示且无购买入口"
},
"applicable_states": {
"page_id": "credits",
"actor_entry": "active 普通/内部预览账号",
"normal": "available/reserved、流水、关联与时间",
"empty_loading": "无流水;分页加载",
"failure_disabled": "加载失败保留安全余额摘要",
"conflict_capacity_special": "负 available 如实显示;无购买/充值入口;页面操作不消费容量但仍继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/credits/\u003cstate\u003e/"
},
{
"page_id": "admin-users",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "脱敏列表/详情、暂停恢复/调点、空/筛选空/骨架、原因缺失和状态禁用、负 available"
},
"applicable_states": {
"page_id": "admin-users",
"actor_entry": "active super_admin",
"normal": "脱敏列表/详情、暂停恢复、调点",
"empty_loading": "无用户/筛选空;表格骨架",
"failure_disabled": "操作失败、原因缺失、状态前置禁用",
"conflict_capacity_special": "调点可使 available 为负但 reserved 不变;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-users/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-05",
"work_package": "WP-2",
"title": "生成提交、单任务、参考图与生成中工作台",
"dependencies": {
"source_text": "TASK-WP2-01、TASK-WP2-04、WP-0 存储",
"task_ids": [
"TASK-WP2-01",
"TASK-WP2-04"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"ADMIN-03",
"CREDIT-03",
"GEN-01",
"GEN-02",
"GEN-03",
"GEN-04",
"GEN-05",
"GEN-06",
"GEN-07",
"GEN-08",
"GEN-15",
"PROJECT-01",
"PROJECT-09"
],
"acceptance_criteria": [
"AC-03",
"AC-05",
"AC-29",
"AC-30",
"AC-34",
"AC-44",
"AC-48"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"CREDIT-03、GEN-07、AC-05、29",
"GEN-01 至 08、PROJECT-01、AC-03、34、44",
"GEN-05、PROJECT-09、AC-44、48",
"GEN-15、ADMIN-03、AC-30"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CREDIT-ENOUGH",
"FX-MODEL-VERIFIED",
"FX-REF-VALID"
],
"development_plan_sections": [
"6.2 API 分组",
"7.1 幂等规则",
"7.2 单任务约束",
"7.3 生成提交事务",
"9.2 项目、历史、失败草稿和回收站"
],
"modules": [
"api",
"sqlite",
"local-data-root",
"web",
"worker"
],
"implementation_boundary": "实现 multipart 提交、config/cost 复核、BEGIN IMMEDIATE、活动任务部分唯一索引、参考图内存态/流式提交/关系快照、幂等和 412 重确认;按 d99Lo 落实生成中工作台、当前任务、冻结点数、critical 容量条和禁用提交",
"parent_families": [
"TDD-WP2-GEN-001",
"TDD-WP2-GEN-003",
"TDD-WP2-REF-001"
],
"case_ids": [
"TDD-WP2-GEN-001-concurrent-reserve",
"TDD-WP2-GEN-001-submit-snapshot",
"TDD-WP2-GEN-003-stale-config",
"TDD-WP2-REF-001-reference-lifecycle"
],
"first_red": [
{
"family_id": "TDD-WP2-GEN-001",
"assertion": "并发提交创建两个任务、项目、参考关系或冻结"
},
{
"family_id": "TDD-WP2-GEN-003",
"assertion": "旧 model_config_version 静默按新成本或限制提交"
},
{
"family_id": "TDD-WP2-REF-001",
"assertion": "未提交参考图被持久化或重试覆盖旧关系"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-GEN-001",
"assertion": "BEGIN IMMEDIATE+部分唯一索引只保留一个 queued/running;后续返回当前任务"
},
{
"family_id": "TDD-WP2-GEN-003",
"assertion": "返回 412、最新摘要;不建任务、不上传引用、不冻结、不调用上游;重新确认后才提交"
},
{
"family_id": "TDD-WP2-REF-001",
"assertion": "提交前只在内存;每个任务保存独立关系快照;purged 后立即不可读并异步删除"
}
],
"task_green_gate": "同账号只建一个活动任务;第二提交返回当前任务且不建项目/关系/冻结;过期配置和无效参考图零持久副作用;生成中页面不显示假进度且提交动作按状态禁用",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, local-data-root, web, worker.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-GEN-001-concurrent-reserve/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-GEN-001-submit-snapshot/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-GEN-003-stale-config/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-REF-001-reference-lifecycle/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "workspace",
"role": "implementation",
"frames": [
{
"frame_id": "WbDYT",
"frame_name": "02A 空工作台",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "无项目艺术带;生成表单、推荐模型、四比例与空任务;模型/项目加载;模型、点数、参考图和容量禁用"
},
{
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
}
],
"applicable_states": {
"page_id": "workspace",
"actor_entry": "active 普通/内部预览账号",
"normal": "生成表单、模型/点数/比例、最近项目",
"empty_loading": "无项目艺术带;模型/项目加载",
"failure_disabled": "服务/参考图/生成错误;模型、点数、单任务、历史/项目上限禁用",
"conflict_capacity_special": "model config 变化重确认;warning/critical 提示;full/unavailable 阻断新增"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/workspace/\u003cstate\u003e/"
},
{
"page_id": "current-task",
"role": "implementation",
"frames": {
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
},
"applicable_states": {
"page_id": "current-task",
"actor_entry": "active 普通/内部预览账号",
"normal": "真实状态、结果入口",
"empty_loading": "无活动任务;queued/running 无假百分比",
"failure_disabled": "failed/rejected 与九类固定动作;第二任务禁用",
"conflict_capacity_special": "storage 错误按任务真相;pending_manual_review 不作为用户任务状态;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/current-task/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-06",
"work_package": "WP-2",
"title": "任务终态、九类错误与网关余额影响",
"dependencies": {
"source_text": "TASK-WP2-04、TASK-WP2-05WP-3 Adapter 接口 mock",
"task_ids": [
"TASK-WP2-04",
"TASK-WP2-05"
],
"work_packages": [
"WP-3"
]
},
"requirements": [
"CREDIT-03",
"GEN-05",
"GEN-06",
"GEN-07",
"GEN-08",
"GEN-09",
"GEN-10",
"GEN-11",
"GEN-13",
"GEN-14",
"GEN-15",
"GEN-16"
],
"acceptance_criteria": [
"AC-03",
"AC-04",
"AC-30",
"AC-40",
"AC-44",
"AC-51",
"AC-53"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.17",
"17.18"
],
"requirement_ac_sources": [
"GEN-05、16、17.18、AC-04、44、53",
"GEN-06、08、11、CREDIT-03、AC-03",
"GEN-07、16、17.18、AC-30、53",
"GEN-09、16、17.18、AC-04、53",
"GEN-10、16、17.18、AC-04、53",
"GEN-13、16、17.18、AC-40、53",
"GEN-14、15、17.17、AC-04、51",
"GEN-15、16、17.17、17.18、AC-40、51、53"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-GATEWAY-SYNC"
],
"development_plan_sections": [
"7.4 结算事务",
"8.5 九类错误统一路径",
"11.3 AI 网关余额"
],
"modules": [
"api",
"worker",
"sqlite",
"ai-adapter-contract",
"web"
],
"implementation_boundary": "实现成功/失败/rejected、输出落盘与一次结算、固定九类错误、用户动作、GatewayBalanceState model/account/unknown 影响和 pending_manual_review",
"parent_families": [
"TDD-WP2-BAL-001",
"TDD-WP2-ERR-001",
"TDD-WP2-GEN-002"
],
"case_ids": [
"TDD-WP2-BAL-001-balance-impact",
"TDD-WP2-ERR-001-gateway-balance",
"TDD-WP2-ERR-001-gateway-contract",
"TDD-WP2-ERR-001-model-disabled",
"TDD-WP2-ERR-001-reference-invalid",
"TDD-WP2-ERR-001-safety-rejected",
"TDD-WP2-ERR-001-unknown-non-retryable",
"TDD-WP2-ERR-001-unknown-retryable",
"TDD-WP2-ERR-001-upstream-failed",
"TDD-WP2-ERR-001-upstream-timeout",
"TDD-WP2-GEN-002-success"
],
"first_red": [
{
"family_id": "TDD-WP2-BAL-001",
"assertion": "模型/账户/未知余额影响改写配置或重复释放"
},
{
"family_id": "TDD-WP2-ERR-001",
"assertion": "九类错误被新增、归并、泄露原文或错误处理点数"
},
{
"family_id": "TDD-WP2-GEN-002",
"assertion": "成功/失败/拒绝与点数、项目历史或重试不一致"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-BAL-001",
"assertion": "按影响范围只改 runtime;只 release 一次;未确认恢复前不可恢复"
},
{
"family_id": "TDD-WP2-ERR-001",
"assertion": "三模型统一固定 category;提交前无任务,提交后只 release 一次;状态和用户动作符合第 9 节"
},
{
"family_id": "TDD-WP2-GEN-002",
"assertion": "成功一图并 commit;失败/rejected 无输出并 release;重试同项目新任务"
}
],
"task_green_gate": "reference_invalid 与 safety_rejected 分离;供应商原文不泄露;runtime 变化不回写 ModelConfig;用户点数只释放一次",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, ai-adapter-contract, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"UNIT",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:unit",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-BAL-001-balance-impact/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-gateway-balance/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-gateway-contract/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-model-disabled/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-reference-invalid/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-safety-rejected/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-unknown-non-retryable/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-unknown-retryable/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-upstream-failed/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-ERR-001-upstream-timeout/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-GEN-002-success/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "current-task",
"role": "implementation",
"frames": {
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
},
"applicable_states": {
"page_id": "current-task",
"actor_entry": "active 普通/内部预览账号",
"normal": "真实状态、结果入口",
"empty_loading": "无活动任务;queued/running 无假百分比",
"failure_disabled": "failed/rejected 与九类固定动作;第二任务禁用",
"conflict_capacity_special": "storage 错误按任务真相;pending_manual_review 不作为用户任务状态;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/current-task/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP2-07",
"work_package": "WP-2",
"title": "原图与 latest export 服务",
"dependencies": {
"source_text": "TASK-WP2-01、TASK-WP2-02、WP-0 存储",
"task_ids": [
"TASK-WP2-01",
"TASK-WP2-02"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"EXPORT-04",
"EXPORT-05",
"EXPORT-06"
],
"acceptance_criteria": [
"AC-23",
"AC-35",
"AC-38",
"AC-55"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"EXPORT-04、AC-23、35",
"EXPORT-04、AC-23、38 P0-A 子集",
"EXPORT-05、06、AC-35、55"
],
"acceptance_scope_notes": [
"EXPORT-04、AC-23、38 P0-A 子集"
],
"fixture_ids": [
],
"development_plan_sections": [
"6.2 API 分组",
"9.5 客户端导出与 latest exports"
],
"modules": [
"api",
"sqlite",
"local-data-root",
"web"
],
"implementation_boundary": "实现历史原图下载、latest JPG/PNG 资源关系、同 Blob 上传、后端失败矩阵和无导出成品空态",
"parent_families": [
"TDD-WP2-EXP-001",
"TDD-WP2-EXP-002"
],
"case_ids": [
"TDD-WP2-EXP-001-result-matrix",
"TDD-WP2-EXP-001-same-blob-success",
"TDD-WP2-EXP-002-empty-latest"
],
"first_red": [
{
"family_id": "TDD-WP2-EXP-001",
"assertion": "项目/成品保存失败撤回下载或覆盖旧 latest"
},
{
"family_id": "TDD-WP2-EXP-002",
"assertion": "从未导出项目自动生成默认成品"
}
],
"minimal_green": [
{
"family_id": "TDD-WP2-EXP-001",
"assertion": "同一次 Blob 用于下载和上传;下载可成功、latest 保持旧值;刷新只恢复 saved"
},
{
"family_id": "TDD-WP2-EXP-002",
"assertion": "显示“暂无导出成品”,只提供进入编辑导出和下载原图"
}
],
"task_green_gate": "客户端下载与后端保存结果独立;失败保留旧 latest;从未导出不自动合成;不承诺跨设备下载",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, local-data-root, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"API",
"E2E"
],
"validation_commands": [
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-EXP-001-result-matrix/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-EXP-001-same-blob-success/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP2-EXP-002-empty-latest/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-2",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "project-detail",
"role": "implementation",
"frames": {
"frame_id": "v2Qbu",
"frame_name": "03B 项目详情",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "历史、固定比例、继续生成、编辑、原图/latest;无成功图/无成品;10 图上限、资源失败和容量状态"
},
"applicable_states": {
"page_id": "project-detail",
"actor_entry": "项目所有者",
"normal": "历史、固定比例、继续生成、编辑、原图/latest 下载",
"empty_loading": "无成功图草稿;历史/成品加载",
"failure_disabled": "10 图上限、当前底图不可删、无 latest、资源读取失败",
"conflict_capacity_special": "比例不可改;清理/容量状态不伪造资源可用性;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/project-detail/\u003cstate\u003e/"
},
{
"page_id": "export",
"role": "implementation",
"frames": {
"frame_id": "i9upg7",
"frame_name": "04B 导出弹层",
"primary_task": "TASK-WP4-05",
"mapped_state_scope": "JPG/PNG、质量、尺寸;合成/持久化加载;未提交确认;四类失败结果;冲突一次下载和 full/unavailable"
},
"applicable_states": {
"page_id": "export",
"actor_entry": "编辑器内项目所有者",
"normal": "JPG/PNG、质量、尺寸、下载/latest 分结果",
"empty_loading": "合成/持久化加载;无业务空态",
"failure_disabled": "合成、下载、项目保存、latest 保存分别失败;无画布/冲突次数用尽禁用",
"conflict_capacity_special": "未提交确认;conflicted 仅一次本地导出;full/unavailable 后端失败不撤回下载"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/export/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP3-01",
"work_package": "WP-3",
"title": "ModelConfig 集合与原子替换",
"dependencies": {
"source_text": "WP-2",
"task_ids": [
],
"work_packages": [
"WP-2"
]
},
"requirements": [
"ADMIN-03",
"GEN-01",
"GEN-13",
"GEN-15"
],
"acceptance_criteria": [
"AC-30",
"AC-40"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.2"
],
"requirement_ac_sources": [
"ADMIN-03、17.2、AC-30",
"ADMIN-03、AC-30",
"GEN-01、ADMIN-03、17.2、AC-30",
"GEN-13、15、ADMIN-03、AC-30、40"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-MODEL-SEED",
"FX-MODEL-VERIFIED"
],
"development_plan_sections": [
"7.6 ModelConfig 原子配置与运行时推荐"
],
"modules": [
"api",
"sqlite",
"web-admin",
"shared-contracts"
],
"implementation_boundary": "实现三模型固定 seed、immutable config_version/config_set、恰好一个 enabled default、唯一正整数 priority、完整集合 CAS、替代默认错误和审计",
"parent_families": [
"TDD-WP3-MDL-001",
"TDD-WP3-MDL-002"
],
"case_ids": [
"TDD-WP3-MDL-001-seed-read",
"TDD-WP3-MDL-002-cas-conflict",
"TDD-WP3-MDL-002-contract-change",
"TDD-WP3-MDL-002-invalid-set",
"TDD-WP3-MDL-002-replace-default"
],
"first_red": [
{
"family_id": "TDD-WP3-MDL-001",
"assertion": "初始集合零/多默认、优先级非法或 runtime 假装 verified"
},
{
"family_id": "TDD-WP3-MDL-002",
"assertion": "停用默认、重复优先级或 CAS 冲突产生部分配置"
}
],
"minimal_green": [
{
"family_id": "TDD-WP3-MDL-001",
"assertion": "三模型固定 seed;一个 enabled defaultpriority 1/2/3contract unverified 时 runtime 不可用"
},
{
"family_id": "TDD-WP3-MDL-002",
"assertion": "完整三模型集合原子校验和切换;失败原集合、runtime 和审计结果符合协议"
}
],
"task_green_gate": "初始 1/2/3 优先级;缺失/非正/重复/零或多默认整批拒绝;切换无可见中间态;失败原集合不变",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web-admin, shared-contracts.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"UNIT",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:unit",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-001-seed-read/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-002-cas-conflict/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-002-contract-change/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-002-invalid-set/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-002-replace-default/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-3",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-models",
"role": "implementation",
"frames": {
"frame_id": "YVfVG",
"frame_name": "06B 模型配置",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "完整三模型集合、default/runtime/recommended;加载;空推荐;替代/priority 禁用;CAS 冲突和整套回滚"
},
"applicable_states": {
"page_id": "admin-models",
"actor_entry": "active super_admin",
"normal": "完整三模型集合、default/runtime/recommended 三层",
"empty_loading": "初始加载骨架;无 recommended 是合法状态",
"failure_disabled": "合法替代/priority 前置禁用;契约未验证/运行时不可用",
"conflict_capacity_special": "config_set CAS 冲突、完整集合原子回滚;仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-models/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP3-02",
"work_package": "WP-3",
"title": "独立 runtime 与推荐模型",
"dependencies": {
"source_text": "TASK-WP3-01、WP-2 余额状态",
"task_ids": [
"TASK-WP3-01"
],
"work_packages": [
"WP-2"
]
},
"requirements": [
"ADMIN-03",
"ADMIN-09",
"GEN-14",
"GEN-15"
],
"acceptance_criteria": [
"AC-30",
"AC-51"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.2"
],
"requirement_ac_sources": [
"GEN-14、15、ADMIN-09、AC-51",
"GEN-15、ADMIN-03、17.2、AC-30、51"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"7.6 ModelConfig 原子配置与运行时推荐",
"11.3 AI 网关余额"
],
"modules": [
"api",
"sqlite",
"web",
"web-admin"
],
"implementation_boundary": "实现 runtime reason/version、configured default/runtime/recommended 三层读取、空推荐、人工恢复和余额影响审计",
"parent_families": [
"TDD-WP3-BAL-001",
"TDD-WP3-MDL-003"
],
"case_ids": [
"TDD-WP3-BAL-001-confirmed-recovery",
"TDD-WP3-MDL-003-runtime-recommendation"
],
"first_red": [
{
"family_id": "TDD-WP3-BAL-001",
"assertion": "余额恢复自动执行或成本核对补扣用户点数"
},
{
"family_id": "TDD-WP3-MDL-003",
"assertion": "runtime 降级改变 enabled/default/priority 或推荐为空时写回配置"
}
],
"minimal_green": [
{
"family_id": "TDD-WP3-BAL-001",
"assertion": "model/account/unknown 影响正确;人工确认恢复并审计;成本核对不改任务终态或用户点数"
},
{
"family_id": "TDD-WP3-MDL-003",
"assertion": "配置字段不变;推荐只从可用候选按 priority 派生,可为 null"
}
],
"task_green_gate": "降级/恢复不改 enabled/default/priority;推荐只从可用候选派生;成本核对不补扣用户点数",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web, web-admin.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"WRK",
"E2E",
"UNIT",
"API"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm test:unit",
"pnpm test:api",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-BAL-001-confirmed-recovery/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-MDL-003-runtime-recommendation/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-3",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-models",
"role": "implementation",
"frames": {
"frame_id": "YVfVG",
"frame_name": "06B 模型配置",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "完整三模型集合、default/runtime/recommended;加载;空推荐;替代/priority 禁用;CAS 冲突和整套回滚"
},
"applicable_states": {
"page_id": "admin-models",
"actor_entry": "active super_admin",
"normal": "完整三模型集合、default/runtime/recommended 三层",
"empty_loading": "初始加载骨架;无 recommended 是合法状态",
"failure_disabled": "合法替代/priority 前置禁用;契约未验证/运行时不可用",
"conflict_capacity_special": "config_set CAS 冲突、完整集合原子回滚;仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-models/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP3-03",
"work_package": "WP-3",
"title": "三个独立 Adapter 与契约证据",
"dependencies": {
"source_text": "TASK-WP3-01、WP-2 Generation 接口",
"task_ids": [
"TASK-WP3-01"
],
"work_packages": [
"WP-2"
]
},
"requirements": [
"ADMIN-03",
"GEN-01",
"GEN-02",
"GEN-05",
"GEN-06",
"GEN-13",
"GEN-15",
"GEN-16"
],
"acceptance_criteria": [
"AC-30",
"AC-40"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"GEN-01、02、05、06、13、16、AC-40",
"GEN-13、15、ADMIN-03、AC-30、40"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"8.2 固定 Adapter 接口",
"8.3 契约验证证据",
"8.5 九类错误统一路径"
],
"modules": [
"worker",
"ai-adapter-gemini-flash",
"ai-adapter-gemini-pro",
"ai-adapter-gpt-image",
"shared-contracts"
],
"implementation_boundary": "分别实现三个 Adapter、纯文字/参考图/四比例、同步/异步、响应、一图、错误映射;配置字段变化令对应模型 unverified;提供 mock 和受控真实验证",
"parent_families": [
"TDD-WP3-ADP-001",
"TDD-WP3-ADP-002"
],
"case_ids": [
"TDD-WP3-ADP-001-per-model-contract",
"TDD-WP3-ADP-002-invalidate-revalidate"
],
"first_red": [
{
"family_id": "TDD-WP3-ADP-001",
"assertion": "一个模型 fixture 被复用于另两个模型或静默接受多图"
},
{
"family_id": "TDD-WP3-ADP-002",
"assertion": "契约字段变化后仍为 verified"
}
],
"minimal_green": [
{
"family_id": "TDD-WP3-ADP-001",
"assertion": "三个独立 Adapter 分别验证纯文字、参考图、四比例、同步/异步、响应和一图约束"
},
{
"family_id": "TDD-WP3-ADP-002",
"assertion": "端点、字段、参考图、响应、异步查询或错误协议任一变化立即 unverified,完整重验后才恢复"
}
],
"task_green_gate": "三模型 fixture/证据不得共用;完整重验前不可恢复 verified;真实证据未齐时任务保持 externally_blocked",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: worker, ai-adapter-gemini-flash, ai-adapter-gemini-pro, ai-adapter-gpt-image, shared-contracts.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"SQLite constraints, transactions, idempotency and side-effect assertions"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"EXT-MOCK",
"EXT-REAL",
"DB"
],
"validation_commands": [
"pnpm test:all",
"pnpm test:integration",
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gemini-3.1-flash-image-preview",
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gemini-3-pro-image-preview",
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gpt-image-2",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-ADP-001-per-model-contract/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-ADP-002-invalidate-revalidate/"
],
"automation": [
"automated",
"controlled_real"
],
"release_gate": [
"work_package:WP-3",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP3-04",
"work_package": "WP-3",
"title": "Worker 租约、崩溃恢复与结算接线",
"dependencies": {
"source_text": "TASK-WP3-03、TASK-WP2-06",
"task_ids": [
"TASK-WP2-06",
"TASK-WP3-03"
],
"work_packages": [
]
},
"requirements": [
"CREDIT-03",
"GEN-08",
"GEN-09"
],
"acceptance_criteria": [
"AC-04",
"AC-51"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"GEN-08、09、CREDIT-03、AC-04、51"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-GATEWAY-ASYNC",
"FX-GATEWAY-UNKNOWN"
],
"development_plan_sections": [
"8.1 持久队列",
"8.4 崩溃恢复"
],
"modules": [
"worker",
"sqlite",
"api"
],
"implementation_boundary": "实现领取、租约、心跳、poll、崩溃恢复、无安全引用的 unknown_retryable、一次 release 和人工成本核对",
"parent_families": [
"TDD-WP3-WRK-001"
],
"case_ids": [
"TDD-WP3-WRK-001-recovery"
],
"first_red": [
{
"family_id": "TDD-WP3-WRK-001",
"assertion": "Worker 崩溃后重新 submit、重复结算或丢任务"
}
],
"minimal_green": [
{
"family_id": "TDD-WP3-WRK-001",
"assertion": "租约/心跳;有引用只 poll;无安全引用则 unknown_retryable+release+pending_manual_review"
}
],
"task_green_gate": "有上游引用只 poll、不重新 submit;未知结果终止用户任务且不双结算;Worker degraded 禁止新任务",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: worker, sqlite, api.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"SQLite constraints, transactions, idempotency and side-effect assertions"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"WRK"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:worker",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP3-WRK-001-recovery/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-3",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "current-task",
"role": "implementation",
"frames": {
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
},
"applicable_states": {
"page_id": "current-task",
"actor_entry": "active 普通/内部预览账号",
"normal": "真实状态、结果入口",
"empty_loading": "无活动任务;queued/running 无假百分比",
"failure_disabled": "failed/rejected 与九类固定动作;第二任务禁用",
"conflict_capacity_special": "storage 错误按任务真相;pending_manual_review 不作为用户任务状态;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/current-task/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-01",
"work_package": "WP-4",
"title": "编辑器壳、Canvas Schema 与底图",
"dependencies": {
"source_text": "WP-2;使用 WP-5 稳定 fixture",
"task_ids": [
],
"work_packages": [
"WP-2",
"WP-5"
]
},
"requirements": [
"EDITOR-01",
"EDITOR-02",
"EDITOR-03",
"EXPORT-03",
"GEN-12",
"PROJECT-04"
],
"acceptance_criteria": [
"AC-07",
"AC-20",
"AC-23"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"EDITOR-01 至 03、PROJECT-04、EXPORT-03、AC-07、20、23",
"GEN-12、EDITOR-01、PROJECT-04、AC-07"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.3 画布状态与渲染",
"13.1 P0-A 性能预算",
"13.2 视觉一致性"
],
"modules": [
"web-editor",
"canvas-schema",
"api"
],
"implementation_boundary": "按 UIDesign/低保真实现三栏编辑器、顶部/底部状态、Fabric 转换边界、底图填充/适配/裁剪/调色/滤镜/恢复原图和换底图",
"parent_families": [
"TDD-WP4-BG-001",
"TDD-WP4-BG-002"
],
"case_ids": [
"TDD-WP4-BG-001-switch-background",
"TDD-WP4-BG-002-processing-controls"
],
"first_red": [
{
"family_id": "TDD-WP4-BG-001",
"assertion": "换底图丢覆盖层、保留旧调色或色卡不刷新"
},
{
"family_id": "TDD-WP4-BG-002",
"assertion": "填充/适配/裁剪/缩放/定位或亮度、对比度、饱和度、色温、锐度、预设滤镜、恢复原图未保存、不可撤销或未进入导出"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-BG-001",
"assertion": "覆盖层位置/尺寸保留;底图参数重置;色卡重提;一次撤销和保存"
},
{
"family_id": "TDD-WP4-BG-002",
"assertion": "每项参数可预览、提交、撤销、自动保存并在重开与导出中一致;恢复原图只重置底图处理,不改变覆盖元素"
}
],
"task_green_gate": "底图参数可预览、提交、撤销、保存、重开和导出一致;换图保留覆盖层、重置底图处理并刷新色卡",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, canvas-schema, api.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-BG-001-switch-background/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-BG-002-processing-controls/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-02",
"work_package": "WP-4",
"title": "画布选择、变换与普通贴纸",
"dependencies": {
"source_text": "TASK-WP4-01",
"task_ids": [
"TASK-WP4-01"
],
"work_packages": [
]
},
"requirements": [
"EDITOR-04",
"EDITOR-05",
"EDITOR-06",
"EDITOR-07",
"EDITOR-08",
"EDITOR-09",
"PROJECT-04"
],
"acceptance_criteria": [
"AC-13",
"AC-27"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.5"
],
"requirement_ac_sources": [
"EDITOR-04 至 09、17.5、AC-27",
"EDITOR-04 至 09、PROJECT-04、AC-13、27"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CANVAS-50"
],
"development_plan_sections": [
"9.3 画布状态与渲染"
],
"modules": [
"web-editor",
"canvas-schema"
],
"implementation_boundary": "实现循环选择、长按候选、多选/框选、移动/缩放/旋转/翻转/透明度/复制/层级/吸附、撤销重做和 50 元素双端限制",
"parent_families": [
"TDD-WP4-CAN-001",
"TDD-WP4-STK-001"
],
"case_ids": [
"TDD-WP4-CAN-001-fifty-elements",
"TDD-WP4-STK-001-transform-sticker"
],
"first_red": [
{
"family_id": "TDD-WP4-CAN-001",
"assertion": "选择循环、多选、层级、吸附或第 51 元素错误"
},
{
"family_id": "TDD-WP4-STK-001",
"assertion": "普通贴纸变换不进入保存/撤销/导出"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-CAN-001",
"assertion": "50 元素可编辑保存导出;第 51 个阻断;无图层面板/隐藏/锁定/编组"
},
{
"family_id": "TDD-WP4-STK-001",
"assertion": "移动、缩放、旋转、翻转、透明度、复制、层级和多选一致"
}
],
"task_green_gate": "50 元素可编辑保存导出,第 51 个被阻断;无图层面板、隐藏、锁定、编组;动态 UI 不改变工具尺寸",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, canvas-schema.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-CAN-001-fifty-elements/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-STK-001-transform-sticker/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-03",
"work_package": "WP-4",
"title": "文字模板、字体与属性",
"dependencies": {
"source_text": "TASK-WP4-01WP-5 模板/字体 fixture",
"task_ids": [
"TASK-WP4-01"
],
"work_packages": [
"WP-5"
]
},
"requirements": [
"NFR-02",
"PROJECT-04",
"TEXT-01",
"TEXT-02",
"TEXT-03",
"TEXT-04",
"TEXT-05",
"TEXT-06",
"TEXT-07",
"TEXT-08",
"TEXT-09",
"TEXT-10",
"TEXT-11",
"TEXT-12",
"TEXT-13",
"TEXT-14"
],
"acceptance_criteria": [
"AC-09",
"AC-10",
"AC-11",
"AC-12",
"AC-32"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.6"
],
"requirement_ac_sources": [
"TEXT-01 至 06、PROJECT-04、AC-09、10",
"TEXT-01、17.6、AC-09、32",
"TEXT-07 至 14、NFR-02、AC-11、12"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.3 画布状态与渲染",
"9.4 素材面板与公开缓存"
],
"modules": [
"web-editor",
"asset-renderer",
"font-loader"
],
"implementation_boundary": "实现必须先选模板、四类/显示名搜索/catalog 顺序/账号最近使用、多行内容、模板切换、FontFace ready、字号/缩放、填充/描边/背景/对齐/行距/字距和一次提交撤销",
"parent_families": [
"TDD-WP4-TXT-001",
"TDD-WP4-TXT-002",
"TDD-WP4-TXT-003"
],
"case_ids": [
"TDD-WP4-TXT-001-multiline-template-switch",
"TDD-WP4-TXT-002-font-metrics-ranges",
"TDD-WP4-TXT-003-catalog-search-recent"
],
"first_red": [
{
"family_id": "TDD-WP4-TXT-001",
"assertion": "多行丢换行、空内容提交或切模板改变变换"
},
{
"family_id": "TDD-WP4-TXT-002",
"assertion": "字体静默回退、字号与控制柄不同步、文字裁切、范围步长错误或背景透明度影响文字"
},
{
"family_id": "TDD-WP4-TXT-003",
"assertion": "未选模板即可添加普通文字,或模板分类、显示名称搜索、catalog 顺序、账号最近使用漂移"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-TXT-001",
"assertion": "内容/换行持久;模板切换重置默认样式但保留位置/旋转/整体尺寸,可撤销"
},
{
"family_id": "TDD-WP4-TXT-002",
"assertion": "真实归档字体;字号与缩放同步且内容重新测量不裁切;行距/字距/描边等精确范围;完成为一次撤销;重新打开和导出一致"
},
{
"family_id": "TDD-WP4-TXT-003",
"assertion": "只能从模板添加;四类、显示名称搜索、稳定顺序和账号级最近使用符合 PRD;普通贴纸不复用该搜索"
}
],
"task_green_gate": "文本/换行/变换按规则保留;真实字体缺失使模板 unavailable;不提供普通文字或普通贴纸关键词搜索;不静默回退",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, asset-renderer, font-loader.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-TXT-001-multiline-template-switch/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-TXT-002-font-metrics-ranges/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-TXT-003-catalog-search-recent/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-04",
"work_package": "WP-4",
"title": "色卡与动态贴纸 provider",
"dependencies": {
"source_text": "TASK-WP4-01WP-5 声明式资源",
"task_ids": [
"TASK-WP4-01"
],
"work_packages": [
"WP-5"
]
},
"requirements": [
"COL-01",
"COL-02",
"COL-03",
"COL-04",
"COL-05",
"DYN-01",
"DYN-02",
"DYN-03",
"DYN-04",
"DYN-05",
"DYN-06",
"DYN-07",
"DYN-08",
"DYN-09",
"PRIV-03"
],
"acceptance_criteria": [
"AC-14",
"AC-15",
"AC-16",
"AC-17",
"AC-18",
"AC-19",
"AC-47"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"COL-01 至 05、AC-15 P0-A 子集、16",
"DYN-01 至 03、AC-14",
"DYN-04、PRIV-03、AC-17、47",
"DYN-05 至 09、AC-18、19"
],
"acceptance_scope_notes": [
"COL-01 至 05、AC-15 P0-A 子集、16"
],
"fixture_ids": [
],
"development_plan_sections": [
"9.3 画布状态与渲染",
"11.2 高德"
],
"modules": [
"web-editor",
"palette-provider",
"dynamic-provider",
"amap-adapter"
],
"implementation_boundary": "实现 mmcq-v1 确定五色、四个色卡 renderer、时间/地点/身份 provider、DYN004 先确认后定位、坐标保存/清理、DYN012 FONT081 标记",
"parent_families": [
"TDD-WP4-COL-001",
"TDD-WP4-DYN-001",
"TDD-WP4-DYN-002",
"TDD-WP4-DYN-003"
],
"case_ids": [
"TDD-WP4-COL-001-deterministic-palette",
"TDD-WP4-DYN-001-fixed-time",
"TDD-WP4-DYN-002-location-consent",
"TDD-WP4-DYN-003-identity-font"
],
"first_red": [
{
"family_id": "TDD-WP4-COL-001",
"assertion": "色卡随机、读取处理后底图或额外上传图片"
},
{
"family_id": "TDD-WP4-DYN-001",
"assertion": "时间贴纸重开后变成新时间"
},
{
"family_id": "TDD-WP4-DYN-002",
"assertion": "DYN004 提示前调用定位、拒绝后插入或删除后留坐标"
},
{
"family_id": "TDD-WP4-DYN-003",
"assertion": "身份贴纸重复 @@、覆盖修改账号或 DYN012 静默换字体"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-COL-001",
"assertion": "同图 mmcq-v1 五色确定;裁剪/调色/滤镜不刷新;换底图刷新;网络上传为 0"
},
{
"family_id": "TDD-WP4-DYN-001",
"assertion": "使用插入/确认值并持久化,导出静态不可点击内容"
},
{
"family_id": "TDD-WP4-DYN-002",
"assertion": "同意后才定位并保存坐标;拒绝调用为 0;手动地点回退;删除/注销清理"
},
{
"family_id": "TDD-WP4-DYN-003",
"assertion": "前缀一个;实例覆盖独立;DYN012 固定 FONT081 且证据标记替代"
}
],
"task_green_gate": "色卡只读原始底图且网络上传为 0;时间值重开不漂移;拒绝定位调用为 0;身份前缀一个 @;DYN012 不静默换字体",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, palette-provider, dynamic-provider, amap-adapter.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF",
"MANUAL"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-COL-001-deterministic-palette/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-DYN-001-fixed-time/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-DYN-002-location-consent/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-DYN-003-identity-font/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-05",
"work_package": "WP-4",
"title": "客户端导出与结果弹层",
"dependencies": {
"source_text": "TASK-WP4-01 至 TASK-WP4-04、TASK-WP2-07",
"task_ids": [
"TASK-WP2-07",
"TASK-WP4-01",
"TASK-WP4-04"
],
"work_packages": [
]
},
"requirements": [
"EXPORT-01",
"EXPORT-02",
"EXPORT-03",
"PROJECT-04",
"PROJECT-06"
],
"acceptance_criteria": [
"AC-23"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"EXPORT-01 至 03、AC-23",
"EXPORT-03、AC-23",
"PROJECT-04、06、EXPORT-03、AC-23"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CANVAS-RATIOS"
],
"development_plan_sections": [
"9.5 客户端导出与 latest exports"
],
"modules": [
"web-editor",
"export-compositor",
"api",
"local-data-root"
],
"implementation_boundary": "实现四比例真实像素、sRGB、JPG 80-100/默认 92、PNG 无损、无水印、未提交修改确认、同一 Blob 下载/上传和四结果组合 UI",
"parent_families": [
"TDD-WP4-EXP-001"
],
"case_ids": [
"TDD-WP4-EXP-001-cancel-pending-edit",
"TDD-WP4-EXP-001-confirm-pending-edit",
"TDD-WP4-EXP-001-format-ratio"
],
"first_red": [
{
"family_id": "TDD-WP4-EXP-001",
"assertion": "四比例像素、JPG/PNG、未提交修改或同 Blob 规则错误"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-EXP-001",
"assertion": "精确像素、sRGB、无水印、PNG 无损、JPG 80-100 默认 92;未提交文字或样式经确认后,提交形成且仅形成一次撤销记录并进入正常自动保存,再用提交后的同一画布状态合成;真正的导出动作不额外创建撤销记录"
}
],
"task_green_gate": "确认未提交修改只形成一次撤销并进入自动保存;导出本身不额外建撤销;后端失败不撤回已成功下载",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, export-compositor, api, local-data-root.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-EXP-001-cancel-pending-edit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-EXP-001-confirm-pending-edit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-EXP-001-format-ratio/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
},
{
"page_id": "export",
"role": "implementation",
"frames": {
"frame_id": "i9upg7",
"frame_name": "04B 导出弹层",
"primary_task": "TASK-WP4-05",
"mapped_state_scope": "JPG/PNG、质量、尺寸;合成/持久化加载;未提交确认;四类失败结果;冲突一次下载和 full/unavailable"
},
"applicable_states": {
"page_id": "export",
"actor_entry": "编辑器内项目所有者",
"normal": "JPG/PNG、质量、尺寸、下载/latest 分结果",
"empty_loading": "合成/持久化加载;无业务空态",
"failure_disabled": "合成、下载、项目保存、latest 保存分别失败;无画布/冲突次数用尽禁用",
"conflict_capacity_special": "未提交确认;conflicted 仅一次本地导出;full/unavailable 后端失败不撤回下载"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/export/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-06",
"work_package": "WP-4",
"title": "键盘、焦点与语义可访问性",
"dependencies": {
"source_text": "TASK-WP4-01 至 TASK-WP4-05",
"task_ids": [
"TASK-WP4-01",
"TASK-WP4-05"
],
"work_packages": [
]
},
"requirements": [
"NFR-06"
],
"acceptance_criteria": [
"AC-32"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-06、AC-32"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"13.3 可访问性基础"
],
"modules": [
"web",
"web-editor"
],
"implementation_boundary": "落实 skip link、焦点顺序、ARIA/live region、弹层焦点/返回、画布外等价控件、200% 缩放和 axe",
"parent_families": [
"TDD-WP4-A11Y-001"
],
"case_ids": [
"TDD-WP4-A11Y-001-keyboard-focus"
],
"first_red": [
{
"family_id": "TDD-WP4-A11Y-001",
"assertion": "关键动作不可键盘到达、焦点逃逸或状态只靠颜色"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-A11Y-001",
"assertion": "焦点顺序、ARIA、live region、弹层返回、等价画布工具、axe critical/serious 为 0"
}
],
"task_green_gate": "axe critical/serious 为 0;状态不只靠颜色;异步更新不抢焦点;最长文案、弹层和主动作可达",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web, web-editor.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"E2E",
"VIS-PERF"
],
"validation_commands": [
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-A11Y-001-keyboard-focus/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP4-07",
"work_package": "WP-4",
"title": "视觉与性能预算",
"dependencies": {
"source_text": "TASK-WP4-01 至 TASK-WP4-06;最终素材依赖 WP-5",
"task_ids": [
"TASK-WP4-01",
"TASK-WP4-06"
],
"work_packages": [
"WP-5"
]
},
"requirements": [
"NFR-02",
"NFR-03"
],
"acceptance_criteria": [
"AC-19",
"AC-23",
"AC-27",
"AC-32"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-02、AC-19、23、32",
"NFR-03、AC-27、32"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-CANVAS-50"
],
"development_plan_sections": [
"13.1 P0-A 性能预算",
"13.2 视觉一致性"
],
"modules": [
"web-editor",
"test-visual-performance"
],
"implementation_boundary": "建立固定 Canvas/字体/动态值、Chrome/Edge 截图 diff、50 元素交互、自动保存、编辑器打开、导出、内存和 DOM 性能 harness",
"parent_families": [
"TDD-WP4-PERF-001",
"TDD-WP4-VIS-001"
],
"case_ids": [
"TDD-WP4-PERF-001-budget",
"TDD-WP4-VIS-001-browser-diff"
],
"first_red": [
{
"family_id": "TDD-WP4-PERF-001",
"assertion": "50 元素、自动保存、资源面板或导出超过预算"
},
{
"family_id": "TDD-WP4-VIS-001",
"assertion": "Chrome/Edge 白名单结构或导出漂移"
}
],
"minimal_green": [
{
"family_id": "TDD-WP4-PERF-001",
"assertion": "第 10.2 节全部预算通过,失败不破坏项目或 latest export"
},
{
"family_id": "TDD-WP4-VIS-001",
"assertion": "固定环境按第 10 节阈值比较;已知替代项人工复核"
}
],
"task_green_gate": "边界偏差、显著像素和全部性能预算符合 tdd;已知替代人工复核;不得通过放宽超时、减元素或降尺寸掩盖失败",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-editor, test-visual-performance.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"VIS-PERF",
"MANUAL"
],
"validation_commands": [
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-PERF-001-budget/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP4-VIS-001-browser-diff/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-4",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "editor",
"role": "implementation",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP5-01",
"work_package": "WP-5",
"title": "只读素材编译器",
"dependencies": {
"source_text": "WP-0",
"task_ids": [
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"COL-01",
"COL-02",
"COL-03",
"COL-04",
"COL-05",
"DYN-01",
"DYN-02",
"DYN-03",
"DYN-04",
"DYN-05",
"DYN-06",
"DYN-07",
"DYN-08",
"DYN-09",
"STATIC-01",
"STATIC-02",
"STATIC-03",
"STATIC-04",
"TEXT-01",
"TEXT-02",
"TEXT-03",
"TEXT-04",
"TEXT-05",
"TEXT-06",
"TEXT-07",
"TEXT-08",
"TEXT-09",
"TEXT-10",
"TEXT-11",
"TEXT-12",
"TEXT-13",
"TEXT-14"
],
"acceptance_criteria": [
"AC-32",
"AC-42"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"TEXT-01 至 TEXT-14、COL-01 至 COL-05、DYN-01 至 DYN-09、STATIC-01 至 STATIC-04、AC-32、42"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"10.1 唯一输入",
"10.3 复杂资源包"
],
"modules": [
"asset-compiler",
"asset-metadata",
"local-data-root"
],
"implementation_boundary": "建立 TypeScript CLI,只读读取规范 manifest/catalog/metadata,输出 TemplateRenderModel、版本化元数据、最小 derived 产物和源前后校验报告;不执行 Lua/Prefab",
"parent_families": [
"TDD-WP5-MAN-001"
],
"case_ids": [
"TDD-WP5-MAN-001-readonly-compiler"
],
"first_red": [
{
"family_id": "TDD-WP5-MAN-001",
"assertion": "编译器读取证据目录、执行 Lua/Prefab、复制全库或改写源"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-MAN-001",
"assertion": "只读规范入口;声明式转换;源前后哈希/时间不变;无等价全库副本"
}
],
"task_green_gate": "源文件哈希/时间不变;不读证据目录;不复制全库或形成等价派生副本;内容哈希去重复用",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: asset-compiler, asset-metadata, local-data-root.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"PKG-SEC",
"MANUAL"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-MAN-001-readonly-compiler/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP5-02",
"work_package": "WP-5",
"title": "普通贴纸 catalog 与虚拟目录",
"dependencies": {
"source_text": "TASK-WP5-01",
"task_ids": [
"TASK-WP5-01"
],
"work_packages": [
]
},
"requirements": [
"STATIC-01",
"STATIC-02",
"STATIC-03",
"STATIC-04"
],
"acceptance_criteria": [
"AC-13",
"AC-32"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"STATIC-01 至 04、AC-13、32"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.4 素材面板与公开缓存",
"10.2 StaticStickerCatalog 构建"
],
"modules": [
"asset-compiler",
"static-sticker-catalog",
"web"
],
"implementation_boundary": "构建 part1-25 的 1,407 项 StaticStickerCatalog,保留三组重复、稳定 ID/顺序/哈希/尺寸/MIME/缩略图引用;接入虚拟列表和懒加载",
"parent_families": [
"TDD-WP5-CAT-001"
],
"case_ids": [
"TDD-WP5-CAT-001-catalog-1407"
],
"first_red": [
{
"family_id": "TDD-WP5-CAT-001",
"assertion": "计数、part、重复项、顺序或懒加载错误"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-CAT-001",
"assertion": "part1-25 共 1,407 PNG;3 组重复保留;虚拟列表节点不线性增长,原图按需加载"
}
],
"task_green_gate": "计数、part、重复和顺序精确;原图按需加载;DOM 只保留视口和两屏缓冲",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: asset-compiler, static-sticker-catalog, web.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"MANUAL"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-CAT-001-catalog-1407/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP5-03",
"work_package": "WP-5",
"title": "复杂资源注册与 P0-A 白名单",
"dependencies": {
"source_text": "TASK-WP5-01;与 WP-4 renderer 契约联调",
"task_ids": [
"TASK-WP5-01"
],
"work_packages": [
"WP-4"
]
},
"requirements": [
"ADMIN-07",
"COL-01",
"COL-02",
"COL-03",
"COL-04",
"COL-05",
"DYN-01",
"DYN-08",
"NFR-02",
"NFR-07",
"STATIC-01",
"TEXT-01",
"TEXT-04"
],
"acceptance_criteria": [
"AC-15",
"AC-16",
"AC-32",
"AC-42",
"AC-48"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"COL-01 至 05、AC-15 P0-A 子集、16、32",
"TEXT-01、TEXT-04、COL-01、DYN-01、DYN-08、STATIC-01、ADMIN-07、NFR-02、NFR-07、AC-32、42、48"
],
"acceptance_scope_notes": [
"COL-01 至 05、AC-15 P0-A 子集、16、32"
],
"fixture_ids": [
],
"development_plan_sections": [
"10.3 复杂资源包",
"10.5 Manifest 与发布路径"
],
"modules": [
"asset-compiler",
"template-registry",
"asset-renderer"
],
"implementation_boundary": "导入注册 332 文字、86 字体项、16 色卡、35 动态;公开 manifest 只启用 32 文字、实际字体+FONT081、COLOR001/002/008/016、10 动态和 1,407 普通贴纸",
"parent_families": [
"TDD-WP5-COL-001",
"TDD-WP5-WHITE-001"
],
"case_ids": [
"TDD-WP5-COL-001-four-layouts",
"TDD-WP5-WHITE-001-p0a-allowlist"
],
"first_red": [
{
"family_id": "TDD-WP5-COL-001",
"assertion": "P0-A 启用非四种色卡或四种布局不消费同一五色"
},
{
"family_id": "TDD-WP5-WHITE-001",
"assertion": "普通用户发现白名单外复杂素材或缺少规定白名单"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-COL-001",
"assertion": "只启用 COLOR001/002/008/016,统一五色,刷新规则与 WP-4 一致"
},
{
"family_id": "TDD-WP5-WHITE-001",
"assertion": "精确 32 文字、实际字体+FONT081、4 色卡、10 动态、1,407 普通贴纸"
}
],
"task_green_gate": "白名单外复杂素材不对普通用户可见;四种色卡消费同一五色;色卡/动态不计入 25 part;不把 full_p0 分批公开",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: asset-compiler, template-registry, asset-renderer.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"E2E",
"VIS-PERF",
"API"
],
"validation_commands": [
"pnpm test:unit",
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm test:api",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-COL-001-four-layouts/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-WHITE-001-p0a-allowlist/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP5-04",
"work_package": "WP-5",
"title": "Immutable manifest 与三类资源隔离",
"dependencies": {
"source_text": "TASK-WP5-01 至 TASK-WP5-03、WP-0 gate/cache",
"task_ids": [
"TASK-WP5-01",
"TASK-WP5-03"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"NFR-07",
"PRIV-02",
"PRIV-05"
],
"acceptance_criteria": [
"AC-42",
"AC-46",
"AC-48"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.12",
"17.13",
"17.14"
],
"requirement_ac_sources": [
"NFR-07、17.14、AC-46、48",
"PRIV-02、05、17.12、13、AC-42、48"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.4 素材面板与公开缓存",
"10.5 Manifest 与发布路径",
"10.6 三类资源隔离"
],
"modules": [
"api",
"asset-release-manifest",
"web-client-cache"
],
"implementation_boundary": "实现 release_version、manifest/file SHA-256、public/preview/private 三类路由、鉴权、no-store/immutable 缓存和不可推导资源 URL",
"parent_families": [
"TDD-WP5-CACHE-001",
"TDD-WP5-RES-001"
],
"case_ids": [
"TDD-WP5-CACHE-001-no-private-client-state",
"TDD-WP5-RES-001-three-access-classes"
],
"first_red": [
{
"family_id": "TDD-WP5-CACHE-001",
"assertion": "SW 拦截 internal/private 或 IndexedDB 保存私有字段"
},
{
"family_id": "TDD-WP5-RES-001",
"assertion": "公开 manifest 暴露 internal/private、路径可推导或缓存策略混用"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-CACHE-001",
"assertion": "仅公开 allowlist;每场景实际枚举 registration、Cache keys 和 IndexedDB 记录"
},
{
"family_id": "TDD-WP5-RES-001",
"assertion": "三类路由、鉴权和 cache header 分离;浏览器永不获得绝对路径"
}
],
"task_green_gate": "public manifest 不含 internal/private;浏览器不见绝对路径;SW/Cache/IndexedDB 实际枚举无私有或预览内容",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, asset-release-manifest, web-client-cache.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"E2E",
"API",
"PKG-SEC"
],
"validation_commands": [
"pnpm test:e2e",
"pnpm test:api",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-CACHE-001-no-private-client-state/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-RES-001-three-access-classes/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "preview-user-variant",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "有效授权、无授权/空批次、加载、撤销/过期阻断;不出现后台权限;全局容量条"
},
"applicable_states": {
"page_id": "preview-user-variant",
"actor_entry": "有有效/撤销/过期 AssetPreviewGrant 的普通账号",
"normal": "授权批次素材显示“预览”,其余页面同普通用户",
"empty_loading": "无授权/批次空;manifest 加载",
"failure_disabled": "撤销/过期立即阻断新读取",
"conflict_capacity_special": "不出现后台入口、调点、邀请码、模型或私有内容;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/preview-user-variant/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP5-05",
"work_package": "WP-5",
"title": "后台普通贴纸上传与版本发布",
"dependencies": {
"source_text": "TASK-WP5-02、TASK-WP5-04、WP-0 存储",
"task_ids": [
"TASK-WP5-02",
"TASK-WP5-04"
],
"work_packages": [
"WP-0"
]
},
"requirements": [
"ADMIN-06"
],
"acceptance_criteria": [
"AC-31",
"AC-55"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.7",
"17.19"
],
"requirement_ac_sources": [
"ADMIN-06、17.7、17.19、AC-31、55"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"10.4 后台新增普通贴纸"
],
"modules": [
"api",
"worker",
"sqlite",
"local-data-root",
"web-admin"
],
"implementation_boundary": "实现 PNG/WebP 流式校验、stable ID/part/顺序、原图与缩略图独立预留/计量、immutable release 切换和旧版本保留",
"parent_families": [
"TDD-WP5-UPL-001"
],
"case_ids": [
"TDD-WP5-UPL-001-upload-metering"
],
"first_red": [
{
"family_id": "TDD-WP5-UPL-001",
"assertion": "后台上传未流式校验、原图/缩略图漏计量或 full 仍写入"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-UPL-001",
"assertion": "PNG/WebP、稳定 ID、part、顺序和 MIME 校验;两类文件分别预留并计量"
}
],
"task_green_gate": "两类文件均计入 5 GBfull/unavailable 阻断;恰好等于上限允许提交后 full;不把既有归档复制进 managed-assets",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, local-data-root, web-admin.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-UPL-001-upload-metering/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-assets",
"role": "implementation",
"frames": {
"frame_id": "A28V3c",
"frame_name": "06C 素材与历史清理",
"primary_task": "TASK-WP5-06",
"mapped_state_scope": "上传/版本/候选;无上传/无候选;格式/编译/权限失败;full/unavailable;引用冲突、排队、物理删除和重计量"
},
"applicable_states": {
"page_id": "admin-assets",
"actor_entry": "active super_admin",
"normal": "普通贴纸、资源版本/发布、历史清理",
"empty_loading": "无上传素材/无候选;列表/处理加载",
"failure_disabled": "格式/编译失败;权限、文件状态禁用",
"conflict_capacity_special": "stable ID/version 冲突;full/unavailable 阻断上传;引用冲突/排队/重计量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-assets/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP5-06",
"work_package": "WP-5",
"title": "历史贴纸显式清理",
"dependencies": {
"source_text": "TASK-WP5-05、WP-2 project_asset_refs、WP-1 审计",
"task_ids": [
"TASK-WP5-05"
],
"work_packages": [
"WP-1",
"WP-2"
]
},
"requirements": [
"ADMIN-06",
"ADMIN-09"
],
"acceptance_criteria": [
"AC-31",
"AC-50",
"AC-55"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.7",
"17.19"
],
"requirement_ac_sources": [
"ADMIN-06、09、17.7、17.19、AC-31、50、55"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"7.7 后台贴纸历史文件显式清理"
],
"modules": [
"api",
"worker",
"sqlite",
"local-data-root",
"web-admin"
],
"implementation_boundary": "实现候选查询、同管理员确认、短期 snapshot、BEGIN IMMEDIATE 全引用复核、整批拒绝/排队、Worker 物理删除、重计量和全阶段审计",
"parent_families": [
"TDD-WP5-CLN-001"
],
"case_ids": [
"TDD-WP5-CLN-001-reference-race"
],
"first_red": [
{
"family_id": "TDD-WP5-CLN-001",
"assertion": "自动清理、有引用仍删除、整批部分排队或排队即减容量"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-CLN-001",
"assertion": "候选、同管理员确认、BEGIN IMMEDIATE 复核、整批拒绝/排队、物理删除、重测和全阶段审计"
}
],
"task_green_gate": "有任一 release/active/trashed/待发布引用则整批拒绝;排队不减容量;无自动清理;物理删除和重测后才恢复",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, worker, sqlite, local-data-root, web-admin.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-CLN-001-reference-race/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-assets",
"role": "implementation",
"frames": {
"frame_id": "A28V3c",
"frame_name": "06C 素材与历史清理",
"primary_task": "TASK-WP5-06",
"mapped_state_scope": "上传/版本/候选;无上传/无候选;格式/编译/权限失败;full/unavailable;引用冲突、排队、物理删除和重计量"
},
"applicable_states": {
"page_id": "admin-assets",
"actor_entry": "active super_admin",
"normal": "普通贴纸、资源版本/发布、历史清理",
"empty_loading": "无上传素材/无候选;列表/处理加载",
"failure_disabled": "格式/编译失败;权限、文件状态禁用",
"conflict_capacity_special": "stable ID/version 冲突;full/unavailable 阻断上传;引用冲突/排队/重计量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-assets/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP5-07",
"work_package": "WP-5",
"title": "内部预览授权生命周期",
"dependencies": {
"source_text": "TASK-WP5-03、TASK-WP5-04、WP-1 会话",
"task_ids": [
"TASK-WP5-03",
"TASK-WP5-04"
],
"work_packages": [
"WP-1"
]
},
"requirements": [
"ADMIN-07"
],
"acceptance_criteria": [
"AC-42",
"AC-48"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.13"
],
"requirement_ac_sources": [
"ADMIN-07、17.13、AC-42、48"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.7 内部预览授权"
],
"modules": [
"api",
"sqlite",
"web",
"web-admin"
],
"implementation_boundary": "实现批次、AssetPreviewGrant、active/revoked/expired、每次授权校验、随机 manifest item ID、撤销即时阻断和既有项目按版本渲染",
"parent_families": [
"TDD-WP5-PREV-001"
],
"case_ids": [
"TDD-WP5-PREV-001-grant-lifecycle"
],
"first_red": [
{
"family_id": "TDD-WP5-PREV-001",
"assertion": "授权改变角色、公开 manifest 泄漏或撤销后仍可取资源"
}
],
"minimal_green": [
{
"family_id": "TDD-WP5-PREV-001",
"assertion": "每次校验 grantno-store;撤销立即阻断新访问;已有项目按版本渲染"
}
],
"task_green_gate": "授权不改变普通用户角色;不出现后台能力;撤销/到期阻断新取用但不破坏已保存项目",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: api, sqlite, web, web-admin.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP5-PREV-001-grant-lifecycle/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-5",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "preview-user-variant",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "有效授权、无授权/空批次、加载、撤销/过期阻断;不出现后台权限;全局容量条"
},
"applicable_states": {
"page_id": "preview-user-variant",
"actor_entry": "有有效/撤销/过期 AssetPreviewGrant 的普通账号",
"normal": "授权批次素材显示“预览”,其余页面同普通用户",
"empty_loading": "无授权/批次空;manifest 加载",
"failure_disabled": "撤销/过期立即阻断新读取",
"conflict_capacity_special": "不出现后台入口、调点、邀请码、模型或私有内容;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/preview-user-variant/\u003cstate\u003e/"
},
{
"page_id": "admin-preview",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "批次、模板状态、授权/撤销/到期、空/骨架、非法转换/发布失败;不出现 P0-B 全量开放"
},
"applicable_states": {
"page_id": "admin-preview",
"actor_entry": "active super_admin",
"normal": "批次、模板状态、账号授权/撤销/到期",
"empty_loading": "无批次/授权;表格骨架",
"failure_disabled": "非法状态转换、过期、发布校验失败",
"conflict_capacity_special": "授权不改变角色;P0-B 全量开放不可在 P0-A 出现;继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-preview/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP6-01",
"work_package": "WP-6",
"title": "后台壳、权限与安全摘要",
"dependencies": {
"source_text": "WP-1、WP-2、WP-5",
"task_ids": [
],
"work_packages": [
"WP-1",
"WP-2",
"WP-5"
]
},
"requirements": [
"ADMIN-01",
"ADMIN-02",
"ADMIN-04",
"ADMIN-08"
],
"acceptance_criteria": [
"AC-25",
"AC-49"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"ADMIN-01、02、04、08、AC-25、49"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.6 运营后台与两类审计"
],
"modules": [
"web-admin",
"api",
"sqlite"
],
"implementation_boundary": "按 UIDesign 实现独立 /admin 路由域、侧栏/总览、用户、邀请码、点数、素材、预览、生成记录入口和 active super_admin 服务端授权",
"parent_families": [
"TDD-WP6-ADM-001"
],
"case_ids": [
"TDD-WP6-ADM-001-role-and-summary"
],
"first_red": [
{
"family_id": "TDD-WP6-ADM-001",
"assertion": "普通/预览账号进入后台、后台显示私有正文或敏感配置"
}
],
"minimal_green": [
{
"family_id": "TDD-WP6-ADM-001",
"assertion": "active super_admin 服务端授权;默认仅安全摘要;角色和会话域严格分离"
}
],
"task_green_gate": "普通/预览账号无法进入;管理员与普通 session 域分离;默认列表只含脱敏摘要;无敏感配置回显",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-admin, api, sqlite.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"API",
"E2E"
],
"validation_commands": [
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-ADM-001-role-and-summary/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-6",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-overview",
"role": "implementation",
"frames": {
"frame_id": "e4e2Kz",
"frame_name": "06A 后台总览",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "名额、任务、成本核对、服务/容量和审计摘要;骨架/空事件;聚合失败;三模型状态分列和待处理事项"
},
"applicable_states": {
"page_id": "admin-overview",
"actor_entry": "active super_admin",
"normal": "名额、任务、模型、点数、服务、容量、审计摘要",
"empty_loading": "无近期事件;指标骨架",
"failure_disabled": "聚合失败保留旧值和时间;敏感动作按状态禁用",
"conflict_capacity_special": "default/runtime/recommended 分列;pending_manual_review 为成本核对;容量持续条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-overview/\u003cstate\u003e/"
},
{
"page_id": "admin-users",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "脱敏列表/详情、暂停恢复/调点、空/筛选空/骨架、原因缺失和状态禁用、负 available"
},
"applicable_states": {
"page_id": "admin-users",
"actor_entry": "active super_admin",
"normal": "脱敏列表/详情、暂停恢复、调点",
"empty_loading": "无用户/筛选空;表格骨架",
"failure_disabled": "操作失败、原因缺失、状态前置禁用",
"conflict_capacity_special": "调点可使 available 为负但 reserved 不变;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-users/\u003cstate\u003e/"
},
{
"page_id": "admin-invites",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "创建/停用/期限/次数/脱敏复制、空/骨架、名额满、过期/耗尽、请求失败和幂等/CAS 结果"
},
"applicable_states": {
"page_id": "admin-invites",
"actor_entry": "active super_admin",
"normal": "创建、停用、期限/次数、脱敏复制",
"empty_loading": "无邀请码;表格骨架",
"failure_disabled": "名额满、停用/过期/耗尽不可当可用;请求失败",
"conflict_capacity_special": "CAS/幂等结果;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-invites/\u003cstate\u003e/"
},
{
"page_id": "admin-assets",
"role": "implementation",
"frames": {
"frame_id": "A28V3c",
"frame_name": "06C 素材与历史清理",
"primary_task": "TASK-WP5-06",
"mapped_state_scope": "上传/版本/候选;无上传/无候选;格式/编译/权限失败;full/unavailable;引用冲突、排队、物理删除和重计量"
},
"applicable_states": {
"page_id": "admin-assets",
"actor_entry": "active super_admin",
"normal": "普通贴纸、资源版本/发布、历史清理",
"empty_loading": "无上传素材/无候选;列表/处理加载",
"failure_disabled": "格式/编译失败;权限、文件状态禁用",
"conflict_capacity_special": "stable ID/version 冲突;full/unavailable 阻断上传;引用冲突/排队/重计量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-assets/\u003cstate\u003e/"
},
{
"page_id": "admin-preview",
"role": "implementation",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "批次、模板状态、授权/撤销/到期、空/骨架、非法转换/发布失败;不出现 P0-B 全量开放"
},
"applicable_states": {
"page_id": "admin-preview",
"actor_entry": "active super_admin",
"normal": "批次、模板状态、账号授权/撤销/到期",
"empty_loading": "无批次/授权;表格骨架",
"failure_disabled": "非法状态转换、过期、发布校验失败",
"conflict_capacity_special": "授权不改变角色;P0-B 全量开放不可在 P0-A 出现;继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-preview/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP6-02",
"work_package": "WP-6",
"title": "私有内容告知与逐次访问",
"dependencies": {
"source_text": "TASK-WP6-01、WP-1 UserProfile/审计",
"task_ids": [
"TASK-WP6-01"
],
"work_packages": [
"WP-1"
]
},
"requirements": [
"ADMIN-05"
],
"acceptance_criteria": [
"AC-25",
"AC-50"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.1",
"17.10"
],
"requirement_ac_sources": [
"ADMIN-05、17.1、AC-25",
"ADMIN-05、17.10、AC-25",
"ADMIN-05、17.10、AC-25、50",
"ADMIN-05、AC-25"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
"FX-ACTOR-ADMIN-A"
],
"development_plan_sections": [
"7.8 私有内容告知确认与逐次访问",
"9.6 运营后台与两类审计"
],
"modules": [
"web-admin",
"api",
"sqlite",
"local-data-root"
],
"implementation_boundary": "实现当前 notice version bootstrap、身份+版本持久 ack、428 区域门禁、升版重阻断、“打开并记录审计”和先审计后返回内容",
"parent_families": [
"TDD-WP6-PRIV-001",
"TDD-WP6-PRIV-002"
],
"case_ids": [
"TDD-WP6-PRIV-001-ack",
"TDD-WP6-PRIV-001-persistence",
"TDD-WP6-PRIV-001-version-bump",
"TDD-WP6-PRIV-002-deny-without-audit",
"TDD-WP6-PRIV-002-open-after-audit"
],
"first_red": [
{
"family_id": "TDD-WP6-PRIV-001",
"assertion": "告知确认只存在 Cookie/session/localStorage 或同版本重复"
},
{
"family_id": "TDD-WP6-PRIV-002",
"assertion": "hover/预取打开内容、确认替代逐次审计、要求填写访问目的/原因或审计失败仍返回内容"
}
],
"minimal_green": [
{
"family_id": "TDD-WP6-PRIV-001",
"assertion": "UserProfile 按 admin+version 持久;跨标签、浏览器/API 重启、重登和 Chrome/Edge不重复;升版重阻断"
},
{
"family_id": "TDD-WP6-PRIV-002",
"assertion": "每个入口原样显示“打开并记录审计”;每次点击先提交独立 PrivateContentAccessLogUI 和 API 均不要求逐次填写访问目的、原因或二次确认;审计只记录 PRD/DevelopmentPlan 允许的对象、管理员、时间、内容类型等非正文信息;失败不返回;列表/HTML/缓存无正文"
}
],
"task_green_gate": "跨标签、重启、重登和 Chrome/Edge 同版本不重复;hover/预取不打开;每次点击独立记录;审计失败不返回内容;不要求逐次填写原因",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-admin, api, sqlite, local-data-root.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-PRIV-001-ack/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-PRIV-001-persistence/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-PRIV-001-version-bump/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-PRIV-002-deny-without-audit/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-PRIV-002-open-after-audit/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-6",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-generations",
"role": "implementation",
"frames": {
"frame_id": "OnsiT",
"frame_name": "06D 生成记录与私有告知",
"primary_task": "TASK-WP6-02",
"mapped_state_scope": "默认隐藏正文;身份+版本告知;逐次打开;空记录/审计写入加载;428、审计失败、升版重阻断"
},
"applicable_states": {
"page_id": "admin-generations",
"actor_entry": "active super_admin",
"normal": "默认安全摘要、告知、逐次打开",
"empty_loading": "无记录;列表/审计写入加载",
"failure_disabled": "未确认 428、审计失败不打开、权限禁用",
"conflict_capacity_special": "告知升版重阻断;每次打开先独立审计;页面读取不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-generations/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP6-03",
"work_package": "WP-6",
"title": "免费服务硬停止与恢复",
"dependencies": {
"source_text": "TASK-WP6-01、WP-1/2 事务基础",
"task_ids": [
"TASK-WP6-01"
],
"work_packages": [
"WP-1"
]
},
"requirements": [
"ADMIN-05",
"ADMIN-08",
"ADMIN-09",
"NFR-08"
],
"acceptance_criteria": [
"AC-47",
"AC-52"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.15"
],
"requirement_ac_sources": [
"ADMIN-05、08、NFR-08、17.15、AC-47",
"ADMIN-08、09、NFR-08、AC-47、52"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"11.1 Resend",
"11.2 高德"
],
"modules": [
"web-admin",
"api",
"sqlite",
"resend-adapter",
"amap-adapter"
],
"implementation_boundary": "实现 Resend 每日/月度、高德月度用量领取,paused_quota/provider、上限只可下调、健康检查和 super_admin 人工恢复",
"parent_families": [
"TDD-WP6-SVC-001",
"TDD-WP6-SVC-002"
],
"case_ids": [
"TDD-WP6-SVC-001-hard-quota",
"TDD-WP6-SVC-002-limit-recovery"
],
"first_red": [
{
"family_id": "TDD-WP6-SVC-001",
"assertion": "Resend 发第 81 封/超月限、高德发第 1001 次或暂停后伪造成功"
},
{
"family_id": "TDD-WP6-SVC-002",
"assertion": "后台提高上限、启用收费或自动恢复"
}
],
"minimal_green": [
{
"family_id": "TDD-WP6-SVC-001",
"assertion": "配额领取事务化;paused_quota/provider;已有会话继续;DYN004 停而手动地点继续"
},
{
"family_id": "TDD-WP6-SVC-002",
"assertion": "只允许不扩大能力的下调并审计;提高/付费/自动扩容被拒绝;恢复需前置确认"
}
],
"task_green_gate": "第 81/1001 次不调用;不得提高固定上限、启用收费、自动恢复/扩容;高德暂停只影响 DYN004 自动定位",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-admin, api, sqlite, resend-adapter, amap-adapter.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"EXT-MOCK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:all",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-SVC-001-hard-quota/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-SVC-002-limit-recovery/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-6",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-services-storage",
"role": "implementation",
"frames": {
"frame_id": "L3lde2",
"frame_name": "06E 服务与存储",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "Resend/高德/网关/Worker/LocalDataRoot;指标加载;paused/degraded/unavailable;恢复前置、清理排队和重计量"
},
"applicable_states": {
"page_id": "admin-services-storage",
"actor_entry": "active super_admin",
"normal": "Resend/高德/网关/Worker/LocalDataRoot 状态与允许动作",
"empty_loading": "指标加载;无告警",
"failure_disabled": "paused/degraded/unavailable;不合法恢复/提高上限禁用",
"conflict_capacity_special": "full/unavailable、清理排队和物理重计量;不显示绝对路径"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-services-storage/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP6-04",
"work_package": "WP-6",
"title": "敏感操作审计与保留",
"dependencies": {
"source_text": "TASK-WP6-01 至 TASK-WP6-03、WP-5 清理",
"task_ids": [
"TASK-WP6-01",
"TASK-WP6-03"
],
"work_packages": [
"WP-5"
]
},
"requirements": [
"ADMIN-09"
],
"acceptance_criteria": [
"AC-50"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
"17.16"
],
"requirement_ac_sources": [
"ADMIN-09、17.16、AC-50"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"9.6 运营后台与两类审计",
"12.3 审计与敏感信息"
],
"modules": [
"web-admin",
"api",
"worker",
"sqlite"
],
"implementation_boundary": "把用户、点数、邀请、模型、素材、预览、服务、余额恢复和贴纸清理各阶段纳入同事务 AdminOperationLog;实现 180 天 Worker 清理",
"parent_families": [
"TDD-WP6-AUD-001"
],
"case_ids": [
"TDD-WP6-AUD-001-sensitive-operations"
],
"first_red": [
{
"family_id": "TDD-WP6-AUD-001",
"assertion": "敏感操作无日志、两类日志混用、含正文或 180 天内可删"
}
],
"minimal_green": [
{
"family_id": "TDD-WP6-AUD-001",
"assertion": "全部规定操作同事务审计;贴纸清理全阶段;两类表分离;到期 Worker 清理"
}
],
"task_green_gate": "两类审计严格分离、180 天内不可改删、贴纸清理请求/复核/拒绝或排队/物理结果齐全且不含正文",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-admin, api, worker, sqlite.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"SQLite constraints, transactions, idempotency and side-effect assertions",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"DB",
"API",
"WRK",
"E2E"
],
"validation_commands": [
"pnpm test:integration",
"pnpm test:api",
"pnpm test:worker",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-AUD-001-sensitive-operations/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-6",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-audit",
"role": "implementation",
"frames": {
"frame_id": "DlCpN",
"frame_name": "06F 私有内容访问审计",
"primary_task": "TASK-WP6-04",
"mapped_state_scope": "两类独立审计、游标和 180 天;空/加载;查询失败;不可编辑删除;无正文、图片、密钥和路径"
},
"applicable_states": {
"page_id": "admin-audit",
"actor_entry": "active super_admin",
"normal": "后台操作与私有访问两类独立页/标签",
"empty_loading": "无记录;游标加载",
"failure_disabled": "查询失败保留旧结果;无修改/人工删除动作",
"conflict_capacity_special": "180 天保留;正文、图片、密钥和路径不出现;页面读取不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-audit/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP6-05",
"work_package": "WP-6",
"title": "模型/服务/存储状态与诊断",
"dependencies": {
"source_text": "TASK-WP6-01、WP-0 诊断、WP-3 runtime",
"task_ids": [
"TASK-WP6-01"
],
"work_packages": [
"WP-0",
"WP-3"
]
},
"requirements": [
"ADMIN-03",
"ADMIN-08",
"GEN-15",
"NFR-09",
"PRIV-01",
"PRIV-02"
],
"acceptance_criteria": [
"AC-30",
"AC-41",
"AC-51",
"AC-55"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"GEN-15、ADMIN-03、08、AC-30、51",
"PRIV-01、02、ADMIN-08、NFR-09、AC-41、55"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"7.6 ModelConfig 原子配置与运行时推荐",
"9.6 运营后台与两类审计",
"11 外部服务硬停止与恢复"
],
"modules": [
"web-admin",
"api",
"sqlite",
"supervisor"
],
"implementation_boundary": "实现总览、模型、服务与存储页面的 configured default/runtime/recommended 三列、Worker/网关/Resend/高德/storage 状态、REST refetch 和复制诊断",
"parent_families": [
"TDD-WP6-DIAG-001",
"TDD-WP6-STATE-001"
],
"case_ids": [
"TDD-WP6-DIAG-001-redacted-diagnostics",
"TDD-WP6-STATE-001-three-model-states"
],
"first_red": [
{
"family_id": "TDD-WP6-DIAG-001",
"assertion": "总览/服务/存储/诊断暴露路径、密钥或正文"
},
{
"family_id": "TDD-WP6-STATE-001",
"assertion": "后台把 configured default、runtime availability 和 recommended 合并"
}
],
"minimal_green": [
{
"family_id": "TDD-WP6-DIAG-001",
"assertion": "只显示固定非敏感字段、计量和状态;复制诊断通过同一脱敏扫描"
},
{
"family_id": "TDD-WP6-STATE-001",
"assertion": "三列独立;临时异常不改配置;恢复只重新派生推荐"
}
],
"task_green_gate": "推荐可 nullruntime 变化不回写配置;只显示稳定非敏感字段和逻辑位置;无密钥、邮箱、路径、正文或供应商原文",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: web-admin, api, sqlite, supervisor.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"OpenAPI, error envelope and HTTP semantics",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"API",
"E2E",
"PKG-SEC"
],
"validation_commands": [
"pnpm test:api",
"pnpm test:e2e",
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-DIAG-001-redacted-diagnostics/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP6-STATE-001-three-model-states/"
],
"automation": [
"automated"
],
"release_gate": [
"work_package:WP-6",
"release:P0-A"
],
"ui_scope": [
{
"page_id": "admin-overview",
"role": "implementation",
"frames": {
"frame_id": "e4e2Kz",
"frame_name": "06A 后台总览",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "名额、任务、成本核对、服务/容量和审计摘要;骨架/空事件;聚合失败;三模型状态分列和待处理事项"
},
"applicable_states": {
"page_id": "admin-overview",
"actor_entry": "active super_admin",
"normal": "名额、任务、模型、点数、服务、容量、审计摘要",
"empty_loading": "无近期事件;指标骨架",
"failure_disabled": "聚合失败保留旧值和时间;敏感动作按状态禁用",
"conflict_capacity_special": "default/runtime/recommended 分列;pending_manual_review 为成本核对;容量持续条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-overview/\u003cstate\u003e/"
},
{
"page_id": "admin-models",
"role": "implementation",
"frames": {
"frame_id": "YVfVG",
"frame_name": "06B 模型配置",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "完整三模型集合、default/runtime/recommended;加载;空推荐;替代/priority 禁用;CAS 冲突和整套回滚"
},
"applicable_states": {
"page_id": "admin-models",
"actor_entry": "active super_admin",
"normal": "完整三模型集合、default/runtime/recommended 三层",
"empty_loading": "初始加载骨架;无 recommended 是合法状态",
"failure_disabled": "合法替代/priority 前置禁用;契约未验证/运行时不可用",
"conflict_capacity_special": "config_set CAS 冲突、完整集合原子回滚;仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-models/\u003cstate\u003e/"
},
{
"page_id": "admin-services-storage",
"role": "implementation",
"frames": {
"frame_id": "L3lde2",
"frame_name": "06E 服务与存储",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "Resend/高德/网关/Worker/LocalDataRoot;指标加载;paused/degraded/unavailable;恢复前置、清理排队和重计量"
},
"applicable_states": {
"page_id": "admin-services-storage",
"actor_entry": "active super_admin",
"normal": "Resend/高德/网关/Worker/LocalDataRoot 状态与允许动作",
"empty_loading": "指标加载;无告警",
"failure_disabled": "paused/degraded/unavailable;不合法恢复/提高上限禁用",
"conflict_capacity_special": "full/unavailable、清理排队和物理重计量;不显示绝对路径"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-services-storage/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP7-01",
"work_package": "WP-7",
"title": "候选制品与候选浏览器记录",
"dependencies": {
"source_text": "WP-0 至 WP-6 Green",
"task_ids": [
],
"work_packages": [
"WP-0",
"WP-6"
]
},
"requirements": [
"NFR-01",
"NFR-09"
],
"acceptance_criteria": [
"AC-24",
"AC-41"
],
"acceptance_criteria_role": "supporting",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-01、NFR-09、AC-24、AC-41;候选记录支撑,不新增测试 case"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.1 便携包布局",
"3.6 浏览器支持硬门禁",
"15 WP-7"
],
"modules": [
"release-ci",
"supervisor",
"web",
"api",
"worker"
],
"implementation_boundary": "从候选便携包和当前安装的真实 Chrome/Edge 可执行文件生成 artifacts/tdd/\u003crun_id\u003e/release-candidate.json,记录 Windows build、品牌、major、full version、记录时间、候选制品哈希和固定端口;生成候选 ZIP 与候选 START-HERE.txt,但不写最终 RELEASE.json",
"parent_families": [
],
"case_ids": [
],
"first_red": [
],
"minimal_green": [
],
"task_green_gate": "候选记录字段完整、脱敏且与候选制品一致;只作为后续精确环境输入,不能标记发布冻结或替代最终 RELEASE 证据",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-ci, supervisor, web, api, worker.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"credential, path, log, package and diagnostic redaction boundaries",
"candidate record must remain distinct from final RELEASE.json"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"PKG-SEC",
"MANUAL"
],
"validation_commands": [
"pnpm test:security",
"pnpm test:package",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/release-candidate.json",
"artifacts/tdd/\u003crun_id\u003e/candidate-package/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP7-02",
"work_package": "WP-7",
"title": "三模型真实契约验收",
"dependencies": {
"source_text": "TASK-WP7-01、WP-3 Green、受控凭据",
"task_ids": [
"TASK-WP7-01"
],
"work_packages": [
"WP-3"
]
},
"requirements": [
"GEN-13"
],
"acceptance_criteria": [
"AC-40",
"AC-41"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"GEN-13、AC-40、41"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"8.3 契约验证证据",
"15 WP-7"
],
"modules": [
"release-validation",
"ai-adapters",
"windows-credential-manager"
],
"implementation_boundary": "对三个模型分别运行纯文字、参考图、四比例、同步/异步、响应、九类错误、结算和契约变化重验,保存脱敏证据",
"parent_families": [
"TDD-WP7-EXT-001"
],
"case_ids": [
"TDD-WP7-EXT-001-three-real-models"
],
"first_red": [
{
"family_id": "TDD-WP7-EXT-001",
"assertion": "任一模型缺独立真实契约证据"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-EXT-001",
"assertion": "三模型各自完成纯文字、参考图、四比例、同步/异步、响应、九类错误和结算证据"
}
],
"task_green_gate": "每个模型独立证据齐全且匹配最后配置;任一失败保持 externally_blocked;不共享 verified 标记",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-validation, ai-adapters, windows-credential-manager.",
"must_preserve": [
"PRD product semantics and P0-A boundary"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"EXT-REAL",
"MANUAL"
],
"validation_commands": [
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gemini-3.1-flash-image-preview",
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gemini-3-pro-image-preview",
"pnpm validate:external -- --service \u003cai-gateway-service-id\u003e --model gpt-image-2",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-EXT-001-three-real-models/"
],
"automation": [
"controlled_real",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP7-03",
"work_package": "WP-7",
"title": "Resend 真实发布门槛",
"dependencies": {
"source_text": "TASK-WP7-01、WP-1/WP-6 Green、受控域名",
"task_ids": [
"TASK-WP7-01"
],
"work_packages": [
"WP-1",
"WP-6"
]
},
"requirements": [
"AUTH-01",
"AUTH-02",
"AUTH-07"
],
"acceptance_criteria": [
"AC-01",
"AC-33",
"AC-41",
"AC-47",
"AC-49"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"AUTH-01、02、07、AC-01、33、41、47、49"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"1.4 外部产品发布阻塞与可并行范围",
"11.1 Resend",
"15 WP-7"
],
"modules": [
"release-validation",
"resend-adapter",
"windows-credential-manager"
],
"implementation_boundary": "核验 SPF/DKIM、免费规则;QQ/163/企业邮箱各 20 封至少 19 封在 2 分钟内送达;用正式链完成普通/管理员认证",
"parent_families": [
"TDD-WP7-EXT-002"
],
"case_ids": [
"TDD-WP7-EXT-002-real-resend"
],
"first_red": [
{
"family_id": "TDD-WP7-EXT-002",
"assertion": "Resend 域名/免费规则/送达门槛未证实"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-EXT-002",
"assertion": "依据 PRD 第 23.2 节、AC-41、AC-47 与 DevelopmentPlan 第 1.4、11.1 节:SPF/DKIMQQ、163、企业邮箱各 20 封至少 19 封在 2 分钟内送达;正式账号真实认证"
}
],
"task_green_gate": "人工统计脱敏;开发预置账号和 mock 不能作为证据;未达门槛不启动实际 P0-A 验收",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-validation, resend-adapter, windows-credential-manager.",
"must_preserve": [
"PRD product semantics and P0-A boundary"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"EXT-REAL",
"MANUAL"
],
"validation_commands": [
"pnpm validate:external -- --service \u003cresend-service-id\u003e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-EXT-002-real-resend/"
],
"automation": [
"controlled_real",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
{
"page_id": "user-auth",
"role": "final_evidence",
"frames": [
{
"frame_id": "Z0pf8",
"frame_name": "01A 普通用户登录",
"primary_task": "TASK-WP1-02",
"mapped_state_scope": "登录正常;字段初始空;发码/登录加载;验证码、Resend 和身份状态失败;管理员入口、固定本机提示、艺术带与焦点"
},
{
"frame_id": "DVPM8",
"frame_name": "01B 注册展开态",
"primary_task": "TASK-WP1-03",
"mapped_state_scope": "邀请与邮箱已验证摘要;资料和告知未完成/完成;注册中;名额、邀请、验证码和提交失败;主动作禁用"
}
],
"applicable_states": {
"page_id": "user-auth",
"actor_entry": "未登录普通入口",
"normal": "登录、分阶段注册、管理员文字入口、固定本机提示",
"empty_loading": "字段初始空;发码/验证/注册加载",
"failure_disabled": "Resend、验证码、邀请、名额、告知未完成;按钮禁用",
"conflict_capacity_special": "N/A:认证不消费存储容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/user-auth/\u003cstate\u003e/"
},
{
"page_id": "admin-auth",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP1-04",
"mapped_state_scope": "白名单邮箱验证码、字段空/加载、非白名单、停用/移除、Resend 失败;独立 audience 与返回普通登录"
},
"applicable_states": {
"page_id": "admin-auth",
"actor_entry": "未登录后台入口",
"normal": "白名单邮箱验证码、独立 audience、返回普通登录",
"empty_loading": "字段空;发码/登录中",
"failure_disabled": "非白名单发码前阻断、停用/移除白名单、Resend 错误",
"conflict_capacity_special": "N/A:不显示普通创作或容量业务"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-auth/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP7-04",
"work_package": "WP-7",
"title": "高德真实发布门槛",
"dependencies": {
"source_text": "TASK-WP7-01、WP-4/WP-6 Green、受控 Key",
"task_ids": [
"TASK-WP7-01"
],
"work_packages": [
"WP-4",
"WP-6"
]
},
"requirements": [
"DYN-04",
"PRIV-03"
],
"acceptance_criteria": [
"AC-17",
"AC-41",
"AC-47"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"DYN-04、PRIV-03、AC-17、41、47"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"1.4 外部产品发布阻塞与可并行范围",
"11.2 高德",
"15 WP-7"
],
"modules": [
"release-validation",
"amap-adapter",
"windows-credential-manager"
],
"implementation_boundary": "核验定位/逆地理、QPS、白名单、安全限制、每月 1,000 次硬停止和 DYN004 确认流程",
"parent_families": [
"TDD-WP7-EXT-003"
],
"case_ids": [
"TDD-WP7-EXT-003-real-amap"
],
"first_red": [
{
"family_id": "TDD-WP7-EXT-003",
"assertion": "高德接口、绑定、安全限制或 1,000 次硬上限未证实"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-EXT-003",
"assertion": "定位/逆地理、QPS、白名单、安全和应用硬停止实测通过"
}
],
"task_green_gate": "真实测试坐标不关联真实项目;不发第 1001 次;不启用付费或自动扩容;失败保持 externally_blocked",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-validation, amap-adapter, windows-credential-manager.",
"must_preserve": [
"PRD product semantics and P0-A boundary"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"EXT-REAL",
"MANUAL"
],
"validation_commands": [
"pnpm validate:external -- --service \u003camap-service-id\u003e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-EXT-003-real-amap/"
],
"automation": [
"controlled_real",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP7-05",
"work_package": "WP-7",
"title": "候选精确环境 UI、视觉、性能与可访问性验收",
"dependencies": {
"source_text": "TASK-WP7-01 至 TASK-WP7-04",
"task_ids": [
"TASK-WP7-01",
"TASK-WP7-04"
],
"work_packages": [
]
},
"requirements": [
"NFR-02",
"NFR-06"
],
"acceptance_criteria": [
"AC-24",
"AC-25",
"AC-32",
"AC-41",
"AC-55",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"UIDesign 全页、NFR-02、06、AC-24、25、32、41、55、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.6 浏览器支持硬门禁",
"13 性能、可访问性与视觉一致性",
"15 WP-7"
],
"modules": [
"release-validation",
"web",
"web-editor",
"supervisor"
],
"implementation_boundary": "严格使用候选记录中的两个真实 full version,在 1920×1080、DPR 1、100%/200% 下重跑 AC-24、AC-32、全部 E2E、视觉、性能、下载、文件选择和逐个非 N/A 页面状态;按 frame 对照低保真",
"parent_families": [
"TDD-WP7-UI-001"
],
"case_ids": [
"TDD-WP7-UI-001-page-state-evidence"
],
"first_red": [
{
"family_id": "TDD-WP7-UI-001",
"assertion": "UIDesign 页面/入口或适用状态无实现落点,或 1080p/200% 出现遮挡"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-UI-001",
"assertion": "第 11.1 节页面 × 状态矩阵全部适用单元格有证据;Pencil 仅作布局参考,Canvas Index 不计产品实现;固定文案、焦点、状态、控件和无重叠检查通过"
}
],
"task_green_gate": "22 个 coverage unit 全部有证据;候选环境与记录任何漂移均使本任务重跑;无独立 Pencil frame 的页面不漏测;Canvas Index 不计产品页",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-validation, web, web-editor, supervisor.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"E2E",
"VIS-PERF",
"MANUAL"
],
"validation_commands": [
"pnpm test:e2e",
"pnpm test:visual",
"pnpm test:performance",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-UI-001-page-state-evidence/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
{
"page_id": "support-gate",
"role": "final_evidence",
"frames": {
"frame_id": "u1adni",
"frame_name": "07A 浏览器硬阻断",
"primary_task": "TASK-WP0-03",
"mapped_state_scope": "四种阻断 reason、支持品牌/major、最小诊断;bundle/API 无绕过;无业务空态、身份或容量读取"
},
"applicable_states": {
"page_id": "support-gate",
"actor_entry": "所有主体,产品门禁前",
"normal": "四种阻断 reason、支持品牌/major、无继续入口",
"empty_loading": "N/A:引导无业务空态;身份不可判定属于阻断",
"failure_disabled": "bundle/API 均无法绕过;诊断仅最小字段",
"conflict_capacity_special": "N/A:不读取业务状态或容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/support-gate/\u003cstate\u003e/"
},
{
"page_id": "user-auth",
"role": "final_evidence",
"frames": [
{
"frame_id": "Z0pf8",
"frame_name": "01A 普通用户登录",
"primary_task": "TASK-WP1-02",
"mapped_state_scope": "登录正常;字段初始空;发码/登录加载;验证码、Resend 和身份状态失败;管理员入口、固定本机提示、艺术带与焦点"
},
{
"frame_id": "DVPM8",
"frame_name": "01B 注册展开态",
"primary_task": "TASK-WP1-03",
"mapped_state_scope": "邀请与邮箱已验证摘要;资料和告知未完成/完成;注册中;名额、邀请、验证码和提交失败;主动作禁用"
}
],
"applicable_states": {
"page_id": "user-auth",
"actor_entry": "未登录普通入口",
"normal": "登录、分阶段注册、管理员文字入口、固定本机提示",
"empty_loading": "字段初始空;发码/验证/注册加载",
"failure_disabled": "Resend、验证码、邀请、名额、告知未完成;按钮禁用",
"conflict_capacity_special": "N/A:认证不消费存储容量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/user-auth/\u003cstate\u003e/"
},
{
"page_id": "workspace",
"role": "final_evidence",
"frames": [
{
"frame_id": "WbDYT",
"frame_name": "02A 空工作台",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "无项目艺术带;生成表单、推荐模型、四比例与空任务;模型/项目加载;模型、点数、参考图和容量禁用"
},
{
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
}
],
"applicable_states": {
"page_id": "workspace",
"actor_entry": "active 普通/内部预览账号",
"normal": "生成表单、模型/点数/比例、最近项目",
"empty_loading": "无项目艺术带;模型/项目加载",
"failure_disabled": "服务/参考图/生成错误;模型、点数、单任务、历史/项目上限禁用",
"conflict_capacity_special": "model config 变化重确认;warning/critical 提示;full/unavailable 阻断新增"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/workspace/\u003cstate\u003e/"
},
{
"page_id": "current-task",
"role": "final_evidence",
"frames": {
"frame_id": "d99Lo",
"frame_name": "02B 生成中工作台",
"primary_task": "TASK-WP2-05",
"mapped_state_scope": "queued/running 无假百分比;冻结点数;critical 容量条;第二次提交禁用;失败/rejected 动作和配置变化重确认"
},
"applicable_states": {
"page_id": "current-task",
"actor_entry": "active 普通/内部预览账号",
"normal": "真实状态、结果入口",
"empty_loading": "无活动任务;queued/running 无假百分比",
"failure_disabled": "failed/rejected 与九类固定动作;第二任务禁用",
"conflict_capacity_special": "storage 错误按任务真相;pending_manual_review 不作为用户任务状态;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/current-task/\u003cstate\u003e/"
},
{
"page_id": "projects",
"role": "final_evidence",
"frames": {
"frame_id": "zXyG9",
"frame_name": "03A 项目列表",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "active/trashed、筛选、多选 failed_empty;空/骨架;20 active、恢复/批量禁用;多标签和容量提示"
},
"applicable_states": {
"page_id": "projects",
"actor_entry": "active 普通/内部预览账号",
"normal": "active/trashed 列表、筛选、多选 failed_empty",
"empty_loading": "无项目/筛选空;稳定卡片骨架",
"failure_disabled": "列表失败保留旧数据;20 active、恢复/批量条件禁用",
"conflict_capacity_special": "多标签版本提示;删除排队不乐观减容量;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/projects/\u003cstate\u003e/"
},
{
"page_id": "project-detail",
"role": "final_evidence",
"frames": {
"frame_id": "v2Qbu",
"frame_name": "03B 项目详情",
"primary_task": "TASK-WP2-01",
"mapped_state_scope": "历史、固定比例、继续生成、编辑、原图/latest;无成功图/无成品;10 图上限、资源失败和容量状态"
},
"applicable_states": {
"page_id": "project-detail",
"actor_entry": "项目所有者",
"normal": "历史、固定比例、继续生成、编辑、原图/latest 下载",
"empty_loading": "无成功图草稿;历史/成品加载",
"failure_disabled": "10 图上限、当前底图不可删、无 latest、资源读取失败",
"conflict_capacity_special": "比例不可改;清理/容量状态不伪造资源可用性;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/project-detail/\u003cstate\u003e/"
},
{
"page_id": "editor",
"role": "final_evidence",
"frames": {
"frame_id": "bHQnJ",
"frame_name": "04A 三栏编辑器",
"primary_task": "TASK-WP4-01",
"mapped_state_scope": "三栏、保存状态、画布、对象属性与固定底栏;画布/素材加载;保存/素材失败;第 51 元素;conflicted/full/unavailable"
},
"applicable_states": {
"page_id": "editor",
"actor_entry": "有成功底图的项目所有者",
"normal": "三栏、保存状态、画布、属性与素材",
"empty_loading": "画布/素材加载;无成功图不能正常进入",
"failure_disabled": "保存/素材失败;第 51 元素、不可用模板禁用",
"conflict_capacity_special": "dirty/saving/saved/failedconflicted 只读;full 可存 JSONunavailable 保存失败"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/editor/\u003cstate\u003e/"
},
{
"page_id": "export",
"role": "final_evidence",
"frames": {
"frame_id": "i9upg7",
"frame_name": "04B 导出弹层",
"primary_task": "TASK-WP4-05",
"mapped_state_scope": "JPG/PNG、质量、尺寸;合成/持久化加载;未提交确认;四类失败结果;冲突一次下载和 full/unavailable"
},
"applicable_states": {
"page_id": "export",
"actor_entry": "编辑器内项目所有者",
"normal": "JPG/PNG、质量、尺寸、下载/latest 分结果",
"empty_loading": "合成/持久化加载;无业务空态",
"failure_disabled": "合成、下载、项目保存、latest 保存分别失败;无画布/冲突次数用尽禁用",
"conflict_capacity_special": "未提交确认;conflicted 仅一次本地导出;full/unavailable 后端失败不撤回下载"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/export/\u003cstate\u003e/"
},
{
"page_id": "credits",
"role": "final_evidence",
"frames": {
"frame_id": "YlKzE",
"frame_name": "05A 点数明细",
"primary_task": "TASK-WP2-04",
"mapped_state_scope": "available/reserved、流水和分页;无流水/加载;失败保留安全摘要;负 available 如实显示且无购买入口"
},
"applicable_states": {
"page_id": "credits",
"actor_entry": "active 普通/内部预览账号",
"normal": "available/reserved、流水、关联与时间",
"empty_loading": "无流水;分页加载",
"failure_disabled": "加载失败保留安全余额摘要",
"conflict_capacity_special": "负 available 如实显示;无购买/充值入口;页面操作不消费容量但仍继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/credits/\u003cstate\u003e/"
},
{
"page_id": "settings",
"role": "final_evidence",
"frames": {
"frame_id": "Ws5E0",
"frame_name": "05B 设置与本机数据",
"primary_task": "TASK-WP1-05",
"mapped_state_scope": "资料、本机数据、容量摘要和固定文案;加载/保存失败;full/unavailable;注销确认、处理中和返回登录"
},
"applicable_states": {
"page_id": "settings",
"actor_entry": "active 普通/内部预览账号",
"normal": "资料、本机数据、容量摘要、固定文案、注销",
"empty_loading": "资料/状态加载",
"failure_disabled": "保存失败;注销确认/处理中禁用重复提交",
"conflict_capacity_special": "full/unavailable 状态与允许动作;注销后返回登录"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/settings/\u003cstate\u003e/"
},
{
"page_id": "preview-user-variant",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "有效授权、无授权/空批次、加载、撤销/过期阻断;不出现后台权限;全局容量条"
},
"applicable_states": {
"page_id": "preview-user-variant",
"actor_entry": "有有效/撤销/过期 AssetPreviewGrant 的普通账号",
"normal": "授权批次素材显示“预览”,其余页面同普通用户",
"empty_loading": "无授权/批次空;manifest 加载",
"failure_disabled": "撤销/过期立即阻断新读取",
"conflict_capacity_special": "不出现后台入口、调点、邀请码、模型或私有内容;继承普通端全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/preview-user-variant/\u003cstate\u003e/"
},
{
"page_id": "admin-auth",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP1-04",
"mapped_state_scope": "白名单邮箱验证码、字段空/加载、非白名单、停用/移除、Resend 失败;独立 audience 与返回普通登录"
},
"applicable_states": {
"page_id": "admin-auth",
"actor_entry": "未登录后台入口",
"normal": "白名单邮箱验证码、独立 audience、返回普通登录",
"empty_loading": "字段空;发码/登录中",
"failure_disabled": "非白名单发码前阻断、停用/移除白名单、Resend 错误",
"conflict_capacity_special": "N/A:不显示普通创作或容量业务"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-auth/\u003cstate\u003e/"
},
{
"page_id": "admin-overview",
"role": "final_evidence",
"frames": {
"frame_id": "e4e2Kz",
"frame_name": "06A 后台总览",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "名额、任务、成本核对、服务/容量和审计摘要;骨架/空事件;聚合失败;三模型状态分列和待处理事项"
},
"applicable_states": {
"page_id": "admin-overview",
"actor_entry": "active super_admin",
"normal": "名额、任务、模型、点数、服务、容量、审计摘要",
"empty_loading": "无近期事件;指标骨架",
"failure_disabled": "聚合失败保留旧值和时间;敏感动作按状态禁用",
"conflict_capacity_special": "default/runtime/recommended 分列;pending_manual_review 为成本核对;容量持续条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-overview/\u003cstate\u003e/"
},
{
"page_id": "admin-users",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "脱敏列表/详情、暂停恢复/调点、空/筛选空/骨架、原因缺失和状态禁用、负 available"
},
"applicable_states": {
"page_id": "admin-users",
"actor_entry": "active super_admin",
"normal": "脱敏列表/详情、暂停恢复、调点",
"empty_loading": "无用户/筛选空;表格骨架",
"failure_disabled": "操作失败、原因缺失、状态前置禁用",
"conflict_capacity_special": "调点可使 available 为负但 reserved 不变;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-users/\u003cstate\u003e/"
},
{
"page_id": "admin-invites",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP6-01",
"mapped_state_scope": "创建/停用/期限/次数/脱敏复制、空/骨架、名额满、过期/耗尽、请求失败和幂等/CAS 结果"
},
"applicable_states": {
"page_id": "admin-invites",
"actor_entry": "active super_admin",
"normal": "创建、停用、期限/次数、脱敏复制",
"empty_loading": "无邀请码;表格骨架",
"failure_disabled": "名额满、停用/过期/耗尽不可当可用;请求失败",
"conflict_capacity_special": "CAS/幂等结果;页面操作不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-invites/\u003cstate\u003e/"
},
{
"page_id": "admin-models",
"role": "final_evidence",
"frames": {
"frame_id": "YVfVG",
"frame_name": "06B 模型配置",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "完整三模型集合、default/runtime/recommended;加载;空推荐;替代/priority 禁用;CAS 冲突和整套回滚"
},
"applicable_states": {
"page_id": "admin-models",
"actor_entry": "active super_admin",
"normal": "完整三模型集合、default/runtime/recommended 三层",
"empty_loading": "初始加载骨架;无 recommended 是合法状态",
"failure_disabled": "合法替代/priority 前置禁用;契约未验证/运行时不可用",
"conflict_capacity_special": "config_set CAS 冲突、完整集合原子回滚;仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-models/\u003cstate\u003e/"
},
{
"page_id": "admin-assets",
"role": "final_evidence",
"frames": {
"frame_id": "A28V3c",
"frame_name": "06C 素材与历史清理",
"primary_task": "TASK-WP5-06",
"mapped_state_scope": "上传/版本/候选;无上传/无候选;格式/编译/权限失败;full/unavailable;引用冲突、排队、物理删除和重计量"
},
"applicable_states": {
"page_id": "admin-assets",
"actor_entry": "active super_admin",
"normal": "普通贴纸、资源版本/发布、历史清理",
"empty_loading": "无上传素材/无候选;列表/处理加载",
"failure_disabled": "格式/编译失败;权限、文件状态禁用",
"conflict_capacity_special": "stable ID/version 冲突;full/unavailable 阻断上传;引用冲突/排队/重计量"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-assets/\u003cstate\u003e/"
},
{
"page_id": "admin-preview",
"role": "final_evidence",
"frames": {
"frame_id": "UIDesign-only",
"frame_name": "无独立画板",
"primary_task": "TASK-WP5-07",
"mapped_state_scope": "批次、模板状态、授权/撤销/到期、空/骨架、非法转换/发布失败;不出现 P0-B 全量开放"
},
"applicable_states": {
"page_id": "admin-preview",
"actor_entry": "active super_admin",
"normal": "批次、模板状态、账号授权/撤销/到期",
"empty_loading": "无批次/授权;表格骨架",
"failure_disabled": "非法状态转换、过期、发布校验失败",
"conflict_capacity_special": "授权不改变角色;P0-B 全量开放不可在 P0-A 出现;继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-preview/\u003cstate\u003e/"
},
{
"page_id": "admin-generations",
"role": "final_evidence",
"frames": {
"frame_id": "OnsiT",
"frame_name": "06D 生成记录与私有告知",
"primary_task": "TASK-WP6-02",
"mapped_state_scope": "默认隐藏正文;身份+版本告知;逐次打开;空记录/审计写入加载;428、审计失败、升版重阻断"
},
"applicable_states": {
"page_id": "admin-generations",
"actor_entry": "active super_admin",
"normal": "默认安全摘要、告知、逐次打开",
"empty_loading": "无记录;列表/审计写入加载",
"failure_disabled": "未确认 428、审计失败不打开、权限禁用",
"conflict_capacity_special": "告知升版重阻断;每次打开先独立审计;页面读取不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-generations/\u003cstate\u003e/"
},
{
"page_id": "admin-services-storage",
"role": "final_evidence",
"frames": {
"frame_id": "L3lde2",
"frame_name": "06E 服务与存储",
"primary_task": "TASK-WP6-05",
"mapped_state_scope": "Resend/高德/网关/Worker/LocalDataRoot;指标加载;paused/degraded/unavailable;恢复前置、清理排队和重计量"
},
"applicable_states": {
"page_id": "admin-services-storage",
"actor_entry": "active super_admin",
"normal": "Resend/高德/网关/Worker/LocalDataRoot 状态与允许动作",
"empty_loading": "指标加载;无告警",
"failure_disabled": "paused/degraded/unavailable;不合法恢复/提高上限禁用",
"conflict_capacity_special": "full/unavailable、清理排队和物理重计量;不显示绝对路径"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-services-storage/\u003cstate\u003e/"
},
{
"page_id": "admin-audit",
"role": "final_evidence",
"frames": {
"frame_id": "DlCpN",
"frame_name": "06F 私有内容访问审计",
"primary_task": "TASK-WP6-04",
"mapped_state_scope": "两类独立审计、游标和 180 天;空/加载;查询失败;不可编辑删除;无正文、图片、密钥和路径"
},
"applicable_states": {
"page_id": "admin-audit",
"actor_entry": "active super_admin",
"normal": "后台操作与私有访问两类独立页/标签",
"empty_loading": "无记录;游标加载",
"failure_disabled": "查询失败保留旧结果;无修改/人工删除动作",
"conflict_capacity_special": "180 天保留;正文、图片、密钥和路径不出现;页面读取不消费容量但仍继承后台全局容量条"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/admin-audit/\u003cstate\u003e/"
},
{
"page_id": "system-ui",
"role": "final_evidence",
"frames": {
"frame_id": "awt96",
"frame_name": "07B Windows 辅助系统界面",
"primary_task": "TASK-WP0-07",
"mapped_state_scope": "托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作"
},
"applicable_states": {
"page_id": "system-ui",
"actor_entry": "本机托盘/Supervisor,无产品角色",
"normal": "托盘、运行状态、打开 Dada、诊断、退出",
"empty_loading": "启动中;N/A 业务空态",
"failure_disabled": "启动失败、端口占用、API/Worker degraded,动作严格受限",
"conflict_capacity_special": "full/unavailable 只作脱敏告警;固定端口不动态切换"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/system-ui/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
},
{
"task_id": "TASK-WP7-06",
"work_package": "WP-7",
"title": "追踪闭环与最终 AC 预冻结验收",
"dependencies": {
"source_text": "TASK-WP7-01 至 TASK-WP7-05",
"task_ids": [
"TASK-WP7-01",
"TASK-WP7-05"
],
"work_packages": [
]
},
"requirements": [
"NFR-05"
],
"acceptance_criteria": [
"AC-01",
"AC-02",
"AC-03",
"AC-04",
"AC-05",
"AC-06",
"AC-07",
"AC-09",
"AC-10",
"AC-11",
"AC-12",
"AC-13",
"AC-14",
"AC-15",
"AC-16",
"AC-17",
"AC-18",
"AC-19",
"AC-20",
"AC-21",
"AC-22",
"AC-23",
"AC-24",
"AC-25",
"AC-27",
"AC-28",
"AC-29",
"AC-30",
"AC-31",
"AC-32",
"AC-33",
"AC-34",
"AC-35",
"AC-36",
"AC-38",
"AC-39",
"AC-40",
"AC-41",
"AC-42",
"AC-43",
"AC-44",
"AC-45",
"AC-46",
"AC-47",
"AC-48",
"AC-49",
"AC-50",
"AC-51",
"AC-52",
"AC-53",
"AC-55",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-05、52 当前 AC、109 需求 ID、13 模块、19 契约、9 错误"
],
"acceptance_scope_notes": [
"NFR-05、52 当前 AC、109 需求 ID、13 模块、19 契约、9 错误"
],
"fixture_ids": [
],
"development_plan_sections": [
"14 测试、监控与 AC 追踪",
"15 WP-7",
"19 完成定义"
],
"modules": [
"release-validation",
"trace-validator"
],
"implementation_boundary": "运行 test:all 和 validate:tdd-trace;汇总候选制品、外部、UI/视觉/性能证据;用固定 super_admin/普通账号及正常链创建临时第二普通账号完成 52 AC;确认候选浏览器字段在验收期间未漂移",
"parent_families": [
"TDD-WP7-AC-001"
],
"case_ids": [
"TDD-WP7-AC-001-trace-structure"
],
"first_red": [
{
"family_id": "TDD-WP7-AC-001",
"assertion": "52 项 AC、89 个测试族或 117 个规范 case 缺失,重复主责、孤儿 case 或用 P0-B 结果冒充"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-AC-001",
"assertion": "第 12 节矩阵每项一个主责且证据齐全;89/89 父族有 case 且派生属性完整;未来四项不计入;四份全局来源哈希未变,UI 参考变化按第 1.2.2 节局部重验"
}
],
"task_green_gate": "52/52 当前 AC passed109 需求 ID、13 模块、19 契约、9 错误、89/89 父族、117/117 case 完整;未来四项不计入;未通过时不得写最终 RELEASE.json",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-validation, trace-validator.",
"must_preserve": [
"PRD product semantics and P0-A boundary"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"UNIT",
"MANUAL"
],
"validation_commands": [
"pnpm test:unit",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-AC-001-trace-structure/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
],
"ui_scope_reason": "No direct UI coverage-unit ownership; validate only the listed module and case boundaries."
},
{
"task_id": "TASK-WP7-07",
"work_package": "WP-7",
"title": "最终 RELEASE 冻结、制品生成与泄漏扫描",
"dependencies": {
"source_text": "TASK-WP7-06",
"task_ids": [
"TASK-WP7-06"
],
"work_packages": [
]
},
"requirements": [
"NFR-01",
"NFR-09",
"PRIV-01",
"PRIV-02"
],
"acceptance_criteria": [
"AC-24",
"AC-41",
"AC-48",
"AC-56"
],
"acceptance_criteria_role": "direct-or-supporting-as-listed-by-normative-cases",
"product_contracts": [
],
"requirement_ac_sources": [
"NFR-01、09、AC-24、41",
"PRIV-01、02、NFR-09、AC-41、48、56"
],
"acceptance_scope_notes": [
],
"fixture_ids": [
],
"development_plan_sections": [
"3.1 便携包布局",
"3.6 浏览器支持硬门禁",
"12.3 审计与敏感信息",
"15 WP-7",
"19 完成定义"
],
"modules": [
"release-ci",
"trace-validator",
"security-scanner",
"supervisor",
"web",
"api",
"worker"
],
"implementation_boundary": "验收通过后把未漂移的候选浏览器记录写入最终 RELEASE.json,生成最终 ZIP、SHA-256 和 START-HERE.txt;把 RELEASE SHA-256 写入最终 evidence.json;扫描源码、Git、最终 ZIP、DB 配置、manifest、日志、截图、trace/evidence,并执行最终 package/support-gate smoke",
"parent_families": [
"TDD-WP7-REL-001",
"TDD-WP7-SEC-001"
],
"case_ids": [
"TDD-WP7-REL-001-final-release-record",
"TDD-WP7-SEC-001-artifact-leak-scan"
],
"first_red": [
{
"family_id": "TDD-WP7-REL-001",
"assertion": "RELEASE.json 缺失/漂移、ZIP 哈希或真实浏览器未验收"
},
{
"family_id": "TDD-WP7-SEC-001",
"assertion": "制品、日志、DB 配置、manifest 或文档出现真实敏感值/用户路径"
}
],
"minimal_green": [
{
"family_id": "TDD-WP7-REL-001",
"assertion": "发布记录、制品、START-HERE、Chrome/Edge full version、固定 major 和 Windows build 一致"
},
{
"family_id": "TDD-WP7-SEC-001",
"assertion": "全制品扫描零命中;凭据只在 Windows Credential Manager;诊断脱敏"
}
],
"task_green_gate": "最终记录、制品、Windows build、两个 full version、固定 major 和端口一致;零真实敏感值/用户绝对路径;最终写入或扫描失败时不得发布,且不能沿用候选 passed 状态冒充最终冻结",
"refactor_scope": {
"allowed": "Only internal deduplication and structural improvement inside modules: release-ci, trace-validator, security-scanner, supervisor, web, api, worker.",
"must_preserve": [
"PRD product semantics and P0-A boundary",
"UIDesign page states, message_key actions, focus, layout and visual/performance thresholds",
"credential, path, log, package and diagnostic redaction boundaries"
],
"forbidden": [
"new product routes, roles, states, fallback behavior or configuration",
"technology replacement or cross-module ownership change",
"weakening or deleting any assigned case assertion"
]
},
"layers": [
"PKG-SEC",
"E2E",
"MANUAL"
],
"validation_commands": [
"pnpm test:security",
"pnpm test:package",
"pnpm test:e2e",
"pnpm validate:tdd-trace"
],
"evidence_directories": [
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-REL-001-final-release-record/",
"artifacts/tdd/\u003crun_id\u003e/cases/TDD-WP7-SEC-001-artifact-leak-scan/"
],
"automation": [
"automated",
"manual_review"
],
"release_gate": [
"release:P0-A"
],
"ui_scope": [
{
"page_id": "system-ui",
"role": "final_evidence",
"frames": {
"frame_id": "awt96",
"frame_name": "07B Windows 辅助系统界面",
"primary_task": "TASK-WP0-07",
"mapped_state_scope": "托盘/启动中/ready;启动失败、端口占用、API/Worker degraded;脱敏诊断;full/unavailable 告警与受限动作"
},
"applicable_states": {
"page_id": "system-ui",
"actor_entry": "本机托盘/Supervisor,无产品角色",
"normal": "托盘、运行状态、打开 Dada、诊断、退出",
"empty_loading": "启动中;N/A 业务空态",
"failure_disabled": "启动失败、端口占用、API/Worker degraded,动作严格受限",
"conflict_capacity_special": "full/unavailable 只作脱敏告警;固定端口不动态切换"
},
"evidence_directory": "artifacts/tdd/\u003crun_id\u003e/ui/system-ui/\u003cstate\u003e/"
}
],
"ui_scope_reason": null
}
],
"case_catalog": [
{
"case_id": "TDD-WP4-TXT-002-font-metrics-ranges",
"parent_family": "TDD-WP4-TXT-002",
"requirement_ac_source": "TEXT-07 至 14、NFR-02、AC-11、12",
"fixture_ids": [
],
"fixture_and_preconditions": "真实归档字体/缺失字体、最长文字、属性边界/步长",
"numbered_steps": "1. 等待 FontFace ready2. 参数化字号/缩放/行距/字距/描边/颜色/背景透明度;3. 完成;4. 缺字体加载;5. 重开/导出",
"expected_response_ui": "字号与控制柄同步,重新测量不裁切;范围步长精确;缺字体模板 unavailable;背景透明度不影响文字",
"expected_db_files": "完成一次撤销/保存;缺字体分支无 Canvas 新元素",
"forbidden_side_effects": "不静默系统字体回退、不把背景透明度应用文字、不超范围取值",
"evidence_files": "font-load.json、canvas-state.json、pixel-diff.json、trace.zip"
},
{
"case_id": "TDD-WP2-PROJ-004-stale-tab",
"parent_family": "TDD-WP2-PROJ-004",
"requirement_ac_source": "PROJECT-07、AC-36 P0-A 子集",
"fixture_ids": [
"FX-PROJECT-CONFLICT"
],
"fixture_and_preconditions": "FX-PROJECT-CONFLICT,标签 A/B 均基于 N",
"numbered_steps": "1. A 保存到 N+12. B 以 N 保存;3. B 尝试编辑/覆盖/另存副本",
"expected_response_ui": "B 返回 412 和最新安全版本摘要;立即只读 conflicted,只显示一次本地导出与刷新",
"expected_db_files": "仅 A 状态写入;B 的 state_version/save_status/latest_exports/project 数量不变",
"forbidden_side_effects": "B 不自动重试覆盖、不 merge、不另存项目、不恢复自动保存",
"evidence_files": "两标签 response.json、db-diff.json、trace.zip、screenshots/conflicted.png"
},
{
"case_id": "TDD-WP6-PRIV-001-ack",
"parent_family": "TDD-WP6-PRIV-001",
"requirement_ac_source": "ADMIN-05、17.1、AC-25",
"fixture_ids": [
"FX-ACTOR-ADMIN-A"
],
"fixture_and_preconditions": "FX-ACTOR-ADMIN-A 未确认 current notice v1",
"numbered_steps": "1. 进入私有区域;2. 得到 4283. 以 expected v1 调 notice ack4. 重试区域摘要",
"expected_response_ui": "首次 428 PRIVATE_CONTENT_NOTICE_ACK_REQUIRED 只含 version/message_keyack 成功后区域仅显示安全摘要",
"expected_db_files": "只更新该 admin 的 notice version/ack time;幂等重试不新增语义变化",
"forbidden_side_effects": "ack 不创建 PrivateContentAccessLog;不返回正文/图片;不写 Cookie/localStorage 作为真相",
"evidence_files": "response.json、db-diff.json、trace.zip、screenshots/notice.png"
},
{
"case_id": "TDD-WP6-PRIV-001-persistence",
"parent_family": "TDD-WP6-PRIV-001",
"requirement_ac_source": "ADMIN-05、AC-25",
"fixture_ids": [
],
"fixture_and_preconditions": "admin A 已确认 v1",
"numbered_steps": "1. 新标签;2. API 重启;3. 浏览器重启/重登;4. 在真实 Chrome 与 Edge 登录同一 admin",
"expected_response_ui": "同版本均不重复提示,session/bootstrap 计算 notice_acknowledged=true",
"expected_db_files": "UserProfile ack 字段不因浏览器/会话改变;每次 session 独立但 ack 不重复写",
"forbidden_side_effects": "Cookie/session/localStorage/IndexedDB 清空不使服务端遗忘;跨管理员不共享 ack",
"evidence_files": "每环境 response.json、db-diff.json、trace.zip、screenshots/ack-persisted.png"
},
{
"case_id": "TDD-WP5-PREV-001-grant-lifecycle",
"parent_family": "TDD-WP5-PREV-001",
"requirement_ac_source": "ADMIN-07、17.13、AC-42、48",
"fixture_ids": [
],
"fixture_and_preconditions": "普通账号,active/revoked/expired grant,已有项目引用预览版本",
"numbered_steps": "1. admin 授权批次;2. 用户读取/添加;3. 撤销/到期;4. 再读取/添加;5. 重开已有项目",
"expected_response_ui": "active 时只见授权项;撤销/到期立即阻断新读取/添加;已有项目按保存版本渲染",
"expected_db_files": "grant 状态/审计更新;UserProfile.role 不变;项目引用版本不改写",
"forbidden_side_effects": "不出现后台权限、不把 preview 写 public manifest/cache、不因撤销破坏既有项目",
"evidence_files": "response.json、db-diff.json、cache-enumeration.json、trace.zip"
},
{
"case_id": "TDD-WP5-COL-001-four-layouts",
"parent_family": "TDD-WP5-COL-001",
"requirement_ac_source": "COL-01 至 05、AC-15 P0-A 子集、16、32",
"fixture_ids": [
],
"fixture_and_preconditions": "COLOR001/002/008/016 与同一五色 fixture",
"numbered_steps": "1. 渲染四卡;2. 改裁剪/滤镜;3. 换底图;4. 尝试访问其他色卡",
"expected_response_ui": "四布局消费完全相同五色;刷新规则一致;其他色卡不可发现",
"expected_db_files": "只保存稳定 ID/version/五色 snapshot",
"forbidden_side_effects": "不启用其余 12 色卡、不各自重新提色、不联网读取图片",
"evidence_files": "palette.json、pixel-diff.json、manifest.json"
},
{
"case_id": "TDD-WP2-PROJ-002-save-failure-recovery",
"parent_family": "TDD-WP2-PROJ-002",
"requirement_ac_source": "PROJECT-04、05、EXPORT-06、AC-20、35",
"fixture_ids": [
],
"fixture_and_preconditions": "saved N;页面创建 dirty;参数化网络失败、storage unavailable、强制刷新/崩溃",
"numbered_steps": "1. 触发保存失败;2. 检查 failed/离开弹层;3. 页面保持时恢复并重试;4. 另一路强制退出后重开;5. 枚举浏览器存储",
"expected_response_ui": "失败不显示 saved;正常恢复可保存;强制退出只恢复后端 N 且撤销栈为空",
"expected_db_files": "失败期间 DB 不变;成功重试才 N+1;浏览器持久存储无草稿/提示词/私有引用",
"forbidden_side_effects": "不把失败当成功;不在关闭后恢复内存草稿;不让 SSE 代替 REST 真相",
"evidence_files": "response.json、db-diff.json、cache-enumeration.json、trace.zip、screenshots/save-failed.png"
},
{
"case_id": "TDD-WP6-PRIV-001-version-bump",
"parent_family": "TDD-WP6-PRIV-001",
"requirement_ac_source": "ADMIN-05、AC-25",
"fixture_ids": [
],
"fixture_and_preconditions": "admin A/B 已确认 v1,应用 current notice 切到 v2",
"numbered_steps": "1. 两个 admin 分别进入区域;2. 尝试用 expected v1 ack3. 读取 v2 并确认",
"expected_response_ui": "两者重新 428;旧 expected version 失败且要求重读;各自确认 v2 后可进入摘要",
"expected_db_files": "旧 ack 保留历史语义但当前字段仅在正确 v2 ack 后更新;A/B 独立",
"forbidden_side_effects": "不以旧确认放行;不因 A 确认替 B 确认;不返回私有正文",
"evidence_files": "response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP0-DEP-001-frozen-toolchain",
"parent_family": "TDD-WP0-DEP-001",
"requirement_ac_source": "NFR-09、DevelopmentPlan 2.1、13.1",
"fixture_ids": [
],
"fixture_and_preconditions": "冻结 lockfile、干净离线依赖缓存、win-x64 runner",
"numbered_steps": "1. 严格按 lockfile 安装;2. 编译 TypeScript3. 最小加载 React/Fabric/Fastify/better-sqlite34. 用随包 Node 运行 native smoke",
"expected_response_ui": "所有命令退出 0,版本与 lockfile/DevelopmentPlan 一致",
"expected_db_files": "只生成声明的构建缓存与报告;业务 DB/LocalDataRoot 无变化",
"forbidden_side_effects": "不升级/替换依赖、技术栈或 native 模块;不联网漂移解析版本",
"evidence_files": "commands.json、dependency-tree.json、native-smoke.json"
},
{
"case_id": "TDD-WP0-STO-002-equal-limit",
"parent_family": "TDD-WP0-STO-002",
"requirement_ac_source": "17.19、NFR-05、AC-55",
"fixture_ids": [
],
"fixture_and_preconditions": "已计量+活动预留=5,368,709,119,预计写 1 字节,可写目录",
"numbered_steps": "1. 调受管二进制写入预检;2. 提交文件/DB3. 重读 storage state",
"expected_response_ui": "不得返回 507;写入成功后 notice/status 为 full",
"expected_db_files": "建立并消费一份 reservationmanaged bytes 精确为 5,368,709,120managed file 已提交;last_measured_at 更新",
"forbidden_side_effects": "不用 \u003e= 拒绝;不回滚已成功等号写入;不调用自动清理",
"evidence_files": "response.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP1-AUTH-004-session-revocation",
"parent_family": "TDD-WP1-AUTH-004",
"requirement_ac_source": "AUTH-04 至 07、AC-22、33、49",
"fixture_ids": [
],
"fixture_and_preconditions": "每个参数使用独立库:active 普通用户或 active super_admin 各有 2 个 session",
"numbered_steps": "1. 验证正常 session2. 分别触发普通用户 logout/暂停/注销或管理员 logout/停用/移出白名单;3. 再调受保护 API",
"expected_response_ui": "撤销前成功;每种撤销后均为 401 或相应身份入口,已打开页面退出旧数据;两种 audience 不能互用",
"expected_db_files": "相应主体全部 session revoked_at 在同一事务写入;账号/白名单状态按触发操作变化",
"forbidden_side_effects": "不只撤销当前浏览器;不把普通 session 提升为后台 session;不保留可交互私有响应",
"evidence_files": "每参数 response.json、db-diff.json、trace.zip、screenshots/revoked.png"
},
{
"case_id": "TDD-WP0-API-001-schema-envelope",
"parent_family": "TDD-WP0-API-001",
"requirement_ac_source": "NFR-05、DevelopmentPlan 6.1、6.6",
"fixture_ids": [
],
"fixture_and_preconditions": "生成 TypeBox/OpenAPI/客户端 snapshot;合法与非法 fixture",
"numbered_steps": "1. 生成 OpenAPI 3.12. 比较 snapshot3. 对每个 operation 注入合法/非法请求;4. 校验错误信封和 correlation ID",
"expected_response_ui": "Schema/运行/客户端一致;非法响应使用冻结 HTTP/code/message_key/details 白名单",
"expected_db_files": "只读场景 DB 无变化;写场景失败按各 operation 事务回滚",
"forbidden_side_effects": "不出现未声明字段/枚举、供应商原文、堆栈、路径或缺失 correlation ID",
"evidence_files": "openapi.json、snapshot-diff.json、response.json、redaction.json"
},
{
"case_id": "TDD-WP2-ERR-001-unknown-retryable",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-09、16、17.18、AC-04、53",
"fixture_ids": [
],
"fixture_and_preconditions": "独立 unknown_retryable fixture;已提交任务",
"numbered_steps": "1. 触发未知临时错误;2. 检查唯一下一步为“稍后重试”;3. 在受控条件恢复后点击;4. 查询任务和脱敏诊断",
"expected_response_ui": "原任务 failed/category=unknown_retryable;只提供“稍后重试”;动作后同项目新增一个 GenerationJob",
"expected_db_files": "原任务 release 一次、无 output;新任务独立 reserve;只保留非敏感诊断",
"forbidden_side_effects": "不显示“使用原输入重试”、修改输入、选模型或联系管理员;不泄漏原始错误或自动重试",
"evidence_files": "response.json、worker-events.json、db-diff.json、screenshots/unknown-retryable.png"
},
{
"case_id": "TDD-WP0-BND-001-loopback-origin",
"parent_family": "TDD-WP0-BND-001",
"requirement_ac_source": "NFR-09、AC-24",
"fixture_ids": [
],
"fixture_and_preconditions": "API 未启动;回环、局域网、错误 Host/Origin 和预检请求参数",
"numbered_steps": "1. 启动产品包;2. 检查监听地址;3. 从允许/拒绝地址请求;4. 发送跨源/CORS 预检",
"expected_response_ui": "只接受 127.0.0.1:43121 与同源;其他路径连接失败或按门禁拒绝",
"expected_db_files": "无业务表、会话、外部用量变化",
"forbidden_side_effects": "不监听 0.0.0.0/IPv6 wildcard,不建防火墙入站规则,不返回 CORS 放行头",
"evidence_files": "socket-listeners.json、response.json、firewall-diff.json"
},
{
"case_id": "TDD-WP2-GEN-003-stale-config",
"parent_family": "TDD-WP2-GEN-003",
"requirement_ac_source": "GEN-15、ADMIN-03、AC-30",
"fixture_ids": [
],
"fixture_and_preconditions": "用户已确认旧 model_config_version/cost;管理员原子发布新集合",
"numbered_steps": "1. 旧页面直接提交;2. 读取 412 摘要;3. 重新 GET models 并明确确认;4. 再提交",
"expected_response_ui": "第一次 412 且要求重新确认;第二次才可创建任务",
"expected_db_files": "第一次 job/project/reference/reserve/outbox 全无变化;第二次按新快照创建",
"forbidden_side_effects": "第一次不上游、不持久化参考图、不冻结;不自动替用户切推荐模型",
"evidence_files": "response.json、db-diff.json、external-calls.json、trace.zip"
},
{
"case_id": "TDD-WP2-ERR-001-unknown-non-retryable",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-09、16、17.18、AC-04、53",
"fixture_ids": [
],
"fixture_and_preconditions": "独立 unknown_non_retryable fixture;已提交任务",
"numbered_steps": "1. 触发未知不可重试错误;2. 检查唯一下一步为“联系管理员”;3. 尝试寻找或调用重复提交动作;4. 查询任务",
"expected_response_ui": "原任务 failed/category=unknown_non_retryable;只提供“联系管理员”,无重试或修改入口",
"expected_db_files": "release 一次;无 output;原草稿保留但本 case 不创建新 job",
"forbidden_side_effects": "不自动重试、不循环轮询制造新任务、不降级为 unknown_retryable、不提供其他类别动作",
"evidence_files": "response.json、worker-events.json、db-diff.json、screenshots/unknown-non-retryable.png"
},
{
"case_id": "TDD-WP2-PROJ-004-conflict-export-once",
"parent_family": "TDD-WP2-PROJ-004",
"requirement_ac_source": "PROJECT-07、EXPORT-05、AC-36 P0-A 子集",
"fixture_ids": [
],
"fixture_and_preconditions": "conflicted 标签页,conflict_export_used=false",
"numbered_steps": "1. 本地导出一次(成功和失败各参数);2. 再次尝试;3. 刷新最新版本",
"expected_response_ui": "第一次结束后立即禁用再次导出;结果明确“仅下载本页版本,未写入项目”;刷新到后端最新状态",
"expected_db_files": "所有步骤不调用 latest APIprojects/project_states/latest_exports 无变化;flag 只在页面内存",
"forbidden_side_effects": "不因第一次失败允许第二次;不覆盖后端、不另存副本、不把 flag 持久化",
"evidence_files": "network-timeline.json、db-diff.json、trace.zip、screenshots/conflict-export.png"
},
{
"case_id": "TDD-WP1-SLOT-001-stage-limit",
"parent_family": "TDD-WP1-SLOT-001",
"requirement_ac_source": "AUTH-01、NFR-04、AC-32、45",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化 9/10 个 active+suspended 普通账号、deleted、多个 super_admin",
"numbered_steps": "1. 发码前尝试第 10/11 人;2. 在发码后并发占满名额再完成;3. 删除普通账号再注册",
"expected_response_ui": "第 10 人可成功,第 11 人发码/完成均阻断;deleted 释放;super_admin 不占名额",
"expected_db_files": "成功时计数/账号/邀请原子;失败零变化;累计统计保留 deleted",
"forbidden_side_effects": "不把 suspended/deleted/super_admin 计错,不通过并发超 10,不让失败占邀请码",
"evidence_files": "response.json、db-diff.json、concurrency-trace.json"
},
{
"case_id": "TDD-WP6-SVC-001-hard-quota",
"parent_family": "TDD-WP6-SVC-001",
"requirement_ac_source": "ADMIN-05、08、NFR-08、17.15、AC-47",
"fixture_ids": [
],
"fixture_and_preconditions": "Resend 日 79/80、月 2399/2400;高德 999/1000provider 异常;已有 session",
"numbered_steps": "1. 并发领取最后额度;2. 尝试下一次;3. 注入 provider 故障;4. 检查登录/注册/DYN004/现有 session",
"expected_response_ui": "最后一份已领取调用可结束,后续不调用;状态 paused_quota/provider;已有 session 继续;手动地点继续",
"expected_db_files": "external_service_usage 事务计数/status/reason 更新;失败不创建验证码假成功",
"forbidden_side_effects": "不发送第 81/超月/第 1001 次,不影响已有 session,不切付费/备用,不建运行时邮件质量状态",
"evidence_files": "response.json、db-diff.json、external-calls.json、concurrency-trace.json"
},
{
"case_id": "TDD-WP2-GEN-002-success",
"parent_family": "TDD-WP2-GEN-002",
"requirement_ac_source": "GEN-06、08、11、CREDIT-03、AC-03",
"fixture_ids": [
"FX-GATEWAY-SYNC"
],
"fixture_and_preconditions": "上一 case 的 queued job + FX-GATEWAY-SYNC",
"numbered_steps": "1. Worker 领取;2. 调上游并验证单图;3. 落盘;4. 查询任务/项目",
"expected_response_ui": "queued→running→succeeded;项目可进入编辑且历史新增一图",
"expected_db_files": "lease/heartbeat、output managed file、output_asset、generation_commit、project history/draft_state 一次提交;容量增加实测字节",
"forbidden_side_effects": "不在文件安全落盘前 succeeded;不保存多图;不重复扣点;不改变项目比例",
"evidence_files": "worker-events.json、db-diff.json、fs-after.json、screenshots/succeeded.png"
},
{
"case_id": "TDD-WP2-EXP-001-result-matrix",
"parent_family": "TDD-WP2-EXP-001",
"requirement_ac_source": "EXPORT-05、06、AC-35、55",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化:合成失败、下载失败、project 保存失败、latest 持久化失败、storage full/unavailable",
"numbered_steps": "1. 在 UIDesign 四结果组合及存储状态下导出;2. 记录下载/上传调用顺序;3. 重读项目/latest",
"expected_response_ui": "分别显示冻结结果文案;可合成时允许规定本地下载;下载失败可复用同一次合成;后端失败明确 latest 未更新",
"expected_db_files": "失败分支保留旧 latestproject 保存失败不写新 statelatest 失败不写 latest/managed file;成功分支才更新",
"forbidden_side_effects": "不撤回已下载文件;不以本地下载覆盖后端记录;不显示双成功假状态;不把 Blob 存浏览器持久缓存",
"evidence_files": "每参数 network-timeline.json、response.json、db-diff.json、trace.zip、screenshots/result.png"
},
{
"case_id": "TDD-WP0-STO-003-unavailable-matrix",
"parent_family": "TDD-WP0-STO-003",
"requirement_ac_source": "17.19、NFR-05、AC-35、55",
"fixture_ids": [
],
"fixture_and_preconditions": "LocalDataRoot 不可写,再参数化 SQLite 仍可写/不可写",
"numbered_steps": "1. 尝试 project JSON 保存、生成和二进制写;2. 读取/下载/仅下载;3. 尝试删除/清理",
"expected_response_ui": "新增后端写全部失败且 UI 为 failed/unavailable;读取、下载和可行的仅下载保留;SQLite 不可写时删除/排队明确未提交",
"expected_db_files": "不更新 state_version/managed bytes/latest/job/ledgerSQLite 可写时允许规定逻辑删除/队列,反之无 DB 变化",
"forbidden_side_effects": "不显示已保存;不上游;不把内存草稿写浏览器持久存储;不伪造清理完成",
"evidence_files": "response.json、db-diff.json、trace.zip、screenshots/unavailable.png"
},
{
"case_id": "TDD-WP7-EXT-001-three-real-models",
"parent_family": "TDD-WP7-EXT-001",
"requirement_ac_source": "GEN-13、AC-40、41",
"fixture_ids": [
],
"fixture_and_preconditions": "三模型各自真实凭据/配置,显式执行确认",
"numbered_steps": "1. 显示模型/次数/额度;2. 分别执行纯文字、参考图、四比例、sync/async/查询/响应/错误;3. 脱敏;4. 绑定 config_version",
"expected_response_ui": "三模型独立完整矩阵通过才解除;任一缺项保持 externally_blocked",
"expected_db_files": "只写对应模型验证证据/runtime 状态和允许审计;测试任务/点数按隔离规则",
"forbidden_side_effects": "不共享证据、不自动充值、不保留真实输入/图片/原始响应、不在普通 CI 调用",
"evidence_files": "每模型 contract-matrix.json、external-calls.json、redaction.json、manual-review.json"
},
{
"case_id": "TDD-WP7-SEC-001-artifact-leak-scan",
"parent_family": "TDD-WP7-SEC-001",
"requirement_ac_source": "PRIV-01、02、NFR-09、AC-41、48、56",
"fixture_ids": [
],
"fixture_and_preconditions": "ZIP、源码、Git、DB 配置、manifest、日志、截图、trace/evidence 全集合;秘密 trap",
"numbered_steps": "1. 解包并扫描文本/二进制/元数据;2. 检查 Windows 用户名/绝对路径;3. 检查缓存/凭据位置;4. 人工复核命中",
"expected_response_ui": "真实敏感值和硬编码用户路径零命中;凭据仅 Credential Manager;诊断通过同一扫描",
"expected_db_files": "只生成扫描报告;不修改被扫描制品",
"forbidden_side_effects": "不把 allowlist/HMAC/验证码/session/提示词/图片/原始错误写证据,不用删除报告掩盖命中",
"evidence_files": "scan-report.json、allowlist.json、manual-review.json"
},
{
"case_id": "TDD-WP1-CFG-001-secure-revision",
"parent_family": "TDD-WP1-CFG-001",
"requirement_ac_source": "AUTH-07、ADMIN-09、AC-49、50",
"fixture_ids": [
],
"fixture_and_preconditions": "current applied revision N;参数化完整 N+1、HMAC/凭据缺失、身份冲突",
"numbered_steps": "1. 离线写候选安全配置;2. API 启动应用;3. 查询 apply state/session4. 注入失败重试",
"expected_response_ui": "完整配置原子生效并推进 revision;失败保持 N 并阻止受影响入口",
"expected_db_files": "成功同事务更新 apply state、撤销受影响 session、写 system/backend_secure_config 审计;失败全回滚",
"forbidden_side_effects": "不写白名单/HMAC/pepper/人员身份/凭据,不出现半生效配置",
"evidence_files": "config-result.json、db-diff.json、redaction.json"
},
{
"case_id": "TDD-WP0-BRW-001-real-supported",
"parent_family": "TDD-WP0-BRW-001",
"requirement_ac_source": "NFR-01、AC-24、41",
"fixture_ids": [
],
"fixture_and_preconditions": "最终 RELEASE.json;真实 Chrome/Edge 独立 profile",
"numbered_steps": "1. 分别启动记录的 full version2. 完成 UA-CH support check3. 进入 bootstrap/login4. 复查产品 API",
"expected_response_ui": "两浏览器均通过并建立短期支持 cookie,产品 API 每次复核品牌/major",
"expected_db_files": "仅门禁所需非敏感记录/cookie;不建用户 session",
"forbidden_side_effects": "不用 Playwright Chromium、伪 UA 或前一 major 代替;不联网查询当前版本",
"evidence_files": "每浏览器 environment.json、response.json、trace.zip、screenshots/supported.png"
},
{
"case_id": "TDD-WP3-ADP-001-per-model-contract",
"parent_family": "TDD-WP3-ADP-001",
"requirement_ac_source": "GEN-01、02、05、06、13、16、AC-40",
"fixture_ids": [
],
"fixture_and_preconditions": "三个模型各自独立 mock/真实受控账号和脱敏 fixture",
"numbered_steps": "1. 每模型分别执行纯文字、合法参考图、四比例;2. 覆盖同步/异步与查询;3. 验证 MIME/尺寸/单图;4. 注入九类映射",
"expected_response_ui": "每模型只按自身已证实协议成功;结果恰一图;错误映射到固定 category",
"expected_db_files": "真实验证只写对应 model/config_version 的 evidence 状态;任务/点数按独立用例结算",
"forbidden_side_effects": "不从一个模型推断另两个、不共享 verified 标记、不接受多图/未知字段、不记录原始响应",
"evidence_files": "每模型 contract-matrix.json、response.json、external-calls.json、redaction.json"
},
{
"case_id": "TDD-WP6-ADM-001-role-and-summary",
"parent_family": "TDD-WP6-ADM-001",
"requirement_ac_source": "ADMIN-01、02、04、08、AC-25、49",
"fixture_ids": [
],
"fixture_and_preconditions": "active/suspended super_admin、普通/预览账号,后台安全摘要 fixture",
"numbered_steps": "1. 各主体请求后台页/API;2. 停用 admin 后复用旧页面;3. 浏览列表/详情;4. 检查私有默认",
"expected_response_ui": "仅 active super_admin 可进入;停用立即退出;默认只见脱敏元数据,普通/预览无后台入口",
"expected_db_files": "读取无业务变化;拒绝分支无审计/私有读取;规定登录审计独立存在",
"forbidden_side_effects": "不共享普通/后台 session,不因预览 grant 获后台,不默认返回提示词/图片/密钥",
"evidence_files": "每主体 response.json、db-access.json、trace.zip、screenshots/admin-denied.png"
},
{
"case_id": "TDD-WP1-ADM-001-admin-auth-boundary",
"parent_family": "TDD-WP1-ADM-001",
"requirement_ac_source": "AUTH-07、AC-49",
"fixture_ids": [
],
"fixture_and_preconditions": "白名单/非白名单邮箱、已存在普通账号冲突、两个 admin、全部停用状态",
"numbered_steps": "1. 后台发码;2. 首次验证/后续登录;3. 尝试普通 session 访问后台;4. 停用全部并尝试自助恢复",
"expected_response_ui": "非白名单发码前拒绝;白名单首次建 super_admin;audience 严格分离;无最后管理员保护且无自助恢复",
"expected_db_files": "允许分支建 admin/session/审计;拒绝分支不建 challenge/session;停用撤销 session",
"forbidden_side_effects": "不泄漏白名单、不使用邀请码/普通名额、不原地提升普通账号、不创建部署人员角色",
"evidence_files": "每参数 response.json、db-diff.json、external-calls.json、trace.zip"
},
{
"case_id": "TDD-WP4-CAN-001-fifty-elements",
"parent_family": "TDD-WP4-CAN-001",
"requirement_ac_source": "EDITOR-04 至 09、17.5、AC-27",
"fixture_ids": [
"FX-CANVAS-50"
],
"fixture_and_preconditions": "FX-CANVAS-50,稳定选择重叠 fixture",
"numbered_steps": "1. 添加到 50;2. 循环选择/长按候选/框选/多选移动;3. 层级/复制/删除;4. 保存/导出;5. 添加第 51",
"expected_response_ui": "前 50 可编辑保存导出;选择顺序确定;第 51 明确阻断且布局不跳",
"expected_db_files": "Canvas 最多 50,成功操作各一次撤销/保存;第 51 无 state change",
"forbidden_side_effects": "不出现图层面板/隐藏/锁定/编组,不因阻断损坏已有元素",
"evidence_files": "canvas-state.json、db-diff.json、trace.zip、performance.json"
},
{
"case_id": "TDD-WP3-MDL-003-runtime-recommendation",
"parent_family": "TDD-WP3-MDL-003",
"requirement_ac_source": "GEN-15、ADMIN-03、17.2、AC-30、51",
"fixture_ids": [
],
"fixture_and_preconditions": "三模型 verified/available,配置快照和哈希已记录",
"numbered_steps": "1. 依次模拟默认模型不可用、全部不可用、一个原因恢复但另一原因仍在、全部恢复;2. 每步 GET models",
"expected_response_ui": "configured default 始终原 IDrecommended 按可用模型 priority 派生或 nullreason 使用固定优先级",
"expected_db_files": "只更新 model_runtime_availability/GatewayBalanceState/runtime versionconfig set/version/hash 不变",
"forbidden_side_effects": "不写 enabled/is_default/priority;不自动恢复;不把推荐变成第二默认或用户隐式选择",
"evidence_files": "每步 response.json、db-diff.json、screenshots/model-states.png"
},
{
"case_id": "TDD-WP4-STK-001-transform-sticker",
"parent_family": "TDD-WP4-STK-001",
"requirement_ac_source": "EDITOR-04 至 09、PROJECT-04、AC-13、27",
"fixture_ids": [
],
"fixture_and_preconditions": "普通贴纸元素和重叠选择 fixture",
"numbered_steps": "1. 移动/缩放/旋转/翻转/透明度;2. 复制/层级/多选;3. 撤销重做;4. 保存/导出重开",
"expected_response_ui": "画布、属性控件、导出和重开状态一致;每次连续手势是一项撤销",
"expected_db_files": "Canvas element snapshot/state_version 按提交更新",
"forbidden_side_effects": "不改变 stable ID/resource_version,不引入隐藏/锁定/编组,不丢选择",
"evidence_files": "canvas-state.json、db-diff.json、pixel-diff.json、trace.zip"
},
{
"case_id": "TDD-WP3-MDL-002-contract-change",
"parent_family": "TDD-WP3-MDL-002",
"requirement_ac_source": "GEN-13、15、ADMIN-03、AC-30、40",
"fixture_ids": [
],
"fixture_and_preconditions": "verified 模型集合",
"numbered_steps": "1. 修改端点/字段/参考图/响应/异步查询/error mapping 任一契约字段;2. 保存;3. GET models4. 尝试生成",
"expected_response_ui": "保存成功但对应模型 contract unverified、runtime reason contract_unverified;生成被阻断直到独立重验",
"expected_db_files": "新 config_version/set;对应 runtime 独立置 false;审计/outbox 同事务",
"forbidden_side_effects": "不沿用旧 verified 证据;不暗改 enabled/default/priority;不调用真实上游",
"evidence_files": "每参数 response.json、db-diff.json、external-calls.json"
},
{
"case_id": "TDD-WP0-BRW-002-hard-block",
"parent_family": "TDD-WP0-BRW-002",
"requirement_ac_source": "NFR-01、AC-24",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化其他品牌、错误 major、非 Windows、UA-CH 缺失/冲突/解析失败和原始 API 客户端",
"numbered_steps": "1. 请求 support check2. 请求 HTML/bundle/API3. 尝试登录/项目/后台深链;4. 查 DB/外部调用",
"expected_response_ui": "全部 426 BROWSER_UNSUPPORTEDreason 仅四类,页面只有重新打开说明且无绕过",
"expected_db_files": "业务 DB 读取/写入计数为 0,session/验证码/资源读取均无变化",
"forbidden_side_effects": "不返回继续令牌/参数,不发 Resend/AI/高德,不泄露产品数据",
"evidence_files": "每参数 response.json、db-access.json、external-calls.json、screenshots/blocked.png"
},
{
"case_id": "TDD-WP5-MAN-001-readonly-compiler",
"parent_family": "TDD-WP5-MAN-001",
"requirement_ac_source": "TEXT-01 至 TEXT-14、COL-01 至 COL-05、DYN-01 至 DYN-09、STATIC-01 至 STATIC-04、AC-32、42",
"fixture_ids": [
],
"fixture_and_preconditions": "只读规范入口与独立输出目录;Lua/Prefab/证据目录 trap",
"numbered_steps": "1. 记录源 hash/mtime2. 运行声明式转换;3. 注入尝试执行 Lua/Prefab/读取证据目录;4. 复核输出",
"expected_response_ui": "只消费允许 catalog/metadata/资源;非法入口失败;输出 manifest 可重现",
"expected_db_files": "只写版本化派生输出;源 hash/mtime 零变化",
"forbidden_side_effects": "不执行 Android runtime、不扫描证据目录、不复制约 3.57 GB 全库、不覆盖源",
"evidence_files": "compiler-report.json、source-before.json、source-after.json、output-manifest.json"
},
{
"case_id": "TDD-WP1-AUD-001-immutable-triggers",
"parent_family": "TDD-WP1-AUD-001",
"requirement_ac_source": "ADMIN-05、09、17.10、17.16、AC-50",
"fixture_ids": [
],
"fixture_and_preconditions": "各一条 AdminOperationLog/PrivateContentAccessLog;普通、retention、privacy purge 连接",
"numbered_steps": "1. 普通连接 UPDATE/DELETE2. 伪造 purge 函数;3. 合法作用域在到期/注销执行",
"expected_response_ui": "普通和伪造操作被 trigger 阻断;仅注册作用域执行规定清理",
"expected_db_files": "非法尝试零变化;合法作用域只删除/匿名化允许行并留非敏感结果",
"forbidden_side_effects": "不允许后台/API 任意修改,不混用两类日志,不把正文写审计",
"evidence_files": "sql-results.json、db-diff.json、trigger-definition.json"
},
{
"case_id": "TDD-WP6-STATE-001-three-model-states",
"parent_family": "TDD-WP6-STATE-001",
"requirement_ac_source": "GEN-15、ADMIN-03、08、AC-30、51",
"fixture_ids": [
],
"fixture_and_preconditions": "default 不可用、其他推荐、全不可用、恢复参数",
"numbered_steps": "1. 打开总览/模型页;2. 注入 runtime 变化;3. SSE 后 REST refetch4. 恢复一个原因",
"expected_response_ui": "configured default、逐模型 runtime、recommended 三列独立;推荐可 nullUI 不暗换用户选择",
"expected_db_files": "只改 runtime/versionModelConfig/current set 无变化",
"forbidden_side_effects": "不合并三种状态、不把 SSE 当真相、不回写默认/enabled/priority",
"evidence_files": "response.json、db-diff.json、screenshots/model-columns.png、trace.zip"
},
{
"case_id": "TDD-WP4-DYN-002-location-consent",
"parent_family": "TDD-WP4-DYN-002",
"requirement_ac_source": "DYN-04、PRIV-03、AC-17、47",
"fixture_ids": [
],
"fixture_and_preconditions": "DYN004 固定坐标/高德 mock;同意、拒绝、服务暂停参数",
"numbered_steps": "1. 插入前检查 Dada 提示;2. 拒绝;3. 同意并定位/逆地理;4. 手动地点回退;5. 删除元素/注销",
"expected_response_ui": "拒绝调用 0 且不插入坐标;同意后正确显示;暂停时自动定位禁用但手动地点可用",
"expected_db_files": "只在同意后把坐标/文本存实例;删除/注销按规则清理",
"forbidden_side_effects": "前端不持高德密钥,不把坐标用于其他元素/用户,不在提示前调用",
"evidence_files": "external-calls.json、canvas-state.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP2-GEN-001-submit-snapshot",
"parent_family": "TDD-WP2-GEN-001",
"requirement_ac_source": "GEN-01 至 08、PROJECT-01、AC-03、34、44",
"fixture_ids": [
"FX-CREDIT-ENOUGH",
"FX-MODEL-VERIFIED",
"FX-REF-VALID"
],
"fixture_and_preconditions": "FX-MODEL-VERIFIED、FX-CREDIT-ENOUGH、FX-REF-VALIDnew_project",
"numbered_steps": "1. multipart 提交 prompt/model/ratio/config version/cost/reference2. 查询任务;3. 检查 staging/正式文件",
"expected_response_ui": "成功响应为 queued,返回同一任务真相;UI 不显示假百分比",
"expected_db_files": "新 project、job、reference snapshot、reserve ledger、outbox 同事务;提交后 reference 从 staging 进入私有 managed file",
"forbidden_side_effects": "不接受未冻结高级字段;不让 Worker 领取未完整提交任务;不暴露路径;失败补偿不留下可读半文件",
"evidence_files": "request.json、response.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP1-AUTH-004-challenge-guards",
"parent_family": "TDD-WP1-AUTH-004",
"requirement_ac_source": "AUTH-02、04、AC-33",
"fixture_ids": [
"FX-CHALLENGE"
],
"fixture_and_preconditions": "FX-CHALLENGE、可控时钟、active 普通账号",
"numbered_steps": "1. 成功消费验证码;2. 重放同码;3. 新建 challenge 后前进超过 10 分钟再提交;4. 发码后 60 秒内再发;5. 连续错误触发限流",
"expected_response_ui": "仅首次有效提交成功;重放/过期/错误使用稳定错误;60 秒重发和高频为 429;页面不显示假成功",
"expected_db_files": "首次 challenge consumed_at 只写一次;失败次数/限流记录按规则变化;失败分支不新增 session",
"forbidden_side_effects": "不记录验证码明文;不延长原 challenge;限流失败不调用 Resend、不创建会话",
"evidence_files": "每参数 response.json、db-diff.json、external-calls.json"
},
{
"case_id": "TDD-WP2-GEN-001-concurrent-reserve",
"parent_family": "TDD-WP2-GEN-001",
"requirement_ac_source": "CREDIT-03、GEN-07、AC-05、29",
"fixture_ids": [
"FX-CREDIT-ENOUGH"
],
"fixture_and_preconditions": "FX-CREDIT-ENOUGH,两个不同 submission/idempotency key 同时开始",
"numbered_steps": "1. 用 barrier 并发提交两次;2. 等待响应;3. 查询 current job、余额和流水",
"expected_response_ui": "一个响应创建任务,另一个 200 返回同一现有任务引用;UI 提供返回当前任务",
"expected_db_files": "仅一个 queued/running job、一个 projectnew_project 模式)、一条 reserve ledger;余额只转移一次",
"forbidden_side_effects": "不创建第二项目/参考关系/outbox/upstream callavailable 不为负",
"evidence_files": "两份 response.json、db-diff.json、concurrency-trace.json"
},
{
"case_id": "TDD-WP3-MDL-002-invalid-set",
"parent_family": "TDD-WP3-MDL-002",
"requirement_ac_source": "ADMIN-03、17.2、AC-30",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化缺替代、非法替代、priority 缺失/浮点/0/负数/重复、缺模型/未知模型",
"numbered_steps": "1. 分别 PUT 完整候选;2. 读取稳定错误;3. GET 当前集合",
"expected_response_ui": "返回对应 400/409 稳定 code;UI 聚焦修正字段;当前集合仍为 N",
"expected_db_files": "current pointer、versions/runtime/审计成功记录/outbox 均无变化",
"forbidden_side_effects": "不生成孤儿候选 set;不部分改变 enabled/default/priority;不新增错误分类",
"evidence_files": "每参数 response.json、db-diff.json"
},
{
"case_id": "TDD-WP2-EXP-001-same-blob-success",
"parent_family": "TDD-WP2-EXP-001",
"requirement_ac_source": "EXPORT-04、AC-23、35",
"fixture_ids": [
],
"fixture_and_preconditions": "saved project,已有旧 JPG latest;新客户端 Blob B",
"numbered_steps": "1. 记录 B SHA-2562. 用 B 触发浏览器下载;3. 同一 B 调 EXPORT_SAVE4. 重读 latest 并下载",
"expected_response_ui": "UI 显示“已下载并保存为最新成品”;两个通道 hash 相同",
"expected_db_files": "原子替换该格式 latest_exports/managed file;旧 JPG 进入规定清理;PNG latest 不变;容量按真实文件更新",
"forbidden_side_effects": "不重新编码第二份 Blob;不保留完整导出历史;不影响另一格式;幂等重试不重复计量",
"evidence_files": "download.json、request.json、response.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP7-EXT-002-real-resend",
"parent_family": "TDD-WP7-EXT-002",
"requirement_ac_source": "AUTH-01、02、07、AC-01、33、41、47、49",
"fixture_ids": [
],
"fixture_and_preconditions": "已验证发信域名、正式受控普通/admin 邮箱、免费规则记录",
"numbered_steps": "1. 核 SPF/DKIM/免费规则;2. QQ/163/至少一种企业邮箱各发 20 封;3. 统计 2 分钟送达;4. 真实完成普通/admin 认证",
"expected_response_ui": "每类至少 19/20 在 2 分钟内且两类认证成功;否则阻止发布但不改 runtime service_status",
"expected_db_files": "只保存人工汇总/证据 hash;不建逐封 EmailVerificationEvent",
"forbidden_side_effects": "不用预置账号/mock 冒充,不保存验证码/真实邮箱进证据,不切付费备用",
"evidence_files": "delivery-summary.json、domain-check.json、auth-result.json、redaction.json"
},
{
"case_id": "TDD-WP2-ERR-001-upstream-timeout",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-09、16、17.18、AC-04、53",
"fixture_ids": [
],
"fixture_and_preconditions": "独立 upstream_timeout fixture;已提交任务超时",
"numbered_steps": "1. 触发超时;2. 检查唯一下一步为“使用原输入重试”;3. 点击该动作;4. 查询原任务、新任务和项目",
"expected_response_ui": "原任务 failed/category=upstream_timeout;只提供“使用原输入重试”;动作后同项目新增一个 GenerationJob",
"expected_db_files": "原任务 release 一次且无 output;新任务独立 reserve 并保存相同输入关系快照",
"forbidden_side_effects": "不改成“稍后重试”;不要求修改输入/选择模型/联系管理员;不复用原任务 ID 或创建第二项目",
"evidence_files": "response.json、worker-events.json、db-diff.json、screenshots/upstream-timeout.png"
},
{
"case_id": "TDD-WP2-PROJ-005-failed-draft-retry",
"parent_family": "TDD-WP2-PROJ-005",
"requirement_ac_source": "PROJECT-01、GEN-09、AC-04、43",
"fixture_ids": [
"FX-PROJECT-EMPTY"
],
"fixture_and_preconditions": "FX-PROJECT-EMPTY 和含成功图项目",
"numbered_steps": "1. 失败页重试两次;2. 返回工作台主动新建;3. 多选批量删除 failed_empty 与成功项目",
"expected_response_ui": "重试只在原 project 新增 job;主动新建才新 project;批量只接受无成功图草稿",
"expected_db_files": "原草稿保留 prompt/configjob 数递增;批量合格项 trashed,成功项目不变",
"forbidden_side_effects": "不把重试变新项目、不把成功项目纳入快捷批量、不丢草稿输入",
"evidence_files": "response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP7-EXT-003-real-amap",
"parent_family": "TDD-WP7-EXT-003",
"requirement_ac_source": "DYN-04、PRIV-03、AC-17、41、47",
"fixture_ids": [
],
"fixture_and_preconditions": "个人认证高德 Web 服务 Key、安全绑定和显式确认",
"numbered_steps": "1. 核接口/QPS/白名单/安全/免费规则;2. 执行定位/逆地理;3. 验证 1,000 硬限模拟/受控测试;4. 脱敏坐标证据",
"expected_response_ui": "接口、绑定和应用硬停止通过才解除;失败保持 externally_blocked",
"expected_db_files": "只写非敏感用量/状态/证据;测试坐标不关联真实项目",
"forbidden_side_effects": "不暴露 Key/真实用户坐标,不发第 1001 次,不启用付费或自动扩容",
"evidence_files": "amap-contract.json、external-calls.json、redaction.json、manual-review.json"
},
{
"case_id": "TDD-WP4-EXP-001-cancel-pending-edit",
"parent_family": "TDD-WP4-EXP-001",
"requirement_ac_source": "EXPORT-03、AC-23",
"fixture_ids": [
],
"fixture_and_preconditions": "与上一 case 相同",
"numbered_steps": "1. 打开弹层;2. 取消未提交修改确认;3. 检查画布/撤销/网络",
"expected_response_ui": "弹层关闭或停留在未导出状态;无下载、无成功提示",
"expected_db_files": "state_version、latest_exports、撤销栈、保存队列均不因取消改变",
"forbidden_side_effects": "不提交当前编辑、不合成、不下载、不调 EXPORT_SAVE",
"evidence_files": "network-timeline.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP0-DATA-001-root-validation",
"parent_family": "TDD-WP0-DATA-001",
"requirement_ac_source": "NFR-09、17.19、AC-41、55、56",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化 repo/project/download/只读素材根、合规外部目录、已初始化后缺失目录",
"numbered_steps": "1. 用离线配置设置各路径;2. 启动;3. 删除已初始化根后重启;4. 调资源 API",
"expected_response_ui": "违规路径拒绝;合规路径可写;缺失根进入 data_missing 且不自动重建;浏览器只见逻辑资源 ID",
"expected_db_files": "仅合规首次初始化创建固定目录/DB;失败不创建散落目录",
"forbidden_side_effects": "不硬编码用户名、不回显绝对路径、不在源码/下载/素材根写业务数据",
"evidence_files": "config-result.json、fs-before.json、fs-after.json、response.json"
},
{
"case_id": "TDD-WP3-WRK-001-recovery",
"parent_family": "TDD-WP3-WRK-001",
"requirement_ac_source": "GEN-08、09、CREDIT-03、AC-04、51",
"fixture_ids": [
"FX-GATEWAY-ASYNC",
"FX-GATEWAY-UNKNOWN"
],
"fixture_and_preconditions": "参数化 FX-GATEWAY-ASYNC 有引用和 FX-GATEWAY-UNKNOWN 无安全引用;在 submit 后终止 Worker",
"numbered_steps": "1. 使租约过期;2. 重启 Worker;3. 有引用分支 poll;4. 无引用分支终结;5. 再重启复查",
"expected_response_ui": "有引用不重新 submit,只 poll 到真实终态;无引用为 failed/unknown_retryable,后台显示成本核对待人工",
"expected_db_files": "租约重新领取;无引用 upstream_outcome_known=false、upstream_cost_reconciliation=pending_manual_reviewrelease 一次",
"forbidden_side_effects": "不把 pending_manual_review 写入 job status;不补扣用户点数;不重复上游 submit/结算",
"evidence_files": "worker-events.json、db-diff.json、external-calls.json"
},
{
"case_id": "TDD-WP0-SEC-001-credential-channel",
"parent_family": "TDD-WP0-SEC-001",
"requirement_ac_source": "PRIV-01、AC-41",
"fixture_ids": [
],
"fixture_and_preconditions": "Windows Credential Manager 测试条目;API/Worker 各需不同凭据;缺失/清除参数",
"numbered_steps": "1. Supervisor 读取;2. 通过对应匿名管道启动子进程;3. 检查命令行/环境/句柄;4. 清除并重启",
"expected_response_ui": "仅目标子进程能在内存读取一次;缺失时服务明确不可用/启动失败",
"expected_db_files": "不写业务 DB;只写非敏感状态与日志",
"forbidden_side_effects": "凭据不进参数、环境、文件、日志、崩溃诊断;API 不获网关密钥,Worker 不获 Resend/高德密钥",
"evidence_files": "process-env-scan.json、pipe-acl.json、redaction.json"
},
{
"case_id": "TDD-WP5-CAT-001-catalog-1407",
"parent_family": "TDD-WP5-CAT-001",
"requirement_ac_source": "STATIC-01 至 04、AC-13、32",
"fixture_ids": [
],
"fixture_and_preconditions": "规范 catalog/metadata,含 3 组重复图和 part1-25",
"numbered_steps": "1. 编译/加载目录;2. 校验 ID/part/顺序/计数;3. 滚动全目录;4. 观察原图请求/DOM",
"expected_response_ui": "恰 1,407 项,重复图片保留不同稳定 ID;虚拟列表稳定,原图按需加载",
"expected_db_files": "只读 catalog;不复制或改写源;浏览器仅缓存允许公开项",
"forbidden_side_effects": "不去重业务 ID、不一次下载全量、不暴露绝对路径、不线性增长 DOM",
"evidence_files": "catalog-validation.json、network-timeline.json、dom-count.json、source-hashes.json"
},
{
"case_id": "TDD-WP4-TXT-001-multiline-template-switch",
"parent_family": "TDD-WP4-TXT-001",
"requirement_ac_source": "TEXT-01 至 06、PROJECT-04、AC-09、10",
"fixture_ids": [
],
"fixture_and_preconditions": "多行文字模板实例、固定变换",
"numbered_steps": "1. 输入含换行文字并完成;2. 切换另一模板;3. 撤销/重做;4. 重开/导出",
"expected_response_ui": "换行持久;空内容按规则拒绝;切模板重置默认样式但保留位置/旋转/整体尺寸",
"expected_db_files": "每次完成一条撤销并保存最新 element snapshot",
"forbidden_side_effects": "不把切模板重置变换、不裁切内容、不保存取消编辑",
"evidence_files": "canvas-state.json、db-diff.json、pixel-diff.json、trace.zip"
},
{
"case_id": "TDD-WP6-SVC-002-limit-recovery",
"parent_family": "TDD-WP6-SVC-002",
"requirement_ac_source": "ADMIN-08、09、NFR-08、AC-47、52",
"fixture_ids": [
],
"fixture_and_preconditions": "paused 服务;参数化下调 hard_limit、提高/付费/自动扩容、新周期/供应商恢复",
"numbered_steps": "1. 尝试各配置;2. 无确认恢复;3. 建立非敏感恢复检查;4. admin 明确确认",
"expected_response_ui": "只允许不扩大能力的下调并审计;提高/付费/自动扩容拒绝;满足条件+确认后恢复",
"expected_db_files": "成功下调/恢复与 AdminOperationLog 同事务;非法请求零变化",
"forbidden_side_effects": "不自动恢复、不保存凭据/供应商原文、不把暂停伪装成功或提高上限",
"evidence_files": "每参数 response.json、db-diff.json、screenshots/service-state.png"
},
{
"case_id": "TDD-WP0-EVT-001-rest-refetch",
"parent_family": "TDD-WP0-EVT-001",
"requirement_ac_source": "PROJECT-04、GEN-14、NFR-05、DevelopmentPlan 6.2、AC-20、30",
"fixture_ids": [
],
"fixture_and_preconditions": "可控 SSE 序列:正常、断线、event_id 缺号、runtime/config 变化",
"numbered_steps": "1. 订阅 /api/v1/events2. 注入事件;3. 断线/缺号;4. 观察 REST 请求和 UI",
"expected_response_ui": "事件只提示 ID/type/entity/version/time;每次由 REST 取真相;断线/缺号 bootstrap/refetch",
"expected_db_files": "SSE 不直接写业务表;REST 读取后前端状态更新",
"forbidden_side_effects": "不携带正文/图片/凭据,不把 runtime 事件写 ModelConfig,不抢焦点",
"evidence_files": "sse-events.json、network-timeline.json、trace.zip"
},
{
"case_id": "TDD-WP6-DIAG-001-redacted-diagnostics",
"parent_family": "TDD-WP6-DIAG-001",
"requirement_ac_source": "PRIV-01、02、ADMIN-08、NFR-09、AC-41、55",
"fixture_ids": [
],
"fixture_and_preconditions": "总览/服务/存储/诊断包含所有状态;注入密钥、邮箱、路径、正文 trap",
"numbered_steps": "1. 请求各摘要;2. 复制诊断;3. 检查托盘诊断;4. 跑脱敏扫描",
"expected_response_ui": "仅显示固定非敏感字段、逻辑位置、计量和状态;复制内容一致",
"expected_db_files": "只读;可记录非敏感诊断访问/时间,不改变服务状态",
"forbidden_side_effects": "不含密钥/HMAC/邮箱/提示词/图片/绝对路径/供应商正文,不提供隐藏修复写入口",
"evidence_files": "response.json、diagnostic.txt、redaction.json、screenshots/diagnostics.png"
},
{
"case_id": "TDD-WP2-PROJ-001-new-versus-continue",
"parent_family": "TDD-WP2-PROJ-001",
"requirement_ac_source": "PROJECT-01 至 03、GEN-04、11、AC-03、06、34",
"fixture_ids": [
"FX-PROJECT-ACTIVE-19"
],
"fixture_and_preconditions": "FX-PROJECT-ACTIVE-19、一个 9 图固定比例项目",
"numbered_steps": "1. 工作台新建两次;2. 在第一个项目继续生成;3. 尝试改比例;4. 补到 10 图再继续",
"expected_response_ui": "两次新建为两个 project;继续只新增 job/history且沿用比例;10 图阻断追加但可另建",
"expected_db_files": "projects +2;继续分支 project 数不变;成功 history 正确关联",
"forbidden_side_effects": "不默认追加最近项目、不创建第三项目、不改变既有项目比例、不让历史上限阻断其他新建",
"evidence_files": "response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP2-ERR-001-gateway-contract",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-13、16、17.18、AC-40、53",
"fixture_ids": [
],
"fixture_and_preconditions": "gateway_contract_invalid 创建前/后 fixture;另一个 contract verified 模型",
"numbered_steps": "1. 触发契约未验证/失效;2. 检查下一步仅“选择其他模型或联系管理员”;3. 显式改选已验证模型并重新确认;4. 无候选时检查联系管理员",
"expected_response_ui": "返回/保存 category=gateway_contract_invalid;已提交任务 failed;改选 verified 模型后才能新提交",
"expected_db_files": "创建前无 reserve/job;创建后 release 一次;失效模型 contract 状态按契约更新;新任务保存新模型/版本",
"forbidden_side_effects": "不提供等待、原输入/稍后重试;不让未验证模型提交;不自动切推荐或部分改写配置",
"evidence_files": "response.json、db-diff.json、external-calls.json、screenshots/gateway-contract.png"
},
{
"case_id": "TDD-WP3-ADP-002-invalidate-revalidate",
"parent_family": "TDD-WP3-ADP-002",
"requirement_ac_source": "GEN-13、15、ADMIN-03、AC-30、40",
"fixture_ids": [
],
"fixture_and_preconditions": "三模型 verified;参数化端点/字段/参考图/响应/异步/查询/error protocol 变化",
"numbered_steps": "1. 改一个契约字段并保存;2. 尝试生成;3. 仅为该模型重跑完整矩阵;4. 再尝试",
"expected_response_ui": "变化后立即 unverified/不可新建;完整独立重验后才恢复 verified",
"expected_db_files": "新 config_version;对应 runtime/evidence 版本更新;其他模型证据不变",
"forbidden_side_effects": "不沿用旧证据、不局部 smoke 即 verified、不暗改 enabled/default/priority",
"evidence_files": "每字段 db-diff.json、contract-matrix.json、response.json"
},
{
"case_id": "TDD-WP5-UPL-001-upload-metering",
"parent_family": "TDD-WP5-UPL-001",
"requirement_ac_source": "ADMIN-06、17.7、17.19、AC-31、55",
"fixture_ids": [
],
"fixture_and_preconditions": "PNG/WebP、坏 MIME/解码、稳定 ID 冲突;active/full/unavailable;原图+缩略图字节",
"numbered_steps": "1. multipart 上传并指定 part/order;2. 生成缩略图;3. 注入非法/冲突/容量状态;4. 重计量",
"expected_response_ui": "合法上传成功并可上架;非法/冲突明确失败;full/unavailable 阻断写但已有资源可读",
"expected_db_files": "原图/缩略图分别 reservation/managed_file 并计量;失败零文件/目录项",
"forbidden_side_effects": "不用扩展名替代解码、不漏计缩略、不部分覆盖稳定 ID、不在 full 写入",
"evidence_files": "response.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP4-COL-001-deterministic-palette",
"parent_family": "TDD-WP4-COL-001",
"requirement_ac_source": "COL-01 至 05、AC-15 P0-A 子集、16",
"fixture_ids": [
],
"fixture_and_preconditions": "固定解码底图、mmcq-v1、四个 P0-A 色卡",
"numbered_steps": "1. 重复提取五色;2. 调裁剪/调色/滤镜;3. 换原始底图;4. 渲染四布局;5. 监控网络",
"expected_response_ui": "同图五色/顺序确定;处理不刷新;换底图刷新;四色卡消费同一五色",
"expected_db_files": "五色快照只在底图更换提交时保存;无上传文件",
"forbidden_side_effects": "不读取处理后像素/额外图片,不联网提色,不启用白名单外色卡",
"evidence_files": "palette.json、network-timeline.json、pixel-diff.json、db-diff.json"
},
{
"case_id": "TDD-WP6-PRIV-002-open-after-audit",
"parent_family": "TDD-WP6-PRIV-002",
"requirement_ac_source": "ADMIN-05、17.10、AC-25、50",
"fixture_ids": [
],
"fixture_and_preconditions": "active admin A 已确认 current;目标含图片和完整提示词",
"numbered_steps": "1. 列表确认无正文;2. 不带 purpose/reason 调 PRIVATE_OPEN3. 在提交钩子确认审计落库后才释放受控读取;4. 对同目标再打开",
"expected_response_ui": "每个入口原样“打开并记录审计”;每次打开成功且各生成一条访问审计",
"expected_db_files": "每次先 append 一条含 admin/目标/时间/content_type/expires_at 的 PrivateContentAccessLog;内容本身不入审计",
"forbidden_side_effects": "UI/API 不要求目的、原因或二次确认;不预取/hover 打开;不把正文放列表、HTML、缓存或证据",
"evidence_files": "response.json、db-diff.json、ordering-trace.json、trace.zip、screenshots/open-entry.png"
},
{
"case_id": "TDD-WP6-PRIV-002-deny-without-audit",
"parent_family": "TDD-WP6-PRIV-002",
"requirement_ac_source": "ADMIN-05、17.10、AC-25",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化未确认、普通用户/预览账号、停用 admin、审计 insert 失败",
"numbered_steps": "1. 调区域/PRIVATE_OPEN2. 模拟审计约束失败;3. 枚举页面、SW、Cache、IndexedDB",
"expected_response_ui": "未确认 428;其他未授权 401/403/404 按冻结协议;审计失败返回非成功且无内容字节",
"expected_db_files": "未授权无访问审计;审计失败事务不留下伪成功记录,也不发放读取",
"forbidden_side_effects": "不返回正文/图片/可推导 URL;不写 AdminOperationLog 替代;不因 notice ack 省略逐次审计",
"evidence_files": "每参数 response.json、db-diff.json、cache-enumeration.json、trace.zip"
},
{
"case_id": "TDD-WP1-DEL-001-account-delete",
"parent_family": "TDD-WP1-DEL-001",
"requirement_ac_source": "AUTH-06、AC-22、39、56",
"fixture_ids": [
],
"fixture_and_preconditions": "用户拥有项目、参考/生成/导出、坐标、点数、多个 session",
"numbered_steps": "1. 确认注销;2. 并发调用受保护 API;3. 尝试旧资源 ID/恢复;4. 用新邀请重新注册同邮箱",
"expected_response_ui": "注销成功后所有旧访问立即 401/404;不可恢复;新注册是全新账号",
"expected_db_files": "同事务撤销 sessions、删除身份/业务关系/未用点数并创建允许匿名事件;物理文件排队",
"forbidden_side_effects": "不延迟撤权到物理清理,不恢复旧 ID/点数/资料,不保留邮箱映射到匿名主体",
"evidence_files": "response.json、db-diff.json、worker-events.json、trace.zip"
},
{
"case_id": "TDD-WP4-DYN-001-fixed-time",
"parent_family": "TDD-WP4-DYN-001",
"requirement_ac_source": "DYN-01 至 03、AC-14",
"fixture_ids": [
],
"fixture_and_preconditions": "可控时钟、DYN001-003/007/008/011 fixture",
"numbered_steps": "1. 插入/确认动态值;2. 推进墙钟;3. 重开;4. 导出",
"expected_response_ui": "使用插入/确认时快照,重开/导出不随当前时间变化;结果静态不可点击",
"expected_db_files": "动态实例只保存允许字段和值快照",
"forbidden_side_effects": "不保存定时器/外部链接,不在重开重新计算,不输出 GIF/视频",
"evidence_files": "canvas-state.json、clock-trace.json、pixel-diff.json"
},
{
"case_id": "TDD-WP2-CRED-001-reserve",
"parent_family": "TDD-WP2-CRED-001",
"requirement_ac_source": "CREDIT-01 至 05、AC-03",
"fixture_ids": [
"FX-CREDIT-ENOUGH",
"FX-MODEL-VERIFIED"
],
"fixture_and_preconditions": "FX-CREDIT-ENOUGH、FX-MODEL-VERIFIED,无活动任务",
"numbered_steps": "1. 记录余额;2. 以成本 1 调 POST /api/v1/generations3. 查询 /me/credits 和流水",
"expected_response_ui": "创建任务成功;UI 显示 available 9/reserved 1 和 queued;流水显示 generation_reserve",
"expected_db_files": "credit_accounts 原子 10/0→9/1;一条 reserve ledger、一个 queued job 和 outbox 同事务",
"forbidden_side_effects": "不提前生成 commit;不使总点数改变;不出现任务已建但未冻结或冻结无任务",
"evidence_files": "request.json、response.json、db-diff.json"
},
{
"case_id": "TDD-WP0-DATA-002-no-backup-migration",
"parent_family": "TDD-WP0-DATA-002",
"requirement_ac_source": "AUTH-06、NFR-09、AC-24、56",
"fixture_ids": [
],
"fixture_and_preconditions": "有账号/项目/下载成品的 LocalDataRoot",
"numbered_steps": "1. 搜索 UI/API/包功能;2. 尝试导出项目包/DB/账号/点数;3. 删除根/重装;4. 启动模拟 P0-B 导入",
"expected_response_ui": "仅原图/JPG/PNG 下载可用;固定本机提示持续显示;删除/重装不可恢复;无迁移入口",
"expected_db_files": "下载目录文件保留;业务数据删除后不被重建或导入",
"forbidden_side_effects": "不自动备份、不生成迁移包、不把下载图识别为正式迁移数据",
"evidence_files": "route-inventory.json、package-scan.json、trace.zip、screenshots/fixed-copy.png"
},
{
"case_id": "TDD-WP4-BG-002-processing-controls",
"parent_family": "TDD-WP4-BG-002",
"requirement_ac_source": "EDITOR-01 至 03、PROJECT-04、EXPORT-03、AC-07、20、23",
"fixture_ids": [
],
"fixture_and_preconditions": "固定底图和像素基线",
"numbered_steps": "1. 参数化填充/适配/裁剪/缩放/定位及亮度、对比度、饱和度、色温、锐度、预设滤镜;2. 完成;3. 撤销;4. 恢复原图;5. 导出/重开",
"expected_response_ui": "每项预览与提交值一致;完成一次撤销;导出/重开一致;恢复原图只清底图处理",
"expected_db_files": "每次提交进入保存的 Canvas JSON;取消无 DB 变化",
"forbidden_side_effects": "不影响覆盖元素,不持久化未提交预览,不用静默超范围值",
"evidence_files": "每参数 canvas-state.json、db-diff.json、pixel-diff.json、trace.zip"
},
{
"case_id": "TDD-WP5-CACHE-001-no-private-client-state",
"parent_family": "TDD-WP5-CACHE-001",
"requirement_ac_source": "NFR-07、17.14、AC-46、48",
"fixture_ids": [
],
"fixture_and_preconditions": "已访问 public/preview/private、提示词和项目;注册 SW fixture",
"numbered_steps": "1. 完成各访问;2. 离线/刷新;3. 枚举 SW registrations、Cache keys/body、IndexedDB stores/records",
"expected_response_ui": "仅 public allowlist 元数据/资源存在;SW 不拦 preview/private;离线不能恢复私有正文/草稿",
"expected_db_files": "只允许 public_asset_lru 记录;业务 DB 无变化",
"forbidden_side_effects": "不仅凭响应头判断,不缓存 no-store 内容、项目/提示词/session/验证码/未保存编辑",
"evidence_files": "cache-enumeration.json、service-worker.json、trace.zip"
},
{
"case_id": "TDD-WP2-CRED-002-admin-adjustment",
"parent_family": "TDD-WP2-CRED-002",
"requirement_ac_source": "CREDIT-05、06、ADMIN-01、09、AC-29、50",
"fixture_ids": [
"FX-ACTOR-ADMIN-A",
"FX-JOB-ACTIVE"
],
"fixture_and_preconditions": "FX-JOB-ACTIVEavailable 0/reserved 1FX-ACTOR-ADMIN-A",
"numbered_steps": "1. 管理员填写原因扣减 52. 用同 adjustment_id 重试;3. 用户读点数",
"expected_response_ui": "首次成功,重试返回同一结果;用户显示 available -5/reserved 1;无充值入口",
"expected_db_files": "available 0→-5reserved 保持 1;一条 admin_adjustment ledger 和一条 AdminOperationLog 同事务",
"forbidden_side_effects": "不改活动任务/冻结流水;不重复调点;不允许空原因;不使生成流程自身制造负数",
"evidence_files": "response.json、db-diff.json、screenshots/negative-balance.png"
},
{
"case_id": "TDD-WP2-ERR-001-model-disabled",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-07、16、17.18、AC-30、53",
"fixture_ids": [
],
"fixture_and_preconditions": "model_disabled 创建前 fixture;参数化存在/不存在其他 enabled 模型",
"numbered_steps": "1. 触发创建前阻断;2. 检查下一步仅“选择其他模型或等待”;3. 有可用模型时显式改选并确认;4. 无可用模型时保持页面等待",
"expected_response_ui": "返回 category=model_disabled 且不创建任务;改选后才能提交;无模型时保持禁用",
"expected_db_files": "阻断分支无 job/project/reference/reserve/outbox;改选分支按新模型快照创建",
"forbidden_side_effects": "不提供联系管理员、原输入重试或稍后重试;不自动切推荐或把 runtime 状态写回配置",
"evidence_files": "response.json、db-diff.json、external-calls.json、screenshots/model-disabled.png"
},
{
"case_id": "TDD-WP0-LOG-001-rotation-redaction",
"parent_family": "TDD-WP0-LOG-001",
"requirement_ac_source": "PRIV-01、02、NFR-09、AC-41、56",
"fixture_ids": [
],
"fixture_and_preconditions": "生成超过 10 MiB/10 文件/30 天日志;注入密钥、邮箱、提示词、路径和写失败",
"numbered_steps": "1. 写边界日志;2. 触发轮转/保留清理;3. 复制诊断;4. 使目录不可写并尝试 AI",
"expected_response_ui": "轮转严格为 10 MiB/10 文件/30 天;诊断只含白名单;写失败进入 unavailable 并阻断 AI",
"expected_db_files": "只更新日志文件和非敏感状态;不改业务对象",
"forbidden_side_effects": "不记录敏感正文/绝对路径/供应商原文,不在日志失败时继续 AI",
"evidence_files": "log-manifest.json、redaction.json、response.json、external-calls.json"
},
{
"case_id": "TDD-WP0-STO-003-full-matrix",
"parent_family": "TDD-WP0-STO-003",
"requirement_ac_source": "17.19、PROJECT-04、EXPORT-06、AC-55",
"fixture_ids": [
],
"fixture_and_preconditions": "managed bytes 恰为上限,status fullSQLite 可写",
"numbered_steps": "1. 保存纯 JSON project state2. 读取/下载已有文件;3. 客户端合成并仅下载;4. 尝试 latest 保存和新生成;5. 永久删除/显式清理",
"expected_response_ui": "JSON 保存、读取、下载、仅下载、删除/清理入口可用;latest/新生成/其他二进制写为 507",
"expected_db_files": "JSON state_version 可增加;禁止项不新增 managed file/job/ledger;删除/清理只先逻辑提交/排队",
"forbidden_side_effects": "不自动删除;客户端下载不更新 latest_exports;排队不提前减少 managed bytes",
"evidence_files": "response.json、db-diff.json、fs-before.json、fs-after.json、trace.zip"
},
{
"case_id": "TDD-WP5-CLN-001-reference-race",
"parent_family": "TDD-WP5-CLN-001",
"requirement_ac_source": "ADMIN-06、09、17.7、17.19、AC-31、50、55",
"fixture_ids": [
],
"fixture_and_preconditions": "查询时整批文件全部无任何发布/项目/待发布引用",
"numbered_steps": "1. 查询候选并由 admin A 创建 intent;2. 参数化确认前新增各类引用/快照过期/admin 变化;3. A 确认;4. 无竞态分支确认并运行 Worker",
"expected_response_ui": "任一新增引用整批 409 conflict+denied 审计;stale 重新查询;无竞态才整批排队/物理删除/重测",
"expected_db_files": "冲突 bytes/状态/queue 不变;成功排队不减量,物理后同事务更新并记录全阶段审计",
"forbidden_side_effects": "不让查询时有引用项入候选、不由 admin B 确认、不部分排队、不自动清理或提前减量",
"evidence_files": "每参数 response.json、db-diff.json、worker-events.json、fs-after.json"
},
{
"case_id": "TDD-WP0-STO-001-byte-thresholds",
"parent_family": "TDD-WP0-STO-001",
"requirement_ac_source": "17.19、AC-55",
"fixture_ids": [
],
"fixture_and_preconditions": "第 5.5 节七个精确字节 fixture,可写目录",
"numbered_steps": "1. 对每个值重计量;2. 读取 storage state/API/UI3. 重复计算",
"expected_response_ui": "normal/warning/critical/full 边界逐字节正确,重复结果确定",
"expected_db_files": "只更新 measured bytes/notice/status/last_measured_at;无 managed file 变化",
"forbidden_side_effects": "不用浮点比例导致错一字节,不自动删除,不把 warning/critical 当阻断",
"evidence_files": "每值 result.json、db-diff.json、screenshots/capacity-bar.png"
},
{
"case_id": "TDD-WP2-CRED-001-finalize-once",
"parent_family": "TDD-WP2-CRED-001",
"requirement_ac_source": "CREDIT-03、05、GEN-09、10、AC-03、04、29",
"fixture_ids": [
"FX-JOB-ACTIVE"
],
"fixture_and_preconditions": "参数化成功、技术失败和安全拒绝的 FX-JOB-ACTIVE",
"numbered_steps": "1. Worker 提交终态;2. 重复 callback/poll3. 模拟 Worker 重启再处理",
"expected_response_ui": "成功为 succeeded;技术失败为 failed;安全拒绝为 rejected;用户余额/动作匹配固定类别",
"expected_db_files": "每任务恰一条 commit 或 releasereserved 恰减一次;成功才建 output/history,失败/拒绝 available 恢复",
"forbidden_side_effects": "不双重 commit/release;不在失败建 output;终态不可逆;不保存供应商原文",
"evidence_files": "worker-events.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP1-AUTH-002-invalid-invite",
"parent_family": "TDD-WP1-AUTH-002",
"requirement_ac_source": "AUTH-01、02、AC-02",
"fixture_ids": [
"FX-INVITE-EXPIRED"
],
"fixture_and_preconditions": "参数化 FX-INVITE-EXPIRED/DISABLED/EXHAUSTED 和不存在的邀请码",
"numbered_steps": "1. 对每个参数调 REGISTER_SEND2. 检查 Resend mock 调用;3. 查询认证相关表",
"expected_response_ui": "返回冻结的非成功错误语义并在邀请码字段显示原因,第二阶段不展开",
"expected_db_files": "users/user_profiles/credit_accounts/privacy_consents/email_challenges/sessions 无新增;邀请码计数不变",
"forbidden_side_effects": "Resend 调用为 0;不建号、不赠点、不占名额、不写成功审计或成功提示",
"evidence_files": "每参数 response.json、db-diff.json、external-calls.json、screenshots/error.png"
},
{
"case_id": "TDD-WP2-PROJ-003-trash-restore-purge",
"parent_family": "TDD-WP2-PROJ-003",
"requirement_ac_source": "PROJECT-03、08、AC-21",
"fixture_ids": [
"FX-PROJECT-ACTIVE-20"
],
"fixture_and_preconditions": "active project、FX-PROJECT-ACTIVE-20、可控 720 小时时钟",
"numbered_steps": "1. 移入回收站;2. 满 20 时恢复;3. 释放名额再恢复;4. 主动永久删除;5. 另一项目推进到 purge_at",
"expected_response_ui": "满额恢复阻断且时间不变;释放后可恢复;purge 后立即不可见/不可恢复",
"expected_db_files": "status/deleted_at/purge_at 精确;purged 撤销访问关系并排物理清理",
"forbidden_side_effects": "不提前物理结果、不因恢复重算 purge_at、不让 purged 资源可读",
"evidence_files": "response.json、db-diff.json、worker-events.json"
},
{
"case_id": "TDD-WP2-PROJ-002-debounce",
"parent_family": "TDD-WP2-PROJ-002",
"requirement_ac_source": "PROJECT-04、06、AC-20",
"fixture_ids": [
],
"fixture_and_preconditions": "saved project version N、可控前端时钟",
"numbered_steps": "1. 1 秒内完成多次已提交编辑;2. 在首个保存请求在途时继续编辑;3. 释放响应并推进时钟;4. 撤销/重做",
"expected_response_ui": "同时最多一请求;第一份后下一请求为合并后的最新完整状态;状态 saving→saved",
"expected_db_files": "每次成功 state_version +1;最终 project_states 为最新已提交 JSON;撤销/重做也正常保存",
"forbidden_side_effects": "不逐操作并发;不保存 Fabric 私有字段;不把未提交编辑或撤销栈写浏览器持久存储",
"evidence_files": "network-timeline.json、response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP0-SUP-001-lifecycle",
"parent_family": "TDD-WP0-SUP-001",
"requirement_ac_source": "NFR-09、AC-24、41",
"fixture_ids": [
],
"fixture_and_preconditions": "真实便携包;参数化第二实例、43121 占用、API/Worker 崩溃、正常退出",
"numbered_steps": "1. 双击启动;2. 注入各故障;3. 观察托盘/重启次数;4. 退出并等待 15 秒",
"expected_response_ui": "单实例;端口占用明确失败且不换端口;有限重启/degraded/允许动作符合契约;退出后无残留",
"expected_db_files": "仅规定日志/状态记录;正常退出 flush WAL/队列;不改业务真相",
"forbidden_side_effects": "不无限重启、不杀无关进程、不弹隐藏控制台、不留下 API/Worker/端口",
"evidence_files": "process-tree.json、port.json、supervisor-events.json、screenshots/system-ui.png"
},
{
"case_id": "TDD-WP6-AUD-001-sensitive-operations",
"parent_family": "TDD-WP6-AUD-001",
"requirement_ac_source": "ADMIN-09、17.16、AC-50",
"fixture_ids": [
],
"fixture_and_preconditions": "每类规定敏感操作 fixture,含贴纸清理各阶段和 system 配置生效",
"numbered_steps": "1. 逐类执行成功/拒绝;2. 查询 AdminOperationLog3. 查询 PrivateContentAccessLog4. 尝试改删/越权查看",
"expected_response_ui": "每次操作同事务形成不可变、非敏感 before/after/result;两类审计分离;只有 admin 查看",
"expected_db_files": "AdminOperationLog 条数/actor_type/ref/expires_at 正确;私有打开只写专表",
"forbidden_side_effects": "不漏失败审计、不重复保存私有正文、不记录白名单/密钥/验证码/路径、不允许人工修改删除",
"evidence_files": "operation-matrix.json、db-diff.json、redaction.json、trace.zip"
},
{
"case_id": "TDD-WP4-VIS-001-browser-diff",
"parent_family": "TDD-WP4-VIS-001",
"requirement_ac_source": "NFR-02、AC-19、23、32",
"fixture_ids": [
],
"fixture_and_preconditions": "最终 RELEASE Chrome/Edge、固定 Canvas/字体/动态值/DPR",
"numbered_steps": "1. 等待资源稳定;2. 两浏览器截图/导出;3. 计算元素边界/显著像素;4. 人工复核已知替代",
"expected_response_ui": "结构、字体、换行、颜色、描边、装饰在第 10.1 阈值内;替代项明确标记",
"expected_db_files": "只生成视觉证据;业务状态使用同一 fixture",
"forbidden_side_effects": "不用低保真 PNG 作像素基准,不用阈值掩盖缺字体/空画布,不冒充全 P0-B",
"evidence_files": "每场景 pixel-diff.json、layout-boxes.json、manual-review.json、截图"
},
{
"case_id": "TDD-WP7-AC-001-trace-structure",
"parent_family": "TDD-WP7-AC-001",
"requirement_ac_source": "NFR-05、52 当前 AC、109 需求 ID、13 模块、19 契约、9 错误",
"fixture_ids": [
],
"fixture_and_preconditions": "冻结 allowlist、89 family 定义、117 case 定义、页面矩阵和全部 evidence manifest",
"numbered_steps": "1. 运行 pnpm validate:tdd-trace2. 注入缺 AC/重复主责/P0-B passed/未知需求/孤儿 family/case 缺字段/错误父族解析;3. 恢复后重跑",
"expected_response_ui": "每种破坏均非零且定位;正确状态返回 0:52 AC、109 唯一 ID、89/89 family 有 case、117 case 字段齐全",
"expected_db_files": "只生成 family/trace validation manifest;不改业务 DB",
"forbidden_side_effects": "不信任手写合计、不让 AC-08/26/37/54 计 passed、不允许未知父族、删除末段式解析或空 automation/release_gate",
"evidence_files": "family-manifest.json、trace-validation.json、negative-fixtures.json"
},
{
"case_id": "TDD-WP1-AUTH-001-valid-register",
"parent_family": "TDD-WP1-AUTH-001",
"requirement_ac_source": "AUTH-01 至 04、AC-01",
"fixture_ids": [
"FX-CHALLENGE",
"FX-INVITE-VALID"
],
"fixture_and_preconditions": "FX-INVITE-VALID、FX-CHALLENGE;占名额普通账号为 9;未注册 .invalid 邮箱",
"numbered_steps": "1. 调 REGISTER_SEND2. 读取模拟 Resend 验证码;3. 以署名、社交 ID、当前告知 version/同意和同一 registration_id 调 REGISTER_COMPLETE4. 调普通 session",
"expected_response_ui": "两次均符合成功 Schema;注册后得到普通 audience 的 30 天会话并进入创作,点数显示 available 10/reserved 0",
"expected_db_files": "users/user_profiles/credit_accounts/privacy_consents 各新增正确关系;invite_codes.used_count +1challenge 只消费一次;新增 session 只存 token 摘要;初始点数流水一次",
"forbidden_side_effects": "不创建 super_admin;不保存验证码明文;不重复赠点或核销邀请码;不产生第二会话/第二注册实体",
"evidence_files": "request.json、response.json、db-diff.json、trace.zip、screenshots/registered.png"
},
{
"case_id": "TDD-WP5-WHITE-001-p0a-allowlist",
"parent_family": "TDD-WP5-WHITE-001",
"requirement_ac_source": "TEXT-01、TEXT-04、COL-01、DYN-01、DYN-08、STATIC-01、ADMIN-07、NFR-02、NFR-07、AC-32、42、48",
"fixture_ids": [
],
"fixture_and_preconditions": "普通用户无 grant、预览用户有单批 grant、注册全量模板",
"numbered_steps": "1. 分别读取公开/预览 manifest;2. 搜索白名单外 ID3. 浏览所有面板",
"expected_response_ui": "普通用户仅 32 文字、实际字体+FONT081、4 色卡、10 动态、1,407 贴纸;预览只多授权批次",
"expected_db_files": "只读;授权不改变 role",
"forbidden_side_effects": "不向普通用户暴露白名单外 passed/internal,不提前开放 P0-B,不遗漏白名单;AC-54 为未来 P0-B,不进入本 case 的当前验收或 passed 关联",
"evidence_files": "manifest.json、response.json、trace.zip、screenshots/allowlist.png"
},
{
"case_id": "TDD-WP4-BG-001-switch-background",
"parent_family": "TDD-WP4-BG-001",
"requirement_ac_source": "GEN-12、EDITOR-01、PROJECT-04、AC-07",
"fixture_ids": [
],
"fixture_and_preconditions": "画布含文字/贴纸/色卡/动态元素和已调底图,项目有第二历史图",
"numbered_steps": "1. 记录覆盖元素;2. 确认换底图;3. 检查参数/色卡;4. 撤销/重做;5. 重开",
"expected_response_ui": "覆盖层位置尺寸保留;底图处理重置;五色重提;一次撤销且重开一致",
"expected_db_files": "完整 Canvas state 自动保存并 state_version 递增",
"forbidden_side_effects": "不删除/缩放覆盖层,不保留旧调色,不产生多次撤销或改项目比例",
"evidence_files": "canvas-before.json、canvas-after.json、db-diff.json、trace.zip、pixel-diff.json"
},
{
"case_id": "TDD-WP0-PKG-001-portable-zip",
"parent_family": "TDD-WP0-PKG-001",
"requirement_ac_source": "NFR-01、09、AC-24、41、56",
"fixture_ids": [
],
"fixture_and_preconditions": "release build、空白 Windows 用户目录",
"numbered_steps": "1. 生成 win-x64 ZIP/哈希/START-HERE/RELEASE2. 解压非仓库目录;3. 离线启动;4. 扫描制品和端口",
"expected_response_ui": "包含 Dada.exe、随包 Node/native 依赖并固定 43121;说明与 RELEASE 一致",
"expected_db_files": "仅合规 LocalDataRoot 生成运行数据;制品本身不可变",
"forbidden_side_effects": "不含真实配置/凭据/用户名/LocalDataRoot,不动态换端口,不要求 Docker/安装器",
"evidence_files": "package-manifest.json、sha256.txt、package-scan.json、process-tree.json"
},
{
"case_id": "TDD-WP4-A11Y-001-keyboard-focus",
"parent_family": "TDD-WP4-A11Y-001",
"requirement_ac_source": "NFR-06、AC-32",
"fixture_ids": [
],
"fixture_and_preconditions": "第 11.1 节全部 page_id,最长文案、弹层和 200% 缩放",
"numbered_steps": "1. 仅键盘走主流程;2. 检查 skip link/focus order/弹层返回;3. 触发 live region4. 运行 axe5. 测画布等价控件",
"expected_response_ui": "所有动作可达,焦点不逃逸/不被 SSE 抢走;critical/serious 为 0;状态非仅颜色",
"expected_db_files": "无非用户触发业务写;可访问性扫描只产证据",
"forbidden_side_effects": "不用正 tabindex、不隐藏主动作、不以缩小字体规避 200% 问题",
"evidence_files": "每页 axe.json、focus-trace.json、trace.zip、screenshots/200pct.png"
},
{
"case_id": "TDD-WP1-NOTICE-001-registration-consent",
"parent_family": "TDD-WP1-NOTICE-001",
"requirement_ac_source": "AUTH-03、PRIV-04、06、AC-01、41、56",
"fixture_ids": [
],
"fixture_and_preconditions": "当前告知 version/effective_at/hash;缺字段、未勾选和完整参数",
"numbered_steps": "1. 展开注册第二阶段;2. 检查全部处理方/用途/本机风险;3. 未同意提交;4. 同意当前 version 注册",
"expected_response_ui": "未同意/版本错误不能注册;完整告知原样可达;成功进入创作",
"expected_db_files": "失败无 user/consent/invite/credit;成功记录 consent version/time 与账号同事务",
"forbidden_side_effects": "不省略 AI/Resend/高德、DYN004、管理员访问、注销、180 天、无备份/迁移;不预勾选",
"evidence_files": "response.json、db-diff.json、screenshots/notice-expanded.png"
},
{
"case_id": "TDD-WP2-EXP-002-empty-latest",
"parent_family": "TDD-WP2-EXP-002",
"requirement_ac_source": "EXPORT-04、AC-23、38 P0-A 子集",
"fixture_ids": [
],
"fixture_and_preconditions": "从未导出但有成功原图的项目",
"numbered_steps": "1. 打开项目详情/latest 区;2. 请求 JPG/PNG latest3. 使用允许动作",
"expected_response_ui": "显示“暂无导出成品”,只提供进入编辑并导出和下载原始生成图",
"expected_db_files": "latest_exports 无行且不因读取创建;原图读取只读",
"forbidden_side_effects": "不自动合成/保存默认成品,不伪造跨设备下载,不改变项目",
"evidence_files": "response.json、db-diff.json、trace.zip、screenshots/no-export.png"
},
{
"case_id": "TDD-WP7-UI-001-page-state-evidence",
"parent_family": "TDD-WP7-UI-001",
"requirement_ac_source": "UIDesign 全页、NFR-02、06、AC-24、25、32、41、55、56",
"fixture_ids": [
],
"fixture_and_preconditions": "第 11.1 节 22 page_id 与适用状态、最终 Chrome/Edge、100%/200%",
"numbered_steps": "1. 逐非 N/A 单元运行 case2. 截图/键盘/axe;3. 验证全局容量条;4. 对照 Pencil 相关 frame5. 人工复核",
"expected_response_ui": "所有 UIDesign 页面/状态有实现证据且无重叠;Canvas Index 不实现;无 frame 页面不漏测",
"expected_db_files": "只生成 UI 证据;交互 DB 变化由所属业务 case 证明",
"forbidden_side_effects": "不用 PNG OCR 推文案、不把 frame 当页面全集、不以 N/A 逃避容量条/错误态",
"evidence_files": "每单元 trace.zip、axe.json、screenshots/100pct.png、screenshots/200pct.png、manual-review.json"
},
{
"case_id": "TDD-WP4-EXP-001-format-ratio",
"parent_family": "TDD-WP4-EXP-001",
"requirement_ac_source": "EXPORT-01 至 03、AC-23",
"fixture_ids": [
"FX-CANVAS-RATIOS"
],
"fixture_and_preconditions": "FX-CANVAS-RATIOSJPG quality 参数化 80/92/100PNG",
"numbered_steps": "1. 对四比例分别导出 JPG/PNG2. 解码像素/ICC3. 与 Canvas fixture 比较",
"expected_response_ui": "尺寸精确为 1080×1440、1080×1080、1440×1080、1080×1920sRGB、无水印、PNG 无损、JPG 范围/默认正确",
"expected_db_files": "纯客户端合成本身无 DB 变化;后续保存只处理同一 Blob",
"forbidden_side_effects": "不缩放到其他尺寸;PNG 时质量控件不可聚焦;不因导出改变画布/撤销栈",
"evidence_files": "每组合 result.json、image-metadata.json、pixel-diff.json、export-hash.json"
},
{
"case_id": "TDD-WP2-ERR-001-upstream-failed",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-09、16、17.18、AC-04、53",
"fixture_ids": [
],
"fixture_and_preconditions": "独立 upstream_failed fixture;已提交任务临时失败",
"numbered_steps": "1. 触发临时失败;2. 检查唯一下一步为“稍后重试”;3. 在受控条件恢复后点击;4. 查询原任务、新任务和项目",
"expected_response_ui": "原任务 failed/category=upstream_failed;只提供“稍后重试”;动作后同项目新增一个 GenerationJob",
"expected_db_files": "原任务 release 一次且无 output;新任务独立 reserve 和关系快照",
"forbidden_side_effects": "不显示“使用原输入重试”或输入/模型修改动作;不自动重试、不创建第二项目",
"evidence_files": "response.json、worker-events.json、db-diff.json、screenshots/upstream-failed.png"
},
{
"case_id": "TDD-WP0-STO-003-cleanup-remeasure",
"parent_family": "TDD-WP0-STO-003",
"requirement_ac_source": "ADMIN-06、17.19、AC-31、55",
"fixture_ids": [
],
"fixture_and_preconditions": "full;查询时全部为无引用、可清理的历史贴纸文件",
"numbered_steps": "1. 查询候选并创建 intent;2. 参数 A 在确认前给其中一项新增 active/trashed 项目、已发布版本或待发布引用,再确认;3. 参数 B 保持全部无引用并确认;4. 读取排队容量;5. Worker 物理删除并重计量",
"expected_response_ui": "A 返回 ASSET_HISTORY_REFERENCE_CONFLICT 且整批不排队;B 整批排队,排队阶段仍 full,物理删除并重计量后才按真实值恢复",
"expected_db_files": "A 只追加 result=denied 审计且 managed bytes 不变;B scheduled 前后 bytes 不变,物理成功后 files/queue/bytes/status/last_measured_at 同事务更新",
"forbidden_side_effects": "不让查询时已有引用文件进入候选;不部分排队冲突批次;不在物理删除前减量;不自动创建 intent",
"evidence_files": "每参数 response.json、db-diff.json、worker-events.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP2-BAL-001-balance-impact",
"parent_family": "TDD-WP2-BAL-001",
"requirement_ac_source": "GEN-14、15、17.17、AC-04、51",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化 model/account/unknown 影响;活动任务与空闲模型",
"numbered_steps": "1. 注入余额不足;2. 结算已提交任务;3. GET models/后台;4. 重复事件;5. 未确认恢复前尝试启用",
"expected_response_ui": "影响范围按规则;任务 failed+release 一次;runtime 不可用;恢复前操作阻断",
"expected_db_files": "GatewayBalanceState/affected models/runtime/审计更新;ModelConfig hash 不变",
"forbidden_side_effects": "不自动充值、不用 Dada 点数继续调用、不重复 release、不自动恢复或改默认/priority",
"evidence_files": "response.json、db-diff.json、worker-events.json、external-calls.json"
},
{
"case_id": "TDD-WP2-ERR-001-safety-rejected",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-10、16、17.18、AC-04、53",
"fixture_ids": [
],
"fixture_and_preconditions": "供应商明确安全拒绝证据;与 reference fixture 完全分离",
"numbered_steps": "1. 触发安全拒绝;2. 检查唯一下一步为“修改提示词或参考图”;3. 不修改输入尝试继续;4. 修改提示词或参考图后提交",
"expected_response_ui": "原任务 rejected/category=safety_rejected;未修改时不能新提交;修改后同项目新增 GenerationJob",
"expected_db_files": "原任务 release 一次、无 output;修改前无新 job/reserve;修改后新任务保存修正快照",
"forbidden_side_effects": "不提供原样/稍后重试、选择模型或联系管理员;不保存违规输出;不映射为 reference_invalid",
"evidence_files": "response.json、worker-events.json、db-diff.json、screenshots/safety-rejected.png"
},
{
"case_id": "TDD-WP2-ERR-001-gateway-balance",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-15、16、17.17、17.18、AC-40、51、53",
"fixture_ids": [
],
"fixture_and_preconditions": "gateway_balance_insufficient 创建前/后 fixture;明确未受影响模型集合",
"numbered_steps": "1. 触发余额不足;2. 检查下一步仅“选择未受影响模型或联系管理员”;3. 显式选择未受影响模型并重新确认;4. 无候选时检查联系管理员",
"expected_response_ui": "返回/保存 category=gateway_balance_insufficient;已提交任务 failed;只有改选未受影响模型后才能新提交",
"expected_db_files": "创建前无 reserve/job;创建后 release 一次;新任务使用改选模型快照;runtime 影响范围按 GEN-15 更新",
"forbidden_side_effects": "不提供等待、原输入/稍后重试或任意“其他模型”;不自动充值、不用 Dada 点数恢复、不回写 ModelConfig",
"evidence_files": "response.json、db-diff.json、external-calls.json、screenshots/gateway-balance.png"
},
{
"case_id": "TDD-WP3-MDL-002-cas-conflict",
"parent_family": "TDD-WP3-MDL-002",
"requirement_ac_source": "ADMIN-03、AC-30",
"fixture_ids": [
],
"fixture_and_preconditions": "两个 admin 基于 expected N 编辑不同完整集合",
"numbered_steps": "1. A 保存为 N+12. B 仍以 N 保存;3. B 刷新",
"expected_response_ui": "A 成功;B 返回 412 MODEL_CONFIG_VERSION_CONFLICT 和最新安全摘要",
"expected_db_files": "仅 A 的 immutable set、pointer、审计/outbox 存在;B 零写入",
"forbidden_side_effects": "B 不覆盖 A、不自动 merge、不复用过期配置继续提交",
"evidence_files": "两份 response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP1-DEL-002-anonymous-retention",
"parent_family": "TDD-WP1-DEL-002",
"requirement_ac_source": "AUTH-06、17.10、17.11、AC-22、39",
"fixture_ids": [
],
"fixture_and_preconditions": "注销前有生成/点数事件和私有访问审计;可控 180 天时钟",
"numbered_steps": "1. 注销;2. 检查匿名字段;3. 在到期前尝试管理删除;4. 到期运行 Worker",
"expected_response_ui": "匿名事件只含允许统计;访问审计目标不可反推;到期前不可删,到期后系统清理",
"expected_db_files": "原身份关联移除;随机匿名主体无映射;expires_at 不因注销延长;到期行删除",
"forbidden_side_effects": "不保留邮箱/IP/提示词/图片/项目/job 原 ID,不让管理员手删或延长期限",
"evidence_files": "db-diff.json、retention-events.json、redaction.json"
},
{
"case_id": "TDD-WP3-MDL-002-replace-default",
"parent_family": "TDD-WP3-MDL-002",
"requirement_ac_source": "ADMIN-03、17.2、AC-30",
"fixture_ids": [
"FX-MODEL-VERIFIED"
],
"fixture_and_preconditions": "FX-MODEL-VERIFIEDcurrent set version N",
"numbered_steps": "1. 完整提交三模型集合:停用当前默认并指定另一个 enabled default2. 带 expected N/Idempotency-Key3. GET models",
"expected_response_ui": "保存成功,读取始终恰一个 enabled defaultconfig_set_version=N+1",
"expected_db_files": "新 immutable set/必要 config versions、AdminOperationLog/outbox 写入,最后原子切 current pointer",
"forbidden_side_effects": "不出现可见零默认/双默认中间态;不逐行部分保存;不改无关 runtime",
"evidence_files": "request.json、response.json、db-diff.json、transaction-trace.json"
},
{
"case_id": "TDD-WP1-AUTH-003-entry-state-matrix",
"parent_family": "TDD-WP1-AUTH-003",
"requirement_ac_source": "AUTH-01、02、05、06、AC-33",
"fixture_ids": [
],
"fixture_and_preconditions": "参数化未注册、active 已注册、deleted、suspended 邮箱;注册和登录两个入口",
"numbered_steps": "1. 每种邮箱分别调注册发码与登录发码;2. 对允许分支完成验证码;3. 检查页面不自动切入口",
"expected_response_ui": "行为严格匹配 PRD AUTH-02 状态矩阵;deleted 仅可新邀请注册;suspended 均提示联系管理员",
"expected_db_files": "只允许的分支创建 challenge/session/new user;重复注册不核销邀请码;deleted 新建主体与旧主体无关联",
"forbidden_side_effects": "不静默注册/登录转换;不恢复 deleted 数据;不因 suspended 释放名额;错误不泄漏后台白名单",
"evidence_files": "每参数 response.json、db-diff.json、trace.zip、screenshots/entry-state.png"
},
{
"case_id": "TDD-WP4-PERF-001-budget",
"parent_family": "TDD-WP4-PERF-001",
"requirement_ac_source": "NFR-03、AC-27、32",
"fixture_ids": [
"FX-CANVAS-50"
],
"fixture_and_preconditions": "FX-CANVAS-50、1,407 贴纸目录、四比例导出、最终浏览器",
"numbered_steps": "1. 预热一次;2. 每预算运行五次;3. 记录 p50/p95/max/memory/DOM4. 注入导出失败",
"expected_response_ui": "第 10.2 节所有预算通过;失败不破坏 project/latest;资源面板节点不线性增长",
"expected_db_files": "只生成性能数据;失败分支 DB/latest 不变",
"forbidden_side_effects": "不提高超时、减少元素/素材或降低尺寸掩盖失败,不用 Chromium 替代真实浏览器",
"evidence_files": "performance.json、memory.json、dom-count.json、environment.json"
},
{
"case_id": "TDD-WP2-CRED-001-insufficient",
"parent_family": "TDD-WP2-CRED-001",
"requirement_ac_source": "CREDIT-04、AC-28",
"fixture_ids": [
"FX-CREDIT-INSUFFICIENT"
],
"fixture_and_preconditions": "FX-CREDIT-INSUFFICIENT,成本 1",
"numbered_steps": "1. UI 检查生成按钮;2. 直接调生成 API 防绕过;3. 查询 DB/网关 mock",
"expected_response_ui": "UI 禁用并显示 available/reserved/required/联系管理员;API 返回冻结错误语义",
"expected_db_files": "余额、ledger、job、project、reference、outbox 均无变化",
"forbidden_side_effects": "上游调用 0;无 storage reservation/staging 文件;不产生负余额",
"evidence_files": "response.json、db-diff.json、external-calls.json、screenshots/insufficient.png"
},
{
"case_id": "TDD-WP0-STO-002-over-limit",
"parent_family": "TDD-WP0-STO-002",
"requirement_ac_source": "17.19、NFR-05、AC-55",
"fixture_ids": [
],
"fixture_and_preconditions": "已计量+活动预留=5,368,709,119,预计写 2 字节",
"numbered_steps": "1. 分别尝试生成/参考图/export/贴纸原图/缩略图;2. 查询所有副作用",
"expected_response_ui": "每次 507 STORAGE_CAPACITY_EXCEEDED,返回非敏感状态和 remaining bytes",
"expected_db_files": "storage state 保持由实际量决定;无新 reservation/managed file/latest export/job/ledger/outbox",
"forbidden_side_effects": "上游调用 0;无 staging 残留;不把单个超大请求伪造成持久 full(若现有承诺仍低于上限)",
"evidence_files": "每路由 response.json、db-diff.json、fs-after.json、external-calls.json"
},
{
"case_id": "TDD-WP2-ERR-001-reference-invalid",
"parent_family": "TDD-WP2-ERR-001",
"requirement_ac_source": "GEN-05、16、17.18、AC-04、44、53",
"fixture_ids": [
],
"fixture_and_preconditions": "格式/大小/数量和非安全型内容不可用四组 fixture;不得使用安全拒绝响应",
"numbered_steps": "1. 分别触发创建前/后无效;2. 检查唯一下一步为“更换或移除参考图”;3. 不改参考图尝试继续;4. 更换/移除后提交",
"expected_response_ui": "category=reference_invalid;未修改时不创建新任务;更换/移除后同项目新增 GenerationJob",
"expected_db_files": "创建前无 job/reserve;创建后 failed+release 一次;修正后保存新的 reference snapshot",
"forbidden_side_effects": "不提供修改提示词、重试、等待、选模型或联系管理员;不映射为 safety_rejected",
"evidence_files": "每 fixture response.json、worker-events.json、db-diff.json、screenshots/reference-invalid.png"
},
{
"case_id": "TDD-WP4-EXP-001-confirm-pending-edit",
"parent_family": "TDD-WP4-EXP-001",
"requirement_ac_source": "PROJECT-04、06、EXPORT-03、AC-23",
"fixture_ids": [
],
"fixture_and_preconditions": "saved 画布、一次未提交文字/样式编辑、撤销栈深度 U",
"numbered_steps": "1. 打开导出;2. 看到“导出前需要提交当前修改”;3. 确认;4. 等待画布稳定并启动正常自动保存;5. 合成导出;6. 执行一次撤销",
"expected_response_ui": "导出使用确认后的状态;确认使撤销栈 U→U+1 且撤销可回到确认前;导出动作不再增加撤销项",
"expected_db_files": "确认后的完整状态进入正常保存队列;保存成功按 PROJECT-04 增加 state_versionlatest 是否更新由后续保存结果决定",
"forbidden_side_effects": "不在确认时产生多条撤销;不以导出额外编辑画布;不导出确认前状态;不跳过自动保存流程",
"evidence_files": "undo-trace.json、network-timeline.json、export-hash.json、trace.zip、screenshots/pending-confirm.png"
},
{
"case_id": "TDD-WP3-BAL-001-confirmed-recovery",
"parent_family": "TDD-WP3-BAL-001",
"requirement_ac_source": "GEN-14、15、ADMIN-09、AC-51",
"fixture_ids": [
],
"fixture_and_preconditions": "余额导致 model/account/unknown runtime unavailable;无/有真实恢复确认",
"numbered_steps": "1. 未确认时点击恢复;2. 执行非敏感健康检查;3. admin 明确确认;4. 重新计算所有阻断原因",
"expected_response_ui": "无确认失败;确认真实恢复后只解除已满足原因,仍有其他原因则继续 unavailable",
"expected_db_files": "recovery check、GatewayBalanceState/runtime/AdminOperationLog 同事务更新;config set 不变",
"forbidden_side_effects": "不自动恢复/充值,不补扣用户点数,不清除仍存在的 contract/Worker 阻断",
"evidence_files": "response.json、db-diff.json、external-calls.json、screenshots/recovery.png"
},
{
"case_id": "TDD-WP4-DYN-003-identity-font",
"parent_family": "TDD-WP4-DYN-003",
"requirement_ac_source": "DYN-05 至 09、AC-18、19",
"fixture_ids": [
],
"fixture_and_preconditions": "用户社交 ID 含/不含 @;实例覆盖;DYN012/FONT081",
"numbered_steps": "1. 插入身份贴纸;2. 修改实例覆盖;3. 检查账号资料;4. 插入 DYN0125. 重开/导出",
"expected_response_ui": "最多一个前导 @;实例覆盖独立且不改账号;DYN012 使用 FONT081 并明确标注替代",
"expected_db_files": "只保存实例 snapshotUserProfile 不变",
"forbidden_side_effects": "不声称 DIN 字体、不静默回退、不执行 Lua/Prefab、不把覆盖写账号",
"evidence_files": "canvas-state.json、db-diff.json、font-load.json、pixel-diff.json"
},
{
"case_id": "TDD-WP0-CACHE-001-public-lru",
"parent_family": "TDD-WP0-CACHE-001",
"requirement_ac_source": "NFR-07、17.14、AC-46、48",
"fixture_ids": [
],
"fixture_and_preconditions": "公开资源超过 157,286,400 字节;internal/private/project/提示词 fixture",
"numbered_steps": "1. 按访问顺序填充 public cache2. 触发写前 LRU;3. 尝试缓存私有类型;4. 枚举 SW/Cache/IndexedDB",
"expected_response_ui": "总量不超上限,淘汰最久未用且当前资源可重取;私有类型均不缓存",
"expected_db_files": "public_asset_lru 只含公开元数据;业务 DB 无变化",
"forbidden_side_effects": "不缓存 internal preview、私有内容、项目、验证码、session、未保存编辑;不计用户下载",
"evidence_files": "cache-enumeration.json、lru-trace.json、trace.zip"
},
{
"case_id": "TDD-WP0-FILE-001-atomic-commit",
"parent_family": "TDD-WP0-FILE-001",
"requirement_ac_source": "NFR-05、17.19、AC-44、55",
"fixture_ids": [
],
"fixture_and_preconditions": "受控文件驱动;合法/错误 MIME、hash、..、符号链接逃逸;各崩溃点",
"numbered_steps": "1. 流式写 staging2. 校验/预留;3. 在改名/DB 提交前后终止;4. 重启对账",
"expected_response_ui": "非法输入拒绝;成功对象完整可读;崩溃后恢复为已提交或补偿清理,不出现半对象",
"expected_db_files": "reservation、managed_files、staging/正式文件按提交点一致;启动对账修复计量",
"forbidden_side_effects": "不接受扩展名猜 MIME、不越根、不产生可读半文件/孤儿引用/重复计量",
"evidence_files": "response.json、crash-points.json、db-diff.json、fs-before.json、fs-after.json"
},
{
"case_id": "TDD-WP2-REF-001-reference-lifecycle",
"parent_family": "TDD-WP2-REF-001",
"requirement_ac_source": "GEN-05、PROJECT-09、AC-44、48",
"fixture_ids": [
],
"fixture_and_preconditions": "新上传、同项目已有 reference、他人/跨项目/撤销/已 purge reference",
"numbered_steps": "1. 提交前在页面选择/移除;2. multipart 新上传;3. 同项目复用;4. 尝试越权/失效;5. 删除项目",
"expected_response_ui": "提交前仅内存;每 job 独立关系快照;仅同 owner+project 可复用;purge 后立即不可读",
"expected_db_files": "成功建立 job reference/managed file;移除前无文件;purge 撤销关系并排清理",
"forbidden_side_effects": "不修改旧任务关系、不跨用户/项目复用、不缓存预提交图片、不暴露路径",
"evidence_files": "每参数 response.json、db-diff.json、fs-after.json、cache-enumeration.json"
},
{
"case_id": "TDD-WP7-REL-001-final-release-record",
"parent_family": "TDD-WP7-REL-001",
"requirement_ac_source": "NFR-01、09、AC-24、41",
"fixture_ids": [
],
"fixture_and_preconditions": "最终便携 ZIP、START-HERE、SHA-256、RELEASE,真实验收电脑",
"numbered_steps": "1. 校验制品 hash2. 导入 Windows build/Chrome/Edge 品牌、major/full version3. 两浏览器跑全部发布 E2E/视觉/性能;4. 比较候选基线",
"expected_response_ui": "RELEASE/制品/诊断/门禁值一致;任一漂移使旧视觉/性能失去发布资格并重跑",
"expected_db_files": "只生成发布记录/证据;业务 fixture 在隔离验收根",
"forbidden_side_effects": "不缺 RELEASE、不手填假版本、不接受前一 major/Chromium、不动态换端口",
"evidence_files": "RELEASE.json、environment.json、package-manifest.json、evidence.json"
},
{
"case_id": "TDD-WP2-PROJ-002-cas-success",
"parent_family": "TDD-WP2-PROJ-002",
"requirement_ac_source": "PROJECT-04、17.3、AC-20",
"fixture_ids": [
],
"fixture_and_preconditions": "owner project version N,完整合法 Canvas JSON",
"numbered_steps": "1. PUT state with If-Match: N2. GET project3. 用相同幂等请求重放",
"expected_response_ui": "首次成功并返回 saved/N+1;重放返回第一次结果",
"expected_db_files": "UPDATE ... state_version=N 命中一行;project_states 新快照,state_version 仅 +1",
"forbidden_side_effects": "不隐式上传/复制/派生资源;不泄漏或接受他人资源引用;不因重放 +2",
"evidence_files": "request.json、response.json、db-diff.json"
},
{
"case_id": "TDD-WP4-TXT-003-catalog-search-recent",
"parent_family": "TDD-WP4-TXT-003",
"requirement_ac_source": "TEXT-01、17.6、AC-09、32",
"fixture_ids": [
],
"fixture_and_preconditions": "P0-A 32 文字模板、四分类、稳定 catalog、两个用户",
"numbered_steps": "1. 未选模板尝试加文字;2. 按显示名称搜索;3. 检查分类/顺序;4. 使用模板;5. 切换账号读最近使用",
"expected_response_ui": "只能从模板添加;四类/显示名搜索/稳定顺序正确;最近使用按账号隔离",
"expected_db_files": "只在成功使用后更新 recent_assets;未选/搜索不写项目",
"forbidden_side_effects": "不提供独立普通文字,不复用普通贴纸搜索,不跨账号共享最近项",
"evidence_files": "catalog.json、response.json、db-diff.json、trace.zip"
},
{
"case_id": "TDD-WP1-AUTH-001-final-recheck-race",
"parent_family": "TDD-WP1-AUTH-001",
"requirement_ac_source": "AUTH-01、NFR-04、AC-01、02、45",
"fixture_ids": [
"FX-INVITE-VALID"
],
"fixture_and_preconditions": "FX-INVITE-VALID 已成功发码;随后参数化为邀请码耗尽/停用/过期或第 10 个名额被另一事务占用",
"numbered_steps": "1. 完成前改变可变条件;2. 调 REGISTER_COMPLETE3. 用相同 Idempotency-Key 重试",
"expected_response_ui": "返回对应冻结错误;不建立 session,不进入创作;相同重试返回同一失败结果",
"expected_db_files": "BEGIN IMMEDIATE 后无新 user/profile/credit/consent/session;邀请码次数不增加;名额统计不变",
"forbidden_side_effects": "不出现账号已建但邀请码未核销、邀请码已核销但账号未建或初始点数孤儿流水",
"evidence_files": "response.json、db-diff.json、transaction-trace.json"
},
{
"case_id": "TDD-WP3-MDL-001-seed-read",
"parent_family": "TDD-WP3-MDL-001",
"requirement_ac_source": "GEN-01、ADMIN-03、17.2、AC-30",
"fixture_ids": [
"FX-MODEL-SEED"
],
"fixture_and_preconditions": "全新迁移后的 FX-MODEL-SEED",
"numbered_steps": "1. 启动迁移;2. 调 GET /api/v1/models3. 查集合约束",
"expected_response_ui": "返回固定三模型;Flash 唯一 configured defaultpriority 1/2/3recommended null;三者 contract unverified/runtime unavailable",
"expected_db_files": "一个 current set,三个 immutable member/version,独立 runtime 行",
"forbidden_side_effects": "不把 unverified 标为 available;不生成第二默认;不把 recommended 写配置",
"evidence_files": "response.json、db-diff.json"
},
{
"case_id": "TDD-WP5-RES-001-three-access-classes",
"parent_family": "TDD-WP5-RES-001",
"requirement_ac_source": "PRIV-02、05、17.12、13、AC-42、48",
"fixture_ids": [
],
"fixture_and_preconditions": "public、internal_preview、private 资源及不同主体/grant",
"numbered_steps": "1. 请求三类 manifest/资源;2. 推导 stable ID/路径;3. 撤销 grant 后重取;4. 检查 headers/缓存",
"expected_response_ui": "public 可匿名于产品授权范围读取;preview 每次验 grant/no-storeprivate 仅所有者/受控 admin;越权 403/404",
"expected_db_files": "读取无业务写,访问审计仅私有完整内容规定入口产生",
"forbidden_side_effects": "不混路由/cache header,不返回路径/internal manifest,不用公开 ID 推导私有对象",
"evidence_files": "每主体 response.json、headers.json、cache-enumeration.json"
}
]
}