用途:这是 egghead Slack 私有集成的公开安全操作契约,用于在不泄露工作区数据的前提下操作该集成。私有的工作区 ID、频道映射、人员、消息内容和运行时绑定均属于本地运行时覆盖层,不得写入本仓库。
主要能力与边界:Slack 内容默认私有,禁止发布频道 ID、用户 ID、工作区 ID、频道名册、私信映射、客户数据、消息文本、文件或私有链接,也不得打印或持久化令牌值。出站 Slack 通信由单一网关传输负责,worker 只向网关返回证据,不直接发帖。普通频道消息保持为被动情报。
凭据:运行时凭据来自 agent-secrets,包括用于 Socket Mode、表情回应和机器人回复的 slack_bot_token,用于 Socket Mode 连接的 slack_app_token,以及用于已批准只读搜索和上下文检索的 slack_user_token。凭据仅按需租用,不得复制到文件、日志、提示词或 shell 历史中。
读取工作流:存在命令时使用 jc-slack 而非原始 Slack API 调用,例如 jc-slack channels --query <term>、jc-slack search '<query>' --channel <channel-name>、jc-slack context '<message-permalink>'、jc-slack board <channel-name-or-id>。回复或决策前先阅读源线程,permalink 是线程工作的稳定输入。
ShitRat 工作触发:Joel 授权了一条确定性参与路径,需同时满足:有人发布精确的 :shitrat: 或直接提及现有机器人;源频道名匹配 lc-* 或 cc-*;Joel 的个人 Slack 令牌可见该频道;私有频道上下文绑定解析出确切的仓库、cwd、Brain 条目、技能集和验证契约。触发后传输层立即添加 :shitrat: 回应,进行 triage 并生成首条 ShitRat 风格回复,分类为 social、answer 或 work。social 与 answer 回复后停止;真实工作先回复,再在解析出的项目中启动新的 Herdr/Pi worktree。worker 发送私有进度与最终回执,网关将其投射到源线程,最终结果后添加 :white_check_mark:,然后释放 pane 与 worktree。网关重写回执而非直接粘贴,先讲结果,用平实语言解释原因,只保留有用的技术回执,最后给出下一步或未解决风险。使用短段落、扁平项目符号、bold、行内代码和 <url|label> 链接,不使用 Markdown 标题、表格、嵌套项目符号或大段流水账。最终结果默认 1200 字符,进度更新默认 320 字符。该触发不需要 Task Grant、Reply Grant 或单独审批;未映射频道会失败关闭并收到需要绑定的回复,网关绝不猜测仓库。
需审批的回复:在 ShitRat 触发之外,频道回复需要 Joel 批准确切文本。先用 jc-slack reply '<message-permalink>' --text-file <path> 生成预览,预览返回绑定审批的确认命令,仅在 Joel 批准确切回复文本后运行该命令。CLI 将投递委托给单一网关传输并返回投递回执。不得用用户令牌、原始 chat.postMessage 或第二个 Slack 监听器绕过此流程。
被动情报:配置的重要频道可将非机器人消息送入私有索引与中继管道,可被索引、批处理或升级,但不授予回复权限。
回填:由主机 worker 负责 Slack 历史回填,因其可租用本地凭据;回填分页频道历史、展开活跃线程并写入私有搜索记录。在凭据租用具备集群安全适配器前,不要将此工作移到集群 worker。相关事件包括 channel/slack.backfill.requested、channel/slack.backfill.batch.requested、channel/message.received、slack.signal.received。
公开夹具:测试与示例必须使用虚构值,如频道 lc-example-project、频道 ID CEXAMPLE、参与者 UTEAMMATE、仓库 /tmp/example-project,绝不粘贴生产 Slack 值。相关代码位于 packages/gateway/src/slack-work-request.ts、packages/gateway/src/chat-sdk-inbound/、packages/gateway/src/gateway-decision-executor.ts、packages/cli/src/commands/messages.ts、skills/slack-link/SKILL.md。
限制:运行时配置与确切频道绑定位于本公开仓库之外;本地运行时覆盖层可包含私有 ID 与频道名,但这些值不得回流到提交、测试、文档、截图或已发布产物中。