bug: developer re-entry after reviewer reject produces empty output #416

Closed
opened 2026-05-23 06:29:43 +00:00 by xiaoju · 3 comments
Owner

现象

solve-issue workflow 跑 #413 时,reviewer reject 后 developer re-entry,session resume 成功但 agent 输出为空,frontmatter 解析失败。

复现路径

  1. planner → developer → reviewer(reject, approved=false)
  2. Moderator 路由回 developer,edge prompt: Reviewer rejected the implementation; fix the issues.
  3. Session resume 成功(log: 9MHT4V2P resumed hermes session ...
  4. Agent 返回空内容,2 次 retry 后失败

可能原因

Continuation 模式下 re-entry 时,agent 只收到 edge prompt,但 reviewer 的具体反馈在 steps history 里。buildContinuationPrompt 可能没有把 reviewer 的 output 带过去,导致 agent 不知道要修什么。

相关 log

2026-05-23T06:22:18.077Z [M3K8V9T1] moderator role=developer prompt=Reviewer rejected the implementation; fix the issues.
2026-05-23T06:22:31.429Z [B8T5N1V6] agent command failed (uwf-hermes): ...
Agent output does not contain valid YAML frontmatter matching the role schema after 2 retries.
Raw output (first 500 chars):

Thread

06F56XEVJ8RR019W2EVEVNVJZR(已 kill)

— 小橘 🍊(NEKO Team)

## 现象 solve-issue workflow 跑 #413 时,reviewer reject 后 developer re-entry,session resume 成功但 agent 输出为空,frontmatter 解析失败。 ## 复现路径 1. planner → developer → reviewer(reject, approved=false) 2. Moderator 路由回 developer,edge prompt: `Reviewer rejected the implementation; fix the issues.` 3. Session resume 成功(log: `9MHT4V2P resumed hermes session ...`) 4. Agent 返回空内容,2 次 retry 后失败 ## 可能原因 Continuation 模式下 re-entry 时,agent 只收到 edge prompt,但 reviewer 的具体反馈在 steps history 里。`buildContinuationPrompt` 可能没有把 reviewer 的 output 带过去,导致 agent 不知道要修什么。 ## 相关 log ``` 2026-05-23T06:22:18.077Z [M3K8V9T1] moderator role=developer prompt=Reviewer rejected the implementation; fix the issues. 2026-05-23T06:22:31.429Z [B8T5N1V6] agent command failed (uwf-hermes): ... Agent output does not contain valid YAML frontmatter matching the role schema after 2 retries. Raw output (first 500 chars): ``` ## Thread `06F56XEVJ8RR019W2EVEVNVJZR`(已 kill) — 小橘 🍊(NEKO Team)
Author
Owner

调查结果

数据

  1. buildContinuationPrompt 逻辑正确 — reviewer 的 output(approved: false + 具体 biome 错误列表)会被包含在 "What Happened Since Your Last Turn" section
  2. Session resume 成功 — log 确认 9MHT4V2P resumed hermes session b81ba590...
  3. Agent 返回空内容Raw output (first 500 chars): 后面是空的,agent 真的输出了空字符串

分析

Developer 第一次运行时(sessionId b81ba590),完成了完整编码流程:写代码 → 跑测试 → 输出 frontmatter status: done

Re-entry 时 session resume 恢复了这个对话上下文,然后 continuation prompt 发过去:

## What Happened Since Your Last Turn
### Step 3: reviewer
Output: {"approved":false, ...}
## Moderator Instruction
Reviewer rejected the implementation; fix the issues.

但 hermes agent 可能把 continuation prompt 当成了一条普通的后续消息,回复了一条不含 frontmatter 的内容(或空),因为在它看来工作已经在上一轮完成了。

可能的修复方向

  1. Continuation prompt 里明确提示 agent 必须重新输出 frontmatter
  2. 或者,在 re-entry 场景下,把 outputFormatInstruction 也加到 continuation prompt 里
  3. 或者,不 resume session,直接开新 session(牺牲上下文换稳定性)

— 小橘 🍊(NEKO Team)

## 调查结果 ### 数据 1. **buildContinuationPrompt 逻辑正确** — reviewer 的 output(`approved: false` + 具体 biome 错误列表)会被包含在 "What Happened Since Your Last Turn" section 2. **Session resume 成功** — log 确认 `9MHT4V2P resumed hermes session b81ba590...` 3. **Agent 返回空内容** — `Raw output (first 500 chars):` 后面是空的,agent 真的输出了空字符串 ### 分析 Developer 第一次运行时(sessionId `b81ba590`),完成了完整编码流程:写代码 → 跑测试 → 输出 frontmatter `status: done`。 Re-entry 时 session resume 恢复了这个对话上下文,然后 continuation prompt 发过去: ``` ## What Happened Since Your Last Turn ### Step 3: reviewer Output: {"approved":false, ...} ## Moderator Instruction Reviewer rejected the implementation; fix the issues. ``` 但 hermes agent 可能**把 continuation prompt 当成了一条普通的后续消息**,回复了一条不含 frontmatter 的内容(或空),因为在它看来工作已经在上一轮完成了。 ### 可能的修复方向 1. Continuation prompt 里明确提示 agent **必须重新输出 frontmatter** 2. 或者,在 re-entry 场景下,把 `outputFormatInstruction` 也加到 continuation prompt 里 3. 或者,不 resume session,直接开新 session(牺牲上下文换稳定性) — 小橘 🍊(NEKO Team)
Author
Owner

深入调查

Session 文件验证

检查了 hermes session 文件 ~/.hermes/sessions/session_b81ba590-...json

  • 共 21 条 messages — 全是 developer 第一次运行的内容
  • 最后一条(index 20)是 status: done 的 frontmatter
  • 没有 resume 后的新消息

ACP client 分析

HermesAcpClient.prompt() 逻辑:

  1. 重置 messageChunksreasoningChunks
  2. 发送 session/prompt 请求
  3. 倒序搜索 this.messages 找最后一条非空 assistant content

关键:this.messagesprompt() 时不清空,会累积。但 session 文件只有 21 条(第一次的),说明 resume 后 hermes 的回复没有被记录。

结论

不是 status: done 的影响。session resume 本身的问题 — resume 声称成功,但后续 prompt 没有得到有效回复。可能原因:

  1. Hermes ACP 的 session resume 恢复了 session 状态,但 agent 进程已经不存在了(上一次 uwf thread step 已经退出),resume 连接到了一个死 session
  2. 或者 resume 后 prompt 发出去了,但 agent 回复了空内容(可能是 hermes 自身的 resume 行为问题)

需要看 HermesAcpClient.resume() 具体做了什么,以及 hermes 侧如何处理 session resume。

— 小橘 🍊(NEKO Team)

## 深入调查 ### Session 文件验证 检查了 hermes session 文件 `~/.hermes/sessions/session_b81ba590-...json`: - 共 21 条 messages — **全是 developer 第一次运行的内容** - 最后一条(index 20)是 `status: done` 的 frontmatter - **没有 resume 后的新消息** ### ACP client 分析 `HermesAcpClient.prompt()` 逻辑: 1. 重置 `messageChunks` 和 `reasoningChunks` 2. 发送 `session/prompt` 请求 3. 倒序搜索 `this.messages` 找最后一条非空 assistant content 关键:**`this.messages` 在 `prompt()` 时不清空**,会累积。但 session 文件只有 21 条(第一次的),说明 resume 后 hermes 的回复没有被记录。 ### 结论 ~~不是 `status: done` 的影响。~~ 是 **session resume 本身的问题** — resume 声称成功,但后续 prompt 没有得到有效回复。可能原因: 1. Hermes ACP 的 session resume 恢复了 session 状态,但 agent 进程已经不存在了(上一次 `uwf thread step` 已经退出),resume 连接到了一个死 session 2. 或者 resume 后 prompt 发出去了,但 agent 回复了空内容(可能是 hermes 自身的 resume 行为问题) 需要看 `HermesAcpClient.resume()` 具体做了什么,以及 hermes 侧如何处理 session resume。 — 小橘 🍊(NEKO Team)
Author
Owner

Bug 已复现

写了跨进程 resume e2e 测试(resume-e2e.test.ts),100% 复现:

Client A: connect → prompt("WATERMELON") → close
Client B: resume(sessionId) → prompt("what was the code?")
→ text.length === 0  ❌

根因确认:hermes ACP client 的 session resume 后 prompt 返回空文本。 不是 workflow 逻辑问题。

Resume 声称成功(不报错),但后续 prompt 拿不到有效回复。需要调查 hermes 侧 session/resume 的实现。

— 小橘 🍊(NEKO Team)

## Bug 已复现 写了跨进程 resume e2e 测试(`resume-e2e.test.ts`),100% 复现: ``` Client A: connect → prompt("WATERMELON") → close Client B: resume(sessionId) → prompt("what was the code?") → text.length === 0 ❌ ``` **根因确认:hermes ACP client 的 session resume 后 prompt 返回空文本。** 不是 workflow 逻辑问题。 Resume 声称成功(不报错),但后续 prompt 拿不到有效回复。需要调查 hermes 侧 `session/resume` 的实现。 — 小橘 🍊(NEKO Team)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#416