Skip to content

Codex + Trellis 项目中,默认嵌套 workspace 继承父目录 hook 后产生零 token #8

Description

@lyyQwQ

(下文有借助 gpt 润色)

环境

背景

当前项目使用 Trellis 管理单个开发任务的 Agent 工作过程与项目知识:

  • .trellis/tasks/ 保存每个任务的需求、设计、实施计划和检查记录;
  • .trellis/spec/ 保存项目规范与长期知识;
  • .codex/hooks.json 通过 Codex UserPromptSubmit hook,在每轮请求中注入当前 Trellis 任务状态;
  • Trellis 在任务完成后更新项目规范、任务记录和开发日志。

希望继续保留 Trellis 的任务留档和项目知识更新能力,同时使用 LongHorizon-Harness 提供的 Manager、Executor、Auditor 长时间任务调度。

现象

在 Trellis 项目根目录执行:

lh-harness run --task "hi"

LongHorizon-Harness 默认在项目内部创建独立 workspace:

/path/to/project/
├── .codex/
│   ├── hooks.json
│   └── hooks/
│       └── inject-workflow-state.py
├── .trellis/
└── .lh-harness/
    └── runs/
        └── <run-id>/
            └── workspace/

Manager 实际执行方式类似:

cd .lh-harness/runs/<run-id>/workspace &&
codex exec --json --skip-git-repo-check \
  --dangerously-bypass-approvals-and-sandbox \
  --model gpt-5.6-sol -

该 workspace 是空目录,但位于项目根目录下面。根据实际运行结果,Codex 仍会向父目录发现:

/path/to/project/.codex/hooks.json
/path/to/project/.codex/config.toml
/path/to/project/AGENTS.md

项目中的 hook 配置使用相对文件名:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 -X utf8 .codex/hooks/inject-workflow-state.py",
            "timeout": 15
          }
        ]
      }
    ]
  }
}

Codex 发现父目录的 .codex/hooks.json 后,hook 命令似乎仍以 run workspace 作为当前目录执行,因此实际尝试打开:

/path/to/project/.lh-harness/runs/<run-id>/workspace/.codex/hooks/inject-workflow-state.py

该文件不存在。手动在相同 workspace 执行 hook 命令时得到:

python3: can't open file \
'/path/to/project/.lh-harness/runs/<run-id>/workspace/.codex/hooks/inject-workflow-state.py': \
[Errno 2] No such file or directory

脱敏后的 lh-harness 日志

Manager 命令本身返回退出码 0

{
  "status": "done",
  "error": null,
  "metadata": {
    "command": "cd .lh-harness/runs/<run-id>/workspace && codex exec --json ...",
    "exit_code": 0,
    "assistant_visible_output": "",
    "stderr_chars": 0,
    "stderr_tail": ""
  }
}

Codex JSONL 轨迹只有:

{"type":"thread.started","thread_id":"<redacted>"}
{"type":"turn.started"}
{"type":"turn.completed","usage":{
  "input_tokens":0,
  "cached_input_tokens":0,
  "cache_write_input_tokens":0,
  "output_tokens":0,
  "reasoning_output_tokens":0
}}

随后 lh-harness 将该轮记录为:

Next: blocked

Reason:
The manager produced no readable natural-language output.

仪表盘显示任务阻塞,需要人工继续或终止。反复继续只会创建新的零 token Manager 轮次。

对照测试

在另一个没有 .trellis.codex/hooks.json 的项目中,保持相同 lh-harness 配置和 Codex 配置运行:

lh-harness run --task "hi"

默认空 workspace 可以正常获得 Manager 回复:

{"type":"thread.started","thread_id":"<redacted>"}
{"type":"turn.started"}
{"type":"item.completed","item":{
  "type":"agent_message",
  "text":"Current task state: ..."
}}
{"type":"turn.completed","usage":{
  "input_tokens":35335,
  "cached_input_tokens":3840,
  "output_tokens":448,
  "reasoning_output_tokens":78
}}

同一个 Codex CLI 在项目目录之外执行最小请求也能正常产生消息和 token。

因此,当前证据更接近以下组合条件:

  1. lh-harness 默认 workspace 位于项目内部;
  2. Codex 从 workspace 向父目录发现项目级配置和 hooks;
  3. hook 配置来自父项目;
  4. hook 命令中的相对文件名按 workspace 解析;
  5. hook 脚本缺失后,Codex 仍以退出码 0 和零 token 结束。

预期行为

希望至少满足以下一种行为:

方案 A:完整隔离

默认 workspace 不继承父项目的 Codex 配置、AGENTS.md 和 hooks。

方案 B:继承项目配置

如果默认设计允许继承父项目配置,那么 hook 命令应相对配置文件所在的项目根目录执行,或者 workspace 应包含运行项目所需的 .codex.trellis 和业务文件。

方案 C:明确报告失败

如果 hook 执行失败,lh-harness 应将本轮标记为 Agent 启动失败,并展示 hook 错误。当前的退出码 0、零 token 和“Manager 没有自然语言输出”很难定位真正原因。

关于设计与集成方式的疑问

  1. 默认 workspace 的隔离范围是否只包含任务产物,还是也计划隔离 Codex 的项目级配置、AGENTS.md 和 hooks?

  2. LongHorizon-Harness 是否推荐与 Trellis、Spec Kit 等项目任务框架共同使用,还是更适合作为独立的任务管理系统?

  3. 对于已经使用 Trellis 的项目,推荐的组合方式是什么?

    • 将 lh-harness workspace 设置为项目根目录;
    • 为每个 run 创建独立 Git worktree;
    • 在 Manager 和 Auditor 中关闭项目 hooks,仅在 Executor 中保留;
    • 将 Trellis 的任务文档和规范复制到 run workspace;
    • 或采用其他方式。
  4. lh-harness 是否适合增加以下配置能力?

[run]
inherit_project_config = false
codex_extra_args = ["--disable", "hooks"]

或者允许按角色配置:

[run.roles.manager]
inherit_project_hooks = false

[run.roles.executor]
inherit_project_hooks = true

[run.roles.auditor]
inherit_project_hooks = false
  1. 如果每个 run 使用独立 Git worktree,lh-harness 是否计划提供 workspace 初始化、项目复制或 worktree 创建能力?

使用需求

当前项目仍需要 Trellis 提供以下能力:

  • 每个任务拥有独立的 PRD、设计、实施计划和检查记录;
  • 任务结束后保留完整开发记录;
  • 调试和实施过程中更新项目规范;
  • 后续 Agent 可以读取历史任务和项目知识;
  • 多个任务之间保持清晰的知识边界。

LongHorizon-Harness 的长时间任务调度、角色分离和独立审计很有价值。希望确认两套机制是否有推荐的组合方式,以及当前行为属于已知限制、设计选择,还是需要修正的兼容问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions