长期夜间编程平台方案选型报告

Deep ResearchDurable WorkflowAI Coding Platform
生成时间:2026-05-13 10:33 CST | HTML 路径:/NightProgrammingReport.html | Markdown 路径:/NightProgrammingReport.md
结论:不要直接恢复当前 cron。先止血,再以 Temporal/BullMQ 原型升级为可恢复、可观测、可人工介入的夜间 AI 编程平台。

长期夜间编程平台方案选型报告

访问时间:2026-05-13 10:33 CST
研究对象:本机 NixOS + DeepKr 多仓库 + Codex/Claude Code/AI worker 的无人值守夜间编程平台。
结论级别:方案选型与迁移路线;不是继续修补 `night_tick.py` 的局部排障记录。

1. 执行摘要

核心结论: 当前夜间编程失败不是单点 bug,而是把 cron、队列、状态恢复、AI worker、验证、提交、通知揉进一个轻量脚本后产生的系统性失效。长期方案应升级为:调度器 → durable workflow engine → 隔离 worktree worker → artifact contract → reducer/merge queue → validation gates → local commit/report/dashboard → human-in-loop。

推荐选型:

立即行动:

  1. 保持 `night-admin-dev-queue` 暂停,不直接 resume。
  1. 先做 P0 止血:修 `in_progress` 阻塞、stale lock、`.env.example` 误判、Web 脏工作树 reducer/commit。
  1. 用 1 周做 Temporal/BullMQ 双轨原型:同一条 `admin-01` 任务端到端跑通,比较恢复、可观测性和维护成本。
  1. 迁移到“任务 artifact 合同 + 独立 worktree + reviewer gate + local commit”后,再恢复夜间批量。

风险提示: Temporal 不是魔法:Workflow 必须保持 deterministic,所有 `codex exec`、git、文件系统、浏览器测试都必须做成 Activity,并且 Activity 要幂等或可补偿。否则会把旧脚本的隐患搬进新引擎。

2. 问题定义

2.1 当前事实

当前夜间编程管线的关键状态:

2.2 研究问题

需要回答的问题不是“怎么让 cron 再跑一次”,而是:

  1. 长期无人值守 AI 编程应使用哪类 durable workflow / queue / scheduler?
  1. AI coding worker 应如何隔离,避免 diff 混杂、污染主工作树和不可回滚?
  1. 如何设计 reducer、validation gate、本地 commit、人工介入和 dashboard?
  1. 在本机 NixOS + 多 repo + Codex/Claude Code 的实际约束下,分阶段迁移路线是什么?

2.3 边界

3. 证据矩阵

声明来源 A来源 B一致性备注
Cron/timer 适合触发,不适合承载 durable workflow 状态机systemd.timer 文档说明 timer 触发 unit;GitHub Actions schedule 文档说明 cron 触发 workflowAirflow 文档把 schedule 与 DAG run/task state 分离当前把 cron 和状态机混在脚本里是结构问题
长期无人值守任务需要持久化状态、重试、历史和恢复Temporal durable execution / retry policyLangGraph persistence / fault-tolerance / pending writesTemporal 更偏通用工作流;LangGraph 更偏 agent graph
外部副作用必须与可重放编排逻辑隔离Temporal TS 文档:Workflow deterministic,外部状态通过 ActivitiesCelery 文档:任务需幂等、ack/retry 会导致重复执行AI CLI、git、浏览器测试都应是 Activity/Task
简单 queue 可以做 retry/backoff,但不是完整平台BullMQ retry/backoff + flowsCelery retry/states/canvas/chords需要另补审计、人工介入、artifact 合同
AI 编码 worker 必须运行在受限/隔离环境Codex sandboxing 文档OpenHands Docker Runtime / SWE-agent ACI 思路本地最小可行隔离是 git worktree + sandbox 权限
git worktree 是多任务本地隔离基础Git 官方 worktree 文档Aider 文档强调 git auto-commit/dirty separationworktree 解决“同一工作树混 diff”的 P0 风险
Airflow/Dagster/Prefect 强在 workflow UI/作业编排,但不是 AI diff reducer 原生工具Airflow DAG/scheduler 文档Dagster retries / Prefect states 文档可借鉴 UI/状态模型,不建议作为首选内核
Cloudflare 可用于发布报告产物Cloudflare Pages Direct Upload / Wrangler PagesWorkers Custom Domains 文档本报告采用 Worker custom domain 部署 HTML

