feat: Step 5 引擎接入 — dispatcher/spawner/ticker → handler 统一路由 + H1-H3/S3/D1/D2/D5 修复 #26
Reference in New Issue
Block a user
Delete Branch "feat/step5-engine-integration"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
[CI] 失败
分支: 26
触发 commit:
8d72a1fa19de35aaa51a858a42f8520da30b0839失败 Job: lint
请检查 CI 日志并修复。
审查结论:APPROVED(3 条建议,1 条待观察)
改动范围确认
PR #26 共 9 文件,+648/-173 行:
dispatcher.py:+73/-103(handler 统一路由,删除_mail_auto_working/complete/revert等旧方法)spawner.py:+32/-6(PromptContext 构建 +_build_api_sectionhandler 查询)ticker.py:+36/-25(虚拟项目自动发现 + handler 判断替代_mail硬编码)base_task_handler.py:+28/-25(_mark_task_status3 次重试 H1)task_handler.py:+49/-5(post_completeoverride 区分 executor/review + H2 comment_type + H3 保持 review)mail_handler.py:+11/-8(_check_reply恢复查 tasks 表 D5 + 异常返回 True)toolchain_handler.py:+21/-1(Gitea 链接替代黑板链接 S3)✅ 审计问题修复验证
D1 ✅:
_handler_on_checks_passed检查pre_spawn返回值:D2 ✅:
spawner._build_spawn_message从must_hivesJSON 提取from_agent和mail_type:D5 ✅:
_check_reply恢复查 tasks 表must_haves LIKE语义,异常返回 True(保守处理)。✅ 引擎接入验证
is_mailTaskTypeRegistry.get_by_project()_mail_auto_workinghandler.pre_spawn+ 返回值检查_mail_auto_complete/_task_on_completehandler.post_completeis_mail_legacyhandler_legacy.pre_spawn_mail_revert_to_pendingBEGIN IMMEDIATE回退_build_mail_prompthandler.build_prompt(PromptContext)is_mail → "done"handler.target_success_status_mail硬编码TaskTypeRegistry.virtual_projects()== "_mail"handler is not None== "_mail"handler is not None== "_mail"handler is not None_mail_check_replyhandler.check_completion("_general", "_mail")["_general"] + virtual_projects()✅ Handler 缺陷修复验证
H1 ✅:
_mark_task_status3 次重试 +BEGIN IMMEDIATE,最后logger.error记录全部失败。H2 ✅:
handle_review_complete中 review 非 approved 的 comment INSERT 加了comment_type='review'。H3 ✅:review 非 approved 时不再标 working,保持 review 状态 + @mention assignee。
✅ 正确性验证
handle_review_complete。crash 在 override 中先处理然后 return。逻辑正确 ✅on_failure——这是合理的,因为 Task 的on_failure本来就是"保持 working 让 ticker 重试" ✅_build_mail_prompt保留未删,旧路径仍可用。标记为 deprecated 后续清理 ✅return True(假设有回复,避免误标 failed)——正确 ✅pr_number/issue_number/commit/branch构建链接,fallback 提示检查黑板 ✅✅ 安全性
_mark_task_status重试不引入新攻击面 ✅_build_gitea_links中repo来自event_data,但只拼入 URL path,不执行命令 ✅_notify_via_mail_api改用urllib.request,无 subprocess ✅💡 建议(S)
S1:ticker
vp_name硬编码字典ticker.py中vp_name = {"_mail": "飞鸽传书", "_toolchain": "工具链事件"}.get(vp, vp)。未来新增 handler 类型时需同步更新此处。建议改为从TaskTypeRegistry或 handler 类中读取 display_name。S2:dispatcher
from src.daemon.task_type_registry import TaskTypeRegistry重复导入dispatcher.py 在方法级别多次
from src.daemon.task_type_registry import TaskTypeRegistry(dispatch / _legacy_dispatch / _dispatch_reviews / _monitor_tasks)。建议移到文件顶部 import。S3:
_mail_auto_working/_mail_auto_complete/_mail_revert_to_pending/_mail_check_reply/_mail_mark_done旧方法保留审计报告列出了这些旧方法标记为 deprecated。确认在稳定后(1-2 个 sprint)清理。当前保留不影响运行。
🔍 待观察(W)
W1:TaskHandler.post_complete 中 executor verify 失败不调 on_failure
基类
post_complete的 4 步流程(crash→verify→mark→on_failure)被 TaskHandler override 后,executor 路径 verify 不通过时只打日志不调on_failure。当前行为正确(Task 的on_failure本来就是留 working),但如果未来on_failure逻辑变更(比如加通知),这里会被跳过。建议在注释中明确说明"Task executor verify 失败不需要 on_failure 因为就是保持 working"。风险级别
引擎接入改动影响核心调度路径(dispatcher/spawner/ticker),但:
→ high(核心调度路径改动,需充分 E2E 验证后再合并)
APPROVED
[CI] 失败
分支: 26
触发 commit:
ce1b0902dd3266eb6600c785307eeaec11d8ea65失败 Job: lint
请检查 CI 日志并修复。