Skip to content

[Bug][compress] 0.1.211: external-summary mode reports no-op ranges as failed #5558

Description

@Maziar123

Summary

When external-summary compression is configured, ranges that are protected or already covered by an active block are reported as a failed compression instead of an idempotent no-op.

Expected

The external-summary path should return the same applied no-op receipt as the normal compression path, without creating another block or invoking the paid summarizer.

Actual

It returns:

[Compression FAILED: no selected range passed the existing kernel protection checks. Nothing compressed.]

This makes an already-covered range look like a new failure and can trigger repeated retries.

Reproduction

On d5a84f1655afdfd3518567c9a709cb13eaad1673:

  • a fully protected range returns refused rather than an applied no-op;
  • replaying a range after a successful external-summary fold also returns refused rather than reporting the existing covering block.

Both cases avoid any new paid call or block; only the receipt is wrong.

Scope

External-summary no-op handling only. No kernel changes and no change to real compression, paid summarization, or genuine kernel-error handling.

Activity

  1. added 2 commits that reference this issue on Nov 2, 2026
  2. ranxianglei commented on Nov 2, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    查重: 不重复。 open+closed 的 issue 与 PR 全文检索(external-summary no-op / protected / covered / "no selected range passed … protection checks")均无命中;当前 master(dec393f43) 上该 bug 行仍在,无在先修复。

    已复现并在当前 master 上修好,交付一个闭环 PR:#5564 (Closes #5558)。

    结构化八问

    1. 是什么问题:external-summary 模式下,一次 compress 请求的所有 range 都「受保护」或「已被活跃块覆盖」时,被误报成"压缩失败",而不是幂等的 no-op。
    2. 什么原因导致的:external 车道先用假 summary 跑一遍 kernel 探测;所有 range 都被跳过时 work 为空,代码直接落到一句通用 "Compression FAILED … protection checks" 的 refused 回执——它没区分「没东西可折叠(no-op)」和「真出错」。普通路径(Compression conflict banner (bili v0.1.205, node v24.19.0, win32-x64) #4521)早做了这个区分并返回成功形态 no-op 回执,external 车道漏了这一步。
    3. 影响范围与严重程度:仅 external-summary 配置下、对已覆盖/受保护 range 再次 compress 时触发。不丢数据、不建块、不发付费调用;但把合法 no-op 报成新失败 → 模型反复重试、每次重新武装 repeat-guard/熔断器(长会话 "FAILED→retry→FAILED" 循环的来源之一)。定性为行为/体验缺陷,非数据损坏。
    4. 怎么修复的:让 external 车道复用普通路径的成功形态 no-op 回执。把那段回执抽成单一共享函数 noopCompressReceipt()(两车道共用一份文案,杜绝漂移);external 车道在「探测未折叠任何块且 kernel 无 error」时走它(outcome=applied、reason=noop、0 blocks + 实时 recovery hint)。真错误(太小/无法锚定)仍走原 refused 回执,逐字节不变。
    5. 是否有回归问题:审计过既有行为——普通路径 applyRanges 的 no-op 分支是纯抽取(输出逐字节不变,有测试钉住);external 真错误分支保持原样;mixed batch(部分可折叠部分跳过)的 partial 行为未动;无 breaker/时序/阈值漂移。唯一有意变更见下。
    6. 是否破坏缓存:不涉及。no-op 本就不改 prefix/block/cache;本次只改回执文案与 outcome 枚举,不碰任何缓存/重试游标/去重键。
    7. 是否改了设计方向:不改架构/边界/数据流。只是让 external 车道对齐普通车道已有的 no-op 语义(Compression conflict banner (bili v0.1.205, node v24.19.0, win32-x64) #4521),并把共享回执收敛到单一 owner。
    8. 是否引入了新的配置:不涉及。无新 env/config/默认值。

    ⚠️ 行为变更披露:external-summary 全跳过场景的回执 outcome 由 "refused" → "applied"(reason=noop)。下游 failed 标志随之 true→false(不再当失败、不再武装熔断器);不建新块、不发付费调用(这两点原本如此,未变)。普通路径 applyRanges 输出逐字节不变。

    验证:基于当前 master,typecheck + build 干净;定向测试全绿 —— 新增 tests/issue5558-ext-summary-noop.test.ts(受保护→applied/noop 无块无付费调用;已覆盖→applied/noop 且点明覆盖块;太小→仍 refused 保真错误路径;普通路径不变),并更新 tests/external-summary-runtime.test.ts 中钉住旧 refused 的那条断言为 applied/noop(保留"无付费调用+无折叠"保证)。全量回归交 CI。

    判定:已交付,等 CI + review;合并按仓库规则由人执行。

  3. added a commit that references this issue on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions