[ARCH] 三Agent工单协作:blocked回流、独立身份、钉钉通知与清单门禁 #7

Open
opened 2026-10-14 18:09:56 +08:00 by zheromiku · 2 comments
Owner

1. 背景和目标

用户提出五项改进:开发正式上报blocked;blocked交回架构;Webhook通过钉钉提醒;不同Agent使用不同Gitea账号;正文完成项及时勾选。此单跟踪设计、现状与实施前置,不是已授权启动的DEV任务。

2. 约束与已确认决策

Hermes architect/code/tester对应Gitea agent-architect/agent-code/agent-tester。复用已有钉钉群机器人,不新增机器人。main单线,不分支/PR/合并;只有code修改代码、正常推送main与不可变注释snapshot/vX.Y.Z。正式版本/部署另批。第一阶段自动化只派送architect,不自动启动code/tester。

3. 系统边界

Gitea为正式合同,角色规则负责执行纪律,接收器负责签名与去重、任务队列负责架构派送,现有bridge负责钉钉。不同账号不等于技术ACL隔离;权限必须实测。通知和任务接收为两个独立结果。

4. 模块与执行合同

  • 阻塞:code先写原因/证据/影响/推荐备选/需谁决定/解除条件/原状态及责任人/SHA-tag,再置status:blocked,指派agent-architect并停止受阻操作。普通可在授权范围内修复的问题不滥用blocked。
  • 接收:architect读取正文及最新评论,留下接收记录;澄清与范围变更分开。范围、接口、版本语义、安全权限或生产操作变化等待用户裁定;条件实际满足才恢复原状态和责任人。
  • Webhook:校验真实Gitea签名与仓库allowlist,读回最新工单;持久化、去重、乱序处理后派送架构并通知钉钉。不将工单内容当无条件工具授权。
  • 身份:每角色独立凭据,核对认证用户;缺失不回退个人管理员账号;Git提交作者与认证推送人分开核查。
  • 清单:架构分组ARCH/DEV/ACC/CLOSE,稳定ID、责任人和证据;开发勾开发项,tester勾独立验收项。完成一项就同步正文并留证,不能只有评论。不得借更新任务框删改合同。

5. 数据模型草案

Event:delivery_id/repo/issue/action/actor/status/assignee/blocked_comment_id;Dispatch:event_key/profile/queued-dispatched-acknowledged-failed/attempts/error;Notification:event_key/provider/queued-provider_accepted-unknown-failed/attempts/error。Checklist:稳定条目ID、责任角色、适用性、完成证据、验收版本。

6. API与状态草案

Gitea入站Webhook→签名校验→最新工单GET→持久队列→架构派送、钉钉出站。工单正文更新使用PATCH但只修改任务框;评论/标签/指派每次写后读回。接口事件action、header及Hermes执行入口需按部署版本核实,不猜API。blocked接收不等于已解除。无关正文勾选不得触发blocked重派。

7. 权限/安全/日志

不授站点管理员,最小仓库/token权限实测;凭据仓库外、0600、无输出。入站secret与钉钉secret分离,不复制共享个人凭据。禁止强推、覆盖旧tag、生产配置/Runner改动。架构/验收若平台无法细分代码与工单写权限,必须如实披露。

8. 部署与CI/CD影响

现有/srv/aiball/ci/bridge有dingtalk.py,config.json notify_provider=dingtalk,仓库外凭据文件存在且0600;未实发工单通知。该目录不处于Git仓库,需核实所属源码仓库、服务配置及部署管理。服务/端口/重启/真实发送需对应授权,默认不补投旧消息。通知标题用【工单阻塞】,复用队列但区分事件类型,不改变CI质量结论。

9. 风险

共享helper从~/.git-credentials读取,当前未独立身份;三个目标用户名查询HTTP404。Webhook重复/乱序、评论与标签竞态、架构自评论循环、任务入队被误称接收、钉钉超时重复消息、正文PATCH覆盖并发更改。API缺乏可靠条件更新时需明确并发边界与串行编辑规则。

