Kestra V53 阶段验收记录
- 代码分支:
codex/kestra-v50
- 验收日期:2026-07-19
- Python:3.11.15
- 结论:V53 功能与定向验收完成;允许进入 V54,但尚不移除 n8n 主路径。
完成范围
MCP 治理边界
- Context MCP 暴露 13 个只读、验证、估算和比较工具。
- Scheduling MCP 只暴露 8 个受治理复合操作:
create_candidate_plan、deploy_disabled_version、run_canary、
promote_candidate、pause_schedule、retry_failed_execution、
backfill_bounded_window、rollback_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_id、attempt、run_metadata:记录重试、补数和执行元数据。
workflow_plan_audits.actor_subject 与 idempotent_replay 审计决策。
PostgresSchedulingPlanStore 已覆盖候选、禁用部署、Canary、发布、暂停、重试、
限界补数和回滚。幂等键绑定具体工作流版本;相同键用于其他版本时拒绝执行,不会
错误重放旧结果。
PostgresAuditSink 只写入有界安全明细,不持久化令牌、密码、连接串、原始业务
数据或任意日志正文。
Canary 与发布切换
- Kestra 不允许直接执行禁用流。Gateway 在 Canary 时仅打开一个受控的手工执行
窗口,发起执行后立即恢复禁用;编译后的所有计划触发器仍逐个保持禁用。
- 独立
CanaryVerifier 从持久证据读取执行 ID,并直接查询 Kestra 终态;只有它
可以把证据更新为 passed 或 failed。
- 发布新版本时,先激活新流,再停用上一活动流,并在 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 完成:
- MCP 创建同一数据流的 v1 候选。
- MCP 编译并禁用部署到真实 Kestra。
- MCP 内部签发短时节点令牌并发起 Canary。
- Kestra 调用真实 Runner;Runner 从 Neo4j 定义和 PostgreSQL 加密凭据获取
外部 PostgreSQL 数据源,查询成功。
- 独立验证器读取真实 Kestra 终态并写入可信证据。
- MCP 发布 v1。
- 对 v2 重复候选、部署、Canary 和发布,验证 v1 在 Kestra 侧实际停用。
- 使用相同幂等键重放 v2 发布,确认不产生第二次状态变更。
- MCP 回滚 v2,验证 v1 恢复启用、v2 停用。
- 验证 Runner 成功账本、Gateway 幂等账本和清理逻辑。
结果:1 passed。
增量验证证据
- V53 MCP、编排器、Runner、安全边界、PostgreSQL、容器握手、真实 L3、相关
Kestra 回归和隔离迁移:
105 passed。
- 迁移测试使用临时数据库,覆盖两次
upgrade head、downgrade -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。