跳转至

保留的 Claude 后台任务文本

实际的 Claude 任务跟踪器通过其 512 字符的描述/名称切片保留了过大的输入字符串。其运行中任务、已结算任务和最近移除任务都可能各自保留这些切片。该修复在共享文本边界处使用现有的 ownRetainedString;规范化、UTF-16 裁剪、任务身份、发布以及生命周期行为保持不变。

此修复扩展了 ML-018 / #20960。

复现

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/claude-task-retention/reproduce.cjs

该脚本打包了实际跟踪器及其保留类。其基线仅在内存中移除新增的复制调用。它测试扁平字符串、拼接字符串以及 JSON 解析的 SDK 风格帧;每个输入都有独立的任务所有者。它在 GC 之后测量,然后清空跟踪器,并在测量清理之前让出。结果和 bundle 哈希 保留了完整运行记录。

JSON 解析用例 每任务输入 任务数 可见文本 清理前堆 清理后堆
运行中 64 Ki 字符 32 16,384 字符 2,125,672 43,536
已结算 64 Ki 字符 32 16,384 字符 2,127,072 44,296
已移除,等待结果 64 Ki 字符 32 0 字符 2,108,136 25,360
运行中 4 Mi 字符 8 4,096 字符 33,562,624 11,048
已结算 4 Mi 字符 8 4,096 字符 33,563,960 11,656
已移除,等待结果 4 Mi 字符 8 0 字符 33,558,584 7,008

在 macOS 上使用 Node v26.6.0 捕获。对于每种情况,清理后都回到接近初始堆的水平。六个回归测试针对描述和名称,让实际跟踪器经历这三种生命周期。文本行为测试保留空白规范化、回退名称以及被裁剪的代理对。

可达性与限制

claude-stream-json-connection.ts 将 SDK 消息转发给结构化适配器,其 emit 会调用 backgroundTasks.observe。已安装的 SDK 0.3.251 使用 Node readline 组装 stdout 记录,使用 JSON.parse 解析每条记录,然后让出该记录。所检查的路径不施加记录或描述长度限制;原生读取块大小不会限制已组装的 JSON 字段。描述在 SDKTaskStartedMessage 中声明为普通字符串。

该描述切片和此 SDK 版本也存在于 v1.4.198;该标签使读取器在 claude-background-task-tracker.ts 中保持内联。独立的已结算/最近移除保留路径和名称读取器路径描述的是当前代码。

当前映射受数量限制:每个跟踪器最多 256 个运行中条目、256 个已结算条目和 256 个最近移除条目。当没有可见工作剩余时,已结算上下文会清除;最近移除上下文等待结果、逐出或显式清除。会话结束/关闭会清空跟踪器。每个保留字段的复制工作最多为 512 个 UTF-16 码元,并且它不会减少临时解析分配。

这些是合成的大尺寸任务字段,并非受影响用户收到此类字段的证据。该路径涉及结构化 Claude 会话,而非普通终端输出或 stderr。#19831 和 #19768 均未确立此触发条件。

独立的摘要受限子代理 ID 也在实际消费者处进行了检查。移动端响应净化器可能会临时保留原始值,直到 JSON 序列化将其拼接的 ID 扁平化。Worker 转录边界处理已为其字节预算进行序列化,并在探测中释放了该父对象。未确立持久的 ID 所有者泄漏,因此该辅助函数保持不变。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca