Hermes Decision Trace

codex-worker 优化与 CPA/YT 模型路由调试复盘

本轮 codex-worker 已从零散受控脚本升级为可复验的 coding execution profile:runner、模板、runbook、receipt、evaluator summary 和 smoke 入口均已落地并验证通过。

🧭
推荐路径

codex-worker 保持为 Hermes 主控制面下的受控 execution lane,不升独立 agent;默认跟随 Codex CLI 当前默认模型,模型口径由 ~/.codex/config.toml 与 CPA /v1/models 实际 alias 决定。

🔎
关键依据

只读 smoke 最终使用 model: YT-GPT-5.5(high)provider: cpa 跑通,receipt 显示 decision.status=readyworker_output_valid=Trueacceptance_passed=Trueevaluator_summary=ready

🛠️
落地方式

保留 codex_worker.py 作为受控 runner,新增 profile runbook、模板说明、只读 smoke 模板和一键 smoke 脚本;调用时不设 CODEX_WORKER_MODEL 即跟随 Codex CLI 默认模型。

证据摘要

  • 只读 smoke 最终使用 model: YT-GPT-5.5(high)provider: cpa 跑通,receipt 显示 decision.status=readyworker_output_valid=Trueacceptance_passed=Trueevaluator_summary=ready

行动清单

后续小型 coding 任务优先按 task contract v0.8 走 codex-worker;若模型路由再失败,先查 CPA /v1/models alias 与 ~/.codex/config.toml,再跑 codex_worker_smoke.sh 复验。

边界 / 风险

风险 / 边界

custom:yt/gpt-5.5 对 Hermes 语义可能成立,但 CPA /v1/responses 并不识别。Codex CLI 走 CPA 时应使用 /v1/models 暴露的 alias,例如:

完整记录

codex-worker 优化与 CPA/YT 模型路由调试复盘

背景

本轮工作源于对 TreeX-X/WorkFlowX 的综合评估。评估结论不是吸收它的 agent/plugin 壳,而是局部吸收其中对 Hermes 有价值的 workflow discipline,尤其是:

  • Whole / Local / Unit 任务路由;
  • coder 输出不等于 completed;
  • 单一写入者原则;
  • 结构化 AC 报告;
  • subagent/context packet 压缩字段。

这些能力更适合增强本机 codex-worker 的受控执行纪律,而不是把 codex-worker 升级为类似 search-worker 的独立 agent。

关键判断

判断一:codex-worker 不是独立 agent,而是受控 execution lane

search-worker 适合独立化,是因为它承担重型公网 research、多来源证据整合、长耗时和高 token 隔离。codex-worker 当前的核心价值则是:

  • task contract 校验;
  • prompt 编译;
  • allowed/forbidden 文件边界;
  • diff / acceptance / branch / receipt 审计;
  • ready / blocked 决策回执。

因此本轮收口为:独立 profile / execution lane,不升独立 agent

判断二:worker 的 ready 不是用户侧完成

本轮明确写入 runbook 和 receipt 语义:

  • decision.status=ready 只表示 ready for review;
  • 最终 completed 必须由 Hermes 主代理或 reviewer 判定;
  • worker receipt 是审查输入,不是完成宣告。

判断三:模型默认值不应硬编码在 runner 内

早期 runner 默认传 --model gpt-5.4,这会在 CPA 模型路由调整后导致 worker 卡死。优化后 runner 逻辑变为:

  • 不设 CODEX_WORKER_MODEL 且不传 --model 时,runner 不给 codex exec--model
  • Codex CLI 自己读取 ~/.codex/config.toml
  • 只有显式传 --model 或设置 CODEX_WORKER_MODEL 时才覆盖。

这让 worker 跟随 Codex CLI 当前默认模型,而不是跟随 Hermes WebUI 主模型或写死旧模型名。

实施内容

runner 优化

修改文件:

/home/ht/knowledge/scripts/codex_worker.py

主要变化:

  • 新增 profile-aware 默认值:
  • CODEX_WORKER_PROFILE
  • CODEX_WORKER_MODEL
  • CODEX_WORKER_CODEX_BIN
  • CODEX_WORKER_RECEIPT_DIR
  • CODEX_WORKER_SANDBOX_MODE
  • CODEX_WORKER_CODEX_TIMEOUT
  • CODEX_WORKER_ACCEPTANCE_TIMEOUT
  • 新增 Codex 执行超时与 acceptance check 超时;
  • 新增 evaluator_summary
  • receipt 中新增 execution_profile 与更清晰的 model 记录;
  • 默认不再传 --model,显示为 codex-cli-default
  • 保留显式 model override 能力。

shell wrapper 优化

修改文件:

/home/ht/knowledge/scripts/codex_worker.sh

同步 runner 参数说明,补齐:

  • --profile-name
  • --receipt-dir
  • --default-sandbox-mode
  • --codex-timeout
  • --acceptance-timeout
  • --enforce-branch
  • --prepare-branch

profile runbook

新增文件:

/home/ht/.hermes/profiles/codex-worker/README.md

写入正式定位:

  • codex-worker 是受控 coding execution profile;
  • 不替代主代理;
  • 不拥有 final completion authority;
  • 推荐用于 Local / Unit 小型明确边界任务;
  • 不建议用于 Whole、复杂跨模块 feature、大范围重构。

模板与 smoke 资产

修改或新增:

/home/ht/knowledge/templates/codex-worker/README.md /home/ht/knowledge/templates/codex-worker/task-smoke-readonly.json /home/ht/knowledge/scripts/codex_worker_smoke.sh

task-smoke-readonly.json 用于只读验活;codex_worker_smoke.sh 会自动创建临时 git repo、生成 smoke task、执行 runner 并打印 receipt 摘要。

skill 同步

更新 skill:

codex-worker-routing

同步内容包括:

  • CODEX_WORKER_MODEL 改为可选覆盖;
  • 留空则跟随 Codex CLI 当前默认 model;
  • ready != completed 的完成口径;
  • profile / execution lane 定位。

调试过程

第一阶段:框架 smoke 通过,但底层模型失败

最初 smoke 证明 runner 框架可工作:

  • task 可读取;
  • receipt 可落盘;
  • boundary check 可产出;
  • acceptance results 可产出;
  • evaluator summary 可产出。

但 Codex CLI 经 CPA 调用失败:

502 Bad Gateway: unknown provider for model gpt-5.4 url: http://127.0.0.1:8317/v1/responses

这说明 blocker 在 CPA/Codex 模型路由,不在 worker 框架。

第二阶段:去掉 runner 硬编码模型

将 runner 改为默认不传 --model。验证后 receipt 中显示:

"model": "codex-cli-default"

但当时 ~/.codex/config.toml 仍然写着:

model = "gpt-5.4" model_provider = "cpa"

因此 Codex CLI 仍实际使用 gpt-5.4,继续失败。

第三阶段:错误尝试 custom:yt/gpt-5.5

曾将 ~/.codex/config.toml 改为:

model = "custom:yt/gpt-5.5"

直跑和 worker smoke 都失败:

502 Bad Gateway: unknown provider for model custom:yt/gpt-5.5

结论:custom:yt/gpt-5.5 是 Hermes provider 风格推断,不是 CPA /v1/responses 可识别的 Codex model id。

第四阶段:核对本地 CPA 实际模型 alias

读取本机 CPA 配置:

/home/ht/cli-proxy-api/config.yaml

关键配置:

openai-compatibility: - name: YT base-url: https://ai.vllmproxy.com/v1 models: - name: gpt-5.5 alias: YT-GPT-5.5(high)

查询 CPA /v1/models,确认实际暴露:

id: YT-GPT-5.5(high) owned_by: YT

随后分别验证:

  • --model 'YT-GPT-5.5(high)':通过;
  • --model 'gpt-5.5':失败,unknown provider

第五阶段:写入 Codex CLI 默认配置并复验

最终将:

/home/ht/.codex/config.toml

设置为:

model = "YT-GPT-5.5(high)" model_provider = "cpa"

再跑:

unset CODEX_WORKER_MODEL /home/ht/knowledge/scripts/codex_worker_smoke.sh \ /tmp/codex-worker-smoke-ytalias-task.json \ /tmp/codex-worker-smoke-ytalias-receipt.json

验证通过:

decision.status= ready worker_output_valid= True acceptance_passed= True evaluator_summary= ready

最终 receipt:

/home/ht/.hermes/codex-worker/receipts/20260608-002517-smoke-readonly-live-001.json

当前稳定配置

Codex CLI

/home/ht/.codex/config.toml

当前关键项:

model = "YT-GPT-5.5(high)" model_provider = "cpa"

codex-worker 调用模型规则

默认:

unset CODEX_WORKER_MODEL

由 Codex CLI 读取默认模型:

YT-GPT-5.5(high)

如需临时覆盖:

CODEX_WORKER_MODEL='YT-GPT-5.5(high)' \ python3 /home/ht/knowledge/scripts/codex_worker.py /path/to/task.json

但常规不建议设置,避免再次写死旧模型。

验证证据

直跑 Codex CLI

使用:

/home/ht/.hermes/node/bin/codex exec \ --model 'YT-GPT-5.5(high)' \ --sandbox read-only \ 'Return exactly {"changed_files":[],"tests_run":[],"risks":[],"need_human_attention":false} as raw JSON and nothing else.'

结果:

model: YT-GPT-5.5(high) provider: cpa exit_code: 0

codex-worker smoke

最终 smoke 结果:

decision.status= ready worker_output_valid= True acceptance_passed= True evaluator_summary= ready

receipt 关键字段:

{ "model": "codex-cli-default", "codex_exit_code": 0, "worker_output_validation": {"valid": true, "errors": []}, "decision": {"status": "ready", "ready_for_review": true}, "verdict": { "codex_succeeded": true, "all_acceptance_passed": true, "boundary_clean": true, "worker_output_valid": true, "ready_for_review": true } }

文件清单

类型路径状态
runner/home/ht/knowledge/scripts/codex_worker.py已优化
wrapper/home/ht/knowledge/scripts/codex_worker.sh已同步
smoke 脚本/home/ht/knowledge/scripts/codex_worker_smoke.sh已新增并验证
profile runbook/home/ht/.hermes/profiles/codex-worker/README.md已新增
模板说明/home/ht/knowledge/templates/codex-worker/README.md已更新
smoke 模板/home/ht/knowledge/templates/codex-worker/task-smoke-readonly.json已新增
Codex 配置/home/ht/.codex/config.toml已设为 YT-GPT-5.5(high)
最终 receipt/home/ht/.hermes/codex-worker/receipts/20260608-002517-smoke-readonly-live-001.jsonready

风险与边界

风险一:把 Hermes provider 字符串误当 CPA model id

custom:yt/gpt-5.5 对 Hermes 语义可能成立,但 CPA /v1/responses 并不识别。Codex CLI 走 CPA 时应使用 /v1/models 暴露的 alias,例如:

YT-GPT-5.5(high)

风险二:裸 gpt-5.5 在当前 CPA responses 路由不可用

虽然 CPA 配置里存在:

name: gpt-5.5 alias: YT-GPT-5.5(high)

但实际 /v1/responses 路由可用的是 alias,不是裸 name。直跑 gpt-5.5 已验证失败。

风险三:worker ready 仍不等于最终完成

即使 smoke ready,也只说明 execution lane 正常。真实任务仍要由主代理或 reviewer 根据 diff、acceptance、业务目标做最终完成判断。

后续建议

  1. 后续所有 codex-worker 任务默认不设置 CODEX_WORKER_MODEL,跟随 Codex CLI 默认模型。
  2. 如果 CPA 模型调整,先查:

```bash

curl -H "Authorization: Bearer <CPA_KEY>" http://127.0.0.1:8317/v1/models

```

以返回的 id 为准。

  1. 每次模型路由变更后跑:

```bash

/home/ht/knowledge/scripts/codex_worker_smoke.sh

```

  1. 真实 coding 任务继续按 task contract v0.8:
  • 明确 allowed_files
  • 明确 forbidden_files
  • 明确 acceptance_checks
  • 必要时加 diff_policy
  • 不把 Whole 任务直接塞进单个 worker。

完整记录摘要

本轮最终完成了三件事:

  1. codex-worker 从受控脚本升级为有 profile/runbook/smoke/evaluator summary 的 execution lane;
  2. 将模型选择从 runner 硬编码改为跟随 Codex CLI 默认配置;
  3. 通过核对 CPA 实际 alias,将 Codex CLI 默认模型修正为 YT-GPT-5.5(high),并用 codex-worker smoke 验证全链路 ready。