# ISS-0067 Fix Plan: Context Compaction 后诊断上下文严重丢失

## Background

**Reported by**: nizheming@pingcap.com  
**Source**: GitHub issue #411 — `[Investibook] O11Y-2530308: context compaction 之后信息丢失特别严重`  
**Workspace**: ws-1778200904899-739292d98 (prod: investibook.com)  
**Ticket**: O11Y-2530308

用户反馈：在使用 Investibook 对 O11Y-2530308 进行诊断时，触发 context compaction 之后，agent 表现明显变差，信息严重丢失。

## Problem Description

Claude Code / OpenCode agent 在长对话中，当 context window 接近上限时会触发 **context compaction**（自动摘要压缩）。压缩后：

1. **关键诊断数据丢失**：已采集的 TopSQL 结果、SlowQuery 明细、指标数值、execution plan 等都依赖 LLM context 保存，compaction 后被摘要化，细节数据丢失。
2. **中间结论丢失**：agent 在 compaction 前已推理出的中间结论（如"db-tikv-19 是热点节点"）在 compaction 后可能被遗忘或变得不确定。
3. **重复工作**：agent 不知道已采集过哪些数据，可能重复执行相同的 collect_evidence.py 调用，浪费时间。
4. **结论矛盾**：compaction 前后 agent 对同一问题可能给出不同的分析结论，让用户困惑。

## Root Cause Analysis

**主要根因**：诊断中间状态（采集结果、推理过程）仅存在于 LLM context 中，没有持久化的状态恢复机制。

具体来看：

- `collect_evidence.py` 会将结果写入磁盘（`evidence_summary_for_agent.txt`、各 JSON 文件），这些**文件是持久化的**。
- 但 **agent 不知道在 compaction 后应主动重读这些文件**。compaction 后的 agent 看不到之前读取文件的 tool call 历史，不知道 evidence 文件已经存在。
- SKILL.md 的指令是"运行 collect_evidence.py 采集证据"，compaction 后 agent 可能认为未执行过，于是重新执行整个脚本。
- 即使重新执行，compaction 前已做的分析思路（特别是 human intervention 引导的方向）也会丢失。

## Fix Plan

### Short-term (SKILL.md 级别，无需代码变更)

**Option A: Evidence Checkpoint 机制**

在 SKILL.md 的 Node C（证据采集）阶段开始前，增加一个**状态恢复步骤**：

```markdown
## CONTEXT RECOVERY (在每次新对话轮次开始时执行)

在开始任何分析前，先检查是否存在已有的证据文件：
1. `ls $WORKSPACE_DIR/evidence_summary_for_agent.txt 2>/dev/null`
2. 若文件存在，先读取该文件，了解已采集的数据范围
3. 若文件存在且数据完整，跳过 collect_evidence.py，直接进行分析
4. 若文件不存在，正常执行 collect_evidence.py
```

这样 compaction 后的 agent 会先发现已有的 evidence 文件，避免重复采集。

**Option B: Diagnosis Progress File**

在 collect_evidence.py 执行后，自动生成一个 `diagnosis_progress.txt` 文件：

```
COLLECTED: metrics, topsql_tidb, topsql_tikv, slowquery, logs, events
KEY_FINDINGS:
- db-tikv-19: CPU 87% (hotspot)
- Top SQL: SELECT * FROM orders WHERE user_id=? (digest=abc123)
- Root cause hypothesis: TiKV hotspot due to single-node write concentration
NEXT_STEPS: Verify with execution plan, check index coverage
```

SKILL.md 指令：每次对话轮次开始时，先 `cat diagnosis_progress.txt`（若存在），以恢复状态。

### Medium-term (Backend 级别)

**Option C: 分阶段消息持久化**

在 `backend/investibook/core/acp.py` 中，在以下时机将中间状态写入 workspace metadata：
- collect_evidence.py 完成后
- agent 输出 key finding 文本时

这允许 frontend 和 agent 在需要时重新加载状态。

**Option D: OpenCode context compaction hook**

如果 opencode 支持 compaction hook，在 compaction 触发前：
1. 强制 agent 输出当前诊断进度摘要（structured JSON）
2. 将摘要写入磁盘
3. Compaction 后在 system prompt 中注入该摘要

### Recommended Fix (Short-term 优先)

1. **立即实施 Option A**：在 SKILL.md 中添加 context recovery 检查步骤（约 5 行指令）
2. **同步实施 Option B**：修改 collect_evidence.py 生成 `diagnosis_progress.txt`，SKILL.md 引导 agent 读取
3. **中期评估 Option D**：了解 opencode compaction hook 可行性

## Affected Files

- `agentkit/skills/builtin/tidb-clinic-diagnosis/SKILL.md` — 添加 context recovery 步骤
- `agentkit/skills/builtin/tidb-clinic-diagnosis/scripts/collect_evidence.py` — 生成 progress file

## Verification

1. 触发 compaction 的方式：运行一个长诊断 session（20+ 轮对话），或手动构造超长 context
2. 验证：compaction 后 agent 能主动读取 evidence 文件并继续正确分析
3. 回归：正常（非 compaction）session 不受影响
