资讯动态

ReviewHog 提示缓存成本治理实录:cache-aware 计量、网关缓存探针与 fork 规模评估(Gate 0)

发布时间:2026/9/18 7:58:58 来源:尧图企业网站定制
ReviewHog 提示缓存成本治理实录cache-aware 计量、网关缓存探针与 fork 规模评估Gate 0【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog导读本文是 PostHog 开源仓库中 ReviewHog 自动代码评审产品products/review_hog在 2026 年 7 月执行的提示缓存成本实验计划prompt-caching program第 0 号门禁Gate 0的完整技术记录主体文档为 PLAN.md。Gate 0 要回答三个问题ReviewHog 每轮评审的真实 LLM 成本到底是多少而非 naive 的 token 计价、两个不同的沙箱进程能否共享同一个 Anthropic 提示缓存、以及**warm-up fork旗舰方案需要多大规模的测量支撑**。读完本文你将掌握一套可直接复用的 cache-aware 成本计量方法含完整 SQL 与 Python 实现依据、一套带正负对照与速率报告的网关缓存探针实验设计以及围绕 5 分钟滑动 TTL 做沙箱级并行调度的一系列实测结论。1. 为什么必须引入 cache-aware 计量naive 计价会夸大 4.8 倍ReviewHog 的每轮评审由多个沙箱单元组成每个 perspective逻辑正确性、契约与安全、性能与可靠性与每个 chunk 一个独立沙箱外加每 chunk 一个盲点检查blind-spot sweep最后每 chunk 一个验证会话。这些单元全都通过products/tasks的共享基础设施Task/TaskRun → TemporalProcessTaskWorkflow→ Modal/Docker 沙箱 → agent-server → Claude Code 会话运行见 ARCHITECTURE.md。由于每个单元都从零探索同一份 PR它们会反复把几乎相同的前缀 token 发送给模型——其中绝大部分命中提示缓存。核心问题$ai_input_tokens网关返回的输入侧 token 总数把 fresh 输入、cache write 和 cache read 全部混在一起。按统一输入单价计价naive 方法会严重高估真实成本。Gate 0 的实测给出了决定性数字runs/gate0-run1-pr68749-publish.md单 chunk、4 个评审单元3 个 perspective 1 个盲点、142 次 LLM 生成gens的一次真实运行naive 计价 $47.52cache-aware 真实成本 $9.90相差 4.8 倍整个运行的 token 拆分约 43% 是 cache read、33% 是 cache write、19% 是输出、仅 5% 是 fresh 输入——cache read 是真实成本里最大的桶。这也是 CANDIDATES.md 中Measured facts第 1 条的核心结论naive token 数学高估真实成本约 4.8 倍且识别这一点的计量工具已上线并通过校验与网关 LiteLLM 成本在每个桶、每一侧都精确到 Δ 0.0% 匹配。Gate 0 的总体目标PLAN.md 原文按优先级排序为三部分让每一个未来的成本门禁都可计算、可诚实评估扩展 dump 工具支持 cache-aware 拆分发布修正后的基线重锚候选方案 #4–#10 的美元估值通过 LLM 网关验证缓存共享基板两个不同的客户端是否共享同一个缓存为 fork 旗舰方案做规模评估基于既有运行数据测算探索重叠率s与前缀温暖度 TTL 时间线。同时 PLAN.md 明确声明了非目标不改管线、不跑 eval、不改 harnessPostHog Desktop 仓库、不构建 #4/#8/#10构造上零生产风险。2. Gate 0 的三件交付物与最终结局PLAN.md 在文档头部Status 一节记录了 Gate 0 于 2026-07-06 运行一轮后即被用户对项目方向的重新框定reframe锁定 CANDIDATES.md 的约束 5–9关闭。三部分的结局各不相同部分计划内容最终结局Part 1计量cache-aware 拆分、true_usd/gw_usd、逐侧成本交叉校验、逐单元 turn-1 缓存读取分布已上线并通过实测校验dump_result.py产出缓存感知拆分与网关 LiteLLM 成本在每一个桶、每一侧 Δ 0.0%true $9.90 vs naive $47.524.8×Part 2网关探针5 个受控臂arm的跨客户端缓存共享探针成本约 $0.25–0.60从未运行降级为可选基板已被实测证明两次3 个 wave 单元中有 2 个读取了 leader 写入的完全相同的 27,618-token 前缀fork 构建自身的机制门禁也覆盖了该检查Part 3fork 规模探索重叠率s的 go/no-go 门槛 前缀温暖度 TTL 时间线从未运行被降级reframe 取消了 s-gate不再以实测重叠率门禁构建TTL/温暖度一半并入了 fork 构建ENABLE_PROMPT_CACHING_1H成为已解析的杠杆见 HARNESS.md 1h cache TTL被计划文档明确定位为下一个实验的是在冻结 PR #62096 上运行的 warm-upfork 构建候选 #8使用自己的实验文件夹与自己的计划。本地运行任何实验的操作经验沉淀在 HARNESS.md 的 Smoke-run lessons 一节。3. Part 1dump_result.py的 cache-aware 扩展3.1 工具现状与被扩展的列计量工具是 products/review_hog/eval/scripts/dump_result.py。扩展前它只是把$ai_input_tokens与$ai_output_tokens相加、没有缓存拆分原文档描述为 lines ~50-61当前实现中对应_spend_report内的聚合逻辑。工具特性OUT_DIR环境变量可覆盖输出目录、通过本地 ClickHouse 查询$ai_generation事件、通过manage.py shell运行这样 Django 已配置好LABELC0-baseline RUN_SECONDS812 RUN_START_EPOCH1751... OUT_DIRproducts/review_hog/eval/experiments/exp/runs \ python manage.py shell -c exec(open(products/review_hog/eval/scripts/dump_result.py).read())扩展后工具按model × stage维度输出每列stage 由已有的ai_stage/task_title归属推断gens生成次数fresh_in_tokensfresh 输入推导为input - read - write即_spend_report中的fresh max(0.0, tin - cread - cwrite)cache_write_tokens$ai_cache_creation_input_tokenscache_read_tokens$ai_cache_read_input_tokenslong_ctx_gensprompt 超过 200K token 的生成次数_LONG_CTX_TOKENS 200_000——注意这是诊断计数而非计价输入文档注释明确网关的 LiteLLM 价格表对这类模型按平价计费所以200K列不作为定价依据output_tokens输出 tokentrue_usd按清单价回算list-price back-calc。当前实现中的_LIST_PRICES表每 token 美元fresh 输入、输出、cache read、cache writeclaude-sonnet-5$2/M in、$10/M out、read $0.2/M、write $2.5/M5m TTL 的 1.25×claude-opus-4-8$5/M in、$25/M out、read $0.5/M、write $6.25/Mclaude-fable-5与claude-haiku-4-5同样镜像 LiteLLM 的价格映射含 haikuclaude-sonnet-4-6一个非固定模型会话中途丢失模型固定session-restart 类时出现按价定价以免污染运行总额。定价函数_price_for()支持日期后缀变体re.sub(r-\d{8}$, , model)与包含匹配保证$ai_model报告的实际型号都能取到价格行gw_usd网关$ai_total_cost_usd的求和作为常驻交叉校验列而非一次性检查。实现里还有一个重要的细节_spend_report注释LiteLLM 的input_cost字段是整个输入侧cache 已包含在内这正是旧探针 28% 差异的根源——那不是网关计价错误而是测量工具的误解。3.2 逐单元 turn-1 缓存读取分布跨沙箱共享的绊线除了聚合表扩展还输出每个沙箱单元的 turn-1 缓存读取分布per-unit 值 命中数。这是跨沙箱共享的 tripwire绊线task_run_id唯一标识一个 TaskRun 一个沙箱 一个会话HARNESS.md 说明沙箱单元携带task_title形如[sandbox_prompt:issues-review-p{pass}-c{chunk}]/[sandbox_prompt:blind-spots-c{chunk}]且带唯一task_run_id按时间戳取每个task_run_id的第一条$ai_generationturn 1。一个全新沙箱在 turn 1 就发生cache_read 0只能来自另一个进程的写入——这就是跨沙箱信号。dump_result.py的实现细节turn1字典在遍历时间有序的行时记录每个task_run_id的首条记录同时用集合追踪该单元会话碰过的所有模型——集合大小 1 会暴露静默的中途换模型如 overload rescue它会破坏缓存共享与成本固定报告里以⚠️SWITCHED标注。表尾固定输出一句纪律性提示units with turn-1 cache_read 0:N/M(report the distribution, not a median)。2026-07-06 的重要更新写入 PLAN.md Part 1基线不再是均匀的 0——harness 烟雾测试观察到 3 个 wave 单元中有 2 个通过自然抖动读取了 leader 写入的完全相同的 27.6K [toolspreset] 段中位数会误导必须报告分布。3.3 验证锚点、差异归因与修正后的 Economics 表Part 1 的任务清单PLAN.md 原文含五个子任务其中四个在本轮内闭环验证锚点opus-4-8 的true_usd必须与gw_usd在 1% 内匹配2026-07-06 的探针匹配到 0.1%。若不匹配在信任任何其他东西之前先停下调试价格表。实测PR #68749 窗口true $9.90 vs gw $9.90每个桶每一侧 Δ 0.0%。28% sonnet 差异探针发现 sonnet-5 的gw_usd比清单价回算高约 28%隐含混合价约 $2.55/M。计划要求逐一枚举假设并发布哪个假设关闭了差距(a) 200K 长上下文分档(b) 请求模型与实测模型的映射allowlist检查$ai_model(c) Anthropic 5xx 时的 Bedrock 重路由计价(d) 网关价格表对最近启用的 sonnet-5 行的错误(e) 逐路径 token 记账约定差异。实测结论该差异是测量工件LiteLLM 的input_cost是整个输入侧缓存已包含未在逐生成对比网关 LiteLLM 成本时复现并规定决策规则——若都关闭不了差距则信任gw_usd作为评分的 ground truth、保留true_usd作为分解透镜并记录残差。修正后的 Economics 表把归档的 sonnet-5 臂模型轮的 B1/B2管线模型臂 C/F/G若事件幸存作为附加的 true-cost 列重算放在 naive $ 旁边绝不替换——保持跨轮连续性按任务身份task_title/run ids而非原始时间窗圈定本地其他 LLM 活动会污染时间窗。实测结局dead——2026-07-06 的 DB nuke 删除了事件归档臂无法重算基线从新运行的 control 中积累。T1 重写检测器对 post-flip 运行本地 team-1 2026-07-03 以来的 prod cloud在一个task_run_id内按时间排序的连续 gens 中subagent 交错会破坏朴素相邻性标记cache_read 0.05× prev(crcwfresh)且cache_creation 0.8× prev且gap 120s对部分重写把 creation 阈值从 0.8 扫到 0.5区分 rewrite-after-write 与 session-restart/compaction 形状对 Bedrock-fallback 重路由单独分段相同签名——若有路由遥测就按路由分段否则与窗口内 Anthropic 5xx 关联并声明有界混杂。输出重写次数/run、重写 token/run、按 sonnet 写价$2.50/M的 $/run、turn 位置直方图。决策规则 $0.5/run 则带着证据向 Tasks 团队 ticket 施压 $0.3/run 则降级该 ticket 并记录到 INVESTIGATION.md2026-07-06 粗略探针post-flip 约 $0.005/run降级是预期结局。这一项仍在开放搭下一个实验的 control 运行顺带完成。重锚 CANDIDATES.md#4–#10 的 $ 估值需按修正后的 sonnet 时代桶重述尤其 #4 的 fetch-choreography $/unit 与 #9/#10 的 $/turn今天都是 opus 时代数字。同样仍在开放。3.4 报告里的逐侧交叉校验dump_result.py输出的gateway per-side cross-check是常驻的可靠性机制对每一侧输入侧、其中 cache read、其中 cache write、其中 fresh推导、输出打印网关成本、行数以及相对true回算的 Δ。若 write 侧超出 1.25× 回算的 5%报告会提示write-side excess over the 1.25× back-calc 1h-TTL cache writes (billed 2×; the token split cant see the TTL)——这是识别 1h 写计费的手段因为 token 拆分本身看不到 TTL。4. Part 2网关缓存探针的 5 臂设计与解释纪律Part 2 的脚本设计原文档完整规格虽然最终未运行、降级为可选仍然值得完整保留因为它是一份教科书级的跨进程共享缓存对照实验设计脚本形态一次性脚本不提交进管线用裸client.messages.create——不要用.parse结构化输出会把 schema 字节注入请求thinking 关掉adaptive thinking 与max_tokens64不兼容且 thinking 配置会使 message-span 断点失效走get_async_anthropic_gateway_client(productreview_hog, team_id...)与reviewer/sandbox/direct_llm.py同一路径Bedrock fallback 已在该路径关闭载荷约 10K token 的文档块以显式cache_control: {type: ephemeral}断点结尾max_tokens64nonce 纪律每一个臂、每一次试验都要用唯一 nonce 给文档加盐使各臂永远无法读到彼此的 warm 条目因为读取会免费刷新滑动 TTL静默污染 creation 基线保持恒定跨进程保持 metadata/user_id/extra headers 不变记录response.usagecache_creation_input_tokens、cache_read_input_tokens并与$ai_generation的缓存字段交叉核对。臂形状门禁1正对照同一进程相同请求间隔 2 分钟试验 2 的cache_read 0.95×试验 1 的cache_creation。FAIL → 网关在直连路径上剥离/忽略cache_control给网关开 ticketT2 落地后再用 CLI 驱动的沙箱会话对重探跨沙箱问题2主张本身两个独立 OS 进程间隔 2 分钟用全新 nonce 复制 3 次报告共享速率而非二元结果网关若汇集多个上游 key/workspace 会概率性共享门禁进程 B 的cache_read 0.95×进程 A 的cache_creation同一次试验3allowlist 混杂因素REVIEW_MODELvs 一个不在 allowlist 的模型名两侧都确认$ai_model若名字被静默映射到同一被服务模型HIT 是预期结局——模型身份、而非命中/未命中才是发现4负对照间隔 6 分钟、全新 nonce、保证零中间读取必须 MISS滑动 TTL5沙箱来源——任何跨沙箱放行前的强制臂一对字节完全相同的请求从沙箱内部以裸网关调用发出网络来源/凭据/workspace 检查同臂 2。不是Claude Code CLI 驱动的成对请求——CLI 请求今天无法做到字节相同V1/V2按构造必 miss解释纪律文档要求逐字诚实地写进报告臂 125 全 PASS → 跨沙箱共享的 workspace 基板得到验证且显式断点在直连路径上有效对一次性 chunking/dedup 有用PASS 不等于de-risk跨沙箱计划T2/T3 字节修复与 CLI 断点放置仍未证明臂 5 只覆盖来源origin臂 1 通过、臂 2 持续失败 → 网关按客户端分区字节或凭据升级到网关/Tasks 团队探针能证明这种分歧存在但无法给出精确的线上差异并停止所有跨请求候选方案。2026-07-06 的更新使其存在性问题获得生产级 PASS两次烟雾运行 2 与 PR #68749 发布运行观察到两个全新沙箱通过完整栈Modal → ngrok → 本地网关读取了第三个沙箱写入的 27.6K 缓存段。但计划仍建议在受控臂共享速率、allowlist 映射、TTL 健全性需要时再运行探针并把臂 2 失败视为需要调查的异常而非计划杀手。reframe 后臂 5沙箱来源成对成为承重臂——它是所有跨沙箱共享T2/T3/#8的基板检查直连路径断点结果现在只对一次性 chunking/dedup 调用有意义。5. Part 3fork 规模评估的规格与降级Part 3 的完整规格在 CANDIDATES.md #3执行时带上了批评者的修改仅 wave 的 s、严格 3-of-3 / 宽松 2-of-3、盲点边际重叠单独报告、早窗口对账、TTL 门禁失败时的提高阈值规则。两个离线分析(a) 重叠率s把$ai_generation时间戳、cache_creationjoin 到任务的 ACP 日志以获取工具调用的参数——$ai_tools_called只带名称已核实。工具调用归一化Read 路径、Grep 模式范围、分类的 Bash早窗口 turns 2..ceil(0.4 × turns)与首个发现前的边界作为扫描变体对账按 next-gencache_creation减 prior-gen 输出加权只对 3 个 wave 单元计算 s严格 三者皆现宽松 2-of-3盲点的边际重叠单独报告它喂给第 5 个 forker 的决策而非 wave GO。门禁wave-fork GO 需要s_p50 ~0.55严格审计显示把重读税定价后原 0.40 边界的净值低于实质门槛。(b) 温暖度/TTL按run, chunk计算 wave 并集上最大的连续 gen 间间隙未刷新的最坏 TTL 窗口与 last-wave-gen → first-blind-spot-gen 的间隙报 p50/p95外加 fork 时代调度表的模拟移位。门禁wave 内部最大间隙 p95 4 分钟 → 不需要重调度构建wave→盲点间隙 p95 4 分钟 → 盲点可成为第 5 个 forker额外 $0.8–1.1/run。执行注释还要求包含大型多 chunk 运行例如现场 PR #67419 运行3217 行新增、一次性 chunking、61 条原始发现而非只测冻结的 #62096——大 PR 是计划的优先项且 s 可能在其中不同大 PR 的 chunk 若触碰共享模块可能重叠更多恰恰会在最需要的地方抬升 fork 价值。按 chunk 数分桶报告 s。最终结局2026-07-06 晚被锁定约束 7 降级——s 不再门禁构建重构后的 warm-up 按设计让 s→1价值随不受限的 perspective 数量扩展。温暖度/TTL 一半并入 fork 构建在其运行中测间隙ENABLE_PROMPT_CACHING_1H是间隙超过 5m 时的杠杆重叠分析仅作为可选的构建后诊断存续。6. 两个决定性实测跨沙箱缓存共享部分上线、TTL 默认是 5 分钟6.1 跨沙箱缓存共享基线不再是零HARNESS.md 的烟雾运行 22026-07-06现场 PR #68735未打补丁的本地 main给出了第一手证据单元首次 gent1 cache_readt1 cache_writeissues-review-p2-c1leader18:34:54059,423issues-review-p3-c14s27,61831,801issues-review-p1-c150s27,61831,806blind-spots-c110min062,473证据解读文档原文要点跨沙箱缓存共享在当前 agent/SDK 上已部分上线两个全新沙箱读取了 leader 写入的完全相同的 27,618-token 段——即 [tools system-preset 块] 前缀之所以能共享是因为自然的供给抖动4s、50s使 p2 成为事实上的 leader。Task-Id追加V1只污染它之后的字节——前面的 preset 块共享无恙。2026-07-03 调查的turn-1 cache_read 中位数 0在当前构建上已过时今天的中间值会是 27,618——因此要看分布别看中位数。这是 Spike 1 跨客户端问题的生产级证据两个不同沙箱进程通过完整栈Modal 沙箱 → ngrok → 本地 llm-gateway共享了同一个 Anthropic 缓存。wave→盲点的 TTL 间隙真实存在并被观测单 chunk PR 上 10 分钟沙箱供给 启动 clone checkout 就吃掉 5 分钟滑动 TTL盲点因此全量重写。任何 fork 设计都必须按 chunk 排序并重新检查温暖度。这不改变 T2 仍是 fork 的硬前置跟随者 fork warm-up 的 transcript 需要整个前缀含 system append字节一致每个任务的Task-Id仍在 append 处破坏这一点。约 27.6K 的 preset 共享每单元只值几分钱$/follower ≈ 27.6K × ~$2.3/M 差值 ≈ $0.06——fork 的价值在于约 70K transcript 读取它仍被 T2T3 阻塞。PR #68749 的正式发布运行再次复现了该 tripwireruns/gate0-run1-pr68749-publish.mdleader 在 turn 1 写入 73.2K两个跟随者在 1s/19s 读取了完全相同的 27,618-token [toolspreset] 段盲点在 wave 之后 12.5 分钟才触发并全量重写TTL bust。该运行 2/5 的单元有 turn-1 cache_read 0。6.2 TTL 真相我们默认跑在 5 分钟上1 小时只需一个环境变量HARNESS.md 1h cache TTL 一节用三种方式证明了沙箱路径默认是 5 分钟 TTL回答我们是不是默认就用 1 小时 TTL的疑问否计费证明PR #68749 运行的 cache-write 成本与 5m 费率1.25×精确到分匹配且 LiteLLM 对 1h 写单独计价cache_creation_input_token_cost_above_1hr 2×其成本计算会用到因此 1h 写必然显现行为证明两个独立的 5m 间隙都造成了全前缀重写#68749 运行盲点距最后一个 wave gen 5m52s烟雾运行 2 的 10 分钟间隙机制从 CLI bundle 反编译packages/agent/dist/claude-cli/claude中每次请求 CLI 设置ttl CCH(querySource) ? 1h : undefined并把它穿进每个缓存断点同时推送extended-cache-ttl-2025-04-11beta 头。CCH()的逻辑FORCE_PROMPT_CACHING_5M环境变量 → 总是 5mENABLE_PROMPT_CACHING_1H环境变量 → 总是 1h无条件否则要求 first-party 认证Nq()在我们的网关 token/base-URL 路径上失败后才咨询 statsig allowlisttengu_prompt_cache_1h_config默认[repl_main_thread*,sdk,auto_mode,memdir_relevance]。所以交互式 Claude Code 与 first-party SDK 会话确实默认 1h——而我们经网关认证的沙箱穿透到 5m。这就调和了我们默认用 1h的直觉与实测的 5m 行为。执行方式无需补丁在沙箱容器环境变量里设ENABLE_PROMPT_CACHING_1H1——注入点在 products/tasks/backend/temporal/process_task/activities/provision_sandbox.py 的_build_environment_variablesenvironment_variables字典在LLM_GATEWAY_URL一行附近源码可见settings.SANDBOX_LLM_GATEWAY_URL会写入LLM_GATEWAY_URL。它是按沙箱生效的因此可以有选择地启用例如只给 warm-up 单元其 transcript 条目存活 1h而跟随者写保持 5m。两个仓库当前都没有设置这些变量已验证。成本与剩余未知1h 写按 2× 而非 1.25× 计费在 #68749 运行形态上全面启用会增加约 $2.4/run 的写溢价——要选择性启用不要全舰队启用。ttl字段已 GA按当前 Anthropic 文档无需头CLI 的 beta 头推送在我们的路径上是否也触发uk()门禁未解码是运行时验证的细节——首次启用运行的写侧成本预期该单元约 60%与 5m 间隙存活是经验确认手段。6.3 Tripwire 验证 SQLHARNESS.md 给出了完整的验证查询通过manage.py shell的sync_execute运行即 dump_result.py 的模式。它按task_run_id分组取每个单元的首条 gen 的 turn-1 cache read/write并按单元类型blind-spot vs perspective聚合报告中位数与命中计数WITH unit_turn1 AS ( SELECT JSONExtractString(properties, task_run_id) AS task_run_id, extract(any(JSONExtractString(properties, task_title)), \\[sandbox_prompt:([a-z0-9_-])\\]) AS step_name, count() AS gens, argMin(toFloat64OrZero(JSONExtractString(properties, $ai_cache_read_input_tokens)), timestamp) AS turn1_cache_read, argMin(toFloat64OrZero(JSONExtractString(properties, $ai_cache_creation_input_tokens)), timestamp) AS turn1_cache_creation FROM events WHERE event $ai_generation AND timestamp %(run_start)s AND timestamp %(run_end)s AND (JSONExtractString(properties, task_title) LIKE [sandbox_prompt:issues-review-% OR JSONExtractString(properties, task_title) LIKE [sandbox_prompt:blind-spots-%) AND JSONExtractString(properties, task_run_id) ! GROUP BY task_run_id ) SELECT multiIf(step_name LIKE blind-spots%, blind-spot, perspective) AS unit_kind, count() AS units, medianExact(turn1_cache_read) AS turn1_cache_read_median, countIf(turn1_cache_read 0) AS units_with_turn1_hit, medianExact(turn1_cache_creation) AS turn1_cache_creation_median FROM unit_turn1 GROUP BY unit_kind WITH TOTALS ORDER BY unit_kind两个重要注意点沙箱单元走的是 harness 的网关产品background_agents——不要对沙箱单元按ai_product review_hog过滤那只标注一次性 chunking/dedup 调用以及报告分布units_with_turn1_hit 逐单元值永远别只报中位数。$ai_generation的缓存字段由网关捕获services/llm-gateway/src/llm_gateway/callbacks/posthog.py 中$ai_cache_read_input_tokens/$ai_cache_creation_input_tokens仅在存在时发出——缺失按 0 处理本地 e2e 已证明这些字段落入本地 ClickHouse。7. 运行日志Gate 0 的一次实战复盘PLAN.md 的 Run log 记录了 2026-07-06 的三条关键条目是实验方法论的第一手教材2026-07-06范围收窄会话仅单 PR 评审 花费计算修复DB 刚被 nuke$ai_generation归档 0归档臂重算不可能修正基线必须来自新运行team 1/user 1 在重新播种后幸存GitHub 集成行丢失——通过GitHubIntegration.integration_from_installation_id(143741024, team_id1)恢复。在带--publish的现场 PR #68749 上运行run_review单 chunk461 行原始新增但可评审行在 400 门槛内。烧出来的教训运行中途编辑products/**/*.py会让 temporal workernodemon重启并杀死第一次尝试的 waveTemporal 重试工作流从同一 head 已持久化的 (pass, chunk) 结果恢复——wave 没有重付只有盲点重跑。运行完成posthog-local-dev20:45 UTC漏斗 1 chunk / 4 单元 / 8 原始 / 8 去重 / 4 有效。2026-07-06 深夜——TTL 调查、计划重框定、本轮关闭证明沙箱路径跑在 5m 缓存 TTL 上计费恰好 1.25×5m 间隙全量重写CLI 的CCH()门禁在 allowlist 前要求 first-party 认证——从 CLI bundle 反编译得出且沙箱环境里的ENABLE_PROMPT_CACHING_1H1无条件强制 1h注入点provision_sandbox.py按单元写 2×FORCE_PROMPT_CACHING_5M是 kill switch。用户锁定重框定CANDIDATES.md 约束 6–9warm-up 有意的调查阶段、N 不受限、s-gate 取消、fixture #62096。Gate 0 关闭下一个实验 #8 fork 构建。2026-07-06——Part-1 工具上线并通过实测验证eval/scripts/dump_result.py扩展完成在 PR #68749 窗口验证runs/gate0-run1-pr68749-publish.mdtrue $9.90 vs gw $9.90每个桶每一侧 Δ 0.0%——旧探针的 28% sonnet 差异未在逐生成对比网关 LiteLLM 成本时复现错在探针的回算而非网关价格表。Naive 方法 $47.52 4.8× true与 CANDIDATES.md 的实测事实一致。本次运行的桶拆分43% cache read / 33% cache write / 19% output / 5% fresh。Tripwire 复现了烟雾运行的发现5 个单元中 2 个在 turn 1 读取了 leader 写入的完全相同的 27,618-token [toolspreset] 前缀盲点在 wave 后 12.5 分钟启动TTL bust全量重写。8. 环境准备Pre-flight与评分决策PLAN.md 的 Pre-flight 清单在本地复现 Gate 0 类实验的实用前提flox 环境本地 ClickHouse 可达且持有归档 eval 窗口的$ai_generation先检查——见紧迫性说明保留期使这很脆弱10 天探针窗口在 2026-07-06 几乎覆盖不到它们Part 3 需要任务的 ACP 日志S3/对象存储来获取工具调用参数——与 ClickHouse 检查一起确认访问与保留期网关客户端凭据在 worker 环境中可用get_async_anthropic_gateway_client除 ClickHouse 外无需 dev 栈除臂 5一个一次性任务或进入既有沙箱镜像的 shell外无需沙箱本轮不触碰reviewer/管线代码或提示词。紧迫性说明Part 1 的第一行动从本地 ClickHouse$ai_generation事件重算归档的 07-03 eval 臂——本轮的第一行动是确认这些事件仍然存在保留期使这很脆弱。如果已老化掉修正基线必须来自下一轮的两个 control 运行并记录在 run log 中继续其余部分。实测结局DB nuke 使该检查失败基线改为从新运行积累。评分与决策本轮输出约定FINAL_REPORT.md惯例TL;DR、setup、结果含修正 Economics 表、探针臂表带速率、建议、成本合计外加五项交付物(1) 修正基线发布、naive-vs-true 并列(2) T1 ticket 施压或降级两种结果都记录到 INVESTIGATION.md(3) 跨沙箱基板裁决臂 2 臂 5 共享速率与 fork go/no-go 输入发布按 chunk 数分桶的 s、TTL 温暖度时间线、盲点第 5 forker 裁决(4) CANDIDATES.md 重锚(5) 下一轮建议Round 1 默认 #4 skill-body splice #10 pre-pack旗舰裁决 由 s 基板给出的 fork 阶梯 GO/STOP。工作模式2026-07-06 与用户锁定实验迭代式、隔离式、一个接一个运行——本轮在signals/reviewhog之外单独开分支建议signals/reviewhog-exp-caching-gate0若后续实验的更改与前序矛盾实验结束后 stash 工作或更好的是每个实验保持独立分支只有确定的赢家合并回主干。本轮唯一预期合并的持久工件dump_result.py扩展它是 eval 工具不是管线代码加上本文件夹的结果文档。9. 与当前仓库状态的衔接需要说明的时效性本文描述的实验发生于 2026-07-06是 2026-07-prompt-caching 实验文件夹中的历史记录PLAN.md 自身标注 round closed — this doc is the record。当前仓库中dump_result.py仍然存在并保留了全部 cache-aware 扩展fresh/write/read/output 拆分、true_usdvsgw_usd、逐侧交叉校验、turn-1 分布、以及为 warm-upfork 臂预留的 fork 碰撞跟踪器——每个 chunk 报告前缀写入者/读者数量1 个写入者是理想 fork 形态constants.py 中的模型固定已演进评审臂为 Codexgpt-5.6-sol xhigh、验证/解决为claude-opus-5 xhigh、chunking/dedup/oneshot 为claude-sonnet-5MAX_CONCURRENT_SANDBOXES 10与FAN_OUT_FAILURE_FLOOR 0.70对应 PLAN.md 中讨论的 fan-out 并发边界文档引用的历史价格sonnet-5 $2/$10、opus-4-8 $5/$25 per M属于实验当时的清单价应以网关实时价格表为准workflow.py 的ReviewPerspectivesWorkflowfan-out 波 盲点正是 INVESTIGATION.md 中 V0 违规无 warm-up 阶段所在的位置——按计划warm-up 阶段就插在这里沙箱环境变量注入点 provision_sandbox.py 的_build_environment_variables是ENABLE_PROMPT_CACHING_1H的落地处。从源码结构可以推断cache-aware 计量的设计意图以真实成本门禁所有未来实验已沉淀为 CANDIDATES.md 中所有候选方案的统一成本门禁约定——All cost gates are cache-aware and RELATIVE to the measured sonnet-era control。这一原则在后续实验轮中持续生效也是任何想为 ReviewHog 类多沙箱 agent 系统做成本工程的人最值得带走的结论在缓存感知计量上线之前任何成本决策都建立在高估 4.8 倍的数字之上。10. 核心要点速览naive token 计价会系统性高估成本真实运行的 cache read 是最大成本桶43%naive 方法把全部输入按统一价计高估 4.8 倍——先上 cache-aware 计量再谈任何成本优化。验证锚点纪律true_usd清单价回算必须与gw_usd网关 LiteLLM逐桶逐侧匹配Gate 0 实测 Δ 0.0%不匹配就先调试价格表再信任其他数据。跨沙箱共享是真实且可观测的turn-1 cache_read 0 是唯一可信的跨沙箱信号全新沙箱的首次读取只能来自他人写入报告分布而非中位数。TTL 是成本设计的核心约束沙箱路径默认 5m 滑动 TTL写 1.25×1h 需ENABLE_PROMPT_CACHING_1H1写 2×wave→盲点的 5m52s–12.5min 间隙会全量重写fan-out 必须立即调度并重叠供给。fork 的硬前置是字节一致性Task-Id插值V1与动态 system 段V2必须在整个前缀上消除原始 JSONL 必须上传T3否则 fork 读取永远不会发生——这决定了warm-up 以一次 settle 用户 turn 收尾、写出 stripped-form 缓存的设计。【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价