fix(commondev): 完成通知回填投递台账(原先永远停在 accepted)

## 缺陷(2026-10-18 本机实例日志实测)

异步投递上线后,台账里的记录全是 accepted、result 永远为空:

	07:39:09 accepted result=None
	07:40:09 accepted result=None
	07:41:18 accepted result=None     ← 13 条全是

而回投本身**是正常的**([plugin] 日志有 5 次 `回投任务结果…event=prompt_done`)。
缺的是:完成通知到达后没人把它写回台账。

实测后果(同一天日志,agent 自己起的轮询):

	[timer] firing: 【轮询轮次 2/6】…检查是否有新 result 回填…

agent 为此安排了 6 轮 timer 去等一个**永远不会出现**的回填,白等 30 分钟。
更根本的是:看板与任何查询方都拿不到任务结果。

## 修法

`completeDelivery`:把完成/失败结果回填到该 branch 下**最新一条**
未回填的 accepted。`recordDelivery` 改为返回 key(追溯用)。

匹配用"最新未完成"而不是按 key:完成通知里没有 key(sidecar 不知道它),
而同一 branch 的投递是串行投给同一个 pi 会话的,最新未完成那条就是它。

## 判据(6 条)

回填最新 / 不串 branch / 不覆盖已回填 / 无匹配不 panic / 返回 key /
**完成通知真的调用了回填**(接线判据)

## ★ 写判据时踩的两个坑(都记在注释里)

1. **判据没覆盖接线 → 变异不咬**:前 5 条测的是 completeDelivery 自身行为。
   把 sidecar.go 里**那一行调用删掉**,它们依然全绿 —— 而"函数写得对但
   没人调"正是原始缺陷的形态。补了第 6 条读源码验接线。

2. **偏移错位导致假绿**:分段用 `seg := block[k:]` 后找 "case ",会命中
   k 自己(n=0)⇒ seg 不截断、含整个函数剩余部分 ⇒ done 分支删掉回填也照样
   "找到" error 分支那一行。改成跳过 `case "x":` 本身的长度再找。
This commit is contained in:
JianFeeeee
2026-10-18 07:53:45 +08:00
parent 4387e12ca8
commit c9b7a6534c
3 changed files with 221 additions and 2 deletions

View File

@ -654,9 +654,13 @@ func (p *Plugin) makePromptNotifier() func(branchID string, payload map[string]i
reply = "(pi 未返回文本回复)"
}
text = fmt.Sprintf("[工程线 %s 任务完成 · session=%s]\n%s", branchID, sess, reply)
// ★ 回填台账:否则台账永远停在 accepted,谁都查不到结果
// (实测:agent 为此起了 6 轮 timer 空等)。
p.completeDelivery(branchID, sess, "done", reply)
case "prompt_error":
e, _ := payload["error"].(string)
text = fmt.Sprintf("[工程线 %s 任务失败 · session=%s]\n错误:%s", branchID, sess, e)
p.completeDelivery(branchID, sess, "failed", e)
default:
log.Printf("[commondev] 未知的通知事件 %q(branch=%s),忽略", event, branchID)
return