ADR 压缩:验证与成本测量
token 测量日期:2026-09-19;实现验证扩展至 2026-09-20。运行环境:OpenCode 1.18.15、Bun 1.4.2、Linux。本文记录实现证据,不代表接受架构提案,也不是发版公告。
验证矩阵
| 范围 | 证据 |
|---|---|
| 原有 ADR 行为 | 9 个原有 ADR 测试脚本全部通过,共 1,150 项检查 |
| 新维护服务 | 21 组测试:默认无写入分析、参数冲突、有界 Unicode 证据、完整读取回执、多合一/N 对 M、保留独立记录、MADR/Nygard/OCP、OCP 已拒绝章节保留及混合容器拒绝、显式迭代身份、自定义/模块根、OCP 状态目录覆盖、文件所有权、源/索引过期、循环/缺失引用、符号链接、事务恢复、成本拒绝/过期、Ask 重放/跨会话检查、持久化/幂等批次、100 条记录组装提交及生命周期序列化往返校验 |
| 插件作用域 | 现有作用域套件 26 项检查通过;证据工具与读取策略共用 adr-context-tool 作用域 |
| 真实原生运行时 | 确定性的本地 SSE 模型;实际插件注册、技能发现/加载、默认命令零模型请求、成本 Ask、完整证据、命名批次提交、4 种最终 Ask 选项、严格审计日志、CURRENT/索引发布、归档及原生 read 取消 |
| 进程中断边界 | 14 个 SIGKILL 边界:批准持久化、生命周期开始、审计日志、后继、前驱、生命周期完成、CURRENT 正文、视图完成、归档副本、源删除、归档完成、移动后 CURRENT、移动后视图完成、计划完成。每例恢复均无重复接受或源丢失。 |
| 原生重启/逆向归档 | 写入已接受后继后终止真实 OpenCode;新服务器拒绝无关变化、保留原操作者/审计恢复,再通过独立 Ask 批准逆向归档。手工恢复不请求模型。 |
| 类型检查 | bunx tsc --noEmit 通过 |
| 双语文档 | bun run docs:build 通过(仍有字体解析和大 chunk 警告)。 |
| 提示预算 | bun scripts/measure-prompts.ts 通过 |
| PowerShell 总入口 | 服务和进程中断套件已注册;通过 OCP_TEST_NATIVE_ADR=1 显式启用两个原生套件。本 Linux 环境缺少 pwsh,尝试下载二进制失败,未运行 PowerShell 包装器;其中 ADR/作用域脚本已直接运行。 |
| 打包冒烟检查 | 一次性文件树和仅供验证的版本:生成清单包含新增服务/技能;ZIP 和 tar.gz 的 pack.sh+verify.sh 通过,共 297 个清单文件。哈希确认真实版本/历史清单未变。这不是发版;正式版本/标签/清单仍需维护者的发布流程。 |
原生测试创建临时项目,使用随机服务器认证和临时端口,通过真实 Question 回复 API 提交选项,结束后停止进程并清理。不调用付费供应商;批准回执来自原生服务器事件,不来自候选数据。测试专用文件系统拦截器在真实写入后终止子进程,不发布生产故障开关。仅在确认锁记录的进程已退出后清理残留锁。这覆盖进程死亡,不证明断电/fsync 持久性,也不是全部文件系统故障矩阵。
打包门禁并非形式:仓库中已提交的 0.40.0 清单仍描述重构前的 plugins/adr-guard/… 布局,此前 pack.sh 会产出漏掉 31 个发货文件的归档(包含整套压缩工具链)。scripts/check-package-manifest.ts 现在从安装器使用的唯一实现 install/src/manifest.ts 解析发货清单,清单缺失时生成、存在但不一致时直接构建失败。
集成测试发现并修复了一个缺陷:在 Question 确认后以新用户消息发送回执,即使带 noReply,也可能触发活跃模型循环的额外轮次。现在回执通过原 Question 工具结果和提示展示;真实测试断言批准不会引入未请求的模型轮次。
还发现并修复了阶段间隙问题:获批计划可能已经保存,而下一份日志尚未创建。现在待恢复检查同时包含 applying 计划和未完成日志,有界检索、新建计划及竞争的已评审计划都不能绕过该间隙。恢复时也会拒绝通过取消丢弃原始授权。
批准前还会使用风格适配器重新解析拟写入的生命周期变更。重复或非规范状态字段可能让实际 Markdown 仍是 proposed/accepted,而内存计划却认为已 accepted/superseded。记录/章节状态或双向血缘不一致会成为执行阻断项,不能退役源或追加接受审计记录。
交付步骤、安装/回滚指引与仍存在的平台限制汇总见 ADR 压缩:交付状态。
复现
bun tests/test-adr-compaction-unit.ts
bun tests/test-adr-compaction-faults.ts
bun tests/test-adr-compaction-runtime.ts # PATH 中需要 OpenCode;运行四种选项
bun tests/test-adr-compaction-recovery-runtime.ts
bun tests/test-adr-compaction-package.ts # 需要 Bun、bash、zip/unzip/tar/哈希工具
bun tests/test-plugin-scope-unit.ts
bunx tsc --noEmit
bun scripts/measure-prompts.ts
python3 -m venv .venv
.venv/bin/pip install tiktoken==0.12.0
.venv/bin/python scripts/benchmark-adr-compaction.pytokenizer 首次运行需要下载官方词表。本次环境无法访问对应 Azure 地址,因此从 npm tiktoken 编码器分发包重建相同词表,并校验官方 SHA-256 223921b76ee99bde995b7ff738513eef100fb51d18c93597a113bcffe865b2a7 后放入标准缓存。未提交词表或大体积测试数据。
合成基准
tokenizer 为 tiktoken 0.12.0/cl100k_base,无付费调用。临时生成 10/100/1,000 条 Nygard 记录,含共享系统约束、服务领域、明确规范要求、理由/否决选项,每 20 条有一篇长记录。相同任务检索一个服务领域及共享系统约束,并读取所有必要分页。
实际对照是现有上下文导航加定向源文件正文,包含相同系统约束,不仅比较刻意浪费的全库读取。后续检索使用确定性的参考摘要。这测量的是检索成本与样本覆盖,不是模型生成摘要的质量。
| 记录数 | 全读 token(仅参考) | 现有定向对照 | 后续证据总 token | 分页数 | 相对定向对照减少 | 样本约束召回 |
|---|---|---|---|---|---|---|
| 10 | 5,580 | 1,265 | 300 | 1 | 76.3% | 2/2 |
| 100 | 62,430 | 13,565 | 1,569 | 2 | 88.4% | 11/11 |
| 1,000 | 624,336 | 129,971 | 14,697 | 13 | 88.7% | 101/101 |
最大单次响应分别为 991/3,713/3,732 个 Unicode 码点,均低于 12,000 上限。完整任务证据可以合理地超过单页。召回检查匹配已知样本的完整约束文本,不是通用语义召回保证。
首次成本单独计算
| 记录数 | 含响应元数据的一次证据 token | 参考摘要输出 token | 示例首次成本下界 | 乐观摊销任务数 |
|---|---|---|---|---|
| 10 | 9,037 | 492 | $0.0115 | 11.9 |
| 100 | 101,185 | 4,902 | $0.1257 | 10.5 |
| 1,000 | 1,012,062 | 49,003 | $1.2571 | 10.9 |
示例单价为输入 $1/百万 token、输出 $5/百万 token,不是供应商报价。下界不包含提示、工具定义、后继文件、评审、重试、缓存和上下文重放,不是端到端账单或支出上限。摊销假设任务相同且源没有后续变化,实际回本可能更晚。
在完全重放历史前缀、没有缓存或会话压缩的朴素模型下,证据输入合计可达 22,674/2,332,393/228,292,388 tokens。这说明单次响应有界不代表大型维护会话便宜。1,000 条记录的参考摘要也超过许多供应商的单次输出上限。因此,本基准不能证明一次付费模型会话就能忠实起草千条记录的计划,也不承诺固定节省比例。
命名候选批次现可避免单次巨大的最终工具调用。结构测试将 100 条记录分成 20 个持久化批次组装提交;原生测试分别提交决策与覆盖批次。每批限制为 12,000 个 Unicode 码点,最终提交仍执行完整校验。这不减少累计输入重放,不证明大型会话语义综合质量,也不拆分单篇长后继。上方 token 表保持原测量:它采用参考摘要,未计入新增分批工具开销。
执行边界与仍有限制
- 已真实验证原生
read取消;通用读取/搜索适配及有限 Shell 识别有服务测试。任意 Shell 脚本、Git、MCP、自定义通道和跨原生工具累计读取上限,不受统一屏障保护。 - 基本无关源代码读取及文件名发现可以通过;没有跨所有 Shell/工具方言的统计误报率测量。
- 结构、哈希、逐单元映射和原生同意不能证明语义保真;有意改变约束或存在未解决冲突时尤其需要人工评审。
- 跨批次综合质量、真实付费供应商用量、模型上下文和输出限制依赖部署。本基准有意保持零费用,不替代这些评估。
- 原生事件校验依赖运行时可信 Question 通道,不隔离能够控制同一服务器或编辑项目状态的任意本地进程。
- CURRENT 在读取时检查,不永久注入;手工编辑和普通 ADR 变化可以使其过期。大体积 manifest 属于本地来源资料,不自动进入模型上下文。
- 现有布局迁移遇到归档记录会明确拒绝,避免不兼容移动;不要假定所有旧迁移路径都支持归档树。
- 架构提案 保持未接受、未编号,等待批准的 OCP 命名空间;未通过修改仓库 ADR 历史制造批准。