Skip to content

fix(acp): emit standard context usage updates - #8528

Merged
wenshao merged 2 commits into
QwenLM:mainfrom
zjunothing:fix/issue-8513-acp-usage-update
Aug 8, 2026
Merged

fix(acp): emit standard context usage updates#8528
wenshao merged 2 commits into
QwenLM:mainfrom
zjunothing:fix/issue-8513-acp-usage-update

Conversation

@zjunothing

Copy link
Copy Markdown
Collaborator

What this PR does

This PR emits the standard ACP usage_update notification after each live main-session model round. used reports the latest prompt context occupancy (falling back to the provider's total token count when prompt usage is absent), while size comes from the active model's configured context window.

The existing Qwen-specific agent_message_chunk._meta.usage notification remains unchanged for current consumers. History replay, unresolved/invalid usage values, and subagent model rounds do not emit the standard frame, so they cannot overwrite the parent session's live context indicator.

It also adds deterministic direct-ACP and bridge coverage and documents context usage as a JetBrains integration feature.

Why it's needed

ACP clients such as JetBrains AI Assistant render context-window occupancy from the standard usage_update notification. Qwen Code previously exposed token counts only through a private _meta.usage extension, so those clients could not display the indicator even though Qwen already had the required per-round token count and context-window size.

Reviewer Test Plan

How to verify

  1. Run npx vitest run packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts; all 28 tests should pass, including non-cumulative occupancy, replay/subagent exclusion, provider fallback, and unresolved-model handling.
  2. Run npx vitest run packages/cli/src/acp-integration; all 1,216 ACP tests should pass.
  3. Run npm test --workspace @qwen-code/acp-bridge -- --run src/bridge.test.ts -t "publishes ACP usage updates"; the standard payload should be forwarded unchanged.
  4. Run npm run build && npm run bundle, then env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/acp-integration.test.ts -t "receives private usage metadata and standard ACP usage updates". This starts the bundled dist/cli.js --acp child, a local OpenAI-compatible HTTP server, and a real ACP JSON-RPC session; it should receive both the private usage frame and { "sessionUpdate": "usage_update", "used": 321, "size": 128000 }.

Evidence (Before & After)

Before: the regression test observed no standard frames (expected [] to deeply equal [...]).

After: the real bundled ACP subprocess test receives { "sessionUpdate": "usage_update", "used": 321, "size": 128000 }, and verifies the private frame still reports the same input-token count.

No screenshot is attached: this patch changes ACP wire output rather than Qwen-rendered UI, and JetBrains was unavailable in the local environment. The deterministic full-bundle subprocess assertion is the direct evidence for the client-visible protocol behavior.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

Environment (optional)

macOS 26.3.2 arm64, Node.js v22.23.2, npm 10.9.8, no sandbox, deterministic local OpenAI-compatible fixture.

Risk & Scope

  • Main risk or tradeoff: ACP clients receive one additional standard notification after each live main-session model round; clients that ignore usage_update remain unaffected.
  • Not validated / out of scope: the JetBrains UI itself, Windows/Linux execution, cost reporting, and replay-time context restoration.
  • Breaking changes / migration notes: none; the existing private usage metadata is preserved.

Linked Issues

Fixes #8513

中文说明

本 PR 的改动

本 PR 会在主会话每一轮实时模型调用结束后发送 ACP 标准的 usage_update 通知。used 表示最新一轮 prompt 的上下文占用量(若提供方未返回 prompt 用量,则回退到其总 token 数),size 来自当前模型配置的上下文窗口大小。

现有供当前消费者使用的 Qwen 私有 agent_message_chunk._meta.usage 通知保持不变。历史回放、无法解析或非法的用量值,以及子 agent 模型轮次都不会发送标准帧,因此不会覆盖父会话的实时上下文指示器。

同时新增了确定性的 ACP 直连与 bridge 覆盖,并在 JetBrains 集成文档中记录上下文用量功能。

为什么需要

JetBrains AI Assistant 等 ACP 客户端通过标准 usage_update 通知渲染上下文窗口占用。Qwen Code 之前只通过私有 _meta.usage 扩展暴露 token 数,因此即使内部已有每轮 token 数和上下文窗口大小,这些客户端也无法显示指示器。

审查者测试计划

验证方法

  1. 运行 npx vitest run packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts;28 个测试应全部通过,其中包括非累计占用、排除历史回放/子 agent、提供方回退以及模型尚未解析时的处理。
  2. 运行 npx vitest run packages/cli/src/acp-integration;1,216 个 ACP 测试应全部通过。
  3. 运行 npm test --workspace @qwen-code/acp-bridge -- --run src/bridge.test.ts -t "publishes ACP usage updates";标准载荷应原样转发。
  4. 运行 npm run build && npm run bundle,再运行 env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/acp-integration.test.ts -t "receives private usage metadata and standard ACP usage updates"。该测试会启动打包后的 dist/cli.js --acp 子进程、本地 OpenAI 兼容 HTTP 服务器以及真实 ACP JSON-RPC 会话;应同时收到私有用量帧和 { "sessionUpdate": "usage_update", "used": 321, "size": 128000 }

证据(修复前与修复后)

修复前:回归测试未观察到任何标准帧(expected [] to deeply equal [...])。

修复后:真实打包 ACP 子进程测试收到 { "sessionUpdate": "usage_update", "used": 321, "size": 128000 },并验证私有帧仍报告相同的输入 token 数。

未附截图:此补丁改变的是 ACP 线协议输出,而非 Qwen 自身渲染的 UI,并且本地环境没有 JetBrains。确定性的完整打包子进程断言是客户端可见协议行为的直接证据。

测试平台

操作系统 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS 26.3.2 arm64、Node.js v22.23.2、npm 10.9.8、未启用 sandbox、确定性的本地 OpenAI 兼容测试夹具。

风险与范围

  • 主要风险或权衡:主会话每轮实时模型调用后,ACP 客户端会额外收到一条标准通知;忽略 usage_update 的客户端不受影响。
  • 未验证/范围外:JetBrains UI 本身、Windows/Linux 执行、费用报告以及回放时的上下文恢复。
  • 破坏性变更/迁移说明:无;现有私有用量元数据得到保留。

关联 Issue

Fixes #8513

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finished — CI landed green on 292f6a0 and the deferred approval was posted. finalize run

Qwen Triage 已完成 —— 292f6a0 的 CI 全绿,延迟审批已提交。查看 finalize 运行

@zjunothing

Copy link
Copy Markdown
Collaborator Author

Verification report

Environment

  • macOS 26.3.2 (arm64)
  • Node.js v22.23.2, npm 10.9.8
  • Qwen Code built from PR commit 292f6a0ee
  • Real ACP JSON-RPC subprocess over stdio, backed by a deterministic local OpenAI-compatible HTTP fixture

Reproduction and result

On unmodified upstream/main (8566385a6), the focused regression test failed because MessageEmitter produced no standard frames: expected [] to deeply equal [{ sessionUpdate: "usage_update", ... }].

After the fix, a compiled and bundled dist/cli.js --acp child was initialized and authenticated, a real ACP session was created, and session/prompt was sent. The provider fixture reported 321 prompt tokens with a configured 128,000-token context window. The client received:

{
  "sessionUpdate": "usage_update",
  "used": 321,
  "size": 128000
}

The same integration run confirmed that the existing agent_message_chunk._meta.usage frame remains present and carries the matching input-token count.

Boundary coverage confirms that usage is per-round rather than cumulative, total tokens are used only when prompt tokens are absent, and replay/subagent/unresolved-model frames do not overwrite the main live session indicator.

Tests executed

  • npx vitest run packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts — PASS, 28/28
  • npx vitest run packages/cli/src/acp-integration — PASS, 1,216/1,216 across 26 files
  • npm test --workspace @qwen-code/acp-bridge -- --run src/bridge.test.ts -t "publishes ACP usage updates" — PASS, 1/1 focused bridge test
  • npm run typecheck --workspace packages/cli — PASS
  • npm run typecheck --workspace packages/acp-bridge — PASS
  • npx eslint packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts packages/acp-bridge/src/bridge.test.ts integration-tests/cli/acp-integration.test.ts — PASS
  • npx prettier --check packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts packages/acp-bridge/src/bridge.test.ts integration-tests/cli/acp-integration.test.ts docs/users/integration-jetbrains.md — PASS
  • git diff --check — PASS
  • npm run build — PASS (full repository build)
  • npm run bundle && env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/acp-integration.test.ts -t "receives private usage metadata and standard ACP usage updates" — PASS, 1/1 full-bundle ACP subprocess test

Evidence

The deterministic full-bundle subprocess result above is the direct, repeatable wire-level evidence. The focused bridge test also sends { used: 42, size: 128000 } through an in-memory ACP connection and asserts that subscribers receive it unchanged.

No screenshot is attached. This is an ACP protocol-frame emission change rather than a Qwen-rendered UI change, and JetBrains was unavailable in the local test environment. A JetBrains screenshot would therefore not be reproducible here; the real subprocess protocol assertion directly validates the behavior JetBrains consumes.

中文验证报告

验证报告

环境

  • macOS 26.3.2(arm64)
  • Node.js v22.23.2、npm 10.9.8
  • Qwen Code 基于 PR 提交 292f6a0ee 构建
  • 通过 stdio 运行真实 ACP JSON-RPC 子进程,并使用确定性的本地 OpenAI 兼容 HTTP 测试夹具

复现与结果

在未修改的 upstream/main8566385a6)上,聚焦回归测试失败,因为 MessageEmitter 没有产生任何标准帧:expected [] to deeply equal [{ sessionUpdate: "usage_update", ... }]

