From 9eae223a403b91d0aeeb4bbc2470725b742b74c1 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Wed, 3 Jun 2026 09:00:09 +0800 Subject: [PATCH] auto-sync: 2026-06-03 09:00:09 --- docs/design/09-rebuttal-and-goal-gate.md | 85 ++++++++++++++++++------ 1 file changed, 63 insertions(+), 22 deletions(-) diff --git a/docs/design/09-rebuttal-and-goal-gate.md b/docs/design/09-rebuttal-and-goal-gate.md index a03fea2..5071ea1 100644 --- a/docs/design/09-rebuttal-and-goal-gate.md +++ b/docs/design/09-rebuttal-and-goal-gate.md @@ -123,41 +123,82 @@ Agent 完成任务 → review | 文件 | 改动 | 说明 | |------|------|------| -| `ticker.py` `_handle_review_conclusion` | 修改 | verdict 非 approved 时 @mention 被审 agent | +| `dispatcher.py` `_task_on_complete` | 修改 | review completed → 读 verdict → approved 标 done / 非 approved @mention assignee | +| `ticker.py` `_process_mentions` | 修改 | rebuttal mention spawn 时带 `_review_on_complete` 回调 | +| `prompt_templates/executor.md` | 修改 | 加入“需求不清晰时 @pangtong-fujunshi 提问” | | `prompt_templates/reviewer.md` | 修改 | 加入 rebuttal 流程指引 | -| `prompt_templates/executor.md` | 修改 | 加入"需求不清晰时 @pangtong-fujunshi 提问" | | `prompt_templates/review_pangtong.md` | 修改 | 加入仲裁指引 + 目标一致性检查 | +| `prompt_templates/review_simayi.md` | 修改 | 加入 rebuttal 处理指引 | -#### _handle_review_conclusion 改动细节 +#### _task_on_complete 改动细节(dispatcher.py) -当前逻辑: +当前逻辑(L244-250):review completed → 直接标 done。 + +改为: ```python -if is_achieved: - # GOAL_ACHIEVED → done +if _is_review: + if outcome in ("completed", "session_revived"): + # 读 verdict + review = conn.execute( + "SELECT verdict FROM reviews WHERE task_id=? ORDER BY created_at DESC LIMIT 1", + (_task_id,) + ).fetchone() + if review and review["verdict"] == "approved": + _dispatcher._mark_task_status(_task_db, _task_id, "done") + else: + # 非 approved → @mention 被审 agent(用 assignee,非 current_agent) + task = conn.execute("SELECT assignee FROM tasks WHERE id=?", (_task_id,)).fetchone() + if task and task["assignee"]: + bb.add_comment(_task_id, "daemon", + f"@{task['assignee']} 审查结论: {review['verdict'] if review else '未知'},请查看详情并决定接受或反驳", + comment_type="review") + # 不标 done,保持 review + else: + # crash/error → 保持 review 等 ticker 处理 + pass +``` + +#### _process_mentions 改动细节(ticker.py) + +当前 mention spawn 不带 on_complete。rebuttal 场景需要带,否则新 verdict 无人处理。 + +触发条件:task status=review + mention 的 comment_type 包含 rebuttal + +```python +# 在 mention spawn 时检查:如果是 rebuttal 场景 +has_rebuttal = any( + item.get("comment_type") == "rebuttal" + for item in items +) +task_status = bb.get_task(items[0]["task_id"]).status if items else None + +if has_rebuttal and task_status == "review": + # rebuttal 重审:带 on_complete 回调处理新 verdict + result = await self.spawner.spawn_full_agent( + agent_id=agent_id, + message=prompt, + task_id=tid, + use_main_session=True, + on_complete=_review_on_complete, # 处理新 verdict + ) else: - # continue → working + # 普通 mention:不带回调 + result = await self.spawner.spawn_full_agent( + agent_id=agent_id, + message=prompt, + task_id=tid, + use_main_session=True, + ) ``` -这是庞统 round review 的处理。需要区分两个场景: -1. **庞统 round review**(现有)— 检查全局目标 -2. **司马懿 code review**(新增)— verdict 非 approved 时通知 agent - -对于场景 2,不在 `_handle_review_conclusion` 里处理(那是庞统 round review 的回调),而是在 dispatcher 的 review task dispatch 流程中: - -``` -review task → spawn 司马懿 → 司马懿完成 → classify outcome - → verdict 写入 reviews 表 - → 如果 verdict != approved → 写 comment @被审agent 通知 - → 被审 agent 自主决定接受或反驳 -``` - -**实现位置**:dispatcher 中 review task 的 on_complete 回调。 +其中 `_review_on_complete` 复用 dispatcher 中 review verdict 的处理逻辑(读 verdict → approved 标 done / 非 approved @mention)。 #### 防止无限循环 -- RebuttalManager.MAX_ROUNDS = 2(已有) +- RebuttalManager.MAX_ROUNDS = 2(已有,rebuttal round 1 司马懿重审 + round 2 庞统仲裁) - 超过 2 轮 → 庞统最终裁决 - 每个 review 记录在 reviews 表中,rebuttal_count 可追溯 +- `_dispatch_reviews` 已有 `if reviews: continue` 保护,有 review 结论的任务不会被重复 dispatch ### 2.2 目标一致性 Gate