kestra-v53.md 5.5 KB

Kestra V53 阶段验收记录

  • 代码分支:codex/kestra-v50
  • 验收日期:2026-07-19
  • Python:3.11.15
  • 结论:V53 功能与定向验收完成;允许进入 V54,但尚不移除 n8n 主路径。

完成范围

MCP 治理边界

  • Context MCP 暴露 13 个只读、验证、估算和比较工具。
  • Scheduling MCP 只暴露 8 个受治理复合操作: create_candidate_plandeploy_disabled_versionrun_canarypromote_candidatepause_scheduleretry_failed_executionbackfill_bounded_windowrollback_to_previous_version
  • 不暴露原始 Kestra YAML、任意删除、连接修改、文件、KV、密钥或直接数据库操作。
  • 身份、角色、业务域、环境和关联 ID 必须由 MCP 进程环境显式注入;缺失、越权或 非法 UUID 时失败关闭。
  • AI 不能提交 Runner 任务令牌、不能自行声明 Canary 成功、不能授予写权限。

PostgreSQL 控制面

Alembic 20260719_80 新增并验证:

  • 候选版本的业务域、创建主体和可信写授权字段。
  • workflow_canary_evidence:保存真实 Kestra 执行 ID 和可信验证结果。
  • workflow_gateway_operations:保存发布/回滚幂等领取与完成状态。
  • workflow_runs.parent_run_idattemptrun_metadata:记录重试、补数和执行元数据。
  • workflow_plan_audits.actor_subjectidempotent_replay 审计决策。

PostgresSchedulingPlanStore 已覆盖候选、禁用部署、Canary、发布、暂停、重试、 限界补数和回滚。幂等键绑定具体工作流版本;相同键用于其他版本时拒绝执行,不会 错误重放旧结果。

PostgresAuditSink 只写入有界安全明细,不持久化令牌、密码、连接串、原始业务 数据或任意日志正文。

Canary 与发布切换

  • Kestra 不允许直接执行禁用流。Gateway 在 Canary 时仅打开一个受控的手工执行 窗口,发起执行后立即恢复禁用;编译后的所有计划触发器仍逐个保持禁用。
  • 独立 CanaryVerifier 从持久证据读取执行 ID,并直接查询 Kestra 终态;只有它 可以把证据更新为 passedfailed
  • 发布新版本时,先激活新流,再停用上一活动流,并在 PostgreSQL 中原子切换主版本。 任一步失败会执行补偿恢复并释放幂等领取。
  • 回滚会停用当前流、激活上一流;上一流激活失败时会恢复当前流。

重试与补数

  • 仅失败执行允许重试;父执行、重放执行和尝试次数写入 workflow_runs
  • 补数同时受身份范围、最大天数、最大运行次数和 SchedulePlan 限制。
  • 当前补数估算只接受语义明确的五段 Cron,并按 SchedulePlan 时区计算;不明确的 Cron 或窗口内无运行实例时失败关闭。

生产启动与容器

  • app.core.mcp.bootstrap 提供 Scheduling、Context 和 Canary Verifier 的生产工厂。
  • Scheduling 工厂装配 PostgreSQL、Kestra Adapter、Runner TaskTokenIssuer 和 持久审计;所有关键依赖缺失时拒绝启动。
  • 新增 deploy/docker/mcp.Dockerfile:Python 3.11、非 root 用户、无 HTTP 端口。
  • Compose dataops-mcp profile 提供 Context/Scheduling 两个只读文件系统的 stdio 进程;身份范围必须通过环境配置。
  • 新增 MCP 依赖采用兼容版本范围,允许向上升级并限制不兼容的大版本。

真实 L3 验收

tests/integration/test_v53_mcp_kestra_runner_l3.py 使用生产工厂和真实 MCP ClientSession 完成:

  1. MCP 创建同一数据流的 v1 候选。
  2. MCP 编译并禁用部署到真实 Kestra。
  3. MCP 内部签发短时节点令牌并发起 Canary。
  4. Kestra 调用真实 Runner;Runner 从 Neo4j 定义和 PostgreSQL 加密凭据获取 外部 PostgreSQL 数据源,查询成功。
  5. 独立验证器读取真实 Kestra 终态并写入可信证据。
  6. MCP 发布 v1。
  7. 对 v2 重复候选、部署、Canary 和发布,验证 v1 在 Kestra 侧实际停用。
  8. 使用相同幂等键重放 v2 发布,确认不产生第二次状态变更。
  9. MCP 回滚 v2,验证 v1 恢复启用、v2 停用。
  10. 验证 Runner 成功账本、Gateway 幂等账本和清理逻辑。

结果:1 passed

增量验证证据

  • V53 MCP、编排器、Runner、安全边界、PostgreSQL、容器握手、真实 L3、相关 Kestra 回归和隔离迁移:105 passed
  • 迁移测试使用临时数据库,覆盖两次 upgrade headdowngrade -1 和自动清理。
  • PostgreSQL 持久化与 Context 只读模型真实集成:通过。
  • Context/Scheduling 两个构建后容器的 JSON-RPC initialize 和 tools/list: 2 passed
  • Ruff(V53 变更范围):通过。
  • pip check:无依赖冲突。
  • Compose 配置解析:通过。
  • MCP 镜像构建:通过,镜像 ID sha256:1246bb090da7c42b4171ec5f87b430b7891cbf72cad88f140c0a17841bbe7ca1

本阶段遵循增量验证原则,没有重复运行无关前端或全仓库测试。Python 3.11 升级时 已完成一次后端全量基线回归;V53 只验证受影响范围和高风险真实链路。

保持的安全边界与后续阶段

  • 生产写节点继续失败关闭,AI 不具备自行授予写权限的路径。
  • Context MCP 的容量与数据源健康结果是保守的控制面读模型,不替代 Runner 的 实时业务查询。
  • n8n 服务、现有绑定和主路径未删除。V54/V55 应继续按双轨方式推进流量观测、 迁移批次、回退演练和最终切换;只有满足后续门禁后才能移除 n8n。