Compare commits

..
+94
View File
@@ -0,0 +1,94 @@
# TASK:两个会误报的测试(2026-11-12)
- Gitea:#205
- 分支:`codex/flaky-tests-20261112`(基于 staging `017e650fdafac4a841487dbba4aca803c761dad8`)
- Bug 编号:BUG-1850。开工时核对 `docs/BUG_HISTORY.md` 末尾;若已被占用,顺延,并在 PROGRESS 写明。
- 负责验收:Claude(jyotisha-de)
不得自行写“产品决定/裁定”;任务书没写的取舍一律选需拍板。
不得修改或删除既有断言来让测试通过;确需修改必须写原值/新值/原因,并在 PROGRESS 里逐条列出。
## 一、回答时钟测试靠真实计时,CI 负载高时会失败
测试:`frontend/tests/consult-evidence-lookup-20260927.test.ts:280`,
「a lookup does not reset the answer clock: the same 70 s signal bounds the whole answer phase」。
用例的写法:
- `answerMs: 300`;
- 查表延迟 40 ms;
- 回答分 6 段,每段延迟 25 ms;
- 期望结果是 `run.failed:answer_truncated`。
实际情况:
- CI 运行 7208、7230 各失败过一次,单独重跑那一项就通过。
- 本机在负载下得到的是 `empty_answer`,不是 `answer_truncated`。
要做的:
1. 先查清楚负载下为什么会变成 `empty_answer`。在 PROGRESS 写明,是测试的时间预算问题,还是产品代码在边界上真的有分支差异。
- 如果是**产品**问题:停下来,选需拍板,不要改产品代码。
2. 如果是测试的问题,把这个用例改成不依赖真实耗时:
- 用注入的时钟或可控的 signal,让“回答阶段超时”在确定的那一步发生;
- 保留四个断言的含义:结果是 `answer_truncated`;`charges` 为 0;回答时钟只启动一次;有 `compose-abort`。
3. 用同样的方式检查同文件里其他依赖 `delayMs` 和预算的用例。只改那些在 4 倍 CPU 负载下会失败的,逐个列进 PROGRESS。
4. 本机验证:开 4 个后台 `yes > /dev/null` 加负载(Windows 用等效做法),同文件连续跑 20 遍,0 失败。验证完结束这些负载进程,按 PID 结束,**不要按名字批量结束进程**。
## 二、预置资料库测试默认读旧导出
测试:`tests/test_preset_evidence_library.py::test_every_her_file_exists_sha_matches_and_quotes_are_verbatim`。
- 它默认读 `/workspace/up-run-r40`(`scripts/preset_evidence/library.py` 里的 `DEFAULT_HER_EXPORT`)。
- 资料库现在钉的是她来源仓的 `1b33aff61d733213d9df67906ddf16473aafc9bb`,见 `references/preset_evidence_library/VERIFIED.json`。
- 本机如果存在旧的 r40 导出,这个测试会因 `scripts/dasha_analyzer.py` 的哈希不同而失败。CI 上没有这个目录,测试会跳过。
要做的:
1. 去掉对 `/workspace/up-run-r40` 的默认值。只有设置了环境变量 `PRESET_EVIDENCE_HER_EXPORT` 时,才跑需要导出的测试;没设置就跳过,并在 skip 原因里写明。
2. 设置了环境变量时,先核对这个目录和 `VERIFIED.json` 记录的来源是否一致。
- 有 `.git` 的,比对 HEAD;
- 没有的,比对 `VERIFIED.json` 里的文件哈希。
- 不一致时,测试**失败**,并给出明确信息:“来源与 VERIFIED.json 固定的版本不一致”。不能跳过。
3. CLI `python -m scripts.preset_evidence.library` 的 `--her-export` 改为必填,`--skip-her-export` 除外。帮助文字里写明要指向固定版本的来源仓。
4. 同步更新 `SCHEMA.md` 里关于导出目录的说明。
## 要改的文件
- `frontend/tests/consult-evidence-lookup-20260927.test.ts`。如果需要注入时钟,测试辅助文件也可以改;**不改 `frontend/src`**,除非第一节查明是产品问题,那种情况选需拍板。
- `scripts/preset_evidence/library.py`:只改默认路径和 CLI 参数。
- `tests/test_preset_evidence_library.py`、`tests/test_preset_library_gates_20261112.py`:只改导出相关的跳过和核对逻辑。
- `references/preset_evidence_library/SCHEMA.md`:只改导出目录的说明。
- `docs/BUG_HISTORY.md`:只在末尾追加一条。
- `docs/tasks/PROGRESS-flaky-tests-20261112.md`
## 不要碰
- `frontend/src/**`
- `frontend/src/lib/consult-preset-prompts.ts`
- 资料库条目和 `VERIFIED.json`
- 冻结文件
## 自测命令
```
cd frontend && npm test
python -m pytest -q tests/test_preset_evidence_library.py tests/test_preset_library_gates_20261112.py
PRESET_EVIDENCE_HER_EXPORT=<固定版本来源目录> python -m pytest -q tests/test_preset_evidence_library.py
python scripts/run_quality_gate.py --profile quick --skip-frontend-runtime
```
## 进度记录
写在 `docs/tasks/PROGRESS-flaky-tests-20261112.md`,内容包括:
- `empty_answer` 的原因;
- 改了哪些用例,加负载连续 20 遍的结果;
- 资料库测试分别在三种情况下的表现:未设置环境变量、设置为一致的来源、设置为不一致的来源;
- 测试结果,以及在 staging 上也复现的基线失败。
## 何时停下来选“需拍板”
- `empty_answer` 是产品代码的边界问题,不是测试的问题。
- 要稳定这个测试,只能放宽断言。