Assay:用内容寻址证据图约束 AI 编码智能体的声明失效
Assay: Claims That Decay With the Code. Content-Addressed Evidence Graphs for Accountable AI-Assisted Software Delivery
作者用 Assay 将代码断言绑定到依赖锥哈希;脚本评测中合并门禁阻止了9/9种对抗行为。
脚本化 doer 修改代码并提交断言,可能遗漏依赖者证据、使用过期证据、自我批准、伪造账本或削弱测试。
- 代码智能体需要定位修改位置,也需要为完成声明提供证据。作者认为,代码索引与审查流程相互分离,使后续修改是否令已有批准失效难以按依赖关系判断。
- Assay 将每条断言绑定到所覆盖模块的依赖锥哈希,共用一张图计算上下文、证据失效和变更影响范围。签名账本、独立审查及机械合并门禁负责检查证据。
- 实验没有语言模型参与。在fastapi随机编辑4个模块时,cone绑定重验证7.9%的断言(Table III);门禁拒绝9/9种脚本对抗行为,放行3/3种诚实路径(Table IV及VI-E)。
- 作者指出,依赖提取可能遗漏边,目录粒度较粗,门禁不判断证据充分性,也不强制隔离签名密钥。真实智能体的任务完成率、token成本和隐藏测试结果留待后续研究。
- 威胁模型
- 脚本化 doer 修改代码并提交断言,可能遗漏依赖者证据、使用过期证据、自我批准、伪造账本或削弱测试。Assay 在合并门禁检查证据;签名密钥须在智能体不可访问的位置。论文未采用盒模型术语。
- 基准
- ExpressFlaskGinAxumFastAPIAssaytwelve-file Python project with a real pytest suiteprivate TypeScript Electron application
- 指标
- Tokens required to orient an agentBuild time in millisecondsRe-verification costSelf hash missesGate decisionSingle-module blast radiusObligation level
Assay 将 AI 编码智能体的每条声明(测试通过、无密钥泄露、行为不变)绑定到其覆盖代码依赖锥的 Merkle 哈希,代码或其依赖一变声明即失效。在五个公开仓库上,600 token 的简报比探索式代理省 14x 至 114x,热重建比冷重建快最多 5x;锥绑定只需重验 7.9% 至 81.9% 的声明,而按模块绑定会漏掉 23% 至 68% 的应失效声明。
深度解读
这篇论文试图解决什么问题?
作者将代码定位与证据有效期统一到依赖图,避免批准记录脱离实际代码内容。
核心问题是:代码变化后,如何按依赖关系判断智能体已有的完成断言是否仍然有效。
- 场景与动机:作者认为,代码智能体既花上下文寻找代码位置,也可能在工作困难时无证据地宣称成功;这两件事都涉及仓库结构。
- 现有工具的分离:仓库地图记录当前依赖,却不记录测试何时验证过这些依赖;任务审查记录批准,却不精确关联批准所覆盖的模块。
- 核心观察:只绑定模块自身会遗漏依赖变化,绑定整个仓库又使无关编辑触发重验证。作者提出以依赖锥的内容哈希作为中间粒度。
- 威胁模型:论文未使用black-box等术语,评测对象是脚本化doer和reviewer。
- 目标与能力:doer可修改代码并提交断言;脚本场景包括缺失或过期证据、自我批准、伪造账本和削弱测试。
- 受保护流程:Assay在合并前检查覆盖范围、证据新鲜度、签名、退出码及审查状态。
- 信任条件:签名密钥须由智能体不可访问的监督执行进程持有;论文未规定攻击者对系统实现的知识范围。
- 提出的系统:Assay把内容绑定、风险分级证据要求、独立审查协议和机械门禁放在同一依赖图上;作者将其定位为不依赖模型判断的证据下限。
有哪些相关研究?
Assay结合仓库索引、Liza审查协议和内容寻址,把审查结论绑定到依赖内容。
相关工作围绕上下文压缩、智能体问责、内容寻址与论证结构组织。
上下文与代码定位
- Aider、Repomix、Stacklit——分别提供仓库地图、代码打包或结构化索引。作者沿用Stacklit的提交式索引、Merkle跳过重建和MCP接口,并指出这些地图不携带验证状态。
- SCIP、AutoCodeRover、Agentless——提供代码智能索引、结构感知检索或简化的定位流程;作者把它们归入减少智能体定位代码所需token的工作。
- Liu等(2024)——研究长上下文退化;论文将其作为压缩上下文的另一项动机。
智能体框架与问责
- MetaGPT、ChatDev、AutoGen、CrewAI——分配角色并路由消息;Spec Kit和BMAD强调显式规格产物,SWE-agent和OpenHands塑造智能体可执行的操作。
- Cemri等(2025)、Sharma等(2024)、Denison等(2024)——分别讨论多智能体失败、迎合与奖励篡改;论文借此说明结果需要独立验证。
- Liza——以职责分离、绑定审查结论、受限状态转换和黑板记录约束工作流。作者直接借用其审查协议,区别在于Assay将结论绑定到内容,而非仅按变基后重新审查处理。
内容寻址、构建与溯源
- Merkle、Nix、Bazel——提供内容寻址或缓存基础;Mokhov等(2018)的verifying traces为论文将账本视为“断言构建缓存”提供术语。
- in-toto、SLSA、Ekstazi——分别涉及供应链执行证明、溯源和回归测试选择。作者将Assay断言类比为以依赖锥为输入集的in-toto link。
- 基线方法与数据——实验比较full dump、exploration proxy、完整索引和brief,以及repo/self/cone三种绑定;使用Express、Flask、Gin、Axum、FastAPI及Assay自身,没有运行上述智能体框架作性能对照。
论证结构
- Toulmin(1958)——论文将证据、代码状态绑定及反驳分别对应论据、论证依据与反驳;绑定漂移意味着原依据失效。
作者将自身区别定位为:用同一依赖图同时服务代码上下文和审查证据,并将结论的有效期变成内容比较。
论文如何解决这个问题?
Assay以依赖锥哈希管理断言有效期,再用风险分级、签名账本和独立审查控制合并。
Assay将“代码现在是什么”与“哪些内容曾被验证”放入同一内容寻址证据图。代码变化触发哈希比较,门禁再检查相应证据是否满足要求。
依赖图与内容绑定
- 模块划分:仓库按目录及可配置深度划分模块;模块内容哈希来自排序后的路径与文件哈希。导入关系构成有向依赖图。
- 依赖锥:coneS(m)={m}∪{m′:m→∗m′}。它包含模块自身和所有可达依赖,是断言绑定所覆盖的输入内容。
- 循环处理:先把强连通分量收缩成DAG,再按逆拓扑顺序计算Merkle哈希;同一循环内的模块共享cone hash。
- 形式化结论:作者在忽略哈希碰撞的条件下给出可靠性、最小性及影响范围与失效前沿相同的命题;依赖提取遗漏对实际实现的影响另列为局限。
断言与风险分级证据
- 断言记录:每条claim包含谓词、非空主体模块集、cone/self/repo作用域、绑定哈希、证据、证明者及时间。证据包括执行命令、退出码、输出哈希、大小、耗时和可识别的测试数量。
- 新鲜度:fresh(c,S′)⟺∀ s∈ Sc, β(s)=ĥS′(s)。新鲜意味着每个主体的当前依赖锥哈希仍与取证时相同。
- 风险输入:风险评分结合过去90天提交次数和fan-in,分别在20次提交和fan-in为10时饱和,各占一半;证据等级还考虑影响范围比例、绝对大小及范围内最大风险。
- 四级要求:L0要求变更模块测试,L1扩展至整个影响范围;L2增加变更模块lint、secrets scan及对抗审查;L3增加human-approved。无测试运行器的语言改用build和typecheck,阈值可按仓库覆盖。
独立审查与账本
- 职责分离:doer、reviewer、human均可证明;只有reviewer和human可出具审查结论,且不得批准自己的断言。human证明不再要求另一名reviewer。
- 争议流程:reviewer可接受、提出finding、驳回或升级;证明者须回应finding,争辩时须说明所要求修改会造成的具体损害。三次counter自动升级,仅human可解决。
- 状态计算:状态由账本历史推导,不直接存储;过期断言不能接受,refuted和superseded为终止状态,失败执行也保留为证据。
- 签名与追加:JSON-lines账本只追加,每行使用HMAC-SHA256签名。作者描述由监督执行进程保管密钥、智能体不可见的部署方式。
机械门禁
- 判定输入:门禁从索引、账本和变更模块计算证据义务,为每个所需谓词与模块组合寻找可用断言;所有组合合格且签名通过才放行。
- 证据合理性:测试命令须匹配主体语言的测试运行器并产生输出;重叠主体的测试数量不得低于此前证据,除非有覆盖该主体的新鲜human-approved断言。
- 证据单调性:测试数量检查用于约束删除测试后仍宣称通过的行为。作者明确说它是下限,不判断测试套件是否充分。
实现与上下文接口
- 索引器:Python使用标准库AST,其他支持语言使用保守正则提取导入与导出;按文件大小和修改时间缓存哈希与解析结果,再重算依赖图和活动信息。
- brief与接口:默认600-token brief包含仓库结构、变更影响范围、证据义务和审查状态。实现提供CLI、git hooks和MCP server;论文报告2,313行Python、无运行时依赖及30个测试。
论文做了哪些实验?
五组实验没有模型参与,测量上下文成本、重建、证据失效、门禁和变更影响范围。
实验检验的是Assay的机械行为与成本,没有测量真实语言模型智能体的任务表现。
实验设置
- 被测对象:Assay索引、绑定策略及门禁;没有运行语言模型,也没有LLM裁判。
- 仓库数据:Express、Flask、Gin、Axum、FastAPI均为含90天历史的浅克隆,另加Assay自身;Table I列出的模块数依次为35、16、7、90、195和5。
- 上下文对照:full dump、目录列表加10个最常被导入文件的exploration proxy、完整索引、modules section和默认预算brief;统一用tiktoken/cl100k_base计数。
- 绑定对照:repo hash、self hash、cone hash;每模块一条断言,编辑模块数取1、2、4、8、16、32,每个可用条件抽取100组随机集合。
- 门禁场景:含真实pytest套件的12文件Python项目,每种脚本场景从干净副本开始;脚本doer和reviewer行动后由门禁判定。论文未报告这些场景或计时实验的重复次数。
- 指标与补充运行:报告token数、毫秒耗时、重验证比例、应失效却保持新鲜的比例、PASS/FAIL和影响范围。另在私有TypeScript Electron应用完成一次真实变更、独立审查及门禁放行。
主结果
据Table III,以下均为随机编辑4个模块、每条件100组集合;最后一列的分母是依赖语义要求失效的断言。
表格较宽,可左右滑动
仓库 Repo重验证 Cone重验证 Self重验证 Self漏失效 express 100% 16.6% 11.4% 27.8% flask 100% 66.7% 25.0% 45.7% gin 100% 81.9% 57.1% 29.3% axum 100% 66.3% 4.4% 67.6% fastapi 100% 7.9% 2.1% 22.7% assay 100% 87.4% 80.0% 7.4% - 作者的解释:作者将仓库间差异归于依赖结构,描述FastAPI较宽浅、Axum workspace crates形成较深链条。
- 图与文本边界:Figure 4的图例为repo、cone、self及self漏失效,横轴为edited modules k,纵轴为claims re-verified。当前文本无法读取曲线位置,具体比较采用Table III。
- 概括的精度:正文把外部仓库self漏失效概括为23%至68%;上表保留表格原数,未采用该取整区间。
上下文成本与增量索引
- 默认brief成本:Table I中express、flask、gin、axum、fastapi分别为635、595、592、621、599 token;exploration/brief的Gain分别为28×、78×、14×、73×、114×。这些是文本代理成本,不是真实智能体用量。
- 暖重建:Table II中fastapi共1142文件,cold、单文件编辑、无变化构建分别为508、106、93 ms;对应Gain为4.8×和5.4×。作者报告单文件编辑仅重解析该文件。
- 取表格为准:正文将无变化暖重建概括为2×至5×;Table II中express为1.9×、gin为1.7×、axum为1.8×,fastapi为5.4×,不宜把正文范围当作精确表格结论。
脚本对抗行为与诚实路径
- 总体判定:Table IV及VI-E报告9/9种对抗行为被拒绝、3/3种诚实路径被放行;这些是场景数量,论文未报告多次随机运行的成功率。
- 拒绝机制:覆盖缺失及遗漏依赖者由coverage拦截;过期、自我批准、伪造账本分别由freshness、separation、signature处理;其余对应退出码、plausibility、monotonicity和review。
- 诚实与升级路径:叶模块L1编辑、含额外证据及人工签署的hub模块L3编辑通过;三轮争议升级的场景在human解决后通过,作者报告升级未解决时被阻止。
单模块变更影响范围
- 分布差异:Table V中fastapi影响范围中位数为0.5%、p90为1.0%;axum为1.1%和91.1%;gin为57.1%和71.4%。作者将Axum的尾部分布归于少数hub。
- 证据等级数量:Table V中fastapi的L0/L1/L2/L3模块数为149/38/0/8,axum为66/0/0/24,gin为1/1/1/4;作者认为证据义务应随影响范围分配。
- 示意图边界:Figure 1描述编辑core后app断言过期而util断言保持新鲜;Figure 2描述断言生命周期。它们是设计示意,不是独立实验结果。
其他消融与分析
- Assay自身上下文:Table I中brief为434 token,exploration为24,430 token,Gain为56×。
- 其他仓库重建:Table II单文件编辑Gain:express 1.9×、flask 3.0×、gin 1.7×、axum 1.6×、assay 1.8×。
- 假想FastAPI编辑:Figure 3文本列出影响范围177/195模块(91%)、最大风险1.00及L3;这是brief示例。
- 私有应用运行:VI-A报告一次真实变更暴露两个证据义务缺陷,已在发布版本修复;未报告该运行的耗时或token成本。
有什么可以进一步探索的点?
作者把依赖解析、证据充分性、密钥隔离和真实模型参与列为后续重点。
作者明确将依赖图准确性、证据充分性和真实智能体效果留作后续工作。
作者指出的局限与后续方向
- 解析与粒度:VIII指出正则提取是实现不可靠性的主要来源,拟用tree-sitter或权威依赖来源替换并报告边召回率;目录粒度较粗,可扩展到文件,符号级需要真实调用图。
- 证据充分性:VIII指出门禁只检查合理性;后续考虑变更行覆盖率差值和逐测试身份,后者可使单调性检查精确化。
- 密钥位置:VIII指出系统依赖签名密钥位于智能体不可访问的位置,但只描述部署方式,没有强制执行隔离。
- 应用扩展:VIII提出将绑定扩展至文档、lockfile、基础设施计划和monorepo联邦,并按断言与影响范围组织pull request。
- 模型参与研究:VIII计划在类似SWE-bench Verified的基准比较有无brief及gate的条件,测完成率、到正确补丁和门禁通过的token,以及隐藏测试失败补丁的拦截率;作者称已设计并计划预注册。
- 评测有效性:VI-G指出exploration是行为代理、条件共用一个tokenizer,且E4场景由门禁设计者编写,因此需要独立红队;风险及义务阈值属于政策选择。
实验覆盖范围
- 机械实验:VI报告五组无模型参与的脚本实验,覆盖五个公开仓库及Assay自身;模型任务完成率不属于本次结果。
- 随机集合规模:E3每个编辑数量条件使用100组随机模块集合;Table III展示编辑4模块的结果。
- 门禁样本:E4包含12种脚本场景,其中9种对抗行为、3种诚实路径,均在同一个12文件Python项目上运行。
- 实际变更运行:VI-A另报告私有TypeScript Electron应用的一次变更,使用项目自己的typecheck和build命令。
- 未报告信息:论文未报告依赖边召回率、计时及门禁场景的重复次数,也未提供真实模型参与实验的结果。
总结一下论文的主要内容
Assay提供随依赖内容失效的证据管理;现有证据来自机械实验,真实智能体效果待测。
Assay是一套面向AI辅助软件交付的内容寻址证据系统,关注代码改变后,测试通过、无秘密或行为保持等断言还能否用于批准合并。
- 问题定位:作者认为,代码地图与审查记录分别描述当前结构和过去验证,却没有共享精确的内容绑定,因而难以区分无关修改和令批准失效的依赖修改。
- 设计要点:系统用依赖锥Merkle哈希绑定断言,再以风险分级确定证据义务;追加式签名账本、独立审查与机械门禁检查新鲜度、覆盖和证据合理性。
- 重验证结果:随机编辑4模块时,fastapi的cone重验证比例为7.9%,repo为100%;axum的self绑定遗漏67.6%的必要失效(Table III)。
- 成本结果:fastapi默认brief为599 token,exploration代理为68,215 token(Table I);1142文件上的单文件编辑后暖构建为106 ms,cold为508 ms(Table II)。
- 门禁结果:脚本评测拒绝9/9种对抗行为,放行3/3种诚实路径,包括人工解决升级后的路径(Table IV及VI-E);没有语言模型参与。
- 结论边界:作者主张断言应随代码依赖内容变化而失效,同时明确门禁不保证证据充分。依赖提取、密钥隔离及真实智能体完成率仍是作者列出的后续方向。