修复后,测试初始化并认证了编译、打包后的 dist/cli.js --acp 子进程,创建真实 ACP 会话并发送 session/prompt。提供方测试夹具报告 321 个 prompt token,配置的上下文窗口为 128,000 token。客户端收到:

{
  "sessionUpdate": "usage_update",
  "used": 321,
  "size": 128000
}

同一次集成测试还确认,现有 agent_message_chunk._meta.usage 帧仍然存在,并携带一致的输入 token 数。

边界覆盖确认:用量按轮次报告而非累计;仅当 prompt token 缺失时才回退到 total token;历史回放、子 agent 以及模型配置尚未解析的帧不会覆盖主实时会话的指示器。

已执行测试

  • npx vitest run packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts — 通过,28/28
  • npx vitest run packages/cli/src/acp-integration — 通过,26 个文件共 1,216/1,216
  • npm test --workspace @qwen-code/acp-bridge -- --run src/bridge.test.ts -t "publishes ACP usage updates" — 通过,聚焦 bridge 测试 1/1
  • npm run typecheck --workspace packages/cli — 通过
  • npm run typecheck --workspace packages/acp-bridge — 通过
  • npx eslint packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts packages/acp-bridge/src/bridge.test.ts integration-tests/cli/acp-integration.test.ts — 通过
  • npx prettier --check packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts packages/acp-bridge/src/bridge.test.ts integration-tests/cli/acp-integration.test.ts docs/users/integration-jetbrains.md — 通过
  • git diff --check — 通过
  • npm run build — 通过(完整仓库构建)
  • npm run bundle && env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/acp-integration.test.ts -t "receives private usage metadata and standard ACP usage updates" — 通过,完整打包 ACP 子进程测试 1/1

证据

