#AI Agent#DevOps#开源

AI 编程工具退出演练:规则、任务状态与审计证据的可移植性

能导出聊天 JSON 不等于能离开一款编程工具。本文定义内容寻址的退出包,覆盖仓库规则、任务检查点、审批、工具配置和审计回执,并用替代工具冷启动证明迁移与撤权真正完成。

本文要点

  • 主题聚焦:AI Agent、DevOps、开源
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年6月26日·更新于 2026年7月20日

厂商提供“导出会话”按钮,团队仍可能无法退出:仓库指令只存在云端,审批与实际执行没有关联,未完成任务缺少工作树,MCP 配置含供应商私有 ID,历史索引无法重建,旧 GitHub App 还保留写权限。采购时只比较生成质量,会把迁移成本推迟到涨价、事故或合规期限到来时才暴露。AI 编程工具横评回答日常能力差异,本篇把退出演练作为选型的硬门。

先列出必须带走和必须留下的对象

组织发布 coding.toolExitScope.v1,枚举 tenant、repository、用户与时间范围,以及每类对象的迁移、归档或销毁政策。对象至少包括仓库规则、Prompt 模板、工具/schema 配置、权限 policy、任务与 attempt、人工审批、补丁和 worktree checkpoint、命令回执、评测结果、模型/成本摘要、记忆与索引生成配置、例外、tombstone 和外部 integration。

原始模型思考、供应商安全检测细节或第三方受限制内容可能依法不能导出,必须以明确 NON_EXPORTABLE 类型、理由和替代证据出现,不能静默缺席。凭证值永不进入退出包,只保留 secret reference、用途和撤销状态。个人数据按当前同意与保留策略过滤;已删除对象输出 tombstone,防止新系统从旧备份重新导入。AI 应用数据隐私给一般生命周期要求,这里把它落实到工具迁移清单。

exitPackage.v1 必须自描述

导出器生成 coding.toolExitPackage.v1,固定 scope digest、vendor tenant、cutoff/watermark、schema 版本、对象计数、每类 manifest、blob 摘要、关系边、redaction policy、缺失项和签名。所有 ID 使用包内稳定 namespace,并保留原 ID 的受限映射;时间带时区和 clock 语义。W3C PROV 的 entity/activity/agent 可表达任务、执行、补丁和 reviewer 关系,但包还要定义每个业务状态的精确枚举。

yaml
schema: coding.toolExitPackage.v1
scope: sha256:31d...
watermark: event:018f...
objects: { rules: 42, tasks: 318, receipts: 1904, tombstones: 27 }
blobs: cas-manifest@sha256:91a...
missing: [{ type: model-reasoning, reason: non-exportable }]

Git commit 和可达对象可用 Git bundle 携带,但脏工作树、未跟踪 fixture 和 LFS 需要独立清单。编程 Agent 到开发者接管检查点定义单任务 handoff;退出包聚合整个工具租户,引用每个 checkpoint digest 而不重新解释完成度。命令事实引用可核验 Transcript,避免把可编辑聊天文字冒充审计。

导出采用冻结水位而非停机复制。先记录 cutoff,导出水位前对象;期间的新事件进入增量段,最终短暂冻结写入并 CAS 封口。中断后按对象 ID 和 digest 续传,不能重新编号。包在隔离环境用 reference reader 解码,未知必填类型使整个相关任务为 UNSUPPORTED,不能丢字段后标记成功。

可解析不等于可继续工作

演练至少有两层。第一层由组织维护的中立 reader 重算对象计数、关系完整性、摘要、状态机和 tombstone;第二层把包导入另一候选工具,在无原供应商 API 的环境冷启动。选定任务必须恢复仓库规则、只读上下文、未决问题和允许的下一步;历史审批只能用于展示,不能被新工具当成新的执行授权。

语义 conformance 用固定问题验证:哪些任务仍未完成、某补丁依据哪个 base tree、谁批准了哪组参数、哪些命令真实终止、哪个工具权限已撤销。搜索结果与旧 UI 无需像素一致,但答案必须引用同一 evidence digest。OpenTelemetry trace ID 只作为关联材料,不能要求新工具访问旧供应商 trace 后端。索引只迁移生成 recipe 和 source watermark,默认由新栈重建,避免携带不可解释的向量。

切换合同固定为 EXPORTING -> IMPORT_VALIDATED -> WRITE_FROZEN -> NEW_ACTIVE -> REVOCATION_PENDING -> REVOCATION_COMMITTED -> EXIT_COMPLETE。原工具的后台 job 在 WRITE_FROZEN 前 drain,之后迟到评论和 push 由 repository-side fence 拒绝;旧凭证先降为短期、最小权限租约,仍不立即撤销,以保留不可逆点之前的受控回退。新工具通过观察窗后才撤销 OAuth/GitHub App、API key、webhook、SCIM、机器人账号和云 workspace,并逐项记录 provider receipt。Agent 短期能力租约可缩短残留授权窗口,但不能代替撤销对账。

用故意残缺的包攻击演练

故障套件删除隐藏仓库规则、截断 blob、交换 tenant ID、重复审批、丢失 tombstone、制造水位后的迟到 task、放入未知必填 enum、让 LFS 对象不可达、篡改时区、在 export seal 后改写源对象,并让旧 webhook 在撤权后发送事件。系统必须报具体缺口,不能用“99% 对象已导出”掩盖关键规则或授权仍活跃。

退出门要求 scope 内对象计数与源快照逐类守恒、blob 摘要错误为 0、必填关系悬空为 0、删除对象复活为 0、代表任务冷启动恢复率 100%、证据问题回答一致率 100%、未撤销 integration 为 0。任何 UNKNOWN 撤权都使状态保持 EXIT_INCOMPLETE;owner 和截止时间只用于跟踪,repository fence 必须继续阻断旧身份,不能把未知项算通过。演练每半年以及重大采购续约前运行;包与 reader 使用当前和前一版本互测。

迁移先复制只读规则和已关闭任务,再迁移未完成低风险任务,最后切换写入口。在 REVOCATION_COMMITTED 前,若 evidence 丢失或替代工具误用旧审批,可把入口 CAS 回仍受 fence 管理的旧工具,并保持新增任务冻结。任何凭证撤销一旦被 provider 接受就越过不可逆点:此后失败只能 fail-forward 到人工/只读路径,或经新审批签发限时凭证,不能把旧凭证复活成“回滚”。真正完成后仍保留最小签名清单和销毁回执。这样退出能力成为持续验证的工程属性,而不是合同附件里无法演练的一句话。

Related

相关推荐