10. 架构清单与建议开发拆分

  • ARCH-01 用户决定:三个用户名按profile加agent-,复用现有机器人。证据:架构会话确认。
  • ARCH-02 核查账号/共享接入/bridge现状。证据:三个用户GET404、既有helper、bridge配置与文件元数据检查;未发送消息。
  • ARCH-03 更新三个SOUL阻塞/接收/清单规则。证据:三个角色文件补丁成功;不代表自动化或独立身份已启用。
  • ARCH-04 修复文档试跑工单遗漏勾选。证据:已关闭试跑单原15项未勾,根据开发#113/验收#117补勾后15项已勾,审计评论#122;仅任务框变化,无代码改动。
  • ARCH-05 确认bridge所属源码仓库、运行方式、Gitea事件与Hermes架构派送入口。
  • ARCH-06 明确最小权限实测方案、账号安全创建/凭据落地,以及真实消息/服务变更授权。
  • ARCH-07 将上述前置转为用户批准的实现交接,不能以本ARCH单自动启动开发。
    建议实现阶段:独立账号与凭据→身份冒烟→Webhook/队列/架构接收→复用钉钉→失败/重复/清单门禁验收。正式代码和测试全部由code负责。

验收标准草案:

  1. 三角色认证身份与评论作者正确,不回退个人账号;code正常推送身份正确。
  2. blocked含完整证据、责任归属正确,architect实际接收并留记录;用户需裁定项不自动解除。
  3. 用户批准的实际钉钉消息可见,业务errcode0与群可见分开核实;失败有界重试/unknown、无泄密。
  4. 重复/乱序事件不重派,架构评论/正文勾选不产生循环,新阻塞可再派。
  5. code逐项勾开发清单;tester只勾有独立PASS证据的验收项;review/accepted前适用清单齐全。未完成不假勾,N/A由架构记录,rework撤勾失效项。
  6. 关单前交付项完成;关单动作成功读回后再勾收尾项,最终Closed且适用清单完整,不形成关单前必须已关单的循环门禁。
  7. 更新正文保留标准与他人修改,失败不冒称写入成功;不触碰业务代码、Runner、生产部署或旧消息补投。

11. 当前阶段与待确认

角色规则与试跑单补勾已完成;账号、凭据切换、Webhook、自动派送和工单钉钉通知尚未实现/验证。此单Open、无ready,不是DEV授权。架构文档仅在当前profile本地,不冒充已推送远端文档链接。

用户批准后的交接与真实状态

用户已确认批准独立ci-bridge仓库、三个非管理员账号/最小团队权限以及开发实现范围;确认技术邮箱仅标识、不发送邮件。三个架构前置条目现已完成:ARCH-05源码工作副本和systemd已查清,选用桥持久队列串行调用architect CLI;ARCH-06最小权限方案与安全文件已落实,运行上线/Hook/真实消息明确仍需另批;ARCH-07正式开发交接已创建。这里的勾选表示架构前置完成,不代表Webhook或通知已上线。
独立实现工单:Weknora/ci-bridge#1 ,作者agent-architect,指派agent-code,status:ready。源码仓库私有且空,main由code保存完整本地历史后正常推送。账号/user及两仓读取均HTTP200,三者admin=false、code push=true、架构/验收push=false;完整权限/身份helper/Git接入还需DEV验收实测。
本ARCH单不作为开发领取入口,移除status:ready避免与实现单混淆;保留Open跟踪后续实现,不由架构替tester关闭。未启动code/tester、未部署重启、未启用Hook、未实发钉钉消息。

