2026-07-18-kestra-v50-v55-delivery-plan.md 15 KB

Kestra 改造 V50–V55 顺序交付与增量验证计划

状态:实施序列已确认;必须按 V50 → V55 顺序推进。每个版本只有在本版本 增量验证通过并留下验证记录后,才能进入下一版本。

1. 版本口径

V50–V55 是 DataOps Platform 的功能交付里程碑,不是 Alembic migration revision,也不替代 pyproject.toml 中的产品语义版本。

仓库已经存在 20260718_50_datasource_credentials.py,因此 Kestra 编排相关的 第一条数据库迁移继续使用主计划中的 20260718_60_workflow_engine_abstraction.py。 不得为了匹配 V50 名称而重命名已经存在或已经执行的迁移。

2. 总体推进规则

flowchart LR
    V50["V50\n迁移基线与引擎无关模型"] --> V51["V51\nKestra 与引擎适配"]
    V51 --> V52["V52\nDataOps Runner 与资源池"]
    V52 --> V53["V53\nContext / Scheduling MCP"]
    V53 --> V54["V54\nAI 调度规划闭环"]
    V54 --> V55["V55\n双轨迁移、切换与有条件退役"]

统一规则:

  1. 每个版本只实现本版本声明的范围,不提前混入下一版本功能。
  2. 每个版本必须先运行新增/修改代码的单元测试,再运行受影响边界的契约或集成测试。
  3. 默认不执行全仓库、全前端、全容器验证;按变更影响选择最小充分测试集。
  4. 测试失败、迁移不可回滚、秘密泄漏、重复写风险或上一版本退出条件未满足时停止推进。
  5. 每个版本保存一份 docs/validation/kestra-v<version>.md,记录代码版本、测试命令、 结果、已知限制和是否允许进入下一版本。
  6. V50–V54 始终保留 n8n 正式运行路径;V55 也只有满足退出门槛后才允许移除 n8n。

3. 分层验证策略

级别 内容 使用时机
L1 变更级 新增/修改模块的单元测试、Schema 和静态检查 每个版本必跑
L2 边界级 相邻模块契约、数据库迁移、MCP/API 合约 该版本改变边界时运行
L3 场景级 只启动相关容器的集成或冒烟场景 V51–V55 按范围运行
L4 全量级 全部 Python 测试、前端构建、完整本地栈验收 不按版本重复执行;仅在 V55 真正下线 n8n 前执行一次

出现以下情况可以额外触发 L4,但必须在验证记录中说明原因:

  • 修改认证/RBAC、全局数据库会话、应用启动入口或公共响应协议。
  • 修改共享基础镜像、Python/Node 版本或全局依赖锁。
  • 修改跨越三个以上业务域的公共模块,无法通过 L1–L3 隔离风险。
  • 准备生产切换、正式移除 n8n,或发现难以定位的跨模块回归。

代码格式化、文档修改或单一模块变更不得机械触发 L4。

4. V50:迁移基线与引擎无关领域模型

目标

在不改变生产执行路径的前提下,完成 n8n 资产盘点、WorkflowSpec/SchedulePlan Schema、通用引擎绑定和迁移审计模型,为后续接入 Kestra 建立稳定契约。

实施范围

  • 导出不含凭据内容的 n8n Workflow 迁移清单和定义哈希。
  • 建立 app/core/orchestration/ 领域模块。
  • 增加通用 engine_typeengine_definition_idengine_revision 和绑定表。
  • 回填现有记录为 engine_type='n8n',保留原有 n8n 字段。
  • 建立 WorkflowSpec、SchedulePlan、节点注册表、DAG 和秘密字段校验。
  • 维持同一 DataFlow/环境只有一个正式版本和正式引擎。

本版本不做

  • 不部署 Kestra。
  • 不改变 n8n 调度、启停和执行行为。
  • 不创建 Runner 或 MCP 服务。
  • 不允许 AI 发布或修改工作流。

增量验证

L1:

.venv/bin/python -m pytest -q \
  tests/test_n8n_migration_inventory.py \
  tests/core/orchestration/test_spec.py \
  tests/core/orchestration/test_repository.py \
  tests/core/orchestration/test_policy.py

L2:

.venv/bin/python -m pytest -q \
  tests/test_database_migrations.py \
  tests/test_workflow_version_schema.py \
  tests/test_workflow_repository.py \
  tests/test_workflow_activation.py

退出门槛

  • 全部活跃及近 90 天执行过的 n8n Workflow 均进入盘点或阻塞清单。
  • 数据库迁移可升级、可降级,现有 n8n 数据可无损读取。
  • 明文秘密、环形 DAG、未知节点、无限重试和无界回填被拒绝。
  • n8n 原有正式流程继续运行,行为没有改变。

回滚点

回滚新建表和新增字段;DataOps 恢复只读取原有 n8n 映射。不得删除或重写现有 n8n Workflow。

5. V51:Kestra OSS、官方 MCP 与引擎适配

目标

在本地隔离环境部署固定版本 Kestra OSS 和官方 Python MCP,完成 N8nAdapterKestraAdapter 与确定性 Kestra 编译器;n8n 仍是唯一正式引擎。

实施范围

  • 在 Compose 中增加 Kestra OSS 和官方 MCP,使用独立数据库或 Schema。
  • 服务只加入内部网络,关闭不使用和企业版工具组。
  • 建立统一引擎生命周期接口。
  • 将 WorkflowSpec 确定性编译为默认禁用的 Kestra Flow。
  • 验证创建/更新、启停、执行、日志、Pause/Kill、Backfill、Replay、 Restart 和 Resume 契约。
  • 建立 Kestra MCP 工具和参数 Schema 差异检测。

本版本不做

  • Kestra 不访问业务数据源。
  • 不运行生产影子任务。
  • 不开放原始 Kestra MCP 给智能体。
  • 不改变任何 DataFlow 的正式引擎角色。

增量验证

L1/L2:

.venv/bin/python -m pytest -q \
  tests/test_kestra_local_contract.py \
  tests/core/orchestration/test_engine_contract.py \
  tests/core/orchestration/test_kestra_compiler.py

L3 仅启动 PostgreSQL、Kestra 和 MCP:

docker compose -f deploy/docker/docker-compose.yml up -d postgres kestra kestra-mcp
.venv/bin/python -m pytest -q tests/integration/test_kestra_mcp_contract.py

退出门槛

  • 相同 WorkflowSpec 产生相同 Kestra 定义哈希。
  • 新 Flow 和 Schedule Trigger 默认禁用。
  • MCP 合约覆盖计划使用的全部写操作,未授权工具不可用。
  • Kestra/MCP 停止后,DataOps 与 n8n 原有功能不受影响。

回滚点

停止 Kestra/MCP 容器并删除未激活的 Kestra 测试定义;n8n 保持正式执行。

6. V52:DataOps Runner 与现有数据库资源池

目标

把数据任务执行从 Flask 请求进程解耦到 DataOps Runner,复用现有 DataSourceConnectionManager,让 Kestra 只携带数据源 UID 和任务身份。

实施范围

  • 建立独立 Runner 服务、显式配置和节点注册表。
  • 支持首批 sql.querysql.execute、受限 pythonhttp 节点。
  • 使用短时、单任务绑定、防重放的签名令牌。
  • SQL 参数化;查询强制只读,写入必须通过权限和幂等策略。
  • Runner 副本、Worker 和连接池参数进入全局连接预算。
  • 验证超时、重试、重启、熔断和事务未知状态。

本版本不做

  • 不让 AI 决定写入权限或幂等性。
  • 不把数据库密码或连接串写入 Kestra。
  • 不对正式数据目标进行 Kestra 影子写入。

增量验证

L1/L2:

.venv/bin/python -m pytest -q \
  tests/runner \
  tests/core/data_source \
  tests/test_datasource_api_security.py \
  tests/test_datasource_pool_diagnostics.py

L3 只验证 Runner 与两个外部测试数据库:

docker compose -f deploy/docker/docker-compose.yml up -d \
  postgres source-postgres source-mysql runner
.venv/bin/python -m pytest -q \
  tests/integration/test_runner_datasource_pool.py \
  tests/integration/test_datasource_pool_failures.py

退出门槛

  • Kestra 和日志中不存在业务数据库密码、密文或完整连接串。
  • 重复任务令牌不会造成重复提交。
  • Runner/数据源失败不会影响平台控制库和其他数据源。
  • n8n 正式执行路径保持不变。

回滚点

停止 Runner 和 Kestra 测试调用;保留现有 Flask 内的数据源连接池路径,不迁移 正式任务。

7. V53:DataOps Context MCP 与 Scheduling MCP Gateway

目标

建立 AI 可读的业务上下文面和可写的受控调度面,将权限、审计和危险动作限制 放在 DataOps,而不是依赖 Kestra 企业版能力。

实施范围

  • Context MCP 提供 DataFlow、血缘、SLA、执行历史、数据源能力和池健康。
  • Scheduling MCP Gateway 提供候选计划、禁用发布、Canary、推广、暂停、 有界回填、限次重试和回滚等复合工具。
  • 所有工具绑定身份、角色、业务域、环境和 correlation ID。
  • 建立参数上限、连接预算、幂等、时间窗口、Prompt injection 和审计策略。
  • 禁止直接暴露任意 YAML、删除、状态篡改、KV/文件修改和动态连接配置。

本版本不做

  • 不接入自主调度 Agent。
  • 不允许模型直接调用 Kestra MCP。
  • 不推广任何生产 Kestra Flow。

增量验证

L1/L2:

.venv/bin/python -m pytest -q \
  tests/mcp/test_dataops_context_mcp.py \
  tests/mcp/test_scheduling_gateway.py \
  tests/security/test_scheduling_tool_boundaries.py \
  tests/test_permission_matrix.py \
  tests/test_system_auth.py

L3 只验证 Gateway → Kestra/MCP → 审计链路:

.venv/bin/python -m pytest -q \
  tests/integration/test_kestra_mcp_contract.py \
  tests/integration/test_scheduling_gateway_audit.py

退出门槛

  • Viewer、Editor 和调度服务身份只能访问授权业务域和工具。
  • 敏感信息、超范围回填、无限重试和未经校验的 YAML 均被拒绝。
  • 相同推广请求重复提交保持幂等。
  • 日志或元数据中的恶意文本不能改变工具权限和策略。

回滚点

撤销智能体身份的 Gateway 访问权限并停止两个 MCP 服务;Kestra 保持禁用版本, n8n 继续正式运行。

8. V54:AI 调度规划、Canary 与恢复闭环

目标

让调度智能体通过 DataOps MCP 完成“观察 → 生成候选 → 校验 → 模拟 → 禁用发布 → Canary → 推广建议 → 监控 → 恢复/回滚”的受控闭环。

实施范围

  • 规划器输出严格的 WorkflowSpec/SchedulePlan 结构,不输出可直接执行的任意 YAML。
  • 保存模型、Prompt、Schema、上下文哈希、候选计划、校验和动作结果。
  • 建立模型超时、无效输出、工具失败和目标冲突的确定性降级。
  • 恢复智能体只允许暂停、降并发、限次重试和回到上一稳定版本。
  • 选择 1–2 个只读、低频流程执行 Kestra Canary;n8n 仍为正式引擎。

本版本不做

  • 不让 AI 自动执行高风险生产写入。
  • 不切换正式引擎。
  • 不删除、停止或改写 n8n 正式流程。

增量验证

L1/L2:

.venv/bin/python -m pytest -q \
  tests/agent/test_planner_scenarios.py \
  tests/agent/test_recovery_scenarios.py \
  tests/mcp/test_scheduling_gateway.py \
  tests/security/test_scheduling_tool_boundaries.py

L3 运行固定 AI 场景和只读 Canary:

.venv/bin/python -m pytest -q \
  tests/integration/test_agent_kestra_canary.py \
  tests/integration/test_agent_model_offline.py

退出门槛

  • 固定场景全部产生合法计划或安全拒绝。
  • 模型不可用时,已发布调度继续运行,平台退化为固定计划。
  • Canary 不写正式目标,结果可与 n8n 正式运行对比。
  • AI 决策、工具调用和策略结果能够通过 correlation ID 完整追踪。

回滚点

禁用调度智能体和所有候选 Kestra Trigger;保留审计记录,n8n 继续正式运行。

9. V55:双轨迁移、分批切换与有条件退役 n8n

目标

建立结果对账、单流程角色切换和自动回滚机制,按风险批次从 n8n_primary_kestra_shadow 切换到 kestra_primary_n8n_standby;只有满足统一 退出门槛后,才进入 kestra_primary 和 n8n 运行时下线。

实施范围

  • 实现四种双轨角色和同一环境唯一正式写入引擎约束。
  • 影子任务使用只读模式或隔离 Schema/表/对象键。
  • 对账行数、主键、聚合值、哈希、异常、耗时和资源消耗。
  • 按“只读 → 幂等分区写 → 核心多节点 → 特殊高风险”顺序迁移。
  • 每个流程独立执行切换、Kestra 故障和 n8n 回切演练。
  • n8n 先停止新建/激活,再进入 Standby,再归档,最后有条件移除运行依赖。

增量验证

迁移和角色切换测试:

.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

每个迁移批次只运行该批流程的对账、SLA、连接预算和故障恢复场景,不重复执行 不相关业务域测试。

只有准备正式移除 n8n 运行依赖时,执行一次 L4:

.venv/bin/python -m pytest -q
npm --prefix frontend run build
docker compose -f deploy/docker/docker-compose.yml up -d --build

完整本地栈随后只执行关键验收路径:登录、数据源健康、一个只读流程、一个幂等 写流程、失败恢复、回填、回滚和 n8n 已归档不可再激活。L4 通过不代表自动批准 下线,仍需满足下述退出门槛。

退出门槛

  • 所有生产 n8n Workflow 已迁移、归档或有正式保留说明。
  • 所有正式 DataFlow 已使用 Kestra,且不存在未解释的双轨差异。
  • 关键流程经过完整业务周期和至少一次故障恢复/回滚演练。
  • n8n Standby 观察期内没有实际回切需求。
  • 模型离线、Kestra/Runner 重启和单数据源故障均不破坏生产状态。
  • 没有 Webhook、前端入口、脚本或外部系统继续依赖 n8n。
  • 完整归档和唯一一次最终 L4 验证通过。

若任一条件未满足,V55 可以以 kestra_primary_n8n_standby 状态完成阶段性交付, 但不得宣称 n8n 已经下线。

回滚点

单流程回滚到 n8n_primary 或上一稳定 Kestra 版本。已经移除 n8n 运行容器后, 只能依据 V55 下线前归档和恢复演练执行独立恢复变更,不允许在故障现场临时重建 未知版本。

10. 版本验证记录模板

每个版本完成时创建对应验证记录:

# Kestra V5x 验证记录

- 代码版本:
- 验证日期:
- 变更范围:
- 执行的 L1/L2/L3 测试:
- 未执行的测试及原因:
- 测试结果:
- 数据迁移升级/降级结果:
- 安全与秘密检查结果:
- 已知限制:
- 回滚点:
- 结论:允许/不允许进入 V5(x+1)

验证记录必须明确列出“未执行的测试及原因”,避免把增量验证描述成全量通过。

11. 与主实施计划的映射

交付版本 主计划 Task
V50 Task 0–1
V51 Task 2–3
V52 Task 4
V53 Task 5–6
V54 Task 7 + 首批只读 Canary
V55 Task 8–10

详细文件清单和技术边界继续以 Kestra AI-first Data Factory 双轨改造实施计划 为准;本文件是实施顺序和验证范围的执行入口。