4. 来源清单

类型来源URL访问时间可信度
官方文档Temporal Retry Policieshttps://docs.temporal.io/encyclopedia/retry-policies2026-05-13 10:33 CST
官方博客Temporal Durable Executionhttps://temporal.io/blog/what-is-durable-execution2026-05-13 10:33 CST
官方文档Temporal TypeScript Core Applicationhttps://docs.temporal.io/develop/typescript/core-application2026-05-13 10:33 CST
官方文档LangGraph Durable Executionhttps://docs.langchain.com/oss/python/langgraph/durable-execution2026-05-13 10:33 CST
官方文档LangGraph Persistencehttps://docs.langchain.com/oss/python/langgraph/persistence2026-05-13 10:33 CST
官方文档BullMQ Retrying Failing Jobshttps://docs.bullmq.io/guide/retrying-failing-jobs2026-05-13 10:33 CST
官方文档BullMQ Flowshttps://docs.bullmq.io/guide/flows2026-05-13 10:33 CST
官方文档Celery Tasks / Retry / Stateshttps://docs.celeryq.dev/en/stable/userguide/tasks.html2026-05-13 10:33 CST
官方文档Celery Canvashttps://docs.celeryq.dev/en/stable/userguide/canvas.html2026-05-13 10:33 CST
官方文档Prefect Stateshttps://docs.prefect.io/v3/concepts/states2026-05-13 10:33 CST
官方文档Dagster Run Retrieshttps://docs.dagster.io/deployment/execution/run-retries2026-05-13 10:33 CST
官方文档Airflow DAGshttps://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dags.html2026-05-13 10:33 CST
官方文档Airflow Schedulerhttps://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/scheduler.html2026-05-13 10:33 CST
官方文档OpenAI Codex Non-interactivehttps://developers.openai.com/codex/noninteractive2026-05-13 10:33 CST
官方文档OpenAI Codex Sandboxinghttps://developers.openai.com/codex/concepts/sandboxing2026-05-13 10:33 CST
官方文档Claude Code Headlesshttps://code.claude.com/docs/en/headless2026-05-13 10:33 CST
官方文档OpenHands SDK Getting Startedhttps://docs.openhands.dev/sdk/getting-started2026-05-13 10:33 CST
官方文档OpenHands Docker Runtimehttps://docs.openhands.dev/usage/runtimes/docker2026-05-13 10:33 CST
官方文档SWE-agent Docshttps://swe-agent.com/latest/2026-05-13 10:33 CST
官方文档Aider Git Integrationhttps://aider.chat/docs/git.html2026-05-13 10:33 CST
官方文档Git Worktreehttps://git-scm.com/docs/git-worktree2026-05-13 10:33 CST
官方文档GitHub Actions Schedule Eventshttps://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule2026-05-13 10:33 CST
官方文档systemd.timerhttps://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html2026-05-13 10:33 CST
官方文档Cloudflare Pages Direct Uploadhttps://developers.cloudflare.com/pages/get-started/direct-upload/2026-05-13 10:33 CST
官方文档Cloudflare Wrangler Pages Commandshttps://developers.cloudflare.com/workers/wrangler/commands/pages/2026-05-13 10:33 CST
官方文档Cloudflare Workers Custom Domainshttps://developers.cloudflare.com/workers/configuration/routing/custom-domains/2026-05-13 10:33 CST

5. 详细发现

5.1 当前失败根因:不是“夜里没跑”,而是缺少状态机和恢复协议

现有 `night_tick.py` 事实上承担了四种职责:队列状态机、AI worker 调度、验证提交、通知汇报。任何一个环节失败,脚本都没有 durable checkpoint、resume branch、artifact contract 和人工介入点,于是出现:

这说明“cron job 成功”与“业务 workflow 成功”已经脱钩。平台必须把业务状态提升为一等对象。

5.2 Scheduler 层:cron/systemd/GitHub Actions 只能触发

`systemd.timer` 的职责是基于时间触发 unit;GitHub Actions schedule 也是 cron-style event;Airflow 则把 schedule、DAG run、task instance、dependency、retry 和 UI 分成独立概念。这给当前系统的启发是:

5.3 Durable workflow:Temporal 是长期主控首选

Temporal 的核心优势:

但要注意 Temporal 的约束:Workflow 必须 deterministic。所有外部副作用都必须封装成 Activity:

这正好逼迫平台形成清晰边界:Workflow 只做编排和状态转移,Activity 做外部世界。

5.4 BullMQ/Celery:适合快速落地队列,但需补平台层

BullMQ 提供 failed job retry、backoff、stalled job 和 FlowProducer parent-child flows;Celery 提供 task retry、states、acks、canvas chain/group/chord。它们证明“队列 + worker + retry”是成熟模式。

但夜间编程还需要:

这些不是 BullMQ/Celery 自动提供的,需要平台自己实现。因此 BullMQ 最适合 Phase 1 原型或局部任务队列,不建议作为最终唯一真相来源,除非明确接受自建大量控制面。

5.5 LangGraph:适合 agent 内部状态,不适合取代外部工程治理

LangGraph 的 persistence/checkpointer 支持 checkpoint、thread_id、state history、time travel、pending writes、interrupt/human-in-loop。这非常适合 AI agent 的内部推理图和人工审批节点。

但本场景还涉及本地文件系统、git worktree、测试进程、端口、浏览器、提交和多仓库迁移。LangGraph 可作为单个 AI worker 的内部“脑内流程”,外层仍应由 Temporal/BullMQ 这类工程控制面负责资源与副作用。

5.6 Airflow / Dagster / Prefect:可借鉴,不宜作为首选内核

Airflow 提供 DAG、Task Instance、DAG Run、scheduler、UI、backfill 和 trigger rules;Dagster/Prefect 提供状态、retry、作业编排和观测。这些能力对“可观测批处理”很成熟。

不首选的原因:

它们适合借鉴 UI 和状态模型,或在未来需要跨机器/跨数据作业时接入。

5.7 Worker 隔离:git worktree 是最低正确层,容器是第二层

当前同一工作树写入导致最大风险:diff 混杂、未提交产物污染后续任务、失败后不知道该 revert 还是继续。Git 官方 worktree 支持一个仓库多个 working tree;Aider 文档也强调自动 commit 和 dirty separation 的价值。

推荐隔离层级:

  1. **每个任务一个 git worktree**:路径如 `.night-platform/worktrees/{repo}/{task_id}`。
  1. **每个 worker 独立 run dir**:保存 prompt、stdout、stderr、exit code、diff、test report、browser evidence。
  1. **AI CLI sandbox 权限**:Codex 使用 workspace-write/read-only 分工;review worker read-only。
  1. **容器/namespace 可选增强**:对高风险任务使用 Docker/Firecracker/E2B/Slicer 类 microVM;本机先不必一开始上 K8s。

5.8 AI coding worker 对比

Worker优势风险建议角色
Codex CLI非交互、sandbox、适合自动化需要严格权限和 artifact 合同主开发 worker / reviewer worker
Claude Code headlessheadless/CI 资料成熟,适合复杂实现成本与上下文控制需管理主力开发或重构 worker
OpenHandsDocker runtime、文件系统 mount、agent runtime挂载 rw workspace 有删除/污染风险中期评估为封闭 worker runtime
SWE-agentACI 思想适合基准化代码修复更偏 benchmark/research借鉴接口与评测方式
Aidergit 集成、自动 commit、dirty separation自动提交策略需纳入平台审查小任务/交互式辅助
OpenCode开源、终端 agent、生态可控sandbox/headless 能力需进一步验证备用 worker / 低成本 worker

5.9 推荐目标架构

Trigger Layer
  Hermes Cron / systemd.timer / manual CLI
        |
        v
Workflow Control Plane
  Temporal namespace: night-coding
  Workflow: NightQueueWorkflow(queue_id)
  Child Workflow: TaskWorkflow(task_id, repo, branch, spec)
        |
        v
Activity Layer
  prepare_worktree(task)
  run_dev_agent(task, worktree, sandbox=workspace-write)
  collect_artifacts(task)
  run_review_agent(task, sandbox=read-only)
  run_validation(task)
  pollution_scan(task)
  reducer_merge(task)
  local_commit(task)
  publish_report(task)
  notify(task)
        |
        v
State / Artifact Store
  SQLite/Postgres: task state, attempts, locks, metrics
  Filesystem/R2: prompts, logs, diffs, screenshots, reports
  Git: final accepted commits only
        |
        v
Human-in-loop
  approve retry / mark failed / inspect diff / resume / abort

5.10 状态机草案

queued
 -> preparing_worktree
 -> dev_running
 -> dev_artifacts_ready
 -> review_running
 -> review_passed | review_failed
 -> validation_running
 -> validation_passed | validation_failed
 -> reducer_pending
 -> committed
 -> reported
 -> done

任何状态 -> blocked_manual
任何可重试失败 -> retry_scheduled
任何不可恢复失败 -> failed_terminal

关键不变量:

6. 边界条件

7. 建议与行动项

Phase 0:止血(0.5-1 天)

  1. 保持 Hermes Cron paused。
  1. 修 `night_tick.py` 最小状态机:已有 `in_progress` 时进入 resume/review/manual,不得取新 pending。
  1. 修 pollution scan:允许 `.env.example` / `.env.template`;扫描内容是否含真实 secret。
  1. 处理 `admin-01-shell-navigation`:复核 dev artifact,跑 validation,能完成则 commit,否则标记 failed_terminal。
  1. 处理 Web Browser E2E 脏工作树:reducer + validation + local commit 或回滚。

Phase 1:平台原型(2-4 天)

Phase 2:Temporal 化(3-7 天)

Phase 3:夜间规模化(1-2 周)

Phase 4:重型增强(按需)

8. 未解决问题

  1. Temporal 是否进入 `/etc/nixos` 的 OS/User/Dev 哪一层,需要结合 NixOS-AIOS 3x3 模型再定。
  1. 本机是否已有可复用 Redis/Postgres,需要后续做系统资源盘点。
  1. Browser E2E 的 evidence schema 尚未统一:截图、trace、console、HAR 应如何归档。
  1. Codex/Claude/OpenCode 的成本、并发、5 小时窗口和模型路由,需要平台接入实际计量。
  1. Cloudflare dashboard 是否只发布最终报告,还是也发布实时夜间状态,需要单独做安全边界设计。

9. 置信度评估

附录 A:当前 Admin 队列状态快照

admin-00-foundation                completed
admin-01-shell-navigation          in_progress   ← stale,无进程
admin-02-api-auth-openapi          failed        ← .env.example false-positive
admin-03-capability-governance-ui  pending
admin-04-server-admin-overview-api pending
admin-05-dashboard-ui-live         pending
admin-06-server-user-management-api pending
admin-07-user-management-ui        pending
admin-08-server-operations-api     pending
admin-09-operations-ui             pending
admin-10-provider-audit-settings   pending
admin-11-remove-admin-from-customer-web pending
admin-12-browser-e2e-live          pending
admin-13-hardening-docs-ci         pending

附录 B:一条任务的 artifact contract 草案

{
  "task_id": "admin-01-shell-navigation",
  "attempt_id": "20260513T010000Z-01",
  "repo": "AI_Growth_Factory_Admin",
  "base_branch": "develop",
  "worktree": ".night-platform/worktrees/admin-01",
  "worker": { "type": "codex", "model": "gpt-5.5", "sandbox": "workspace-write" },
  "inputs": ["spec.md", "prompt.md"],
  "outputs": ["dev.log", "review.log", "diff.patch", "validation.json"],
  "validation": {
    "typecheck": "passed",
    "unit": "passed",
    "browser_evidence": "optional"
  },
  "decision": "commit | retry | blocked_manual | failed_terminal",
  "commit": { "hash": null, "message": null }
}