## 1. 背景和目标 用户提出五项改进:开发正式上报blocked;blocked交回架构;Webhook通过钉钉提醒;不同Agent使用不同Gitea账号;正文完成项及时勾选。此单跟踪设计、现状与实施前置,不是已授权启动的DEV任务。 ## 2. 约束与已确认决策 Hermes architect/code/tester对应Gitea agent-architect/agent-code/agent-tester。复用已有钉钉群机器人,不新增机器人。main单线,不分支/PR/合并;只有code修改代码、正常推送main与不可变注释snapshot/vX.Y.Z。正式版本/部署另批。第一阶段自动化只派送architect,不自动启动code/tester。 ## 3. 系统边界 Gitea为正式合同,角色规则负责执行纪律,接收器负责签名与去重、任务队列负责架构派送,现有bridge负责钉钉。不同账号不等于技术ACL隔离;权限必须实测。通知和任务接收为两个独立结果。 ## 4. 模块与执行合同 - 阻塞:code先写原因/证据/影响/推荐备选/需谁决定/解除条件/原状态及责任人/SHA-tag,再置status:blocked,指派agent-architect并停止受阻操作。普通可在授权范围内修复的问题不滥用blocked。 - 接收:architect读取正文及最新评论,留下接收记录;澄清与范围变更分开。范围、接口、版本语义、安全权限或生产操作变化等待用户裁定;条件实际满足才恢复原状态和责任人。 - Webhook:校验真实Gitea签名与仓库allowlist,读回最新工单;持久化、去重、乱序处理后派送架构并通知钉钉。不将工单内容当无条件工具授权。 - 身份:每角色独立凭据,核对认证用户;缺失不回退个人管理员账号;Git提交作者与认证推送人分开核查。 - 清单:架构分组ARCH/DEV/ACC/CLOSE,稳定ID、责任人和证据;开发勾开发项,tester勾独立验收项。完成一项就同步正文并留证,不能只有评论。不得借更新任务框删改合同。 ## 5. 数据模型草案 Event:delivery_id/repo/issue/action/actor/status/assignee/blocked_comment_id;Dispatch:event_key/profile/queued-dispatched-acknowledged-failed/attempts/error;Notification:event_key/provider/queued-provider_accepted-unknown-failed/attempts/error。Checklist:稳定条目ID、责任角色、适用性、完成证据、验收版本。 ## 6. API与状态草案 Gitea入站Webhook→签名校验→最新工单GET→持久队列→架构派送、钉钉出站。工单正文更新使用PATCH但只修改任务框;评论/标签/指派每次写后读回。接口事件action、header及Hermes执行入口需按部署版本核实,不猜API。blocked接收不等于已解除。无关正文勾选不得触发blocked重派。 ## 7. 权限/安全/日志 不授站点管理员,最小仓库/token权限实测;凭据仓库外、0600、无输出。入站secret与钉钉secret分离,不复制共享个人凭据。禁止强推、覆盖旧tag、生产配置/Runner改动。架构/验收若平台无法细分代码与工单写权限,必须如实披露。 ## 8. 部署与CI/CD影响 现有/srv/aiball/ci/bridge有dingtalk.py,config.json notify_provider=dingtalk,仓库外凭据文件存在且0600;未实发工单通知。该目录不处于Git仓库,需核实所属源码仓库、服务配置及部署管理。服务/端口/重启/真实发送需对应授权,默认不补投旧消息。通知标题用【工单阻塞】,复用队列但区分事件类型,不改变CI质量结论。 ## 9. 风险 共享helper从~/.git-credentials读取,当前未独立身份;三个目标用户名查询HTTP404。Webhook重复/乱序、评论与标签竞态、架构自评论循环、任务入队被误称接收、钉钉超时重复消息、正文PATCH覆盖并发更改。API缺乏可靠条件更新时需明确并发边界与串行编辑规则。 ## 10. 架构清单与建议开发拆分 - [x] ARCH-01 用户决定:三个用户名按profile加agent-,复用现有机器人。证据:架构会话确认。 - [x] ARCH-02 核查账号/共享接入/bridge现状。证据:三个用户GET404、既有helper、bridge配置与文件元数据检查;未发送消息。 - [x] ARCH-03 更新三个SOUL阻塞/接收/清单规则。证据:三个角色文件补丁成功;不代表自动化或独立身份已启用。 - [x] ARCH-04 修复文档试跑工单遗漏勾选。证据:已关闭试跑单原15项未勾,根据开发#113/验收#117补勾后15项已勾,审计评论#122;仅任务框变化,无代码改动。 - [x] ARCH-05 确认bridge所属源码仓库、运行方式、Gitea事件与Hermes架构派送入口。 - [x] ARCH-06 明确最小权限实测方案、账号安全创建/凭据落地,以及真实消息/服务变更授权。 - [x] ARCH-07 将上述前置转为用户批准的实现交接,不能以本ARCH单自动启动开发。 建议实现阶段:独立账号与凭据→身份冒烟→Webhook/队列/架构接收→复用钉钉→失败/重复/清单门禁验收。正式代码和测试全部由code负责。 验收标准草案: 1. 三角色认证身份与评论作者正确,不回退个人账号;code正常推送身份正确。 2. blocked含完整证据、责任归属正确,architect实际接收并留记录;用户需裁定项不自动解除。 3. 用户批准的实际钉钉消息可见,业务errcode0与群可见分开核实;失败有界重试/unknown、无泄密。 4. 重复/乱序事件不重派,架构评论/正文勾选不产生循环,新阻塞可再派。 5. code逐项勾开发清单;tester只勾有独立PASS证据的验收项;review/accepted前适用清单齐全。未完成不假勾,N/A由架构记录,rework撤勾失效项。 6. 关单前交付项完成;关单动作成功读回后再勾收尾项,最终Closed且适用清单完整,不形成关单前必须已关单的循环门禁。 7. 更新正文保留标准与他人修改,失败不冒称写入成功;不触碰业务代码、Runner、生产部署或旧消息补投。 ## 11. 当前阶段与待确认 角色规则与试跑单补勾已完成;账号、凭据切换、Webhook、自动派送和工单钉钉通知尚未实现/验证。此单Open、无ready,不是DEV授权。架构文档仅在当前profile本地,不冒充已推送远端文档链接。 ## 用户批准后的交接与真实状态 用户已确认批准独立ci-bridge仓库、三个非管理员账号/最小团队权限以及开发实现范围;确认技术邮箱仅标识、不发送邮件。三个架构前置条目现已完成:ARCH-05源码工作副本和systemd已查清,选用桥持久队列串行调用architect CLI;ARCH-06最小权限方案与安全文件已落实,运行上线/Hook/真实消息明确仍需另批;ARCH-07正式开发交接已创建。这里的勾选表示架构前置完成,不代表Webhook或通知已上线。 独立实现工单:https://gitea.zheromiku.top/Weknora/ci-bridge/issues/1 ,作者agent-architect,指派agent-code,status:ready。源码仓库私有且空,main由code保存完整本地历史后正常推送。账号/user及两仓读取均HTTP200,三者admin=false、code push=true、架构/验收push=false;完整权限/身份helper/Git接入还需DEV验收实测。 本ARCH单不作为开发领取入口,移除status:ready避免与实现单混淆;保留Open跟踪后续实现,不由架构替tester关闭。未启动code/tester、未部署重启、未启用Hook、未实发钉钉消息。
zheromiku added the status:ready label 2026-10-14 18:17:25 +08:00
Author
Owner

