# Refactor Plan v1：基于 ts=1 验证后的重构方向

**日期**：2026-05-08
**前置文档**：
- `docs/REFACTOR_PLAN_ZH.md`（v0，已被本文 supersede——v0 的 backpressure 切入点结论已撤回）
- `docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md`（包含 §1-§7 结构性问题清单）
- `docs/STRUCTURAL_VALIDATION_REPORT_ZH.md`（ts=10 数据下的早期验证）

**触发**：`outputs/qwen3-30b-tp1-ts1-validation/` 4 个 run 完成（KVC 1P3D × N=3 + 4DP CA × 1，全部 ts=1）

**目的**：把 ts=1 验证结果落到具体的重构决策——哪些事必须做、哪些事不要再做、KVC 项目本身是否需要重新定义价值主张

---

## 0. TL;DR

1. **ts=10 失真是真的，影响 5-10×**——KVC 在 ts=10 灾难性输 DP 是 benchmark artifact，不是机制本身有问题
2. **ts=1 同 scale 下 KVC ≈ DP**：lat mean 差 9%，TTFT 差 47%，errors 双 0
3. **TEAM_REPORT 的 §1（session pin 不公平）是真问题，但代价从 6× 降到 ~2×**——仍是唯一值得做的 KVC 优化
4. **TEAM_REPORT 的 §2/§3/§4/§5 大多是 ts=10 高压 artifact**——ts=1 下要么不显著、要么自然吸收
5. **N=1 不可信是 ts=10 现象**——ts=1 下系统在 categorical 层面完全确定（routing/admission/errors 三次 run 完全相同）

**项目落到情景 B（KVC ≈ DP）**——三种 forward 路径任团队决策（见 §6）。

---

## 1. ts=1 验证数据

### 1.1 实验配置

| 项 | 值 |
|---|---|
| Trace | `outputs/qwen35-swebench-50sess.jsonl`（4449 reqs / 52 sessions） |
| 模型 | Qwen3-30B-A3B-Instruct-2507（TP1） |
| 硬件 | 单机 4× H100 80GB（注：原始 ts=10 实验是 8 GPU；本次缩配） |
| Time-scale | 1（真实 trace 时序，inter-turn gap p50 = 2.5s） |
| Concurrency | 32 |
| KVC 配置 | 1P3D，policy=kv-aware，admission=worker，seed-min-turn=1，prefill-priority-eviction |
| DP 配置 | 4-way colo，policy=kv-aware（cache-aware） |
| 输出根 | `outputs/qwen3-30b-tp1-ts1-validation/` |

### 1.2 Headline 对比

| Metric | KVC 1P3D ts=1（N=3 均值）| 4DP ts=1 | Delta |
|---|---:|---:|---:|
| **真实 mechanism errors** | **0** | **0** | 平 |
| 报告 errors（口径不一致，见 §1.3） | 5 | 0 | – |
| Lat mean | 1.574s | **1.443s** | DP 优 9% |
| Lat p50 | 0.810s | **0.659s** | DP 优 19% |
| Lat p90 | 3.796s | **3.641s** | DP 优 4% |
| Lat p99 | 8.722s | **8.433s** | DP 优 3% |
| TTFT mean | 0.244s | **0.129s** | DP 优 47% |
| TTFT p50 | 0.122s | **0.090s** | DP 优 26% |
| TTFT p90 | 0.572s | **0.252s** | DP 优 56% |
| Per-worker spread | ±3.8% (3D) | ±3.1% (4 direct) | 接近 |

### 1.3 KVC 5 errors 的真实身份

DP 的同 5 个 (sess, turn) 也"失败"——但 metrics 口径不同：

```
KVC: 计入 error_count
DP:  metrics 记 error=OK + finish_reason={'type':'abort', 'message':'Input length (X) exceeds the maximum allowed length (87811)'}
```

| sess | turn | input_len | KVC max | DP max |
|---|---:|---:|---:|---:|
| 35680 | 132 | 91600 | 92098 (✓) | 87811 (✗) |
| 35680 | 133 | 92335 | 92098 (✗) | 87811 (✗) |
| 39360 | 137 | 91700 | 92098 (✓) | 87811 (✗) |
| 39360 | 138 | 92003 | 92098 (✓) | 87811 (✗) |
| 39360 | 139 | 92135 | 92098 (✗) | 87811 (✗) |

**两边都拒同样的请求**——区别只在于 KVC 在 P 端拒（KV 池满）、DP 在 prefill 端拒（max-input limit）。**真实 mechanism 错误率：KVC 0 / DP 0**。

### 1.4 ts=1 的确定性

KVC N=3 三次 run 跨 4449 records：

| 维度 | 跨 run 差异 |
|---|---|
| `execution_mode` | **0 / 4449** records 不同 |
| `assigned_decode_node` | **0 / 4449** records 不同 |
| Errors（5 个 sess/turn 对） | **完全相同** |
| 18 starved + 16 lucky session | **完全相同** |
| Per-D load (1502/1445/1502) | **完全相同** |
| Lat mean | 1.574 / 1.573 / 1.574（**0.06%** 漂移）|
| Lat p50 | 0.811 / 0.809 / 0.812（**0.4%** 漂移）|
| 单 request lat | abs p90 diff = 25ms |

**结论**：低压 / ts=1 区间下 KVC 系统在 categorical 层面（路由 / admission / 失败位置）**完全确定**，仅低层数值有 model 计算微抖动。

---

## 2. 对 TEAM_REPORT §1-§7 的修订

| § | TEAM_REPORT 原 claim | TEAM_REPORT 原优先级 | ts=1 验证后状态 | **修订优先级** |
|---|---|---|---|---|
| §2.1 | session pin + 容量盲选 → 25% 饿死 | **P0** | ✅ 结构性问题仍在（18/52 session 永久 pin），但代价从 6× 慢降到 ~2× | **P0**（唯一值得做的 KVC 优化）|
| §2.2 | D-side LRU 跟不上 → 8% errors | **P0** | ⚠️ D 仍瞬时顶到 token_usage=1.00，但**ts=1 下 drain time 自然吸收**——0 KVTransferError 雪崩（vs ts=10 369 次） | **降级 P3**（drain time 已解决症状）|
| §2.3 | 无 backpressure 通道 | P1（已实现）| ❌ ts=1 下 transfer cascade 不存在，backpressure 无作用对象 | **冷藏**（代码留着，但默认 off）|
| §2.4 | P-side round-robin 不感知 D 健康 → prefill-0/-1 错误差 180× | P1 | ⚠️ 1P 配置不可测；ts=10 现象**高度怀疑也是 artifact**（错误本身在 ts=1 消失） | **存疑 / 重测后再说** |
| §2.5 | admission RPC 进 scheduler 主循环 → 1Hz polling 让 errors ↑46× | P2 | ❌ 是 ts=10 高压时的现象，ts=1 下不显著 | **冷藏** |
| §2.6 | time-scale=10 失真 → 所有 KVC vs DP 结论可能被放大 | **P0** | ✅ **完全证实**（74× errors↓, 8.7× TTFT↓, 7× per-D spread↓） | **DONE，作为前置条件锁定** |
| §2.7 | execution_mode 标签命名错位 | P1 | ✅ 仍存在；本次 ts=1 又发现 `error_count` 在 KVC vs DP 口径不一致 | **P1**（纯 labeling 修复，~半天）|
| §2.8 | N=1 不可信 → 实验必 N≥3 | P2 | ⚠️ **是 ts=10 高压现象**——ts=1 下 N=1 categorical 完全确定 | **改写规则**：高压 N≥3 / 常规 N=1 |
| §2.9 | microbench 把 KVC 失效条件全规避 | – | 仍成立 | **保留观察**（实验设计原则）|

---

## 3. v0 REFACTOR_PLAN 回顾

### 3.1 v0 做对的

- **唯一代码改动选 backpressure**：作为对 §2.3 的最小验证手段是合理的
- **预算 KISS**：用 8h GPU 验证 §1-§7，思路正确
- **明确"P0 是 time-scale=1 baseline"**：v0 的 §1 末尾就指出 "time-scale=1 验证为 P0 待办"——本次实验正是把这条做了

### 3.2 v0 的核心误判

| v0 假设 | 实际 |
|---|---|
| backpressure 是 §3 的最小验证 → 也是修复 | ts=1 下 §3 的症状（transfer cascade）不存在，backpressure 无效 |
| 8h 预算够跑 ts=1 baseline + backpressure smoke | ts=1 单 run 5.5h，4 run 全跑要 22h（实际跑了 22h） |
| §1 / §2 的修复"超出 KISS 边界"，先验证不修 | 验证后发现 §1 是**唯一**值得做的真问题，应该早点把它纳入 |

### 3.3 v0 的 backpressure 代码命运

代码保留（`--enable-backpressure` 默认 off），原因：
- 不删除是因为如果未来跑高压 / 大 trace / 真 RDMA 失败回归到类 ts=10 区间，可能仍有用
- 但**不部署、不启用、不文档化为推荐配置**——避免给以后看到代码的人误导

---

## 4. 修订后的优先级矩阵

```
                    必做                   建议做                  不做
                  ────────              ────────              ────────
ts=1 必修        §1 capacity-aware   (空)                   §2 / §3 / §4 / §5
                 policy + migration                          的 ts=10 fix

ts=1 nice        §2.7 metrics 标签   (空)                   §2.8 N≥3 严苛规则
to have         统一口径                                    （改成"高压 N≥3"）

文档              §3 写入 TEAM      v0 标记 superseded     ts=10 数据归档
                  REPORT 更新                               （但保留可追溯性）
```

**唯一进入"必做工程"列表的是 §1**。其他全是文档或冷藏。

---

## 5. KVC vs DP 拆分到 path-level 看真实差距

理解 §1 的 ROI 必须先看 path-level（不是整体均值）：

### 5.1 KVC 内部 path 性能（来自 ts=1 N=3 一致数据）

| Path | n | 占比 | Lat p50 | TTFT p50 |
|---|---:|---:|---:|---:|
| `kvcache-direct-to-d-session`（快路径）| 1903 | **42.8%** | **0.475s** | **0.042s** |
| `pd-router-fallback-large-append-session-cap`（慢路径）| 2409 | **54.2%** | 1.04s | 0.32s |
| `pd-router-turn1-seed`（每 session 一次）| 52 | 1.2% | 0.375s | 0.057s |
| 其余 | 85 | 1.8% | 多种 | 多种 |

### 5.2 DP 全部 path（单一）

| Path | n | 占比 | Lat p50 | TTFT p50 |
|---|---:|---:|---:|---:|
| `dp-colo-router` | 4449 | 100% | 0.659s | **0.090s** |

### 5.3 路径级对比

| | KVC direct | KVC fallback | DP |
|---|---|---|---|
| Lat p50 | **0.475s**（赢 DP 28%）| 1.04s（输 DP 58%）| 0.659s |
| TTFT p50 | **0.042s**（赢 DP 53%）| 0.317s（输 DP 252%）| 0.090s |

**事实陈述**：
- KVC 快路径 **明显快于** DP（无 P 介入、无 mooncake transfer）
- KVC 慢路径 **明显慢于** DP（P→D transfer 开销没法摊到 turn 内）
- 当前 quick:slow = 42.8% : 54.2%——慢路径多 → 整体输 DP 9-47%
- 如果能把比例反过来到 70:25 或更好，KVC 整体会赢 DP

**§1 的本质就是"为什么有 54% 进了慢路径"**——因为 18/52 session 被 pin 在容量紧张的 D 上，每次 admission 都拒。

---

## 6. 三种 forward 路径

> **更新（2026-05-09）**：情景 C **已实现**——见 `docs/V2_RESULTS_ZH.md`。下面三个分支保留作历史记录。
>
> | 情景 | 描述 | 状态 |
> |---|---|---|
> | A | KVC < DP，接受现状转维护 | 不适用 |
> | B | KVC ≈ DP，重新定义价值主张 | 不适用 |
> | **C** | **KVC > DP，优化拉大差距** | **✓ 实现：v2 在 7/8 头部指标击败 4DP（TTFT mean -24%, p50 -54%, p90 -64%；lat mean -0.8%, p50 -12.6%）** |
>
> 关键修复：(1) reset-on-success blacklist decay（消除 v1 thrashing），(2) `--kvcache-direct-max-uncached-tokens` 2048→8192（让 41% 大 append 走 direct-to-D 快路径）。direct-to-D rate 从 baseline 42.8% 升到 v2 91.7%。

### 6.1 选项 A：接受现状，项目转维护

**判断**：KVC 在 ts=1 + 同 scale 下 ≈ DP（9% 慢、47% TTFT 慢），但**也没灾难性输**。如果项目目标是"验证 KV-aware routing 在 agentic 上是否可行"，答案是 **可行但收益不显著**。

**操作**：
- 写 TEAM_REPORT §3 总结 ts=1 实验
- 把 ts=1 数据 + 4 个 run 归档到 `RESULTS_FROZEN_TS1.md`
- KVC 代码保留但标记 "experimental, not recommended for production"
- 团队转下一个项目方向（不是本文范围）

**成本**：1 周文档收尾。
**风险**：放弃了 §1 修复后可能的 KVC > DP 上限。

### 6.2 选项 B：做 §1，目标让 KVC > DP

**判断**：5.3 节的路径分析表明 KVC 快路径已经赢 DP；如果把饿死 session 救回快路径，KVC 整体可能赢 DP。

**具体改动**：

#### 6.2.1 capacity-aware policy（`policies.py:166-172`）

当前评分（无容量项）：
```python
score = (
    overlap + sticky * self.sticky_bonus,
    sticky,
    inflight_penalty,
    assignment_penalty,
)
```

提议改为：
```python
# 新增：D 当前容量利用率（从 worker-mode admission 已能查到）
capacity_used = worker_capacity_used_ratio.get(worker.worker_id, 0.0)

# Hard cap：容量 > X 时禁止该 D 进入候选
if capacity_used > HARD_CAP_THRESHOLD:  # e.g. 0.85
    continue

score = (
    overlap_capped,           # 原 overlap，但限幅避免单个 D 永远赢
    -capacity_used,           # 新增二级排序项：偏好空闲 D
    sticky,
    inflight_penalty,
)
```

#### 6.2.2 session migration（`replay.py` 或 policy 层）

当 session X 在 D-A 上连续被 admission 拒 N 次（如 N=3）：
- 主动 release X 在 D-A 上的 session state
- 允许下次 turn 把 X 路由到另一个 D
- 代价：丢失 D-A 上已积累的 KV——但 fallback 路径本来也丢了，**净收益正**

#### 6.2.3 metric 修复（`replay.py`）

把"`pd-router-fallback-large-append-*`" 标签按真实原因细分：
- `session-not-resident-on-pinned-D`（§1 主因）
- `real-large-append`（>2048 阈值，§2.7）
- `session-was-evicted`（被 LRU 踢过）
- `session-cap-rejected`（worker admission 拒）

让以后看 metrics 的人不再被名字误导。

#### 6.2.4 验证

- 每改动跑 KVC 1P3D ts=1 N=1（categorical 确定，不需要 N=3）
- 对比 baseline run1（已有数据）
- 关键指标：`kvcache-direct-to-d-session` 占比、整体 lat mean、TTFT mean
- 目标：direct-to-D rate 从 42.8% 升到 > 70%、整体 lat 追平或赢 DP

**成本**：3 天编码 + 5 天测试 + 2 天文档 ≈ 2 周。
**风险**：
- session migration 可能导致 thrash（A→B→A→B），需要冷却时间机制
- capacity HARD_CAP 阈值需要 sweep 找最优
- 改完仍可能不赢 DP（理论上限不知道）

### 6.3 选项 C：保留 KVC，但寻找 KVC 真正赢的工作点

**判断**：当前 SWE-Bench 50 sessions × 30B 模型 × 4 GPU 是一个特定工作点。KVC 的设计初衷是"长 multi-turn session 的 KV 复用"——可能在某些其他工作点有显著优势。

**候选工作点**：
- **更长 session（>200 turns）**：复用收益更大
- **更小模型（如 7B / 14B）**：mooncake transfer 占比更大，KVC 节省更明显
- **更大 trace（>200 sessions）**：DP 的 prefix cache 命中率会下降，KVC 的 session-aware 优势放大
- **真实 RDMA（非 mooncake TCP loopback）**：transfer 更快，KVC 的 P→D 开销更小

**操作**：
- 设计 1-2 个新 micro/macro benchmark
- 跑 KVC vs DP 对比
- 找到差距 > 30% 的工作点（KVC 赢 / 输都是数据）

**成本**：~1 个月（trace 设计 + benchmark + 分析）。
**风险**：可能找不到 KVC 显著赢的工作点。

---

## 7. 推荐组合

按风险 / 收益排序：

1. **必做**（无论选 A/B/C）：
   - 写 `TEAM_REPORT §3 ts=1 验证更新`
   - 修 `metrics 标签口径`（§2.7 + KVC/DP error_count 一致化）
   - **冷藏 backpressure 代码**（不删但默认 off）
   - 把 v0 REFACTOR_PLAN 标 superseded

2. **强烈推荐**：选项 B 的 §6.2.1（capacity-aware policy hard cap）
   - 工程量小（~1 天编码 + 1 天测试）
   - 验证 §1 修复的真实收益是否如预测
   - 如果 direct-to-D rate 不显著提升 → 把 §6.2.2 也加上
   - 如果还不行 → 接受现状走选项 A

3. **看团队带宽**：选项 C 的工作点探索
   - 不与 §6.2 冲突，可以并行
   - 找到一个 KVC 真正赢的工作点会极大改变项目价值主张

---

## 8. 应该砍掉的事（明确列表）

| 事 | 砍的理由 |
|---|---|
| backpressure smoke sweep（v0 计划的 4 run） | ts=1 下 backpressure 无作用对象 |
| §2.5 admission API probe/commit 拆分 | 高压才显著，等找到 KVC 高压 workload 再说 |
| §2.2 D-side 分层 LRU eviction（hot retract） | drain time 自然吸收 |
| §2.4 P-side D-health-aware routing | 1P 测不出，ts=10 现象高度存疑 |
| 大量 instrument（admission-events / pool timeseries） | 已经够了，先用现有数据 |
| 任何 ts=10 区间的优化 | 那是 benchmark artifact 主导的区间，不代表真实部署 |
| N≥3 实验作为硬规则 | 改写为"高压 N≥3，常规 N=1 即可" |

---

## 9. 风险与未验证的假设

1. **4DP ts=1 是 N=1**：虽然 KVC ts=1 是确定性的，DP 是新机制 N=1，理论上需要 N≥3 验证。但 DP 在 ts=10 也是 0 errors / 1.43s mean，行为相对 KVC 更稳定，N=1 风险较小。**如选项 B 推进，建议补 N=2**。
2. **2 个 input-too-long session 是 trace 数据问题**：这两个 session（35680、39360）在 turn 132+ / 137+ 才超过 input limit。可能是 trace 生成时没控制好 max input。**应该独立把这两个 session 从 trace 移除或截断后重跑作为对照**。
3. **4 GPU 缩配 vs 8 GPU 原始**：本次 1P3D / 4DP 数据无法跨 8 GPU 原始数据直接比，需要在结论中明确。但 ts=1 + 同 scale 内部对比是干净的。
4. **mooncake TCP loopback**：所有 transfer 在单机 TCP 模拟下进行。生产 RDMA 下 KVC 的 transfer 开销可能显著降低，KVC 优势可能扩大——这是 **选项 C 的一个候选维度**。
5. **§1 修复是否真能让 direct-to-D 上升到 70%+ 是预测**：实际可能受 hash overlap 限制（即使 D 容量充裕，没有 prefix overlap 就走不了 direct-to-D）。**需要 §6.2 验证后才知道天花板**。
6. **input-limit error 的 metrics 口径修复影响以后所有比较**：注意修改后 ts=10 历史数据的 error_count 也需要重算（或在分析时显式补偿）。

---

## 10. 决策点（需要团队确认）

请审阅后回答：

| # | 决策 | 选项 |
|---|---|---|
| D1 | 选哪条 forward 路径？ | A（维护）/ B（修 §1）/ C（探索 workload）/ B+C |
| D2 | 写 TEAM_REPORT §3 ts=1 验证更新章节？ | Yes / No |
| D3 | 把 v0 REFACTOR_PLAN 标 superseded？ | Yes / No |
| D4 | 删除 backpressure 代码 vs 冷藏？ | 删 / 冷藏（默认 off）|
| D5 | 修 metrics 标签口径（§2.7 + error_count 一致化）？ | Yes / No |
| D6 | 是否补 4DP ts=1 N=2 / N=3 做更稳的 baseline？ | Yes / No |
| D7 | 是否把 sess 35680 / 39360 从 trace 移除做"干净" baseline？ | Yes / No |

---

## 附录 A：本文数据来源

| 章节 | 数据源 |
|---|---|
| §1.2-§1.4 | `outputs/qwen3-30b-tp1-ts1-validation/{kvc_1p3d_run{1,2,3},dp4}_{summary.json,metrics.jsonl}` |
| §1.4 跨 run 一致性 | per-record diff via `scripts/analysis/analyze_ts1_validation.py` + 临时 diff 脚本 |
| §5 path-level | metrics.jsonl 按 `execution_mode` 分组 |
| §2 §1-§7 修订 | `docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md` 原数据 + ts=1 新数据交叉对比 |

## 附录 B：相关文档

- `docs/TEAM_REPORT_AGENTIC_PD_HYBRID_ZH.md` — §1-§7 原结构性问题清单
- `docs/REFACTOR_PLAN_ZH.md` — v0 重构计划（本文 supersede）
- `docs/AGENTIC_FIT_ANALYSIS_ZH.md` — 早期 fit 分析（§1-§7 来源）
- `docs/STRUCTURAL_VALIDATION_REPORT_ZH.md` — ts=10 结构性 claim 验证
- `docs/KVC_DEBUG_JOURNEY_V1_TO_V5.md` — v1→v5 演进
- `docs/V5_PROFILE_INVESTIGATION_ZH.md` — v5+profile 调查（已 critic 修订）
- `scripts/sweep_ts1_kvc_n3_plus_dp.sh` — 本次 4 run sweep 脚本
- `scripts/analysis/analyze_ts1_validation.py` — 本次分析脚本

---

**作者注**：本文偏决策导向。如果要写更技术的 §1 capacity-aware policy 实现细节，应该在 D1 决策为 B 之后单独出一份 `IMPL_CAPACITY_AWARE_POLICY.md`。
