# 测试数据矩阵

**功能**:
**最后更新**:
**负责人**:

| 场景 / Req ID | Data ID | 数据类型 | 初始化方式 | 重置方式 | 边界 / 负向用例 | 隔离策略 | 负责人 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| REQ-001 | seed-default-001 | normal | | | | | |
| PKG-LAYER-P6-READINESS | readiness-thin-clean | normal | `tools/harness/tests/test-install-modes.ps1` 创建临时 git repo，并运行 `tools/install/install-agent.ps1 -Scope project` 生成 thin 输出。 | 每次 smoke 使用新的 `%TEMP%\codex-install-smoke-*` 根目录；测试结束允许系统临时目录清理。 | 无负向；期望 `Readiness gate: PASS`、`ProjectShape: thin-project`、`FixCommand: none`。 | 每个 fixture 使用唯一 temp 路径和独立 git repo，不复用用户真实项目。 | harness |
| PKG-LAYER-P6-READINESS | readiness-missing-user-package | negative | 基于 thin clean fixture，临时改写 `.codex-harness/state/config.json` 的 `packageRoot` 指向项目内不存在目录。 | 断言后写回原始 config 内容；fixture 位于独立 temp repo。 | 用户级 package 缺失；期望 `Readiness gate: WARN`、`ProjectShape: thin-project-missing-user-package` 和 `-Scope user` 修复命令。 | 只改 temp fixture 的 config，不触碰真实 `%USERPROFILE%\.codex\packages`。 | harness |
| PKG-LAYER-P6-READINESS | readiness-legacy-residue | negative | 基于 thin clean fixture，手动创建 `.agents/` 和 `docs/testing/` 作为 legacy residue。 | 不删除 residue，由 temp repo 生命周期隔离；doctor 必须保持只读。 | legacy/vendor 残留；期望 `Readiness gate: WARN`、`ProjectShape: thin-project-with-legacy-residue` 和 `-MigratePlan` 修复命令。 | residue 只写入 temp repo；不对真实项目递归删除。 | harness |
| PKG-LAYER-P6-READINESS | readiness-vendor-lock | compatibility | `tools/harness/tests/test-install-modes.ps1` 创建临时 git repo，并运行 `tools/install/install-agent.ps1 -Scope vendor` 生成完整 `.agents/` 和 vendor lock。 | 每次 smoke 使用新的 temp repo；不复用前一场景。 | vendor 兼容路径；期望 `Readiness gate: PASS`、`ProjectShape: vendor-project` 和显式 `-Scope vendor` 修复命令。 | vendor fixture 独立于 thin fixture，避免 lock/config 交叉污染。 | harness |
| PKG-LAYER-P6-READINESS | readiness-no-config | negative | `New-TempGitRepo` 创建空临时 git repo，不运行安装器，不创建 `.codex-harness/`。 | 空 repo 仅用于本次断言；测试结束由 temp 根目录隔离。 | 未安装项目；期望 doctor exit 非 0、`Readiness gate: FAIL`、`ProjectShape: not-installed` 和 `-Scope project` 初始化命令。 | 独立 temp repo；doctor 不得自动创建 `.codex-harness/`、`.codex/` 或 `.agents/`。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-default-thin-install | normal | `New-TempGitRepo` 创建空临时 git repo，运行默认 `tools/install/install-agent.ps1 -ProjectRoot <fixture> -InitSmoke`。 | 每次 smoke 使用新的 temp repo；不复用 scope/vendor/full fixture。 | 默认输出必须为 thin；禁止 `.agents/`、`docs/harness/`、`docs/testing/`、`docs/knowledge/`、`docs/requirement-prep-kit/`。 | 独立 temp repo；默认安装不触碰真实业务项目。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-legacy-full-install | compatibility | `New-TempGitRepo` 创建空临时 git repo，运行 `-Mode full -InitSmoke`。 | temp repo 生命周期隔离；不删除 legacy 输出。 | 显式 full 必须保留 `.agents/`、legacy docs 和 readiness legacy warning。 | 与默认 thin fixture 分离，避免 full 输出污染 thin 断言。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-scope-project-install | normal | `New-TempGitRepo` 创建空临时 git repo，运行 `-Scope project -InitSmoke`。 | 每次 smoke 使用新的 temp repo；不复用默认 fixture。 | `-Scope project` 输出必须等价 thin，禁止 legacy/vendor 目录。 | 独立 temp repo；用户级 package 只写入临时解析路径。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-scope-vendor-install | compatibility | `New-TempGitRepo` 创建空临时 git repo，运行 `-Scope vendor`。 | 每次 smoke 使用新的 temp repo。 | vendor-only 输出必须存在 `.agents/` 和 vendor lock，且不得输出 project runtime/spec docs。 | 独立 vendor fixture；不与 legacy full fixture共用。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-scope-user-install | normal | 将 `USERPROFILE` 指向临时项目目录后运行 `-Scope user`。 | 断言结束恢复原始 `USERPROFILE`；临时目录隔离。 | 只安装用户级 package、skills/workflows 和 user lock；不得创建 project runtime。 | 不触碰真实 `%USERPROFILE%`；所有用户级输出在 temp profile 内。 | harness |
| PKG-LAYER-P7-DEFAULT-THIN | p7-install-plan-profiles | negative | 分别创建 `default-plan`、`scope-project-plan`、`legacy-project-plan` 空临时 repo，运行默认 `-Plan`、`-Scope project -Plan`、`-Mode project -Plan`。 | plan 命令必须只读；fixture 可直接丢弃。 | thin plan 禁止 legacy docs；legacy `-Mode project -Plan` 必须显式保留 legacy docs。 | plan fixture 独立，不创建 `.agents/` 或 `.codex-harness/`。 | harness |
| PKG-LAYER-P8-CLI-ALIAS | p8-install-user-wrapper | normal | 将 `USERPROFILE` 指向 temp profile，运行 `tools/install/install-user.ps1`，由 wrapper 转发到同目录 `tools/install/install-agent.ps1 -Scope user`。 | 断言结束恢复原始 `USERPROFILE`；temp profile 生命周期隔离。 | wrapper 必须输出 `AliasScope: user` 并生成用户级 package lock；不得写入业务项目 runtime、`.codex-harness/` 或 `.agents/`。 | 不触碰真实 `%USERPROFILE%`；用户级输出全部在 temp profile 内。 | harness |
| PKG-LAYER-P8-CLI-ALIAS | p8-init-project-wrapper | normal | `New-TempGitRepo` 创建空临时 git repo，运行 `tools/install/init-project.ps1 -ProjectRoot <fixture> -InitSmoke -SkipBaselineCommit`，由 wrapper 转发到 `tools/install/install-agent.ps1 -Scope project`。 | 每次 smoke 使用新的 temp repo；不复用默认 thin、vendor 或 legacy full fixture。 | wrapper 必须输出 `AliasScope: project`，生成 thin required paths，并禁止 `.agents/`、`docs/harness/`、`docs/testing/`、`docs/knowledge/`、`docs/requirement-prep-kit/`。 | 独立 temp repo；项目输出与 `-Scope project` fixture 对比，不污染真实业务项目。 | harness |
| PKG-LAYER-P8-CLI-ALIAS | p8-wrapper-no-double-implementation | negative | 读取 `tools/install/install-user.ps1`、`tools/install/init-project.ps1` 及 package template wrapper 源码，检查只定位同目录 `tools/install/install-agent.ps1` 并转发参数。 | 只读源码检查，无需重置；若 refresh 同步后 wrapper 不一致，由 package CheckOnly 捕获。 | wrapper 不得复制 `tools/install/install-agent.ps1` 大段安装逻辑，不得绕过 manifest、lock、doctor 或 scope 语义。 | 只读检查 root/agent/template 三个 surface；不执行破坏性文件操作。 | harness |

## 规则

- 每个 P0/P1 场景都应标明所需的 seed 或 fixture 数据。
- 负向和权限场景不应依赖临时手工准备。
- 破坏性场景必须定义重置或隔离策略。
- 并发、幂等、跨租户和历史数据场景必须使用独立 namespace、tenant、事务回滚或可清理 seed。
