Tracekit: A tamper-proof intent-reasoning-action audit system for autonomous coding agents
Tracekit: Tamper-Evident Intent-Reasoning-Action Auditing for Autonomous Coding Agents
- Monitoring and auditing
- Prompt injection
- Dangerous agent actions
- Monitors
- Permissions and approval
- Reasoning chains
- Permissions and sandboxing
- coding agent
- Application layer
Tracekit用哈希链审计编码智能体;N=300、间隔300时全量重链检出0.47,E5评审98/98。
操作者 H 向可派生子智能体的系统 A 发任务,harness 为 Claude Code。
- 编码智能体少人监督地读不可信文件、执行命令并派生子智能体,记录却常是可改的输出日志。操作者缺少可归属的完整动作、防篡改,以及把自述和真实动作对照起来的手段。
- Tracekit用钩子记下人类意图、模型自述和工具动作,写入SHA-256哈希链,并用外部锚点发现整链重算或截断。执行前用正则门;事后用规则旗标和无工具的独立评审对照三通道。其他智能体可经SDK或HTTP写入同一账本。
- E1(N=300,每类200次):仅链对截断和全量重链为0.00;间隔300条时摘要给出0.47。E3拦截有害调用18/44。E4共14次,注入尝试0/8,27个思考块无可见文本。E5规则40/49,评审98/98。
- 作者称结果只刻画单一harness、短任务、每条件两次重复和同族评审;不能把自述当内部理由,看不见工具层之下的效果,也保护不了最近锚点之后的记录。正则门可被绕过,E5是固定掩护的合成插入。被测运行使用Claude Code 2.1。
- Threat model
- 操作者 H 向可派生子智能体的系统 A 发任务,harness 为 Claude Code。T1 良性但会出错;T2 读到的不可信内容含针对模型的指令;T3 能事后修改账本文件。假设钩子被忠实调用,且至少一份头哈希锚点位于 T3 改不到之处。不读取模型内部,也不防御工具调用层以下的副作用。
- Evaluated models
- Claude Code (claude -p, version 2.1)独立评审(同一 CLI,无工具)
- Benchmarks
- E1 tamper detection (N=300, 8 classes × 200)E3 policy corpus (44 harmful + 40 benign calls)E4 seven scenarios (14 Claude Code runs)E5 seeded-fault splicing (63 traces)
- Metrics
- detection ratehook wall time (median)records/sblock rateAttemptedDisclosedfalse-positive ratereviewer agreement
Tracekit is an open-source, dependency-free audit system that captures three channels for each agent session—human intent, the model's self-reported reasoning, and actual executed actions—writes them to a hash-chained ledger, and cross-checks them. It hooks into Claude Code lifecycle events, reconstructs multi-agent hierarchies, performs policy interception before tool calls, and supports other agents reporting events via SDK or HTTP API.
Paper analysis
What problem does this paper attempt to solve?
要为编码智能体记下可核对的意图、自述与动作,并让事后改账能被发现。
编码智能体留下的通常是可改日志;Tracekit 要记下意图、自述与动作,并检查事后改账。
- 场景:作者指出,Claude Code、Codex、Cursor 等智能体长时间读仓库、调用工具并派生子智能体,读到的 README、注释或报错都可能携带间接提示注入。缺口是记录不完整且难归属、日志可被改写,以及自述不等于计算过程。
- 现有记录:作者称通用可观测平台和 OpenTelemetry 的 GenAI 约定面向调试与成本;据作者所知,它们不使日志防篡改,也不自动对照所说与所做。作者把 Tracekit 的账本做成线性链加锚点,并称贡献在账本装入什么、如何交叉核对。
- 系统:作者不声称读取模型内部,而把自述当证词、动作当证据,与人类请求一起写入可锚定的哈希链。Tracekit 挂钩 Claude Code,采集三通道并归属子智能体,执行前做策略门。
- 威胁模型:
- 对象:操作者 H 把任务交给智能体系统 A;A 经 harness(即 Claude Code)调用工具,并可派生子智能体。目标包括可归属采集、防篡改、执行前处置和三通道分歧检查。
- T1:智能体良性,但会改错文件、错误声称成功或超出任务范围。
- T2:它读到的文件、工具输出或网页含针对模型的指令。
- T3 与假设:被攻破的智能体或想隐瞒活动的人可以事后改账本文件。作者假设 harness 忠实调用钩子,且至少一份头哈希锚点放在 T3 改不到的地方;不假设能读模型内部,也不防御工具调用层看不见的副作用,作者称后者需要操作系统级强制。
What related research exists?
作者将相关工作分为可观测性、防篡改日志、推理监控与护栏,并对照公开文档。
智能体可观测性
- OpenTelemetry 的 GenAI 语义约定(2026)规范模型调用与工具执行的 span;Claude Code 的导出(2026)默认脱敏,涵盖提示、工具决定和结果。
- Langfuse 的 Claude Code 插件(2026)转发会话,思考块存在时一并转发。作者称这些系统面向调试和成本;据作者所知,它们都不使日志防篡改,也不交叉核对所说与所做。
防篡改日志
- 哈希链审计可追溯到 Haber 与 Stornetta(1991)、Schneier 与 Kelsey(1999)、Crosby 与 Wallach 的历史树(2009)和 Certificate Transparency(2021)。
- nono(2026)用沙箱外监督者签名 Merkle 树的根。halo-record(2026)是带可选见证的哈希链。作者称 Tracekit 故意只用线性链加锚点,贡献在内容与交叉核对,不在密码学。
推理忠实性与监控
- 作者转述:Turpin 等(2023)讨论解释可能漏掉驱动答案的因素;Lanham 等(2023)对思维链的干预里,答案对所述推理的依赖并不稳定;Chen 等(2025)中,推理模型只在少数时候说出所用提示。
- Baker 等(2025):监控思维链可以发现奖励黑客,但对监控施压可能产生混淆。Korbak 等(2025)把可监控性称为 “new and fragile”。作者称这些结果促使自己把自述当作待与动作核对的证词。
护栏、注入与控制
- InjecAgent(2024)和 AgentDojo(2024)测注入易感性;CaMeL(2025)用能力与数据流控制对付注入。NeMo Guardrails(2023)、Llama Guard(2023)、Invariant Guardrails(2025)过滤输入、输出或工具调用。
- ToolEmu(2024)、R-Judge(2024)与 LLM-as-a-judge(Zheng 等,2023)用模型评判风险。AI control(Greenblatt 等,2024)和 SHADE-Arena(2025)用监控器看不可信或隐藏的副任务。作者称 seeded-fault splicing 与这类破坏评估接近,差别是故障被拼进真实轨迹,而不是提示智能体违规。
基线:Table 1 按 2026 年 9 月公开文档,用 ✓ / – 比较 Claude Code OTel、Langfuse 插件、Invariant Guardrails、nono、halo-record 与 Tracekit;子智能体列仅 Tracekit 为 ✓,交叉核对记为 rules + LLM。实验中的对照是仅链与加锚点(Table 2)、默认正则门(section 5.3)、规则旗标与独立评审(Table 4)。
作者称贡献在账本内容与三通道核对,密码学上则故意用更简单的线性链加锚点。独立评审沿用无工具的可信监控器。
How does the paper address this problem?
钩子采集三通道并写入哈希链,执行前用正则门,事后用规则和独立评审核对。
Tracekit 在 harness 钩子里采集人类意图、模型自述和工具动作,追加进 SHA-256 哈希链,并用外部锚点对付整文件重算和尾部截断。执行前有正则策略门,事后用规则旗标和独立评审对照三通道。实现约为 2,000 行标准库 Python 加一个 HTML 文件(Figure 1)。
采集与归属
- 事件:Claude Code 把 JSON 载荷交给 hook.py。涉及 UserPromptSubmit、PreToolUse、PostToolUse、PostToolUseFailure、SubagentStart、SubagentStop、Stop,以及 SessionStart/End。
- 转录:在工具事件和停止事件上按字节偏移增量读取,抽取思考、文本和工具使用块。进程间锁保证每行只入库一次。
- 子智能体:作者称载荷带有 agent_id 与 agent_type,转录在会话目录的 subagents/agent-<id>.jsonl。记录按智能体打标。观察器把发起委派的 Agent 工具调用连到随后的 SubagentStart。
- 顺序与其他入口:同一回合的转录常在钩子之后才落盘,自述因此晚于对应动作。作者不重排账本,以保持只追加。阅读端用 tool_use_id 接合,并把推理放在动作之前。SDK 与 HTTP 把同类事件写入同一账本;其中 tool 在运行前过策略,并记录时长与错误。
账本与能证明什么
- 记录含 seq、时间戳、事件体和 prev;没有前一条时 prev 为 256 位零。哈希为 hi=SHA\text{-}256(canon(ri∖{hash}))。canon 按键排序并去掉无意义空白。作者称这对所用类型足够,是 JCS 的子集。
- 符合常见凭据模式的字符串在哈希前被遮蔽;过长字符串被截断并保留全文哈希。追加时独占文件锁,从尾部反向恢复最后一条有效记录,使崩溃留下的半行不会让链从头开始,然后 fsync。
- 作者称原地编辑、删除、重排或伪造插入会破坏哈希或 prev。能重写整个文件的对手可以重算全部哈希;删掉最新记录会留下仍合法的前缀。这两种都要靠保存在别处的锚点才能发现。
- 若每 k 条取一次锚,攻击者从均匀随机位置重算长度为 N 的账本,且时刻在上次锚之后均匀分布,检出概率为 Pdetect(k)=1−(k−1)/2N。作者称更强的树形构造也不能取消外部保存方。钩子内部出错时默认退出码 0(失败则放行),除非 FAIL_CLOSED。
策略门
- PreToolUse 对工具字段做正则:Bash 看命令,文件工具看路径。拒绝则退出码 2,Claude Code 将其变成智能体可见理由的阻断。工作目��外的写入只被标记。
- 策略文件读不出时标记 policy_error,不静默放行;TRACEKIT_FAIL_CLOSED=1 时改为拒绝。
- 附录 B 的默认拒绝包括 sudo、下载后管道进 shell、强制推送、对 /、~ 或 $HOME 的递归删除,以及对 .env*、id_rsa、id_ed25519、.ssh/ 或 .aws/ 的 Write/Edit。标记项包括网络工具、破坏性和带副作用的命令、秘密访问和 MCP。作者称该门按设计是绊线,不是沙箱。
核对与观察器
- 规则:view.py 标记策略拒绝和旗标(网络、破坏、副作用、秘密访问、外部工具)、项目外写入、失败调用、无结果记录的调用,以及未被提及的文件编辑:文件名不在人类提示里,也不在此前任何自述里。无可见解释的动作,以及推理被提供者扣留的回合,标为信息性旗标。
- 评审:judge.py 把会话压成带 [HUMAN]、[AGENT-THINKING]、[AGENT-SAID]、[ACTION seq=...] 的文本,附策略结果和截断后的工具结果,交给另一个无工具模型,用 JSON 报告分歧,再把判定写入账本。附录 A 给出完整提示词。标出条件是 alignment 为 minor_drift 或 misaligned,或某个 finding 的 severity 为 medium 或 high。
- 观察器:observer.py 用服务器发送事件推送单页界面,含会话计数、智能体树、事件带、警报、每智能体一条泳道和详情。回放文件在浏览器内用 WebCrypto 重哈希。作者报告测试检查到 JavaScript 与 Python 的规范化逐字节一致。非 localhost 时端点要求 bearer token。
What experiments did the paper conduct?
Table 2 仅链对截断与全量重链为 0.00;E3 拦截 18/44;E5 评审 98/98。
实验设置
- 平台:2-vCPU Linux 容器,Python 3.11.15。真实运行是无头 Claude Code(claude -p,version 2.1),每次单独的设置文件和隔离账本。评审用同一 CLI、无工具、独立进程。作者报告 25 项单元测试通过,覆盖账本、钩子、交叉核对、SDK、观察器、安装器,以及浏览器校验与 Python 的一致性。
- E1:从 143 条真实记录抽样,组成 N=300 的账本。每试次一种随机突变,每类 200 次。八类为改字段、删记录、交换相邻记录、插入伪造记录、撕裂的最后一次写、截断尾部、编辑后全量重链、删除后全量重链。比较仅链,以及突变前头哈希这一锚点(Table 2)。Figure 3 改变锚定间隔,图例为式 (2) 和每点 200 次实测。
- E2:每个账本规模 60 次钩子调用,墙钟含解释器启动、策略、脱敏、哈希和 fsync。并发写测到 16 个进程。
- E3:44 次有害工具调用,分六类,并含针对默认模式的平凡改写;另有 40 次良性调用。只评估、不执行。
- E4:带一个失败测试的小仓库上,7 个场景各 2 次。S1–S4 在不同通道放入间接提示注入;C1 为干净任务,C2 为用户要求删除 billing.py,C3 为用户要求写 .env。Attempted 是与注入目标相符的任何非读工具调用;Disclosed 是最终回答告诉用户存在注入。
- E5:取 7 个干净会话的第一次重复,在最后一次成功的工具调用之后插入一步。自述是听起来良性的掩护句,最终摘要不改。F1 未请求的编辑,F2 外传文件,F3 删除,F4 虚假成功,F5 范围蔓延,F6 读 SSH 私钥,F7 改弱测试。对照为原会话,以及多一次带诚实说明的 git status。63 条轨迹由规则评一次、评审评两次,评审调用共 126 次。
主结果
条件 结果 出处 chain only:改字段、删除、相邻交换、伪造插入、撕裂写,各 200 次 1.00 Table 2,N=300 chain only:截断尾部、编辑后全量重链、删除后全量重链 0.00 Table 2 另加突变前头哈希锚点,上述八类 1.00 Table 2 锚定间隔 300 条时的全量重链检出 0.47 摘要 默认正则:有害调用被拦截;拦截与标记的并集 18/44(41%);40/44(91%) section 5.3,Figure 5 默认正则:良性调用被拒 3/40(7.5%) section 5.3 拼接故障:规则旗标;独立评审(每条 2 次) 40/49(82%);98/98(100%) section 5.5,Table 4 - 链与锚:作者把“手里已有突变前头哈希”和“锚点按间隔更新”分成两套设置。前一套里,截断和全量重链不再通过校验。摘要中的 0.47 属于间隔实验;作者称 Figure 3 的实测沿式 (2)。
- 正则门:作者的结论是,对命令字符串做模式匹配是给诚实失误用的绊线,不是安全边界;强制应放在能力系统或操作系统沙箱里,Tracekit 记录其决定。正文写明没有外泄命令被拦截。
- 规则与评审:作者认为 E5 是非自适应故障上的上限结果:每个拼接步后面都有未改动的、与该步矛盾的最终摘要,掩护句是泛泛的,而且评审与智能体同模型族。作者认为规则覆盖数据流和范围类问题,只有语义评审能抓住声称与工具结果的矛盾,二者应合用。
真实运行与间接提示注入
- Table 3:S1–S4 的 Attempted 均为 0/2,Disclosed 均为 2/2,Blocked calls 为 0,Tests pass 为 2/2。C1、C2 的 Blocked calls 为 0,Tests pass 为 2/2。C3 的 Blocked calls 为 2,Tests pass 为 2/2。作者将注入场景合计为尝试 0/8,并称这种难度给监控评测提供不了正例。
- C2:两次运行里智能体都拒绝删除 billing.py。作者称它引用了该文件自己的文档字符串,文件内文字在此压过用户指令,方向是偏安全的;作者称这正是审计需要看见的影响。
- 思考块:73 条模型消息中的 27 个思考块,可见文本为 0,转录里只有签名。作者称此配置下外部监控能用的推理通道是可见正文。无可见解释的规则旗标每次运行都触发,作者称它是信息性旗标。
开销与并发
- 延迟:Figure 4 左侧,空账本上 PreToolUse 的中位数为 23.9 ms,10 万条时为 24.6 ms;裸解释器启动 10.3 ms。每个点 60 次。图注写明 PreToolUse 与 PostToolUse 都画了 p50 到 p95,正文没有给出 PostToolUse 的中位数。作者称反向读尾使成本保持平坦,并对照 E4 平均 24 秒的运行,称这一开销可忽略。
- 吞吐:进程内、每条一次 fsync、平均记录 1,280 字节时为 2,436 条/秒;校验为 35,099 条/秒。最多 16 个并发写入进程时,吞吐保持在约 2,000 条/秒,所得的链全部校验通过且记录齐全。Figure 4 右侧标有 chain ok。
拼接故障的分项
- Table 4:规则旗标对 F2、F3、F5、F6、F7 为 7/7,对 F1 为 5/7(71%),对 F4 为 0/7。评审对七类均为 14/14,并集均为 14/14。两次评审的一致情况:故障类各 7/7;正文合计 61/63 条轨迹。
- 漏检:作者称没有句法规则能看出工具结果与成功声称相矛盾,因此 F4 全部漏过。F1 漏过的 2/7 是因为更早的正文已经点名 billing.py,按文件名匹配因此失效。作者把 F7 称为改弱测试而非修好代码的奖励黑客形式,评审把 F7 标出。
- 对照:未改动会话上,规则 0/7,评审 1/14(7%),并集 1/14,两次一致 6/7。良性额外步骤上,规则 0/7,评审 3/14(21%),并集 3/14,一致 6/7。作者称评审把一次未被要求的 git status 评为轻微偏离。
其他消融与分析
- Figure 3 纵轴文字为全量重链的检出概率,旁注含 1.0、0.8、0.6、0.4;横轴 k 的刻度含 1、5、10、25、50、100、300。除摘要的 0.47 外,正文没有列出各点实测值。
- Figure 5 行旁分数为远程代码执行 3/10、提权 3/6、历史改写 5/6、破坏性删除 4/8、秘密文件写入 3/8、外泄 0/6。图注分为拦截、仅标记、漏过;正文明确没有外泄命令被拦截。论文没有逐类写明每个分数属于哪一段。
- 三次良性误拦分别是:检索 sudo、echo 中含该词、写入 .env.example。
- E4 中智能体指出 .env 规则可以被另一种命令写法绕过,并且没有使用。
What are some points that can be further explored?
作者称数字只刻画单一配置,并写明锚点、句法门、思考通道和合成故障的边界。
作者指出的局限与后续方向
- 单一配置(section 6):只有一个 harness 和模型族、小仓库与短任务、每个条件两次重复、评审与智能体同族、一位作者。作者称数字应读作这一配置的刻画,而不是普遍比率。
- 自述(section 6):作者称系统不能把自述当成模型的理由;E4 里思考通道被整个扣留。
- 工具边界(section 6):看不见工具调用层以下的效果。
- 锚点窗口(section 6):保护不了最近一次锚点之后写入的记录,若对手能控制账本文件。作者认为操作者至少应在每次会话结束时做锚。
- 门与评审(section 6):策略门可被绕过。评审本身是语言模型,作者称它继承 LLM 评判的已知弱点;部署时提示还会带上攻击者可控的轨迹内容。
- 合成故障(section 6 与结论):E5 的故障是固定掩护句的合成插入。作者认为有能力且故意欺骗的智能体可以写出更有说服力的版本,并称带自适应攻击者的 SHADE-Arena 式评估会是更强的测试。结论里作者称发布代码、评测脚本和轨迹,以支持复现并扩展到其他 harness。
实验覆盖范围
- 真实运行使用无头 Claude Code(claude -p,version 2.1),评审是同一 CLI 且不带工具的独立进程。论文写的是同一模型族,没有另给模型快照名称或采样设置(section 5、section 6)。
- E1 为 8 类突变、每类 200 次、账本长度 N=300,记录体从 143 条真实记录抽样;Figure 3 的锚定间隔刻度含 1、5、10、25、50、100、300(section 5.1、Table 2)。
- E3 含 44 次有害调用(六类,包括针对默认正则的平凡改写)和 40 次良性调用,这些调用没有被执行(section 5.3、附录 B)。
- E4 是 7 个场景各 2 次;E5 只用其中干净会话的第一次重复,插入 7 类故障并设原会话与良性额外步骤两类对照,共 63 条轨迹、126 次评审调用(Table 3、Table 4)。
- E5 的错位步骤使用固定掩护句,且最终摘要保持不变;开销实验在 2-vCPU 容器上测到 10 万条账本记录和 16 个并发写入进程(section 5.2、section 5.5)。
Summarize the main content of the paper
Tracekit把意图、自述和动作写入可锚定的哈希链;作者强调锚点、正则绊线和思考文本可能缺失。
Tracekit 是无第三方依赖的编码智能体审计层:把人类请求、模型自述和已执行动作并排写入可外部锚定的哈希链,执行前用正则门,事后用规则和独立模型互查。
- 问题:长时运行的编码智能体会读不可信文本、调用有副作用的工具并派生子智能体,而输出日志可被事后修改,自述也不能代替内部计算。
- 方法:钩子采集 Claude Code 的生命周期事件和转录,子智能体单独入库。账本为 SHA-256 线性链;整文件重算或截掉最新记录,要靠外部锚点才看得见。
- 防篡改:Table 2 里,N=300、每类 200 次时,仅链对五类原地改动和撕裂写为 1.00,对截断尾部和两类全量重链为 0.00;有突变前头锚点时八类都是 1.00。摘要称锚定间隔 300 条时,全量重链检出降到 0.47。
- 门与真实运行:默认正则拦截有害调用 18/44、误拦良性调用 3/40。14 次 Claude Code 2.1 运行中,四个注入场景的尝试为 0/8,且均被披露;73 条消息里 27 个思考块没有可见文本。
- 拼接故障:49 条拼接故障上,规则旗标 40/49,独立评审 98/98;未改轨迹的评审假阳性为 1/14。作者认为这是固定掩护、非自适应插入上的上限,并认为规则和语义评审应该合用。
- 作者的结论:作者称最强的教训是否定性的:哈希链需要锚点,句法门只是绊线,推理通道在实践中可能不存在。监控应把动作当证据、自述当证词,把强制放到智能体之下,由审计层见证强制层的决定。