# 三分钟演示与答辩准备

## 演示顺序

1. 打开事件时间实验室。说明事件时间与到达顺序不同；当前两个事件位于两个独立会话。
2. 下一步将水位推进到 12。第一个窗口进入 closing，但 20 单位的迟到宽限还没有结束。
3. 下一步输入 at=8 的迟到事件。两个旧窗口被删除，一个新窗口原子替代它们；SUM 从分散的 20、35 变为 67。
4. 下一步撤回桥接事件。合并窗口消失，两个原始会话重建。指向成员 ID 与精确 before/after 日志。
5. 全部执行：水位 60 后，两窗口均 final。最后一次撤回被整笔拒绝，版本停在 5。
6. 展开自定义数据并导出检查点。运行 CLI 的 resume 或库的 restore，证明重启后仍认识成功命令 ID。
7. 切换订单原子修正：一次命令完成撤单与替代。最后展示传感器滑动窗口，同一记录关联多个窗口但身份仍按 ID 唯一。

## 应能自己解释的内容

- 为什么 gap 边界使用 `<` 而非 `<=`？半开区间的相接不等于重叠；约定公开且有边界测试。
- 为什么不能只做数值减法？删除可能改变会话拓扑，导致一个窗口拆成多个窗口；成员、边界与 min/max 也要重算。
- 为什么终结检查还比对原始事件？同一批成员交换值后 SUM 可能相同，不能因此改写已终结事实。
- 为什么有的拆分会拒绝？它会生成在当前水位下已经 final 的新历史行，违反终结契约；整笔拒绝比输出局部状态更容易推理。
- 是否保证 exactly-once？只保证本引擎成功命令 ID 在容量内的幂等和单次原子状态更新。外部队列、文件、消费确认与可信传输由宿主负责。
- 性能如何？受影响 key 排序重算，其他 key 复用；固定窗口扇出有限，容量公开。查看可重跑的基准，不能将合成样本外推成通用吞吐承诺。
- 是否原创？代码独立实现，概念参考公开流处理文档。AI 辅助开发已披露；不是原项目改名或把成熟库简单封装。
