Skip to content

Commit c83f127

Browse files
committed
test(sessions): add replay consistency harness
Add reusable replay cases and backend adapters for session, memory, and summary consistency checks across InMemory, SQLite, and optional Redis. Cover cross-session memory, mid-replay restart, and state namespace round-trips, and fix summary lineage persistence plus Redis app/user state compatibility uncovered by the new suite.
1 parent 099b571 commit c83f127

10 files changed

Lines changed: 2585 additions & 38 deletions
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Replay Consistency Design Note
2+
3+
## 设计说明
4+
本框架以统一 `ReplayCase` 协议驱动 `InMemory`、文件型 `SQLite` 与可选 `Redis` 后端,先生成 `session/state/memory/summary` 四类快照,再做归一化比较。归一化只移除非业务噪声,不掩盖事件顺序、state 最终值、memory 检索结果及 summary 归属与覆盖关系;其中普通时间戳做精度收敛,`summary_timestamp` 使用 case 级确定性时钟参与比较。summary 比较分为两层:一层比较摘要文本与压缩后的事件窗口,另一层比较 `summary_id/version/replaces/session_id` 等 lineage 元数据。为验证保存/读取语义,summary 元数据会随 summary event 一起持久化,`SQLite/Redis` 适配器在抓取快照前执行一次关服务后重开读回,并支持在 case 中显式插入中途重启步骤验证“重启后继续写”。协议还支持同一 case 内用 `session_alias` 驱动多个 session,以覆盖跨 session 的 memory 聚合和 `app:/user:/temp:` 状态可见性差异。负例分为 snapshot mutation 与 runtime fault 两类,前者验证比较器精度,后者验证重复写入、中途失败和运行时污染场景。轻量模式默认运行 `InMemory + SQLite`,集成模式通过环境变量启用 `Redis`。
5+
6+
## 官方 10 条验收 Case
7+
| Case ID | 场景 | 验收点 |
8+
| --- | --- | --- |
9+
| `single_turn_text` | 单轮普通对话 | 基础事件一致性 |
10+
| `multi_turn_dialogue` | 多轮对话 | 事件顺序与多轮回放 |
11+
| `tool_call_and_response` | 工具调用对话 | `function_call/response` 一致性 |
12+
| `state_and_memory_roundtrip` | 多次 state 更新覆盖 + memory 检索 | state 覆盖语义与 memory 一致性 |
13+
| `summary_compaction_with_history` | summary 生成与历史事件压缩 | summary 与 historical events |
14+
| `summary_version_rolls_forward` | summary 更新 | version / replaces 递增 |
15+
| `summary_binding_mismatch_injection` | summary 归属错误 | `summary.session_id` 检出 |
16+
| `summary_missing_injection` | summary 丢失 | `summary` 缺失检出 |
17+
| `runtime_summary_overwrite_fault` | summary 覆盖错误 | `summary.replaces` 检出 |
18+
| `partial_failure_event_loss_fault` | 写入中途失败 | 事件窗口异常检出 |
19+
20+
## 扩展 Case
21+
- `state_corruption_injection`:补充 state 字段级污染检测。
22+
- `summary_lineage_corruption_injection`:补充 snapshot 层 lineage 篡改。
23+
- `duplicate_event_runtime_fault`:补充重复写入异常。
24+
- `runtime_state_corruption_fault`:补充运行时 state 污染。
25+
- `runtime_summary_loss_fault`:补充运行时 summary 丢失。
26+
- `cross_session_memory_aggregation`:补充同一 app/user 下跨 session 的 memory 聚合语义。
27+
- `restart_mid_replay_after_summary`:补充 summary 持久化后中途重启再续写的恢复语义。
28+
- `state_namespace_roundtrip`:补充 `app:/user:/temp:` 状态命名空间在跨 session 和重启后的可见性语义。

0 commit comments

Comments
 (0)