Skip to content

[PR] fix: apply the same superseded translation as compress for pre-restamp numbers in decompress scope (fix false FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) - #5081

Open
ranxianglei wants to merge 2 commits into
masterfrom
2026-10-29_decompress-superseded-translation

Conversation

@ranxianglei

Copy link
Copy Markdown
Owner

是什么

#5049 第 4 条(v0.1.209 回归 review 遗留):折叠消息引用 restamp(重启重编号)前的 mNNNNN 编号时,decompress 范围路径(resolveDecompressRange)拿旧编号直接和 restamp 后的覆盖集比对 → [decompress FAILED] 通用拒收;而 compress 侧同一引用经 supersededRefRejection 翻译到同一条消息的现行编号后正常折叠。一个机制、两条车道,UX 不对称。

修法

  • supersededRefRejection(+SupersededResolution)从 src/stream.ts 原样抽到 src/superseded-refs.ts(stream↔decompress 互为导入,必须放独立模块);stream.ts 保留 re-export,既有导入点(tests/issue4797-superseded-deadlock.test.ts、tests/seq-ledger-pr3.test.ts)不动;
  • resolveDecompressRange 端点先过同一裁决阶梯(live 优先 → superseded 翻译 → 仅 dead 引用才拒),再比覆盖集;dead 引用给出与 compress 侧一致的可操作文案(re-read acp_status and re-issue);
  • 新增 tests/issue5049-decompress-superseded.test.ts 5 个测试:restamp 前引用翻译成功(本条回归钉)、live 编号直通不变、dead 引用按 compress 文案拒收且不排队注入、倒序引用在翻译值上仍 swap 拒收、无 superseded map 时旧行为逐字不变。

行为变更披露(有意)

  • 旧:restamp 前的旧编号范围引用 → [decompress FAILED: bN covers no messages in mXXX–mYYY …](或更糟:若旧编号恰好落在新覆盖区间内 → 静默恢复错位的窗口)。
  • 新:同一引用先翻译成现行编号 → 恢复同一条消息;仅当该编号既非 live 也无 superseded 映射(真 dead)时才拒,且文案可操作。
  • live 引用、无 restamp 的会话:字节级不变(有测试钉住)。
  • 方向安全不变:翻译是 rawId→现行 ref 的身份保持映射,绝不会返回别的消息的字节。

验证

本地定向:issue5049-decompress-superseded(5/5)、ccr-v2、issue4797-superseded-deadlock、seq-ledger-pr3、decompress-empty-range、decompress-image-ref-dispatch、preflight-covered-ranges、dead-ref-range-filter、compress-recovery-ranges 合计 60/60 绿;typecheck 干净。全量交 CI。

Part of #5049

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

📦 Built Package Artifact

Branch: 2026-10-29_decompress-superseded-translation (e1d42b6)

Latest build — install this exact version

npm install -g billion-context@0.0.9161-pr.5081.7b8a0cc

This exact version is immutable and reproducible. The rolling pr tag tracks the newest test build across all PRs.

Recent builds (commit → version)

commit version build
e1d42b6 billion-context@0.0.9161-pr.5081.7b8a0cc build
aef4987 billion-context@0.0.6718-pr.5081.a46ac0e build
29e0e9f billion-context@0.0.6688-pr.5081.c22d1ba build

Download artifact

  1. Download the artifact from the Actions run
  2. Extract the tarball and install:
tar xzf billion-context-pr5081.tgz
npm install -g package

Install instructions are refreshed on each push.

@ranxianglei ranxianglei changed the title fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) [PR] fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) Oct 29, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b)

收到。对应 GitHub PR 为 #5081(分支 2026-10-29_decompress-superseded-translation)。正在拉取分支核对代码与 CI 状态,稍后给结论。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b)

PR #5081 review 结论(分支 2026-10-29_decompress-superseded-translation,单 commit 29e0e9f9e,4 文件 +252/−75):

