让 Bot 改自己
在私聊里对 Bot 说「加一个 /ping 指令回 pong」或「把天气插件的默认城市改成上海」,Bot 会起草这次改动、先在沙箱里试跑,然后发一张审批卡给你。你批准一次,它自己生效——能热重载就热重载,不能就自动重启——最后回到你发起的那个会话说「已生效」或「失败,已回滚」。
设计与默认值见 ADR 0040;每一步的运行时细节见默认行为规范。
谁能让 Bot 改
- Bot 的主人(端点 owner /
trigger.masters)和 IM 审批人(开启ai.agent.toolHardGate.imApproval时approverIds里的人)。 - 其他人——群成员、群管理员、受信成员、私聊陌生人——看不到这个能力:Bot 不会替他们起草,硬要调用也会被拒并记审计。
- 同一个会话同时只有 1 个变更在等审批,整个实例最多 3 个;满了 Bot 会让你先处理掉已有的卡片。
一次改动怎么走
- 起草:Bot 把完整的文件内容和字段级配置补丁交给宿主,暂存在
.zhin/changes/。这一步不碰生产目录、不生效。 - 试跑(见下节):不通过就不会出审批卡,Bot 拿到错误后重新起草。
- 审批:审批卡总是发到主人私聊——即使你是在业务群里提的;业务群里说「同意」不算数。卡片列出改了哪些文件、各增删多少行、动了哪些配置路径、需要热重载还是重启、一段有界的 diff 摘录(最多 40 行 / 2 KB,超出注明「完整内容见 Console」),以及试跑结论(含被跳过的检查名)。没看完整内容请先去 Console「自我变更」页看完整 diff 再批,不要盲批。私聊回
/approve <卡片 id>或/deny <卡片 id>;也可以在 Console 的审批接口里批。24 小时没人批就过期。 - 生效:只需重载插件的改动直接热重载;需要重启的改动(例如改了
http、database这类宿主配置)会受控重启,重启回来再做健康检查。 - 回报:回到发起会话说「已生效」(重启过会注明);那个会话发不出去(群没了、Bot 被移出或禁言)就改发主人私聊。
批准的是这一版内容:审批绑定内容摘要,批准后内容对不上就拒绝,不会「批 A 生效 B」。
先沙箱,再发布
Bot 自己写的指令、插件代码不会直接进生产目录。提交审批前,宿主会自动:
- 静态检查:语法、约定目录文件的默认导出形状、禁止的导入写法、
SKILL.md/agent.json能否解析; - 沙箱加载:在一次性子进程里装配草稿后的插件,不连真实平台、不调模型,确认指令 / 工具能被发现;
- 插件自带测试:在断网、只读、限资源的隔离容器里跑。
本机条件不够时(例如没装 Docker、插件没有测试),对应检查记为「跳过」:不阻断提交,但审批卡的试跑结论会标出跳过了几项并列出检查名(如「通过 (2 skipped);跳过:sandbox_load commands/ping.ts,…」)。看到跳过时请多留意再批。
试跑通过、你批准一次、写入生产目录——这就是「发布」,不需要第二次审批。
出错了会怎样
- 生效后健康检查不通过:自动用快照回滚一次,回报「失败,已回滚」和原因。
- 回滚后仍不健康:打开实例级急停,只私聊主人,不再自动重启,等你处理(排查现场保留,在 Console 标记已处理后清理)。
- 配置保存或生效结果未确认、或修订已被其他修改替代:停止后续自动操作,保留现场供人工核验,不自动重试或覆盖他人的配置。此时
failed表示流程停止,不能据此断定配置未生效,也不会仅因此自动急停。重启后的恢复也要核对持久化的配置修订;旧记录缺乏归属证据时同样保留现场。 - 跨 #1146 升级:旧版本留下的
applying/verifying记录带配置补丁却没有持久化的确认修订(configRevision),无法证明归属;恢复时不续作、不回滚、不重载、不重启,记录转为failed并保留现场,等待人工核验。 - 配置回执中有分组为
restart-pending,而保存结果却表示无需重启:视为不一致,按“未确认”处理(停止并人工核验),不当作待重启。 - 记录状态与决策结果:
change_config_unconfirmed/change_config_superseded时变更记录终态为failed(已停止自动续作、需人工核验),对应决策事件的 outcome 仍为defer——结果未知、等待人工,并非error或deny。 - 生效途中进程被杀:下次启动先检查持久化进度和配置归属。已确认的操作按快照回滚再检查;写入或生效不确认时保留现场,等待人工核验。
- 批准后进程就退出了:下次启动时,批准不到 1 小时的变更照常生效;更早的作废,并私聊主人「批准已过期,请重新起草」。
需要守护进程才能自动重启
自动重启依赖 zhin start 的守护进程。没有守护进程(例如用裸 node 或某些容器入口直接跑运行时)或以 --once 启动时,Bot 会如实告诉你「本实例没法自动生效」,需要重启的变更不会提交审批;只需热重载的改动不受影响。
这些不会因为任何授权而放松
- 审批永远要本次新鲜的人工批准:
bypass、自动审核、主人身份、「记住授权」、danger-full-access都不能代批。 - Bot 能写的只有插件约定目录(
commands/、middlewares/、handlers/、tools/、components/、skills/、agents/,项目根或项目内的本地插件)、根AGENTS.md与skills/**;根配置只能改字段,不能整文件覆盖。 - 永远不能碰:
node_modules、锁文件、.env*、.zhin/等宿主文件。
配置白名单没有扩大:当前自变更工具可直接写的 Host 子路径只有 ai.trigger.ambient,默认 CLI 仍将它标记为待重启;模型的 provider/model 字段不在该工具的 Host 白名单中。可信宿主若已确认纯配置全部生效,执行器会省去多余重启,但不会放宽前置审批和无守护进程门禁。
Bot 改不了的配置
凡是会放松安全或扩大工具面的配置项,Bot 起草时直接拒绝,不会出审批卡,例如:
ai.agent下的危险工具硬闸(toolHardGate,含 IM 审批人名单)、执行审批与执行安全(execApprovalMode、execSecurity、execPreset、execAllowlist等)、主人 shell、注入防护、配额的主人豁免、定时任务安全;ai.decisions.approval、http.token/http.tokens、a2a远程执行器与回调、mcp/ai.mcpServers(新增 MCP 服务器等于新增工具)等。
完整名单见默认行为规范。这些配置请自己直接改配置文件。
在审批前看完整 diff
- Console「自我变更」页(随
zhinjs/console的 Console 版本发布;Host 侧 RPC 已在本版提供):列出待审与最近的变更;详情(需要ops:approve)给出每个文件的 unified diff(改动前是生产目录现有文件,已开始生效的取回滚快照;全部文件合计最多 64 KB,超出按行截断并标出,其余文件标「未展示」)、脱敏后的配置补丁、完整试跑检查(突出被跳过的项)与暂存区占用,可直接批准 / 驳回,急停现场可标记已处理。变更结束后正文按暂存区保留规则清理,详情会注明「正文已清理」,不会编造。 - IM 审批卡:只带一段有界摘录,不含配置值;摘录不是完整内容(#1142)。
暂不支持
- 新建插件包(新的
plugins/<名字>/package.json与入口)和自动安装 npm 依赖:不在本期,需要时请自己装好依赖、建好插件,再让 Bot 往里加指令。 - 修改 zhin 框架本身、多个变更合并批准、跨实例下发、可视化编辑器。