架构只读核查结果与推荐实施路径

开发和验收均已在独立会话重新读取角色规则并确认,未领取本ARCH单。

已核实事实

  1. /home/zheromiku/ci-bridge 是干净的main本地Git工作副本,HEAD ecfdd6d4849e889e98ed4c66c1ba89722cacc899;git remote无输出,尚无远端。bridge.py/dingtalk.py/flush_undelivered.py与/srv/aiball/ci/bridge对应文件逐字节一致。该比较证明磁盘文件一致,不证明运行进程全部内存模块与磁盘一致。
  2. hermes-ci-bridge.service为用户systemd服务,ExecStart=/usr/bin/python3 /srv/aiball/ci/bridge/bridge.py,WorkingDirectory同目录,ActiveState=active/SubState=running;127.0.0.1:8899/healthz返回ok=true。README所称无systemd、手工启动已经过时,不以文档代替运行证据。
  3. 现有发送器支持钉钉,notify_provider=dingtalk,凭据文件仓库外且0600;本轮未发真实消息。bridge当前POST入口仅CI report/publish,无工单Webhook入口,不能直接拿CI上报接口接工单载荷。
  4. 当前共享Gitea认证用户zheromiku且is_admin=true;三个agent-*账号未接入。Weknora现有只有Owners团队。本实例Swagger支持CreateTeamOption/EditTeamOption.units_map,可设计repo.issues=write、repo.code=read(架构/验收)或write(开发)、repo.actions=read;禁止Owners和站点admin、禁止includes_all_repositories/can_create_org_repo。是否真正满足勾选、指派、关单及禁止push需真实身份验证。
  5. 当前仓库仅一个已启用dingtalk类型push Hook;不是工单blocked接收Hook,不修改它以免破坏已有推送通知。
  6. Gitea1.26.2官方源services/webhook/deliver.go:133-147确认同时发送X-Gitea-*和兼容X-GitHub-Event/Delivery及X-Hub-Signature-256;本机Hermes gateway/platforms/webhook.py:652/680/789使用这些兼容字段,协议静态核查兼容。
  7. architect gateway未运行,webhook平台未启用;default gateway正在运行,architect/default有共享微信凭据警告。本轮不启动或修改gateway。

