Skip to content

[Feedback] Noticed during testing that Zcode doesn't seem to trigger compression very often. | [反馈]在测试途中发现Zcode好像不怎么会触发压缩 #4344

Closed

Description

@noname-nikke

你好,我是一个这方面的小白。在使用途中发现,相比 DSH 和 Opencode,Zcode好像很少触发压缩,有时候基本上不会触发。我使用的几次都发现 ZCloud 不怎么会触发压缩,请问这是怎么回事?

Image

Activity

  1. changed the title [-][反馈]在测试途中发现Zcode好像不怎么会触发压缩[/-] [+][Feedback] Noticed during testing that Zcode doesn't seem to trigger compression very often. | [反馈]在测试途中发现Zcode好像不怎么会触发压缩[/+] on Oct 22, 2026
  2. ranxianglei commented on Oct 22, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    你好!先说结论:查重:不重复(仓库里没有其它 issue 反馈「ZCode 少触发压缩」这件事,现有的 zcode 相关 issue 都是看门狗恢复/自隧道/签名/启动崩溃那一类,跟这个不是一个问题)。

    标签:bug / zcode / scope/wiring / p2 —— 这是个功能缺陷报告,只涉及 zcode 车道,问题落在宿主接线层(会话标识/工具面/nudge),目前判断是"能用但明显有问题"级别(p2);等信息齐了我可能会调整严重度。

    下面用大白话解释一下,然后列几个我需要你提供的信息来定位。

    一、bili 是怎么"触发压缩"的(关键概念)

    bili 的压缩不是"到时间自动压",而是"推着模型自己去决定压":

    1. 会话越聊越长,累计新增内容达到一个固定阈值(默认每增长约 5 万 token,跟你的上下文窗口大小无关);
    2. bili 就在下一次请求里塞一条"提醒"(内部叫 nudge),告诉模型"你可以调用 compress 工具把前面旧的内容折叠掉";
    3. 只有当模型看到这条提醒、并且手上真的有 compress 这个工具可用时,才会真正去压一次。

    所以"触发得勤不勤"取决于两件事:(a) 你的对话是不是真的在同一个压缩会话里一直往下累积;(b) 模型有没有响应提醒并调用 compress 工具。这两件任何一件出问题,都会表现为"很少/基本不触发"。

    二、为什么 ZCode 看起来比 DSH / Opencode 少(几个候选原因,需确认)

    你拿 DSH 和 Opencode 做对照,但它们仨的机制其实不太一样:

    • DSH:它自带客户端侧的原生压缩器,不完全依赖 bili 的提醒。你在 DSH 里看到的"频繁压缩"很可能主要是 DSH 自己在压,不是 bili 触发的——所以拿它当基准其实有点不公平。
    • Opencode:是 ACP 原生 agent,会稳定地把 compress 工具暴露给模型、并且每个请求都带稳定的会话标识,所以累积和触发都比较顺。
    • ZCode:它是通过 hook / MCP 的方式接入的(不是 ACP 原生),而且目前只给请求打了一个 x-bili-plugin:zcode 标记,没有带稳定的会话标识头。代码里有一个已知且被明确记录过的故障类别正好对得上:当一个客户端每轮都重新发整段历史、又不带稳定会话标识时,bili 会把每一轮都当成"新会话",于是"压缩状态永远累积不起来 → 提醒看到的 token 数一直是 0 → 哪怕上下文已经快满了也不压"。这和你说的"很少触发、有时基本不触发"高度吻合。 另一个可能是 ZCode 用的模型对这种提醒没那么敏感,或者 MCP 里的 compress 工具名带了前缀、模型不太好找。

    但我现在还不能确定到底是你这台上是哪一种,所以需要下面的信息来定位(这也是排查的第一步,不用你先动手改任何东西)。

    三、请提供这几项(第 1 项最关键)

    1. bili 版本:跑 bili --version 把结果贴给我(不同版本这块逻辑差异挺大,必须先定版本再看)。
    2. 接入方式:你是怎么把 ZCode 接到 bili 的?三种之一:① 原生插件(bili zcode 那套,推荐)/② 证书代理(GUI 里 Settings→Network 装证书那种)/③ URL 前缀(地址加 /bili/)。
    3. 模型 + provider:用的是 Z.ai 的哪个模型(GLM-4.x?还是别的)?
    4. 日志或面板(二选一即可):
      • 打开 bili 的日志文件(一般在 ~/.local/state/billion-context/ 下),把含 nudge、processTurn、surface=off、[acp-usage] 的那几行贴给我;
      • 或者直接开 /acp 面板截个图,重点让我看到:上下文占用百分比、已折叠的块数量、会话列表有几条。
    5. 大致现象:你一般聊多少轮 / 上下文涨到多大才期望它压?是完全一次都没压过,还是偶尔压一下?

    补充一句:你贴的那张截图我这边没能正常打开,麻烦把面板上的关键数字(上下文占用%、块数)直接打字告诉我,或方便的话重发一张。

    拿到这些信息我就能判断到底是"会话没累积起来"还是"模型没响应提醒",然后再决定怎么修。到时候我会继续在这个帖子里更新进展。

  3. added
    bugSomething isn't working
    zcode改动范围:内核之外的主机侧接线(src/agent 适配器、server 路由、注入拦截)/范围兜底/客户端标签
    on Oct 22, 2026
  4. noname-nikke commented on Oct 22, 2026

    @noname-nikke
    Author

    🤖 Powered by ework · qwen3.8-27b

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

    你好!先说结论:查重:不重复(仓库里没有其它 issue 反馈「ZCode 少触发压缩」这件事,现有的 zcode 相关 issue 都是看门狗恢复/自隧道/签名/启动崩溃那一类,跟这个不是一个问题)。

    标签:bug / zcode / scope/wiring / p2 —— 这是个功能缺陷报告,只涉及 zcode 车道,问题落在宿主接线层(会话标识/工具面/nudge),目前判断是"能用但明显有问题"级别(p2);等信息齐了我可能会调整严重度。

    下面用大白话解释一下,然后列几个我需要你提供的信息来定位。

    一、bili 是怎么"触发压缩"的(关键概念)

    bili 的压缩不是"到时间自动压",而是"推着模型自己去决定压":

    1. 会话越聊越长,累计新增内容达到一个固定阈值(默认每增长约 5 万 token,跟你的上下文窗口大小无关);
    2. bili 就在下一次请求里塞一条"提醒"(内部叫 nudge),告诉模型"你可以调用 compress 工具把前面旧的内容折叠掉";
    3. 只有当模型看到这条提醒、并且手上真的有 compress 这个工具可用时,才会真正去压一次。

    所以"触发得勤不勤"取决于两件事:(a) 你的对话是不是真的在同一个压缩会话里一直往下累积;(b) 模型有没有响应提醒并调用 compress 工具。这两件任何一件出问题,都会表现为"很少/基本不触发"。

    二、为什么 ZCode 看起来比 DSH / Opencode 少(几个候选原因,需确认)

    你拿 DSH 和 Opencode 做对照,但它们仨的机制其实不太一样:

    • DSH:它自带客户端侧的原生压缩器,不完全依赖 bili 的提醒。你在 DSH 里看到的"频繁压缩"很可能主要是 DSH 自己在压,不是 bili 触发的——所以拿它当基准其实有点不公平。
    • Opencode:是 ACP 原生 agent,会稳定地把 compress 工具暴露给模型、并且每个请求都带稳定的会话标识,所以累积和触发都比较顺。
    • ZCode:它是通过 hook / MCP 的方式接入的(不是 ACP 原生),而且目前只给请求打了一个 x-bili-plugin:zcode 标记,没有带稳定的会话标识头。代码里有一个已知且被明确记录过的故障类别正好对得上:当一个客户端每轮都重新发整段历史、又不带稳定会话标识时,bili 会把每一轮都当成"新会话",于是"压缩状态永远累积不起来 → 提醒看到的 token 数一直是 0 → 哪怕上下文已经快满了也不压"。这和你说的"很少触发、有时基本不触发"高度吻合。 另一个可能是 ZCode 用的模型对这种提醒没那么敏感,或者 MCP 里的 compress 工具名带了前缀、模型不太好找。

    但我现在还不能确定到底是你这台上是哪一种,所以需要下面的信息来定位(这也是排查的第一步,不用你先动手改任何东西)。

    三、请提供这几项(第 1 项最关键)

    1. bili 版本:跑 bili --version 把结果贴给我(不同版本这块逻辑差异挺大,必须先定版本再看)。

    2. 接入方式:你是怎么把 ZCode 接到 bili 的?三种之一:① 原生插件(bili zcode 那套,推荐)/② 证书代理(GUI 里 Settings→Network 装证书那种)/③ URL 前缀(地址加 /bili/)。

    3. 模型 + provider:用的是 Z.ai 的哪个模型(GLM-4.x?还是别的)?

    4. 日志或面板(二选一即可):

      • 打开 bili 的日志文件(一般在 ~/.local/state/billion-context/ 下),把含 nudge、processTurn、surface=off、[acp-usage] 的那几行贴给我;
      • 或者直接开 /acp 面板截个图,重点让我看到:上下文占用百分比、已折叠的块数量、会话列表有几条。
    5. 大致现象:你一般聊多少轮 / 上下文涨到多大才期望它压?是完全一次都没压过,还是偶尔压一下?

    补充一句:你贴的那张截图我这边没能正常打开,麻烦把面板上的关键数字(上下文占用%、块数)直接打字告诉我,或方便的话重发一张。

    拿到这些信息我就能判断到底是"会话没累积起来"还是"模型没响应提醒",然后再决定怎么修。到时候我会继续在这个帖子里更新进展。

    Image版本是v0.1.204 (c87185a),zcode的默认安装方式,默认安装到mcp里面了

  5. ranxianglei commented on Oct 22, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    面板我打开看了,数字都在,谢谢!这下基本能定位了——不是坏了,是你的用法刚好落在 bili「触发压缩」的盲区里。说下为什么,以及怎么让它压起来。

    一、你这张面板说明的事

    • 会话是稳的(单会话、缓存命中 97%)→ 我之前怀疑的“每轮被当成新会话”那个方向可以排除。
    • 上下文一直卡在 ~200K,而 bili 认的窗口是 750K,所以只用了 ~29%,而且第 5 轮之后基本不再往上长(一条平线)。
    • 46 次请求、输入累计 8.8M token,但一次都没折叠过(“尚无折叠事件”、压缩节省是空的)。

    二、根本原因
    bili 决定“要不要让模型去压”主要看两点:

    1. 上下文还在持续变长——每比上次多涨一大截(几万 token 级别,且确实有足够旧的內容可压)就提醒一次;
    2. 已经快满了——占到窗口的 ~75% 以上,就进“高压模式”,不管涨没涨都会压。

    你这两条现在都不满足:

    • ZCode 会把发出去的上下文摁在 ~200K 不放(它自己做了截断/管理),所以“还在变长”这个条件在会话热起来之后就不再成立了;
    • 而 200K 只占 750K 的 29%,离“快满(≥75%)”差得很远,兜底那条也够不着。

    结果就是:会话热起来之后,bili 基本不再主动让模型去压 → 全程没有折叠。
    对比一下就清楚:DSH / Opencode 的历史是一路往上涨的(它们不自己截断),所以反复跨过那条线、看着一直在压;DSH 还自带自己的压缩器。ZCode 把自己摁在 ~200K,正好落进上面的盲区。

    再叠一层:你这个会话的上游是 infistar.cc(一个中转),bili 是按中转报出来的 750K 当窗口算的,可你实际每次只发 ~200K。“窗口被算大了 + 内容又不长”两头夹着,占比就一直上不去。

    三、怎么让它压起来(大概率改个配置就行,不用动代码)
    核心思路:别让 bili 用中转报的 750K,改成按你真实的用量来算窗口。把 bili 用的“上下文窗口”调到你实际的量级(你最大看到 ~220K),设成 ~250K–256K 左右,这样 ~200K 就变成占 ~80%,会直接进“高压模式”,bili 就会主动压了。
    对应的配置项是 compress.modelContextLimit(或者按模型写 models.<模型名>.context)。

    为了把数值和放在哪一层定准(你是原生 MCP 接入,放错位置不生效),麻烦回我两个问题:

    1. infistar.cc 后面接的到底是哪个模型?(GLM-4.x?还是别的)
    2. ZCode 自己显示的那个上下文占用,平时最高能到多少 / 它的上限是多少?

    回完我给你一段可以直接粘进去的配置。

    四、还有次要一层,想顺手确认一下
    就算 bili 提醒了模型,也得模型真的去调用那个 compress 工具才会真正压。你这 46 次一次都没成,除了上面的“触发盲区”,也可能叠加了“模型没响应提醒”。
    面板上有 「查看该会话的日志」 入口,麻烦点开后,把里面含 nudge 的那几行贴给我(重点看有没有类似 growth … < floor … 或 max compressible … < threshold … 的字样)。有这几行我就能 100% 分清到底是“压根没触发”还是“触发了但模型没动手”。

    标签维持 bug / zcode / scope/wiring / p2 不变(能用、只是该压不压,属于明显问题但不至于不能用)。

  6. noname-nikke commented on Oct 22, 2026

    @noname-nikke
    Author

    🤖 Powered by ework · qwen3.8-27b

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

    面板我打开看了,数字都在,谢谢!这下基本能定位了——不是坏了,是你的用法刚好落在 bili「触发压缩」的盲区里。说下为什么,以及怎么让它压起来。

    一、你这张面板说明的事

    • 会话是稳的(单会话、缓存命中 97%)→ 我之前怀疑的“每轮被当成新会话”那个方向可以排除。
    • 上下文一直卡在 ~200K,而 bili 认的窗口是 750K,所以只用了 ~29%,而且第 5 轮之后基本不再往上长(一条平线)。
    • 46 次请求、输入累计 8.8M token,但一次都没折叠过(“尚无折叠事件”、压缩节省是空的)。

    二、根本原因 bili 决定“要不要让模型去压”主要看两点:

    1. 上下文还在持续变长——每比上次多涨一大截(几万 token 级别,且确实有足够旧的內容可压)就提醒一次;
    2. 已经快满了——占到窗口的 ~75% 以上,就进“高压模式”,不管涨没涨都会压。

    你这两条现在都不满足:

    • ZCode 会把发出去的上下文摁在 ~200K 不放(它自己做了截断/管理),所以“还在变长”这个条件在会话热起来之后就不再成立了;
    • 而 200K 只占 750K 的 29%,离“快满(≥75%)”差得很远,兜底那条也够不着。

    结果就是:会话热起来之后,bili 基本不再主动让模型去压 → 全程没有折叠。 对比一下就清楚:DSH / Opencode 的历史是一路往上涨的(它们不自己截断),所以反复跨过那条线、看着一直在压;DSH 还自带自己的压缩器。ZCode 把自己摁在 ~200K,正好落进上面的盲区。

    再叠一层:你这个会话的上游是 infistar.cc(一个中转),bili 是按中转报出来的 750K 当窗口算的,可你实际每次只发 ~200K。“窗口被算大了 + 内容又不长”两头夹着,占比就一直上不去。

    三、怎么让它压起来(大概率改个配置就行,不用动代码) 核心思路:别让 bili 用中转报的 750K,改成按你真实的用量来算窗口。把 bili 用的“上下文窗口”调到你实际的量级(你最大看到 ~220K),设成 ~250K–256K 左右,这样 ~200K 就变成占 ~80%,会直接进“高压模式”,bili 就会主动压了。 对应的配置项是 compress.modelContextLimit(或者按模型写 models.<模型名>.context)。

    为了把数值和放在哪一层定准(你是原生 MCP 接入,放错位置不生效),麻烦回我两个问题:

    1. infistar.cc 后面接的到底是哪个模型?(GLM-4.x?还是别的)
    2. ZCode 自己显示的那个上下文占用,平时最高能到多少 / 它的上限是多少?

    回完我给你一段可以直接粘进去的配置。

    四、还有次要一层,想顺手确认一下 就算 bili 提醒了模型,也得模型真的去调用那个 compress 工具才会真正压。你这 46 次一次都没成,除了上面的“触发盲区”,也可能叠加了“模型没响应提醒”。 面板上有 「查看该会话的日志」 入口,麻烦点开后,把里面含 nudge 的那几行贴给我(重点看有没有类似 growth … < floor … 或 max compressible … < threshold … 的字样)。有这几行我就能 100% 分清到底是“压根没触发”还是“触发了但模型没动手”。

    标签维持 bug / zcode / scope/wiring / p2 不变(能用、只是该压不压,属于明显问题但不至于不能用)。

    日志内容太多,我无法准确的找到该日志

    billion-context-full-log.txt

    billion-context-report-session_b6e8398e08b85861812aaed0b77a21f8.md

  7. ranxianglei commented on Oct 22, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    日志和报告我都逐行对了(46 次请求全部对上)。先纠正我上一条回复里的一个判断:我上次归因到“触发盲区”,其实不完全对——真正的卡点在别处。用日志说话:

    一、日志证明的事实

    1. bili 确实触发了压缩提醒,一共触发了 3 次(大约在第 2、13、33 次请求,占用 21%→24%→28%)。中间那些轮次的日志写的是 blocked: T1 (cadence)、ready: T1 1xx K——含义是“可压的内容有一大堆(十几万 token),只是按节奏等上下文再多涨一点再提醒”。所以触发机制本身是正常的。
    2. 但模型一次都没调用 compress 工具。 整份日志里没有任何一次由模型发起的 compress 调用。你的模型(日志显示是 deepseek-v4.1-flash,经 infistar.cc 中转)明明会用别的工具(bash/read 之类的调用都在),就是被提醒了 3 次也没去调 compress。
    3. 关键点:bili 自己没法替你压。 它的设计是“模型来写摘要”——bili 只负责判断“该压了”并发提醒,真正生成压缩摘要、调用 compress 工具的必须是模型本身。模型不响应 → 就一直压不了。这是设计使然,不是 bug。

    所以结论修正为:不是“没触发”,而是“触发了,但你这个模型不响应”。这也正好解释为什么 DSH / Opencode 看着一直在压——它们的宿主要么自己主动驱动压缩、要么自带压缩器,而不是单纯指望模型自觉。

    二、为什么模型不响应(两种可能,需要你确认一下就能定死)

    • 可能 A:compress 工具压根没送到这个模型手上。 你是原生 MCP 安装,compress 工具本应通过 bili 的 MCP 服务、以类似 mcp__bili__compress(带 bili 前缀)的名字暴露给模型。如果 ZCode 这边没把它正确挂进模型的可用工具列表,模型想压也无从下手。
    • 可能 B:工具送到了,但这个模型就是不太会/不肯照做。 deepseek-v4.1-flash(尤其经中转)对“把旧内容折叠成摘要”这类指令的执行可能不够可靠。

    怎么区分(你只需看一眼):在 ZCode 里看一下当前会话模型可用工具列表中,有没有一个叫 compress 或 mcp__bili__compress(或带 bili 字样)的工具?

    • 没有 → 是可能 A(工具没挂上),属接线问题,我来帮你查/修,必要时立项跟进;
    • 有,但就是不压 → 是可能 B(模型行为),更实际的解法是换一个工具调用更听话的模型试试。

    三、顺带收回我上条的一个建议:我之前说“把窗口调小就能让它压”——在你这儿没用。因为真正的卡点是“模型不调工具”,不是“触发阈值没到”;就算把窗口调小让 bili 每轮都提醒,模型照样不理,还是压不了。所以先不用动窗口配置。

    标签维持 bug / zcode / scope/wiring / p2 不变(等你确认完可能是模型行为的话,我再调整)。麻烦你先回我第二点那个“工具列表里有没有 compress”,我就能定死是接线问题还是模型问题,再给你对应的准确修法。

  8. noname-nikke commented on Oct 23, 2026

    @noname-nikke
    Author

    🤖 Powered by ework · qwen3.8-27b

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

    日志和报告我都逐行对了(46 次请求全部对上)。先纠正我上一条回复里的一个判断:我上次归因到“触发盲区”,其实不完全对——真正的卡点在别处。用日志说话:

    一、日志证明的事实

    1. bili 确实触发了压缩提醒,一共触发了 3 次(大约在第 2、13、33 次请求,占用 21%→24%→28%)。中间那些轮次的日志写的是 blocked: T1 (cadence)、ready: T1 1xx K——含义是“可压的内容有一大堆(十几万 token),只是按节奏等上下文再多涨一点再提醒”。所以触发机制本身是正常的。
    2. 但模型一次都没调用 compress 工具。 整份日志里没有任何一次由模型发起的 compress 调用。你的模型(日志显示是 deepseek-v4.1-flash,经 infistar.cc 中转)明明会用别的工具(bash/read 之类的调用都在),就是被提醒了 3 次也没去调 compress。
    3. 关键点:bili 自己没法替你压。 它的设计是“模型来写摘要”——bili 只负责判断“该压了”并发提醒,真正生成压缩摘要、调用 compress 工具的必须是模型本身。模型不响应 → 就一直压不了。这是设计使然,不是 bug。

    所以结论修正为:不是“没触发”,而是“触发了,但你这个模型不响应”。这也正好解释为什么 DSH / Opencode 看着一直在压——它们的宿主要么自己主动驱动压缩、要么自带压缩器,而不是单纯指望模型自觉。

    二、为什么模型不响应(两种可能,需要你确认一下就能定死)

    • 可能 A:compress 工具压根没送到这个模型手上。 你是原生 MCP 安装,compress 工具本应通过 bili 的 MCP 服务、以类似 mcp__bili__compress(带 bili 前缀)的名字暴露给模型。如果 ZCode 这边没把它正确挂进模型的可用工具列表,模型想压也无从下手。
    • 可能 B:工具送到了,但这个模型就是不太会/不肯照做。 deepseek-v4.1-flash(尤其经中转)对“把旧内容折叠成摘要”这类指令的执行可能不够可靠。

    怎么区分(你只需看一眼):在 ZCode 里看一下当前会话模型可用工具列表中,有没有一个叫 compress 或 mcp__bili__compress(或带 bili 字样)的工具?

    • 没有 → 是可能 A(工具没挂上),属接线问题,我来帮你查/修,必要时立项跟进;
    • 有,但就是不压 → 是可能 B(模型行为),更实际的解法是换一个工具调用更听话的模型试试。

    三、顺带收回我上条的一个建议:我之前说“把窗口调小就能让它压”——在你这儿没用。因为真正的卡点是“模型不调工具”,不是“触发阈值没到”;就算把窗口调小让 bili 每轮都提醒,模型照样不理,还是压不了。所以先不用动窗口配置。

    标签维持 bug / zcode / scope/wiring / p2 不变(等你确认完可能是模型行为的话,我再调整)。麻烦你先回我第二点那个“工具列表里有没有 compress”,我就能定死是接线问题还是模型问题,再给你对应的准确修法。

    zcode没有地方可以查看当前会话的模型可用工具列表,但是我mcp是加载了bili的,安装也是默认的,url地址http://127.0.0.1:18788/bili/https://infistar.cc/v1是这个

    Image Image
  9. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    谢谢,两张截图很有用——我据此把整条链路都核对了,现在给你一个确定的结论。

    一、你的安装完全正常(已确认,接线没问题)
    从截图看:bili 的 MCP 服务是「stdio」类型、状态已连接(绿点)+ 开启。我又翻了 bili 代码确认:这个 MCP 服务会把 bili 的压缩工具 compress 原样提供给模型;而你日志里出现的 [plugin] 标记也证明启动时工具清单校验是通过的。所以——compress 工具确实送到了你模型手上,之前怀疑的“工具没挂上”可以彻底排除。

    二、真正的结论:工具送到了、也提醒了,但你的模型就是没去调用它
    把日志和代码合起来看,事实链很清晰:

    1. bili 提醒了模型 3 次去压缩(占用 21%→24%→28% 时各一次);
    2. 这 3 次提醒里,模型一次都没有调用 compress 工具(整份日志 0 次,但它明明会用 bash/read 之类的其它工具);
    3. 关键:bili 的设计是**“模型自己写摘要”**——它只能判断“该压了”并发提醒,真正动手压缩必须靠模型调用 compress 工具并写出摘要。模型不调用,bili 就压不了,这是设计使然,不是 bug。

    一句话:不是没触发、也不是没给工具,而是你这个模型(deepseek-v4.1-flash,经 infistar.cc 中转)没有理会压缩提醒。 不同模型对这种“管理自己上下文”的指令执行差别很大——DSH / Opencode 看着一直在压,是因为它们的宿主要么主动驱动压缩、要么自带压缩器,不单纯指望模型自觉;ZCode 走 MCP 这条路则完全依赖模型自愿响应。

    三、你能怎么做(实际有效的办法)

    1. 换一个会“自觉管上下文”的模型——这是最关键的杠杆。选一个 function-calling 可靠、愿意执行系统指令的模型试试;换完如果 compress 开始被调用、面板开始出现“折叠事件”,就验证了这个判断。
    2. 顺带说清预期:就算换了听话的模型,你这个会话上下文一直压在 ~200K、涨得又慢,所以压缩也不会每轮都发生,而是到该压的时候才压(比如接近窗口上限)。这是正常的“按需压缩”,不是不工作。
    3. 不用改任何配置(包括我之前提过的调小窗口,在你这儿都没必要)。

    四、一个可能的改进(供项目方参考,非当前必做)
    这类情况目前是“静默”的——模型不理提醒,用户只能翻日志才发现。可以考虑让 bili 在面板上加个提示:当“模型连续多次收到压缩提醒却一次都没执行”时,明确提示“你的模型可能不支持/未响应压缩工具”,这样小白用户不用翻日志就能定位。这是我建议的一个后续改进点,是否立项由项目方定;如果你也需要,我可以单独开一个跟进项。

    标签我把领域从 scope/wiring(接线)改成了 scope/other——因为接线已确认是好的,根因在模型行为,不属于接线问题;bug / zcode / p2 维持不变。

  10. noname-nikke commented on Oct 23, 2026

    @noname-nikke
    Author

    🤖 Powered by ework · qwen3.8-27b

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

    谢谢,两张截图很有用——我据此把整条链路都核对了,现在给你一个确定的结论。

    一、你的安装完全正常(已确认,接线没问题) 从截图看:bili 的 MCP 服务是「stdio」类型、状态已连接(绿点)+ 开启。我又翻了 bili 代码确认:这个 MCP 服务会把 bili 的压缩工具 compress 原样提供给模型;而你日志里出现的 [plugin] 标记也证明启动时工具清单校验是通过的。所以——compress 工具确实送到了你模型手上,之前怀疑的“工具没挂上”可以彻底排除。

    二、真正的结论:工具送到了、也提醒了,但你的模型就是没去调用它 把日志和代码合起来看,事实链很清晰:

    1. bili 提醒了模型 3 次去压缩(占用 21%→24%→28% 时各一次);
    2. 这 3 次提醒里,模型一次都没有调用 compress 工具(整份日志 0 次,但它明明会用 bash/read 之类的其它工具);
    3. 关键:bili 的设计是**“模型自己写摘要”**——它只能判断“该压了”并发提醒,真正动手压缩必须靠模型调用 compress 工具并写出摘要。模型不调用,bili 就压不了,这是设计使然,不是 bug。

    一句话:不是没触发、也不是没给工具,而是你这个模型(deepseek-v4.1-flash,经 infistar.cc 中转)没有理会压缩提醒。 不同模型对这种“管理自己上下文”的指令执行差别很大——DSH / Opencode 看着一直在压,是因为它们的宿主要么主动驱动压缩、要么自带压缩器,不单纯指望模型自觉;ZCode 走 MCP 这条路则完全依赖模型自愿响应。

    三、你能怎么做(实际有效的办法)

    1. 换一个会“自觉管上下文”的模型——这是最关键的杠杆。选一个 function-calling 可靠、愿意执行系统指令的模型试试;换完如果 compress 开始被调用、面板开始出现“折叠事件”,就验证了这个判断。
    2. 顺带说清预期:就算换了听话的模型,你这个会话上下文一直压在 ~200K、涨得又慢,所以压缩也不会每轮都发生,而是到该压的时候才压(比如接近窗口上限)。这是正常的“按需压缩”,不是不工作。
    3. 不用改任何配置(包括我之前提过的调小窗口,在你这儿都没必要)。

    四、一个可能的改进(供项目方参考,非当前必做) 这类情况目前是“静默”的——模型不理提醒,用户只能翻日志才发现。可以考虑让 bili 在面板上加个提示:当“模型连续多次收到压缩提醒却一次都没执行”时,明确提示“你的模型可能不支持/未响应压缩工具”,这样小白用户不用翻日志就能定位。这是我建议的一个后续改进点,是否立项由项目方定;如果你也需要,我可以单独开一个跟进项。

    标签我把领域从 scope/wiring(接线)改成了 scope/other——因为接线已确认是好的,根因在模型行为,不属于接线问题;bug / zcode / p2 维持不变。

    但是同样的配置、同样的模型,在 Opencode 和 DSH 当中是可以实现由bili压缩的

  11. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    谢谢,这条信息很关键——它推翻了我上一条的一个说法。你说得对:同一个模型在 Opencode / DSH 能压、在 ZCode 不压,就说明不是这个模型天生不会压。我重新翻了三个客户端各自的压缩接入代码,差异确实存在,而且能说清楚:

    一、三个客户端“怎么把压缩交给模型”根本不一样(已核对代码)

    • DSH:自带一个客户端自己的压缩器(代码里 compactsClientSide)。它的压缩是 DSH 自己做的,压根不依赖模型去调工具。所以无论什么模型都能压——这也是它最稳的原因。
    • Opencode:通过插件把 compress 注册成原生工具(native tool),直接挂进 opencode 自己的 agent 循环里,并且带一个稳定的会话 id。模型在这套深度集成的环境里调工具非常顺。所以你这个模型在 Opencode 里能压。
    • ZCode:走的是通用 MCP(stdio)桥接——compress 只是作为一个 MCP 工具暴露给模型;既没有像 Opencode 那样的原生工具集成和稳定会话 id,也没有像 DSH 那样的自带压缩器。它完全依赖模型“自愿”去调那个 MCP compress 工具。deepseek-v4.1-flash(经中转)在这种“松耦合 MCP 工具 + 泛用系统提示”的组合下,就是不太会主动去调它。

    二、所以准确的结论
    不是你的错,也不是配置写错了,而是:ZCode 这条车道的压缩接入比 Opencode / DSH 更“松”,恰好你这个模型只在更紧的集成下才肯动手。 我上一条把“换模型”说成唯一解法,这个说法收回——换模型是一个有效办法,但根子在于 zcode 车道的接入方式较松。

    三、你能怎么做

    1. 换一个对 MCP 工具 / 系统指令响应更积极的模型——仍然是最快的办法。
    2. 如果你希望 ZCode 也像 Opencode 那样稳,那是 zcode 车道的改进点(例如:给 zcode 也补上稳定会话 id、加强提示让模型更愿意调 MCP compress,甚至加一个不依赖模型自愿性的兜底折叠)。这些不是你现在改配置能解决的,需要项目方来做。

    四、跟进
    标签维持 bug / zcode / p2,领域保持 scope/other(本质是“客户端接入方式 + 模型交互”的差异,不是某行代码写错)。要不要我把「ZCode 车道压缩可靠性弱于 Opencode/DSH」单独立成一个改进项来跟踪?你和项目方点头我就开;不点头就留在这个反馈帖里作结论。

  12. noname-nikke commented on Oct 23, 2026

    @noname-nikke
    Author

    🤖 Powered by ework · qwen3.8-27b

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

    谢谢,这条信息很关键——它推翻了我上一条的一个说法。你说得对:同一个模型在 Opencode / DSH 能压、在 ZCode 不压,就说明不是这个模型天生不会压。我重新翻了三个客户端各自的压缩接入代码,差异确实存在,而且能说清楚:

    一、三个客户端“怎么把压缩交给模型”根本不一样(已核对代码)

    • DSH:自带一个客户端自己的压缩器(代码里 compactsClientSide)。它的压缩是 DSH 自己做的,压根不依赖模型去调工具。所以无论什么模型都能压——这也是它最稳的原因。
    • Opencode:通过插件把 compress 注册成原生工具(native tool),直接挂进 opencode 自己的 agent 循环里,并且带一个稳定的会话 id。模型在这套深度集成的环境里调工具非常顺。所以你这个模型在 Opencode 里能压。
    • ZCode:走的是通用 MCP(stdio)桥接——compress 只是作为一个 MCP 工具暴露给模型;既没有像 Opencode 那样的原生工具集成和稳定会话 id,也没有像 DSH 那样的自带压缩器。它完全依赖模型“自愿”去调那个 MCP compress 工具。deepseek-v4.1-flash(经中转)在这种“松耦合 MCP 工具 + 泛用系统提示”的组合下,就是不太会主动去调它。

    二、所以准确的结论 不是你的错,也不是配置写错了,而是:ZCode 这条车道的压缩接入比 Opencode / DSH 更“松”,恰好你这个模型只在更紧的集成下才肯动手。 我上一条把“换模型”说成唯一解法,这个说法收回——换模型是一个有效办法,但根子在于 zcode 车道的接入方式较松。

    三、你能怎么做

    1. 换一个对 MCP 工具 / 系统指令响应更积极的模型——仍然是最快的办法。
    2. 如果你希望 ZCode 也像 Opencode 那样稳,那是 zcode 车道的改进点(例如:给 zcode 也补上稳定会话 id、加强提示让模型更愿意调 MCP compress,甚至加一个不依赖模型自愿性的兜底折叠)。这些不是你现在改配置能解决的,需要项目方来做。

    四、跟进 标签维持 bug / zcode / p2,领域保持 scope/other(本质是“客户端接入方式 + 模型交互”的差异,不是某行代码写错)。要不要我把「ZCode 车道压缩可靠性弱于 Opencode/DSH」单独立成一个改进项来跟踪?你和项目方点头我就开;不点头就留在这个反馈帖里作结论。

    我觉得可以

  13. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    ework不要胡说 直觉之zcode看不到压缩工具或者看不到注入了 检查并复现这一个 http 代理模式

  14. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    按你说的复现了 http 代理模式。你说得对,我收回上一条“模型不听话”的判断——根因是接线:zcode 默认(native/MCP)安装下,模型根本收不到 compress 工具,却仍被注入“去调用 compress”的提示。所以它压不了。

    一、复现结果(真实 bili,等价你跑的 v0.1.204)
    用真实代理 + 假上游抓出站请求,两组对比:

    场景 出站 tools[] 系统提示
    A|纯 http 代理(不带 x-bili-plugin 头) compress, decompress, search_context, acp_status, acp_cache, acp_read_original_image(6 个) 11475 字符
    B|native/plugin(带 x-bili-plugin:zcode,zcode 默认安装会打这个头) [](0 个工具) 仍是 11475 字符

    代码根因:src/server/prepare-openai.ts:89 injectTools = shouldInject && !pluginMode —— 只要判成 plugin 模式就无条件不在线上注入工具;而 nudge / 系统提示走的是另一条判定(lane-decisions.compressSurfaceOn,对 zcode=true),照样注入。两条判定脱节 → 提示让模型调 compress,线上却没有 compress。

    二、确认用户那次就是 B 模式(不是猜)
    他日志里该会话的窗口行是 [window] model=deepseek-v4.1-flash agent=zcode …(v0.1.204,会话起始时刻)——agent=zcode 只有在请求带 x-bili-plugin: zcode 头时才会填上;且每个 turn 的用量行都带 [plugin] 前缀(只由 src/plugin.ts 的插件执行路径打,非插件路径 relay.ts:2027 没有)。两条独立证据 → 确定是 plugin 模式 = tools=[]。所以那次模型确实没拿到 compress 工具。

    三、为什么同一模型 DSH/Opencode 能压、ZCode 不能

    • DSH:自带客户端压缩器(compactsClientSide:true),不靠模型调工具;
    • Opencode:也是 plugin 模式 tools=[],但它把 compress 注册成原生工具,模型第一方 schema 里就有;
    • ZCode:也是 plugin 模式 tools=[],唯一指望 MCP 桥出来的 mcp__bili__compress。这条最弱:要么 ZCode 没把 MCP 工具挂进模型 function list,要么模型没把提示里的 “compress” 对应到 “mcp__bili__compress”。结果就是“提示让压、手里没工具”。

    四、修复方向(动的是压缩管线 / 线上 wire 形状,属人审范围,我不擅自改,等你拍板)

    • 方案1(推荐,最稳):zcode 车道在 host 没在 wire 上声明可用 compress 工具时,别完全抑制线上工具注入——入站 tools[] 既无裸 compress 也无 mcp__bili__compress 时,bili 把裸 compress 注进 wire。这样模型永远有一个可调用、且和提示/nudge 同名的 compress,bili 还能直接服务端拦截执行(比绕 MCP 干净)。
    • 方案2(最小改动,补强):把 zcode 车道的系统提示/nudge 里工具名对齐成模型实际看到的名字(mcp__bili__compress),减少名号错位。单用不够(前提是 ZCode 真把 MCP 工具给了模型),配方案1最好。
    • 方案3:保留 plugin 会话绑定(MCP 路由要用),但对 zcode 豁免“工具抑制”。效果≈方案1,只是改动点不同。

    我的建议:方案1(+可选方案2) —— 让 zcode 像 opencode/dsh 一样“模型手里一定有能用的 compress”,别把宝押在 MCP 一定送达。

    影响面 / 回归(按选项)

    • 只改 zcode 车道的出站 tools 内容;豁免条件限定在「zcode / host 未声明 compress」,dsh/opencode/pi/omp 不受影响(它们本就有原生工具或自带压缩器)。
    • 缓存:改 tools 字段会改请求前缀字节,对该会话首轮 prefix cache 一次性失效,之后稳定(属预期)。
    • 测试按 gate 双向补:host 未声明 compress → 断言 wire 上有 compress(正例);已声明 mcp__bili__compress → 不重复注入裸 compress(反例)。

    标签:根因明确后我把 scope 从 scope/other 改回 scope/wiring(工具注入与提示脱节,属接线),bug/p2/zcode 不变。若你觉得“zcode 默认安装压缩完全失效”够 p1,说一声我把严重度提上去。

    你定个方向(1/2/3 或组合),我就开修 + 补测试 + 提 PR。

  15. noname-nikke commented on Oct 23, 2026

    @noname-nikke
    Author

    14. ework不要胡说 直觉之zcode看不到压缩工具或者看不到注入了 检查并复现这一个 http 代理模式

    大佬觉得应该怎么修复呢?

  16. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    简单说,修法我已经想清楚了,给你我的判断(最终由维护者拍板,因为这动的是压缩管线):

    问题一句话:zcode 默认装法下,bili 把发给模型的 compress 工具弄丢了(tools 变成空的),却还留着“去调用 compress”的提示——提示在、工具没了,模型手里没工具,自然压不了。

    我推荐的修法(方案1):让 bili 在这种情况下别把工具丢光——只要模型那边没声明可用的 compress(既没有裸 compress、也没有 mcp__bili__compress),就把裸 compress 重新注回请求里。这样:

    • 模型手里永远有一个能调、而且和提示/nudge 同名的 compress;
    • bili 还能在服务端直接拦截执行,比绕 MCP 更干净可靠;
    • 只影响 zcode 这一条车道,DSH / Opencode / pi 等不受影响(它们本来就有可用工具或自带压缩器)。

    为什么不选别的:只是把提示里的名字改成 mcp__bili__compress(方案2)属于治标——它的前提是 ZCode 真的把 MCP 工具给了模型,而这恰恰是当前没发生的。所以要以方案1为主,最多配方案2做补强。

    现状:这是管线级改动,按项目规矩要维护者确认方向后我才动手(实现 + 双向测试 + 提 PR)。你这条反馈其实已经把根因钉死了——你那份日志正好证明那次就是“工具被丢”的模式,很关键。等维护者定了我马上开修。

    眼下想先能用上的话:最实际的临时办法是改用 Opencode / DSH 跑(它们不踩这个坑),或者换一个对 MCP 工具响应更积极的模型试试。

  17. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    @noname-nikke 争取今天发布 修复中 ework说的不对 我需要诊断根本原因

  18. noname-nikke commented on Oct 23, 2026

    @noname-nikke
    Author
  19. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    收到。我把已核实的硬事实和还悬着的关键问题分开列给你,方便你直接定位(不重复我之前的结论):

    已核实(可当事实用)

    1. 日志里的 agent= 字段就是 pluginAgentHeader(req.headers)(src/server/handle.ts:697)。所以 agent=zcode 确定代表该请求带了 x-bili-plugin: zcode 头 → bili 判成 plugin 模式。
    2. 复现(真实 bili):带 x-bili-plugin:zcode 时出站 tools=[];不带时 tools=[compress, decompress, search_context, acp_status, acp_cache, acp_read_original_image]。即 plugin 模式下线上工具被抑制(src/server/prepare-openai.ts:89 injectTools = shouldInject && !pluginMode)。
    3. 提示/nudge 让模型调的是裸名 compress(kernel 提示词通篇是 “call compress”);而 zcode 在 plugin 模式下线上没有裸 compress,唯一可能的入口是 MCP 的 mcp__bili__compress —— 存在名字错位。
    4. MCP 工具调用走 stdio,不走 http 代理。所以你给的那份 http 日志里“0 次 compress 调用”对 MCP 车道是盲区——它只能看到执行侧(真到了 bili 才会有 applyCompression 记录),看不到“模型决定去调 MCP compress”这一步。判断压没压过应以面板折叠数为准(=0)。这一点说明我之前“模型压根没调”的结论可能不完整。

    还悬着的关键问题(决定根因走向)
    ZCode 到底有没有把 mcp__bili__compress 挂进模型的 function list?

    • 没挂 → 模型手里根本没有可用 compress(接线缺口);
    • 挂了却没调 → 名字错位 / 模型行为;
    • 挂了也调了 → 那要看 MCP 执行侧为什么没产生折叠(会话绑定 / 落到错误 session 之类)。

    我能马上跑的定向实验(你点哪个就跑哪个)

    • 把复现脚本扩到“喂够 token 触发一次 nudge”,抓 plugin 模式下完整出站(tools + 全部 messages + nudge 原文),看模型那一轮到底看到什么;
    • 或针对你怀疑的某条路径单独查/复现。

    你今天发版、我配合诊断,方向你来定。

  20. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    (ai: zhipuai-lb/glm-5.3)

    修复 PR:#4372 #4344)

    按 issue 里 owner 的直觉走了「检查注入 + 工具可见性」这条线,结论和复现一致,是三个缺口叠加:

    1. 可达性判断只认裸名 —— mcp__bili__compress 视而不见(lane-decisions 观察层只匹配字面 compress);
    2. zcode 没有 host-profile 注册条目 —— 插件模式压缩提示面无条件常开,不管模型到底看不看得到工具;
    3. 提示教裸名、工具表是前缀名 —— 提示词让模型调 compress,但 zcode 的 MCP 桥给的是 mcp__bili__compress,弱模型(deepseek-v4.1-flash)对不上号就一直不调。

    修复方向采纳了 thread 里 方案2 的思路(提示侧名字映射),不采用方案1(注入裸名 compress):插件模式响应是原样透传的(relay.ts 里注释明确写了 model-emitted compress call must reach the plugin untouched),代理模式的服务端拦截(loop/core.ts isProxyToolFor)在插件会话上不运行 —— 注入裸名后模型一调就会在 zcode 里撞未知工具,等于换个方式坏。

    PR 关键点:

    • 可达性双方言识别(mcp__bili__compress 算声明了 compress,任何 lane 通用);
    • zcode 补进注册表(host-scoped、按请求观察):桥健康 → 提示面开 + 提示末尾追加一句「本宿主调 mcp__bili__compress 不是 compress」;桥断了 → 提示面静默,日志打 surface=off(no-tools) 可确诊,不再宣传一个模型调不到的工具;
    • 内核提示词零改动(kernel/ 未动),注记是宿主侧静态字符串,会话内字节稳定,不破前缀缓存;
    • 其他 lane(dsh/pi/opencode/代理模式)提示逐字节不变。

    一个诚实的保留:报告日志没记工具名,报告者当时是「桥断」还是「名字对不上」不能 100% 断定(degraded 行指向桥断概率大)。修复对两种形态都正确,发布后复测看日志(surface=off(no-tools) vs 带映射注记的提示面)即可确诊。另:桥断的根因(native routing inactive / cert-MITM)是环境侧,bili 只能做到不撒谎,恢复压缩需要把桥修好。

  21. ranxianglei commented on Oct 23, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

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

    先认账:我上一轮提的「往 plugin 模式线上重新注入裸 compress」(方案1)是错的,owner 说得对。plugin 模式下宿主自己拥有工具面、响应是逐字透传的(relay.ts:1467 / plugin.ts:2198),proxy-loop 的服务端拦截对 plugin 会话不生效——注入一个裸 compress,模型真去调它,在 zcode 侧就是个没人认领的未知工具。正确方向是提示侧的名字映射,也就是 #4372 走的路线。

    根因我独立从当前 master 逐环核过一遍(本地 checkout,v0.1.203),确认是三层叠加的接线缺陷,不是单点:

    1. src/host-profiles.ts:70 的 profile 表只有 dsh/pi/omp/opencode,没有 zcode → zcode 落到 ANONYMOUS 默认(toolsHostScopedByDefault:false,认为工具天然可见);
    2. src/server/lane-decisions.ts:245 的可达性判定因上一条而无条件为真 → bili 永远向模型广播"调 compress"(系统提示 + nudge),不管模型手里到底有没有这个工具;
    3. 可达性检查(session-self-heal.ts:246)只认裸名 compress,不认 mcp__bili__compress,而 zcode 经 MCP 桥暴露的恰恰是后者。

    净效果:模型被要求调 compress,但它工具表里要么是 mcp__bili__compress(弱模型如 deepseek-v4.1-flash 对不上号),要么什么都没有(MCP 桥 degraded/idle 时是空工具列表,mcp-entry.ts:173)。于是 nudge 一直挂、折叠恒为 0。DSH 正常(自带客户端压缩器)、Opencode 正常(把 compress 注册成可见原生工具)——所以只有 zcode 中招。执行链路本身没问题:e2e-plugin-grow-compress.test.ts 全程走 mcp__bili__compress → /__bili/plugin/tool 能折叠成功。

    标签: bug/zcode/scope/wiring/p2 —— 确认 scope/wiring(lane-decisions 接线缺陷)。「默认安装核心能力整体失效」其实够得着 p1 边缘,但代理仍可用、有绕行、仅 zcode 车道,维持 p2;owner 若要按严重度上调可自改。

    PR #4372 独立复审(八问):

    1. 是什么问题: ZCode 默认安装下压缩从不触发——bili 一直让模型调 compress,但模型手里没有这个工具。
    2. 什么原因: 上面三层叠加接线缺陷(无 profile → 无条件放行;可达性不识 MCP 方言;提示教裸名而线上是 mcp__bili__*)。
    3. 影响范围/严重程度: 所有走 MCP 桥的 zcode 默认安装 + 弱模型会话;该路径压缩能力完全失效(0 折叠),代理本身仍可用(上下文只增不减至窗口溢出)。
    4. 怎么修: 三处对症——给 zcode 加 host-profile(可达性改逐请求观测)、可达性识别 mcp__bili__compress、提示面追加静态映射注记("调 mcp__bili__compress 不是 compress")。并正确否决了方案1(理由见上)。
    5. 是否有回归: pi/opencode/omp/dsh/proxy 字节不变(矩阵行 + pi 真实链对照钉住);健康桥接的 zcode 会话升级时一次性前缀缓存断裂 = 版本更新固有,非版本内回归;断桥从"误导提示"变静默 + surface=off(no-tools) 日志(更诚实)。
    6. 是否破坏缓存: 注记随会话内稳定工具表字节稳定;仅中途桥接状态变化断一行,与既有 surface 标志同一已接受风险类。
    7. 是否改设计方向: 否,复用既有 host-profile + lane-decisions + 观测式可达性框架,只是把 zcode 纳入并补 MCP 方言识别。
    8. 是否引新配置: 无新 env/config,纯代码行为修正。

    测试:新增 tests/issue4344-mcp-dialect.test.ts(双向断言齐全:该触发才触发、不该触发不触发 + 真实 startServer 链:带桥/无桥/pi 对照),矩阵 86→91 行。CI 当前 gate 全绿/排队中、e2e 车道跳过(env 门控,正常),未见红。

    一处诚实残留(PR 自己也标了):报告者日志没记工具名,无法 100% 断定他当时是"桥断了"还是"名字对不上"(degraded 日志指向桥断更可能)。修复对两种形态都正确——发布后看日志即可确诊:出现 surface=off(no-tools) = 桥没起来(要修桥);提示面带映射注记 = 桥通了、名字已对齐(应当开始折叠)。

    相邻遗留(超本 issue 范围,建议后续单独开):claude-code/kimi 同样缺 profile 条目,存在同类"无条件放行"潜在缺陷;#4372 只给了它们映射注记、没加 profile。已有 session-self-heal 兜底,不急。

    结论:根因成立、修法对症、无实质回归、测试有牙 → 可合入(待 CI 全绿)。今天发布可行。

  22. added a commit that references this issue on Oct 23, 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

    Labels

    bugSomething isn't workingp2scope/otherscope/wiringzcode改动范围:内核之外的主机侧接线(src/agent 适配器、server 路由、注入拦截)/范围兜底/客户端标签

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions