# 诊断流程样例:Night Gym 输入递归过滤与产物验收
## 工具入口
```bash
cd /Users/bytedance/.codex/night-gym/runs/2026-05-07
python3 ../tools/validate_run.py --run-dir . --input input.json --strict
```
## 输入来源
| 来源 | 用途 |
| --- | --- |
| `input.json` | 检查 session 是否混入 Night Gym 自己的 prompt、子分析日志和完成标志 |
| `out/sub/*.context.json` | 检查候选 evidence 是否来自允许的真实工作片段 |
| `out/sub/*.json` | 校验子分析结构、枚举、证据长度和 example 是否完整 |
| `out/sub/*.log` | 确认每个子实例是否真的输出 `SUBAGENT_DONE: <id>` |
| `out/manifest.json` | 聚合前检查是否把失败候选或递归噪音写进早间复盘 |
## 核心检查步骤
1. 扫描所有 session,给片段打 `source_kind`:`user_work`、`agent_reflection`、`nightgym_internal`、`tool_output`。
2. 命中 `Codex Night Gym — 主分析任务`、`Night Gym 子主题分析`、`SUBAGENT_DONE`、`NIGHTGYM_DONE`、`out/sub/` 或 cwd 在 `.codex/night-gym/runs/` 下时,标记为 `nightgym_internal`。
3. 对非 `nightgym-*` 候选,如果 evidence 主要来自 `nightgym_internal`,直接失败并从候选清单中跳过。
4. 对 `nightgym-*` 候选,允许保留内部片段,但要求 summary 明确说明这是元流程问题,不是用户业务工作痛点。
5. 验收子分析产物:JSON 可解析、id 一致、kind/risk/value 枚举合法、evidence 2-5 条且每条不超过 200 字、log 含完成标志。
## 成功信号
```json
{
"status": "pass",
"filtered_internal_fragments": 18,
"validated_candidates": 5,
"blocked_candidates": []
}
```
## 失败信号
```json
{
"status": "fail",
"blocked_candidates": [
{
"id": "some-business-topic",
"reason": "evidence dominated by nightgym_internal fragments",
"markers": ["Night Gym 子主题分析", "SUBAGENT_DONE"]
}
]
}
```
## 建议落地路径
先把脚本作为独立验收器放到 `tools/validate_run.py`,由主流程在聚合前调用;等连续 3 次运行没有误伤后,再把 `source_kind` 写入 `build_contexts.py` 的候选构建阶段,让递归过滤前置。