上述确定性的完整打包子进程结果是直接、可重复的线协议证据。聚焦 bridge 测试还通过内存 ACP 连接发送 { used: 42, size: 128000 },并断言订阅者收到的载荷保持不变。

未附截图。此改动修复的是 ACP 协议帧发送,而非 Qwen 自身渲染的 UI,并且本地测试环境没有 JetBrains,因此无法在这里生成可复现的 JetBrains 截图;真实子进程协议断言直接验证了 JetBrains 所消费的行为。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template: complete — motivation, before/after evidence, test plan, risk & scope, and the bilingual summary are all there. ✓

Problem: real and well-documented. Linked issue #8513 observed the gap against a released build (0.21.5): JetBrains AI Assistant renders context occupancy from the standard ACP usage_update frame, and a search of the package confirmed no code path ever emitted it — only the private _meta.usage extension exists. The issue was already triaged and accepted for exploration (roadmap/ide-integration, P2), with the gap re-verified on main. This is an observed feature gap, not a theoretical concern.

Direction: aligned. ACP is a first-class integration surface for Qwen Code, usage_update is part of the standard ACP v1 schema (the bundled bridge already lists it in KNOWN_SESSION_UPDATE_TYPES), and peer agents such as codex-acp already emit it. This closes a concrete IDE-parity gap.

Size: small and honest — 35 production lines in one file (MessageEmitter.ts), 171 test lines across unit/bridge/integration layers, 1 doc line. The only production change is inside packages/cli; the acp-bridge touch is a test-only pin on existing forwarding behavior, so no core-module concerns.

Approach: the scope feels right. Emission lands exactly where the per-round usage is already reported, keeps the private frame for current consumers, and deliberately excludes replay frames, subagent rounds, and unresolved values — matching the semantics the issue requested (per-round occupancy, not cumulative). Nothing to cut.

Risk: one elevated signal — the change sits under acp-integration, a path the revert-history analysis flags as high-risk, so the code review below gives it full depth and the approval is gated on the PR's own CI evidence.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板:完整——动机、before/after 证据、测试计划、风险范围与双语总结齐备。✓

问题:真实且记录充分。关联 issue #8513 在正式发布版本(0.21.5)上观测到此缺口:JetBrains AI Assistant 通过 ACP 标准 usage_update 帧渲染上下文占用,而包内搜索确认没有任何代码路径发送过该帧——此前只有私有 _meta.usage 扩展。该 issue 已被 triage 接受为可探索方向(roadmap/ide-integration、P2),并在 main 上复核确认缺口仍在。这是已观测到的功能缺口,不是理论性问题。

方向:对齐。ACP 是 Qwen Code 的一等集成面,usage_update 是 ACP v1 标准 schema 的一部分(内置 bridge 早已将其列入 KNOWN_SESSION_UPDATE_TYPES),codex-acp 等同类 agent 也早已发送该帧。本 PR 补齐了一个具体的 IDE 体验差距。

规模:小而实在——单文件 35 行生产代码(MessageEmitter.ts),171 行测试覆盖单元/bridge/集成三层,1 行文档。唯一的生产改动位于 packages/cli 内;acp-bridge 的改动只是对既有转发行为的测试固化,无核心模块风险。

方案:范围合理。发送点恰好落在每轮用量既有的上报位置,保留了供现有消费者使用的私有帧,并明确排除历史回放、子 agent 轮次与未解析的用量值——符合 issue 要求的语义(按轮次的占用量,而非累计值)。没有可砍的部分。

风险:有一个升级信号——改动位于 revert 历史分析标记为高风险的 acp-integration 路径,因此下方的代码审查按完整深度进行,且 approve 以 PR 自身 CI 证据为门槛。

进入代码审查。🔍

Qwen Code · qwen3.8-max

Reviewed at 292f6a0ee0add64bf0c46ffffc9fac34f3f388a3 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Code review

I read the diff against the issue and the surrounding code, and this lands exactly where it should: emitUsageMetadata is already the single choke point where every model round's usage flows through, so the standard frame is emitted right next to the private _meta.usage one. Things I verified statically rather than taking on faith:

  • Live-vs-replay guard is correct. The base code already documents that a live round is discriminated by a present durationMs (replay frames omit it) — the new !Number.isFinite(durationMs) check reuses that invariant and is slightly stricter (rejects NaN/Infinity) than the neighbouring check. All four production call sites pass a real Date.now() duration; the only subagentMeta caller is the SubAgentTracker, so subagent rounds and /resume replays cannot overwrite the parent session's indicator, as claimed.
  • Skip semantics match the reference implementation. used falls back to totalTokenCount only when prompt tokens are absent, and the frame is dropped entirely when either value is unresolved or size <= 0 — same shape as codex-acp, and consistent with this file's existing NaN-discipline.
  • No plumbing needed. usage_update is already in the bridge's KNOWN_SESSION_UPDATE_TYPES, and the bridge forwards session updates generically — the repurposed bridge test pins that forwarding for this frame type specifically (other update types remain covered across the rest of that suite).
  • Existing test adaptations are legitimate, not weakened. An emit now produces two frames, so toHaveBeenLastCalledWith had to become filtered assertions; the original intent (apiErrors/apiRetries stamped on the private frame, then drained) is preserved.
  • Test infra is reused, not added: the integration test leans on the existing startFakeOpenAIServer (which already supports deterministic usage) and TestRig settings injection, giving a fully deterministic used: 321, size: 128000 oracle.

No critical findings; the production change is 35 lines and every one of them serves the stated goal.

sequenceDiagram
    participant P1 as Session model round
    participant P2 as MessageEmitter
    participant P3 as ACP stream
    participant P4 as ACP client (JetBrains)
    P1->>P2: emitUsageMetadata - usage, durationMs
    P2->>P3: private agent_message_chunk _meta.usage
    alt live main round and window resolved
        P2->>P3: standard usage_update - used, size
        P3->>P4: renders context occupancy
    else replay, subagent or unresolved values
        P2-->>P3: no standard frame emitted
    end
Loading
Files changed (5)
File What changed
packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts Emits the standard usage_update frame after live main-session rounds only
packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts New coverage for occupancy semantics, replay/subagent exclusion, fallback, unresolved window
packages/acp-bridge/src/bridge.test.ts Existing forwarding test repurposed to pin usage_update passing through unchanged
integration-tests/cli/acp-integration.test.ts Full-bundle ACP subprocess test now asserts both private and standard frames against a deterministic fixture
docs/users/integration-jetbrains.md One feature-list line for context usage

Testing evidence — the PR's own CI (this run executes no PR code)

The one red check, SDK Java / ubuntu-latest / Java 11, is pre-existing infra noise, not PR-caused: its log shows actions/setup-java failing with HTTP 520 while resolving the Temurin JDK — before any repository code is built — and the diff contains zero Java changes. Its sibling jobs all landed green, including Real daemon E2E / Java 11 from the same workflow. The main Node suite is still running at the time of this snapshot; the table below will be updated automatically once CI settles.

Final CI results for 292f6a0 (auto-updated by the triage finalize job after CI completed):

Check Conclusion
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
macos-latest / Java 21 ✅ success
Real daemon E2E / Java 11 ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
windows-latest / Java 21 ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

What the signal does and doesn't cover: the emitter unit tests and the bridge test run inside the ubuntu Node suite (still pending at this snapshot). The wire-level proof — the full-bundle --acp subprocess integration test that pins { used: 321, size: 128000 } — lives in the Integration Tests job, which is merge-queue-only by design, so no PR's CI exercises it before approval.

Sandboxed verification would settle this: @qwen-code /verify — that the bundled ACP child actually puts the standard usage_update frame on the wire is pinned in-process by unit tests, but the subprocess-level integration test only runs in the merge queue, and the author's full-bundle evidence is a local macOS run.

Not verified here: real JetBrains rendering (no JetBrains in CI; the author also noted it unavailable) — the protocol-frame assertion is the closest available oracle for that.

中文说明

代码审查:改动落在了它该在的位置——emitUsageMetadata 本就是每轮模型用量唯一的汇聚点,标准帧就挨着私有 _meta.usage 一起发出。静态核实过的要点:实时/回放的判别复用了代码库既有不变量(有 durationMs 才是实时轮次,且新检查更严格地拒绝 NaN/Infinity);四个生产调用点都传入真实耗时,唯一的 subagentMeta 调用方是 SubAgentTracker,因此回放与子 agent 轮次不会覆盖父会话指示器;used/size 的跳过语义与 codex-acp 参考实现一致;bridge 的 KNOWN_SESSION_UPDATE_TYPES 早已包含 usage_update,转发是既有通用行为,测试只是把该帧类型固化下来;既有测试的改写是因为现在每次 emit 产生两帧,原断言意图未被削弱;集成测试复用了现有的确定性 fake OpenAI 服务器,没有新增基础设施。未发现阻断性问题,生产改动共 35 行且全部服务于既定目标。

测试证据:唯一红项 SDK Java / ubuntu-latest / Java 11 是基础设施噪音——日志显示 actions/setup-java 在解析 Temurin JDK 时返回 HTTP 520,发生在构建任何仓库代码之前,且本 PR 没有任何 Java 改动;同 workflow 的兄弟任务(含 Real daemon E2E)均为绿。Node 主套件在快照时仍在运行,表格会在 CI 落定后自动更新。需要注意:emitter 单测与 bridge 测试随 ubuntu Node 套件运行,而线级证据(完整打包 --acp 子进程集成测试)所在的 Integration Tests 任务按设计只在合并队列运行,任何 PR 的 CI 都不会预先执行它。

沙盒验证@qwen-code /verify 可以补齐这一环——标准帧真正上线的断言目前只有进程内单测覆盖,子进程级集成测试只进合并队列,且作者的完整打包证据是 macOS 本地运行。JetBrains 真实渲染未在 CI 中验证(环境不可用),协议帧断言是目前最接近的 oracle。

Qwen Code · qwen3.8-max

Reviewed at 292f6a0ee0add64bf0c46ffffc9fac34f3f388a3 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean, minimal, well-targeted change; the last point is CI's, not the code's: the main Node suite is still in flight at review time, and the wire-level subprocess test only runs in the merge queue.

Stepping back: this is what a good fix for #8513 looks like. My independent take before reading the diff was "emit the standard frame where the private usage already flows, guard replay and subagent rounds" — and that is exactly what landed, in 35 production lines, reusing the file's existing live-round invariant and the bridge's already-registered update type. Nothing simpler comes to mind, and nothing in the diff is beside the point: tests at three layers (unit, bridge, full-bundle subprocess) and one doc line.

The problem is genuinely observed — JetBrains AI Assistant shows no context indicator while peer agents do — and the semantics chosen are the right ones: per-round occupancy rather than a cumulative sum, fallback only when prompt tokens are absent, no frame when the window is unresolved, and replay/subagent rounds kept away from the parent session's indicator. The private Qwen frame is untouched, so existing consumers keep working.

Reservations, named plainly: the full-bundle wire assertion exists but is merge-queue-only CI-wise, so the author's local macOS run and the in-process unit coverage are the pre-merge evidence; a @qwen-code /verify run would close that gap if a maintainer wants it before merge. Real JetBrains rendering remains unverified anywhere — the protocol-frame oracle is the honest substitute.

Verdict: approve. The main suite is still running, so approval is deferred until CI lands green on this commit; if anything comes back red, the deferred approval is withheld and this status comment will say so.

中文说明

回顾全局:这正是 #8513 该有的修复形态。我在看 diff 之前的独立想法是"在私有用量既有的流动位置发出标准帧,并挡住回放与子 agent 轮次"——最终落地的正是这个方案:35 行生产代码,复用了文件里既有的实时轮次不变量和 bridge 早已注册的更新类型。想不出更简的做法,diff 里也没有任何偏离主题的内容:三层测试(单元、bridge、完整打包子进程)加一行文档。

问题是真实观测到的——JetBrains AI Assistant 不显示上下文指示器而同类 agent 可以——语义选择也是对的:按轮次的占用量而非累计值,仅在缺少 prompt token 时回退,窗口未解析时不发帧,回放/子 agent 轮次不碰父会话指示器,私有 Qwen 帧原样保留,现有消费者不受影响。

保留意见如实说:完整打包的线级断言虽然存在,但 CI 上只在合并队列运行,因此合并前的证据是作者的 macOS 本地运行加进程内单测;如果维护者希望合并前补齐,可以触发 @qwen-code /verify。JetBrains 真实渲染在任何环境都未验证,协议帧断言是诚实的替代 oracle。

结论:approve。主套件仍在运行,因此批准推迟到该提交的 CI 全绿后自动执行;若有红项,推迟的批准将被收回,并在本状态评论中说明。

Qwen Code · qwen3.8-max

Reviewed at 292f6a0ee0add64bf0c46ffffc9fac34f3f388a3 · re-run with @qwen-code /triage

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship — CI landed green after the review. ✅

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 10800 seconds (of the 180-minute budget). For large PRs, retry with a longer timeout by commenting: @qwen-code /review --timeout=360. See workflow logs.

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 7, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. This is a fork PR, so the first round comes from the next scheduled scan (usually within minutes). Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本 PR 来自 fork,首轮处理将由下一次定时扫描执行(通常几分钟内)。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 1 finishedview run. See this round's report below.

中文说明

AutoFix 第 1 轮已完成 —— 查看运行。本轮报告见下方。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix review round: no action needed.

The new feedback since the last evaluation contains no actionable findings:

  • Verification report (@zjunothing) — an end-to-end verification of the fix against a real ACP subprocess, confirming the standard usage_update frame is emitted ({ used: 321, size: 128000 }) alongside the existing private _meta.usage frame, with boundary behavior (per-round usage, total-token fallback, replay/subagent exclusion) covered. It reports no defects and requests no changes.
  • Review timeout notice (@qwen-code-ci-bot) — informational: an automated qwen review run exceeded its time budget. It names no code defect. Retrying with a longer timeout requires posting @qwen-code /review --timeout=360 as a GitHub comment, which is a maintainer action; the autofix agent has no GitHub write access. Note that the deferred triage review subsequently completed and approved the PR ("LGTM, looks ready to ship — CI landed green").

Current state: latest review is APPROVED, no unresolved inline review comments, no failed or still-red CI checks, and no base conflict (--conflict false). No code changes were made this round and nothing was committed.

中文说明

Autofix 审查轮次:无需处理。