八问

  1. 是什么问题:折叠消息引用 restamp(重启重编号)前的 mNNNNN 编号请求 decompress 范围恢复时,两条车道不对称——compress 侧经 superseded 映射把旧编号翻译成现行编号正常折叠,decompress 侧拿旧编号直接比 restamp 后覆盖集 → 假 [decompress FAILED];更糟的是旧编号若恰好落进新覆盖区间,会静默恢复错位的窗口。v0.1.209 regression review outstanding items: 5 medium-risk issues + 3 low-priority items (excluding the already-fixed f | v0.1.209 回归 review 遗留项:除已修的 fork 克隆顺序外的 5 个中风险问题 + 3 个低优项(Blog 长文缺失、judge 假判定、render O(n²)、decompress 翻译缺口、compress schema 收窄) #5049 第 4 条遗留。
  2. 什么原因导致的:resolveDecompressRange 从未接入 After the agent restarts, this session can no longer be compressed: the ref suggested by acp_status is flagged as "renum | 代理重启后该会话再也压不了缩:acp_status 建议的 ref 被 compress 判为「已重编号」,两面对 ref 的认知不一致 #4797 起 compress 侧已有的 superseded 裁决阶梯(live 优先 → superseded 翻译 → 仅 dead 拒收),端点编号直接与覆盖集比对。一个机制、两条车道,只有一条做了翻译。
  3. 影响范围与严重程度:仅影响发生过 restamp 且模型用 restamp 前编号请求范围 decompress 的会话。两种形态:①假拒收(多数,有绕行:重读 acp_status 换新编号);②静默错位窗口恢复(较少见但更坏——恢复的是别的消息内容)。p2:能用、有绕行、无数据丢失。live 编号会话与无 restamp 会话不受影响。
  4. 怎么修复的:supersededRefRejection(+SupersededResolution)从 src/stream.ts 原样抽到独立模块 src/superseded-refs.ts(stream↔decompress 互为导入,必须独立;stream.ts 保留 re-export,既有导入点零改动);resolveDecompressRange 端点先过同一裁决阶梯再比覆盖集,dead 引用给出与 compress 侧一致的可操作文案(re-read acp_status and re-issue);swap 顺序检查改在翻译值上执行。翻译是 rawId→现行 ref 的身份保持映射,结构上不可能返回别的消息的字节。
  5. 是否有回归问题:逐项审过——live 引用:byte 级不变(阶梯 case 1 原样直通,测试钉住);无 superseded map 的会话:函数早退返回拷贝,旧行为逐字不变(测试钉住,含 "covers no messages" 原文案);真 dead 引用:旧行为落入通用 FAILED,新行为按 compress 文案拒收且不排队注入、stats 不动(有意变更,PR 正文已披露,测试钉住);倒序引用:live 倒序解析为恒等映射、结果与旧行为一致,旧编号倒序在翻译值上仍 swap 拒收(测试钉住);无 fail-fast→吞错、无阈值/时序/输出格式漂移。抽取本身逐字核对过(函数体/doc 注释/接口一致)。
  6. 是否破坏缓存:不涉及——出站前缀渲染与 prefix-cache 路径未触碰;decompress 注入仍是 ephemeral injection,不进客户端历史。
  7. 是否改了设计方向:无——把 After the agent restarts, this session can no longer be compressed: the ref suggested by acp_status is flagged as "renum | 代理重启后该会话再也压不了缩:acp_status 建议的 ref 被 compress 判为「已重编号」,两面对 ref 的认知不一致 #4797 既有裁决阶梯扩展到第二个消费方(decompress 范围端点),统一两车道语义;模块拆分是导入环的机械强制,非架构转向。
  8. 是否引入新的配置:无。

验证与 CI(review 中发现并修掉一处红)

  • 本地定向:unused-exports gate ✓、typecheck ✓、9 个相邻套件 65/65 绿(issue5049-decompress-superseded 5/5、ccr-v2、issue4797-superseded-deadlock、seq-ledger-pr3、decompress-empty-range、decompress-image-ref-dispatch、preflight-covered-ranges、dead-ref-range-filter、compress-recovery-ranges);全量交 CI。
  • CI 红(review 发现,已修):原 head 29e0e9f9e 首跑 unused-exports 红——抽取时把 SupersededResolution 接口做成了 export,但全部引用都在文件内(gate 判 INTERNAL_ONLY),连带 static-gates/test/red-signal 因依赖被 skip,全量矩阵没跑成。已推一行修复 commit aef498763(去掉 export 关键字,恢复该接口在 stream.ts 中的原有非导出形态,行为中性,独立标注)。
  • 新 head CI 进行中(截至本回复:failed=0,全量 test 矩阵运行中);分支 BEHIND master(非阻塞,合并时 rebase 或走合并队列即可)。

判定:代码与测试通过审核,有意行为变更已披露且有测试钉住;待新 head 全量矩阵绿即可合。CI 跑完我再补一行确认。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b)

CI 确认:新 head aef498763 全绿——49 项 check run = 36 success + 13 skipped(路径过滤的 e2e 车道,正常跳过),零失败。此前红的 unused-exports 已转 success;被它连带 skip 的全量 test 矩阵(ubuntu-22/24 · windows-22 × node 22/24 分片)+ static-gates 本轮全部实际运行并 success。

最终判定:可合。 合并时留意分支 BEHIND master(rebase 或走合并队列即可)。#4599 已按协调惯例留了一行结论。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b)

收工总结(对应 GitHub PR #5081,分支 2026-10-29_decompress-superseded-translation):

  1. 代码审查:与描述一致——supersededRefRejection 原样抽到 src/superseded-refs.ts(stream.ts 保留 re-export,既有导入点不动);resolveDecompressRange 端点先走 live→superseded→dead 同一裁决阶梯再比覆盖集;新增 5 个测试均为真实断言(含恢复内容级校验)。
  2. CI 红修复:原 head 29e0e9f9e 的 unused-exports 失败(SupersededResolution INTERNAL_ONLY,连带 test/static-gates/red-signal skip)——自身问题,已推一行行为中性 commit aef498763(去掉接口 export 关键字)。本地 gate/typecheck/定向 65/65 绿。
  3. 最终 CI:新 head aef498763 全绿(49 项 = 36 success + 13 skipped 正常路径过滤 e2e,零失败;全量 test 矩阵 + static-gates 实际运行通过)。
  4. CI Control Center: Centralized CI Failure Handling & Status Sync (Comment all CI issues here; do not open new issues) | CI 总控: CI 失败集中处理与状态同步(所有 CI 问题在此评论, 勿开新 issue) #4599 已按协调惯例留一行结论。

判定:可合(分支 BEHIND master,rebase 或合并队列即可)。合并由 owner 执行。

@ranxianglei ranxianglei changed the title [PR] fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) [PR] fix: decompress — restore superseded translation for pre-restamp numbers to match compress (fix spurious FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) Oct 29, 2026
@ranxianglei ranxianglei changed the title [PR] fix: decompress — restore superseded translation for pre-restamp numbers to match compress (fix spurious FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) [PR] fix: decompress scope: restore superseded translation for pre-restamp numbering to match compress (fix false FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) Oct 29, 2026
@ranxianglei ranxianglei changed the title [PR] fix: decompress scope: restore superseded translation for pre-restamp numbering to match compress (fix false FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) [PR] fix: apply the same superseded translation as compress for pre-restamp numbers in decompress scope (fix false FAILED) | fix: decompress 范围恢复对 restamp 前编号走与 compress 相同的 superseded 翻译(修假 FAILED) Oct 29, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b) Merge-guard 第 6 轮同步完成。本轮情况:另一个 worker 曾向同一 PR 分支推过一个基于旧 master 的同步合并(3c9cf58),与我的本地验证头分叉;我把远端该头 + master 剩余提交全部合入(无冲突),得到统一头 f464be0——它包含当前 master tip 491ac1d,分支不再 behind。期间 git mirror 出现过两次瞬时 502,恢复后一次推送成功。本地 typecheck 干净 + 导出回归测试 6/6 绿;推送后 PR mergeable、检查计算中。全量结论以远程 CI 为准;无冲突需设计决策,未开 decision-request issue。

