codex-construction — 轻量派工编排
编排的价值在分工、边界、验收,不在过程管控。不替 codex 写码,不给实现细节;给合同、给全权、给对得上的档位,验收结果。
分工
- 主代理:出方案与施工合同、拆批、定档、派工、监控、验收、终审。
- Codex:一批之内全自主——读合同、实现、跑门禁、分阶段 commit、写验收包。
- 互不越界:主代理不中途接管施工,codex 跑砸了重派而不是主代理替写;codex 不做产品级裁决。
codex 独干的系统性偏差是过度工程(含过度测试),所以主代理只在三处介入:合同定稿时杀复杂度、验收时拒收合同外机制、BLOCKED 快裁快回。
档位
effort 只用三档:medium / high / xhigh。档位跟合同留给 codex 的裁量空间和出错代价走,不跟任务「重要性」走。
| 档位 | 用于 | 判据 |
|---|---|---|
medium(施工默认) |
常规功能施工、按合同写测试、机械收尾、根因已知的定点修复、审查已定位问题的修复轮、收口核验 | 合同已写明「做什么」,codex 只定局部「怎么做」;做错门禁或 diff 能抓住,返工不出本批 |
high |
骨架批、跨模块重改动、根因未知的排查、全批次审查、medium 拒收/BLOCKED 后的重派 | 合同留了设计空间,或任务是「找问题」而非「做事」 |
xhigh |
架构重构定型批、资金/并发/安全核心、最终态全面对抗审、high 重派再失败的最后一轮 | 错了要回滚多批,或要找上一轮 high 没找到的问题 |
- 用户点名优先:用户指定了档位或模型就按用户的;没指定才按本表。
- 升档,不同档重试:某档拒收、BLOCKED 或无交付,重派升一档;xhigh 仍不过 → 熔断回方案层。
- 审 ≥ 施工:审查档不低于被审批次的施工档。
- 不降档区:xhigh 项不因额度降档,额度不够等窗口。
- 省额度靠合同和批次,不靠降审查档:批拆细、合同写到「做什么」才派
medium;合同还留着设计题的批,先在方案层把题做掉,或派high。 - 启动和 resume 都必须显式传 effort,漏传静默掉回 config 默认档。
启动
nohup bash -c 'exec codex exec -m gpt-6-astra -c model_reasoning_effort="medium" \
--dangerously-bypass-approvals-and-sandbox -o LAST.md - < PROMPT_FILE' > RUN.log 2>&1 & echo "pid=$!"
- 模型名以本机
~/.codex/config.toml为准;换名先用codex exec -m <名字> "打印 ok"探针验证,400 即无效。 --dangerously-bypass-approvals-and-sandbox:关沙箱和审批,不依赖 config,exec / resume 都收。没有兜底,边界全靠 prompt 写明。-o LAST.md:最终消息落盘,终态只看它。每批独立命名,启动前不得已存在。- 合同必须走 stdin(
- < FILE),不许 argv"$(cat FILE)":argv 会把合同泄进ps,codex 会把含本合同的进程认成别人的施工会话转去监控它,轮询自己零开工(2026-08-15:5 小时 0 commit)。 - 合同开头角色钉死:你就是施工者本人,收到即开工;ps 里含本合同文本的进程就是你自己。
- 启动调用必须秒回:同一次 Bash 里不得再带耗时前台命令——外层超时按进程组 SIGKILL,
nohup挡不住。 - 运行中的日志不要 truncate。
- 启动后立刻记下日志头部的
session id:(修复轮靠它续接),顺手核对reasoning effort:是所选档。
监控:先等进程,再读 LAST.md
echo $! 拿到的 pid 就是 codex 本身——靠的是 bash -c 里那个 exec;漏掉它 $! 就是 bash 包装进程,codex 是其子进程,kill -0 仍能判活,但杀它不会杀到 codex。进程还在就是在跑,不解析日志;进程消失后看 LAST.md:
| 终态 | 判定 | 处置 |
|---|---|---|
| 完成 | LAST.md 尾部 STAGE N DONE |
进验收 |
| 主动阻断 | LAST.md 尾部 BLOCKED[批N]: |
裁决后 resume |
| 无交付 | 有 LAST.md,两个标记都没有 |
读它定性,resume 收口或重派 |
| 额度耗尽 | 无 LAST.md,RUN.log 尾部 ERROR: You've hit your usage limit … try again at HH:MM,exit 1 |
到时刻后续接:有进度 resume,零进度重跑。不算一轮,不升档 |
| 崩溃 | 无 LAST.md,日志无错误行、停在半途 |
多为外层组杀,重跑或 resume |
- 别在
RUN.log里 grep 标记:codex 开跑会回显 prompt 原文,合同里的标记字样会在日志开头命中。 - 日志反复对同一 pid
kill -0/ps轮询且 git 零 commit = 自我监控死锁,立杀重派,别等终态。 - 进程活着 + 日志静默 20 分钟 = 卡死告警,不是「停在阶段边界等裁决」——
codex exec是单轮进程,BLOCKED 后必然退出。
Prompt 五要素
各要素一个 XML 块,块内只写事实和边界,不塞方案正文、历史对话、无关日志:
<site>现场:仓库路径、分支、前序进度。<contract>合同:指向方案文档路径让 codex 自己通读。<scope>范围:本批做什么、明确不做什么。<redlines>红线:只写真红线,用具体动作边界表述(push / 部署 / 生产库),不写抽象绝对句,不写实现细节。<delivery>交付:分阶段 commit + 验收包作为最终消息;完成时末尾单独一行STAGE N DONE+ commit hash,需裁决时末尾BLOCKED[批N]: <原因>停在阶段边界。
自主权条款(必写):这是无人值守的单轮会话,没人会回答问题——按最合理的低风险解释继续做,不停下来问;施工中发现的真实问题在范围内自行根因修复并记入验收包;只有推翻合同前提或触碰红线才 BLOCKED。
测试边界(必写):可逆、低影响的改动不写镜像实现的测试;合同要求的测试过了就停,只有新改动、新失败或未解决的疑虑才扩测或重测。
不要求中途汇报、不要求先出计划:会让模型中途停。只要最终消息。
验收包骨架:目标 / diff 摘要 / 物理删除项 / 测试状态(含预期 RED)/ 未验证项。
批次
- 同一工作树串行;并行只允许各自独立 worktree 且文件集不相交。
- 一批 = 一个可独立验收的工作包,验收后才放行下一批。
- 大工程默认三段:骨架(含 RED 测试,
high;架构定型xhigh)→ 重改动(medium起,跨模块high)→ 机械收尾(medium)。 - codex 施工中不要并行跑门禁、切分支或改同树文件。
改-审循环
审查用全新会话保独立性,prompt 写明只审不改、结论走 -o;可换模型或换 agent 交叉审。修复轮才续上下文:
codex exec resume <session-id> -m gpt-6-astra -c model_reasoning_effort="<medium|high|xhigh>" \
--dangerously-bypass-approvals-and-sandbox -o LAST2.md "<裁决或修复指令>"
- 长修复轮同样按启动一节后台起(nohup + exec +
-o),不在前台等。 - 审查从
high起步;触及不可逆资产的最终态对抗审用xhigh。修复轮按问题定档:审查已定位 →medium;审查指出的是设计问题 →high。 - 必须用显式 session id,不要用
--last:--last只在当前 cwd 找,找不到就静默新开空会话(exit 0、无警告),修复轮零上下文重跑。session id 跨 cwd 有效。 - effort 和权限旗标必须重传:resume 不继承,漏传静默掉回 config 默认。
- resume 后核对日志头部
session id:与原会话一致,不一致就是没续上。 - 续接一律用裸 CLI,不要改用
/codex:*——插件看不见裸调起的会话。 - 默认单路:首轮无阻断即收口;有阻断则修复后换新会话复审,一轮干净即可。触及不可逆资产或反复冒新阻断,才用 until-dry(连续两轮无新发现)。
- 主代理必须抽验:自己重跑关键门禁,不信验收包里的 "passed"。
- 熔断:阻断性修复超 3 轮不收敛,或修 A 破 B 振荡,立即停——方案错了,回方案层重裁,不是加轮次。