# Kestra V55 阶段验收记录

- 代码分支：`codex/kestra-v55`
- 基线提交：`945d680`
- 验收日期：2026-07-19
- Python：3.11.15
- 结论：V55 双轨迁移、对账、事务化单流程切换、自动回切、批次门禁和退役审计
  框架完成；本地可进入 `kestra_primary_n8n_standby`。n8n 统一退出门禁未满足，
  不批准进入 `kestra_primary`，也不移除 n8n。

## 完成范围

### 双轨与转换

- 实现四种迁移模式及相邻状态转换约束。
- n8n 转换器只自动转换受控触发器、显式只读 SQL、GET HTTP 和条件节点；未知
  节点生成阻断报告，不降级为任意脚本。
- 数据源只通过 UID 映射，转换结果不复制凭据。
- n8n 正式执行与 Kestra 影子执行共享同一不可变输入快照和摘要。
- 影子写必须指向声明的隔离目标；否则失败关闭。

### 对账、切换与持久化

- 对账状态、行数、主键摘要、内容摘要、异常、聚合、耗时和资源消耗。
- 对账策略允许显式忽略非确定性指标或声明数值容差，但核心正确性指标不可忽略。
- 新增迁移状态、双跑、对账报告和切换操作四张 PostgreSQL 控制表。
- 切换请求、状态更新和 Outbox 事件在同一事务提交；相同幂等键不会重复发事件。
- 切换消费者先停 n8n 再启 Kestra；Kestra 激活失败自动恢复 n8n。
- 显式回切先停 Kestra 再启 n8n。审计只保留有界状态和安全原因码。

### 分批推广和退役保护

- 固定四批顺序：只读低频、幂等分区写、核心多节点、特殊高风险。
- 进入门禁覆盖资产、WorkflowSpec、策略、回滚目标、影子次数、失败恢复、对账、
  连接预算、峰值并发和 SLA。
- 退出门禁覆盖观察窗口、数据差异、重复写、SLA、暂停/重试/回切演练及 n8n
  Standby 未被外部修改。
- n8n 退役清单失败关闭，并要求独立评审及唯一一次最终 L4。

## 验证结果

### L1：V55 领域与命令

```bash
PYTHONPATH=. .venv/bin/python -m pytest -q \
  tests/integration/test_n8n_kestra_dual_run.py \
  tests/integration/test_workflow_reconciliation.py \
  tests/integration/test_workflow_engine_cutover.py \
  tests/integration/test_workflow_engine_rollback.py \
  tests/integration/test_workflow_migration_rollout.py \
  tests/integration/test_n8n_retirement_audit.py \
  tests/test_v55_migration_commands.py
```

结果：`34 passed`。

### L2：受影响边界与迁移

- 最终合并执行 V55、V54 回归、受影响边界、真实持久化、真实切换回切和迁移测试：
  `113 passed`。
- 编排核心、Scheduling/Context MCP、安全边界、n8n 清单和客户端配置：
  `48 passed`。
- Alembic 全新临时库升级、重复升级和单版本回退：`3 passed`。
- V54 Agent、MCP、真实 Kestra/Runner Canary 和模型离线回归：`40 passed`。
- V55 引擎角色顺序、真实 PostgreSQL 状态/双跑/对账/Outbox：
  `3 passed`。

### L3：真实切换与回切

使用本地 Docker 中运行的 PostgreSQL、n8n 和 Kestra 完成一个受控流程演练：

1. n8n 已激活、Kestra Flow 已禁用；
2. 先停用 n8n，再使用不存在的 Kestra Flow 模拟激活失败；
3. 系统自动重新激活 n8n，操作落库为 `rolled_back`；
4. 使用有效 Kestra Flow 再次切换，n8n 变为禁用、Kestra 变为启用；
5. 显式回切先禁用 Kestra，再激活 n8n。

结果：`1 passed`。演练后的临时 n8n Workflow、Kestra Flow、迁移状态和 Outbox
事件均已清理；数据库处于 `20260719_90 (head)`。

### 静态和安全检查

- Ruff：通过。
- V55 新增生产模块 Pyright：`0 errors, 0 warnings`。
- `git diff --check`：通过。
- 新增范围未发现 API Key、云访问密钥、私钥或本地测试密码硬编码。

未执行全仓 Python、前端构建和完整栈 L4。V55 当前明确不退役 n8n，也没有修改
前端、Docker Compose 或公共启动入口；按验证计划，只有正式移除 n8n 前才执行
唯一一次 L4。

## 未退役 n8n 的原因

本地实时清单为零只能证明当前本地实例没有持久业务 Workflow，不能替代生产
资产处置证据。当前也没有完整业务周期、Standby 观察期、生产依赖扫描、安全
归档恢复、独立评审和最终 L4 证据。

因此：

- 不修改 Docker Compose 移除 n8n；
- 不删除 n8n API、前端入口、历史执行或兼容字段；
- 不宣称 n8n 已经下线；
- 生产逐流程切换仍须为每个实际 Workflow 补齐真实双跑、对账和观察证据。

详细缺口见 `docs/validation/kestra-v55-retirement-audit.json`。
