AI 编程本地与云执行边界:代码驻留、能力降级与路由凭据
“本地模式”与“企业版不训练”都不足以证明代码没有越界。本文把仓库分类、任务材料、执行位置、模型调用和残留清理绑定成可验证路由合同,并定义云能力不可用时的安全降级。
本文要点
- 主题聚焦:AI Agent、DevOps、开源
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
在笔记本上启动 Agent,不代表推理发生在本地;选择云工作区,也不代表整个 Git 历史都必须上传。编辑器扩展、语义索引、崩溃报告、模型网关和远程 shell 可能各走不同路径。只在采购表里勾选“不会训练客户数据”,无法回答某次任务实际发送了哪些文件、去往哪个区域、保存多久。开源与闭源模型选型讨论模型策略,本篇只定义代码任务的可执行数据边界。
仓库分类必须编译成执行合同
安全和工程 owner 联合发布 coding.executionBoundary.v1。合同固定 repository ID、分类 generation、允许的 execution tier、模型和区域 allowlist、可发送材料类型、派生产物规则、网络出口、身份 audience、保留期限、遥测字段及强制降级。tier 至少区分 LOCAL_ONLY、CONTROLLED_CLOUD 和 EXTERNAL_ALLOWED;未知分类默认本地只读,不自动继承相邻仓库的宽松策略。
schema: coding.executionBoundary.v1
repository: payments-core
classification: restricted-source
tier: LOCAL_ONLY
materials: [working-tree, local-symbol-index]
egress: { modelApi: deny, telemetry: aggregate-only }
fallback: local-readonly
policyGeneration: 12
分类对象不只有源码。Git 历史、未跟踪 fixture、生成代码、符号图、Embedding、终端输出、测试快照、issue 正文和 source map 都可能恢复业务信息。每种 material 带来源、敏感级别和允许转换;把源码生成向量后不能自动降为非敏感。Agent 不可信数据污点传播处理内容到工具参数的信任标签,这里的标签决定执行位置和外发资格。
VS Code Workspace Trust 说明不可信仓库中的任务、调试和扩展可能执行代码,适合做本地入口保护,但它不替代组织的数据路由。LOCAL_ONLY 还要固定本地模型制品、runner image 和禁止外网的 sandbox;CONTROLLED_CLOUD 要绑定租户、区域、短期工作负载身份、加密存储和销毁策略;外部 API 则需要明确 provider、endpoint、用途与保留证据。NIST Privacy Framework 可帮助梳理数据处理风险,真正执行仍依赖机器可读合同。
每次 route 都签发决策凭据
Agent 开工前枚举本次材料并生成 coding.executionRoute.v1:绑定 task、base/tree digest、material manifest、请求能力、选中 tier、runner/model revision、region、policy digest、expiresAt 和 routeDecisionId。文件读取代理、索引器、模型网关与遥测出口都校验同一 decision,不能让 UI 显示“本地”而索引器继续调用云 Embedding。
路由判定与工作区快照创建之间有竞态。执行器在 material manifest 冻结后获取短期 permit;permit 只允许读取列出的 blob digest,并在启动远程环境前预登记 workspace ID。后续新文件或 tree 改变使 permit 失效,必须重新决策。远程 runner 使用按任务 audience 签发的身份,AI 平台密钥轮换负责底层凭证生命周期,本合同禁止工具退回个人长期 token。
云执行结束不能只删除容器。控制面记录上传对象、索引、缓存、日志、provider request ID 和备份类别,按 owner tag 对账后签发 destruction receipt;UNKNOWN 删除进入隔离队列。SLSA provenance 的 subject/material 思路可证明 runner 和输入制品身份,但不能替供应商的删除证据。代码内容不进入普通 trace;只保留 route、大小、分类和摘要。Prompt 与 Trace 脱敏继续控制必要日志的访问和期限。
能力不足时显式降级
本地模型无法完成跨仓库重构时,安全动作不是静默切云,而是返回 CAPABILITY_UNAVAILABLE。合同可预先允许 local-readonly、只生成搜索结果、只把人工选择的最小片段送到受控云,或完全停止。每个降级都有可见的能力差异和新 route receipt;用户批准只能选择已计算的候选,不能用一次弹窗永久放宽仓库分类。编程 Agent 沙箱权限限制命令和网络,本边界再限制这些操作在哪个执行域发生。
故障测试故意通过 .git 历史、symlink、submodule、LFS、崩溃 dump、终端回显、Embedding cache 和扩展自动更新外发标记文件;再注入 region 漂移、云 endpoint DNS 误配、permit 后 tree 改变、删除回执丢失和 provider fallback。期望越界发送为 0,未知材料进入 DENY_UNKNOWN_MATERIAL,已外发但无法确认删除进入 QUARANTINED_RESIDUE,绝不能改写成本地成功。
强制门要求 material 分类覆盖率 100%、route 与实际网络目的地一致率 100%、未登记 egress 为 0、过期 permit 接受为 0、远程 owner-tag 资源对账率 100%、销毁超时均进入隔离、本地降级任务不调用外部模型。上线先 shadow 记录当前工具真实去向,再阻断 restricted 仓库的遥测,最后才强制模型路由。若误阻断超过 1%、本地 runner 不稳定或 route verifier 崩溃,就切回上一 policy generation 并停在本地只读;不得以恢复效率为由临时开放外部发送。
Related