执行工作台 execution.constraintlab.io

四、统一任务接口规范 v0.1

目标:任何项目通过"一份任务清单 + 一组遵守约定的脚本"接入执行工作台,不改执行引擎。

1. 任务清单(projects/<project>/tasks.json)

{
  "project": "bagcomply",
  "repoRoot": "C:/Users/15755/WorkBuddy/bagcomply.com",
  "tasks": [
    {
      "id": "validate",
      "entry": "npm run --silent validate",
      "description": "数据全量校验(10 闸)",
      "sideEffects": "read-only",
      "timeoutMs": 600000,
      "resultSource": "stdout-json"
    },
    {
      "id": "collect-page",
      "entry": "node scripts/collect-page.mjs",
      "params": { "url": "string", "airline": "string" },
      "sideEffects": "mutating",
      "timeoutMs": 300000
    }
  ]
}

字段定义:

2. 执行环境约定

3. 结构化结果信封(stdout 最后一行或 result-file)

{
  "ok": true,
  "task": "bagcomply:validate",
  "runId": "由执行台注入,回填",
  "codeVersion": { "sha": "<gitSha>", "clean": true },
  "startedAt": "2026-10-24T07:22:00Z",
  "finishedAt": "2026-10-24T07:24:31Z",
  "durationMs": 151000,
  "exitCode": 0,
  "stats": { "airlinesChecked": 155, "errors": 0 },
  "checks": [
    { "name": "check-refs", "ok": true },
    { "name": "check-freshness", "ok": false, "detail": "3 sources stale > 30d" }
  ],
  "artifacts": ["data/verify-logs/xxx.json"],
  "errors": []
}

规则:

4. 执行台对数据工作台暴露的 HTTP API

方法 路径 说明
POST /api/runs {project, task, params?, confirm?} → {runId};mutating 任务无 confirm 返回 409
GET /api/runs/:id 完整运行记录(含信封、日志路径、双版本)
GET /api/runs?project&task&status&since 过滤查询
POST /api/runs/:id/retry 重试(复用现有实现)
GET /api/projects 列出 manifest 已注册项目与任务(含 enabled/sideEffects)
GET /api/health {version, sha, uptime}(部署核验用)
POST /api/execution-results (回调方向)推给数据工作台,鉴权 X-Node-Token

5. 新项目接入步骤(目标:半天内)

  1. 项目仓库内确认/编写要暴露的任务脚本,输出约定信封(或先接受 legacy 降级)
  2. 在执行台 projects/<name>/ 写 project.config.json + tasks.json
  3. POST /api/runs 手动跑一遍验证 → 在数据工作台登记该项目
  4. 需要调度则在数据工作台(决策侧)配置,执行台只接受请求