ci-check added 2 commits November 11, 2026 22:45
…#5049 item 4)

A folded message cited by its PRE-restamp number hit a generic
'[decompress FAILED]' on the range path, while compress translated the
same citation to the live ref of the same message (supersededRefRejection).
Asymmetric UX for one mechanism, and a shifted-window hazard if the old
numbers happened to fall inside the post-restamp coverage.

- extract supersededRefRejection (+ interface) verbatim into
  src/superseded-refs.ts so both lanes share ONE resolution ladder without
  a stream<->decompress import cycle; stream.ts re-exports it for the
  existing import sites
- resolveDecompressRange now translates startId/endId through the ladder
  before comparing against block coverage; only genuinely dead cites refuse,
  with the compress-side actionable wording (re-read acp_status, re-issue)
- live citations and sessions without a superseded map are byte-identical
  to the old behavior (pinned)

Part of #5049
The extraction made the interface exported, but every reference stays inside
src/superseded-refs.ts (callers consume supersededRefRejection's result
structurally) — the gate flags it INTERNAL_ONLY. Restore the original
stream.ts shape (non-exported interface, exported function): behavior-neutral,
one keyword.
@ranxianglei
ranxianglei force-pushed the 2026-10-29_decompress-superseded-translation branch from aef4987 to e1d42b6 Compare November 11, 2026 14:56
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

冲突已解决并推送完成。七问如下:

1. 这次做了什么?
把本 PR(上游 #5081)分支 2026-10-29_decompress-superseded-translation 变基到当前 master 最新提交(31684f3,PR #5441 合入点),解决全部冲突后 force-push,新 head = e1d42b633e。GitHub 现报 mergeable: true(原 dirty 状态已消除)。

2. 冲突是怎么产生的?
分支基于 10-28 的旧 master(5594c13),而该基座提交在 10-28~11-01 之间的 master 历史重写后已不在 master 上(旧 #5054 merge commit 消失)。直接 git rebase master 会回放数百个陈旧 merge commit,因此改为只把 PR 自己的两个 commit cherry-pick 到当前 master 顶端。此外工作期间 master 又前进了两次,最终变基到最新 tip,避免推完立刻再次 dirty。

3. 冲突具体怎么解的?

4. 验证结果?
本地定向验证:npm run typecheck 干净;定向测试全绿——PR 自带回归 issue5049-decompress-superseded + 两个消费方套件(issue4797-superseded-deadlock、seq-ledger-pr3)共 13 过;相邻 decompress/CCR 路径(decompress-empty-range、issue4733-ccr-restamp、ccr-v2)27 过。全量回归按纪律交给远程 CI(本地不复跑)。

5. 是否引入行为变更?
rebase 本身零行为漂移——对 master 的最终 diff 恰好是 PR 原有 4 个文件(--name-status 核对过):src/decompress-shared.ts、src/stream.ts、src/superseded-refs.ts(新增)、tests/issue5049-decompress-superseded.test.ts(新增)。行为变化只有 PR 自身声明的那一条:decompress range 端点走与 compress 相同的 superseded 翻译阶梯(修假 FAILED)。

6. 回归风险?
未发现。supersededRefRejection 的全部外部引用点(src/external-summary-compress.ts 与三个测试文件)都经 stream.js 的 re-export 取用,逐一 grep 确认未断;接口非导出化与原 stream.ts 形状一致(CI unused-exports gate 的原始诉求保持)。

7. 当前状态与后续?
分支已推(force-with-lease,推送前确认远端 head 无并发改动)。新一轮 CI 在跑,最终绿红以远程 CI test 车道为准;旧 head 的全量 CI 记录是绿的(镜像缓存可查),预期本轮同样通过。若 CI 有红,按 CI 失败协调流程处理(#4599)。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant