CLAUDE.md · git:20260920.56e926f · 2026-09-20 · sha256 b635a814a32674ba

CLAUDE.md git:20260920.56e926fA

Immutable. This exact content is served forever at /api/v1/blob/b635a814a32674ba.

# ming-qa

端到端 QA 验收工具包:`skills/` 下 8 个 skill + 一个 Python CLI。
运行时**零第三方依赖**(只用标准库),开发期只多一个 pytest。

## 常用命令

```bash
cd skills/quality-assurance-agent
python -m pytest tests/ -q          # 48 个测试文件;任何改动后必跑

cd ../..                             # 回仓库根
python skills/quality-assurance-agent/scripts/qa_agent.py check-mojibake . --strict
```

## 改动的验收标准

**修 bug 必须验证判别力**:把修复回滚掉,确认对应用例**变红**,再恢复。

只写一个「能通过」的测试不算完成——要能证明它在**没有这个修复时会失败**。
仓库里既有提交都按这条做过,新改动请保持一致。

## 这个仓库特有的三个坑

1. **提交信息不要用 heredoc 传中文。** Windows + Git Bash 会把中文写成乱码字符
   (U+FFFD),而 pytest 抓不到——它扫仓库文件,不扫 git 历史。
   稳妥做法:用 Write 写进临时文件,再 `git commit -F <文件>`。
   注意:本文件自身也不能出现那个字面字符,否则会被 `test_source_mojibake` 判违规。

2. **提交前确认 git 身份。** 全局配置是公司邮箱;本仓库已用**仓库级**身份覆盖为
   `mingdui`。不要动全局配置,也不要把它改回去。

3. **内部标识扫描会拒绝合并。** CI 拦内部项目名、业务词、私有网段 IP
   (规则见 `.github/workflows/ci.yml` 的 `SENTINELS`)。
   写测试示例用中性词,IP 用 RFC 5737 文档网段(`192.0.2.x`)。
   业务模块名和 API 路径也在此列——它们最容易从内部项目抄进测试注释。

## `qa_agent.py` 是 11000 行单文件

改动前按函数名定位,别整文件读。主要入口:

| 区域 | 函数 |
|---|---|
| CLI 分发 | `build_parser` · `run_with_env` · `aggregate_runs` · `render_report` |
| 门禁 | `assert_completion_data` · `check_evidence_integrity` · `assert_oracle_mapping_data` · `assert_readiness_data` |
| 覆盖投影 | `project_risk_coverage` · `_case_risk_ids` |
| 报告自检 | `qa_self_check` · `_check_sc0*` |
| 生成 spec-task | `build_spec_task` · `oracle_for_spec_task` |
| 配置解析 | `load_config` · `parse_simple_yaml` / `parse_scalar` · `load_services_config` |
| 执行与证据 | `run_cmd` · `gate_env` · `_record_run_sidecar` · `_parse_run_sidecar` |

`qa_core/` 目前只有一个模块,其余逻辑全在 `qa_agent.py`。**这是已知的结构债。**

## 文档分工(别互相抄,会漂)

- `CONTRIBUTING.md` —— 给人:环境、仓库结构、提交规范、新增 skill 的步骤
- `docs/` —— 给使用者:安装、配置、架构
- 本文件 —— 给在仓库里干活的 agent:命令、隐性规范、踩坑点