---
phase: 05-test-hardening-and-commit-hygiene
plan: 01
type: execute
wave: 1
depends_on:
  - 04-iframe-markdown-new-system-stabilization
files_modified:
  - frontend/tests/e2e/welcome-and-routing.spec.ts
  - frontend/tests/e2e/thread-routing.spec.ts
  - frontend/tests/e2e/input-and-compose.spec.ts
  - frontend/tests/e2e/message-and-history.spec.ts
  - frontend/tests/e2e/artifacts-and-thread-reuse.spec.ts
  - frontend/tests/e2e/support/chat-helpers.ts
  - frontend/playwright.config.ts
  - .planning/phases/05-test-hardening-and-commit-hygiene/05-UAT.md
  - .planning/phases/05-test-hardening-and-commit-hygiene/05-SUMMARY.md
autonomous: true
requirements:
  - TEST-01
  - TEST-02
  - TEST-03
must_haves:
  truths:
    - "E2E 关键路径在当前环境具备稳定执行结果：前端可控路径必须强断言通过，环境敏感路径必须可解释 skip。"
    - "测试输出必须形成 reviewer 可用证据：pass/skip/fail 统计 + skip 原因 + 失败定位入口。"
    - "提交结构按 concern 清晰拆分，避免 style/logic/tests/docs 混杂。"
  artifacts:
    - path: "frontend/tests/e2e/support/chat-helpers.ts"
      provides: "统一的路由构造、等待策略、skip 规则"
    - path: "frontend/tests/e2e/*.spec.ts"
      provides: "Phase 1~4 关键路径回归覆盖"
    - path: ".planning/phases/05-test-hardening-and-commit-hygiene/05-UAT.md"
      provides: "Phase 5 测试结论与问题清单"
  key_links:
    - from: "chat-helpers.ts"
      to: "all e2e specs"
      via: "统一等待与 skip 策略"
      pattern: "openChat|waitForMessageListReady|skipIfMissingThread"
    - from: "playwright.config.ts"
      to: "e2e execution"
      via: "环境变量与执行稳定性"
      pattern: "baseURL|retries|reporter"
---

<objective>
完成最终测试加固与提交卫生收口：形成稳定可解释的 E2E 结果，并将当前工作区变更整理为可审阅、可回滚的提交结构。

Purpose: 落实 TEST-01/TEST-02/TEST-03，保证 merge recovery 结束前质量可审计。  
Output: Phase 5 UAT + Summary + concern-based commit checklist。
</objective>

<context>
@.planning/PROJECT.md
@.planning/REQUIREMENTS.md
@.planning/ROADMAP.md
@.planning/phases/05-test-hardening-and-commit-hygiene/05-CONTEXT.md
@.planning/phases/04-iframe-markdown-new-system-stabilization/04-UAT.md
@frontend/playwright.config.ts
@frontend/tests/e2e/support/chat-helpers.ts
@frontend/tests/e2e/welcome-and-routing.spec.ts
@frontend/tests/e2e/thread-routing.spec.ts
@frontend/tests/e2e/input-and-compose.spec.ts
@frontend/tests/e2e/message-and-history.spec.ts
@frontend/tests/e2e/artifacts-and-thread-reuse.spec.ts
</context>

<tasks>

<task type="auto" tdd="true">
  <name>Task 1: E2E 套件稳定性硬化（TEST-01）</name>
  <files>
    frontend/tests/e2e/welcome-and-routing.spec.ts
    frontend/tests/e2e/thread-routing.spec.ts
    frontend/tests/e2e/input-and-compose.spec.ts
    frontend/tests/e2e/message-and-history.spec.ts
    frontend/tests/e2e/artifacts-and-thread-reuse.spec.ts
    frontend/tests/e2e/support/chat-helpers.ts
  </files>
  <behavior>
    - Test 1: 前端可控关键路径（路由、输入、发送、导出触发）维持强断言。
    - Test 2: 后端/fixture 敏感路径在数据缺失时 skip 且附明确原因。
    - Test 3: 不再出现因单点后端错误引发的无意义级联失败。
  </behavior>
  <action>
    统一 spec 断言策略与 helper 行为：将环境敏感断言抽象到 helper，并规范 skip 文案；对关键用户路径保留严格断言，避免“全部放宽”导致测试失真。
  </action>
  <verify>
    <automated>cd frontend &amp;&amp; npm run test:e2e -- welcome-and-routing.spec.ts thread-routing.spec.ts input-and-compose.spec.ts message-and-history.spec.ts artifacts-and-thread-reuse.spec.ts</automated>
  </verify>
  <done>
    E2E 套件在当前环境具备稳定、可解释结果，关键路径无假阴性。
  </done>
