feat(design): §17 ToolchainHandler 强约束设计(取代 action Mail 类型) #63
Reference in New Issue
Block a user
Delete Branch "feat/17-toolchain-handler-enforcement"
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?
概述
让 toolchain 事件回归 ToolchainHandler(§14 已设计已实现已注册但未接线),通过三层强约束(输入/执行/输出)解决流程断链问题。
取代关系
取代 PR #62
17-action-mail-type.md(已在 main 上,本 PR 标记为 superseded)。方向修正:不在 Mail 侧加 action 类型,而是让 toolchain 事件回归 ToolchainHandler。
核心设计
改动文件(实施时)
Reviewers
姜维审查意见(infra/部署维度)
✅ 通过 — 方向修正正确
PR #62 在 Mail 侧加 action 类型,需要改 mail_handler + prompt_composer + spawner + db + mail_notify + 8 个模板,影响面大且侵入 Mail 系统。本 PR 利用已注册的 ToolchainHandler(main.py L224 已注册),只做强化和接线,架构上更干净。
部署影响评估
1. _toolchain DB 初始化 — 无风险
~/.sanguo_projects/sanguo_moziplus_v2/data/_toolchain/目录不存在(当前从未走过 ToolchainHandler)_toolchain_db_path()中调用init_db()创建新库,CHECK 约束问题不存在(新库直接按新 schema 建)_mail/blackboard.db的旧 comments 表有 CHECK 问题,但本设计不碰 _mail DB2. ticker 扫描 — 已覆盖
TaskTypeRegistry.register(ToolchainHandler())在 main.py L224 已执行virtual_projects()返回[_mail, _toolchain],ticker 自动扫描3. 现有 _mail DB 数据 — 无影响
4. comments API 端点兼容性
POST /api/projects/_toolchain/tasks/{task_id}/commentscomment_type参数。如果不支持,需要在 Step 1 同步加上架构兼容性
PromptContext 新增字段 — 向后兼容
action_type: str = ""和action_steps: list = field(default_factory=list)有默认值verify_completion fallback 设计 — 合理
⚠️ 关注点
关注点 1:ToolchainApiSection 当前指向「手动标 done」
现有 toolchain_handler.py 的 ToolchainApiSection.render() 指引 Agent
POST /status {"status": "done"}。§4.4 设计说改为 action_report 指引,但这是实现改动,不是设计文档问题。实施时确保 ToolchainApiSection 和 ToolchainConstraintsSection 同步改。关注点 2:on_failure 通知目标
现有
on_failure通过 Mail API 通知庞统(to: pangtong-fujunshi)。对于 deploy_failure 场景,庞统不是最佳处理人——应该同时通知 jiangwei-infra。建议在_notify_via_mail_api中根据 action_type 选择通知目标,或者在 steps 定义中 deploy_failure 的收件人已经是 jiangwei-infra,所以 on_failure 通知原始收件人即可。结论
设计批准。比 PR #62 方案更干净——利用已有架构,不侵入 Mail 系统。实施时注意 ToolchainApiSection/ConstraintsSection 同步改造和 comments API 的 comment_type 参数支持。
APPROVED
风险级别:LOW(纯设计文档,无代码改动)
方向判断
本 PR 是对 PR #62 的方向修正。PR #62 在 MailHandler 侧新增 action 类型;本 PR 改为让 toolchain 事件回归 §14 已设计的 ToolchainHandler。方向支持——架构上更干净:
代码验证(对照实际代码库)
审查确认
必须修
M1. [§5.1 L356] verify_completion fallback 伪代码使用
LENGTH(content)但 comments 表列名是bodyPR §5.1 第三层 fallback:
实际 DB schema(db.py):
这是现有代码的潜在 bug——toolchain_handler.py L162 同样写了
LENGTH(content)。当前 ToolchainHandler verify 从未被调用(toolchain 事件走了 _mail DB),所以这个 bug 没有被触发。本 PR 接线后 ToolchainHandler verify 将首次投入运行,此 bug 会立刻暴露(SQLite 抛no such column: content→ except 捕获 → 返回 verify_error)。修改方向:伪代码改为
LENGTH(body),实现时同步修复 toolchain_handler.py L162 的同名 bug。建议改
S1. [§4.4] 当前 ToolchainApiSection(toolchain_handler.py L70-78)明确指示 Agent "完成后务必通过以下命令将任务标记为 done",含完整 curl 示例。PR 说改为 action_report 指引,但建议实现时注意这不是追加——是完全重写 ToolchainApiSection.render()。现有代码的 done curl 指引如残留,与 verify_completion 自动 done 会产生矛盾。
S2. [§7.2 handler 示例] steps 中
tasks/<task_id>/comments用<task_id>占位符。实际 task_id 在_send_toolchain_task内部生成。Agent 从 ToolchainApiSection 渲染的context.task_id获得真实值。这个间接依赖建议在设计中说明:steps 中的<task_id>是占位符,实际值由 ToolchainApiSection 提供。S3. [§17 审查清单] 建议补充一条:
comments 表 CHECK 约束同步——确认 _toolchain DB 的 comments 表(新建)是否继承 db.py 的 CHECK 约束(不含 action_report)。如果是,需要确保新建 _toolchain DB 时去掉 CHECK 或加入 action_report。Approve