# Cutover Control Lab

把合成 Cutover 事件放进明确的维护窗口、错误阈值和回退预算中，计算最晚回退决定时间，并区分 traffic rollback 与带数据的 failback。

```bash
python3 cutover_control.py sample-events.jsonl --out cutover-evidence.json
python3 -m unittest -v test_cutover_control.py
```

默认窗口 01:00–03:00，回退执行 14 分钟、验证 5 分钟、缓冲 3 分钟，因此最晚决定线是 02:38。样例在目标端开放写入后连续两个窗口超过 1%，工具要求带数据回退并核对 317 条记录。实验只验证控制逻辑；生产阈值、权限、复制语义、支付等外部副作用仍需真实演练。

事件必须按时间排序并位于维护窗口内；跨午夜窗口（例如 23:00–00:10）会映射到同一条连续时间轴。错误率、写入切换、反向 CDC 核对和回退完成等决策事件会自动要求 `evidence_id`，不依赖调用者额外标记。反向 CDC 的 `rows_expected`、`rows_matched` 与 `duplicates` 必须全部是非负整数，否则数据回退 Gate 不通过。尚未触发决策的有效轨迹状态为 `OBSERVING`，不会被误报为已经 `CONTROLLED`。

下一步：[/learn/cloud-migration/case.html](/learn/cloud-migration/case.html) 提供真实 SQLite 双端数据、插入/更新/删除、差异定位与反向回放；它补数据机制练习，不把本控制模拟当成真实 CDC。