</task>

<task type="auto" tdd="true">
  <name>Task 2: 验证证据与 UAT 收敛（TEST-01, TEST-03）</name>
  <files>
    .planning/phases/05-test-hardening-and-commit-hygiene/05-UAT.md
    .planning/phases/05-test-hardening-and-commit-hygiene/05-SUMMARY.md
  </files>
  <behavior>
    - Test 1: UAT 包含 pass/issue/skip 统计与逐项说明。
    - Test 2: skip 场景必须有明确环境原因，不允许模糊表述。
    - Test 3: Summary 能反向追溯到验证命令与关键文件。
  </behavior>
  <action>
    基于实际执行命令产出 Phase 5 的 UAT 与 SUMMARY，保证 reviewer 能复现与审计；明确哪些结果是环境限制，哪些是代码风险。
  </action>
  <verify>
    <automated>test -f .planning/phases/05-test-hardening-and-commit-hygiene/05-UAT.md &amp;&amp; test -f .planning/phases/05-test-hardening-and-commit-hygiene/05-SUMMARY.md</automated>
  </verify>
  <done>
    验证证据链完整，后续 `gsd-complete-milestone` 可直接消费。
  </done>
</task>

<task type="auto" tdd="false">
  <name>Task 3: 提交卫生整理（TEST-02）</name>
  <files>
    (working tree concern groups)
  </files>
  <behavior>
    - 提交按 concern 分组（style / logic / tests / docs）。
    - 每组提交都能对应最小验证命令。
    - 不改写历史提交，不回滚无关用户变更。
  </behavior>
  <action>
    梳理当前工作区变更，形成 commit 建议清单与执行顺序；若本阶段执行提交，则严格按 concern 分批提交并附验证结果。
  </action>
  <verify>
    <automated>git status --short</automated>
  </verify>
  <done>
    提交结构清晰，PR 审阅成本可控。
  </done>
</task>

</tasks>

<threat_model>
## Trust Boundaries

| Boundary | Description |
|----------|-------------|
| `test assertions -> unstable backend fixtures` | 测试断言受后端数据波动影响，需要前端可控与环境依赖分层 |
| `working tree -> commit history` | 大量未提交改动进入历史前，必须按 concern 清洗并可追溯 |

## STRIDE Threat Register

| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-05-01 | R (Repudiation) | E2E result interpretation | mitigate | 统一 pass/skip/fail 规则与 skip 原因模板 |
| T-05-02 | D (Denial of Service) | flaky tests blocking pipeline | mitigate | helper 统一等待与条件 skip，减少假失败级联 |
| T-05-03 | T (Tampering) | mixed-concern commits | mitigate | 按 concern 分组提交并绑定最小验证命令 |
| T-05-04 | I (Information Disclosure) | log-driven decisions | accept | 本阶段不新增数据读取面，仅利用现有日志作定位 |
</threat_model>

<verification>
1. 目标 E2E 套件执行完成并产出可解释结果。  
2. Phase 5 UAT/SUMMARY 文档齐备且与执行结果一致。  
3. 提交整理策略明确，可直接进入提交或里程碑收尾。  
</verification>

<success_criteria>
- TEST-01：回归测试覆盖关键路径并稳定运行。  
- TEST-02：变更可按 concern 清晰提交，避免混乱历史。  
- TEST-03：验证结果对 reviewer 可审计、可复现、可解释。  
</success_criteria>

<output>
After completion, create `.planning/phases/05-test-hardening-and-commit-hygiene/05-SUMMARY.md`
</output>
