4.5 KiB
Hub 钉钉项目进度汇报
仅当当前会话是 Hub 且发生本文件定义的汇报事件时读取。钉钉是面向项目群组的单向辅助可见性与异常提醒,不是任务派发、跨角色沟通、审批、门禁、人类确认或项目记录的事实源。
权限与唯一入口
-
只有 Hub/主 Agent 可以发送;成员 Agent 只把成果、状态或阻塞交给 Hub。
-
项目配置为启用时视为持续发送授权,不需每条消息再次询问。
-
只能调用项目封装入口:
./scripts/dingtalk-progress <start|milestone|blocked|complete|failed> "<简短、人类可读的摘要和下一步>" -
Agent 不得直接调用底层 OpenAPI、
dws api或其他消息入口绕过封装脚本。 -
Agent 不读取、修改、输出或请求 Client Secret、DING_SEC、App Token、Client ID、robotCode、openConversationId 等凭据和内部标识。
-
Skill 与消息正文不得硬编码项目 Client ID、robotCode、openConversationId、Client Secret 或群名;项目差异只由
.dingtalk/config.env和封装脚本处理。
汇报单位
汇报以整个 WORK_ID 生命周期为单位。Hub 聚合阶段、任务波次和 SUBTASK_ID 的结果,不为每条队列消息、普通回复、单个小步骤或短小只读问答发送通知。
事件判定
start
每个 WORK_ID 最多一次。在第一个真实可执行任务或任务波次已经通过 Etunel 实际派发后发送。仅建立计划、等待输入或讨论想法时不发送。
milestone
在可验证、会改变下一步的实质进展发生时发送,例如:
- 关键基线/成果包经校验成为有效版本;
- 一个有意义的任务波次完成并触发角色或阶段交接;
- 门禁、受控跳转、回退或豁免完成真实记录和必要确认;
- 正式阻塞解除,项目恢复到明确下一动作;
- 统一固件、版本矩阵、测试结论、验收或发布组合形成。
同一处理轮或同一波次的相关结果合并成一条,不逐个 SUBTASK_ID 刷屏。没有固定时间间隔;依靠事件语义和去重控制频率。
blocked
出现下列实际阻塞时立即发送:
- 角色已完成负责人询问和必要线下协调,仍需用户、Hub 负责人或外部条件才能继续;
- 关键路径等待有权决定;
- Etunel 的任务投递、成员返回、会话或消息链路实际中断。
普通排队、正常等待、角色仍可自行推进或尚未完成产出不算 blocked。阻塞解除后用 milestone 汇报恢复,不修改历史消息。
complete
整个 WORK_ID 或用户明确指定的整体目标最终完成时发送一次。模拟项目必须写 SIMULATION_COMPLETED,不得表达真实发布、客户验收或生产就绪。
failed
整个 WORK_ID/整体目标已最终终止、无法恢复或明确失败时发送。可返工的测试 FAIL、单个 SUBTASK_ID 失败或临时脚本异常不使用 failed。
消息写法
写成一段短摘要,或 2–4 条简洁要点,像项目负责人向团队说明进展,不像日志转储。优先包含:
- 可公开的项目名或 WORK_ID、正式/模拟模式;
- 当前阶段或任务波次;
- 已验证进展、关键成果或版本;
- 下一步和主责角色;
- blocked 时补充原因、影响和需要谁采取什么动作。
只写已验证结论。不得包含密钥、Token、个人数据、客户敏感信息、大段日志、完整内部对话或未经验证的根因推断。
调用与结果
- Hub 判断事件并合并摘要。
- 调用封装脚本一次;脚本自行处理配置检查、发送和有限重试。
- 只有真实发送响应含非空
processQueryKey,才记为ACCEPTED,含义仅是钉钉服务端接受,不证明群成员已读。 - 缺少或未启用配置记为
SKIPPED;dry-run 记为DRY_RUN;没有有效 key 或最终发送错误记为FAILED_OR_UNKNOWN。 SKIPPED、DRY_RUN和发送前配置/依赖校验错误不重试。真实发送失败或响应无有效 key 时,由脚本最多总计尝试 3 次,尝试间隔 10 秒;首次成功立即停止。未知响应重试可能造成极少量重复通知,按当前项目策略接受。- 三次仍失败只终止本次钉钉发送,Etunel 主任务继续。Hub 在本地最终结果中向负责人说明一次,不再递归发送 blocked/failed,不自动补发历史事件。
脚本输出和退出码用于判断通知调用,不得把钉钉结果升级成项目门禁。Agent 不自行在脚本外追加重试循环。