自上次评估以来的新反馈不包含任何可执行的发现:

  • 验证报告(@zjunothing——针对真实 ACP 子进程对该修复进行的端到端验证,确认标准 usage_update 帧({ used: 321, size: 128000 })与现有的私有 _meta.usage 帧一同发出,并且边界行为(按轮次统计用量、total token 回退、排除回放/子 agent 帧)均已覆盖。该报告未发现任何缺陷,也未提出任何修改要求。
  • 审查超时通知(@qwen-code-ci-bot——信息性通知:一次自动化 qwen 审查运行超出了时间预算,未指出任何代码缺陷。如需以更长的超时重试,需要以 GitHub 评论形式发送 @qwen-code /review --timeout=360,这属于维护者操作;autofix agent 没有 GitHub 写入权限。需要说明的是,延迟执行的 triage 审查随后已完成并批准了该 PR("LGTM, looks ready to ship — CI landed green")。

当前状态:最新审查为 APPROVED,没有未解决的行内审查评论,没有失败或持续红色的 CI 检查,也没有与基础分支的冲突(--conflict false)。本轮未做任何代码修改,也没有提交任何内容。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /verify

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ incomplete — results unavailable - workflow run

The verification ran, but its result artifact could not be retrieved for publishing, so there is nothing to report here. The run log still has the agent output; re-run @qwen-code /verify for a fresh report.

中文 — 判定:⚠️ 未完成 · 结果不可用

验证已执行,但结果产物未能取回用于发布,因此此处没有可报告的内容。运行日志中仍有 agent 输出;如需完整报告请重新运行 @qwen-code /verify

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix review round: no action needed.

The new feedback since the last evaluation (2026-08-04T13:33:26Z) contains no actionable findings, so no code changes were made this round:

  • Reviews — none new. The latest review on the PR is an approval: "LGTM, looks ready to ship — CI landed green after the review. ✅"
  • Inline comments — none.
  • Issue-level comments — a maintainer issued @qwen-code /verify; the sandboxed verification it triggered is currently running and will post its own report when it completes. This is a workflow command, not feedback requesting changes. The other new comments are bot status messages (takeover engaged, round 1 report).
  • Failed / still-red checks — none; every reported check is green or intentionally skipped.

The PR remains at commit 26d2adfd6f on branch fix/issue-8513-acp-usage-update, unchanged, with no base conflict to resolve.

中文说明

Autofix 审查轮次:无需处理。

自上次评估(2026-08-04T13:33:26Z)以来的新反馈不包含任何可执行的发现,因此本轮未做任何代码改动:

  • 审查(Reviews) —— 无新增。PR 上最近一次审查为批准:"LGTM,看起来可以合入——审查后 CI 全绿。✅"
  • 行内评论(Inline comments) —— 无。
  • Issue 级评论 —— 维护者发出了 @qwen-code /verify;其触发的沙箱验证正在运行,完成后会自行发布报告。这是工作流命令,不是要求改动的反馈。其余新评论均为机器人状态消息(takeover 已接管、第 1 轮报告)。
  • 失败 / 持续失败的检查 —— 无;所有报告的检查均为绿色或被有意跳过。

PR 保持在分支 fix/issue-8513-acp-usage-update 的提交 26d2adfd6f,未发生变化,也没有需要解决的与基础分支的冲突。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification recovery: merge-ready

The sandboxed verification itself completed successfully at PR head 26d2adfd6f254f76b2cd288a70680d39011e240f: 1,612 scripted assertions passed, 0 unexpected failures. I recovered and independently audited the structured report and primary wire results from the verify job log after the publisher failed to retrieve its artifact.

中文摘要

维护者结论:可以合并(merge-ready。隔离验证本身成功完成:1,612 项脚本化断言全部通过,0 项意外失败。

  • 真实 dist/cli.js --acp + ACP JSON-RPC + 本地 OpenAI 兼容服务器的 A/B 验证中,base 发出 0 个标准 usage_update,PR head 发出 1 个 {"sessionUpdate":"usage_update","used":321,"size":128000}
  • 两侧都真实完成了 1 次模型请求,并且原有私有 _meta.usage 帧逐字节一致,说明新增标准帧没有改变现有消费者所依赖的行为。
  • 边界扫描 20/20;MessageEmitter 28/28;ACP 集成测试 1,319/1,319;bridge 1/1;真实 bundle 集成测试 11/11。
  • 7 个单点突变中 4 个被预期断言杀死。used < 0size <= 0 两个守卫尚无单元测试直接钉住,属于非阻断的覆盖完整性建议;独立边界扫描已证明其当前行为正确。
  • 原验证生成了 4 张 PNG,但 artifact 上传被包含 ? / < 的 mutation 日志文件名拒绝,上传步骤又被配置为非阻断,导致截图和原始 artifact 未保存。这是 verify lane 的发布基础设施问题,不是本 PR 的验证失败。

Load-bearing A/B evidence

The mock-free harness ran a real bundled ACP subprocess over stdio JSON-RPC (initialize → authenticate(openai) → session/new → session/prompt) against a loopback OpenAI-compatible server reporting prompt_tokens: 321, with contextWindowSize: 128000.

Arm Model requests Private _meta.usage Standard usage_update
Base (HEAD^1 bundle) 1 1 0
PR head bundle 1 1, byte-identical to base 1{"used":321,"size":128000}

This proves the central behavior is load-bearing: the standard frame flips from 0 to 1 while the pre-existing private frame remains unchanged. The fake-server request count is a positive control that both arms actually executed a model round.

Additional verification

  • MessageEmitter tests: 28/28
  • Full ACP integration workspace: 1,319/1,319
  • ACP bridge forwarding test: 1/1
  • Real bundled ACP integration file: 11/11, including the PR's usage-update scenario
  • Boundary sweep: 20/20, covering zero, negative, fractional, unsafe-integer, NaN/Infinity, unresolved model, non-positive context size, replay, subagent, fallback-to-total, and used > size
  • Mutation matrix: 7 mutants; 4 killed by intended assertions, 3 classified
    • used < 0 and size <= 0: behaviorally active guards, but not directly pinned by unit fixtures — non-blocking coverage suggestion
    • hasFullSessionContext: compile-load-bearing type narrowing and runtime-defensive; no current runtime call site reaches the false branch

Scope not covered

  • JetBrains UI rendering itself
  • Windows-specific behavior
  • Optional ACP cost reporting
  • Per-commit attribution, because the depth-2 checkout could only verify the aggregate merge-ref diff

Artifact publication incident

The automated comment incorrectly ended as “results unavailable” even though the agent verdict was merge-ready and assertions.json contained { "pass": 1612, "fail": 0, "total": 1612 }. The upload log shows actions/upload-artifact rejected artifact filenames containing cross-platform-invalid characters. The generated mutation logs included names such as prompt??total, used<0, and size<=0; the upload step did not fail the job, so the subsequent publisher looked for an artifact that had never been created. The four generated PNG captures therefore cannot be attached from this run.

Merge recommendation: merge-ready. The only PR-level follow-up is optional test coverage for the negative used and non-positive size guards; it is not a correctness blocker.

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Deep verification verdict: MERGE-READY — 16/16 scripted assertions passed

Verified PR head: 26d2adfd6f254f76b2cd288a70680d39011e240f
Control base: 5173052e37d4244c0c35b0ab1d5a0843a26f60cb
Also verified in a local integration tree containing the PR head and current origin/main 675135e338046d5da59039799dc7b5933974479b (integration-tree HEAD 3f26b7ee53519c2ad6111729c9b86f043f08ed15).

中文验证摘要

结论:可合并。 16/16 个脚本断言通过,未发现阻断性或建议级问题。

中央 A/B 结论见下方 Central claim and load-bearing A/B:同一份真实 bundle ACP 子进程探针在 base 上精确失败于“标准 usage_update 帧数量为 0”,而 PR head 与合入最新 main 的试验树均通过,并同时保留私有 _meta.usage 帧。边界矩阵、bridge 原样转发、两个修复 arm 的完整 ACP 回归与对抗性数值/失败顺序测试均通过。

未覆盖:JetBrains UI 的实际渲染、Windows/Linux 本地执行。本机无容器运行时,因此本地验证采用静态安全审计后在三个独立 worktree 中执行。官方沙箱 /verify workflow 已执行完成,但发布步骤未能取回结果 artifact,PR 上标记为“results unavailable”,因此没有可用于交叉核对的沙箱结论。

Central claim and load-bearing A/B

Claim: after each live main-session model round, the bundled ACP server emits the standard { sessionUpdate: "usage_update", used, size } notification while preserving the existing private agent_message_chunk._meta.usage notification. Replay, subagent, partial-context, and invalid numeric inputs do not emit the standard frame.

The same PR-head integration probe was run against three independently installed and built trees. It launches the real bundled dist/cli.js --acp, creates an ACP JSON-RPC session over stdio, and points the provider at a deterministic loopback OpenAI-compatible fixture reporting 321 prompt tokens and a 128,000-token context window.

Cell Environment Observable oracle Result
Base control 5173052e37 Private usage is received; standard-frame assertion fails with expected 0 to be greater than 0 at the usage_update filter Expected fail
PR head 26d2adfd6f Receives both private usage and { used: 321, size: 128000 } Pass, 1/1
Latest-main integration tree 3f26b7ee53, containing 675135e338 + PR head Same dual-frame wire assertion after integrating the PR with current main Pass, 1/1

This is load-bearing evidence rather than a test-only comparison: the base bundle completed the same model round and satisfied the private usage checks, then failed specifically because no standard frame existed. The PR-head and latest-main integration bundles passed the identical probe.

Boundary and downstream verification

Surface PR head Latest-main integration tree
MessageEmitter unit suite 28/28 28/28
ACP bridge usage_update forwarding 1/1 1/1
CLI typecheck Pass Pass
ACP bridge typecheck Pass Pass
Full CLI ACP directory 1303/1303 1339/1339
Changed-file ESLint / Prettier / git diff --check Pass Pass

An additional scratch-only adversarial test exercised 15 cases on both repaired arms:

  • durationMs = 0 and promptTokenCount = 0 emit a valid used: 0 frame.
  • Negative, NaN, infinite, fractional, and unsafe-integer usage values are rejected.
  • Zero, negative, NaN, infinite, fractional, and unsafe-integer context-window sizes are rejected.
  • A partial emitter context preserves private usage but emits no standard frame.
  • A private-frame failure prevents the standard-frame attempt and propagates unchanged.
  • A standard-frame failure after a successful private frame propagates, with private-first ordering preserved.

Both arms passed 15/15.

Downstream consumers audited

  • Direct ACP clients consume the SDK SessionUpdate union; used and size are emitted as validated non-negative safe integers.
  • The ACP bridge publishes usage_update unchanged to session-update subscribers.
  • Daemon token-burn accounting continues to read only the private _meta.usage frame, so the added standard frame does not double-count usage.
  • The VS Code companion continues to consume its existing private usage path and ignores the additional standard frame.
  • All five production emitUsageMetadata call sites were traced: four main-session paths provide finite durations; the subagent path supplies subagentMeta and is excluded. History replay uses a separate transcript replay path and does not emit the standard frame.

Findings

None. I found no correctness, compatibility, security, or performance issue attributable to this PR.

The full ACP suites emitted existing MaxListenersExceededWarning and intentionally exercised error-path diagnostics in both PR-head and latest-main integration runs. The suites completed green in both arms, and these messages are outside the changed path, so they are recorded as pre-existing test noise rather than PR findings.

Not covered

  • Real JetBrains UI rendering. The wire payload consumed by JetBrains was verified end to end, but JetBrains itself was unavailable.
  • Windows and Linux local execution. Existing PR CI is green; this local round ran on macOS arm64.
  • Provider-side generation of arbitrary malformed token metadata beyond the direct emitter boundary matrix.
  • The official sandboxed /verify workflow completed, but its result artifact could not be retrieved for publishing; the PR status therefore reports “results unavailable,” so this local report cannot claim an independent sandbox cross-check. Workflow run.

Methodology

The host had no Docker, Colima, or Podman runtime. Before executing PR code, I audited the complete five-file diff and confirmed it changes no manifest, lockfile, install script, arbitrary command execution, or external network path. I then created three isolated worktrees, ran an independent npm ci/full build in each, and confirmed every node_modules/@qwen-code/* workspace link resolved inside its own tree. The real ACP fixture used loopback only. The base worktree received the PR-head integration test as a scratch probe so all A/B cells used identical code and assertions.

Screenshot evidence

Real bundled ACP A/B — base fails specifically on the missing standard frame; PR head and latest-main integration pass:

Real bundled ACP A/B

Emitter, bridge, and typecheck gates — 8/8:

Boundary and targeted gates

Full ACP regressions and static audit — 3/3:

Full ACP regression and static audit

Adversarial numeric boundaries and send failure ordering — both repaired arms pass:

Adversarial boundaries and failure ordering

@wenshao
wenshao added this pull request to the merge queue Aug 8, 2026
Merged via the queue into QwenLM:main with commit c202688 Aug 8, 2026
42 checks passed
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

⚠️ Findings — verification completed at 26d2adfd6f254f76b2cd288a70680d39011e240f; 2 Medium issues reproduced

中文摘要

结论:核心修复有效,但建议修复两项 Medium 问题后再合并。

真实 base/head A/B 已证明本 PR 的核心改动是 load-bearing:相同的 head 测试 oracle 驱动真实 dist/cli.js --acp 子进程时,head 收到标准 usage_update 且保留私有 _meta.usage;base 在禁用 retry 后干净地因标准帧数量为 0 失败。

但对抗审计复现了两个问题:

  1. 新增 usage_update 经 daemon SDK normalizer 后会变成持久的 debug transcript block,因此 daemon/Web Shell 消费路径可能在每个模型 round 都增加一条可见调试记录。
  2. 模型 fallback(以及使用独立 model override 的路径)产生 usage 时,没有把实际模型的 context-window size 传到 MessageEmitter;当前实现固定读取主 session 模型的 size,因此不同窗口模型之间 fallback 时会显示错误占用比例。

未覆盖:JetBrains UI 最终视觉呈现、Windows/Linux、真实外部模型服务、完整仓库测试套件。

Central claim and A/B load-bearing proof

PR 8528 adds the standard ACP usage_update notification for live main-session model rounds while retaining the existing private _meta.usage frame.

The same integration-test source from the PR head was executed against independently built and bundled head/base worktrees. The test starts the real dist/cli.js --acp child process, a loopback fake OpenAI-compatible server, and an ACP JSON-RPC session. Retries were disabled and each arm used a fresh integration-test directory.

Cell Commit Observable oracle Result
PR head 26d2adfd6f254f76b2cd288a70680d39011e240f Receives { sessionUpdate: "usage_update", used: 321, size: 128000 }; private usage remains present and agrees on input tokens PASS
Base control 5173052e37d4244c0c35b0ab1d5a0843a26f60cb The identical head oracle fails because zero standard usage_update frames are observed EXPECTED FAIL (expected 0 to be greater than 0)

The wrapper asserted 4/4 expected A/B outcomes. Evidence: 01-real-acp-base-vs-head.png.

A/B: real ACP base vs head

Findings

Medium — standard usage_update becomes a persistent daemon debug transcript block

Reproduction:

cd packages/sdk-typescript
../../node_modules/.bin/vitest run test/unit/usage-update-debug.verify.test.ts --retry=0

The real SDK normalizeDaemonEvent() maps the unrecognized ACP session-update kind through its default branch to a debug event. reduceDaemonTranscriptEvents() then appends a persistent kind: 'debug' transcript block containing the raw usage JSON. The dedicated reproduction passed 1/1.

Relevant flow:

  • ACP bridge publishes the new standard frame unchanged.
  • packages/sdk-typescript/src/daemon/ui/normalizer.ts has no usage_update case, so the default branch creates debug.
  • packages/sdk-typescript/src/daemon/ui/transcript.ts appends debug events to transcript state.

This means each live model round can add a debug record to daemon transcript consumers; tool loops can add more than one per user turn. The ACP protocol change is valid, but downstream daemon normalization must either consume usage_update as structured session state or explicitly drop it from transcript projection.

Evidence: 04-daemon-usage-update-debug-transcript.png.

Daemon debug transcript finding

Medium — fallback/override usage can be paired with the wrong context-window size

Reproduction/dataflow assertion:

node check-fallback-context-size.mjs

The fallback resolver obtains a distinct contentGeneratorConfig, but only its modalities are propagated. The MODEL_FALLBACK event carries fromModel, toModel, status, and index — not the fallback context-window size. After the fallback stream completes, Session passes only usageMetadata and elapsed duration to MessageEmitter. MessageEmitter then reads:

this.ctx.config.getContentGeneratorConfig()?.contextWindowSize

which is the main session model configuration, not necessarily the model that produced the usage. The same mismatch risk exists for continuation paths using an independent model override.

Concrete impact: if a 128K primary model falls back to a 1M model and the fallback reports promptTokenCount: 100000, the emitted standard frame can be { used: 100000, size: 128000 } (~78%) instead of using the fallback model's 1M window (~10%).

The dataflow harness observed 1 present prerequisite and 3 missing links: fallback event size, Session propagation, and emitter resolution from the producing model.

Evidence: 05-fallback-context-window-dataflow.png.

Fallback context-window dataflow finding

Additional verification

Gate Result
Head/base full repository build logs Completed through the final workspace on both arms; the outer commands returned 0, but explicit exit-code files were not retained
Head/base bundle generation PASS / PASS
MessageEmitter.test.ts 28/28 passed
ACP bridge targeted forwarding test 1/1 passed
Adversarial usage/context-window boundary matrix 15/15 passed
packages/cli typecheck PASS
packages/acp-bridge typecheck PASS
Effective diff whitespace check PASS
Artifact consistency summary checks 22/22 passed

The boundary matrix covered zero, negative, fractional, non-finite, unsafe-integer, and missing values; prompt-token precedence; total-token fallback; and durationMs = 0 as a live round. Evidence: 02-usage-update-boundary-matrix.png.

Boundary matrix

The 22/22 summary is an artifact-consistency check over retained logs, OIDs, expected A/B outcomes, and evidence files; it is not 22 independent behavioral scenarios. It includes successful reproduction of both findings. Evidence: 03-verification-gates-summary.png.

Verification summary

Not covered

  • JetBrains AI Assistant's final UI rendering. This round verifies the ACP wire behavior and bridge path, not the IDE presentation layer.
  • Windows and Linux execution.
  • A real external model provider. The bundled ACP child was real, but token usage came from a deterministic loopback OpenAI-compatible fixture.
  • A full provider-level forced-fallback E2E. The fallback finding is proven by production dataflow inspection plus an executable source-contract harness, not by running a live provider fallback.
  • The complete repository test suite.
  • Cost reporting and replay-time restoration of a historical context indicator, outside this PR's stated behavior.

Methodology

PR metadata was resolved explicitly from QwenLM/qwen-code; the exact base/head OIDs were checked out as detached worktrees. Dependencies were installed offline with lifecycle scripts disabled, followed only by the repository-declared patch-package postinstall. PR code ran under macOS sandbox-exec with an environment rebuilt from env -i and an isolated verification HOME; the file policy allowed system runtime files, public repository/worktree data, npm artifacts, and temporary output while denying access to host credential directories by default. Network access was not sandbox-restricted to loopback, but every executed model request was configured to the deterministic 127.0.0.1 fixture and the environment contained no host proxy or credential variables. Dependency lockfiles were identical, and workspace links resolved inside each respective worktree. Raw harnesses, logs, assertions.json, verdict.txt, and PNG evidence are retained in the local verification artifact directory.


Local verification artifacts were produced from exact detached base/head worktrees; this comment is advisory and does not approve or merge the PR.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.8.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ACP] Emit usage_update session updates so ACP clients (JetBrains AI Assistant) can show context usage

4 participants