# PR #1902 完整报告

- 仓库：`THUDM/slime`
- 标题：Fix CI: update rollout_data_postprocess plugin contract for new call site
- 合并时间：2026-05-11 16:05
- 原文链接：http://prhub.com.cn/THUDM/slime/pull/1902

---

# 执行摘要

- 一句话：修复测试合约未同步新参数签名
- 推荐动作：值得快速合并。该 PR 是典型的 CI 同步修复，无设计争议。对于关注插件系统的开发者，可借此理解 Slime 的合约测试机制：每个插件点都有对应的 `reference_*` 函数、`invoke_*` 调用和 `HookCase` 配置，用于在 CI 中验证调用签名稳定性。

# 功能与动机

Commit bd217a63 将 `actor.py:488` 从 `self.rollout_data_postprocess(self.args)` 改为 `self.rollout_data_postprocess(self.args, rollout_id, rollout_data)`，但未同步更新插件合约测试，导致 `test_runtime_hook_callsite_is_stable[rollout_data_postprocess]` 在后继 PR 上持续失败。本 PR 旨在同步合约，使主分支 CI 恢复通过。

# 实现拆解

1. **更新引用实现函数签名**：将 `reference_rollout_data_postprocess` 的参数从 `(args)` 改为 `(args, rollout_id, rollout_data)`，使其与当前实际调用签名一致。
2. **更新调用函数**：将 `invoke_rollout_data_postprocess` 中的调用从 `fn(args)` 改为 `fn(args, 0, {})`，模拟传递 `rollout_id` 和 `rollout_data`。
3. **更新 HookCase 声明**：将对应 `rollout_data_postprocess` 的 `runtime_marker` 字段从 `"self.rollout_data_postprocess(self.args)"` 改为 `"self.rollout_data_postprocess(self.args, rollout_id, rollout_data)"`，并将 `expected_params` 从 `("args",)` 改为 `("args", "rollout_id", "rollout_data")`。所有修改均集中在 `tests/plugin_contracts/test_plugin_runtime_hook_contracts.py`。

关键文件：
- `tests/plugin_contracts/test_plugin_runtime_hook_contracts.py`（模块 合约测试；类别 test；类型 test-coverage；符号 reference_rollout_data_postprocess）: 该文件是 PR 唯一修改的文件，包含了合约测试的全部变更：更新了 `reference_rollout_data_postprocess` 函数签名、`invoke_rollout_data_postprocess` 调用方式以及 `HookCase` 中的 `runtime_marker` 和 `expected_params`。

关键符号：reference_rollout_data_postprocess, invoke_rollout_data_postprocess

## 关键源码片段

### `tests/plugin_contracts/test_plugin_runtime_hook_contracts.py`

该文件是 PR 唯一修改的文件，包含了合约测试的全部变更：更新了 `reference_rollout_data_postprocess` 函数签名、`invoke_rollout_data_postprocess` 调用方式以及 `HookCase` 中的 `runtime_marker` 和 `expected_params`。

```python
# tests/plugin_contracts/test_plugin_runtime_hook_contracts.py
# 更新后的引用实现：签名与当前调用点一致
def reference_rollout_data_postprocess(args, rollout_id, rollout_data) -> None:
    args.rollout_data_postprocess_called = True

# 更新后的调用函数：传递 rollout_id 和 rollout_data 伪参数
def invoke_rollout_data_postprocess(fn):
    args = type("Args", (), {})()
    assert fn(args, 0, {}) is None  # 原为 fn(args)
    assert args.rollout_data_postprocess_called is True

# HookCase 配置中的对应条目（部分）
HookCase(
    "rollout_data_postprocess",
    "ROLLOUT_DATA_POSTPROCESS_PATH",
    "plugin_contracts.test_plugin_runtime_hook_contracts.reference_rollout_data_postprocess",
    "slime/backends/megatron_utils/actor.py",
    "self.rollout_data_postprocess(self.args, rollout_id, rollout_data)",  # 原为 self.args
    ("args", "rollout_id", "rollout_data"),  # 原为 ("args",)
    invoke_rollout_data_postprocess,
),

```

# 评论区精华

该 PR 无 review 评论，变更直接合并，未产生讨论。

- 暂无高价值评论线程

# 风险与影响

- 风险：风险极低。变更是纯测试合约修复，仅涉及单个测试文件中的符号定义和调用参数。不过需确认第三方插件是否已适配新签名，若仍有插件使用旧签名（`self.rollout_data_postprocess(self.args)`），则可能引发运行时错误。建议在合并后运行完整的 CI 测试套件。
- 影响：直接影响：修复主分支 CI 测试 `test_runtime_hook_callsite_is_stable[rollout_data_postprocess]` 的持续失败，确保后续 PR 的合约校验可以通过。间接影响：第三方插件开发者需确保其 `rollout_data_postprocess` 插件匹配新签名（`args, rollout_id, rollout_data`）。影响范围限于测试和插件合约，不涉及推理或训练核心逻辑。
- 风险标记：兼容性

# 关联脉络

- PR #1897 Migrate internal feature: 虽然 PR 没有直接引用，但 1897 的 commit（bd217a63）是导致本次合约失效的源头，它修改了 `actor.py` 中的调用签名。