2026-10-13 · 原文发布日
站会结束自动发Slack摘要并升级长期未解阻塞
TeamRetro站会完成事件触发后按deliveryId去重,无成员更新则直接停止;整理Slack格式文本,按可配置的话题关键词提取阻塞项,并根据跨站会携带次数标记滞留阻塞。OpenAI生成标题、最多三条亮点和三条注意点,摘要发到团队频道、完整更新内容以同帖回复跟进,发现滞留阻塞则向负责人频道发升级提醒。staleAfter阈值、阻塞关键词和两个频道均可在设置里改。
原文要点
原模板用TeamRetro standup.completed触发,按deliveryId去重避免重试 webhook 重复发帖;无成员更新即停止。它把更新整理成Slack文本,按可配置blockerTopic提取阻塞,用跨站会携带次数标记stale;OpenAI侧原文称用GPT-5 Mini生成标题、最多三条亮点和三条注意点。摘要将发teamChannel,完整内容同帖回复,滞留阻塞再发leadChannel;staleAfter、关键词与两频道可改。
这次做成什么
做一条可演练的站会收尾流:webhook进来先验签和去重,没更新就安静停止;摘要发团队频道,细节进线程,只有连续滞留达到阈值的阻塞才升级负责人频道。
准备什么
- TeamRetro可开启Standup Completed webhook并能设置签名密钥
- n8n生产webhook URL可被TeamRetro访问,触发节点保存签名密钥
- Slack应用凭证允许chat.postMessage并已进入团队频道与负责人频道
- OpenAI凭据可用于摘要步骤,模型名以账号权限为准
具体怎么做
接入触发并验签去重
TeamRetro后台启用Standup Completed webhook,粘贴n8n生产URL;n8n触发节点填入同一signing secret。首节点读取headers.deliveryId或payload.deliveryId作为dedupeKey,用Data Store/Redis查重;已存在则输出duplicate=true并结束,避免重试导致双发。
空更新立即停止
Function/Code节点把payload.updates映射为数组:personName、updateText、topics、carriedForwardCount。若updates长度为0或全部updateText为空,设置stopReason=no_participant_updates并走Stop分支,不调用OpenAI也不发Slack。
整理Slack文本并提取阻塞
字段映射固定:summaryTitle←payload.standupName,finishedAt←payload.completedAt。拼接每人为“姓名:更新;话题:topics”。blockerTopic默认含blocked、blocker、阻塞、卡住,命中且updateText非空计入blockers;carriedForwardCount>=staleAfter标记stale=true,staleAfter默认2,可改。
生成三段式摘要
OpenAI Chat节点messages使用下方提示词,要求严格JSON:headline、highlights最多3条、watchOuts最多3条。解析后校验数组长度,超过就截断;空数组允许。原文称模型为GPT-5 Mini,但本练习把model放配置,需按账号可用性替换。
分支输出到Slack
主分支POST到teamChannel,text用headline加highlights/watchOuts精简块,响应ts保存为threadTs;第二条Slack消息把全员完整更新以thread_ts=threadTs回复。仅当staleBlockers.length>0进入升级分支,向leadChannel发含阻塞人、话题、携带次数和线程链接的消息;无滞留则结束。
可直接复制的材料
本站独立设置值
本站方案示例,不是原工作流;频道名、阈值、模型和存储键需替换,具体节点参数以原模板核对。
{"teamChannel":"#team-standup-demo","leadChannel":"#eng-leads-demo","staleAfter":2,"blockerTopic":["blocked","blocker","阻塞","卡住"],"dedupeStore":"n8n-data-store-demo","model":"按账号可用模型填写,原文称GPT-5 Mini","postFullUpdatesInThread":true}站会摘要提示词全文
可直接粘贴;updatesJson/staleBlockersJson由n8n表达式序列化后传入。
你是敏捷团队站会记录员。根据输入JSON生成中文摘要,禁止编造未出现的人名、任务或风险。只输出JSON:{"headline":"不超过24字","highlights":["最多3条,每条不超过30字"],"watchOuts":["最多3条,每条不超过30字"]}。规则:highlights写已完成的可验证进展;watchOuts只写更新中明确出现的风险、依赖或阻塞;若某类没有内容给空数组;不要解释。\n输入:{"standupName":"{{standupName}}","completedAt":"{{completedAt}}","updates":{{updatesJson}},"staleBlockers":{{staleBlockersJson}}}一条合成webhook测试数据
合成数据,无真实客户信息;可用n8n Test webhook或Postman发送,必须带同一签名密钥。
{"deliveryId":"demo-dlv-20261013-01","standupName":"支付小组日会","completedAt":"2026-10-13T01:30:00Z","updates":[{"personName":"林岚","updateText":"完成退款单重试补偿,剩灰度观察","topics":["refund"],"carriedForwardCount":0},{"personName":"周启","updateText":"被风控接口限流卡住,需要负责人协调配额","topics":["blocked","risk"],"carriedForwardCount":3}]输入与输出示例
本站虚构演示,未实际调用TeamRetro、OpenAI或Slack。
输入
发送上方合成deliveryId=demo-dlv-20261013-01,staleAfter=2,blockerTopic含blocked与卡住;周启阻塞已携带3次,林岚无阻塞。对应输出
团队频道主贴:headline=退款补偿完成,风控配额待协调;highlights=[林岚完成退款单重试补偿,进入灰度观察];watchOuts=[周启被风控接口限流卡住,需协调配额]。同帖回复含两人完整更新。负责人频道升级:周启,话题blocked/risk,携带3次>=阈值2,附线程占位链接。重复同一deliveryId只返回duplicate=true。做完检查这些
- 同一deliveryId第二次到达不产生Slack消息,只记录duplicate
- updates为空或全空白时工作流停止,OpenAI与Slack调用数为零
- highlights与watchOuts都不超过3条,超长数组在解析后截断
- 只有carriedForwardCount>=staleAfter的阻塞才发leadChannel
- 主贴成功后再发线程回复,且回复携带同一thread_ts
容易卡住的地方
- 签名密钥不一致或URL用测试模式会导致触发缺失,需切到生产webhook再验证
- Slack机器人未加入频道会报not_in_channel,先邀请再运行
- 阻塞关键词若太宽,普通风险会误升级;先在演练频道观察一周
- 跨站会携带次数依赖TeamRetro字段,若源数据没有该字段不能自行硬推
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Post Slack standup digests and escalate stale blockers with TeamRetro and OpenAI
- 原作者
- TeamRetro
- 原始发布日期
- 2026-10-13T08:03:06.180Z
- 来源
- https://n8n.io/workflows/20864