name: denylist-stuck-messages description: 将消息ID添加到relayer的拒绝列表中。在调查卡住消息后使用/investigate-stuck-messages,或当有特定消息ID需要拒绝时使用。
阻止卡住消息的拒绝列表
将消息ID添加到relayer的拒绝列表配置中,创建PR,并部署。
何时使用
-
调查后:
- 用户运行了
/investigate-stuck-messages并希望拒绝找到的消息 - 用户说“拒绝这些”或“将这些添加到黑名单”
- 用户运行了
-
直接拒绝请求:
- 用户提供特定的消息ID来拒绝
- 用户从浏览器或日志中粘贴消息ID
输入参数
/denylist-stuck-messages <message_ids> [app_context=NAME] [reason=REASON]
| 参数 | 是否必需 | 默认值 | 描述 |
|---|---|---|---|
message_ids |
是 | - | 空格或换行分隔的消息ID (0x…) |
app_context |
否 | 推断或“未知” | 用于注释的应用上下文名称 |
reason |
否 | “卡在准备队列中” | 拒绝的原因(用于注释) |
environment |
否 | mainnet3 |
部署环境 |
示例:
/denylist-stuck-messages 0xabc123 0xdef456 app_context=USDC/mainnet-cctp-v2-standard
/denylist-stuck-messages
0xabc123
0xdef456
0x789ghi
工作流程
步骤 1: 解析消息ID
从输入中提取所有消息ID。有效格式:
- 空格分隔:
0xabc 0xdef 0x123 - 换行分隔
- 逗号分隔:
0xabc, 0xdef, 0x123
验证每个ID:
- 必须以
0x开头 - 必须是66个字符(0x + 64个十六进制字符)
步骤 2: 与用户确认
使用AskUserQuestion来确认:
准备为[APP_CONTEXT]拒绝X条消息:
| 消息ID |
|--------|
| 0xabc123... |
| 0xdef456... |
是否继续?
选项:
- “是,全部拒绝”(推荐)
- “让我修改列表”
- “取消”
步骤 3: 获取用户的GitHub句柄
如果不知道,询问GitHub句柄:
您的GitHub句柄是什么,用于分支名称?
步骤 4: 更新黑名单配置
编辑typescript/infra/config/environments/mainnet3/customBlacklist.ts:
- 读取当前文件
- 将新消息ID添加到
blacklistedMessageIds数组 - 包含注释:
- 应用上下文名称
- 日期(YYYY-MM-DD格式)
- 原因
示例添加:
// [APP_CONTEXT] [REASON] [YYYY-MM-DD]
'0xabc123...',
'0xdef456...',
在数组末尾附近添加条目,在闭合括号之前。
步骤 5: 创建分支和拉取请求
# 检出主分支并拉取最新
git checkout main && git pull origin main
# 创建分支
git checkout -b <github_handle>/denylist-<app_context>
# 暂存更改
git add typescript/infra/config/environments/mainnet3/customBlacklist.ts
# 提交
git commit -m "chore: 拒绝<APP_CONTEXT>卡住消息
添加了X个消息ID到拒绝列表,用于<APP_CONTEXT>路由。
原因:<REASON>
合著者:Claude Opus 4.5 <noreply@anthropic.com>"
# 推送并创建PR
git push -u origin HEAD
gh pr create --title "chore: 拒绝<APP_CONTEXT>卡住消息" --body "$(cat <<'EOF'
## 摘要
- 添加了X个消息ID到relayer的拒绝列表
- 应用上下文:`<APP_CONTEXT>`
- 原因:<REASON>
## 消息ID
<消息ID列表>
## 测试计划
- [ ] 审核消息ID是否正确
- [ ] 使用更新后的拒绝列表部署relayer
由[Claude Code](https://claude.com/claude-code)生成
EOF
)"
步骤 6: 输出Slack消息
在询问部署之前,输出Slack消息:
**Slack消息(复制/粘贴到#relayer-alerts):**
:no_entry_sign: *拒绝列表PR已创建*
应用上下文:`<APP_CONTEXT>`
已拒绝消息:X
原因:<REASON>
PR:<PR_URL>
步骤 7: 询问部署
使用AskUserQuestion:
PR已创建。现在使用更新后的拒绝列表部署relayer吗?
选项:
- “是,立即部署”(推荐)
- “不,我稍后部署”
如果用户确认,运行:
pnpm --dir typescript/infra exec tsx ./scripts/agents/deploy-agents.ts -e mainnet3 --context hyperlane --role relayer
如果用户跳过,输出命令供后续使用。
步骤 8: 部署后更新Slack消息
如果已部署,更新Slack消息:
:no_entry_sign: *拒绝列表已部署*
应用上下文:`<APP_CONTEXT>`
已拒绝消息:X
原因:<REASON>
PR:<PR_URL>
按目的地分组
如果消息ID用于多个目的地(从调查输出中),在黑名单文件中分组:
// [APP_CONTEXT] 卡住消息 [YYYY-MM-DD]
// dest: arbitrum
'0xabc123...',
'0xdef456...',
// dest: optimism
'0x789ghi...',
'0xjkl012...',
错误处理
- 无效的消息ID格式:显示哪些ID无效,要求用户修复
- Git冲突:拉取最新主分支并重试
- PR创建失败:检查gh认证状态
- 部署失败:显示错误,建议手动部署
先决条件
ghCLI已认证- Git配置了推送访问权限到仓库
- 对于部署:
kubectl配置了访问主网集群的权限