推荐方案(草案,尚未实现)

在ci-bridge工作副本扩展独立工单Webhook入口,严格Gitea签名与仓库allowlist;持久化工单事件/架构任务,串行worker以固定profile与固定模板调用hermes -p architect chat -q,只传仓库、工单号、事件标识,不把载荷任意文本拼成shell命令。architect重新读取真实工单,按新角色规则接收处理并写Gitea接收记录。通知复用现有钉钉发送器,但工单事件队列/去重键与CI报告分开;不改变CI report/publish合同。
该路径无需启用architect gateway,不动default消息服务。备选为启用architect仅Webhook gateway并增加必要持久派送保障;不推荐直接改Hermes核心或将CI报告伪装为工单。

建议为ci-bridge建立独立Gitea源码仓库(仓库名需用户批准),把它与knowledge-governance业务仓库分开;不能为让agent-code开发bridge而授予全部仓库权限。需确认账号邮箱/安全创建方式、角色token落点和组织团队权限,三账户均非管理员。

仍未完成、不能打勾的项

ARCH-05:磁盘源码、服务和协议已查清,但接收器/派送工作目录、远端源码仓库归属及实际请求链路尚待最终确定,保持未勾。
ARCH-06:权限方案有API证据,账号未创建、实际最小权限未验证;真实消息和服务变更尚无对应批准,保持未勾。
ARCH-07:尚未进入开发,未创建DEV任务、未启动code/tester,保持未勾。

需用户批准后才实施:独立源码仓库、三个非管理员身份与最小团队权限、开发实现范围;服务部署/重启、Gitea新Hook启用和一条真实钉钉测试消息另明确批准。所有开发/验收完成项须在正文勾选并留证,未完成项不能只因方案提出就勾选。
本轮仅GET、git/systemctl只读核查及本ARCH评论留档,无代码、凭据、账号、权限、hook、服务变更,无消息发送。

## 架构只读核查结果与推荐实施路径 开发和验收均已在独立会话重新读取角色规则并确认,未领取本ARCH单。 ### 已核实事实 1. /home/zheromiku/ci-bridge 是干净的main本地Git工作副本,HEAD ecfdd6d4849e889e98ed4c66c1ba89722cacc899;git remote无输出,尚无远端。bridge.py/dingtalk.py/flush_undelivered.py与/srv/aiball/ci/bridge对应文件逐字节一致。该比较证明磁盘文件一致,不证明运行进程全部内存模块与磁盘一致。 2. hermes-ci-bridge.service为用户systemd服务,ExecStart=/usr/bin/python3 /srv/aiball/ci/bridge/bridge.py,WorkingDirectory同目录,ActiveState=active/SubState=running;127.0.0.1:8899/healthz返回ok=true。README所称无systemd、手工启动已经过时,不以文档代替运行证据。 3. 现有发送器支持钉钉,notify_provider=dingtalk,凭据文件仓库外且0600;本轮未发真实消息。bridge当前POST入口仅CI report/publish,无工单Webhook入口,不能直接拿CI上报接口接工单载荷。 4. 当前共享Gitea认证用户zheromiku且is_admin=true;三个agent-*账号未接入。Weknora现有只有Owners团队。本实例Swagger支持CreateTeamOption/EditTeamOption.units_map,可设计repo.issues=write、repo.code=read(架构/验收)或write(开发)、repo.actions=read;禁止Owners和站点admin、禁止includes_all_repositories/can_create_org_repo。是否真正满足勾选、指派、关单及禁止push需真实身份验证。 5. 当前仓库仅一个已启用dingtalk类型push Hook;不是工单blocked接收Hook,不修改它以免破坏已有推送通知。 6. Gitea1.26.2官方源services/webhook/deliver.go:133-147确认同时发送X-Gitea-*和兼容X-GitHub-Event/Delivery及X-Hub-Signature-256;本机Hermes gateway/platforms/webhook.py:652/680/789使用这些兼容字段,协议静态核查兼容。 7. architect gateway未运行,webhook平台未启用;default gateway正在运行,architect/default有共享微信凭据警告。本轮不启动或修改gateway。 ### 推荐方案(草案,尚未实现) 在ci-bridge工作副本扩展独立工单Webhook入口,严格Gitea签名与仓库allowlist;持久化工单事件/架构任务,串行worker以固定profile与固定模板调用hermes -p architect chat -q,只传仓库、工单号、事件标识,不把载荷任意文本拼成shell命令。architect重新读取真实工单,按新角色规则接收处理并写Gitea接收记录。通知复用现有钉钉发送器,但工单事件队列/去重键与CI报告分开;不改变CI report/publish合同。 该路径无需启用architect gateway,不动default消息服务。备选为启用architect仅Webhook gateway并增加必要持久派送保障;不推荐直接改Hermes核心或将CI报告伪装为工单。 建议为ci-bridge建立独立Gitea源码仓库(仓库名需用户批准),把它与knowledge-governance业务仓库分开;不能为让agent-code开发bridge而授予全部仓库权限。需确认账号邮箱/安全创建方式、角色token落点和组织团队权限,三账户均非管理员。 ### 仍未完成、不能打勾的项 ARCH-05:磁盘源码、服务和协议已查清,但接收器/派送工作目录、远端源码仓库归属及实际请求链路尚待最终确定,保持未勾。 ARCH-06:权限方案有API证据,账号未创建、实际最小权限未验证;真实消息和服务变更尚无对应批准,保持未勾。 ARCH-07:尚未进入开发,未创建DEV任务、未启动code/tester,保持未勾。 需用户批准后才实施:独立源码仓库、三个非管理员身份与最小团队权限、开发实现范围;服务部署/重启、Gitea新Hook启用和一条真实钉钉测试消息另明确批准。所有开发/验收完成项须在正文勾选并留证,未完成项不能只因方案提出就勾选。 本轮仅GET、git/systemctl只读核查及本ARCH评论留档,无代码、凭据、账号、权限、hook、服务变更,无消息发送。
Member

已完成用户批准的基础配置:私有空仓Weknora/ci-bridge;三个agent-*非管理员restricted账号及两组按repo单元限制的团队;独立token/user和两仓读取已核实,凭据仅仓库外0700/0600保存,未发送邮件。正式DEV交接已由agent-architect创建于Weknora/ci-bridge#1,指派agent-code且ready。ARCH-05/06/07按各自架构前置证据勾选,不代表运行上线;实现、Git角色接入、权限负例及真实Webhook/钉钉/架构接收尚未验收。此评论真实认证作者agent-architect,不使用个人admin日常接入。移除本ARCH单ready,避免误领,保留Open。服务重启/Hook启用/真实群测试未授权、未执行;未启动Agent。

已完成用户批准的基础配置:私有空仓Weknora/ci-bridge;三个agent-*非管理员restricted账号及两组按repo单元限制的团队;独立token/user和两仓读取已核实,凭据仅仓库外0700/0600保存,未发送邮件。正式DEV交接已由agent-architect创建于https://gitea.zheromiku.top/Weknora/ci-bridge/issues/1,指派agent-code且ready。ARCH-05/06/07按各自架构前置证据勾选,不代表运行上线;实现、Git角色接入、权限负例及真实Webhook/钉钉/架构接收尚未验收。此评论真实认证作者agent-architect,不使用个人admin日常接入。移除本ARCH单ready,避免误领,保留Open。服务重启/Hook启用/真实群测试未授权、未执行;未启动Agent。
agent-architect removed the status:ready label 2026-10-14 18:39:30 +08:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Weknora/knowledge-governance#7