Qwen Code 改进建议报告
June 20, 2026 · View on GitHub
本文是 Qwen Code 改进建议报告 的完整更新日志(逐日逐 PR 追踪),为保持主报告可读性而从其「六、更新日志」拆分至此。
条目按时间倒序(最新在上),覆盖 2026-06-20 → 2026-04-05。主报告内仅内联最近一次 rollup(2026-06-20),更早历史以此处为准。
2026-06-20 月度增量(2026-05-16 → 2026-06-20 · 608 commits / 176 feat PR · origin/main f35a10ba1)
5 周窗口的滚动汇总(非逐 PR 深挖;逐项深挖见下方各日条目)。Qwen Code 体量再增:
packages/**从 ~500 → ~4,750 文件(~2,700 源.ts(x),14 包)。主线 = Workflow 工具编排 P1–P5 落地 + 桌面 app 新包 + daemon/web-shell 成熟 + 多渠道(QQ/飞书)。
🌟 Workflow 工具 P1–P5 全栈落地(umbrella #4721)——确定性多 agent 编排,对标本报告 Coordinator/Swarm(line 83)+ Codex multi-agent v2:
- P1 #4732(2026-06-10):
node:vm最小沙箱 + 顺序agent() - P2 #4947(2026-06-12):
parallel()+pipeline()并发 fan-out - P3 #5034(2026-06-14):
agent({schema, agentType, model, isolation:'worktree'}) - P4 #5094(2026-06-16):
meta+/workflows+ phase-tree 进度 - P5 #5231(2026-06-18):token budget + per-run UI surfacing
🌟 桌面 app 新子系统:#3778(2026-06-11)packages/desktop + Qwen ACP SDK 集成(macOS 公证 / Windows 自更新 / git branch badge);后续 desktop qwen 集成(#4728)+ macOS 26 Liquid Glass(#5284)+ desktop-pet skill(#4808)。
daemon / web-shell 成熟:qwen serve 直接托管 Web Shell UI(#5392)+ DaemonTransport/ACP 合规(#5040)+ mid-turn 消息投递(#5175)+ web-shell token/设置/重试/流式指标(#5066)+ 完成 turn 折叠为 prompt+答案(#5125)+ per-turn time/token(#5163)。
多渠道 IM:QQ Bot(#5202,2026-06-19)+ 飞书/Lark(#4379,2026-05-28)。
Durable cron / loop:可重启存活的定时任务(#5004)+ 秒级 wakeup 引擎(#5182)+ prompt-only /loop 自定速唤醒(#5197)。
Computer Use 跨平台:迁移到 cua-driver(#5051)+ open-computer-use MCP 零配置内建(#4590)。
记忆 / Goal / Plan:/rewind 文件恢复(#4064,2026-05-16)+ /goal judge-driven(#4123,详下条)+ 用户级 auto-memory ~/.qwen/memories/(#4747)+ Plan plansDirectory 可配置(#4062)+ QWEN.local.md project-local 上下文(#4091)。
Skills:/skills picker 对话框(#4532)+ triage skill(#4577)+ user-invocable frontmatter(#5037)+ skill allowedTools 自动批准(#4704)+ auto-skill- 前缀强制(#4839)。
性能 / 截断:分层工具输出截断 + per-message/per-tool 预算(#4880)+ /compress-fast 无 LLM 规则压缩(#4893)+ 内存压力监控/诊断落盘(#4403/#4654)+ grep 结果可满足 prior-read 检查(#5043)。
遥测:#3731 Phase 2–4(tool.blocked_on_user / subagent span 并发隔离 / TTFT / GenAI semconv,#4321 等)+ 运行时内存/CPU OTel 采样(#4868)。
Hooks / 权限:post tool batch hooks(#4454)+ user prompt expansion hooks(#4377)+ toolCallId 传入 hook(#4918)+ ACP 权限超时可配(#5260)+ 专用 agent 权限对话框(#5105)。
矩阵状态修正(本次同步修正 8 项 stale OPEN/缺失 + 3 项历史 现状/进展 矛盾,均经 git log origin/main 核实)
| item | 旧 | 新 |
|---|---|---|
| 启动 preconnect(line 58) | PR#3318 open | ✓ 2026-04-27(3b0b6c052) |
| Coordinator/Swarm(line 83) | PR#3471/#3488 🟡 OPEN | ✓ 2026-04-27 / 04-28(与 line 193 一致)+ Workflow #4721 |
Agent isolation:worktree(line 101) | PR#4073 OPEN | ✓ 2026-05-14(609e05bae) |
| 自动检查点(line 82) | 仅 PR#3292 OPEN | + PR#4064 ✓ 2026-05-16(/rewind 文件恢复);picker UX 仍 OPEN |
| /doctor memory(line 159) | PR#3785 🟡 OPEN | ✓ 2026-05-17(eef06ce37) |
| Computer Use(line 111) | 缺失 | ✅ 已实现且超 Claude(跨平台)——#4590 零配置内建(2026-05-29)+ #5051 cua-driver 跨平台 + 35 工具面 |
| Auto Dream(line 54) | 缺失(与 PR 列 ✓ 自相矛盾) | ✓ 已实现(PR#3087 managed auto-memory + auto-dream) |
| Notebook Edit(line 120) | 缺失 | ✓ 已实现(NotebookEdit 工具,2026-05-21 · #3900 + #4373) |
另校正 3 项历史"现状=缺失 但进展=✓"矛盾:队列输入编辑(#2871)/
/batch(#3079)/ 上下文 Tips(#2904),均 2026-04 已合并。其余
缺失项(Team Memory / Transcript Search / Output Styles / Deep Link //teleport/ Bare Mode / GitLab CI/CD / 并发 Session / 企业代理 / Session Ingress Auth 等)经窗口 git log 关键词核对,确为未实现,维持缺失。
仍 OPEN(已核实未合并):API retry classifyError(#3798)、rewind picker UX(#3292)、WebFetch fastModel(#3537)、Web UI+QR remote control(#2330)。
2026-05-16 增量(/goal 系列收官 · PR#4123 MERGED 替代 PR#4088 CLOSED · +3476/-25 / 40 files / merge commit 0dde1ad70 / 10:14 UTC)
PR#4123 feat(cli): add session-scoped /goal command with judge-driven turn continuation(qqqys,2026-05-16 10:14 UTC MERGED,+3476/-25)—— 原 PR#4088 已 CLOSED,按 review 反馈整体 rebuild 后以 PR#4123 形态合入。规模较初版(+1800/-24)几乎翻倍,主要增量在测试覆盖(4 个测试文件共 ~1061 LOC,占 ~30%)+ restoreGoal.ts (158 LOC) session resume 协同 + 4 个 cli hook 适配。
与 Claude / Codex 实现对照(按源码核实,2026-05-16):
| 维度 | Codex /goal | Claude /goal | Qwen PR#4123 /goal |
|---|---|---|---|
| 落地时间 | 2026-04-25(5 PR 系列 #18074–#18078) | 2026-05-11 (v2.1.139) | 2026-05-16 MERGED |
| 实现规模 | core +1641 LOC / tools +280 LOC / TUI 5 文件 ≈ 2300 LOC + SQL schema + protocol events | 二进制混淆,未开源 | 2089 LOC 业务(+ ~1061 LOC 测试 = 40 files +3476/-25) |
| 完成判定 | 模型自判 + 工具调用:create_goal/update_goal(complete)/get_goal 三件套;continuation 模板内嵌 completion-audit 指令 | Stop prompt-hook evaluator(cRK 函数):同 session 内的判官 prompt,要求基于 transcript evidence 判定 | LLM-as-judge subquery:独立 evaluator(可走 fast model)+ 严格 JSON schema {ok, reason} 结构化输出 |
| 底层机制 | 新 subsystem GoalRuntimeState + GoalRuntimeEvent 10+ 事件状态机 | local-jsx + post-text(推断) | 0 新 subsystem——复用 PR#3471/3488 的 Stop function-hook plumbing |
| 持久化 | ✅ SQLite thread_goals 表,StateDbHandle 跨重启 | ❌ session 内存 | ❌ activeGoalStore 进程内存;/clear /resume /branch 主动清;restoreGoal.ts 仅协助同进程内 history 重渲染 |
| 状态机 | active / paused(plan/mode 切换)/ budget_limited / complete | active / cleared | set / achieved / aborted / cleared(仍无 paused) |
| Token 预算 | ✅ token_budget 字段 + budget_limit.md 模板 steering | ❌(推断) | ❌;仅迭代数 cap:MAX_GOAL_ITERATIONS=50 |
| Judge 超时 | — | — | GOAL_JUDGE_TIMEOUT_MS=25s + AbortController 防泄漏;GOAL_HOOK_TIMEOUT_SECONDS=30 对齐 Claude cRK 默认 |
| Prompt 注入防护 | <untrusted_objective> 标签 + "untrusted prompt data" 显式声明 | unknown | sanitizeConditionForPrompt(去换行 + 双引号降级单引号) |
| Bootstrap | continuation 模板由模型读取 | — | 首轮 submit_prompt 自动注入 goalInstructionPrompt(q),免去 user 手动"开始" |
| 安全门禁 | mode/plan 切换自动 paused | unknown | isTrustedFolder() + getHookSystem() 必备 + disableAllHooks 短路 + 4000-char cap |
PR#4123 vs Claude / Codex 的设计哲学:
- LLM-as-judge subquery 评估——独立 evaluator (
runSideQuery) 走 fast model;比 Claude 的"判官嵌在同 prompt 里"更可控、比 Codex 的"模型自己 audit 自己"更不容易自欺 - 零新 subsystem——纯复用现有 hook plumbing,顺带 fix latent bug(
hasHooksForEvent忽略 session-scoped function hooks) - 测试覆盖率最高:~1061 LOC 测试覆盖业务 2089 LOC(含
goalLoop.integration.test.ts209 LOC 端到端),Codex 5 PR 拆分中测试比 Qwen 单 PR 集中得多
PR#4123 仍 deferred / 可补的 3 项(已从 PR#4088 列表收敛,daemon HTTP route 项已转入 §06 Stage 1.5c):
- Plan mode 集成:goal 与
/plan互斥时应自动 paused 而非 cleared(Codex commit3463324a29"keep plan mode from pausing goals" 是参照) - Budget enforcement guard rail:仅有
MAX_GOAL_ITERATIONS=50硬上限,无 token budget。50 轮 × 几万 tokens 仍可能是 $$$,重要 safety 缺口 paused中间态:daemon 重启 //compact/ 临时切走时仍cleared而非 paused,goal 上下文丢失
源码核实(commit 0dde1ad70):
packages/core/src/goals/goalHook.ts:34-91(迭代/超时常量)packages/core/src/goals/goalJudge.ts:23-54(JSON schema judge + ClaudecRK对齐注释)packages/cli/src/ui/commands/goalCommand.ts:79-216(命令分支:状态/清除/长度 cap/门禁/注册 + bootstrap)
2026-05-13 增量(~24h · 1 项关键合并 + 1 项关键新 OPEN · 🌟 PR#3889 qwen serve daemon Stage 1 MERGED(+12993/-194 / 84 commits / merge commit 870bdf2a / 06:47 UTC merge · 收敛 5 轮 multi-model audit + chiga0 三轮 follow-up + LaZzyMan/tanzhenxin reviews)+ /goal slash command PR#4088 新 OPEN(+1800/-24 · 跟进 Claude Code v2.1.139 2026-05-11 引入的 /goal 命令,比 Anthropic 实现晚 ~24h;本质回追 Codex 2026-04-25 merged 的 5-PR /goal 系列设计;注:PR#4088 后被 CLOSED,重做后以 PR#4123 2026-05-16 MERGED——详上方 2026-05-16 条)
🌟 PR#3889 daemon Stage 1 MERGED — 系列追踪以来最大单 PR
PR#3889 feat(cli,sdk): qwen serve daemon (Stage 1) ✅ MERGED 2026-05-13 06:47 UTC(merge commit 870bdf2a,+12993/-194 / 84 commits)—— 系列追踪以来最大单 PR(超过 PR#3684 Phase C event monitor +6297/-147)。
最终设计要点(详 §06 Stage 1 实现 audit):
- 架构:commit
6a170ef8重构后是 "1 daemon HTTP front + Mqwen --acpchildren (1 per workspace) + N session multiplexed per workspace viaQwenAgent.sessions: Map"——同 workspace 内 in-process N-session 经济性已对齐 OpenCode - 9 STAGE1_FEATURES:health / capabilities / session_create / session_list / session_prompt / session_cancel / session_events / session_set_model / permission_vote
- N=5 同 workspace session 内存:300-500MB(早期)→ 60-100MB(commit
6a170ef8后)
deferred 到 Stage 1.5:chiga0 10 must-haves(详 §06 Stage 1.5a)+ Mode A qwen --serve flag(Stage 1.5b)+ daemon-side state CRUD(§06 Stage 1.5c)+ chiga0 6 architecture findings refactor(Stage 1.5-prereq)。
经验沉淀:78 commits 中 ~25 轮 audit + ~60+ review threads close + 架构能在 Stage 1 内重构(commit 6a170ef8 是最 expensive 但最有价值的 follow-up)。详 §06 §5️⃣ 经验沉淀。
PR#4088 feat(cli): add session-scoped /goal command with judge-driven turn continuation(qqqys,2026-05-12 OPEN,+1800/-24,closes #4074)—— 跟随 Claude Code v2.1.139(2026-05-11)+ Codex 5-PR 系列(2026-04-25 merged)的 /goal 设计模式。⚠️ PR#4088 后被 CLOSED,按 review 反馈整体 rebuild 后以 PR#4123 2026-05-16 MERGED(+3476/-25,详上方 2026-05-16 条目的最新对照表)。下文为 2026-05-13 当时的 snapshot:
与 Claude / Codex 实现对比(2026-05-13 snapshot):
| 维度 | Codex /goal | Claude /goal | Qwen PR#4088 /goal |
|---|---|---|---|
| 引入时间 | 2026-04-25 (5 PRs merged) | 2026-05-11 (v2.1.139) | 2026-05-12 OPEN |
| 实现规模 | 5 PRs ~3-4w | ~1w(推测) | 1 PR +1800/-24 |
| 完成判定 | 模型工具调用自判 + state machine | Stop prompt-hook evaluator(cRK 函数,同 prompt 内判官) | LLM-as-judge subquery(独立 evaluator,可走 fast model) |
| 底层机制 | 新 subsystem thread_goals SQL 表 | local-jsx + post-text | 复用 Stop hook + function hook plumbing(0 新 subsystem) |
| 持久化 | ✅ SQL thread_goals | ❌ | ❌ /clear /resume /branch 主动清除 |
| 状态 | active/paused/budget-limited/complete | active/cleared | active/achieved/cleared |
| UI | TUI 状态面板 | overlay panel | ◎ goal active Footer pill |
| Bootstrap | — | — | <system-reminder> 首轮自动注入(避免额外 user turn) |
历史更正:早期版本此表将 Claude 完成判定写作"主 LLM 自判",与 qwen
goalJudge.ts:18注释("aligned with Claude Code 2.1.140'sStopprompt-hook evaluator (functioncRKin the compiled binary)")不符。ClaudecRK是独立 evaluator prompt,evaluator-style 而非裸自判;Qwen 在此基础上把 evaluator 进一步剥出为 fast-model subquery。
PR#4088 3 个超越 Claude / Codex 的亮点:
- LLM-as-judge subquery 评估——独立 evaluator (
runSideQuery) 走 fast model 而非走主模型上下文;完美利用 Qwen 的 fast-model 机制(主 LLM 干活、fast LLM 判 goal) - 零新 subsystem——纯复用 PR#3471/3488 的 hook plumbing,顺带 fix 一个 latent bug(
hasHooksForEvent忽略 session-scoped function hooks) <system-reminder>首轮 bootstrap——避免 user 手动 "开始" prompt
PR#4088 已 deferred / 可补的 4 项(PR#4123 收敛后仍 deferred 3 项 + 1 项转入 §06 Stage 1.5c,详 2026-05-16 条):
- Plan mode 集成(参 Codex Issue #20838):goal 与
/plan互斥时应自动 paused 而非 cleared - Budget enforcement guard rail:
--max-turns/--max-tokens防 runaway loop(goal 设错可能跑数百轮,重要 safety) paused中间态:daemon 重启 //compact/ 临时切走时 paused 而非 cleared- Daemon HTTP route(
POST /session/:id/goal):§06 Stage 1.5c daemon-side state CRUD 候选
2026-05-12 第二轮(~6h 增量 · 1 项合并 + 3 项关键新 OPEN · Worktree 工具组 PR#4073 新 OPEN*(+1651/-4 · 直接闭合 claude-code-vs-qwen-code-builtin-tools.md §3.10 刚标注的 P1 借鉴项)+ Agent hooks via headless subagent PR#4072(+1401/-14)+ OTel hierarchical session tracing spans PR#4071(+1318/-409)+ chiga0 narrow terminal rendering PR#3968 合并)
扫描窗口:2026-05-12 06:00 UTC 增量。窗口内 1 项合并 + 3 项新 OPEN(今日全新创建)。本轮关键发现:① PR#4073 generic worktree —— 与今日上午 binary 反编译刚发现的 Claude EnterWorktree / ExitWorktree 工具组几乎同步落地 Qwen 端(LaZzyMan 独立创建,非项目内 sync),闭合 claude-code-vs-qwen-code-builtin-tools.md §3.10 列出的 "Worktree* P1 借鉴" 缺口;② PR#4072 agent hooks —— 自述 "Aligns with Claude Code's execAgentHook / SyntheticOutputTool design",把 hook 框架从单一 command-script 扩展到 headless subagent 多轮验证;③ PR#4071 hierarchical session tracing —— OpenTelemetry session-level interaction spans wrap sendMessageStream lifecycle 12 个 exit point,加 NOOP_SPAN sentinel + WeakRef + 30-min TTL cleanup 防 orphan span。
🟢 MERGED(1 项业务)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3968 | fix(cli): improve rendering on narrow terminals | 2026-05-12 05:58 UTC | TUI 渲染窄屏适配(+221/-8 · 4 files · chiga0)—— ① TableRenderer < 60 列时切换 vertical format(之前仅 maxRowLines > 4 触发)防止 wide markdown table 溢出 scrollback;② Composer ≤ 30 列且 StreamingState.Responding 时抑制 bottom loading indicator 防 ultra-narrow 终端不必要重绘。从 TUI flicker hardening 系列剥离 |
🆕 关键新 OPEN(3 项,全在 2026-05-12 创建)
| PR | 方向 | 关联 |
|---|---|---|
| PR#4073 🌟 🆕 2026-05-12 03:06 | feat(tools): add generic worktree support — EnterWorktree/ExitWorktree + Agent isolation | 🌟 LaZzyMan · 闭合 Worktree* 工具组 P1 借鉴缺口(+1651/-4 · 13 files · closes Phase A+B of #4056)—— ① 2 个新工具 enter_worktree / exit_worktree(直接对标 Claude v2.1.139 EnterWorktree / ExitWorktree);② agent 工具新增 isolation: 'worktree' 参数(agent 可在隔离 worktree 内运行 + auto-cleanup if no changes / preserve if changes);③ worktreeCleanup.ts stale ephemeral worktree 清理;④ validateUserWorktreeSlug 拒绝 ../ / dots 路径注入;⑤ exit_worktree dirty-state guard 拒绝 action='remove' if working tree dirty;⑥ 验证:B1/B2/B3/D1/D2/D3 全部 ✅(80 测试 16 新 + 64 既存 agent 测试无 regression)。与 Arena 内部 worktree 共存不破坏(GitWorktreeService.setupWorktrees / ArenaManager 不动) |
| PR#4072 🌟 🆕 2026-05-12 02:34 | feat(hook): implement agent hooks via headless subagent with text fallback verdict | 🌟 DennisYu07 · Hook 框架重大扩展(+1401/-14 · 17 files)—— ① 新 agent hook type 在 Stop event 等触发执行 headless subagent 验证条件(多轮推理 / 读文件 / 跑命令 → 决定是否 allow action);② AgentHookRunner.executeInternal() 通过 SubagentManager.createAgentHeadless() 创建;③ 新 report_verdict tool 结构化 pass/fail 输出 + parseVerdictFromText() text fallback(模型不调用 tool 时正则启发);④ YOLO approval mode override(subagent 工具不触发 permission dialog);⑤ transcript path 注入 subagent system prompt;⑥ 扩展 HookType enum / HookConfig union / 所有 registry/runner 支持 agent type。自述 "Aligns with Claude Code's execAgentHook / SyntheticOutputTool design"。Token cost ~30s/invocation,advisoryOnly 模式 + custom agent field 尚未验证 |
| PR#4071 🆕 2026-05-12 02:24 | feat(telemetry): add hierarchical session tracing spans | doudouOUC · OTel 分层 session tracing(+1318/-409 · 6 files)—— ① 新 session-tracing.ts 模块 concurrent-safe span 管理(explicit span 引用 + WeakRef + strongRefs + 30-min TTL cleanup);② SDK 未初始化时用 NOOP_SPAN sentinel;③ client.ts 在 UserQuery/Cron/Notification message types 上启动 interaction span 包裹完整 sendMessageStream lifecycle,12 个 exit point(ok/error/cancelled)含递归 yield* paths 正确结束;④ sdk.ts shutdown safety net 在 SDK shutdown 前结束 active interaction span 防 Ctrl+C orphan;⑤ SPAN_INTERACTION / SPAN_LLM_REQUEST / SPAN_TOOL / SPAN_TOOL_EXECUTION 常量;⑥ 19 unit tests 覆盖 interaction lifecycle / LLM spans / tool spans / 并发隔离 / noop / cleanup |
🎯 重点解析:PR#4073 worktree 与 binary 反编译同步落地
时间线对照(2026-05-12 同一天):
| 时间 (UTC) | 事件 |
|---|---|
| 2026-05-12 03:06 | LaZzyMan 创建 PR#4073(+1651/-4) |
| 2026-05-12 ~05:00 | 本项目 binary 反编译 v2.1.139 ELF 确认 EnterWorktree / ExitWorktree 在 Claude 内部 tool name 注册表 |
| 2026-05-12 ~05:30 | claude-code-vs-qwen-code-builtin-tools.md §3.10 把 Worktree* 标为 Qwen 缺失 + P1 借鉴 |
两条独立路径同日抵达同一结论——LaZzyMan 从 qwen-code Arena 内部 worktree 出发扩展为通用能力,本项目从 Claude binary 反编译反推工具组对齐。结论:worktree 已不再是 Qwen 缺口(已 OPEN PR 在 review),等待合并后从 §3.10 / §五 移除。
🎯 重点解析:PR#4072 hook 框架的"agent 化"
Qwen Code 的 hook 框架在 PR#4072 之前仅支持 command-script 类型——shell 脚本里跑 simple check,pass/fail 判断局限。PR#4072 引入的 agent hook type 把验证能力整个 LLM 化:
旧 command hook: Stop event → 跑 `lint.sh` → exit code 决定
新 agent hook: Stop event → 启 headless subagent → 多轮推理 (读文件/跑命令/想原因) → 结构化 verdict
Claude 端对应:v2.1.139 binary 反编译显示 Claude 有 execAgentHook / SyntheticOutputTool 机制(PR#4072 自述明示参考)——agent hook 的 verdict 通过 SyntheticOutputTool 注入回主对话。PR#4072 用 report_verdict tool + text fallback 实现同概念。
与 PR#3471 background subagent 调度面的关系:复用 SubagentManager.createAgentHeadless()——agent hook 是 background subagent 的新 use case,验证 4 kinds Background framework (agent/shell/monitor/dream) 的可扩展性(即将出现第 5 kind:hook-agent?)。
🎯 重点解析:今日同日 3 新 OPEN 集中开发主题
| 主题 | PR | 共性 |
|---|---|---|
| 隔离 / sandbox | PR#4073 worktree | git worktree isolation for agent |
| 验证 / hook | PR#4072 agent hook | headless subagent verdict |
| 可观测 / tracing | PR#4071 OTel spans | interaction-level session tracing |
3 PR 共同指向:为生产部署 / 团队协作场景做基础设施补全——隔离(防 agent 互相污染)+ 验证(防 agent 错误 Stop)+ 可观测(OTel 监控 LLM session)。与 PR#3889 daemon design Stage 1 GA-ready 的"production hardening"主线一致。
2026-05-12(~1d 增量 · 7 项业务 PR 合并 · Anthropic proxy + global prompt cache scope(PR#4020 +1320/-37)+ Ctrl+B promote PR-3 of 3 收官(PR#3969)+ 4 工具 deferral(PR#4022)+ legacy qwen auth CLI 移除(PR#3959 -2532)+ ask_user_question always-visible(PR#4041))
扫描窗口:2026-05-11 → 2026-05-12 UTC。窗口内 7 项业务 PR + 2 项 ci/refactor。前次的 8 项"关键 OPEN"有 3 项已合并:PR#4020 / PR#3969 / PR#4022。本次主线:① Anthropic-compat proxy + 跨 session prompt cache(PR#4020 +1320/-37 · 体量从 OPEN 时 +577 翻倍);② foreground → background promote 3-PR 系列收官(PR#3969 PR-3 of 3 暴露 Ctrl+B keybind · 与 PR#3842 signal.reason + PR#3894 shell.ts 集成形成完整链);③ 4 个低频 built-in 工具 deferred(PR#4022 Monitor / SendMessage / TaskStop / WebFetch + searchHint · 与 Claude Code 延迟策略对齐);④ ask_user_question always-visible(PR#4041 与 PR#4022 互补 · 防 deferred 后模型用 prose 代替结构化 multi-choice);⑤ legacy qwen auth CLI subcommand 移除(PR#3959 −2532 行 · redirect 到 /auth TUI dialog · 体量去除最大);⑥ runtime.json sidecar cleanup(PR#4030);⑦ /stats model 长 model 名字一行(PR#4032)。
🟢 MERGED(7 项业务)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#4020 | feat(core): improve Anthropic proxy compatibility and enable global prompt cache scope | 2026-05-11 | 🌟 关联 prompt cache + provider 系列(+1320/-37 体量从 OPEN 时 +577 翻倍)—— ① 非 Anthropic-native baseURL 用 authToken(Authorization: Bearer)防 IdeaLab-style proxy 的双 header 冲突;② 真实 api.anthropic.com 保持 SDK-default x-api-key auth;③ Claude 4.6+ 自动 thinking: { type: 'adaptive' }(数字比较 `major > 4 |
| PR#3969 | feat(cli): Ctrl+B promote keybind (#3831 PR-3 of 3) | 2026-05-11 | 🌟 promote 3-PR 系列收官(+308/-15)—— foreground → background promote 完整链路:PR#3842 (PR-1, MERGED · ShellAbortReason = { kind: 'cancel' } | { kind: 'background'; shellId? } 基础) + PR#3894 (PR-2, MERGED · shell.ts 集成 + bg_xxx.output snapshot) + PR#3969 (PR-3, MERGED · 用户可见 Ctrl+B keybind + status indicator + /promote slash 命令)。Phase D part b of #3634 闭环 |
| PR#4022 | feat(tools): defer low-frequency built-in tools to reduce initial prompt size | 2026-05-11 | 关联 ToolSearch 延迟工具机制扩展(+20/-0)—— 4 个低频 built-in tools 标记 shouldDefer=true + searchHint:Monitor / SendMessage / TaskStop / WebFetch。PR#3589 之前只 deferred Cron / AskUserQuestion / ExitPlanMode / LSP / MCP;与 Claude Code 延迟策略对齐——仅 core read/write/search/execute 工具保留在 initial function-declaration list(减小 system prompt size 节省 token) |
| PR#4041 | feat(tools): keep ask_user_question always-visible to surface clarification UX | 2026-05-11 | 关联 item-15 AskUserQuestion(+10/-3)—— PR#4022 反向:ask_user_question 之前 deferred 时模型很少经 tool_search 发现就用,反而用 plain prose 提问,丢失结构化 multi-choice UX。改为 shouldDefer === false 强制在 initial tool list;加 unit-test guard pin 防 silent regression |
| PR#3959 | refactor(cli): remove legacy qwen auth CLI subcommand, redirect to /auth TUI dialog | 2026-05-11 | 🌟 大型重构(+397/-2532 净 −2135 行)—— 移除 5 个 qwen auth 子子命令(qwen-oauth / coding-plan / api-key / openrouter / status)+ 交互式 selector,重定向到 /auth TUI dialog。原 734 行 handler 逻辑完全归 TUI。本期最大单 PR 删除量 |
| PR#4030 | chore(core): runtime.json sidecar follow-ups from #3714 review | 2026-05-11 | 关联 runtime.json(+166/-17)—— post-merge cleanup:删除 dead typeof !== 'boolean' clause(Number.isInteger(true) === false 已挡)+ dead err.message.includes('utf-8') branch(Node fs.readFile 不抛 invalid UTF-8)+ test 补充。纯 trim 无行为变化 |
| PR#4032 | fix(cli): keep long model stats header on one line | 2026-05-11 | UI 修复(+126/-6,fixes #4031)—— /stats model 渲染单 model + panel 宽度足够时扩展 model/source 列;保留 24-col compact 多 model 布局。修复 ggml-org/gemma-4-E4B-it-GGUF 等长 model ID wrap 的回归 |
🟡 ci / refactor(2 项,不计入业务计数)
- PR#4061
refactor(telemetry): remove dead useCollector setting and unreachable TelemetryTarget.QWEN—— −82 行 dead config(useCollector从未被 telemetry SDK 调用)+TelemetryTarget.QWENenum 永远 throw FatalConfigError。Part of #3731 config 语义清理 - PR#3984
ci: skip unnecessary release and SDK checks——SDK Pythonworkflow 仅触发于 Python SDK 变更或 workflow 自身;release/version-sync PR 跳过 CI duplicate
🆕 新 OPEN(16 项,活跃开发 · 含今日 2026-05-12 新创建 2 项)
| PR | 方向 | 关联 |
|---|---|---|
| PR#4069 🆕 2026-05-12 | feat(cli): add tools.toolSearch.enabled setting for prefix-caching models | 🌟 wenshao · 关键 cost regression 修复(+110/-0 · closes discussions/4065)—— PR#3589 ToolSearch 延迟 MCP 工具节省 ~15K tokens,但破坏了 DeepSeek 等 prefix-based KV cache:用户报告 cache hit 97.5% → 81.5%(-16.4%)/ 日成本 $1.05 → $3.30(+214%)/ 尽管处理 46% 更少 tokens。新增 tools.toolSearch.enabled 全局开关 + deepseek-v4-* 自动 disable(cache hit pricing 1/120 让 cache stability 远比 prompt size 重要)。复用现有 eager-reveal fallback 无 core logic 改动 |
| PR#4070 🆕 2026-05-12 | perf(cli): code-split lowlight to cut startup V8 parse cost | 🌟 chiga0 · 启动性能大优化(+1203/-77)—— lowlight syntax highlighter(~1.5MB bundled / 36-60ms V8 parse)从 cli.js 同步入口拆出独立 esbuild chunk,仅在首个代码块渲染时按需加载。cli.js 体积 25MB → 6.9MB(-72%)。React/Ink 双 commit pattern:第一帧 plain text,第二帧 chunk 加载后切换 highlighted。直接削减 1-3s cold-start 感知延迟——module-eval 阶段是 perceived gap 的主导因素 |
| PR#4067 | Use bundled Qwen Code for PR review automation | yiliang114 · 关联 /review |
| PR#4064 | feat(rewind): add file restoration support to /rewind command | 🌟 关联 item-5 /rewind 检查点回退——/rewind 不仅恢复 transcript,还能恢复 session 期间被修改的文件状态 |
| PR#4062 | feat(cli): add configurable plansDirectory for Plan Mode | shenyankm · Plan Mode 计划文件目录可配 |
| PR#4060 | fix(cli): preserve debug session across sandbox relaunch | sandbox relaunch 保留 debug session |
| PR#4059 | feat(cli): add keyboard text selection and Ctrl+Backspace fix for MinTTY | MinTTY (Git Bash on Windows) 键盘文本选择 + Ctrl+Backspace |
| PR#4053 | Move startup context into system reminders | tanzhenxin · 关联 prompt 结构优化 |
| PR#4051 | docs: user + design docs for --json-schema structured output | wenshao · 关联 PR#4001 structured JSON |
| PR#4050 | fix(cli): preserve table ANSI color across wrapped lines | chiga0 · TUI table 渲染颜色保持 |
| PR#4048 | feat(cli): argument hint + --auto completion for /rename | qqqys · /rename 补全 |
| PR#4045 | fix(channels): expand tilde in channel cwd config | qqqys · channels ~ 展开 |
| PR#4037 | feat(cli): wrap markdown links in OSC 8 so wrapped URLs stay clickable | BZ-D · 关联 item-7 OSC 8 终端超链接 |
| PR#3994 | feat(perf): progressive MCP availability — MCP no longer blocks first input | chiga0 · 🌟 关联 item-8 启动优化(+1121/-60,体量大幅扩展)—— MCP server 启动不再阻塞用户首个 input。具体测量 TTI(time to first prompt input):无 MCP 480ms / 1 fast MCP 875ms / 2 fast + 1 slow (5s) MCP 7.1s / 1 hung MCP 10.5s。Progressive availability 模式:Config.initialize() built-in tools 就绪即返回,MCP discovery 后台 first-class promise |
| PR#3973 | fix(cli): MCP add/remove now correctly persists headers and server deletions | B-A-M-N · MCP config 持久化修复 |
| PR#3975 | feat(cli): add /directory remove subcommand | B-A-M-N · /directory remove 子命令 |
🎯 重点解析:promote 3-PR 系列完整收官
#3634 Phase D part b (foreground bash → background) 跨 3 个 PR 合并:
| PR | 合并 | 角色 |
|---|---|---|
| PR#3842 | 早期 | PR-1:signal.reason 基础——ShellAbortReason = { kind: 'cancel' } | { kind: 'background'; shellId? } |
| PR#3894 | 2026-05-08 +935/-15 | PR-2:shell.ts 集成——检测 result.promoted: true → snapshot output to bg_xxx.output → 注册 BackgroundShellEntry |
| PR#3969 | 2026-05-11 +308/-15 | PR-3:用户可见 Ctrl+B keybind + /promote slash + status indicator |
整体闭环:用户跑长命令 → Ctrl+B → 立即 detach 到后台(bg_xxx.output 持续累积)→ 后续可在 /tasks 列表看到 → 用 task_stop cancel 或 attach 重连。与 Claude Code 的 background shell 体验对齐。
🎯 重点解析:4022 + 4041 的"反向修复"
PR#4022 把 4 个低频工具 deferred → PR#4041 把 ask_user_question 强制不 deferred——后者纠正 PR#4022 一开始把 ask_user_question 也 deferred 导致模型用 prose 提问的 regression。两 PR 同日合并体现"快速反向 audit + 修复"模式:
PR#4022 (+20/-0) 延迟 Monitor/SendMessage/TaskStop/WebFetch
↓
审计发现 ask_user_question 不该 deferred
↓
PR#4041 (+10/-3) 强制 shouldDefer=false + unit test guard
🎯 重点解析:PR#4020 体量翻倍(OPEN +577 → MERGED +1320)
PR#4020 是 wenshao 的 Anthropic-compat 系列:OPEN 时 +577 行(基础 proxy 兼容),MERGED 时 +1320 行(+743 增量)——增加了:
- Claude 4.6+ adaptive thinking 自动检测(数字版本比较,支持 4.6/4.7/4-10+/未来)
- Global prompt cache scope(跨 session 复用 system prompt cache)
- User-Agent / x-app header 适配 proxy Team rules
- 测试覆盖 + IdeaLab proxy 集成验证
🎯 重点解析:PR#4069 揭示 ToolSearch 与 prefix cache 的根本冲突
PR#4069 揭示了 PR#3589 ToolSearch 设计的与 prefix-based KV cache 的根本矛盾——这是从 discussions/4065 真实用户成本报告反推出来的:
ToolSearch 设计逻辑:
Initial tool list 只发 ~5-10 个 core tools(read/write/search/execute)
↓ 模型需要其他工具时
tool_search("mcp filesystem") → 动态拉取 MCP / LSP / monitor / dream 等
↓ 节省 ~15K tokens(每轮 initial prompt)
但 prefix cache 的核心要求:prompt 前缀字节级稳定。ToolSearch 动态注入工具描述破坏了这个前缀稳定性:
| 维度 | ToolSearch 之前 | ToolSearch 之后 |
|---|---|---|
| Initial tool list | 稳定包含所有 ~30 工具 | 仅 core ~10 工具 + 动态发现 |
| Token 数 | 较高 | 减少 ~46% |
| Cache prefix | 稳定 → cache hit 97.5% | 动态 → cache hit 81.5% |
| DeepSeek 成本 | $1.05/day | $3.30/day(+214%) |
为什么 DeepSeek 成本爆炸:DeepSeek cache_hit 定价是 cache_miss 的 1/120(约 0.83% 价格)。失去 cache hit = 输入 token 价格涨 120 倍,远超 ToolSearch 节省的 46% token 数。
PR#4069 的修复:
- 新增
tools.toolSearch.enabled全局 settings 开关 - 自动 disable for
deepseek-v4-*(pattern match 默认 unless 显式覆盖) - 复用 PR#3589 的 eager-reveal fallback path(已有逻辑,0 core 改动)
设计教训:性能优化要按 cost model 评估,不能只看 token 数。同样的"减少 prompt size"在 prefix-cache 模型上反成 cost regression。这与 Reasoning Effort Deep-Dive cache 影响分析的"prefix stability > token count"哲学一致。
🎯 重点解析:PR#4070 cold-start V8 parse cost 直击
PR#4070 perf(cli): code-split lowlight to cut startup V8 parse cost (+1203/-77) 是 chiga0 的启动性能优化:
问题诊断:
cli.jsbundle: 25MB(含 lowlight ~1.5MB)- lowlight V8 parse 时间:36-60ms
- 但 lowlight 仅在首个 code block 渲染时才需要
修复方案:esbuild code-split,lowlight 拆为独立 chunk,按需 import()。
cli.js缩到 6.9MB(-72%)- Module-eval 阶段(perceived cold-start gap 1-3s 的主导)削减 36-60ms
- React/Ink 双 commit pattern:第一帧 plain text,chunk loaded 后第二帧 highlighted(用户不感知切换)
这是与 PR#3994 progressive MCP availability 互补的冷启动优化方向:
- PR#3994 削减 TTI(time to first input)—— 解决"等 MCP 完成 handshake 才能输入"
- PR#4070 削减 module-eval 时间 —— 解决"等 lowlight V8 parse 完成才能 render UI"
合并后预期 cold-start 总收益 ~1-2s(具体取决于 MCP 配置 + 是否有代码块输出)。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| promote 3-PR 系列 | PR-1 / PR-2 合并 + PR-3 OPEN | ✅ 3-PR 全部合并 + 用户可用 Ctrl+B / /promote |
| Anthropic proxy + cross-session cache | OPEN | ✅ MERGED(PR#4020 +1320/-37) |
| 低频工具 deferral | 5 项 (Cron/AUQ/ExitPlanMode/LSP/MCP) | ✅ 9 项 (+Monitor/SendMessage/TaskStop/WebFetch) - ask_user_question 例外保留 |
| legacy qwen auth subcommand | 734 行 handler | ✅ 移除,重定向到 /auth TUI dialog |
| ToolSearch 与 prefix cache 冲突 | 用户报 +214% 成本(PR#4065 discussion) | 🟡 PR#4069 OPEN —— 新增 tools.toolSearch.enabled settings + deepseek-v4-* 自动 disable |
| cold-start V8 parse 优化 | lowlight 36-60ms 同步 parse | 🟡 PR#4070 OPEN —— code-split lowlight 后 cli.js 25MB → 6.9MB |
| MCP 阻塞 TTI | 1 hung MCP 阻塞 10.5s | 🟡 PR#3994 OPEN(体量扩到 +1121)—— progressive availability |
累计计数
- 已合并 PR: 193 → 200(+7 业务 + 2 ci/refactor 不计入业务)
- 新 OPEN:16 项(含今日 2026-05-12 新创建 PR#4069 / PR#4070)—— PR#4069/4070/4067/4064/4062/4060/4059/4053/4051/4050/4048/4045/4037/3994/3973/3975 + 之前 5 项 wenshao 系列 PR#4023/4001/3990/3989/3970
2026-05-11(~5d 增量 · 28 项合并 · prior-read 守卫链闭环(PR#4002 close #3964 + #3945)+ reactive compression 落地+硬化(PR#3879 + PR#3985)+ LiveAgentPanel 完整化 + i18n coverage(PR#3871 +6253/-4423)+ Subagent isolation 5 PR 收官)
扫描窗口:2026-05-08 → 2026-05-11 UTC。窗口内 11 项合并 + 多项关键 OPEN。本次主线:① prior-read 守卫链完整闭环(PR#4002 +707/-127 close #3964 + #3945 · 与 Claude Code 行为对齐 · 3 部分修复:cacheable 与 truncation 解耦 / detectFileType 优先 mime+扩展名 / WriteFile partial-read 死锁);② reactive compression 跟进硬化(PR#3985 +189/-18 · setup-failure 释放 send lock + 显式失败 latch + AbortSignal 传播);③ LiveAgentPanel 完整化(PR#3909 inline AgentExecutionDisplay → 始终 LiveAgentPanel;PR#3919 panel-ownership filter + post-delete statusChange);④ TUI resize 优化(PR#3967 替换 ESC[2J ESC[3J ESC[H] 全屏清屏为 cursorTo + eraseDown 定向重绘 · 消除 resize 闪屏);⑤ subagent 审批 banner 补充工具详情(PR#3956 +179/-53 · general-purpose subagent 工具调用现显示完整命令 / diff / MCP server);⑥ OTel diagnostics 静音(PR#3986 +93/-3 · exporter 连接失败不再污染 UI surface · 走 debug log path);⑦ skills 热重载 slash commands(PR#3923 +212/-4 · SkillManager.addChangeListener 触发 slashCommandProcessor.reloadCommands() · /<skill> 不再需要重启);⑧ Idealab 作为第三方 provider(PR#3955);⑨ partial reads 在 prior-read enforcement 中被接受(PR#3932 · Edit 路径 lastReadWasFull relaxed)。
🟢 MERGED(关键项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#4002 | fix(core): unify Edit/WriteFile prior-read with Claude Code; close #3964 + #3945 | 2026-05-10 06:29 UTC | 🌟 关联 item-2 FileReadCache prior-read 守卫链最后闭环(+707/-127)—— 3 部分修复:① 解耦 cacheable 与 truncation(PR#3774 conflate 的 bug:partial / truncated 文本文件不再误报为二进制 payload);② detectFileType 优先看 mime/扩展名(新增 KNOWN_TEXT_EXTENSIONS 列表 50+ 文本扩展 .py/.kt/.go/.rs/.cpp/.cs/.vue/.svelte/.bash/.toml/.dockerfile 等),而非 isBinaryFile 4KB sample(修复 UTF-16 / encrypted FS / source-file header binary prefix 误判);③ 修 WriteFile partial-read 死锁(requireFullRead rejection 让模型回到同样 truncated 状态无逃生)。Close 高优先级用户报告 #3964(.kt/.cpp/.py/.ts Edit 失败 across 0.15.7-0.15.9 on Linux+Windows)+ #3945(large file 不可 Edit) |
| PR#3985 | fix(core): harden reactive compression follow-ups | 2026-05-09 15:20 UTC | 关联 item-10 反应式压缩(+189/-18)—— 修补 PR#3879 reactive compression 三个 review 漏洞:① setup-failure 释放 send lock(不再 block 后续 send);② 显式压缩失败 latch(只 latch failed 状态,跳过 NOOP,避免反复重试白消耗 compression API);③ AbortSignal 传播到 summary generation(用户 cancel 后压缩 API 调用即时停止) |
| PR#3986 | feat(telemetry): suppress OpenTelemetry diagnostics from UI | 2026-05-09 15:15 UTC | 关联 item-26 OTel Tracing(+93/-3)—— OTel SDK diagnostics(exporter 连接失败 / 警告)原本走 console 直接污染 UI surface;改路由到现有 debug log path。诊断信息仍可用,但不再 leak 到用户可见层 |
| PR#3967 | fix(cli): replace clearTerminal with targeted repaint on resize | 2026-05-09 10:27 UTC | TUI 渲染优化(+16/-0)—— 终端宽度变化时原来写 ESC[2J ESC[3J ESC[H](全屏清屏)导致 resize 时可见闪屏。改为 cursorTo(0, 0) + eraseDown 定向重绘(仅 width 变化时触发,height-only resize 不触发)。refreshStatic() full clear 保留给显式场景 |
| PR#3919 | fix(cli,core): live-phase panel-ownership filter + post-delete statusChange emit | 2026-05-08 05:42 UTC | 关联 LiveAgentPanel 完整化(+676/-50)—— PR#3909 把 inline AgentExecutionDisplay 替换为 always-on LiveAgentPanel 后两个 review 跟进:① panel-ownership filter(ToolGroupMessage live phase 过滤掉 panel-owned subagent rows 避免双重渲染);② post-delete statusChange emit(subagent 完成后 panel 即时更新而不是等下一轮) |
| PR#3956 | fix(cli): show tool details in subagent approval banner | 2026-05-08 12:20 UTC | 关联 subagent UX(+179/-53)—— general-purpose subagent 请求 tool permission 时 banner 只显示 agent name + 通用 Do you want to proceed?,完全隐藏实际 command / file diff / MCP server。修复:把 compactMode early-return 移到 unified return path 后,让 type-specific body 在 compact 模式也渲染。Body cap 5 行 + MaxSizedBox overflow |
| PR#3909 | feat(cli): replace inline AgentExecutionDisplay with always-on LiveAgentPanel | 2026-05-07 | 关联 subagent UI 架构变更——subagent 执行的"verbose inline frame"(3 档 compact/default/verbose 显示)下线,统一改为始终显示在 composer 下方的 LiveAgentPanel;与 PR#3919 / PR#3921 / PR#3922 配套形成完整 LiveAgentPanel 系列 |
| PR#3923 | feat(skills): reload slash commands when SkillManager fires change event | 2026-05-08 14:11 UTC | 关联 item-9 skill 加载 / slash 命令(+212/-4)—— SkillCommandLoader.loadCommands() 之前只在 CommandService.create() 跑一次,加 / 改 SKILL.md 后 <available_skills> tool description 更新但 slash-command list(/<skill-name>)保持 stale 直到重启。改:slashCommandProcessor 订阅 SkillManager.addChangeListener,chokidar watcher → refreshCache → notifyChangeListeners → reloadCommands()。Tracks #3696 sub-task 2 |
| PR#3932 | fix(core): accept partial reads in prior-read enforcement | 2026-05-08 | 关联 item-2 FileReadCache(PR#4002 前置)—— Edit 路径 lastReadWasFull relaxed(接受 partial read),WriteFile 仍要求 full read。但 cacheable 与 truncation 的 conflation 留到 PR#4002 才修 |
| PR#3916 | fix(core): drop disabled MCP server from health status registry | 2026-05-09 | 关联 item-13 MCP Auto-Reconnect(+182/-0 同 PR#3741 footer pill)—— 禁用的 MCP server 不再出现在 health registry,footer pill 不再误显示 |
| PR#3947 | [codex] Persist ACP model selection | 2026-05-08 | ACP 协议增强——ACP session 重连后 model 选择持久化(不再丢失) |
| PR#3955 | feat(cli): add Idealab as third-party provider | 2026-05-08 | 关联 provider-deep-dive——增加 Idealab 作为第三方 provider |
| PR#3871 | feat(cli): core built-in i18n coverage | 2026-05-10 | 🌟 大体量 i18n 国际化(+6253/-4423)——核心 built-in CLI 文案 i18n 覆盖。本周最大单 PR |
| PR#3897 | perf(core): bound session-list metadata reads to head/tail 64KB; pool buffer; lazy message | 2026-05-10 | session-list 性能优化(+1327/-198)——countSessionMessages 改为 head/tail 64KB sample;buffer pool;lazy message count。是 PR#3989 two-phase /resume 第一帧瞬时显示的前置基础 |
| PR#3879 | feat(core): add reactive compression on context overflow | 2026-05-09 | 🌟 关联 item-10 反应式压缩(+797/-12)——本 item 从"完全缺失"升级为 ✓ 首次实现:捕获 prompt_too_long 错误后自动触发 reactive compression + 重试。之前所有依赖主动压缩的最后兜底现在补齐。PR#3985 是后续硬化(修补 3 个 review 漏洞) |
| PR#3880 | feat(cli): searchable /resume picker with focus-aware modes | 2026-05-08 | /resume UX 大改(+1731/-109)——/resume picker 加 fuzzy search + focus-aware modes(输入态 / 选择态 / 预览态)。Closes #3977 系列;与 PR#3989 two-phase listing 协同 |
| PR#3902 | fix(core): throttle shell tool live text updates | 2026-05-09 | Shell 输出节流(+494/-64)——shell tool live text 更新过于频繁导致 TUI 重绘压力;加 throttle 控制刷新率 |
| PR#3905 | fix(cli): unfreeze Ctrl+O compact-mode toggle on long conversations | 2026-05-09 | Ctrl+O 卡死 bug(+432/-4)——长对话场景下 Ctrl+O 切 compact-mode 导致 TUI 冻结。修复渲染层堆积问题 |
| PR#3882 | fix(core): filter Mistral reasoning content at request boundary | 2026-05-09 | 关联 thinking 块跨 provider(+210/-0)——Mistral 返回 reasoning content 但下一轮请求时未过滤,导致重复发送或 API 拒绝 |
| PR#3963 | fix(cli): validate /model command arguments | 2026-05-08 | /model 参数校验(+467/-63)——/model unknown-model-id 之前静默接受导致后续请求失败,加 client-side 校验 |
| PR#3894 | feat(core): foreground → background promote integration (#3831 PR-2 of 3) | 2026-05-08 | Promote 系列 PR-2/3(+935/-15)——shell.ts 集成 result.promoted: true 检测 + snapshot output to bg_xxx.output + 注册 BackgroundShellEntry;与 PR#3842 (PR-1 signal.reason 基础) + PR#3969 (PR-3 Ctrl+B keybind,OPEN) 组合 |
| PR#3873 | fix(core): rebuild tool registry on subagent Config overrides | 2026-05-07 | Subagent isolation 5 PR 系列之一(+862/-41)——subagent Config overrides 时重建 ToolRegistry,让 bound tools 解析到 subagent 自己的 view 而非父 |
| PR#3892 | fix(core): close bound-tool gap on runForkedAgent's YOLO wrapper | 2026-05-08 | Subagent isolation 5 PR 系列之一(+394/-48)——runForkedAgent YOLO wrapper 路径补 bound-tool 配置 |
| PR#3887 | fix(core): stop per-subagent ToolRegistry on foreground-fork path | 2026-05-07 | Subagent isolation 5 PR 系列之一(+69/-3)——foreground-fork 路径停掉 per-subagent ToolRegistry,避免 lifecycle 泄漏 |
| PR#3893 | feat(telemetry): add sensitive span attribute opt-in | 2026-05-07 | 关联 item-26 OTel(+414/-52)——sensitive span attributes(如 prompt content / tool args)改为 opt-in(默认 redact),避免敏感数据自动 export 到 telemetry 后端 |
| PR#3915 | fix(skills): allow symlinks pointing outside the skills directory | 2026-05-07 | 关联 item-9 Skill(+86/-383)——skill 目录之前禁止 symlink 指向外部路径(过度防御),导致用户用 symlink 组织 skill 库失败。改为允许 + 加路径白名单 |
| PR#3908 | feat(web-templates): add light theme and toggle to /export HTML | 2026-05-07 | /export 增强(+262/-14)——/export 生成 HTML 加 light theme + toggle 按钮(之前仅 dark theme) |
| PR#3872 | fix(core): shrink file diff session records | 2026-05-06 | Session record 体积优化(+616/-20)——file diff session records 之前完整保留 before/after 内容,导致长 session JSONL 膨胀。改为只存 diff hash + 上下文截断 |
| PR#3903 | fix(cli): use tmux-safe dots spinner to reduce redraw pressure | 2026-05-07 | tmux 适配(+76/-3)——默认 spinner 在 tmux 下 redraw 频率过高,改为 tmux-safe dots variant |
| PR#3921 | fix(core): foreground agent entry lingering in status bar after completion | 2026-05-07 | LiveAgentPanel 系列——foreground agent 完成后 status bar entry 残留 |
| PR#3922 | fix(cli): prevent ESC in background tasks dialog from cancelling running request | 2026-05-07 | LiveAgentPanel 系列——background tasks dialog 内 ESC 不再误取消主请求 |
| PR#3875 | fix(core): create temp dir before saving truncated shell output | 2026-05-07 | Truncated shell output 保存(+10/-0)——长 shell 输出截断后保存到 temp 文件前先 mkdir |
| PR#3883 | fix(cli): warn on ignored provider generation config | 2026-05-07 | Provider 配置警告(+296/-5)——provider config 含未识别的 generation 字段时 warn |
| PR#3948 | fix(vscode): mark Qwen OAuth coder-model as Discontinued in model picker | 2026-05-08 | VSCode 集成(+648/-17)——Qwen OAuth coder-model 在 VSCode picker 标记为 Discontinued |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 关联 |
|---|---|---|
| PR#4023 🟡 OPEN | fix(cli): auto-restore prompt and preserve queue on cancel | wenshao · +1199/-47 · 关联 item-6 Mid-Turn Queue Drain——ESC 取消 prompt 时把 queue 流回 input buffer(drain on EVERY cancel path 包括 tool execution cancel)·镜像 Claude Code auto-restore-on-interrupt 行为 |
| PR#4020 ✅ 2026-05-11 MERGED | feat(core): improve Anthropic proxy compatibility and enable global prompt cache scope | wenshao · OPEN 时 +577/-34 → MERGED 时 +1320/-37 · 关联 prompt cache + provider——IdeaLab-style Anthropic-compat proxies(Authorization: Bearer 代 x-api-key 防双 header 冲突)+ 跨 session prompt caching(global cache scope) |
| PR#4022 ✅ 2026-05-11 MERGED | feat(tools): defer low-frequency built-in tools to reduce initial prompt size | wenshao · +20/-0 · 关联 ToolSearch 延迟工具机制——Monitor / SendMessage / TaskStop / WebFetch 4 个低频 built-in tools 标记 shouldDefer=true + searchHint · 与 Claude Code 延迟策略对齐 · 减小 initial function-declaration list |
| PR#3969 ✅ 2026-05-11 MERGED | feat(cli): Ctrl+B promote keybind (#3831 PR-3 of 3) | wenshao · OPEN 时 +290/-15 → MERGED 时 +308/-15 · foreground → background promote feature 收官(PR-1 #3842 signal.reason + PR-2 #3894 shell.ts 集成 → 本 PR 用户可见按键 Ctrl+B) |
| PR#3989 | feat(core,cli): two-phase session listing for instant /resume first frame | +1601/-310 · listSessionsLite(stat-only)+ enrichSessions(后台 hydrate)· /resume first frame 立即渲染 |
| PR#4001 | feat(cli): add structured JSON schema output | 关联 item-4 Structured Output · --json-schema flag |
| PR#3990 | feat(vscode): add Token Plan as first-class auth provider | VSCode 集成增强 |
| PR#3970 | refactor(core): TaskBase envelope + foreground subagent persistence | subagent 持久化重构 |
🎯 重点解析 1:PR#4002 prior-read 守卫链最后闭环
PR#4002 是 FileReadCache 系列(PR#3717 → PR#3810 → PR#3774 → PR#3932 → PR#4002)的收官——把"防 plausible-but-stale Edit"的语义从"实验性约束"升级到"与 Claude Code 行为完全一致"。3 部分修复对应 3 个不同 root cause:
| Part | 影响 | 修复 |
|---|---|---|
| Part 1 cache-side | partial / truncated text reads 被 priorReadEnforcement.ts 误报为二进制 payload | 解耦 cacheable(仅判断 content type)与 lastReadWasFull(判断是否完整) |
| Part 2 detection-side | isBinaryFile 4KB sample 在 UTF-16 / encrypted FS / source-file binary header 上误判 | detectFileType 优先看 mime registry + KNOWN_TEXT_EXTENSIONS(50+ 文本扩展) |
| Part 3 WriteFile dead loop | WriteFile requireFullRead 拒绝后让模型回到同样 truncated state | 与 Part 1 同源修复打通 |
Close 用户报告体量:#3964(.kt/.cpp/.py/.ts 在 0.15.7-0.15.9 across Linux+Windows)+ #3945(large file Edit 不可用)—— 这是过去 2 周用户报告最高频的 file-edit 类 bug。
🎯 重点解析 2:PR#3909 / PR#3919 LiveAgentPanel 系列完整化
subagent 执行 UI 经过从"inline frame 3 档(compact/default/verbose)"→"always-on LiveAgentPanel"的架构变更:
| PR | 状态 | 改动 |
|---|---|---|
| PR#3909 | ✓ 2026-05-07 | 替换 inline AgentExecutionDisplay → LiveAgentPanel(panel 在 composer 下方常驻) |
| PR#3919 | ✓ 2026-05-08 +676/-50 | live-phase panel-ownership filter(避免 ToolGroupMessage 与 LiveAgentPanel 双重渲染)+ post-delete statusChange emit |
| PR#3921 | ✓ 2026-05-07 | foreground agent entry 完成后不再 linger 在 status bar |
| PR#3922 | ✓ 2026-05-07 | background tasks dialog ESC 不再取消 running request |
| PR#3956 | ✓ 2026-05-08 | subagent approval banner 加 tool details |
整套系列把 subagent 执行 UI 从 "几乎不可见 + verbose 三档不直观" 改造为"始终可见 panel + approval banner 含完整工具信息"。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-2 FileReadCache prior-read 守卫链 | 主体实现 + prior-read 局部生效 | ✅ 完整闭环(与 Claude Code 行为一致)(PR#4002 +707/-127 close #3964 + #3945) |
| item-10 反应式压缩 | PR#3879 initial impl | ✅ 硬化(PR#3985 修补 3 个 review 漏洞) |
| OTel diagnostics UI 干净度 | 走 console 污染 UI | ✓ 修复(PR#3986 走 debug log path) |
| subagent approval UX | banner 隐藏工具详情 | ✓ 修复(PR#3956 显示 command / diff / MCP server) |
| LiveAgentPanel 完整化 | inline 3 档(PR#3909 前) | ✅ always-on panel + ownership filter + post-delete sync |
| Skill slash command 热重载 | 改 SKILL.md 需重启 | ✓ 修复(PR#3923) |
| terminal resize 闪屏 | 全屏 ESC[2J 清屏 | ✓ 修复(PR#3967 targeted repaint) |
🎯 重点解析 3:Subagent isolation 5 PR 系列收官
Subagent isolation 是 PR#3735(agent-local resource manager)以来跨多周的工程序列,确保父 daemon 与 subagent 之间不泄漏配置 / tool registry / lifecycle。本周收尾 5 PRs:
| PR | 合并 | 重点 |
|---|---|---|
| PR#3735 | (早期) | agent-local resource manager 基础 |
| PR#3873 | 2026-05-07 +862/-41 | rebuild ToolRegistry on subagent Config overrides |
| PR#3887 | 2026-05-07 +69/-3 | stop per-subagent ToolRegistry on foreground-fork path |
| PR#3892 | 2026-05-08 +394/-48 | close bound-tool gap on runForkedAgent YOLO wrapper |
| PR#3707 | OPEN | per-agent ContentGenerator |
合计 +1325 行隔离修复,让 subagent 真正以 "fork-and-isolate" 语义运行(之前有多个 sneaky 路径让父 config / tool registry 泄漏到 subagent)。这与 §02 §2 决策"1 daemon = 1 session / 进程级隔离免费"哲学一致——subagent 在同一 daemon 内也通过 isolation 套路达到类似进程级的隔离强度。
🎯 重点解析 4:i18n PR#3871 大体量国际化收官
PR#3871 (+6253/-4423) 是过去一周最大单 PR——core built-in CLI 文案 i18n 全覆盖。这是 Qwen Code 国际化路线的关键里程碑:之前散落各处的英文文案现在统一走 i18n 框架,支持中文 / 英文 / 多语言切换。-4423 删除来自旧硬编码英文常量;+6253 来自 i18n key/value 注册 + 所有调用点改为 t('key') 形式。
累计计数
- 已合并 PR: 165 → 193(+28,含完整本期 7 天扫描窗口)
- 本周 Top 5 体量:PR#3871 +6253/-4423(i18n) · PR#3880 +1731/-109(searchable /resume) · PR#3933 +1772/-82(codex monitor notifications)· PR#3909 +1439/-1126(LiveAgentPanel)· PR#3897 +1327/-198(session-list perf)
- 关键 OPEN:8 项 wenshao 系列(PR#4023 cancel queue / #4020 Anthropic proxy + global cache / #4022 deferred tools / #3969 Ctrl+B promote / #3989 two-phase session list / #4001 structured JSON output / #3970 TaskBase / #3990 VSCode Token Plan)
备忘:扫描盲区检查
本期 7 天扫描共 50 项 merged PR,其中 22 项为 CI / chore / release / test infra(v0.15.7 - v0.15.10 release 链 + CI 优化 + bilingual issue commands + sdk-python release tooling),剩余 28 项业务 PR 已全部并入本期日志。CI / release 类不单独列项(在累计计数内)。
备忘:FileReadCache 系列单挑战 5 PR、跨 13 天
FileReadCache 从最初的"性能优化提案"演化到"与 Claude Code 行为对齐的可信度约束":
2026-04-30 PR#3717 +1212/-10 FileReadCache + 未变更 Read 短路
2026-05-04 PR#3810 +579/-0 5 路径 invalidation 修复(#3805)
2026-05-06 PR#3774 +1891/-118 prior-read enforcement + 2 错误码
2026-05-08 PR#3932 — Edit 接受 partial read
2026-05-10 PR#4002 +707/-127 3 部分修复 close #3964 + #3945
———————————————————————————————————————
合计 5 PRs +4389 行 13 天闭环
这是当前 codeagents 项目追踪的单 item 跨 PR 数最多的工程序列,验证了"feat/fix 一次提案 → 多轮 review → 多个 follow-up 直到与 reference 实现对齐"的迭代模式。
2026-05-06 第二轮(~10h 增量 · 6 项合并 · kind framework 第 4 消费者 dream 落地(PR#3836 +1714/-100)+ auto-memory recall 不阻塞 + fast model per-model 配置)
扫描窗口:2026-05-05 17:20 UTC → 2026-05-06 03:14 UTC。窗口内 6 项合并。本次主线:① Kind framework 第 4 消费者 dream 任务正式落地 + 含 cancellation(PR#3836 体量从 OPEN 时 +598 增长 3x 到 +1714/-100,scope 扩展到含 task_stop + dialog x 键 + MemoryTaskStatus 'cancelled');② auto-memory recall 不再阻塞主请求(PR#3814 修复每轮 ~5s 延迟);③ fast model side queries 用 per-model 配置(PR#3815 修复 settings 从 main model 泄漏到 fast model);④ skill 激活基于 discovered 路径(PR#3852 + 安全设计防伪造路径激活);⑤ 微信图片发送(CDN 上传)(PR#3781 channels 增强)。
🟢 MERGED(6 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3836 | feat(core,cli): surface and cancel auto-memory dream tasks | 2026-05-06 02:20 UTC | 🌟 Kind framework 第 4 消费者落地(+1714/-100 · 体量从 OPEN 时 +598/-19 增长 3x · 标题从 feat(cli): surface 扩到 feat(core,cli): surface **and cancel**)—— 把 dream 加为第 4 种 kind(agent / shell / monitor / dream)。新增能力相比 OPEN 版本:① MemoryTaskStatus 加 'cancelled' 状态(不只是 surface,还能 cancel);② MemoryManager.cancelTask(dialog x 键路由);③ task_stop 工具加第 4 dispatch route(模型也能 cancel dream task);④ cancellation aborts dream fork-agent + 现有 runDream finally 块释放 consolidation lock。用户行为变化:以前 dream 静默后台跑,现在每个 fired dream 在 footer pill 出现(1 dream)+ dialog 短期保留 — additive change 但用户从只看 toast 变成看 pill counter ticking |
| PR#3814 | fix(core): prevent auto-memory recall from blocking main request | 2026-05-05 23:34 UTC | 🌟 关联 item-4/5 会话记忆 / Auto Dream(+419/-24 · 修复 #3759)—— 重大用户体验 bug:auto-memory recall 的 5s AbortSignal.timeout 每轮都触发,主请求路径同步 await 完整 recall promise(含 timeout + heuristic fallback),每个用户 turn 被延迟 ~5s。修复:① resolveAutoMemoryWithDeadline() 让 recall 与 2.5s deadline 赛跑,未完成则用空结果继续主请求;② model-driven selector timeout 从 5s 降到 2s;③ 用 AbortSignal.any([timeout(2_000), callerAbortSignal]) 把 deadline 通过 recall() → selectRelevantAutoMemoryDocumentsByModel → runSideQuery 传播取消 in-flight LLM call。这是 PR#3087 auto-memory 系列的关键性能修复 |
| PR#3815 | fix(core): use per-model settings for fast model side queries | 2026-05-05 18:07 UTC | 🌟 关联 fast-model-usage-deep-dive 整体设计(+544/-2 · 修复 #3765)—— side queries(session recap / title generation / tool-use summary)走 fast model 时用了 main model 的 ContentGeneratorConfig,导致 main model 的 extra_body / samplingParams / reasoning 设置泄漏到 fast model 请求。典型案例:main model extra_body.enable_thinking: true,fast model extra_body.enable_thinking: false —— side query 仍发 enable_thinking: true 给 fast model(因为用的 main model config)。修复:GeminiClient.generateContent() 在请求 model ≠ main model 时通过 buildAgentContentGeneratorConfig()(与 subagents 同模式)解析目标 model 自己的 ContentGeneratorConfig + 创建专用 ContentGenerator |
| PR#3852 | fix(core): activate skills from discovered result paths | 2026-05-05 17:57 UTC | 关联 item-9 指令条件规则 + item-28 Skill 装载(+656/-56)—— path-conditional skill 激活之前只看 tool 输入路径,但 broad selector(如 **/*.ts)能 discover 到具体文件路径,被遗漏。本 PR 让 scheduler 也考虑 discovery 工具(glob / grep_search / ripGrep)的具体结果路径。安全设计:仅信任 filesystem 工具的 result-side metadata + 用 structured ripgrep 输出避免伪造路径激活 |
| PR#3781 | feat(weixin): add image sending support via CDN upload | 2026-05-05 17:49 UTC | Channels 增强(+954/-46)—— 微信适配器加 CDN 图片上传支持(与 PR#2628 channels 平台延续) |
| PR#3832 | fix(sdk-python): standardize TAG_PREFIX to include v suffix | 2026-05-06 03:14 UTC | sdk-python release 工具修复(+6/-6) |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 关联 |
|---|---|---|
| PR#3860 | chore(deps): upgrade ink 6.2.3 → 7.0.2 + bump Node engine to 22 | 重大依赖升级(+6258/-7915 lockfile)—— Ink 7 要求 Node ≥22 + React ≥19.2 + react-reconciler 0.33。No source code changes —— ink 6→7 API 兼容(公开 surface 一致),用户可见的渲染优化"once Ink 7 loaded"自动激活。涉及 TUI 渲染稳定性(item-44 瞬态消息容器) |
| PR#3861 | fix(cli): preserve comments and formatting in settings.json during migration write-back | settings 迁移 write-back 时保留 JSON 注释 + 格式 —— Qwen .qwen/settings.json 用户可能写注释,迁移时不应抹掉 |
🎯 重点解析 1:kind framework 第 4 消费者闭环(PR#3836)
回顾时间线(subagent-display §零):
| 时间 | PR | 消费者数 | 验证内容 |
|---|---|---|---|
| 2026-04-28 | PR#3488 | 1(agent) | 引入 framework |
| 2026-04-29 | PR#3720 | 2(+ shell) | shell 接入 |
| 2026-05-03 | PR#3791 | 3(+ monitor) | monitor 接入 + Lint fix const _exhaustive: never |
| 2026-05-06 | PR#3836 | 4(+ dream) | dream 接入,含 cancellation |
OPEN → MERGED 体量爆涨原因:OPEN 版(+598)原本 scope-out 了"PR-2 cancellation"("requires MemoryManager.cancelTask + dream-fork abort + lock rollback"),MERGED 版(+1714)直接把 PR-2 也合进来了——这意味着:
- 不再需要等下一个 PR 实现 cancellation
task_stop工具的 dispatch 表现在覆盖全部 4 种 kind- dialog
x键对所有 4 种 kind 行为一致
zero core-package changes 假设被推翻:OPEN 版称"复用 MemoryManager.subscribe(),zero core-package changes",MERGED 版实际改了 core(MemoryTaskStatus 加 'cancelled' + MemoryManager.cancelTask 新方法)。但这是有意识的架构决策——既然 dialog 提供 x 键,就应该把 cancellation 做到底,而不是只 surface。
🎯 重点解析 2:auto-memory 系列 5s 阻塞 bug 终结
PR#3814 修复的是 PR#3087 auto-memory 系列引入的性能 regression:
旧路径:每个 user turn → recall() 同步 await(含 5s timeout)→ 主请求开始
└─ 即使 recall 失败/超时,主请求也被强制等 5s
新路径:每个 user turn → 启动 recall promise → 2.5s deadline 赛跑
├─ 2.5s 内完成 → 用 recall 结果
└─ 2.5s 未完成 → 空结果继续主请求 + abort recall(取消 in-flight LLM call)
用户感知:每轮节省 ~2.5-5s 延迟(特别是 fast model side queries 慢的场景)。
🎯 重点解析 3:fast model 配置泄漏问题(item-22 思想延伸)
PR#3815 修复了一个微妙但严重的配置泄漏:side queries 走 fast model 时用了 main model 的 ContentGeneratorConfig。这与 item-22 thinking 块 series 的思想一致——不同模型有不同 API 形态,配置必须 per-model 解析而不是全局共享。
修复方法用与 subagents 相同的 buildAgentContentGeneratorConfig() 模式——"per-agent ContentGenerator view"已经是 Qwen Code 的成熟工程模式。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| Kind framework 消费者数 | 3(agent + shell + monitor) | 4(+ dream)含 cancellation 全套 |
| auto-memory recall 阻塞 | 每轮 ~5s 延迟 bug | ✓ 修复(PR#3814 deadline 赛跑 + abort 传播) |
| fast model 配置隔离 | 从 main model 泄漏 | ✓ 修复(PR#3815 per-model ContentGeneratorConfig) |
| path-conditional skill 激活 | 仅看 tool 输入路径 | ✓ 含 discovered 路径 + 安全防伪造(PR#3852) |
累计计数
- 已合并 PR: 159 → 165(+6)
- 关键 OPEN PR:本轮新增 PR#3860(Ink 7 升级 + Node 22)+ PR#3861(settings.json 注释保留)
备忘:Ink 7 升级带来的"白嫖"渲染优化
PR#3860 自述:"No business code changes — only deps, lockfile, docs"。Ink 6→7 API 兼容,但 user-visible 渲染改进自动激活(once Ink 7 loaded)。这与之前 item-44 / 焦点锁等 TUI flicker 系列工作互补——很多 flicker 问题在 Ink 7 中已上游修复。建议合并后审计是否有 item-44 / item-46 / item-47 等系列任务因 Ink 7 而自动 ✓。
2026-05-06(~24h 增量 · 6 项合并 + 12 项关键 OPEN · WebSearch 工具回归(PR#3844)+ Issue #3841 引用 web-search-tool-deep-dive 分析)
扫描窗口:2026-05-04 17:20 UTC → 2026-05-05 17:20 UTC。窗口内 6 项合并 + 12 项关键 OPEN。本次主线:① WebSearch 工具回归(PR#3502 ✓ 2026-04-24 移除 1,830 行 → PR#3844 OPEN 2026-05-05 重新添加,但 Issue #3841 直接引用 codeagents 项目的 web-search-tool-deep-dive.md 跨产品对比分析——文档影响产品决策的具体案例);② MCP coalesce 落地(PR#3818 +239/-2);③ shell-escaped 文件路径修复(PR#3820 +561/-168);④ OTel telemetry shutdown timeout(PR#3813 +130/-3)。
🟢 MERGED(6 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3820 | fix(core): unescape shell-escaped file paths in Edit, WriteFile, and ReadFile tools | 2026-05-04 17:33 UTC | 正确性 bugfix(+561/-168)—— 加 unescapePath 在 validateToolParamValues 中规范化(含 Edit / ReadFile / WriteFile + CoreToolScheduler 条件规则匹配)。LLM 可能从 at-completion 或人工输入收到 shell-escaped 路径如 my\ file.txt,转换为 my file.txt 后才执行。修复"含空格/括号/&等特殊字符的文件名"被报"file not found"的问题 |
| PR#3818 | fix(core): coalesce MCP server rediscovery | 2026-05-05 10:31 UTC | 关联 item-13 MCP Auto-Reconnect(+239/-2)—— 同 server 的并发 rediscovery 请求共享 in-flight restart,不再独立启动 replacement clients;rediscovery 替换连接前停掉旧 health-check timer。修复多个 reconnect/restart 路径并发尝试替换同一连接导致额外 MCP 进程游离(无 tracked client) |
| PR#3813 | fix(telemetry): add bounded shutdown timeout and fix service.version resource attribute | 2026-05-05 03:12 UTC | 关联 item-26 OTel Tracing(+130/-3)—— 关闭时无界等待修复 + service.version resource attribute 修正 |
| PR#3834 | refactor: extract shared release helper utilities | 2026-05-05 02:15 UTC | sdk-python release 工具复用(+211/-108) |
| PR#3833 | feat(sdk-python): add network timeouts to release version helper | 2026-05-05 11:25 UTC | sdk-python release 网络超时(+105/-3) |
| PR#3783 | feat(cli): Add ability to switch models non-interactively from the cli | 2026-05-05 16:54 UTC | 配套 PR#3797 / PR#3799 形成模型管理三件套(+92/-17)—— headless 切模型 CLI 入口;与已 OPEN 的 /model list + 跨 OpenAI-compat 端点响应规范化形成完整 headless 模型管理 |
🟡 关键 OPEN(值得追踪 12 项)
| PR | 方向 | 关联 |
|---|---|---|
| PR#3844 | feat(tools): add WebSearch tool with prompt-injection defenses | 🌟🌟🌟 WebSearch 工具回归(+1238/-3 / 11 文件)—— Issue #3841 直接引用 codeagents web-search-tool-deep-dive.md 的跨产品对比 + 路径 A/B/C 框架;本 PR 实现 path C:DashScope-compat provider 显式 web_search 工具 + Claude Code-style 7 层 prompt-injection 防御(max_uses=8 via WeakMap、MAX_RESULT_SIZE_CHARS=100K、allowed_domains/blocked_domains、加入 COMPACTABLE_TOOLS / BOUNDARY_TOOLS)。15 新测试。意义:填补本系列长期追踪的 WebSearch gap 同时与 PR#3502(2026-04-24 删除 1,830 行原 4-provider 实现)形成"删除→反思→Claude-style 重新设计"完整循环 |
| PR#3850 | refactor(core): classify retry errors | 关联 item-8 + 已 OPEN PR#3798 + PR#3827 —— retry 系统统一化重构。这是 retry 三件套(classify + delay policy + rate-limit handling)的进一步整合 |
| PR#3849 | feat(models): add cross-authType model resolution to ModelRegistry and ModelsConfig | 跨认证方式(OAuth / API key / 等)的模型解析统一 |
| PR#3852 | fix(core): activate skills from discovered result paths | 关联 item-28 Skill 装载 —— 从 discovered result paths 激活 skill |
| PR#3848 | fix(memory): route auto-memory recall selector to fast model | 关联 item-4/5 会话记忆 + Auto Dream + fast model 应用 —— auto-memory recall selector 走 fast model(参考 fast-model-usage-deep-dive 第 6 项) |
| PR#3847 | feat(telemetry): inject traceId/spanId into debug log files for OTel correlation | 关联 item-26 OTel —— debug 日志与 OTel span 关联 |
| PR#3842 | feat(core): add signal.reason convention for ShellExecutionService (#3831 PR-1 of 3) | 新 3 件套预告 —— ShellExecutionService 重构系列首 PR(标题写明 "PR-1 of 3") |
| PR#3840 | feat(core): refuse Edit/WriteFile when the file changed since last read | 关联 item-2 FileReadCache + PR#3774 prior-read enforcement —— 文件 last read 后被外部修改时拒绝 Edit/WriteFile(与 PR#3774 是双轨:3774 要求"必须先 read",3840 要求"read 后未变" · 是 prior-read enforcement 的另一面) |
| PR#3856 | feat(cli): polish --add-dir / --include-directories feature | --add-dir 用户体验抛光 |
| PR#3855 | feat(installer): verify installation release assets | installer 验证 |
| PR#3853 | feat(installer): add hosted install release alias | installer hosted alias |
| PR#3854 | ci: add Qwen Code issue follow-up bot workflow | issue 跟进 bot |
🎯 重点解析:WebSearch 工具的"删除→反思→Claude-style 重新设计"循环
PR#3844 的合并将完成Qwen Code 的 WebSearch 工具完整循环:
| 时间 | 事件 |
|---|---|
| PR#3502 之前 | Qwen Code 有内置 web_search 工具 + 4 providers(DashScope/Tavily/Google/GLM) |
| 2026-04-21 | Issue #3496 "webSearch功能,在免费份额停掉以后是不是也无法使用了" 提出(已 closed) |
| 2026-04-24 | PR#3502 ✓ 合并 —— 删除全部 web_search(+167/-1830 净删 1,663 行 + 4 providers + cli flag + env var)转为 "MCP-based approach",理由:"built-in tool required maintaining provider-specific integrations and API key plumbing... while MCP already provides a cleaner, more extensible mechanism" |
| 2026-05-04 | codeagents 项目发布 web-search-tool-deep-dive.md —— 对比 5 大 Code Agent + Bailian 后端,记录 Qwen Code 此时"完全缺失"WebSearch + 提出 path A/B/C 改进路径 |
| 2026-05-05 04:33 UTC | Qwen Code 团队成员发起 Issue #3841 "feat(tools): add WebSearch support (start by passing through DashScope enable_search)" —— 直接引用 codeagents 文档的跨产品对比表 + 数字(569/39/71/163/0)+ path A/B/C 框架 |
| 2026-05-05 | PR#3844 OPEN —— 实现 path C,但带 Claude Code-style 7 层 prompt-injection 防御(max_uses=8 / MAX_RESULT_SIZE_CHARS=100K / allowed_domains 25 / blocked_domains client-side / COMPACTABLE_TOOLS / BOUNDARY_TOOLS / safety footer + warning)—— 比删除前的 4-provider 版本架构更稳健 |
架构演进意义:从"自建 4 provider 各打 API"→"MCP 完全外部化"→"DashScope 单 provider + Claude-style 防御"。最终方案不是 PR#3502 的 MCP only,也不是删除前的 4-provider all-in-one,而是吸收 Claude Code 安全设计后的 "1 default provider + MCP fallback"——这是被 codeagents 文档引导出的设计决策。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| WebSearch 工具 | 完全缺失(PR#3502 删除后) | 🟡 回归进行中(PR#3844 OPEN,含 Claude-style 7 层防御) |
| MCP Auto-Reconnect | 🟡 部分(reconnect-on-error) | 🟡 部分 + rediscovery 并发合并(PR#3818 ✓ 修复同 server 并发 reconnect 留游离进程) |
| shell-escaped 路径处理 | bug | ✓ 修复(PR#3820 +561/-168) |
| OTel telemetry shutdown | 无界等待 | ✓ bounded(PR#3813) |
累计计数
- 已合并 PR: 153 → 159(+6)
- 关键 OPEN PR:本轮新增 12 项(含 PR#3844 WebSearch 回归 + retry 三件套整合 + ShellExecutionService 重构 PR-1/3 + auto-memory fast model 路由 + ...)
备忘:codeagents 文档影响产品决策的首例
Issue #3841 + PR#3844 是codeagents 项目的分析直接影响 Qwen Code 团队设计决策的首个案例:
- 我们的 deep-dive 提供了精确的跨产品对比数据(569/39/71/163/0 LOC)
- 我们的"path A/B/C"框架被原文引用
- PR 选择了 path C 而非 path B(最小改动),并加上了 path C 章节"Mandatory Prompt Injection Defenses"列出的所有 Claude-style 防御项
这印证了 codeagents 项目"基于源码验证的中立技术对比"价值——不只是文档化已有事实,还能为产品改进提供可执行的工程蓝图。
2026-05-05(OPEN-only 增量 · kind framework 第 4 个消费者 dream 任务出现)
扫描窗口:2026-05-04 15:32 UTC → 2026-05-04 17:20 UTC。窗口内 0 项合并 + 1 项关键新 OPEN + 4 项 sdk-python release 工具 OPEN。本次主线:PR#3836 OPEN —— kind framework 从 3 消费者扩到 4 消费者(agent / shell / monitor / dream),把 auto-memory dream tasks 接入 Background tasks pill+dialog 统一调度面,进一步压测 PR#3488 / PR#3720 引入的 framework 是否真正 generic。
🟡 关键 OPEN(值得追踪 1 项)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3836 | feat(cli): surface auto-memory dream tasks in Background tasks dialog | 🌟 Kind framework 第 4 个消费者(+598/-19)—— 今天 managed auto-memory dream 任务(每 UserQuery 通过 MemoryManager.scheduleDream 调度)静默后台跑,用户只能见 memory_saved toast。本 PR 加 dream 为第 4 种 kind:footer pill 含 dream 计数;dialog 列表 [dream] memory consolidation reviewing N sessions;detail body 显示 sessions / progress / topics / failures。关键设计:复用 MemoryManager.subscribe() / listTasksByType() —— zero core-package changes。MAX_RETAINED_TERMINAL_DREAMS = 3 镜像 MonitorRegistry 终端 cap;pending/skipped 过滤;extract tasks intentional 排除(每 UserQuery 触发 flood)。Scope-out:PR-2 cancellation;PR-3 live progress(需 runForkedAgent 加 onAssistantMessage callback 涉及 4 调用点)。关联 item-4 会话记忆 / item-5 Auto Dream + subagent-display Background tasks dialog 设计 |
🎯 重点解析:kind framework 真正 generic 的证据链
PR#3488 引入 BackgroundTasksDialog 时只有 1 个消费者(agent),存在"generic 是声称还是事实"的悬念。后续 PR 逐步压测:
| 时间线 | 消费者数 | PR | 验证内容 |
|---|---|---|---|
| 2026-04-28 | 1(agent) | PR#3488 | 引入 framework |
| 2026-04-29 | 2(agent + shell) | PR#3720 | shell 接入,framework 第一次外部验证 |
| 2026-05-03 | 3(agent + shell + monitor) | PR#3791 | monitor 接入(kind framework 第三个消费者,Lint fix 加 default: { const _exhaustive: never }) |
| 2026-05-04 OPEN | 4(+ dream) | PR#3836 | dream 接入,zero core-package changes —— framework 真正 generic 的最强证据 |
zero core-package changes 的意义:第 1 / 2 / 3 个消费者每加一个都需要 core 改动(新 registry 类、新 callback 接口)。第 4 个消费者 dream 复用 MemoryManager 已有 API 即可 —— 这说明 framework 的"generic 抽象"不仅仅是命名,是真的能不修改 core 就接入新 kind。
🟡 sdk-python release 工具系列 OPEN(4 项)
PR#3833 / PR#3834 / PR#3835 / PR#3832 是 sdk-python 包的 release 自动化工具改进(network timeouts / extract shared helpers / --generate-notes / TAG_PREFIX 标准化)。与改进 item 无直接关联,仅在此处登记。
状态
- 已合并 PR: 153(无变化)
- 关键 OPEN PR:新增 PR#3836(dream 任务接入 dialog)
备忘:Background tasks framework 演进观察
5 月份连续 4 周 PR 围绕 Background tasks 系统迭代——从 PR#3471/3488 控制面引入到 PR#3836 第 4 消费者扩展,Qwen Code 的"统一调度面"是这个月最一致的工程主题。建议为这个主题专门补一篇 deep-dive("Kind Framework Deep-Dive"),系统记录从 PR#3488 到 PR#3836 的设计演进。
2026-05-04(~28h 增量 · 6 项合并 + 9 项新 OPEN · Phase D part(a) 收官 + DeepSeek max tier 落地 + FileReadCache 关键 invalidation 修复)
扫描窗口:2026-05-03 11:30 UTC → 2026-05-04 15:32 UTC。窗口内 6 项合并 + 9 项新 OPEN。本次主线:① Phase D part (a) 收官(PR#3809 +649/-1 合并,体量从 OPEN 时 +130 增长 5 倍 · 关键设计精化:阈值改为"effective timeout 的一半"per-invocation 含 1000ms floor);② DeepSeek max tier 落地(PR#3800 +926/-80 合并 · 体量从 OPEN 时 +516 大幅增长);③ PR#3810 FileReadCache 关键 invalidation 修复(+579/0 · 修复 #3805 "read tool returns no content in long-running sessions" · PR#3717 漏掉 5 条 history-rewrite 路径的清缓存逻辑);④ PR#3792 post-merge cleanup 体量翻倍(+664/-227 vs OPEN 时 +199/-199);⑤ 多项性能/可靠性新方向 OPEN(MCP coalesce + retry policy 统一 + auto-memory 不阻塞主请求)。
🟢 MERGED(6 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3809 | feat(core): hint to background long-running foreground bash commands | 2026-05-04 15:24 UTC | 🌟 Phase D part (a) 收官(+649/-1 · 体量从 OPEN 时 +130 增长 5 倍 · 5 commits)—— 关键设计精化:阈值不是固定 60 秒,而是effective timeout 的一半(per-invocation),1000ms floor。default-timeout(120s)调用在 60s 出 advisory;显式 timeout: 600_000 在 300s 出;pathological tiny timeouts(timeout: 1)不会冒出"ran for 0s" advisory。Advisory 显式警告"别重跑刚完成的命令"——matters for stateful operations like deploys / migrations / git push。配合 PR#3684 sleep interception(validate 时),形成完整双层"长跑后台化"防御 |
| PR#3800 | feat(core): support reasoning effort 'max' tier (DeepSeek extension) | 2026-05-04 14:42 UTC | 🌟 DeepSeek max tier 落地(+926/-80 · 体量从 OPEN 时 +516/-57 大幅增长 · 直接命中 reasoning-effort-deep-dive §3.3 推荐实施方案 Step 1+2)—— ContentGeneratorConfig.reasoning.effort 联合类型加 'max';deepseek provider translateReasoningEffort() 把 reasoning.effort 扁平化为 reasoning_effort body 参数;backward-compat:low/medium → high,xhigh → max;Anthropic generator thinking.budget_tokens 阶梯:low 16K / med 32K / high 64K / max 128K |
| PR#3810 | fix(core): clear FileReadCache on every history rewrite path | 2026-05-04 14:42 UTC | 🌟 关键正确性 bugfix(+579/-0 · 修复 #3805 "read tool returns no content in long-running sessions")—— PR#3717 漏检的 5 条 history-rewrite 路径:原 PR#3717 wired invalidation 到 tryCompressChat + Config.startNewSession 两条路径,但漏掉:① microcompactHistory(idle cleanup ≥60min);② GeminiClient.setHistory(/restore / /load_history);③ GeminiClient.truncateHistory(rewind);④ GeminiClient.resetChat(public API);⑤ stripOrphanedUserEntriesFromHistory(retry path)。每路径单 getFileReadCache().clear() + 集成测试用真实 ReadFileTool / on-disk 文件验证 bug 真实存在。意义:FileReadCache 的占位符依赖 prior tool result 仍在 history,history rewrite 后必须 invalidate;遗漏导致 Read 在 tool 层成功但 LLM 拿到空内容 |
| PR#3792 | fix(core): address post-merge monitor tool and UI routing issues | 2026-05-04 13:19 UTC | PR#3684 review 反馈清扫(+664/-227 · 体量从 OPEN 时 +199/-199 增长 3.3 倍)—— Token bucket clock-drift guard / AST parse failure logging / 合并 SHELL_TOOL_NAMES / 抽 background-work utils / getToolCallComponent 路由统一 + web_search 兼容别名 |
| PR#3808 | docs(core): point background-shell + monitor guidance at both /tasks and the dialog | 2026-05-04 14:27 UTC | PR#3801 docs follow-up(+24/-12)—— shell.ts / task-stop.ts 的 model-facing 字符串从只引用 /tasks 升级为同时提及 dialog(让 LLM 根据 TTY/headless/SDK/ACP 模式建议对的 surface) |
| PR#3807 | fix(telemetry): suppress async resource attribute warning on startup | 2026-05-03 11:36 UTC | 关联 item-26 OTel(+13/0)—— NodeSDK 加 autoDetectResources: false 消除每次启动打印的 "Accessing resource attributes before async attributes settled" warning |
🟡 关键 OPEN(值得追踪 9 项)
| PR | 方向 | 关联 |
|---|---|---|
| PR#3827 | refactor(core): unify retry delay policy | 关联 item-8 API 指数退避 —— retry delay 策略统一抽象。配合已 OPEN 的 PR#3798(classifyError)+ PR#3790(rate-limit retry handling)形成 retry 系统三件套 |
| PR#3818 | fix(core): coalesce MCP server rediscovery | 关联 item-13 MCP Auto-Reconnect —— 多次并发重发现合并为一次 |
| PR#3819 | fix(core): prevent duplicate MCP processes from concurrent discovery | 配套 PR#3818 —— 防止并发 discovery 起重复 MCP 进程 |
| PR#3814 | fix(core): prevent auto-memory recall from blocking main request | 关联 item-4 会话记忆 / item-5 Auto Dream —— PR#3087 auto-memory 在主请求路径上同步召回,本 PR 解阻塞 |
| PR#3815 | fix(core): use per-model settings for fast model side queries | 关联 fast model 路由 —— side queries 用 per-model 配置而非全局默认 |
| PR#3820 | fix(core): unescape shell-escaped file paths in Edit/WriteFile/ReadFile | 文件路径处理 bug —— shell-escaped 路径在 file 工具中未 unescape |
| PR#3813 | fix(telemetry): bounded shutdown timeout + service.version resource attribute | 关联 item-26 OTel —— 关闭时无界等待 + service.version 资源属性 |
| PR#3826 | fix(cli): track model-sent slash command history | 模型发出的 slash 命令也记录到 history(headless / SDK 路径) |
| PR#3828 | feat(installer): publish release installer assets | 与 PR#3776 standalone archive installation 配套 |
🎯 重点解析 1:Phase D part (a) 阈值精化(PR#3809)
OPEN 版本(+130/0)阈值为固定 60 秒;MERGED 版本(+649/-1)改为effective timeout 的一半:
| 场景 | OPEN 行为 | MERGED 行为 |
|---|---|---|
| default timeout(120s)的命令跑 90s | 60s 出 advisory(合理) | 60s 出 advisory(不变) |
显式 timeout: 600_000 跑 400s | 60s 出 advisory(过早——300s 才合理) | 300s 出 advisory(per-invocation 适配) |
病态 timeout: 1 的命令跑 0.5s | 0.05s 出 advisory("ran for 0s" 噪声) | 1000ms floor 不出(避免噪声) |
Advisory 显式警告:not just "use is_background next time",还包括 "别重跑这条刚完成的命令"——这是 stateful 操作(deploys / migrations / git push)的真实风险点。这种"防止 LLM 误以为 advisory 是建议立刻重跑"的细节是合并前 review 中加的——OPEN 时是裸 advisory,MERGED 时加 stateful 警告。
🎯 重点解析 2:FileReadCache invalidation 漏检(PR#3810)
PR#3717 引入 FileReadCache(item-2)时,invalidation 只 wired 进 2 条路径。本 PR multi-round 审计暴露了 5 条遗漏路径——这是个架构层 audit 发现的真实正确性 bug(不是性能问题):
| 路径 | 触发场景 | 原 PR#3717 是否清缓存 |
|---|---|---|
tryCompressChat | auto compaction | ✓ |
Config.startNewSession | /clear、session resume | ✓ |
microcompactHistory | idle cleanup(≥60min) | ✗ → ✓ 本 PR 修 |
GeminiClient.setHistory | /restore、/load_history | ✗ → ✓ 本 PR 修 |
GeminiClient.truncateHistory | rewind | ✗ → ✓ 本 PR 修 |
GeminiClient.resetChat | 公共 API | ✗ → ✓ 本 PR 修 |
stripOrphanedUserEntriesFromHistory | retry path | ✗ → ✓ 本 PR 修 |
用户可见症状:长会话中 Read 工具调用看似成功但模型拿到空内容(file_unchanged 占位符指向已被 history rewrite 删掉的 prior tool result)。集成测试用真实 ReadFileTool + on-disk 文件 + 真实 microcompactHistory 复现 bug,是工程上扎实的回归保障。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| Background tasks roadmap #3634 Phase D part (a) | 🟡 OPEN | ✓ 收官 |
| item-2 文件读取缓存 | 🟡 主体已实现 + invalidation 在 2 条路径 | 🟡 主体已实现 + invalidation 在 7 条路径全覆盖(PR#3810) |
DeepSeek reasoning_effort 'max' tier | 🟡 OPEN | ✓ 落地(PR#3800 +926/-80) |
累计计数
- 已合并 PR: 147 → 153(+6)
- 关键 OPEN PR:本轮新增 9 项(retry 三件套配套 + MCP coalesce 双件 + auto-memory + fast model + 文件路径 + telemetry + slash history + installer)
备忘:retry 系统三件套即将落地
PR#3798(classifyError)+ PR#3790(rate-limit retry handling)+ PR#3827(unify retry delay policy)形成 API 重试系统的三件套——合并后 item-8 P1 API 指数退避将从"只有 SSE 429 检测"升级到完整的"分类 + 退避 + 重试调度"框架。
2026-05-03 第三轮(~9h 16min 增量 · 1 项合并 + 3 项关键 OPEN · Phase B 收官 + Phase D 开启 · /tasks 含 monitors + 长跑 foreground bash 后台化提示)
扫描窗口:2026-05-03 02:14 UTC → 2026-05-03 11:30 UTC。窗口内 1 项合并 + 3 项关键 OPEN。本次主线:① Phase B 完整收官(PR#3801 把 monitors 加入 /tasks + interactive 模式 hint,关闭 issue #3634 Phase B 留给"delete / keep as fallback / deprecation hint—选其一"的开放问题,最终采用"keep + add hint scoped to interactive mode"混合方案);② Phase D 开启(PR#3809 OPEN — 长跑 foreground bash 命令完成时提示模型下次用 is_background: true);③ 多项 ergonomics 修复(telemetry 启动 warning + 文档对齐)。
🟢 MERGED(1 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3801 | feat(cli): include monitors in /tasks + add interactive-mode hint | 2026-05-03 10:45 UTC | 🌟 Phase B 完整收官(+401/-39 · Issue #3634 Phase B closure)—— 两个耦合改动:① Bug 修复:/tasks 命令在 PR#3684/3791 之前最后修改过,只合并了 agent + shell 而 monitors 在 headless / non-interactive / ACP 列表路径上静默消失。本 PR 加上 getMonitorRegistry() 并把 monitor 穿过所有 helper(statusLabel / taskLabel / taskId / taskOutputPath);② Surface redirect(不是删除):富 Ctrl+T dialog(PR#3488/3720/3791)已可用后,/tasks 变为非 TTY 消费者的 long-form fallback而非主要 surface。executionMode === 'interactive' 时输出顶部加一行 hint,non_interactive / acp 保持纯列表。架构决策:Issue #3634 Phase B 留下"delete / keep as fallback / add deprecation hint—pick one"的开放问题,本 PR 最终采用 "keep + add hint scoped to interactive mode"——/tasks 是 non_interactive(-p flag)、acp(IDE bridges 如 Zed)、SDK consumer 的唯一后台任务检查路径,删除会静默破坏;但"deprecation hint"暗示有 removal path,实际并无——/tasks 对非 TTY 路径无限期保留 |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3809 | feat(core): hint to background long-running foreground bash commands | 🌟 Phase D 开启 part (a) ✅ 已于 2026-05-04 15:24 合并 +649/-1(详见 2026-05-04 changelog · 阈值改为"effective timeout 的一半"per-invocation 含 1000ms floor,advisory 显式警告别重跑刚完成的命令——matters for stateful ops 如 deploys/migrations/git push) |
| PR#3808 | docs(core): point background-shell guidance at both /tasks and the dialog | PR#3801 follow-up ✅ 已于 2026-05-04 14:27 合并 +24/-12 |
| PR#3807 | fix(telemetry): suppress async resource attribute warning on startup | 关联 item-26 OTel ✅ 已于 2026-05-03 11:36 合并 +13/0 |
🎯 重点解析:Background tasks roadmap (#3634) 四阶段全图
PR#3801 + PR#3809 让 #3634 的全貌浮现:
| Phase | 内容 | 状态 |
|---|---|---|
| A | 后台 subagents(PR#3076 早期合并) | ✓ |
| B | Managed background shell pool + /tasks 命令 + dialog/pill 整合 | ✓ 本轮收官(PR#3642 + PR#3720 + PR#3801) |
| C | Event monitor tool(spawn 长跑 shell + token-bucket 节流 + Monitor → dialog 集成) | ✓(PR#3684 + PR#3791) |
| D part (a) | 长跑 foreground bash 完成时提示模型下次后台化 | 🟡 OPEN(PR#3809) |
双层 sleep / 长跑防御:
| 时机 | 机制 | 实现 |
|---|---|---|
| validate 时 | shell 层 sleep 拦截 | PR#3684 拦截前台 sleep N(N≥2) |
| result 时 | LLM nudge | PR#3809 OPEN ≥60s 后台化 hint |
Phase D 后续 part (b/c/...) 待观察。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| Background tasks roadmap #3634 Phase B | 打开(PR#3801 OPEN) | ✓ 收官 |
| Phase D(长跑 foreground 后台化提示) | 未开始 | 🟡 part (a) OPEN(PR#3809) |
累计计数
- 已合并 PR: 146 → 147(+1)
- 关键 OPEN PR:新增 PR#3809(Phase D)、PR#3808(PR#3801 docs follow-up)、PR#3807(OTel startup warning)
备忘:roadmap 视角的价值
把 PR 按 Issue #3634 Phase A/B/C/D 串起来比按时间堆 changelog 更能看出 Qwen 团队的设计意图。建议下一轮在 changelog 头加"Roadmap 进度"小节,明确各 phase 状态。
2026-05-03 第二轮(~98 分钟增量 · 2 项合并 + 1 项关键 OPEN · Phase C dialog 集成正式合并 + 非交互错误打印修复 + DeepSeek max reasoning effort)
扫描窗口:2026-05-03 00:36 UTC → 2026-05-03 02:14 UTC。窗口内 2 项合并 + 1 项关键 OPEN。本次主线:① PR#3791 Phase C dialog 集成正式合并(体量从 OPEN 时的 +357/-40 增长到 +791/-49 · 8 文件 / 2 commits · kind framework 真正 cross-kind 验证);② PR#3749 非交互模式 API 错误打印修复(+308/-27 · 3 处独立站点的双重格式化收敛到 AlreadyReportedError marker + handleError short-circuit);③ PR#3800 DeepSeek reasoning_effort: 'max' 路线打开(+516/-57 OPEN · 直接命中 reasoning-effort-deep-dive §3.3 推荐实施方案 Step 1+2)。
🟢 MERGED(2 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3791 | feat(cli): wire Monitor entries into combined Background tasks dialog | 2026-05-03 02:05 UTC | 🌟 Phase C dialog 集成正式合并(+791/-49 · 体量从 OPEN 时 +357/-40 翻倍 · 8 文件 / 2 commits)—— kind framework 现有 三个真实消费者(agent / shell / monitor),把"generic framework"从声称变为证据。新机制:core MonitorRegistry.setStatusChangeCallback 镜像 BackgroundShellRegistry / BackgroundTaskRegistry 的 sync-fire-on-register 模式;CLI hook 监听 + pill / dialog / context 三层接入;详情视图按 kind 派发新增 MonitorDetailBody(command / status / pid / event count / dropped lines);x 键路由 monitorRegistry.cancel(monitorId) 同步 settle 与 task_stop 一致。Commit 7999b85 lint fix 是有意义的工程实践:5 个新 switch 的 default: { const _exhaustive: never = entry; throw ... } 同时保运行时 guard 和编译期 exhaustiveness 检查(4th kind 出现时 TS 立即指出 5 个 site 需新加 arm) |
| PR#3749 | fix(cli): stop double-wrapping and double-printing API errors in non-interactive mode | 2026-05-03 00:39 UTC | 非交互错误打印路径修复(+308/-27)—— 用户从 gateway 看到 routine 4xx 时 CLI 报"An unexpected critical error occurred"+ 三行重复内容(parseAndFormatApiError 在已 wrap 输出上再 wrap)。修复:① 新 AlreadyReportedError marker;② handleError short-circuit;③ parseAndFormatApiError 加 idempotency guard 作安全网;④ nonInteractiveCli.ts catch 块 TEXT 模式跳过 adapter emit 当错误已标记。意义:非交互输出对 CI / 脚本调试极重要,"上下文错误信息一行就够"是合理体验 |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3800 | feat(core): support reasoning effort 'max' tier (DeepSeek extension) | 🌟 直接命中 reasoning-effort-deep-dive §3.3 推荐实施方案 Step 1+2 ✅ 已于 2026-05-04 14:42 合并 +926/-80(体量从 OPEN 时 +516/-57 大幅增长,详见 2026-05-04 changelog) |
🎯 重点解析:PR#3791 — kind framework 从声称到证据
PR#3720(shell)+ PR#3791(monitor)是 kind framework 的两次外部验证——PR#3488 引入抽象时只有 agent 一个消费者,无法验证抽象是否合理;PR#3720 加 shell 是第二个;PR#3791 加 monitor 是第三个,真正证明 framework 是 cross-kind 而非"为 agent 量身的特例代码"。
Before/After 对比:
| 维度 | Before(PR#3791 之前) | After(PR#3791 合并后) |
|---|---|---|
| pill 显示 | 1 shell, 1 local agent | 1 shell, 1 local agent, 2 monitors,全部终止后塌陷为 N tasks done |
Ctrl+T overlay | agent + shell 行 | 单 Background tasks 区域含三类,monitor 行前缀 [monitor] <description> |
Cancel 键 x | 无法停 monitor | 路由 monitorRegistry.cancel(monitorId) 同步 settle |
| Detail view | agent / shell 各自 body | 按 kind 派发,monitor 走新 MonitorDetailBody(command / status / pid / event count / dropped lines) |
剩余 gap:PR#3684 自述"未做"第 2 项 send_message 集成仍未在 PR#3791 范围内(task_stop 路径在 PR#3791 中顺带覆盖 via x 键)。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| subagent-display §零 Phase C dialog 集成 | PR#3791 OPEN | ✓ 已合并(kind framework 三消费者验证完成) |
| CLI 非交互错误打印 | 双重格式化导致 4xx 看起来像 crash | ✓ 修复(PR#3749) |
累计计数
- 已合并 PR: 144 → 146(+2)
- 关键 OPEN PR:PR#3791 退出(已合并),新增 PR#3800
2026-05-03(~10h 增量 · 2 项合并 + 3 项关键 OPEN · DeepSeek anthropic-compat thinking 系列收官 + Stats model cost estimation 二度落地)
扫描窗口:2026-05-02 14:57 UTC → 2026-05-03 00:36 UTC。窗口内 2 项合并 + 3 项关键 OPEN。本次主线:① PR#3788 DeepSeek thinking 块系列正式收官(+1407/-76 · 远超原始描述的 small fix · 为整个 OpenAI/Anthropic 双轨 thinking-content 跨提供商 normalize 框架收尾);② PR#3780 Stats model cost estimation 二度落地(+819/-10 · PR#3631 之后的 rebase 合并);③ API retry classifier 路线打开(PR#3798 OPEN · 把 item-8 从"仅 SSE 429 检测"扩到 deterministic vs transport 两类完整分类);④ /model list 路线(PR#3797/3799 OPEN · 模型动态发现 + 跨 OpenAI-compat 端点响应规范化)。
🟢 MERGED(2 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3788 | fix(core): inject thinking blocks for DeepSeek anthropic-compatible provider | 2026-05-02 16:31 UTC | 🌟 延续 item-22 thinking 块系列收官(+1407/-76 · 远超 PR 简介隐含的"small fix" · 实际是跨提供商 thinking-content 规范化框架)—— Closes #3786。问题:DeepSeek api.deepseek.com/anthropic 端点在 thinking 模式下 reject 缺 thinking block 的 tool_use turn(HTTP 400)。两个协调的 converter 行为:① normalizeAssistantThinkingSignature —— 在所有缺 signature 字段的 assistant thinking block 上补 signature: ''(保留原 thinking 文本),覆盖 cross-provider history 中 OpenAI/Gemini/agent-runtime 仅设 thought: true 的情况 + redacted_thinking block 经 Gemini-Part 往返丢失 data 字段的情况;② injectThinkingOnToolUseTurns —— 给带 tool_use 但缺任何 thinking block 的 assistant turn 前置注入空 thinking block(仅在该案例触发,避免 bloat)。配合已合并 PR#3729/3747/3737 完成 OpenAI/Anthropic 双轨完整覆盖 |
| PR#3780 | Feat/stats model cost estimation rebase | 2026-05-02 23:31 UTC | /stats 加 cost 估算(+819/-10)—— PR#3631 的 rebase 二度合并版本。会话累计 token usage × per-model 单价的成本估算 |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3798 | feat(core): classify retryable transport/provider failures vs deterministic request errors | 🌟 关联 item-8 API 指数退避(+397/-4 / 91 测试 16 新增)—— 新增 classifyError():① deterministic errors(永不重试):400 / 401 / 403 / 404 / 422;② retryable:429 / 408 / 409 / 500-599 / 网络错误(ECONNRESET / ETIMEDOUT 等)。意义:item-8 之前只有 PR#3246 的 SSE 429 检测,本 PR 把"哪些可重试"做成正式分类器,是后续完整 10 次退避 + 模型降级的前置条件 |
| PR#3797 | feat(cli): add /model list subcommand for dynamic model discovery | 新 CLI 入口(+99/0)—— /model list 查询配置的 OpenAI-compatible /models 端点,pipe-friendly(每行一个 model id)。配合 PR#3783(switch models non-interactively from CLI)形成"列出 + 切换"完整 headless 模型管理 |
| PR#3799 | feat(cli): normalize model list response parsing across OpenAI-compatible endpoints | 配套 PR#3797(+366/-1)—— 规范化 fetchModels() 处理 3 种响应形态:① OpenAI 标准 { data: [...] };② DeepSeek 带 object: "list";③ bare array(部分 provider 跳过 wrapper)。owned_by / created / permission 等额外字段忽略,仅取 id |
🎯 重点:item-22 thinking 块系列正式收官
PR#3788 的 +1407/-76 体量远超"为某端点注入空 thinking block"的简单描述。它实际是 thinking-content 跨提供商规范化的框架性工作:
| 起点 | 终点 |
|---|---|
| OpenAI 端点 + DeepSeek 部分场景 | OpenAI / Anthropic / Gemini / DeepSeek 四提供商 history 在双轨(OpenAI tool_use replay + Anthropic-compat tool_use turn)下都正确处理 thinking block |
缺 signature 字段就直接报错 | normalizeAssistantThinkingSignature 自动补全(保留原文本,仅补空字段) |
跨 provider 时 redacted_thinking 经 Gemini-Part 往返丢 data 字段 → 后续 reject | 同上 normalize 路径处理 |
tool_use turn 缺 thinking block 直接 HTTP 400 | injectThinkingOnToolUseTurns 仅在该案例注入空 block,避免普通 turn bloat |
主矩阵 line 92 已同步:item-22 PR 列表加 PR#3788 ✓。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-22 Thinking 块跨轮保留 | OpenAI/Anthropic 双轨 + 6 PR 已合并 | + PR#3788 框架性收官(cross-provider thinking-content normalize) |
| item-8 API 指数退避与降级重试 | 仅 SSE 429 检测(PR#3246) | 🟡 部分(+ PR#3798 OPEN 正式 classifier,把"可重试 vs 确定性失败"做成框架) |
累计计数
- 已合并 PR: 142 → 144(+2)
- 关键 OPEN PR 增加 3 项(PR#3797 / PR#3798 / PR#3799)
备忘:模型管理三件套
PR#3797(/model list)+ PR#3799(response 规范化)+ PR#3783(headless 切模型)三件套合并后将形成完整的 headless / 脚本友好的模型管理 CLI——预计在 OpenAI-compat 多 provider(DeepSeek / 兼容 OpenAI 的国产模型 / 自部署 vllm/sglang)场景下显著提升可用性。
2026-05-02(~35h 增量 · 7 项合并 · 含 PR#3684 Phase C event monitor +6297/-147 系列追踪以来最大单 PR · /review 第二轮架构升级 + OTel HTTP routing + MCP health pill · item-26 状态勘误)
扫描窗口:2026-05-01 04:14 UTC → 2026-05-02 14:57 UTC(第二次扫描补登 PR#3684 + PR#3741 + PR#3792)。窗口内 7 项合并。本次主线:① PR#3684 Phase C event monitor tool 上线(+6297/-147 系列追踪以来最大单 PR · 补足 background tasks 三件套之外的"长跑命令 + 节流事件流"维度);② /review skill 第二轮架构升级(PR#3754 +2423/-138 · 5→9 agent + 3 personas + 6 个 CLI 子命令);③ OTel HTTP OTLP routing 上线(PR#3779 +1387/-102 · 直接触发 item-26 状态勘误);④ MCP health pill 上线(PR#3741 +182/-0 · DISCONNECTED MCP 服务器在 footer 可见);⑤ item-26 状态严重勘误 —— 原描述"无 OpenTelemetry 支持"已大幅过时,经源码核查 Qwen Code 早已集成 @opentelemetry/sdk-node + 6 个 exporter。
🟢 MERGED(7 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3684 | feat(core): event monitor tool with throttled stdout streaming (Phase C) | 2026-05-02 12:57 UTC | 🌟 Phase C event monitor tool 上线(+6297/-147 · 系列追踪以来最大单 PR)—— 新增 Monitor 工具(spawn 长跑 shell 命令 + token-bucket 节流 burst=5/sustain=1/sec 把 stdout lines 作为事件返回 agent)+ MonitorRegistry(4 状态 running/completed/failed/cancelled + idle timeout + max events 自动停 + 独立 AbortController)+ shell 层 sleep 拦截(前台 sleep N(N≥2) 阻塞并提示模型用 Monitor 或 is_background)。Background tasks roadmap (#3634) 三阶段:Phase A = 后台 subagents(PR#3076 已合并),Phase B = managed background shell pool(PR#3642 已合并),Phase C = event monitor(本 PR)。本 PR 自述"未做"清单:footer pill / dialog 集成 + task_stop / send_message 集成(gated on PR#3471/#3488)—— 这两项预计后续 PR 补 |
| PR#3754 | feat(review): expand review pipeline + qwen review CLI subcommands | 2026-05-01 10:30 UTC | 🌟 /review 第二轮架构升级(+2423/-138 · 单 PR 体量爆表)—— Step 4 5→9 个并行 agent(Correctness/Security 拆分 + 新增 Test Coverage + 3 undirected personas:attacker / 3am-oncall / maintainer);Step 6 改迭代反向审计(cap 3 rounds);Step 9 增加 self-PR detection(自审 PR 自动降级 APPROVE/REQUEST_CHANGES → COMMENT)+ CI status check + 现有评论 4 类优先级;新增 6 个 qwen review CLI 子命令(fetch-pr / pr-context / load-rules / deterministic / presubmit / cleanup)替换 SKILL.md 内 inline bash 命令,LLM 改为读结构化 JSON |
| PR#3779 | feat(telemetry): define HTTP OTLP endpoint behavior and signal routing | 2026-05-01 14:47 UTC | 🌟 关联 item-26 OTel 部分实现(+1387/-102)—— resolveHttpOtlpUrl() 按 OTel 规范追加 /v1/traces /v1/logs /v1/metrics;per-signal endpoint overrides(支持阿里云 /api/otlp/traces 等非标路径);LogToSpanProcessor 桥接 OTel logs→spans 给 traces-only 后端 + session-based traceId(SHA-256(sessionId) 截 128 bit) |
| PR#3741 | feat(cli): add MCP health pill to footer | 2026-05-02 14:57 UTC | 🌟 MCP 健康可见性(+182/-0 · 4 文件 · 3 新增 + 1 修改)—— footer 左下区域显示 · 1 MCP offline(warning 色)当任何配置的 MCP 服务器处于 DISCONNECTED 状态。关键设计决策(PR body 自述):没有走 PR#3720 的 kind framework 扩展路线——任务实体(agent/shell/monitor)有"终态契约"(running → {completed, failed, cancelled}),而 MCP 是 disconnected ↔ connecting ↔ connected 连接状态循环(30s 健康检查 + 自动重连),category 不同。v1 仅是视觉指示器,按键导航到 /mcp 留待 follow-up。关联 P2 MCP Auto-Reconnect 的 UI surface 维度——本 PR 同时间接证实 Qwen Code 已有 30s 健康检查 + 自动重连机制(待源码二次核查) |
| PR#3784 | fix(monitor): correct Windows taskkill spawn assertion | 2026-05-02 03:24 UTC | Phase C 配套 Windows 兼容性修复(+15/-18)—— PR#3684 的预修复 |
| PR#3782 | fix(vscode-companion): align package eslint config | 2026-05-02 04:35 UTC | VSCode companion eslint 对齐(+25/-9) |
| PR#3777 | fix(test): restore abort-and-lifecycle stdin-close test | 2026-05-02 13:39 UTC | PR#3723 后续测试修复(+78/-32) |
🔍 状态勘误:item-26 OTel 原生 Tracing
原描述(line 125 + p2-core item-26 主体):"仅阿里云 RUM,没有 OpenTelemetry 支持" —— 此判断严重过时:
$ grep "@opentelemetry" packages/core/package.json
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/exporter-logs-otlp-grpc": "^0.203.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.203.0",
"@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.203.0",
"@opentelemetry/sdk-node": "^0.203.0",
实际状态:
- ✅ OTel SDK 完整集成(
@opentelemetry/sdk-node+ 6 个 exporter:traces/logs/metrics × http/grpc) - ✅ HTTP OTLP signal routing 已落地(PR#3779)
- 🟡 AgentScope 风格 5 类 span extractor 自动埋点仍缺(Agent / LLM / Tool / Formatter / Embedding)—— 这是本 item 真正的剩余 gap
主矩阵 line 125 + p2-core item-26 已同步更新为 🟡 部分实现。
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3791 | feat(cli): wire Monitor entries into combined Background tasks dialog | 🌟 PR#3684 自述"未做"清单的直接 follow-up ✅ 已于 2026-05-03 02:05 UTC 合并 +791/-49(详见 2026-05-03 changelog 重点解析) |
| PR#3792 | fix(core): address post-merge monitor tool and UI routing issues | 🌟 PR#3684 review review 反馈的清扫 follow-up ✅ 已于 2026-05-04 13:19 合并 +664/-227(体量从 OPEN 时 +199/-199 大幅增长——5 项清扫见原描述,详见 2026-05-04 changelog) |
| PR#3788 | fix(core): inject thinking blocks for DeepSeek anthropic-compatible provider | 延续 item-22 thinking 块跨轮保留 —— DeepSeek 的 api.deepseek.com/anthropic 端点在 thinking 模式下要求 assistant turn 必须带 thinking block,否则 HTTP 400。✅ 已于 2026-05-02 16:31 合并 +1407/-76(详见 2026-05-03 changelog) |
| PR#3785 | feat(cli): add memory diagnostics doctor command | 延伸 /doctor(已合并的 PR#3404 之上)—— /doctor memory 子命令 + --json 输出 + collectMemoryDiagnostics()(Node/V8 内存数据 + 风险提示),为 #3000 系列首层 |
| PR#3790 | fix(core): improve stream rate-limit retry diagnostics | 关联 item-8 API 指数退避 —— 流式 SSE rate-limit 重试诊断 |
| PR#3783 | feat(cli): switch models non-interactively from the cli | 模型切换 CLI 入口(headless 友好) |
| PR#3780 | Feat/stats model cost estimation rebase | session 成本估算 ✅ 已于 2026-05-02 23:31 合并 +819/-10(详见 2026-05-03 changelog) |
| PR#3781 | feat(weixin): add image sending support via CDN upload | Channels weixin 适配增强 |
| PR#3776 | feat(installer): add standalone archive installation | 独立归档安装方式 |
| PR#3775 | refactor(core): route side-query LLM calls through runSideQuery chokepoint | side-query 调用统一抽象 |
🎯 重点 1:/review 升级幅度(PR#3754)
PR#3754 是 /review skill 自 2026-03-14 上线以来第二次重大架构升级(第一次是 PR#2932 的 autofix + 安全加固)。设计变化:
| Step | 升级前 | 升级后 |
|---|---|---|
| 4 并行 agent | 5 个 | 9 个(Correctness / Security 拆分 + 新增 Test Coverage + 3 undirected personas) |
| 5 不确定→拒绝 | uncertain → reject | uncertain → low-confidence(终端"Needs Human Review",不发 PR comment) |
| 6 反向审计 | 单次 | 迭代(cap 3 rounds,no-new-findings 终止) |
| 9 GitHub API 调用 | inline gh api 命令 | self-PR 检测 + CI status check + 现有评论 4 类优先级,全部走 qwen review presubmit 单 call |
新增的 6 个 qwen review CLI 子命令是架构上的重大转变——把 SKILL.md 中"让 LLM 跑 bash 命令"改为"让 LLM 调结构化 CLI 子命令读 JSON",降低 LLM 对 shell 语法的理解依赖、提高确定性。
🎯 重点 2:OTel item-26 状态勘误 + PR#3779
老版本的 codeagents 报告把 item-26 写成"完全缺失",今天源码核查发现 OTel SDK 早就集成完成,PR#3779 是在已有 OTel 基础上的"HTTP signal routing 完善"。这暴露了 codeagents 报告中可能存在的其他类似过时判断——后续审计需要更系统地核对包依赖现状。
PR#3779 的 LogToSpanProcessor 是亮点:很多 traces-only 的后端(如阿里云观测)不收 logs;通过把 logs 转成 spans,让 logs 也能在 traces UI 上展示。这是工程务实的桥接设计。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-26 OTel 原生 Tracing | "缺失(仅阿里云 RUM)" | 🟡 部分实现(OTel SDK + HTTP OTLP routing ✓,5 类 span extractor 仍缺) |
| GitHub Code Review item | 已实现(5 agent) | 已实现 + 第二轮升级(9 agent + 3 personas + iterative reverse audit + 6 CLI 子命令) |
| /doctor 诊断工具 | "缺失" | ✓ 已实现 + 持续扩展(PR#3404 基础 + PR#3785 memory 子命令 OPEN) |
| MCP Auto-Reconnect(item-13) | "缺失" | 🟡 部分(reconnect-on-error + MAX_RECONNECT_RETRIES 已有 via mcp-tool.ts:attemptReconnect();UI 可见性 ✓ via PR#3741 footer health pill;周期健康检查待源码二次核验)—— 第三处状态勘误,与 OTel / /doctor 同样属于"原标 缺失实际已实现"模式 |
累计计数
- 已合并 PR: 135 → 142(+7:原列出 5 项 + 补登 PR#3684 / PR#3741)
- README 待同步
备忘:审计建议
本轮已发现 3 处状态勘误(item-26 OTel / /doctor / MCP Auto-Reconnect),全部属于"标'缺失'实际已实现"模式。这暴露了 codeagents 报告系统性的过期判断问题。建议下一轮系统重排 P2 item 中所有"缺失"标签:对每个 P2 item 用 grep + package.json 双向核对源码,预计还有 5-15 处类似勘误。
2026-05-01(~18h 增量 · 5 项合并 + 1 项关键 OPEN · item-18 Agent 恢复与续行 ✓ 闭环 · 共享权限流上线)
扫描窗口:2026-04-30 09:55 UTC → 2026-05-01 04:14 UTC。窗口内 5 项合并 + 1 项关键 OPEN。本次主线:① item-18 Agent 恢复与续行从"未实现"直接 ✓ 完整闭环(PR#3739 +4087/-165 单 PR 体量爆表);② PR#3717 FileReadCache 的 follow-up PR#3774 已出(prior-read 守卫,把缓存从性能优化升级为模型可信度约束);③ 共享权限流统一(PR#3723 把 Interactive / Non-Interactive / ACP 三模式的 L3→L4 决策路径打通)。
🟢 MERGED(5 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3739 | Add background agent resume and continuation | 2026-05-01 04:14 UTC | 🌟 关闭 item-18 Agent 恢复与续行(+4087/-165 · 单 PR 体量爆表) —— BackgroundAgentResumeService 从 subagents/<sessionId>/ 发现 paused agent + sidecar 持久化 + transcript-first fork resume + SubagentStart hook 重放 + send_message / task_stop 处理 paused agent + /resume 流程加载 paused tasks。状态从"—"→ ✓ 已实现 |
| PR#3771 | fix(cli): restore SubAgent shortcut focus | 2026-04-30 15:02 UTC | item-56 SubAgent UX 微调(+247/-5) |
| PR#3723 | feat(core): add shared permission flow for tool execution unification | 2026-04-30 14:10 UTC | 🌟 架构统一 —— 新增 permissionFlow.ts(evaluatePermissionFlow() / needsConfirmation() / isPlanModeBlocked() / isAutoEditApproved()),把 Interactive / Non-Interactive / ACP 三模式的 L3→L4→L5 决策路径打通(追踪 #3247 · +461/-95) |
| PR#3725 | chore: remove legacy Gemini workflows | 2026-04-30 14:03 UTC | 仓库历史清理(与改进系列无关) |
| PR#3753 | fix(cli): honor proxy setting | 2026-04-30 10:24 UTC | proxy 设置真正生效(+290/-12)—— 触及 P2 企业代理 方向的小段,但完整 CONNECT relay + CA 注入 + NO_PROXY 仍待 |
🟡 关键 OPEN(值得追踪)
| PR | 方向 | 与已有 item 关系 |
|---|---|---|
| PR#3774 | feat(core): enforce prior read before Edit / WriteFile mutates a file(+611/-2) | PR#3717 FileReadCache 的关键 follow-up —— PR#3717 body 已预告该方向。新增 EDIT_REQUIRES_PRIOR_READ / FILE_CHANGED_SINCE_READ 两个错误码:模型若想 Edit/WriteFile 一个已存在文件,必须在本会话先 read 过当前字节。填补"plausible-but-stale 匹配"漏洞 —— 模型不能再凭想象 Edit 一个 old_string、恰巧文件中存在该字符串(即使模型从未读过文件的当前版本)。新文件创建豁免;Config.fileReadCacheDisabled 是逃生口。合并后 item-2 将升级为完整闭环 |
| PR#3768 | feat(cli): route foreground subagents through pill+dialog while running(+674/-36) | 延伸 item-56 —— 把 foreground subagent 也接入 pill+dialog 调度面,与已合并的 PR#3488 / PR#3720 background 路径形成对偶 |
| PR#3735 | fix(core): auto-compact subagent context to prevent overflow(+1283/-1020) | 关联 item-1 多层上下文压缩 + item-23 Token 自适应升级 —— subagent 上下文溢出前自动压缩 |
| PR#3779 | feat(telemetry): define HTTP OTLP endpoint behavior and signal routing | telemetry 路由(与 item-26 OTel 原生 Tracing 方向接近) |
| PR#3778 | feat(desktop): Add desktop app package with Qwen ACP SDK integration | Qwen-original 桌面应用方向 |
🎯 重点 1:item-18 Agent 恢复与续行(PR#3739)从"—"直接闭环
PR#3739 是本系列追踪以来单 PR 行数最多的项之一(+4087/-165)。能力清单:
| 能力 | 实现方式 |
|---|---|
| 持久化发现 | 新增 BackgroundAgentResumeService 扫 subagents/<sessionId>/ |
| 生命周期 | sidecar metadata 记录 paused 状态 + registry/UI 表现 |
| Transcript-first fork resume | fork bootstrap 写入 system/agent_bootstrap + 原始 launch prompt 写入 system/agent_launch_prompt,resume 时从 transcript 历史重建 worker context而非从当前父 prompt/tool 状态重建 |
| Hook 重放 | resume 时重新跑 SubagentStart hooks + 并发 resume 自动 coalesce |
| 控制面 | send_message + task_stop 处理 paused background agent |
| UI | /resume 流程加载 paused tasks + 瞬态恢复提示 |
| 兼容 | 无 bootstrap 记录的 legacy fork transcript 仍可见为 paused 并 abandonable,但禁止 unsafe resume |
与 Claude Code 设计对齐 + 微超出:与 tools/AgentTool/resumeAgent.ts:resumeAgentBackground() 思路对齐。Qwen 的 transcript-first fork resume 比 Claude Code 的方案更稳健 —— 避免父 prompt 漂移导致 fork worker context 重建错误,是工程上更扎实的选择。
🎯 重点 2:PR#3774 把 FileReadCache 从性能优化升级为可信度约束
PR#3717 (item-2) 落地的 FileReadCache 本身是个性能层(短路重复 Read)。PR#3774 用同一个数据结构做了完全不同的事:在 Edit/WriteFile 之前强制要求模型见过当前字节。
| 错误码 | 触发 | 含义 |
|---|---|---|
EDIT_REQUIRES_PRIOR_READ | 文件不在 cache 中(从未 read) | 模型在凭想象写代码 |
FILE_CHANGED_SINCE_READ | 文件已读但 mtime/size drift | 模型对文件的认知已过期 |
为什么重要:原 0 occurrences 检查只能挡"想象的串不存在";挡不住"想象到一个真实存在的串、但文件已变"——这种 plausible-but-stale 匹配是 LLM 编辑的真实失败模式。PR#3774 是 Anthropic / OpenAI 主流方案的常见组合,Qwen 跟进意味着 Edit/Write 的可信度跨越了一个台阶。
🎯 重点 3:PR#3723 共享权限流统一
PR#3723 把 Interactive / Non-Interactive / ACP 三模式的权限决策路径合并到 evaluatePermissionFlow() 单一入口:
L3: Tool 内置默认权限
↓
L4: PermissionManager 规则覆盖
↓
finalPermission: allow | deny | ask
↓
L5: 调用方覆盖(YOLO / AUTO_EDIT / PLAN)
为什么重要:之前三模式各自实现 L3/L4 评估,bug 修一个要改三处;PR#3723 之后单一权威路径 —— 配套 17 个 unit test + E2E 修复。这是 Qwen Code 平台稳定性 的基础设施级清理。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-18 Agent 恢复与续行 | — | ✓ 已实现(PR#3739) |
| item-2 文件读取缓存 | 🟡 主体已实现 | 🟡 主体已实现 + prior-read 守卫 PR 进行中(PR#3774 OPEN) |
累计计数
- 已合并 PR: 130 → 135(+5)
- 关键 OPEN PR 增加 1 项(PR#3774 prior-read 守卫)
- README 待同步
补漏说明
上一篇 changelog(2026-04-30)的"扫描窗口"是 2026-04-29 02:00 UTC → 2026-04-30 09:55 UTC,但漏列了同窗口内的:
- PR#3615 ✓ 2026-04-30 07:24 UTC
fix(lsp): 修复 LSP 文档、isPathSafe 限制、提升 LSP 工具调用率(+154/-45)—— LSP 健壮性 - PR#3618 ✓ 2026-04-30 07:24 UTC
fix(vscode-companion): fill slash commands into input on Enter instead of auto-submitting—— VSCode UX - PR#3617 ✓ 2026-04-27 15:01 UTC
fix(core): split tool-result media into follow-up user message for strict OpenAI compat(+526/-11)—— OpenAI 严格兼容
3 项均为各自方向的健壮性补丁,与改进系列 item 关联弱,故只在此处补登。
2026-04-30(~32h 增量 · 15 项合并 · v0.15.6 · FileReadCache 落地 · DeepSeek reasoning_content 三连击 · Background tasks 统一调度面)
扫描窗口:2026-04-29 02:00 UTC(上次扫描)→ 2026-04-30 09:55 UTC。窗口内 15 项合并。本次的两条主线:① FileReadCache 终于合并 —— item-2 缺口的内容缓存层补齐;② DeepSeek reasoning_content 跨路径补齐 —— rewind / compression / merge / replay 4 路径在 ~50h 内 3 个 PR 落地。
🟢 MERGED(15 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3717 | feat(core): add FileReadCache and short-circuit unchanged Reads | 2026-04-30 09:47 UTC | 🌟 关闭 item-2 主体——session-scoped FileReadCache 用 (dev,ino) key + 三态 check API + READ_FILE_CACHE_* env 度量;未变更文本 Read 改用短占位符;range / 非文本 / 截断读 / Write 后 Read 都走完整管道;item-2 状态 🟡 部分实现 → 🟡 主体已实现(仅 32 批并行 readManyFiles 仍待) |
| PR#3737 | fix(core): preserve reasoning_content in rewind, compression, and merge paths (#3579) | 2026-04-30 02:25 UTC | 关联 item-22——3 路径全保留 reasoning_content +3/-361 行(同时清掉旧 strip 逻辑) |
| PR#3766 | chore(release): v0.15.6 | 2026-04-30 07:59 UTC | v0.15.6 发布 |
| PR#3727 | chore(core): drop tool token usage tracking | 2026-04-30 07:35 UTC | 内部清理 |
| PR#3764 | fix(ci): add merge-back PR for stable releases in release workflow | 2026-04-30 07:25 UTC | release workflow |
| PR#3752 | fix(cli): persist directory add entries | 2026-04-30 03:22 UTC | /add-dir 持久化修复 |
| PR#3645 | fix(cli): correct model precedence — argv > settings > auth env vars | 2026-04-30 01:17 UTC | model 选择优先级硬化 |
| PR#3747 | fix(core): replay DeepSeek reasoning_content on all assistant turns | 2026-04-29 23:43 UTC | 关联 item-22——DeepSeek 全 assistant turn replay reasoning_content +9/-12 |
| PR#3647 | fix(cli): keep sticky todo panel compact | 2026-04-29 16:03 UTC | 关联 item-25 Task Management——sticky todo 紧凑化 +560/-37(PR#3507 之上的布局优化) |
| PR#3721 | fix(cli): bound SubAgent display by visual height to prevent flicker | 2026-04-29 14:34 UTC | 关联 item-44 transient 容器——SubAgent 显示按视觉高度 bound 防 flicker +1336/-57(item-44 的 SubAgent 子方向落地,但 MessageResponse 严格容器仍待) |
| PR#3722 | fix(memory): use project transcript path for dream | 2026-04-29 09:56 UTC | auto-memory dream 路径 bug 修复 |
| PR#3726 | feat(core): add Monitor(...) permission namespace | 2026-04-29 09:38 UTC | Qwen-original:为 PR#3684 Phase C event monitor tool 加独立 permission namespace(避免误用 Bash(...) 规则触发"Always Allow"扩散) |
| PR#3729 | fix(core): inject reasoning_content on DeepSeek tool-call replays | 2026-04-29 08:28 UTC | 关联 item-22——DeepSeek tool-call replay 注入 reasoning_content +153/-35 |
| PR#3720 | feat(cli): wire background shells into combined Background tasks dialog | 2026-04-29 08:06 UTC | 关联 item-56——后台 shell 与 SubAgent 合并到统一 Background tasks dialog(pill / 导航 / 详情视图共用) +500/-100 |
| PR#3687 | feat(core): wire background shells into the task_stop tool | 2026-04-29 02:10 UTC | 关联 item-56——后台 shell 接入 task_stop 工具,控制语义统一 +209/-25 |
🎯 重点 1:FileReadCache(PR#3717)—— item-2 主体落地
PR#3717 是本窗口最重要的一项。设计哲学比直接 port Claude Code 的 fileReadCache.ts 更克制:
| 维度 | Claude Code 原设计 | Qwen PR#3717 |
|---|---|---|
| 缓存对象 | 完整文件内容(1000 条 LRU + mtime 失效) | 占位符短路标记(不缓存内容,只记"模型已看过整文件") |
| Key | path | (dev, ino) —— 防符号链接/重命名假命中 |
| API 形态 | get() / set() | 三态 check():hit-fresh / hit-stale / miss |
| 节省 | 内容回写省 token | 短占位符替代全文回写 |
| 度量 | — | READ_FILE_CACHE_* env 变量驱动可观测度量(不承诺数字,按 session 形态评估) |
| 拓展 | — | 三态 API 设计上预留给后续 Edit/WriteFile 强制"必须先读"守卫 |
剩余缺口:① 32 批并行 readManyFiles(PR#3717 不含 I/O 并行);② 完整的 Edit/WriteFile prior-read enforcement(PR#3717 是基础设施层,调用方还没接入)。
🎯 重点 2:DeepSeek reasoning_content 跨路径补齐(item-22)
DeepSeek 没有 Anthropic 那种 thinking content block,而是把推理嵌在 reasoning_content 字段里——意味着 transcript 重建(rewind / compression / merge / replay)每条路径都需要单独保 reasoning_content。3 个 PR 在 ~50h 内补齐:
| PR | 路径 | 大小 |
|---|---|---|
| PR#3729 | DeepSeek tool-call replay | +153/-35 |
| PR#3747 | DeepSeek 全 assistant turn replay | +9/-12 |
| PR#3737 | rewind / compression / merge 三路径 | +3/-361(含旧 strip 逻辑清理) |
加上之前的 PR#2897 / PR#3590 / PR#3682 / PR#3691,Anthropic + DeepSeek 两路径在 thinking 块跨轮保留方向已基本对齐 Claude Code 等价水平。
🎯 重点 3:Background tasks 统一调度面(item-56)
PR#3687 + PR#3720 是 PR#3471/3488/3642 三件套之后的"统一收尾"——把后台 shell(exec 类)和 SubAgent(LLM 类)合并到同一个调度面:
| PR | 层 | 内容 |
|---|---|---|
| PR#3687 | 控制层 | 后台 shell 也接入 task_stop 工具,模型用单一动作能停 SubAgent + shell |
| PR#3720 | UI 层 | 后台 shell 与 SubAgent 在 dialog 中合并(统一 pill / 统一导航 / 统一详情视图) |
Qwen Code 在此点上超过了 Claude Code 的设计——Claude 的 BashOutput / Background shells 与 Coordinator panel 是两套相对独立的 UI;Qwen 选择把两者塞进同一个 mental model。
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-2 文件读取缓存 + 批量并行 I/O | 🟡 部分实现(仅查询缓存) | 🟡 主体已实现(查询缓存 + FileReadCache,仅 32 并行待) |
| item-22 Thinking 块跨轮保留 | DeepSeek 路径未覆盖 | Anthropic + DeepSeek 双路径已对齐 |
| item-44 瞬态消息容器 | pre-slice + visual-height slicing | + SubAgent 视觉高度 bounding(仍未达统一 MessageResponse 容器) |
| item-56 后台并发 SubAgent | ✓ 已实现(3 件套) | ✓ 已实现 + 后台 shell 也并入(5 件套) |
| item-7 会话崩溃恢复 | 无 | 🟡 读端容错(PR#3656 JSONL }{ 粘连恢复) |
| item-25 Task Management | 控制面 + UI 在做 | 控制面 + UI 已合并,依赖拓扑/跨进程锁仍待 |
累计计数
- 已合并 PR: 115 → 130(+15)
- v0.15.3 → v0.15.6(PR#3766)
- README 待同步
不在本系列范围的 PR(仅记录)
- PR#3726 Monitor 权限 namespace + PR#3684 Phase C event monitor tool —— Qwen Code-original 方向,不是从 Claude Code 借鉴
- PR#3645 / PR#3727 / PR#3764 / PR#3752 —— config 硬化 / 内部清理 / CI / 小功能修复,与改进系列 item 无直接关联
2026-04-29(~14h 增量 · 11 项合并 · auth wizard 第二轮完成 · autoSkill 新方向)
扫描窗口:2026-04-28 03:06 UTC(上次扫描 351c05c)→ 2026-04-29 02:00 UTC。窗口内 11 项合并 + 9 项新 OPEN。
🟢 MERGED(11 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3624 | fix(cli): add API Key option to qwen auth interactive menu | 2026-04-27 14:01 | auth wizard 第二轮——延续 PR#3607 的 UX 改进 |
| PR#3623 | fix(cli): recognize OpenAI-compatible providers in qwen auth status | 2026-04-28 01:06 | auth status 识别 OpenAI-compat provider |
| PR#3682 | fix(core,cli): stop stripping reasoning on model switch/history load | 2026-04-28 01:22 | 关联 item-22 Thinking 块跨轮保留——补足 PR#3590 的 GH#3579 修复,覆盖 model 切换 + history load 路径 |
| PR#3699 | fix(core): treat ask_user_question multiSelect as optional | 2026-04-28 08:40 | AskUserQuestion 工具兼容性 |
| PR#3694 | test(cli): remove 8 flaky TUI input tests surfaced by CI history mining | 2026-04-28 08:32 | CI 稳定性 |
| PR#3693 | fix(core): set DeepSeek V4 context to 1M and output to 384K | 2026-04-28 08:44 | 模型注册表更新 |
| PR#3691 | fix(cli): preserve description in subject-bearing thought chunks | 2026-04-28 08:32 | Thinking 块描述保留(UI 层) |
| PR#3690 | fix(ci): use squash merge for SDK release auto-merge | 2026-04-28 06:58 | SDK CI |
| PR#3688 | chore(release): sdk-typescript v0.1.7 | 2026-04-28 06:59 | TS SDK 发布 |
| PR#3705 | fix(ci): preserve preview version overrides | 2026-04-28 12:26 | CI 修复 |
| PR#3708 | chore(release): bump version to 0.15.3 | 2026-04-28 13:04 | v0.15.3 发布 |
🎯 重点:auth wizard 路线第二轮完成
PR#3607 + PR#3624 + PR#3623 三件套全部合并,"Qwen 第三方认证麻烦"主题取得里程碑式进展:
- ✓ PR#3607(2026-04-27)custom auth wizard step indicators + cleaner advanced config
- ✓ PR#3624(2026-04-27)API Key option in
qwen authinteractive menu - ✓ PR#3623(2026-04-28)OpenAI-compatible providers 在
qwen auth status中识别
剩余方向:OpenCode item-12 Provider 多模型提供商系统 中的 6 项 sub-direction 仍未完全实现(models.dev 数据源 / per-agent model binding / variants / BUNDLED_PROVIDERS lazy 注册等)。
🟡 新 OPEN(值得追踪 9 项)
后续状态注:本节是 2026-04-29 02:00 UTC 扫描时的 OPEN 快照。其中 PR#3687 / PR#3684 已分别于 2026-04-29 / 2026-05-02 合并;PR#3673 autoSkill 仍 OPEN;其余几项(3714/3710/3707/3680/3677/3663)截至 2026-05-02 仍 OPEN。每项最新状态以最新的 changelog(如 2026-05-02 节)为准。
| PR | 方向 | 重点 |
|---|---|---|
| PR#3673 | feat(memory): add autoSkill background project skill extraction | 🌟 autoSkill 新方向 —— 工具调用 ≥20 次自动 fork 后台 review agent 把会话中的可复用流程提炼为 project-level skill 写入 .qwen/skills/;与 autoMemory 合并调度避免多余 fork;含 skill_manage 工具(write 限制在 ${projectRoot}/.qwen/skills/);默认关闭(memory.enableAutoSkill: false) |
| PR#3687 | feat(core): wire background shells into the task_stop tool | 延续 item-56 后台 SubAgent 三件套 —— 把 PR#3642 加的 background shell 接入 task_stop,统一 SubAgent + shell 的取消语义 ✅ 已于 2026-04-29 合并 |
| PR#3684 | feat(core): event monitor tool with throttled stdout streaming (Phase C) | "Phase C" —— PR#3471/PR#3488/PR#3642 之后 background tasks roadmap 的第 4 件套:长跑命令 + 节流事件流 ✅ 已于 2026-05-02 合并 +6297/-147 系列追踪以来最大单 PR(详见 2026-05-02 changelog) |
| PR#3714 | feat(core): write runtime.json sidecar for active sessions | 活跃 session 的 runtime metadata sidecar |
| PR#3710 | feat(cli): customize banner area (logo, title, hide) | UX 定制 |
| PR#3707 | fix(core): per-agent ContentGenerator view via AsyncLocalStorage | per-agent ContentGenerator 隔离 |
| PR#3680 | feat(cli): expand TUI markdown rendering | TUI markdown 渲染扩展 |
| PR#3677 | fix(openai): parse MiniMax thinking tags | MiniMax provider 兼容 |
| PR#3663 | fix(cli): harden TUI flicker and narrow output handling | PR#3591 TUI flicker foundation 的 follow-up |
autoSkill (PR#3673) 与 codeagents 现有 item 的关系
PR#3673 的 autoSkill 与 codeagents 多个 item 有交集:
- 类似 item-4 会话记忆 / item-5 Auto Dream —— 同样是 fork 后台 review agent 自动提炼,但提炼对象是 skill 不是 memory
- 不在现有 item-28 Skill 装载性能优化范围内 —— item-28 是关于"装载已有 skill 的性能",autoSkill 是"自动创建新 skill"
- 新方向:可能值得新增 item 追踪 "autoSkill 自动 skill 提炼",归入 item-4/item-5 系列的下一阶段
- 与 Claude Code 对比:Claude Code 的 skill-creator agent(如有)也是类似方向
状态升级建议
- item-22 Thinking 块跨轮保留:PR#3590 已加,本次再加 PR#3682 / PR#3691,3 个 PR 共同完成 Thinking 块的"resume + model switch + UI 描述"全路径修复
- 主矩阵增加 PR#3624 + PR#3623 到"OpenCode item-12 Provider 系统"行(如有)
累计计数
- 已合并 PR: 104 → 115(+11)
- README 待同步
2026-04-28(重大里程碑 · 后台并发 SubAgent 三件套全部合并)
用户 ping:"看下 P2 真正后台并发 SubAgent + TTL 驱逐 这行"。审计后发现 3 个 PR 已经全部合并 —— 这是 codeagents 报告史上最大的单次升级。
🎯 ~24h 内 3 个 PR 合并(实现 item-56 + item-58 完整体)
| PR | 合并时间 | 内容 |
|---|---|---|
| PR#3471 | 2026-04-27 12:36 UTC | feat(core): model-facing agent control —— task_stop / send_message / per-agent transcript 工具,对标 Claude TaskStop + SendMessage |
| PR#3488 | 2026-04-28 02:57 UTC | feat(cli): background-agent UI —— pill + combined dialog + detail view + cancel flow + 4 状态分类(Running/Completed/Failed/Cancelled) |
| PR#3642 | 2026-04-28 03:06 UTC | feat(core): managed background shell pool with /tasks command —— 后台 shell pool + /tasks CLI 命令 |
🟢 状态升级
| Item | 旧状态 | 新状态 |
|---|---|---|
| item-56 真正后台并发 SubAgent + TTL 驱逐 | 🟡 基础设施建设中 | ✓ 已实现 |
| item-58 Coordinator 协调器面板 | 🟡 UI 层建设中 | ✓ 已实现 |
/tasks 命令 + 后台 shell pool(无独立 item) | 缺失 | ✓ 已实现 |
Qwen 实现 vs Claude 设计的差异
PR#3488 体现了 Qwen 团队的独立 UX 决策,不是 Claude 的纯复刻:
| 维度 | Claude Code | Qwen Code (PR#3488) |
|---|---|---|
| 入口 | footer 上方常驻面板 | 状态行 pill + Down 键打开对话框 |
| 自动驱逐 | 30s TTL(evictAfter) | 保持可见,用户主动管理 |
| 状态分类 | running / completed(2 类) | Running / Completed / Failed / Cancelled(4 类,明确区分非 GOAL 终止) |
| 取消 | x 立即驱逐 | x 取消 + 状态变为 Cancelled |
Qwen 超出 Claude 的 3 项设计
- ✨ 4 类状态分类:明确区分 timeout / max-turn / errors 为 Failed,让用户和父 agent 不会误以为非 GOAL 终止是成功
- ✨ per-agent rolling tool activity buffer(feeds detail view Progress section)
- ✨ 原始 prompt 保存到 detail view(用户能看自己最初指令)
主矩阵 / sub-report 联动
- 主矩阵 item-56 行 + item-58 行:状态从 🟡 → ✓ + PR 标记从 OPEN → MERGED
- p2-stability item-56 + item-58 标题升级 + 加完整状态表 + UX 差异对比表
- 累计合并 PR 计数:~101 → 104
累计影响
这次升级让 SubAgent 展示 Deep-Dive 的 "优先级 1 / 优先级 3" 两个核心 gap 同时关闭。Qwen Code 现在拥有:
- ✓ 真正后台并发 SubAgent(不阻塞主 loop)
- ✓ 显式
task_stop/send_message控制面 - ✓ pill + dialog + detail view UI
- ✓ 4 类状态分类(含非 GOAL 终止细分)
- ✓
/tasks命令入口
与 Claude Code 在 SubAgent 方向上基本对齐,部分维度甚至略有超越(4 类状态 vs 2 类 / 显式 prompt 保存)。
2026-04-28(勘误 · item-17 Agent 记忆持久化 状态修正)
用户反馈:"看下"主矩阵 item-17 行的描述 无跨 session 记忆 是否准确。
🔴 错误:item-17 描述严重过时
原描述:Qwen Code 现状:无跨 session 记忆(自创建以来从未更新)
审计源码后实际情况:Qwen Code 已有完整的 6,015 行跨 session 记忆系统,PR#3087 在 2026-04-16 合并:
| 已有能力 | 文件 |
|---|---|
~/.qwen/memory/MEMORY.md user-level 持久化 | memory/paths.ts |
project root .qwen/memory/ project-level | memory/paths.ts findGitRoot() |
4 类记忆分类:user / feedback / project / reference | memory/types.ts:7-12 |
| Auto-extraction 自动从 session 提取 | memory/extract.ts + extractAgent.ts + extractionPlanner.ts |
| Auto-Dream 后台合并去重(Claude Code 没有这能力) | memory/dream.ts + dreamAgentPlanner.ts |
| Relevance-based recall | memory/recall.ts + relevanceSelector.ts |
| Forget / Governance / Lifecycle | memory/forget.ts + governance.ts + memoryAge.ts |
| 统一 Manager 入口 | memory/manager.ts(config.getMemoryManager()) |
Qwen 在某些方面 actually 超出 Claude Code:
- ✨ Auto-extraction(自动提炼,Claude 需手动 Read/Write)
- ✨ Auto-Dream(后台合并,Claude 无)
- ✨ 4 类语义分类(feedback / reference 两类 Claude 无对应)
- ✨ Relevance-based recall(按查询相关性,Claude 是全量加载)
真正剩余的 gap:per-agent 私有记忆绑定 —— 即 Claude agent.frontmatter.memory: user|project|local 字段,让特定 Agent(如 code-reviewer)拥有专属记忆而不与其他 Agent 共享。
修正
- 主矩阵 item-17 行:
无跨 session 记忆→🟡 部分实现(跨 session 记忆 ✓ via PR#3087;per-agent 私有记忆绑定 ✗)+ 加 PR#3087 引用 - p0-p1-engine item-17 内容:从"未实现"重写为"部分实现 + 真正缺失项是 per-agent 维度",含完整能力对比表 + 设计差异分析
- 状态升级:未实现 → 🟡 部分实现
教训
PR#3087 已经在 item-4(会话记忆)/ item-5(Auto Dream)/ item-14(闭环学习)3 处被追踪为 ✓。但 item-17(同一记忆系统的另一个视角)漏更新,保留了 fork 期的过时描述。
审计建议:每次有大型 PR 合并,应把它显式映射到所有相关 item,而不是只映射到 1-2 个。PR#3087 涉及 30+ 文件 6K 行,应该影响 4-5 个 item 而不是 3 个。
2026-04-27(~14h 增量 · 7 项合并 · auth wizard MERGED · 4 项新 OPEN)
扫描窗口:2026-04-26 11:40 UTC(上次扫描 1cf3196)→ 2026-04-27 02:30 UTC。窗口内 7 项合并(含 4 项从上次 OPEN→MERGED 转换)+ 3 项新 OPEN + 3 项 stack 重做关闭。
🟢 OPEN→MERGED 转换(4 项)
上次扫描时为 🟡 OPEN 的 PR 在本窗口内合并:
| PR | 标题 | 合并时间 |
|---|---|---|
| PR#3607 | feat(cli): Improve custom auth wizard with step indicators and cleaner advanced config | 2026-04-27 02:05 UTC |
| PR#3593 | feat(cli): Add argument-hint support for slash commands | 2026-04-27 00:29 UTC |
| PR#3640 | fix(cli): guard gradient rendering without colors | 2026-04-26 16:52 UTC |
| PR#3629 | fix(config): support QWEN_CODE_API_TIMEOUT_MS across OAuth and non-OAuth paths | 2026-04-26 21:59 UTC |
| PR#3643 | feat: Adds Catalan language support | 2026-04-26 14:26 UTC |
| PR#3609 | fix(vscode-companion): slash command completion not triggering after message submit | 2026-04-26 14:27 UTC |
特别关注 PR#3607:custom auth wizard step indicators + cleaner advanced config —— 是延续 PR#3583 PRD 的 auth UX 改进路线,对应几天前讨论的"Qwen 第三方认证麻烦"方向第一个合并的实质性 PR。
🟢 本窗口内新 MERGED(1 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3653 | refactor(config): dedupe QWEN_CODE_API_TIMEOUT_MS env override logic | 2026-04-27 00:44 UTC | PR#3629 follow-up cleanup(去重 OAuth/non-OAuth 路径同名 env override 逻辑) |
🟡 新 OPEN(3 项)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3661 | feat(vscode): add tab dot indicator and notification system (#3106) | VSCode tab 通知红点,4 次 stack 重做(#3657/#3659/#3660 closed) |
| PR#3656 | fix(core): recover from }{ glued records on session JSONL load (#3606) | JSONL 健壮性修复 —— 处理上次会话中断导致的 }{ 粘连记录,与 item-7 会话崩溃恢复 方向重叠 |
| PR#3647 | fix(cli): keep sticky todo panel compact | 紧跟昨天 PR#3507 sticky todo 合并的 follow-up 紧凑化修复 |
| PR#3645 | fix(cli): correct OPENAI_MODEL precedence without breaking /model selection | PR#3567/PR#3633 revert 的第三次尝试 —— 这是个反复修复的难题(顺序 #3567 OPEN→MERGED→#3633 revert→#3645 重做) |
| PR#3649 | fix(lsp): expose status and startup diagnostics | LSP 调试改进 |
| PR#3648 | fix(acp): repair integration against current core API | ACP API 兼容修复 |
🔴 stack 重做关闭(3 项 + 1 个之前已闭)
#3657 → #3659 → #3660 → #3661 (vscode tab dot, 4 attempts, latest OPEN)
#3651 → #3653 (config dedupe, 2nd attempt MERGED)
#3646 (closed, superseded) (sticky todo redraws, replaced by #3647)
#3654 (closed) (refactor unify tool execution, no replacement)
📊 累计合并 PR 计数
94 → 101(+7 新合并)。README 同步更新。
重点观察
- auth wizard 路线在合并:PR#3607 是几天来"Qwen 第三方认证麻烦"讨论的第一个实质性合并;后续 OPEN 还有 PR#3624(API Key option in interactive menu)+ PR#3623(OpenAI-compat 在
qwen auth status识别)。 - PR#3604 仍 OPEN:昨天发现 PR body 显式引用 item-28 的 Skill 装载性能 9 项优化 PR 仍未合并(截至本次扫描 OPEN 64h+)。值得关注 review 进度。
- PR#3656 JSONL 健壮性:处理崩溃中断导致的
}{粘连,与 item-7 会话崩溃恢复有交集。 - OPENAI_MODEL precedence 是个难题:#3567 → #3633 revert → #3645 重做,第三次尝试。
2026-04-26(~31h 增量 · PR#3441 /rewind 合并 + PR#3507 sticky todo + PR#3567 被 revert)
扫描窗口:2026-04-25 04:26 UTC(上次扫描 8dfe243)→ 2026-04-26 11:40 UTC。窗口内 11 项合并 + 1 项 revert 勘误 + 8 项新 OPEN。
🎯 重要:PR#3441 /rewind 合并(2026-04-25 14:12 UTC)
PR#3441 feat(cli): add conversation rewind feature with double-ESC and /rewind command —— +1,533 / -6,重要 P2 item 落地:
- double-ESC 触发 rewind UI(同 Claude Code 设计)
/rewind命令显式触发- 对话 + 文件状态双重回退到任意检查点
- 含确认对话框
状态升级:
- 主矩阵 /rewind 检查点回退 行:缺失 → ✓ 已实现
- 同时直接命中 Gemini upstream report item-34 —— 见下方 upstream 报告联动更新
🎯 PR#3507 sticky todo panel 合并(2026-04-26 04:21 UTC)
PR#3507 feat(cli): add sticky todo panel to app layouts —— 之前已在主矩阵 item-25 行追踪 OPEN。现 MERGED。
主矩阵 item-25(Task Management)行 PR 列升级:🟡 OPEN → ✓(sticky todo panel 部分)。
🔴 重要勘误:PR#3567 被 revert
PR#3633 revert(cli): undo OPENAI_MODEL precedence change in modelProviders lookup (#3567) 合并 2026-04-26 06:29 UTC。
回退原因(PR body 原文):
"PR#3567 introduced a UX regression where a
/modelselection in the CLI is silently overridden wheneverOPENAI_MODELis set in the user's shell, with no warning surfaced."
这意味着 上次扫描 458b861 标 PR#3567 ✓ 的状态需要勘误——PR#3567 在合并 ~31 小时后被 revert。OPENAI_MODEL precedence 修复回到原状,需重新设计。
教训重申:OPEN PR 标 ✓ 后仍需 ~3 天复核,避免 revert 漏跟。
🟢 其他新合并(10 项,按时间倒序)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3633 | revert(cli): undo OPENAI_MODEL precedence change | 2026-04-26 06:29 UTC | PR#3567 revert(见上) |
| PR#3620 | fix(core): match DeepSeek provider by model name for sglang/vllm | 2026-04-26 05:17 UTC | DeepSeek 多端点匹配 |
| PR#3630 | fix(telemetry): use safeJsonStringify in FileExporter | 2026-04-26 04:55 UTC | telemetry 循环引用崩溃修复 |
| PR#3507 | feat(cli): sticky todo panel in app layouts | 2026-04-26 04:21 UTC | 见上 |
| PR#3498 | docs(telemetry): clarify Alibaba Cloud console entry | 2026-04-25 23:40 UTC | 文档 |
| PR#3495 | fix(core): preserve settings-sourced apiKey when registry model envKey is absent | 2026-04-25 23:37 UTC | provider auth bug 修复 |
| PR#3622 | fix(test): update rewind E2E Test 1 assertion after isRealUserTurn fix | 2026-04-25 22:49 UTC | PR#3441 follow-up |
| PR#3605 | feat: adds Space-to-preview to /resume session picker | 2026-04-25 14:41 UTC | 之前 OPEN 追踪 → ✓ |
| PR#3614 | test(arena): cover select dialog key actions | 2026-04-25 14:30 UTC | test only |
| PR#3611 | fix(review): respect /language output setting for local reviews | 2026-04-25 14:27 UTC | /review 增强 —— 用户 /language 设置生效 |
| PR#3441 | feat(cli): add conversation rewind feature with double-ESC and /rewind | 2026-04-25 14:12 UTC | 见上 |
🟡 新 OPEN(8 项)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3642 | feat(core): managed background shell pool with /tasks command | 直接对标 Claude Code 的 shell pool + /tasks —— 这是 item-56 后台并发 SubAgent + §9 Shell pool 缺口的关键填补,最值得跟踪 |
| PR#3636 | feat(core): cap concurrent in-flight requests per provider | provider 级别并发上限(issue #3409) |
| PR#3635 | feat(core): --insecure flag and QWEN_TLS_INSECURE env var | 自签 TLS 兼容(issue #3535) |
| PR#3637 | fix(core): preserve reasoning_content when merging consecutive assistant messages | thinking 块合并修复(issue #3619) |
| PR#3631 | Feat/stats model cost estimation | /stats 增加 cost 估算 |
| PR#3640 | fix(cli): guard gradient rendering without colors | TUI 兼容(NO_COLOR) |
| PR#3629 | feat(config): support API timeout env override | 环境变量 timeout |
| PR#3627 | feat: add macOS desktop app installer | macOS 桌面 app 安装脚本(替代关闭的 PR#3564) |
| PR#3624 | fix(cli): add API Key option to qwen auth interactive menu | auth 菜单 UX |
| PR#3643 | feat: Adds Catalan language support | i18n |
重点关注 PR#3642:这是 Claude Code shell pool 架构在 Qwen Code 的首次正式 PR。如合并将关闭多个本 doc 系列长期追踪的缺口(包括 claude-code-async-tasks §九 component 1 Shell pool 完全无 PR 的状态)。
📊 累计合并 PR 计数
84 → 94(+10 净合并,1 个是 revert)。README 同步更新。
2026-04-25(~5h 增量 · PR#3591 TUI flicker foundation 合并 · PR#3602 cleanup)
扫描窗口:2026-04-24 23:20 UTC(上次扫描 458b861)→ 2026-04-25 04:26 UTC。窗口内 2 项合并 + 3 项新 OPEN。
🎯 重要:PR#3591 TUI flicker foundation 合并(2026-04-25 02:13 UTC)
PR#3591 fix(cli): add TUI flicker foundation fixes —— 在上次扫描后约 3 小时合并,+1473 / -200,supersedes 已关闭的 stack #3584/#3586/#3587/#3588。
PR description(重要):
"It does not claim to fully close every TUI flicker / long-output / detail-panel issue; the remaining work is called out below."
foundation 层覆盖(按 PR body 原文):
- 主屏流式 flicker 减少:throttle safe content / thought promotion + redraw counters
/clear路径上避免重复clearTerminal写入- Pre-slice 大块 plain text / ANSI tool 输出进入 Ink layout 前裁剪
- Visual-height slicing 含长单行 JSON / base64 / minified(防止 unbounded visual rows)
- Shell transcript 在窄终端 soft wrap 后仍保留语义
- 双路径(color + non-color)抑制 soft-wrap-only live shell 视口重渲染
- Synchronized terminal output 改 conservative allowlist(含 opt-out + counters)
对相关 item 的状态影响:
| Item | 改前 | 改后 |
|---|---|---|
| p2-stability item-44(消息响应统一容器 + 离屏冻结) | 缺失 | 🟡 部分覆盖(PR#3591 ✓ — pre-slice + visual-height slicing 部分对齐 OffscreenFreeze 思路;MessageResponse height=1 严格容器仍待) |
| p2-stability item-45(三级输出截断 30K/50K/200K) | 缺失 | 🟡 部分覆盖(PR#3591 ✓ — pre-slice 在进入 Ink 前已截,但三级数字预算未实现) |
| p2-stability item-46(Bash "5 行窗口 + +N lines") | ✓ 已实现 | ✓ 已实现(不变) |
主矩阵 PR 列追加:item-44 / item-45 行的 PR 列加 PR#3591 ✓ partial。
剩余未覆盖(PR body 自述):MessageResponse 严格 height=1 overflowY=hidden 容器、三级精确 30K/50K/200K 数字预算、OffscreenFreeze 引用缓存。
🟢 新合并(1 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3602 | fix(cli): drain runExitCleanup before process.exit in error handlers | 2026-04-25 03:07 UTC | PR#3581 follow-up 收尾 — 关掉 SIGINT / max-turn / fatal-error 路径绕过 runExitCleanup 的最后漏洞,避免最近 turn 的 JSONL 写入丢失。+218/-58,3 函数(handleError / handleCancellationError / handleMaxTurnsExceededError) |
PR#3602 是 PR#3581(91% sync I/O perf)的紧密续作——同一作者继续清理 process.exit 异常路径的 cleanup 漏洞。
🟡 新 OPEN(3 项)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3607 | feat(cli): Improve custom auth wizard with step indicators and cleaner advanced config | auth wizard UX 增强(参考 PR#3583 PRD) |
| PR#3605 | feat: adds a Space-to-preview affordance to the /resume session picker | session picker 预览增强 |
| PR#3604 | feat(skills): parallelize loading + add path-conditional activation | 直接对应 p0-p1-engine item-28(Skill 装载性能 9 项优化)的两个核心方向——并行加载 + 路径条件激活;如合并将关键升级 item-28 到 🟡 部分实现 |
📊 累计合并 PR 计数
82 → 84(+2 新合并:PR#3591 + PR#3602)。README 同步更新。
2026-04-25(~5min 增量 · PR#3567 OPEN → MERGED)
扫描窗口:2026-04-24 23:15 UTC(上次扫描 559b440)→ 23:20 UTC。窗口内 1 项合并。
PR#3567 fix(cli): respect OPENAI_MODEL precedence in CLI model resolution —— 2026-04-24 23:19 UTC 合并(距推送仅 ~1 分钟),+254/-2。
resolveCliGenerationConfig() 现在按这个优先级选模型:
argv.model > OPENAI_MODEL > QWEN_MODEL > settings.model.name
之前 OPENAI_MODEL 未被 CLI 端正确识别(只在 provider lookup 侧生效),导致用户在 .env 里设 OPENAI_MODEL=gpt-4.1 但 CLI 继续用 settings 里的模型。修复与 OpenCode 对比报告 item-12(多 provider 配置) 方向对齐。
从"值得追踪的 OPEN PR"表移出(上次扫描标 OPEN,5 分钟后合并)。
📊 累计合并 PR 计数
81 → 82(+1)。README 同步更新。
2026-04-25(补漏扫描 · 2 项 VSCode companion 合并未记录)
扫描方法修正:之前 3 轮扫描用 gh pr list --state merged --limit 30(默认按 PR number 创建顺序返回前 30),遗漏了老 PR number 但最近才合并的条目。改用 --search "sort:updated-desc" 后补齐 2 项:
| PR | 标题 | 合并时间 | 规模 |
|---|---|---|---|
| PR#2548 | feat(vscode): expose /skills as slash command with secondary picker | 2026-04-24 15:28 UTC | +1,011 / -102,26 文件 |
| PR#2592 | feat(vscode-companion): support /export session command | 2026-04-24 09:55 UTC | +1,151 / -49 |
两 PR 均为 VSCode IDE companion 能力扩展:
- PR#2548 给 VSCode 内加
/skills斜杠命令 —— 输入/skills后不直接发送,而是打开二级选择器让用户挑 skill(追平 CLI 的/skill-name形式)。属 VSCode UX 补齐类。 - PR#2592 给 VSCode companion 加
/export命令 —— 导出当前 session 到文件,与 CLI 的/export对齐。属"VSCode 命令对齐 CLI 命令"系列的延续(前有 PR#2593/insight、PR#2984/account、PR#2551 Plan Mode 等)。
两者都不改变现有 improvement item 状态(Qwen Code 的 VSCode 集成本就是自家能力、非对标 Claude Code 的 gap),但应纳入 MERGED 计数。
教训:跨天/跨周 scan 需用 sort:updated-desc 或 sort:merged-desc 搜索语法,否则会漏掉"老 PR 最近合并"的场景。后续 scan 命令固定为:
gh pr list --repo QwenLM/qwen-code --state merged --limit 50 \
--search "sort:updated-desc" --json number,title,mergedAt
📊 累计合并 PR 计数
79 → 81(+2 补漏)。README 同步更新。
2026-04-25(~7h 增量 · PR#3494 Python SDK 合并 · platform item-5 ✓)
扫描窗口:2026-04-24 15:32 UTC(上次扫描 221e3c9)→ 2026-04-24 23:05 UTC。窗口内 1 项重要合并 + 1 项新 OPEN + 2 项 CLOSED。
🎯 重要:PR#3494 Python SDK 合并(2026-04-24 23:02 UTC)
PR#3494 feat(SDK) Add Python SDK implementation for #3010 —— 在上次扫描后 ~7.5 小时 合并,距今 ~2 分钟。
规模:+4,676 行 / -14 行 / 25 文件;新增 packages/sdk-python/ 整个 package。
能力覆盖:
- async
query+ syncquery_sync双 API - process transport(subprocess 调用
qwenCLI) - control requests(session 控制)
- permission handling(工具审批)
- ruff + pytest + mypy 完整 Python 工具链
npm run smoke:sdk:python实模型 E2E smoke 入口
状态升级:
| 位置 | 改前 | 改后 |
|---|---|---|
| 主矩阵 "Agent SDK 增强" 行(item-5 platform) | 仅 TypeScript SDK · PR 列 — | ✓ Python SDK 已合并 · PR#3494 ✓ |
| p0-p1-platform item-5 标题 | ### 5. Agent SDK Python(P1) | ### 5. Agent SDK Python(P1)✓ 已实现 |
追踪表调整:PR#3494 从"值得追踪的 OPEN PR"表移出(该 PR 实际已合并)。
注意:流式回调 + 工具审批回调的 API 完整度未在 PR body 明确声明,需要后续验证是否达到 Claude Code Python SDK 的同等能力。但原生 Python import 目标已达成。
🟡 新 OPEN(1 项)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3600 | fix(core): handle shell line continuations in command splitting | Bash 工具解析健壮性 —— 处理 \ 换行续行的 command splitting 边界 case |
🔴 CLOSED(2 项,stack 拆分/放弃)
| PR | 标题 | 关闭时间 |
|---|---|---|
| PR#3564 | feat: add macOS Desktop App installation script and documentation | 2026-04-24 20:50 UTC |
| PR#3563 | feat(skills): add oh-my-agent-check bundled skill | 2026-04-24 20:50 UTC |
两 PR 同时关闭,可能是 stack 整合或方案调整,不影响现有 item 状态。
📊 累计合并 PR 计数
78 → 79(+1 新合并 PR#3494)。README 同步更新。
2026-04-25(~4h 增量 · PR#3581 合并 → item-2 / item-5 升级 · 勘误 PR#3502)
扫描窗口:2026-04-24 11:47 UTC(上次扫描 665d430)→ 2026-04-24 15:32 UTC。窗口内 5 项新合并 + 1 项勘误。
🎯 重要:PR#3581 从 OPEN → MERGED(2026-04-24 13:17 UTC)
PR#3581 perf(core): cut runtime sync I/O on tool hot path by 91% 于上次扫描后 90 分钟 合并。相关状态升级:
| 位置 | 改前 | 改后 |
|---|---|---|
| 主矩阵 item-5 行 | 🟡 PR 进行中 | ✓ 已实现 |
| 主矩阵 item-2 行 | 🟡 PR 部分覆盖 | 🟡 部分实现(合并仅覆盖查询缓存,内容缓存 + 32 并行仍待做) |
| 架构差异表"同步 I/O" | 🟡 PR 进行中 | ✓ 已实现(显著落后→已追平) |
| 架构差异表"文件读取缓存" | 🟡 部分覆盖 | 🟡 部分覆盖(查询缓存已合并) |
| p0-p1-engine item-2 标题 | 🟡 PR 进行中 | 🟡 部分实现(PR#3581 ✓ 合并) |
| p0-p1-engine item-5 标题 | 🟡 PR 进行中 | ✓ 已实现 |
项目 hot path fs 调用从 110 → 10 per prompt,-91%。Ink 渲染与 keypress 不再被主线程 sync 阻塞。
🟢 新合并(5 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3581 | perf(core): cut runtime sync I/O on tool hot path by 91% | 2026-04-24 13:17 UTC | p0-p1-engine item-5 ✓ + item-2 🟡(见上) |
| PR#3569 | feat(cli): add Traditional Chinese (zh-TW) as a UI language option | 2026-04-24 13:34 UTC | i18n(上次 OPEN→现 MERGED) |
| PR#3547 | fix(cli): memoize useHistory() return to avoid unnecessary re-renders | 2026-04-24 14:57 UTC | Gemini CLI backport(google-gemini/gemini-cli#10820)修 GH#3530 /model 重复输入引发 "Maximum update depth exceeded";与 p2-perf Ink 性能方向同源 |
| PR#3477 | feat(vscode): add native context menu copy actions for webview chat | 2026-04-24 12:26 UTC | VSCode webview UX(+421 行 / -114 行) |
| PR#3522 | docs(github): tighten PR template validation guidance | 2026-04-24 14:14 UTC | 仓库治理 |
🔴 勘误 · PR#3502 错误归类为 OPEN
PR#3502 feat(web-search): remove built-in web_search tool, replace with MCP-based approach —— 2026-04-24 03:29 UTC 已合并,但上次扫描误放在"值得追踪的 OPEN PR"表中。已移出。
影响:删除 ~1,700 行代码(整个 packages/core/src/tools/web-search/ + 4 个 provider:DashScope/Tavily/Google/GLM)。从此 web_search 走 MCP server 连接。这是 Qwen Code 架构上向 OpenCode / Claude Code "用 MCP 替代内置 provider"方向的一次显著对齐——与 OpenCode 对标报告 item-3(MCP-first 架构) 方向一致。
🟡 新 OPEN(1 项)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3598 | feat(cli): add --json-schema for structured output in headless mode | 非交互输出结构化 —— 对标 Claude Code --output-format json / Codex structured output;headless/CI 场景重要能力 |
📊 累计合并 PR 计数
72 → 78(+5 新合并 + 1 勘误 PR#3502)。README 同步更新。
2026-04-25(增量 PR 扫描 · PR#3589 关闭勘误 + 9 项合并 + 新 OPEN PR)
扫描 2026-04-24 后 ~24h 增量 —— 共 9 项合并 + 1 项重要关闭 + 若干新 OPEN。
🔴 关闭勘误 · PR#3589 被关闭
PR#3589 —— feat(tools): add ToolSearch for on-demand loading of deferred tool schemas —— 2026-04-24 08:51 UTC CLOSED(未合并)
昨天(2026-04-24)的 commit 22f2a87 / 8ca638a 把本 PR 标为 🟡 PR 进行中。PR 在同天被关闭,需要回滚 3 处追踪:
- 主矩阵 工具动态发现 行:🟡 PR 进行中 → 缺失
- 架构差异总结(section 四) 工具发现 行:🟡 PR 进行中 → 缺失
tool-search-deep-dive.md顶部追踪块:🟡 → ✗ CLOSED 说明(保留技术要点作为未来重启参考)
CLOSED 未给出明确原因 —— 可能是 review 反馈、stack 拆分、或方案调整。本 item 维持 P1 追踪,等待后续 PR。
这是一次重要教训:PR 状态可能小时级变动,前一天标 🟡 OPEN 不保证后续合并。追踪 OPEN PR 时应在短期(<48h)做一次状态复核。
🟢 新合并(9 项)
| PR | 标题 | 合并时间 | 影响 |
|---|---|---|---|
| PR#3590 | fix(core): preserve reasoning_content during session resume and active sessions (GH#3579) | 2026-04-24 09:49 UTC | 修 item-22 Thinking 块相关 resume bug |
| PR#3575 | feat(docs): add qwen-code skills, agents, and updated AGENTS.md | 2026-04-24 09:33 UTC | 文档 |
| PR#3574 | fix(acp): support SSE and HTTP MCP servers in ACP mode | 2026-04-24 06:53 UTC | ACP + MCP 改进 |
| PR#3573 | revert(vscode-ide-companion): undo #3450 split-stream timestamp sharing | 2026-04-24 09:13 UTC | VSCode IDE 回滚 |
| PR#3550 | refactor(core): make OpenAI converter stateless (follow-up to #3525) | 2026-04-24 04:28 UTC | 多 provider 稳定性 |
| PR#3544 | fix(cli): disable Kitty keyboard protocol on SIGINT to prevent garbled 9;5u output | 2026-04-24 07:27 UTC | 终端兼容性 |
| PR#3543 | fix(sdk-java): pass custom env to CLI process | 2026-04-24 02:37 UTC | Java SDK |
| PR#3531 | fix(cli): promote resubmitted history prompt to most recent | 2026-04-24 04:27 UTC | 历史输入 UX |
| PR#3523 | fix(cli): dispatch queued slash commands through the slash path | 2026-04-24 09:11 UTC | 命令队列分派 |
其中 PR#3590 与 p0-p1-engine item-22 Thinking 块跨轮保留与空闲清理的 resume 路径直接相关 —— 主矩阵该行 PR 列补充追加。
🟡 新 OPEN(追踪)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3596 | chore(release): bump version to 0.15.2 | 即将发布 v0.15.2 |
| PR#3593 | feat(cli): Add argument-hint support for slash commands | slash 命令 UX |
| PR#3577 | feat(skills): add tmux-real-user-testing skill | bundled skill 扩展 |
| PR#3576 | Feat/openrouter auth | OpenRouter 第三方认证 —— 延续"多 provider 认证"方向(参见 OpenCode 对比 item-12) |
| PR#3570 | feat(core): add simplify bundled skill | bundled skill 扩展 |
| PR#3569 | feat(cli): add Traditional Chinese (zh-TW) as a UI language option | i18n |
🔴 同期被关闭(stack 拆分)
PR#3584 / PR#3586 / PR#3587 / PR#3588 —— 一系列 flicker/rendering 修复,均被 PR#3591 合并重基成一个 foundation PR。不需单独追踪。
2026-04-24(新增 P1 item-28 · Skill 装载性能综合优化 · 9 项 Claude Code 参考)
用户要求:"Claude Code 有优化 Skill 装载性能可以参考的地方么?... 要"——同意把 Claude Code 的 9 项 Skill 装载优化聚合成 1 个正式 item 写入报告。
新增 item-28(p0-p1-engine)
Skill 装载性能综合优化(9 项 Claude Code 参考)
整合 Claude Code 在 3 个源文件(skills/loadSkillsDir.ts + utils/attachments.ts + utils/skills/skillChangeDetector.ts)中的 9 项优化:
| # | 优化 | Tier | 工作量 | 收益 |
|---|---|---|---|---|
| 1 | 外层 `Promise.all$ 并行 5 路目录来源 | \text{P0} 冷启动 | 5 行 | ~5 \times |
| 2 | 内层 并行单目录 | \text{P0} 冷启动 | 10 行 | 每 \text{dir} ~\text{N} \times |
| 3 | 顶层 $memoize()` 按 cwd 缓存 | P3 | 10 行 | 多次调用去重 |
| 4 | sentSkillNames per-agent 去重 | P1 token | ~50 行 | 每轮省 600-1500 token |
| 5 | suppressNext on --resume | P2 | ~20 行 | resume 省一次完整注入 |
| 6 | Conditional skills(paths: frontmatter) | P1 token | ~30 行 | 大 monorepo 省 50%+ 列表 |
| 7 | 300ms reload debounce + 1s stability | P2 正确性 | ~30 行 | git checkout 不卡顿 |
| 8 | Bun usePolling 规避 PathWatcherManager 死锁 | P3 | ~5 行 | 未来 Bun 不死锁 |
| 9 | realpath 并行去重 symlink | P2 正确性 | ~30 行 | 解决嵌套/symlink 重复 |
Qwen Code 现状清单:
skill-manager.ts:265-285refreshCache()4 层串行 forskill-manager.ts:695listSkillsAtLevel()provider dir 串行skill-manager.ts:723loadSkillsFromDir()每 skill dir 串行- 每 turn 注入完整 skill 列表(无
sentSkillNames) /resume重复注入- 未用
ConditionalRulesRegistrylazy 激活 skill
重要复用机会:Qwen 已有 ConditionalRulesRegistry(utils/rulesDiscovery.ts:232-300)给 .qwen/rules/*.md 用。把 skill 接到同一引擎 = 子项 #6 零新机制工作量。
主矩阵 / p2-perf / README 联动
- 主矩阵:新增 P1 行(item-28)
- p2-perf item-2(插件/Skill 并行加载)顶部加整合提示 —— 已合并到 item-28 子项 #1+#2+#3
- sub-report 计数:p0-p1-engine 27 → 28
- 总项数:274 → 275
- README 两处数字同步
为什么归为 P1 而不是 P2
- 子项 #4 每轮节省 600-1500 token × N turn —— 在频繁使用 skill 的工作流中,一天对话可能累计省 50K+ token
- 子项 #6 对大 monorepo(50+ 条件性 skill)是不可或缺的 UX 保护
- 子项 #1 + #2 的冷启动优化是用户第一印象
单个子项单独看是 P2,但综合收益对重度 skill 用户(这是 Qwen 的明确定位,因为 skills 已反超 OpenCode 6.8×)是 P1 级别的。
2026-04-24(大性能/架构 PR 进入开发 · 3 项 P1 状态升级)
用户要求:跟踪 PR#3581 + PR#3589(均由 wenshao 于 2026-04-24 同日开启的大型性能/架构 PR)。
🟡 新开的 2 个大 PR —— 直接命中 3 项 P1
| PR | 标题 | 命中 item | 度量 |
|---|---|---|---|
| PR#3581 🟡 OPEN | perf(core): cut runtime sync I/O on tool hot path by 91% | p0-p1-engine item-5 同步 I/O 异步化 + item-2 文件读取缓存(部分覆盖) | hot path 110 → 10 syscall/prompt,-91% |
| PR#3589 🟡 OPEN | feat(tools): add ToolSearch for on-demand loading of deferred tool schemas | 主矩阵 P1 工具动态发现 | 39-tool setup 省 ~15K tokens/request |
PR#3581 技术亮点
3 commit 拆分:
appendRecord异步化(110→20)——chatRecordingService每 event 4 syscall(existsSync + mkdirSync + existsSync + appendFileSync)改为 fire-and-forgetwriteChainpromise +Config.shutdown()awaitflush()+jsonl.writeLine改用fs.promises- hot-path LRU 缓存(20→10)——
workspaceContext.fullyResolvedPath/paths.validatePath(positive only,ENOENT 不缓存)/ripGrep .qwenignore;fileUtils删existsSyncpre-check 改fs.promises.statENOENT→FILE_NOT_FOUND - 测试 + 回归守卫 +
_reset*ForTest—— ENOENT-not-cached /flush()早 resolve / write 失败不阻塞 chain
工程质量:PR body 含完整 tracer 脚本(trace-sync-io.cjs ~160 行)+ 可复现度量步骤 + reentrancy guard / PID-suffixed 输出 / warmup 窗口设计细节。
PR#3589 技术亮点
DeclarativeTool新增shouldDefer/alwaysLoad/searchHint标志- 默认 deferred:MCP 工具 +
lsp/cron_*/ask_user_question/exit_plan_mode ToolSearch双查询模式:select:Name1,Name2精确匹配(不敏感 + 去重)+ 关键词搜索(支持+must-word必需词)- 评分对齐 Claude Code spec:built-in
10/5/4/2(name/substring/hint/desc),MCP12/6偏向 MCP 以鼓励发现 - ✨ resume 支持:
startChat扫描历史 function calls 重新 reveal 之前用过的 deferred 工具 - ✨ compaction 保留:
/clear清 revealed;压缩路径(startChat(newHistory))保留 - Subagent 兼容:wildcard
['*']通过includeDeferred: true保持向后兼容 - 21 文件 / +1051/-11 行 / 20 个新测试 case
主矩阵与 sub-report 同步
- p0-p1-engine item-5:未实现 → 🟡 PR 进行中(PR#3581)
- p0-p1-engine item-2:未实现 → 🟡 部分 PR 覆盖(PR#3581 查询层,内容层仍缺)
- 主矩阵 工具动态发现 行:
全部工具始终加载→ 🟡 PR 进行中(PR#3589) - 主矩阵 同步 I/O 异步化 行:
多处 readFileSync→ 🟡 PR 进行中 - 主矩阵 文件读取缓存 行:
无缓存,顺序读取→ 🟡 部分覆盖 - 架构差异总结(section 四)工具发现 / 同步 I/O / 文件读取缓存 三行同步更新
2026-04-23(PR 合并潮 · 3 项升级为 ✓ 完整 + item-20 勘误)
用户要求:"根据最近几天的 https://github.com/QwenLM/qwen-code/pulls 更新 qwen-code-improvement系列文章的内容"。扫描 2026-04-20 至 2026-04-23 间 40+ PR,发现 4 项已完整实现 / 3 项进入 PR 阶段。
🟢 MERGED · 升级为 ✓ 完整实现
PR#3512 合并 2026-04-23 00:52 UTC —— "feat(cli): combine elapsed + timeout in shell time indicator"
- item-47 从 🟡 增强中 → ✓ 已完整实现
- 4/4 Claude-style gap 全部覆盖(组合格式 / 亚秒精度 / 条件阈值 / Shell 专属)
PR#3540 合并 2026-04-23 12:37 UTC —— "feat(session): auto-title sessions via fast model, add /rename --auto"
- item-50 从 ✓ 已实现(有 3 个差异)→ ✓ 已完整实现(3 个差异全部消除 + Qwen 超出 Claude 的 3 个工程细节:
titleSource元数据 / cross-process race 保护 / 环境变量级开关) - 补齐 PR#3093 之前留下的:fastModel 路由 + sentence-case 风格 + 首个 assistant 回合后自动触发
- 额外防御:strip 终端控制序列 / JSONL 截断防护 / UTF-16 surrogate /
O_NOFOLLOW/ 64MB 扫描上限
PR#3460 合并 2026-04-22 08:58 UTC —— "feat(cli): auto-detect terminal theme ('auto' or unset)"
- p2-core item-20(终端主题检测)从 "缺失" → ✓ 已实现
- 主矩阵 + 架构差异总结(section 四)同步更新
- OSC 11 查询 + COLORFGBG 环境变量回退检测链已就位
🟡 OPEN · 进入实现阶段(追踪中)
| Item | PR | 方向 |
|---|---|---|
| item-13(会话分支 /branch) | PR#3539 🟡 | /branch fork 当前会话——本 item 第三次尝试(前两次 #3022 closed + #3292 跟进) |
| item-53(WebFetch LLM 清洗) | PR#3537 🟡 | 把 web-fetch processing 路由到 fastModel |
| item-56(后台并发 SubAgent) | PR#3471 🟡 + PR#3488 🟡 | 控制面(task_stop / send_message / per-agent transcript)+ UI 层(pill + 合并对话 + 详情视图) |
| item-58(Coordinator 面板) | PR#3488 🟡 | 对标 CoordinatorAgentStatus.tsx 三层视图 |
🔴 勘误 · item-20 @include 指令与嵌套记忆发现
状态修正:P1 未实现 → ✓ 已实现(核心机制已到位)。
审计 Qwen 源码后发现本 item 添加时就已实现,属于文档疏漏。两层机制都有对应实现:
| Claude 机制 | Qwen Code 对应 | 源码 |
|---|---|---|
@include + MAX_INCLUDE_DEPTH=5 | memoryImportProcessor.processImports() + maxDepth=5(数字都一致) | utils/memoryImportProcessor.ts:200- |
| 循环引用防护 | processedFiles: Set<string> | utils/memoryImportProcessor.ts:19 |
代码块 @ 不解析 | findCodeRegions() skip | utils/memoryImportProcessor.ts:251-267 |
| 嵌套记忆自动发现 | Upward scan(启动)+ Conditional rules(工具调用时按 paths: glob 注入 <system-reminder>) | utils/memoryDiscovery.ts:186-226 + utils/rulesDiscovery.ts:232-300 + core/coreToolScheduler.ts:1703-1716 |
Qwen 超出 Claude 的设计:paths: frontmatter 声明式匹配(无需物理放置在对应目录);baseline vs conditional 两类规则分离(启动时 vs 懒注入);once-per-session 去重;global + project 两层目录。
其他 MERGED PR(不影响现有 items,仅记录)
| PR | 标题 | 合并时间 |
|---|---|---|
| PR#3482 | fix(cli): rework session recap rendering and add blur threshold setting | 2026-04-21 06:39 UTC |
| PR#3478 | fix(cli): pin /recap above input and align defaults with fastModel | 2026-04-20 15:58 UTC |
| PR#3505 | fix(core): reject truncated subagent write_file calls | 2026-04-22 07:01 UTC |
| PR#3499 | fix(core): use empty string instead of null for reasoning-only assistant content | 2026-04-21 21:28 UTC |
| PR#3460 | feat(cli): auto-detect terminal theme ('auto' or unset) | 2026-04-22 08:58 UTC |
| PR#3468 | Revert "feat(core): add dynamic swarm worker tool" | 2026-04-20 08:40 UTC |
| PR#3467 | fix(core): prevent malformed permission rules from becoming tool-wide catch-alls | 2026-04-20 10:56 UTC |
| PR#3458 | fix(openai): when samplingParams is set, pass it through verbatim | 2026-04-21 13:47 UTC |
| PR#3525 | fix(core): scope StreamingToolCallParser per stream, not per Converter | 2026-04-22 12:32 UTC |
| PR#3533 | fix(cli): stop slash completion render loop | 2026-04-23 02:31 UTC |
| PR#3559 | fix(core): treat empty 'pages' parameter as unset in ReadFile | 2026-04-23 12:02 UTC |
| PR#3479 | fix(cli): inject plan/subagent/arena system reminders in ACP | 2026-04-22 06:46 UTC |
| PR#3475 | feat(cli): make ACP message rewrite timeout configurable | 2026-04-20 12:58 UTC |
| PR#3469 | feat(webui): render markdown in generic and web-fetch tool outputs | 2026-04-21 07:53 UTC |
| PR#3489 | fix(mcp): make the OAuth authorization URL clickable when wrapped | 2026-04-21 08:44 UTC |
| PR#3541 + PR#3526 | chore(release): bump versions to 0.15.0 / 0.15.1 | 2026-04-22 / 2026-04-23 |
| PR#3534 | fix(i18n): sync mismatched keys between en.js and zh.js | 2026-04-23 16:38 UTC |
值得追踪的 OPEN PR(可能成为后续 items)
| PR | 方向 | 潜在影响 |
|---|---|---|
| PR#3539 | /branch 分叉当前会话 | 类似 Claude /rewind 但走"fork"语义;可能成为 session 管理新 item |
| PR#3507 | sticky todo panel in app layouts | 对标 Claude 持久 TODO 面板 |
| PR#3491 | /diff 命令 + git diff 统计 | 新的 builtin 命令 |
| PR#3519 | 粘贴 base64 / data URL 图片 + 拖拽 | 对标多模态输入 |
| PR#3538 | LLM-generated summary labels for tool-call batches | 可能成为新的 fastModel 场景 |
| PR#3562/3561/3546 | OSC 通知(iTerm2 / Kitty / Ghostty / cmux) | 终端能力集成 |
| PR#3557 | insight facet normalization 加固 | Qwen 自有 /insight 系统健壮性(非对标 Claude Code) |
| PR#3544 | SIGINT 时禁用 Kitty 键盘协议(防 9;5u 残余) | 终端兼容性修复 |
| PR#3550 | 无状态 OpenAI converter(跟进 #3525 方向) | 多 provider 稳定性 |
2026-04-22(审计勘误 · item-48 / item-50 修正)
用户要求:"再次多轮无方向审计、反向审计直至没问题"。严格审计 items 44-58 的技术准确性后发现 2 处实质错误。
🔴 错误 1:item-48 singleHunk 机制描述错误
声称:Claude 根据 hunks.length === 1 自动切换 context: 100_000 显示完整函数。
实际(源码验证):
hooks/useDiffInIDE.ts:170-196是唯一设置singleHunk=true的路径,仅 IDE 扩展 使用- 判断依据是
editMode: 'single' | 'multiple'参数传入,不是hunks.length === 1启发式 tools/FileEditTool/utils.ts:343(终端 UI 路径)不传singleHunk,始终context: 3- "改 1 行看完整函数"在 Claude 终端 UI 不成立——只在 IDE 扩展中
修正:
- item-48 标题:
语义化 hunk 模型 + singleHunk 智能上下文→语义化 hunk 模型(消除双重 diff 序列化) - 删除"改 1 行看完整函数"的终端 UI 场景(不成立)
- 重写 Qwen 修改方向——聚焦真正有价值的
structuredPatch改造 + 删除 UI 层 62 行 regex;singleHunk作为可选 IDE 扩展增强 - 补充:Qwen 的
diffOptions.ts:41, 52已部分使用structuredPatch——改造路径已验证可行 - Deep-Dive
update-tool-display-deep-dive.md3 处标注勘误
🔴 错误 2:item-50 添加时已被实现
声称:Qwen Code 缺少"会话标题自动生成"功能。
实际:PR#3093(feat(session): add rename, delete, and auto-title generation for session)2026-04-22 03:48 UTC 已合并,commit 0c423deed——早于我添加 item-50 的时间。
Qwen 已实现:
packages/cli/src/ui/commands/renameCommand.ts:43, 128generateSessionTitle/rename无参数触发自动生成 kebab-case title- CLI prompt tag / VSCode / WebUI 三端展示
--resume <title>按 title 恢复 session- Append-only system record 存储
与 Claude 的 3 处差异(剩余优化空间):
- 用 "current model" 而非 fastModel(成本偏高)
- kebab-case 而非 sentence-case
- 手动触发而非自动生成
修正:
- item-50 状态:🆕 新增建议 → ✓ 已实现(剩余优化 ~50 行,0.5 天)
- 主矩阵 item-50 行:
UUID/时间戳→✓ 已实现,追踪 PR#3093 ✓ - README 已合并 ✓ 67 → 68
✅ 审计验证通过项
items 44(已修订)/ 45-47 / 49 / 51-58 逐项验证:
- PR 状态(PR#3155/3508 已合并,PR#3512 OPEN)正确
- 常量值(
BASH_MAX_OUTPUT_DEFAULT = 30_000/CONTEXT_LINES = 3/RECENT_COMPLETED_TTL_MS = 30_000)验证与源码一致 - "Qwen 没有 X" 声明(item-45/52-55)通过 grep 验证
- Feature flag(
tengu_plum_vx3/tengu_copper_panda/tengu_cork_m4q)逐一验证
📊 本轮审计方法论(从 item-44 学到)
- 基础设施层 vs 用户可见效果层——原 item-44 把 MessageResponse(基础设施)描述成"活跃区压缩"(效果层)
- 多机制混为一谈——原 item-44 把
MessageResponse和ShellProgressMessage5 行窗口混讲 - 未扫描 latest merges 就提建议——原 item-50 错误,未来添加 item 前必须
gh pr list --state merged扫最新 - 源码引用必须 open the file 验证——item-48 的
singleHunk机制凭印象写,实际看源码才知只在 IDE 扩展
2026-04-22(SubAgent 展示对比 · 新增 3 项)
用户提问:"现在 Claude Code 和 Qwen Code 运行 SubAgent 的显示界面有什么区别?"
新增 Deep-Dive:SubAgent 展示 Deep-Dive —— 两条 UI 哲学对比(Claude 双模式 Task/Coordinator vs Qwen 单一嵌入式 AgentExecutionDisplay),4 个场景逐帧比对(单 agent 10s / 3 并发 + 审批 / 失败处理 / 中断)。
双向借鉴机会:
- Qwen ← Claude:真后台并发(evictAfter TTL)/
/agents独立管理视图 / Coordinator footer 面板 - Claude ← Qwen:Ctrl+E/F 三档切换 / 焦点锁并发审批 / 执行摘要长期保留
新增 3 个追踪 item(p2-stability 55 → 58):
| # | 方向 | 优先级 | 成本 |
|---|---|---|---|
| item-56 | 真正后台并发 SubAgent + TTL 驱逐(evictAfter + 1s tick + 30s TTL) | 🥇 | 2-3 周 |
| item-57 | /agents 独立管理视图(subagent 历史归档) | 🥈 | 1-1.5 周 |
| item-58 | Coordinator 协调器面板(footer 上方多 agent 列表) | 🥉 | 3-5 天(前置 item-56) |
关键源码验证:
CoordinatorAgentStatus.tsx:31-63evictAfter过滤 + 1s tick + 驱逐逻辑TaskListV2.tsx:21RECENT_COMPLETED_TTL_MS = 30_000AgentExecutionDisplay.tsx:124-140Ctrl+E/F 三档切换ToolGroupMessage.tsx:99-123焦点锁focusedSubagentRef+isWaitingForOtherApproval
总项数:271 → 274(+3)。p2-stability 55 → 58。
2026-04-22(PR#3512 OPEN · item-47 剩余 gap 的精确补齐)
PR#3512 OPEN(2026-04-22 07:32 UTC 提交,作者 wenshao)——"feat(cli): combine elapsed + timeout in shell time indicator"。直接响应 2026-04-21 勘误中列出的 item-47 剩余 4 个 Claude-style gap,4/4 全部覆盖。
覆盖度:
| Gap | 2026-04-21 勘误描述 | PR#3512 实现 |
|---|---|---|
| ① 组合格式 | elapsed + timeout 合并 (... · ...) | ✅ (10s · timeout 5s) inline |
| ② 亚秒精度 | hideTrailingZeros option | ✅ formatters.ts 新增 option,5s / 5.5s 正确 |
| ③ 无阈值模式 | settings toggle | ✅ 更优雅——有 timeoutMs 时 t=0 显示,无 timeoutMs 保持 3s 阈值,无需配置 |
| ④ Shell 专属包装 | 仅 shell 内联 | ✅ 自然达成——只有 shell 工具有 timeoutMs |
设计亮点(4 条):
- Conditional quiet threshold:"工具自己告诉 UI:用户是否关心时间"(比我建议的 settings toggle 更优雅,零配置)
hideTrailingZeros作为 formatter option——复用到其他 duration 场景(测试耗时等)- 消除自定义
formatElapsed——统一走formatDuration,所有 duration 输出一致(hour-range1h 2m 6s) - ShellStatsBar 瘦身——
timeoutMs搬到ToolElapsedTimeinline,stats bar 只留+N lines+ memory usage,职责清晰
状态变更:
- item-47 主矩阵:🟡 变体实现 → 🟡 增强中(PR#3512 合并后 → ✓ 完整)
- 追踪 PR 列:PR#3155 单独 → PR#3155 + PR#3512 组合
闭环加速观察(24h 内 2 次反馈循环):
| 时间 | 事件 |
|---|---|
| 2026-04-21 17:00 | 我在 2026-04-21 勘误中列出 item-47 的 4 个 Claude-style gap |
| 2026-04-22 07:32 UTC | wenshao 提交 PR#3512 精确覆盖 4/4 gap(距勘误 ~14 小时) |
对比 item-46 的闭环(PR#3508,31 小时):PR#3512 更快。规格文档 → PR 提交的延迟从 31h → 14h。
CI 状态(PR#3512 当前):Lint + CodeQL ✓ SUCCESS;Test (ubuntu/macos/windows × 3 版本) IN_PROGRESS/QUEUED。review 尚未提交。
合并后跟进:
- item-47 状态 🟡 → ✓ 完整(5/5 对齐 Claude + 1 处 Qwen 优势保留)
- 主矩阵 item-47 行补充 PR#3512 ✓ 标记
- 已合并 ✓ 67 → 68
- Bash Deep-Dive 第 2.2 节更新 Qwen 现状——从"设计差异大"到"对齐 Claude + 全工具覆盖"
2026-04-22(Fast Model 应用场景扩充 · 新增 6 项)
用户提问:"除了 follow-up suggestion/recap,Claude Code 还有哪些事情是用 fast model 来做的?" —— 触发对 Claude Code 全部 getSmallFastModel() + queryHaiku() 调用点的梳理。
发现:Claude Code 共 18 处独立 fast-model 调用,远超已知的 Recap 和 follow-up suggestion。按用途分 6 类:(1) 会话元信息生成 3 处 / (2) 语义搜索 2 处 / (3) Hook LLM 评估 3 处 / (4) 内容处理 5 处 / (5) 系统级查询 3 处 / (6) 实用功能 2 处。
新增 Deep-Dive:Fast Model 应用场景 Deep-Dive —— 完整 18 处调用点索引 + 6 条共同设计哲学 + Qwen Code 借鉴路线图。
新增 6 个追踪 item(p2-stability 49 → 55):
| # | 方向 | 优先级 | 成本 | 风险 |
|---|---|---|---|---|
| item-50 | 会话标题自动生成(3-7 词 sentence-case) | 🥇 | 1-1.5 天 | 低 |
| item-51 | 工具调用摘要(30 字符 commit-subject 风格) | 🥇 | 1 天 | 低 |
| item-52 | Hook LLM 条件评估(自然语言 if.condition) | 🥈 | 2 天 | 低 |
| item-53 | WebFetch 内容 LLM 清洗(去 nav/ads/tracker) | 🥈 | 1.5 天 | 低 |
| item-54 | Shell 命令前缀 LLM 提取(权限分类) | 🥉 | 2 天 + 大量测试 | ⚠️ 安全关键(需默认关闭 + 完整测试) |
| item-55 | Skill 改进建议(post-sampling hook,opt-in) | 🥉 | 1.5 天 | 中(opt-in) |
共同设计模式(所有 fast-model 调用共享):
thinkingConfig: { type: 'disabled' }—— 禁用 thinkingtools: []—— 禁用 tool use(多数情况)- 非流式
queryModelWithoutStreaming—— 减少 UI 渲染开销 outputFormat: { type: 'json_schema' }—— 结构化输出(Hook / title 类)ANTHROPIC_SMALL_FAST_MODELenv var 兜底 —— Bedrock/Vertex 自选- Vertex global / Bedrock with thinking 场景 fallback 到 Sonnet
总投入:~12-15 天覆盖 6 个最高 ROI 方向。
总项数:265 → 271(+6)。p2-stability 49 → 55。
2026-04-22(PR#3508 合并 · 闭环完成 🎉)
PR#3508 ✓ 2026-04-22 06:37:14 UTC 合并——"feat(cli): cap inline shell output with configurable line limit",reviewer tanzhenxin APPROVED。item-46 从 🟡 拆分实现中 → ✓ 完整实现。
完整闭环时间线(从规格补充到合并 ~31 小时):
| 时间 (UTC) | 事件 |
|---|---|
| 2026-04-20 深夜 | 添加 item-46/47 + Bash Deep-Dive,标注 5-line window 缺失 |
| 2026-04-21 09:00 | 扫描 PR#3155,标记 item-46 🟡 部分实现 |
| 2026-04-21 17:00 | 勘误 item-47 为 🟡 变体实现 |
| 2026-04-21 23:09 | wenshao 提交 PR#3508 commit 1(主实现:cap 流式 ANSI + setting + 4 测试) |
| 2026-04-21 23:24 | Commit 2:tmux 手动验证发现 gap,补齐完成态字符串路径 |
| 2026-04-22 06:13 | reviewer tanzhenxin 提交 COMMENTED review,两个非阻塞观察 |
| 2026-04-22 06:27 | Commit 3:修复 off-by-one + input validation + parameterized test |
| 2026-04-22 06:36 | tanzhenxin APPROVED |
| 2026-04-22 06:37 | MERGED(CI 大部分 SUCCESS,少数 IN_PROGRESS 未阻塞) |
3 个 commit 演化(工程实践典范):
- 主实现——cap 流式 ANSI +
ui.shellOutputMaxLinessetting + 4 单元测试 - tmux 手动验证发现 gap——完成态字符串路径(
StringResultRenderer也需 cap,因为shell.ts:returnDisplayMessage = result.output是 plain string) - Review 反馈修复:
- Off-by-one:
MaxSizedBox.tsx:147-150的visibleContentHeight = targetMaxHeight - 1导致 cap=5 时 ANSI 显示 5 行但 string 显示 4 行。修复:shellStringCapHeight = shellCapHeight + 1让两路径对齐到 N 可见内容行 - Input validation:负数/分数/NaN 边界。use-site guard
Math.max(0, Math.floor(rawShellCap || 0))——negatives → 0 → 禁用 / fractions → floor / 非数字 → 0
- Off-by-one:
Reviewer 观察的精妙之处:tanzhenxin 的第一条反馈不是"实现有 bug",而是**"off-by-one 如果不是 intentional 的话……"**。wenshao 在回复中承认——PR 描述里 "After" 示例的 4 行(lines 27-30)确实是 bug 而非 spec。这种"可能是 spec 也可能是 bug"的表达方式是 code review 的高水平体现。
超越 Claude Code 的设计亮点(最终定版):
| 特性 | Claude ShellProgressMessage | PR#3508 |
|---|---|---|
| 默认行数 | 硬编码 lines.slice(-5) | ui.shellOutputMaxLines: 5(settings dialog 可视化编辑) |
| bypass 机制 | 1 种(verbose mode) | 6 种(! 用户命令 / 确认等待 / 真实失败 / Ctrl+F focus / opt-out / 自定义值) |
| 覆盖面 | Streaming 流式 | Streaming + 完成态字符串渲染器(两路径 N 对齐) |
| 语义区分 | 无 | exit≠0 不触发 Error bypass——tool success ≠ command exit code |
| 输入鲁棒性 | 不涉及(硬编码) | 负数/分数/NaN 统一降级到 opt-out 语义 |
ANSI vs string 双路径对称性的细节:
- ANSI 路径:
AnsiOutputText内部 pre-slice 到 N 行 → MaxSizedBox 不触发 overflow banner → 显示 N 行 + 单独的ShellStatsBar - String 路径:直接传 raw content 给 MaxSizedBox → MaxSizedBox 自动截断 → 显示 N-1 行 + overflow banner
- 对齐方案:string 路径传
shellCapHeight + 1,让 banner 补偿正好抵消,两路径都显示 N 可见内容行
计数更新:
- 主矩阵 item-46:🟡 拆分实现中 → ✓ 完整实现
- 已合并 ✓ 66 → 67(+PR#3508)
- README 已合并 ✓ 66 → 67
后续:Bash Deep-Dive 第 2.1 节"Qwen Code 现状"应更新——不再是"整屏 PTY 30 行",而是"5 行窗口(可配)+ 6 bypasses,超越 Claude 原设计"。可考虑新增反向借鉴 item(Claude Code 可学习 PR#3508 的可配置 + 多 bypass + 语义分离)。
2026-04-22(反馈循环最快记录 · item-46 5-line window 由用户本人补齐)
PR#3508(2026-04-21 23:10 UTC 提交,OPEN)—— 作者 wenshao(即 codeagents 项目维护者本人)。
闭环链路:
- 2026-04-20 深夜——我添加 item-46 / item-47 / Bash Deep-Dive,明确"5 行窗口"缺失
- 2026-04-21 09:00——扫描 PR#3155,标记 item-46 为 🟡 部分实现(
+N lines有 / 5 行窗口缺) - 2026-04-21 17:00——用户追问 "结合 PR#3155 看 item-47",勘误 ✓ → 🟡 变体实现
- 2026-04-21 23:10 UTC——用户亲自提交 PR#3508,补齐 5 行窗口部分
PR#3508 设计亮点(超越 Claude Code 原设计):
| 特性 | Claude ShellProgressMessage | PR#3508 |
|---|---|---|
| 默认行数 | 硬编码 lines.slice(-5) | ui.shellOutputMaxLines: 5(settings dialog 可视化编辑) |
| bypass 机制 | 1 种(verbose mode) | 6 种(! 用户命令 / 确认等待 / 真实失败 / Ctrl+F focus / opt-out / 自定义值) |
| 覆盖面 | Streaming 流式 | Streaming + 完成态字符串渲染器(两处都裁剪) |
| 语义区分 | 无 | exit≠0 不算 tool failure——避免命令偶然失败导致整屏输出 |
设计决策的精妙(PR 原文):
A shell command exiting with non-zero status (e.g.
seq 1 30 && false,command not found) does not trigger the Error bypass — the tool itself succeeded, the spawned command failed. This is intentional: cap behavior stays consistent regardless of command exit code.
这是 Claude Code 原设计没有体现的语义分离——tool success ≠ command exit code。
状态变更:
- item-46 主矩阵:🟡 部分实现 → 🟡 拆分实现中(PR#3155 ✓
+N lines+ PR#3508 🟡 OPEN 5 行窗口,合并后 ✓ 完整) - item-46 的追踪 PR 列表:从 PR#3155 单独 → PR#3155 + PR#3508 组合
反馈链路观察:从规格补充到 PR 提交耗时约 24 小时——创纪录的闭环速度。项目的规格文档不仅描述现状,还在主动塑造实现方向。
PR#3508 合并后应跟进:
- 将 item-46 状态从 🟡 → ✓ 完整实现
- 更新 Bash Deep-Dive 第 2.1 节的"Qwen Code 现状"描述
- README 已合并 ✓ 66 → 67(+PR#3508)
- 考虑是否基于 PR#3508 的 6-bypass 模式,反向优化 Claude Code(可写入 update-tool-display-deep-dive 第 7 节)
2026-04-21(勘误 · PR#3155 与 item-47 的设计差异)
勘误动机:用户指出应"结合 PR#3155 仔细看 item-47"。经逐行对比 PR#3155 代码与 item-47 原规格,发现之前标记 "✓ 完整实现" 不准确——PR#3155 和 Claude Code 的 ShellTimeDisplay 功能等价但设计差异显著。
PR#3155 vs item-47 spec 5 处关键差异:
| 方面 | Claude ShellTimeDisplay | PR#3155 | 判断 |
|---|---|---|---|
| 起始可见性 | 始终可见 | 3s 阈值 | 设计哲学差异(连续反馈 vs 静默到慢才显示) |
| 格式 | (10.5s · timeout 30s) 组合单元 | 3s 独立 + timeout 3s 在 stats bar | 信息分散——Claude 的组合更紧凑 |
| 亚秒精度 | formatDuration hideTrailingZeros: true,支持 10.5s | 自定义 formatElapsed,仅整数秒 | PR 精度损失 |
| 位置 | 与 Running… 前缀内联 | 工具行右对齐独立 flex child | Claude 语义连贯 vs PR 状态行装饰 |
| 工具范围 | Shell only | 所有工具(覆盖更广) | PR 优势 |
状态变更:
- item-47 主矩阵:✓ 完整实现 → 🟡 变体实现(5 处差异明确列出)
- item-38 主矩阵:✓ 完整实现 → 🟡 部分实现(重要发现:PR#3155 覆盖墙钟/字节视觉反馈,未覆盖 Claude Code 的"语义化 progress events"——即
yield { type: 'progress', toolUseCount }类结构化进度 + "Installing packages 42/100" 类 stdout 解析) - item-46:保持 🟡 部分实现(之前就已正确标注)
补齐成本(若要做 Claude 风格):
- item-47 补齐:~1 天(在现有
ToolElapsedTime.tsx基础上增加组合格式选项 + Shell 专属 ShellProgressMessage 包装) - item-38 补齐(真正的 progress events):~3-5 天(core tool.execute 支持 yield + Shell stdout 解析器 + UI 语义映射)
反思:这次反馈循环教训——"功能等价" 不等于 "完整实现"。PR 合并后应该对比设计细节而非仅是功能名称。后续对 PR #3478/#3482/#3080 也需同样的精细比对。
2026-04-21(两日合并潮 · 项目史上反馈闭环最快的一次 🎯)
极其重要的 48 小时:我在 2026-04-20 晚间新增的 item-46/47(Bash 5 行窗口 + ShellTimeDisplay),被同一天上午已合并的 PR#3155 基本覆盖——这是文档补上标签的速度落后于实现速度的首次出现。
🎯 追踪 item 直接落地(6 个 item,覆盖度不等):
| PR | 合并时间 | 对应 item | 状态变更 |
|---|---|---|---|
| PR#3155 ✓ | 2026-04-20 08:04 UTC | item-38 工具执行进度消息 | 未实现 → ✓ 完整实现(3 合 1:elapsed + stats bar + OSC 9;4) |
| 同 PR#3155 | 同上 | item-47 ShellTimeDisplay | 刚加入追踪 → ✓ 完整实现(全工具右对齐 3s 阈值,覆盖面比 Claude Code 更广) |
| 同 PR#3155 | 同上 | item-46 "5 行窗口 + +N lines 计数" | 刚加入追踪 → 🟡 部分实现(+N lines 已实现,5 行窗口未实现) |
| PR#3478 ✓ | 2026-04-20 15:58 UTC | item-43 会话 Recap | ✓ 进一步打磨(/recap pin 到输入框上方 + fastModel 默认对齐) |
| PR#3482 ✓ | 2026-04-21 06:39 UTC | 同上 item-43 | ✓ 进一步打磨(rework rendering + blur threshold setting) |
| PR#3080 ✓ | 2026-04-21 14:08 UTC | item-21 CI 环境检测 | ✓ 部分实现(persistent retry mode for unattended CI/CD) |
⚠️ Revert:
- PR#3468 ✓ 2026-04-20 08:40 UTC — Revert "feat(core): add dynamic swarm worker tool"。PR#3433 昨日刚合的动态 swarm worker 今天被整体回滚。item-14 Coordinator/Swarm 主矩阵标记从 ✓ 改为 ⚠️ revert。
🆕 其他值得关注的合并(维护/新能力):
- PR#3467 ✓ 2026-04-20 10:56 UTC — 安全修复:防止格式不合法的 permission rule 退化为工具级 catch-all(权限系统 bug 防御)
- PR#3329 ✓ 2026-04-21 09:01 UTC —
display real-time token consumption during streaming (#2742)——对应 item-20/context的交互增强 - PR#3313 ✓ 2026-04-21 09:04 UTC —
recover from truncated tool calls via multi-turn continuation——截断工具调用的恢复机制 - PR#3229 ✓ 2026-04-21 03:44 UTC —
/stats按起源 subagent 分行归因 - PR#3469 ✓ 2026-04-21 07:53 UTC —
render markdown in generic and web-fetch tool outputs(WebUI) - PR#3398 ✓ 2026-04-21 14:20 UTC — VSCode OAuth → Coding Plan / API Key provider setup
- PR#3303 ✓ 2026-04-21 09:06 UTC — detect Zed.app on macOS
- PR#3451 ✓ 2026-04-20 07:22 UTC — Windows PATH normalization for MCP stdio servers
- PR#3458 ✓ 2026-04-21 13:47 UTC — OpenAI samplingParams pass-through
- PR#3283 ✓ 2026-04-20 06:34 UTC — slash command capability-based filtering(Phase 1)
- PR#3489 ✓ 2026-04-21 08:44 UTC — MCP OAuth URL clickable when wrapped
- PR#3394 ✓ 2026-04-21 21:31 UTC — arena comparison summary
⭐ 新开的重磅 PR:
- PR#3491(OPEN)—
feat: add /diff command and git diff statistics utility—— 新增/diff命令 + git diff 统计 - PR#3488(OPEN)—
feat(cli): background-agent UI — pill, combined dialog, detail view—— background agent UI,对应 PR#3076(显式 run_in_background)的 UI 侧 - PR#3471(OPEN)—
feat(core): model-facing agent control (task_stop, send_message, per-agent transcript)—— Agent 内部对 sub-agent 的控制能力 - PR#3507(OPEN)—
feat(cli): add sticky todo panel to app layouts—— sticky todo 面板,新 UI 方向 - PR#3505(OPEN)—
fix(core): reject truncated subagent write_file calls—— subagent 截断写入防护 - PR#3460(OPEN)—
feat(cli): auto-detect terminal theme ('auto' or unset)—— 对应 terminal theme 检测方向
📊 反馈循环观察:PR#3155 的存在证明 Qwen Code 团队在我写 item-46/47 规格时已经在做同样的事情——这是社区驱动优先级和独立工程推进的巧合共振。我的规格不是因果原因,但文档的存在帮助未来开发者理解 PR#3155 的设计空间。
计数更新:
- 已合并 ✓ 65 → 66(+PR#3155 覆盖 item-38+47,同时部分覆盖 item-46)
- 主矩阵 item-14 Coordinator/Swarm 状态:PR#3433 ✓ → ⚠️ revert(PR#3468)
- 主矩阵 item-38 状态:未实现 → ✓ 完整实现
- 主矩阵 item-47 状态:未实现 → ✓ 完整实现
- 主矩阵 item-46 状态:未实现 → 🟡 部分实现
- 主矩阵 item-43 Recap 继续累积合并:增 PR#3478 + PR#3482 两次打磨
- 主矩阵 item-21 CI 检测:PR#3080 ✓ persistent retry mode 补充
2026-04-20(深夜新增 2 项 · Update 工具展示)
用户提问:"Update 的展示区别也调查一下" —— 延续前两轮对 Bash / 高度控制的分析,覆盖 Edit / Write / MultiEdit 类工具的 UI 差异。
反直觉的发现:这个维度两边各有优势——与 Bash/高度控制不同:
- Claude Code 默认展示完整 diff(
FileEditToolUpdatedMessage.tsx:88-97) - Qwen Code WebUI 默认单行摘要(
EditToolCall.tsx:149-181),比 Claude 更紧凑 - Qwen Code CLI 中等,用
MaxSizedBox自适应高度 +═间隙符
新增 Deep-Dive:Update 工具展示 Deep-Dive —— 4 个场景对比(3 行小改 / 200 行大重构 / 500 行新文件 / string not found 失败),双向借鉴分析。
新增 2 个追踪 item(p2-stability 47 → 49):
- item-48 语义化 hunk 模型(消除双重 diff 序列化)——把
Diff.createPatch()字符串改为Diff.structuredPatch()的StructuredPatchHunk[],消除 UI 层parseDiffWithLineNumbers()62 行 regex(~50 行净改动,2-3 天)。⚠️ 勘误:singleHunk ? 100_000 : 3智能上下文只在 IDE 扩展useDiffInIDE.ts触发,不在终端 UI——不是本 item 的收益(之前误写) - item-49 多 hunk
...省略分隔符——参考StructuredDiffList.tsx用intersperse在 hunk 之间插入 dim color...(~30 行,0.5 天,依赖 item-48)
关键源码验证:
utils/diff.ts:9CONTEXT_LINES = 3utils/diff.ts:103context: singleHunk ? 100_000 : CONTEXT_LINES⭐ 智能上下文核心utils/diff.ts:81-114getPatchFromContents()返回StructuredPatchHunk[]components/StructuredDiffList.tsx:16-29完整intersperse+NoSelect+Text dimColor实现components/FileEditToolUpdatedMessage.tsx:62-110三种展示模式(preview hint / condensed / 默认完整 diff)- Qwen
packages/core/src/tools/edit.ts:308, 433Diff.createPatch()字符串 patch - Qwen
DiffRenderer.tsx:23-81parseDiffWithLineNumbers()regex re-parse
反向借鉴(Qwen → Claude 的亮点,写入 Deep-Dive 第 7 节):
- WebUI 默认单行摘要 + 展开交互(Claude 可作为用户选项)
═全宽横线 gap 折叠(Claude 的...仅 hunk 间,不处理 hunk 内大段无修改)
总项数:263 → 265(+2)。p2-stability 47 → 49。
2026-04-20(晚间新增 2 项 · Bash 任务展示)
用户提问:"Claude Code 展示 Bash 任务时和 Qwen Code 的差别是怎样的?" —— 触发对 Bash 工具 UI 差异的深度研究。
新增 Deep-Dive:Bash 任务展示 Deep-Dive —— 归纳两条完全不同的路线:
- Claude = 极简 + 时间轴:5 行窗口 +
+N lines计数 + elapsed/timeout 倒计时 - Qwen = 完整 + 数据维度:整屏 PTY 30 行 + 100ms 刷新 + 字节计数 + 二进制检测
4 个用户场景对比(find 5000 行 / npm install 2m / ls 错误 / 并行 20 工具),揭示 Qwen 在长任务时间维度和并行屏幕占用上的明显劣势。
新增 2 个追踪 item(p2-stability 45 → 47):
- item-46 Bash 执行中 "5 行窗口 +
+N lines计数" —— 复刻ShellProgressMessage的lines.slice(-5)+extraLines模式(~100 行,1-2 天,前置 item-44) - item-47
ShellTimeDisplay时间 + timeout 倒计时 —— 三种格式(timeout X)/(elapsed · timeout X)/(elapsed),dim color 显示(~80 行,1 天)
组合效果:item-44(MessageResponse + OffscreenFreeze)+ item-46(5 行 + 计数)+ item-47(时间显示)三项合并后,Qwen 的 Bash UI 达到与 Claude 相当的"紧凑 + 进度可见"效果。总投入 ~4-5 天。
关键源码验证:
components/shell/ShellProgressMessage.tsx:42-82确认lines.slice(-5)++${extraLines} lines/~${totalLines} lines双模式components/shell/ShellProgressMessage.tsx:65确认<MessageResponse><OffscreenFreeze>包裹(复用 item-44 基础设施)components/shell/ShellTimeDisplay.tsx完整 73 行,三种格式分支 L30/L52/L63 全部对应- Qwen
packages/core/src/services/shellExecutionService.ts:636确认RENDER_THROTTLE_MS = 100 - Qwen
shellExecutionService.ts:179-182确认二进制流检测MAX_SNIFF_SIZE = 4096(反向借鉴点:Claude 无此保护)
反向借鉴:Claude Code 可从 Qwen 学习二进制流检测,防止 cat /bin/ls / curl -o image.png 破坏终端渲染。
总项数:261 → 263(+2)。p2-stability 45 → 47。
2026-04-20(下午新增 2 项 · 任务显示高度控制)
用户提问:"Claude Code 的任务怎么控制显示高度,有哪些值得借鉴的?" —— 触发对 Claude Code UI 高度控制机制的深度研究。
新增 Deep-Dive:任务显示高度控制 Deep-Dive —— 归纳 Claude Code 的 4 条高度控制机制:
MessageResponse单行容器(height=1 overflowY=hidden)—— 所有瞬态消息压缩到 1 行OffscreenFreeze离屏冻结(useRef引用缓存 +useTerminalViewport)—— 历史 spinner 0 CPURatchet最小高度锁定 —— 滚动不抖动- 三级输出截断(Bash 30K / 单工具 50K / 单消息 200K)—— 防 context 爆炸
新增 2 个追踪 item(p2-stability 43 → 45):
- item-44 瞬态消息单行容器 + 离屏历史冻结 —— 复刻 MessageResponse + OffscreenFreeze 模式(~200 行,~3-4 天)
- item-45 三级输出截断 —— Bash 30K default / 150K upper + env var
QWEN_BASH_MAX_OUTPUT_LENGTH+ 单工具 50K 持久化 + 单消息 200K 批量预算(~250 行,~4 天,可拆 3 PR)
关键源码验证(/root/git/claude-code-leaked/):
components/MessageResponse.tsx:37确认<Box height={height} overflowY="hidden">components/OffscreenFreeze.tsx:23-42确认'use no memo'+useRef冻结components/design-system/Ratchet.tsx:38-65确认measureElement+setMinHeightutils/shell/outputLimits.ts:3-14确认BASH_MAX_OUTPUT_DEFAULT=30_000+UPPER_LIMIT=150_000constants/toolLimits.ts:13-56确认 6 个常量(DEFAULT_MAX_RESULT_SIZE_CHARS=50_000、MAX_TOOL_RESULTS_PER_MESSAGE_CHARS=200_000等)
总项数:260 → 261(+2,同时修正历史计数 1 处偏差)。p2-stability 43 → 45。
2026-04-20(清晨合并潮 🎉)
昨晚 item 规格 → 今晨直接合并——再次出现 "今天完整规格补充 → 次日合并实现" 的正反馈循环。
🎯 追踪 item 直接落地(1 个):
| PR | 合并时间 | 对应 item | 意义 |
|---|---|---|---|
| PR#3160 ✓ | 2026-04-20 03:09 UTC | p2-tools-commands item-21 PDF / 二进制文件读取 | 昨晚刚加入追踪(09:09 UTC 左右),6 小时后即合并——read_file 现已支持 PDF 文本提取 + Jupyter Notebook 解析。item-21 状态:🟡 追踪 → ✓ 部分实现(P0 + P2 完成,仅剩图片/Office 两项) |
🆕 新合并(3 个,维护/新能力但未在追踪 item 内):
- PR#3448 ✓ 2026-04-20 02:01 UTC —
feat(cli): add bare startup mode:新增--bare启动模式(CI/脚本专用),跳过 hooks/LSP/auto memory/skills/ambient extensions/MCP 等所有隐式启动发现,仅保留最小工具集read_file + edit + run_shell_command,也可通过QWEN_CODE_SIMPLE=1环境变量启用。对标 Claude Code 的--print/非交互模式。可考虑加入追踪 item(CI 场景启动优化新方向)。 - PR#3445 ✓ 2026-04-20 03:06 UTC —
feat(cli): add slashCommands.disabled setting to gate slash commands:新增slashCommands.disabled配置以禁用特定 slash 命令,是 item-26 /experimental 实验特性统一门控 思路的部分实现(gate 层已就位,但不是专门的 "experimental" 注册表)。 - PR#3450 ✓ 2026-04-20 02:01 UTC —
fix(vscode-ide-companion): preserve split stream message ordering(VSCode IDE companion 消息排序修复) - PR#2593 ✓ 2026-04-20 02:02 UTC —
feat(vscode-ide-companion): support /insight command(VSCode companion 支持/insight命令)
⭐ 新开的重磅 PR(1 个):
- PR#3455(🟡 OPEN,2026-04-20 02:25 UTC 创建)—
perf(filesearch): move @-picker crawl and fzf index to worker_threads:将@-picker 的递归文件爬取 + fzf 索引构建移出主线程到worker_threads,避免在大仓库(100k 文件)按@$ 时卡住 1–9 秒;同时引入 \text{ripgrep} 作为大仓库爬取后端(50\text{k}+ 文件下 3–4 \times 快于 $fdir),CLI 启动时 pre-warm 索引。这是对 p2-perf item-9 延迟初始化与按需加载 的强化实现(线程卸载 + ripgrep fast path)。
计数更新:已合并 ✓ 64 → 65(+PR#3160 覆盖追踪 item-21 的 P0+P2)。其他 4 个 PR(#3448/#3445/#3450/#2593)属于能力扩展或维护修复,暂不计入 "追踪 item 直接实现" 计数。
2026-04-19(勘误 + 追加)
勘误:用户指出 PR#2916(/context 非交互输出 + SDK API)早在 2026-04-13 就已合并,但主矩阵 item-20 行仅标注了 PR#3042 的 ✓,遗漏了 PR#2916 本身。现已补标:
- 主矩阵 item-20 行:PR#2916 → ✓
- p2-tools-ui item-20 详细页"进展"段落:
(open)→✓(2026-04-13 合并)
此 item 的两个 PR 均已合并:
追踪合并数:63 → 64(+PR#2916)。
2026-04-19(晚间追加 · PDF/Notebook 支持 PR#3160)
用户指出:p2-tools-commands item-21 PDF / 二进制文件读取 应该跟踪 PR#3160(feat(core): PDF text extraction fallback and Jupyter notebook parsing)——此 PR 为 read_file 增加 PDF 文本提取 fallback + .ipynb Notebook 解析支持,合并后可直接覆盖 item-21 的 P0(PDF)+ P2(Notebook)两个目标。
已更新:
- 主矩阵 item-21 行:追踪 PR 列补充 PR#3160 🟡(OPEN),并将历史引用 PR#2024(拒绝 PDF)标记为 ✓ 合并
- p2-tools-commands.md item-21:新增 "追踪中的 PR" 小节 + 在修改方向中标注 PR#3160 正在推进 P0/P2 目标
勘误:此前主矩阵只标了 PR#2024 但未在该 PR 后打 ✓ 标记(该 PR 2026-03-15 已合并,拒绝 PDF 以防 session 污染)。现已补 ✓。
待关注:PR#3160 合并后需回头将 item-21 状态更新为"部分实现"——覆盖 PDF + Notebook,仅剩图片支持 + DOCX/XLSX/PPTX 两项尚未覆盖。
2026-04-19(凌晨大合并潮 🎉)
极其重要的一天 —— 一夜之间 多个长期追踪的 item 同时落地,包括我昨天刚刚充实的 item-43 Session Recap!
🎯 追踪 item 直接实现(6 个):
| PR | 合并时间 | 对应 item | 意义 |
|---|---|---|---|
| PR#3434 ✓ | 13:38 UTC | p2-stability item-43 会话 Recap | 我昨天刚刚完整补充了 item-43 的版本/UI/Prompt 工程细节,今天就实现了! |
| PR#3383 ✓ | 03:12 UTC | p2-tools-commands item-25 Refresh Interval Statusline | refreshInterval 落地 |
| PR#3404 ✓ | 11:25 UTC | /doctor 诊断命令(对标 Claude Code) | 系统诊断命令(预期加入矩阵) |
| PR#3236 ✓ | 10:06 UTC | 增强 loop detection(含 PR#3178 stop directive) | 循环检测完整版 |
| PR#3433 ✓ | 06:47 UTC | p0-p1-engine item-14 Coordinator/Swarm | 动态 swarm worker 工具 |
| PR#3375 ✓ | 01:45 UTC | CI 治理 | 60+30 stale 策略正式合并(之前 item-42 note 里提到) |
🆕 追踪 item 未覆盖的新合并(7 个,维护/改进):
- PR#2734 ✓ 12:17 UTC —
add Markdown for Agents support to WebFetch tool - PR#2857 ✓ 07:42 UTC —
constrain shell output width to prevent box overflow - PR#2766 ✓ 07:25 UTC —
display ">100%" when context usage exceeds limit - PR#3431 ✓ 06:59 UTC —
/clear dismisses /btw side-question dialog - PR#3429 ✓ 07:06 UTC —
/btw use live conversation context - PR#3436 ✓ 06:25 UTC —
support older Git during repository initialization - PR#3438 ✓ 09:28 UTC —
remove abort listener during cleanup - PR#2551 ✓ 12:45 UTC —
enable Plan Mode toggle and approval UI(VSCode)
⭐ 新开 PR(重磅):
- PR#3441(open)—
add conversation rewind feature with double-ESC and /rewind command—— 对标 Claude Code 的/rewind命令! 这是 p2-tools-ui item-5 /rewind 检查点回退 的直接实现。 - PR#3445 —
slashCommands.disabled setting to gate slash commands(slash 命令禁用配置) - PR#3442 — OAuth redirect URI 支持 MCP add
- PR#3439 —
render LaTeX math in markdown output
📊 闭环奇迹观察:PR#3434 Recap 的实现直接受益于昨日 item-43 的完整规格补充——包括版本时间线、UI rendering(dimColor + REFERENCE_MARK)、Prompt 工程要点(禁止 status reports/commit recaps)等。这是 codeagents 项目首次出现**"今天丰富 item 规格 → 明天 Qwen Code 合并实现"** 的正反馈循环。
计数更新:已合并 ✓ 57 → 63(+PR#3434、+PR#3383、+PR#3404、+PR#3236、+PR#3433、+PR#3429 等 6 个追踪项)。
2026-04-18(晚间第三次补更)
自下午扫描(17:00 UTC)至晚间(19:30 UTC),qwen-code 合并节奏显著放缓——仅 1 个维护性 PR:
- PR#3237 ✓ 19:14 UTC —
fix(build): invoke tsx directly via node --import instead of npx(构建工具链优化,减少 npx 间接层)
新开 PR(观察):
- PR#3429 ✓(2026-04-19 合并)—
fix(cli): let /btw use live conversation context(/btw侧问题的上下文修复)
观察:合并节奏从全天 15+ PR 的高峰回落到单一维护性合并,符合发布前清理收尾的典型模式。结合 PR#3298 bumped version to 0.14.5(昨日合并),推测新版本即将发布。
计数:已合并 ✓ 57(不变,PR#3237 是维护性合并不计入矩阵追踪)。
2026-04-18(下午第二次补更)
继续扫描 qwen-code PR(updated > 上午 05:00 UTC):
追踪范围内的合并(1 个):
- PR#3319 ✓ 2026-04-18 16:40 UTC —
feat(cli): add early input capture to prevent keystroke loss during startup。补齐 item-8 启动优化 双支柱的下半段(early input),preconnect 部分 PR#3318 仍 open。item-8 的早期输入捕获能力已落地。
维护性合并(5 个,无对应矩阵 item):
- PR#3393 ✓ 12:22 UTC —
feat(mcp): add OSC 52 copy hotkey for OAuth authorization URL(改善 remote/SSH 场景复制 OAuth URL 体验) - PR#3416 ✓ 10:11 UTC —
wait for dual output stream shutdown(PR#3352 sidecar mode 的后续修复) - PR#3415 ✓ 05:46 UTC —
update scheduler registry mock(测试稳定性) - PR#2590 ✓ 15:39 UTC —
feat(vscode-ide-companion): add dedicated agent execution display(VSCode IDE 集成增强) - PR#2550 ✓ 15:43 UTC —
perf(vscode): fix input lag in long conversations(VSCode 长会话性能)
批量 Stale 关闭(~11 个 PR 在 09:21 UTC 同时关闭):
PR#3375 的 stale 策略(60+30 天)生效后,清理了长期无活动的 PR:PR#2357(Node SEA binary)、PR#2509(anthropic thinking budget)、PR#2568-2585(一批 2026 年 2-3 月的 core 改进 PR)等。这是 qwen-code 项目治理成熟化的标志——非关闭 = 放弃,而是路线调整,部分方向已被后续更好的 PR 替代。
新开 PR(观察):
- PR#3428 —
fix(cli): dismiss /btw side-question dialog on /clear(/btw UX)
计数更新:已合并 ✓ 56 → 57(+PR#3319 追踪;其他 5 个是维护性合并不计入矩阵跟踪计数;批量 stale 关闭不影响追踪计数,因为那些都不在本报告追踪列表中)。
2026-04-18(次日清晨补更)
夜间到清晨 qwen-code 又合并了大量 PR:
追踪范围内的合并(4 个之前已纳入观察的 PR):
- PR#3178 ✓ 2026-04-18 02:24 UTC —
detect tool validation retry loops and inject stop directive(循环检测增强,防止 schema 验证失败时模型无限重试) - PR#3297 ✓ 2026-04-18 02:31 UTC —
tool-registry: add lazy factory registration with inflight concurrency dedup(工具注册表性能优化:懒加载工厂 + 并发去重) - PR#3381 ✓ 2026-04-18 00:02 UTC —
reduce terminal redraw cursor movement(终端重绘性能) - PR#3407 ✓ 2026-04-18 02:03 UTC —
auto-submit on number key press in AskUserQuestionDialog
维护性合并(11 个,无对应矩阵 item,仅记录):
- PR#2962 ✓ sandbox 镜像名 'latest' tag fallback
- PR#2963 ✓ JSON schema "undefined Options" fix
- PR#2964 ✓ clean script duplicate rmSync
- PR#2966 ✓ integration tests stdinDoesNotEnd
- PR#2969 ✓ text-buffer offset-to-position 统一
- PR#2970 ✓ weixin PNG magic 4-byte 检查
- PR#2975 ✓ 重新连接 AcpBridge listener
- PR#2977 ✓ dingtalk 续传后缀 '(cont.)' 仅在续段
- PR#2978 ✓ dingtalk @mention 后保留空文本
- PR#2979 ✓ dingtalk reactionContext 内存泄漏
- PR#2981 ✓ SDK Stream.return() promise hang
计数:已合并 ✓ 52 → 56(仅追踪 4 个匹配 item 的合并;维护性的 11 个不计入矩阵跟踪计数)。
观察:今天上午(UTC 时间)单一时间窗口内有 15+ PR 合并,表明 qwen-code 在做发布前的批量清理(推测下一个 release 即将发布)。channels/dingtalk 4 连续修复(PR#2977/2978/2979 + PR#2980 待合并)说明国内 IM 渠道质量在快速打磨。
2026-04-17(晚间第三次补更)
继续扫描 qwen-code PR(updated > 今早):
新合并 PR(4 个):
- PR#3076 ✓ 2026-04-17 10:23 UTC —
background subagents with headless and SDK support。这是 Agent tool 的显式run_in_background: true参数真实落地!之前作为 item-22 自动后台化伪需求删除时,我已明确此 PR 是"真正的正规路径"——今天合并印证了判断。 - PR#3339 ✓ 2026-04-17 14:05 UTC —
.qwen/rules/路径规则(已在上一轮更新中标注) - PR#3352 ✓ 2026-04-17 18:19 UTC —
dual-output sidecar mode for TUI(新颖 UX) - PR#3358 ✓ 2026-04-17 22:43 UTC —
bind M-d to Emacs-like default(输入 UX 微优化) - PR#3402 ✓ 2026-04-17 14:57 UTC —
match new cron notification format in interactive tests(测试修复)
新开 PR(未追踪,观察):
- PR#3407 ✓(2026-04-18 合并)—
auto-submit on number key press in AskUserQuestionDialog(UX 微优化) - PR#3404 ✓(2026-04-19 合并)—
/doctor诊断命令(对标 Claude Code 的/doctor),Qwen Code 加了一个常用的诊断命令 - PR#3398 — vscode OAuth → Coding Plan/API Key(重要 provider 策略调整)
- PR#3394 —
feat(arena): add comparison summary for agent results - PR#3393 ✓(2026-04-18 合并)—
feat(mcp): add OSC 52 copy hotkey for OAuth authorization URL - PR#3381 ✓(2026-04-18 合并)—
reduce terminal redraw cursor movement(性能微优化)
计数更新:已合并 ✓ 48 → 52(+PR#3076、+PR#3352、+PR#3358、+PR#3402)。
2026-04-17(qwen-code PR 状态全量刷新)
全量扫描 qwen-code PRs updated:>=2026-04-16,发现多项合并:
⚠️ 勘误:用户指出 PR#2827 HTTP Hook + Function Hook + Async Hook 也已于 2026-04-16 合并,但本轮更新最初漏标为 ✓。已补标:
- 主矩阵 item-3 HTTP Hooks 行标 ✓
p0-p1-platform.mditem-3 改写为 ✅ 已实现(反超 Claude Code) —— Qwen Code 实现 4 种 Hook 类型(command / http / function / async) + SSRF 防护,超过 Claude Code 的 2 种(command / http)
🔥 重大合并:PR#3087 Auto-Memory + Auto-Dream 已合并
- PR#3087 ✓ 2026-04-16 合并(LaZzyMan)— 实现完整的
managed auto-memory + auto-dream系统 - 这是 item-4 会话记忆 + item-5 Auto Dream 两个 P1 item 的同时实现!
- 同时是 item-14 Nudge 驱动的闭环学习 的部分覆盖(仍缺 ① 双计数器 ② 冻结快照 ③ 保守 review prompt 三个关键要素)
- 全部标记为 ✓
新合并 PR(共 10+ 个):
- PR#3079 ✓
/batch skill for parallel batch operations(对应 item/batch并行操作) - PR#3100 ✓
optimize compact mode UX - PR#3248 ✓
add complete hooks support for ACP integration - PR#3255 ✓
move fork subagent params from execute() to construction time(item-2 Fork Subagent 重构) - PR#3311 ✓
support multi-line status line output - PR#3379 ✓
headless support and SDK task events for background agents - PR#3315 ✓
strip thinking blocks from history on model switch - PR#3320 ✓
limit skill watcher depth to prevent FD exhaustion - PR#3327 ✓
add shell argument quoting guidance to prevent special char errors - PR#3321 ✓
defer update notifications until model response completes - PR#3308 ✓
remember "Start new chat session" until summary changes - PR#3310 ✓
prevent statusline spawn EBADF from crashing CLI - PR#3295 ✓
avoid leaking process exit listeners in ProcessTransport - PR#3270 ✓
ignore literal Tab input - PR#3322 ✓
stabilize glob truncation tests - PR#3325 ✓ docs update for OAuth discontinuation
- PR#3252 ✓ Windows install docs fix
新开 PR 并对接现有 item:
- PR#3383(open)—
support refreshInterval in statusLine for periodic refresh—— 直接实现我昨天新增的 item-25 Refresh Interval Statusline!已挂到该 item 的进展列 - PR#3339 ✓(2026-04-17 合并,tanzhenxin)—
add path-based context rule injection from .qwen/rules/—— 实现 p0-p1-core item-9 指令条件规则!长期等待的功能落地 - PR#3318(open)preconnect + PR#3319 ✓(2026-04-18 16:40 UTC 合并)early input — 启动优化拆分为两个独立 PR,原 PR#3085 已关闭被替代
新 hook 类型 PR(暂不单独追踪,归入 hook 系统扩展):
- PR#3388(open)—
add prompt hook type with LLM evaluation support(延续 PR#2990 关闭后的方向) - PR#3378(open)—
Add TodoCreated and TodoCompleted hooks
其他观察到的新开 PR:
- PR#3352 ✓(2026-04-17 合并)—
dual-output sidecar mode for TUI(新颖 UX 方向) - PR#3329 — real-time token consumption display(UI polish)
- PR#3377 — slash command multi-mode expansion Phase 2(延续 PR#3283)
- PR#3377 — slash command Phase 2
关闭的 PR(不作为伪需求,只是路线调整):
- PR#3085(startup optimization)被 PR#3318 + PR#3319 替代
- PR#2990(prompt hook LLM condition)被 PR#3388 替代
- PR#3261(/history command)— closed
- PR#3258、PR#2760、PR#3082 — 各类关闭
计数变化:追踪 PR 49 → 52(+PR#3318、+PR#3319、+PR#3339、+PR#3383;-PR#3085 关闭),已合并 ✓ 28 → 48(本轮 +18 merged,主要是 Claude Code/AgentScope 等项目的长期打磨成果;晚间补 PR#3339 ✓ 于 2026-04-17 14:05 UTC 合并)。
2026-04-17(Copilot CLI 0.0.381 → 0.0.402 更新扫描)
扫描 GitHub Copilot CLI v0.0.381 到 v0.0.402 的 changelog.json(22 个版本,来自 @github/copilot@0.0.403 本地 npm 包 + github/copilot-cli GitHub 仓库 releases),识别 Qwen Code 可借鉴的新能力。本次排除了已被 Qwen Code 覆盖的特性(如 /review、/resume、/yolo、plan mode、shell parallel、MCP OAuth)。
新增追踪(4 项):
| # | 功能 | Copilot CLI 版本 | 审查 |
|---|---|---|---|
| p2-tools-commands item-26 | /experimental 实验特性统一门控 | v0.0.396 | ✅ Copilot 提供了统一注册表,优于 Qwen 目前 env var/settings 分散配置 |
| p2-perf item-35 | 自定义指令文件 SHA-256 去重 | v0.0.394 | ✅ 零风险 context 节约 |
| p2-tools-ui item-21 | 大粘贴内容自动存到工作区文件(>30KB) | v0.0.397 | ✅ 具体 UX 痛点修复 |
| p3-features item-17 | --config-dir CLI flag | v0.0.382 | ✅ CI/多租户场景原生支持,补 PR#2953 QWEN_HOME env var |
观察到但不追踪(Qwen Code 已覆盖或不适用):
| Copilot 新特性 | 不追踪原因 |
|---|---|
| Autopilot mode(v0.0.400, experimental) | Anthropic/Claude Code 已有 Auto mode,qwen-code /loop 类似方向 |
/review(v0.0.388) | Qwen Code 已有(PR#2932 等,见 platform item-2) |
/resume(v0.0.386)、/yolo(v0.0.381)、/init(v0.0.396)、/rename(v0.0.392) | Qwen Code 已有 |
| OAuth MCP(v0.0.389)、MCP 插件分发(v0.0.389) | Qwen Code MCP 基础已有 |
/delegate / & 前缀后台(v0.0.384/v0.0.394) | Qwen Code 已有 PR#3076 ✓(2026-04-17 合并)background subagents |
/diff + Esc-Esc 回退(v0.0.395/v0.0.399) | 重叠 p2-core item-10 文件历史快照 + PR#3292 session rewind |
| LSP 工具(v0.0.399, experimental) | Qwen Code LSP 已 7,422 行(见 opencode 对比 item-16) |
| 移除捆绑 LSP(v0.0.400) | Qwen 方向相反:PR#3170 正在加强 LSP,Copilot 的这个决策不适合借鉴 |
| Extended thinking for Claude(v0.0.384) | Provider 特定功能 |
| MSI installer(v0.0.389) | 安装器工具链,非核心能力 |
排除(伪需求审查):
- Copilot CLI changelog 中未发现明显 gated 特性(相比 Claude Code 的
tengu_*或USER_TYPE === 'ant'模式) - 大部分新特性是直接可用的 stable 功能,Copilot CLI 的门控方式更宽松(
/experimental主动 opt-in)
有趣的反向观察(Copilot 做了 Qwen/Claude 没做的减法):
- v0.0.400 移除捆绑 LSP servers(TypeScript、Python)—— 从"大而全"改为"按需外部调用"。值得注意的是 Qwen Code/Claude Code 都在加强 LSP(Qwen Code LSP 7,422 行 vs Copilot 移除)。这是架构哲学差异,不必盲目跟随。
总项数:256 → 260(+4),p2-tools-commands 25→26,p2-perf 34→35,p2-tools-ui 20→21,p3-features 16→17。
2026-04-17(Claude Code 2.1.82 → 2.1.112 更新扫描)
扫描 Claude Code v2.1.82 到 v2.1.112 的 CHANGELOG(30 个版本,涵盖 2 月时间窗口),识别 Qwen Code 可借鉴的新能力。系统性地检查每个新特性的源码门控(避免 item-22/item-20 那样的伪需求),已验证 5 项值得追踪 + 1 项排除:
新增追踪(5 项,各 item 含 ⚠️ 伪需求审查结果):
| # | 功能 | 优先级 | Claude Code 来源 | 审查 |
|---|---|---|---|---|
| p2-tools-commands item-23 | PreCompact Hook(压缩前钩子) | P2 | v2.1.105 commands/compact/compact.ts executePreCompactHooks() | ✅ 真实能力,与现有 PostCompact 对称 |
| p2-tools-commands item-24 | 模型通过 Skill 工具调用内置 Slash 命令 | P2 | v2.1.108 "The model can now discover and invoke built-in slash commands like /init, /review, and /security-review via the Skill tool" | ✅ 真实能力 |
| p2-tools-commands item-25 | Statusline Refresh Interval | P3 | v2.1.97 refreshInterval setting | ✅ 真实能力,扩展 PR#2923 |
| p2-stability item-42 | 子进程 PID 命名空间沙箱 + 脚本次数限制 | P2 | v2.1.98 CLAUDE_CODE_SUBPROCESS_ENV_SCRUB + CLAUDE_CODE_SCRIPT_CAPS | ✅ 真实能力(env var 控制不是 gate) |
| p2-stability item-43 | 会话 Recap(返回时上下文摘要) | P2 | v2.1.108 /recap + v2.1.110 auto-show; services/awaySummary.ts | ✅ 真实能力 |
排除(1 项,伪需求审查发现):
/ultrareview(v2.1.111)— "cloud parallel multi-agent review"。源码commands/review/ultrareviewEnabled.ts:13验证是tengu_review_bughunter_config.enabled === true门控(GrowthBook feature flag,默认 false)。当前是实验性功能对外不可用——同 item-22/item-20 一类伪需求,不作为 Qwen Code 改进目标。
观察到但暂不追踪(合理理由):
| 新功能 | 为何不追踪 |
|---|---|
/effort slider + xhigh 等级(v2.1.111) | Anthropic Opus 4.7 specific,不适用于多 provider 的 Qwen Code |
| PowerShell tool(v2.1.111) | 平台特定(Windows),Bash 工具已覆盖多数场景 |
| Auto mode(v2.1.111) | Anthropic Max 订阅专属,模型特定 |
/tui fullscreen(v2.1.110) | 已有 PR#3013 SlicingMaxSizedBox 追踪防闪烁 |
/focus command(v2.1.110) | 可合并到现有 UI 相关 item 作为增强 |
/team-onboarding(v2.1.101) | 较专一的用例(团队协作),低优先级 |
| OS CA cert 默认信任(v2.1.101) | 已被 p2-core item-19 企业代理覆盖 |
/powerup 交互式教程(v2.1.90) | UX 糖衣,不是核心能力 |
| PID namespace (v2.1.98) | ✅ 已追踪(item-42) |
WebFetch strip <style>/<script>(v2.1.105) | 微优化,可合并到 Web 工具文档 |
| Skill description cap 1536(v2.1.105) | 已有 Skill 相关 items 可合并 |
Plugin bin/ executables(v2.1.91) | 已有 plugin 相关 item(OpenCode 对比中) |
| Session memory auto-discovery + auto-dream | 已追踪(item-4 / item-5 / PR#3087) |
总项数:251 → 256(+5),p2-tools-commands 22→25,p2-stability 41→43。
审查规则强化:Claude Code 2.1.82→2.1.112 的 CHANGELOG 是未来每次版本升级都该做的例行审查源——新能力可能是真实功能或gated 伪需求,必须逐项检查源码门控(tengu_* GrowthBook flag / USER_TYPE === 'ant' / CLAUDE_CODE_EXPERIMENTAL_* 等)才能判断。
2026-04-16(伪需求删除:ConfigTool)
用户质疑 p2-core item-20 ConfigTool 必要性,经源码验证发现这是一个 Anthropic 内部专属工具,对外部 Claude Code 用户完全不可见。
源码证据 /root/git/claude-code-leaked/tools.ts:214-215:
...(process.env.USER_TYPE === 'ant' ? [ConfigTool] : []),
...(process.env.USER_TYPE === 'ant' ? [TungstenTool] : []),
USER_TYPE === 'ant' 表示 Anthropic 内部员工——只有在此条件下 ConfigTool / TungstenTool / REPLTool 才会被注册到工具列表。所有公开 Claude Code 用户从未访问过 ConfigTool。
结论:这是比 item-22 auto-background 更严重的伪需求:
- item-22 是 GrowthBook flag 默认关闭但可开启
- item-20 是硬编码的
USER_TYPE === 'ant'gate——没有外部启用路径
作者行为佐证:PR#2911 由 wenshao 提交后自己关闭,很可能在实现中发现该能力对外部用户无意义。Agent 需要读写配置可以直接用 Read/Write 工具读 settings.json,无需独立的 ConfigTool 抽象。
变更:
- p2-core item-20 ConfigTool 删除
- p2-core items 21-27 重编号为 20-26(终端主题检测、队列输入编辑、状态栏紧凑布局、会话标签与搜索、Plan 状态机化、A2A、OTel)
- 主矩阵删除 ConfigTool 行,更新所有
#item-N链接 - 子报告表 p2-core 27 → 26,总项数 252 → 251
- Changelog 记录 + 指向
tools.ts:214-215源码证据
强化的审查规则(加入审计清单):
5. 是否有
USER_TYPE === 'ant'条件注册? 这比 GrowthBook flag 更封闭——是"Anthropic 内部专属"的硬编码 gate。任何此类工具都不应进入外部对标矩阵(TungstenTool / REPLTool 同理)。
查同类工具:tools.ts 中其他 USER_TYPE === 'ant' 条件注册的工具有 TungstenTool(Anthropic 内部实验工具,性质不明)和 REPLTool(Python REPL,内部专属)。这两个都不在改进报告中,确认保持不追踪。
2026-04-16(PR 状态全面刷新)
全量扫描 qwen-code PRs updated:>=2026-04-14,发现多项状态变化:
1. 重大更新:Fork Subagent 已合并
- PR#2936 ✓ 合并于 2026-04-14(tanzhenxin 提交)—
feat(core): implement fork subagent for context sharing - 这是 P0 item-2 Fork Subagent 的主实现 PR,标记所有引用为 ✓
- P0 级别的核心能力落地:子代理继承完整对话上下文 + 共享 prompt cache 省 80%+ 费用
2. 勘误:PR#2380 之前错标为 merged
- 2026-04-14 的 "2026-04-14(晚间更新)" changelog 条目写"[#2380] 全部已合并"不准确
gh pr view 2380实际状态:CLOSED(未合并)- 已修正
p0-p1-platform.mditem-2 的 PR 表格标注 + 主 changelog 对应段落 - /review skill 的 4 个合并 PR 是 #2348 / #2376 / #2687 / #2932,不包括 #2380
3. 状态纠正:3 个曾标注 open 的 PR 现已 CLOSED
- PR#3022
/branch 会话分支→ CLOSED(未合并)。由 PR#3292feat(cli): add session rewind and restore flows(open)跟进(合并 /branch + /rewind 两个方向) - PR#2911
ConfigTool→ CLOSED(未合并,wenshao 自己提交后关闭) - PR#2866 upstream backports → CLOSED(从未纳入追踪,观察记录)
4. 新合并 PR(其他维护项)
- PR#2984 ✓ —
feat(vscode-ide-companion): add /account for account display - PR#3191 ✓ —
feat(acp): LLM-based message rewrite middleware with custom prompts(此前已在 04-15 changelog 记录) - PR#3212 ✓ —
fix(core): respect custom Gemini baseUrl from modelProviders - PR#3251 ✓ —
fix(core): allow thought-only responses in GeminiChat stream validation - PR#3257 ✓ —
fix(cli): make /bug easier to open in terminals without hyperlink support - PR#3270 ✓ —
fix(cli): ignore literal Tab input in BaseTextInput - PR#3294 ✓ —
fix(channels/dingtalk): prioritize senderStaffId over senderId for allowedUsers matching - PR#3298 ✓ —
chore(release): bump version to 0.14.5 - PR#3299 ✓ —
fix(cli): block discontinued qwen-oauth model selection in ModelDialog
5. 政策变更(值得留意)
- PR#3291 ✓ —
feat(auth): discontinue Qwen OAuth free tier (2026-04-15 cutoff)——Qwen OAuth 免费层已于 2026-04-15 终止。Qwen Code 文档的"免费层"描述(README / SUMMARY / pricing.md 等)可能需要相应更新,但这是文档维护任务,不影响改进矩阵 - PR#3217 ✓(2026-04-13)— docs 更新 quota 耗尽后替代方案(OpenRouter/Fireworks),配套政策变更
6. 新开 PR(观察中,暂不追踪)
- PR#3292 — session rewind and restore flows(顶替已关闭的 #3022 /branch + #3013 /rewind 方向)
- PR#3303 — 检测 macOS 上不在 PATH 的 Zed.app
- PR#3297 ✓(2026-04-18 合并)— tool registry lazy factory with concurrency dedup
- PR#3295 — SDK ProcessTransport exit listener leak 修复
计数变化:
- 追踪 PR:49 → 49(新增 PR#3292 顶替已关闭的 PR#3022,计数抵消)
- 已合并 ✓:27 → 28(+PR#2936 Fork Subagent 核心合并)
- 已关闭 ✗:2 → 5(+PR#3022、+PR#2911、+PR#2380 勘误)
2026-04-15(伪需求审计 + 实验性功能警告)
用户指出 p2-core item-22 自动后台化 Agent 可能是伪需求。经源码验证 /root/git/claude-code-leaked/tools/AgentTool/AgentTool.tsx:72-78:
function getAutoBackgroundMs(): number {
if (isEnvTruthy(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) ||
getFeatureValue_CACHED_MAY_BE_STALE('tengu_auto_background_agents', false)) {
return 120_000;
}
return 0; // disabled by default
}
确认为伪需求:Claude Code 此功能默认禁用,仅在 CLAUDE_AUTO_BACKGROUND_TASKS 环境变量 或 GrowthBook feature flag tengu_auto_background_agents 被启用时才生效(两者默认均关闭)。绝大多数 Claude Code 用户从未体验过此功能。把 feature-gated 实验能力描述为"核心能力"会误导 Qwen Code 开发者投入低 ROI 工作。
正确的方向是显式 run_in_background: true——已在 Agent tool schema 中作为 first-class 参数,也是 Qwen Code PR#3076 ✓(2026-04-17 合并)的真实需求,已落地。
用户追加要求: "同时仔细检查其他的建议,避免误导开发者投入" —— 系统性审计 /root/git/claude-code-leaked 中所有 GrowthBook gates (tengu_*) 和 env var gates (CLAUDE_CODE_EXPERIMENTAL_*),交叉对比改进报告。
审计决策(每个发现都人工验证源码后):
| item | 审计结论 | 动作 |
|---|---|---|
| p2-core item-22 自动后台化 Agent | 伪需求(tengu_auto_background_agents default false) | 删除(后续 items 23-28 重编号为 22-27) |
| p2-core item-6 Computer Use | 真实功能但 默认禁用(tengu_malort_pedway gate + Max/Pro 订阅双重门控) | 保留 + ⚠️ 实验性警告,建议降级 P3 |
| p2-core item-11 Deep Link | 真实功能但 默认禁用(tengu_lodestone_enabled gate,utils/deepLink/registerProtocol.ts:302) | 保留 + ⚠️ 实验性警告,建议降级 P3 |
| p0-p1-core item-4 Session Memory | Explore 建议删除 — 拒绝。源码验证 services/SessionMemory/sessionMemory.ts 真实存在,被 skills/bundled/skillify.ts:180 和 commands/compact/compact.ts:58-79 引用 | 保留 |
| p0-p1-core item-5 Auto Dream | Explore 建议删除 — 拒绝。services/autoDream/autoDream.ts 真实存在,executeAutoDream 被 query/stopHooks.ts:52 调用,ConfigTool.autoDreamEnabled 配置项存在,components/memory/MemoryFileSelector.tsx:163 和 FeedbackSurvey/usePostCompactSurvey.tsx:179-194 使用 | 保留(也是 PR#3087 的正确 backport 目标) |
| p0-p1-engine item-14 Coordinator/Swarm + item-25 Task Management | 已有"Agent Team 实验性功能"注释,补充源码引用:utils/agentSwarmsEnabled.ts:21-32 显示 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 env var 开启 | 扩展注释,非删除 |
关键修正:Explore agent 的初次建议包含了两个高影响错误(建议删除 item-4/5),经我直接 grep 验证后驳回。这说明对 audit 结果必须逐项核对源码,不能盲信 agent 输出。
最终变更:
- p2-core item-22 删除,items 23→22, 24→23, 25→24, 26→25, 27→26, 28→27 重编号
- p2-core item-6 Computer Use + item-11 Deep Link 添加 ⚠️ 实验性功能警告 段落(引用具体 gate 名和源文件行号)
- 主矩阵对应行状态列追加 ⚠️ 标记
- p0-p1-engine Coordinator/Swarm 实验性注释补充
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS源码引用 - 主矩阵 p2-core 链接全部更新(
#item-23→#item-22等) - 子报告表 p2-core 28 → 27,总项数 253 → 252
验证:子报告合 14+9+27+27+22+20+34+41+16+9+33 = 252 ✓,主矩阵 grep -c '^| \*\*P[0-3]\*\*' = 252 ✓
对开发者的建议:未来追踪 Claude Code 新功能进入改进矩阵前,必须验证源码 —— 不能只看文档/截图/PR 描述。检查点:
- 该功能是否有
getFeatureValue_CACHED_MAY_BE_STALE('tengu_*', false)调用? - 该功能是否需要
CLAUDE_CODE_EXPERIMENTAL_*或CLAUDE_*环境变量? is*Enabled()/get*Ms()等 guard 函数的默认返回值是什么?- 该功能是否要求特定订阅等级(Max/Pro)?
有任一"是"则不应作为 Qwen Code 的 P2/P1 核心改进目标——要么降级到 P3,要么标注 ⚠️ 实验性警告,要么完全拒绝。
2026-04-15(补充追踪:Fast Mode 部分实现)
用户指出 p2-core item-5 Fast Mode 标注"仅指定备用模型"不准确——Qwen Code 已实现 fastModel 配置体系。审查 qwen-code 源码 + git log 后确认:
Qwen Code 的 fastModel 实现时间线:
49702ce26refactor: 合并suggestionModel + speculationModel→ 统一fastModele9bc686f0refactor:fastModel移到顶层配置(与model并列)fea1739d2feat:/model --fast命令c06276799feat:/model --fast打开选择对话框- PR#3077 ✓ improve /model --fast description clarity
- PR#3086 ✓ add --fast hint to /model description
- PR#3120 ✓ replace text input with model picker for Fast Model in /settings
但不完全对齐 Claude Code Fast Mode:
- Claude Code Fast Mode = 同一模型的速度分级(Opus 4.6 standard vs Opus 4.6 fast,依赖 Anthropic priority tier 定价)
- Qwen Code fastModel = 另一个更快/更便宜的模型(如 qwen-turbo 作为 qwen-plus 的 fastModel)
- 两者解决相似问题(fast-response 场景),但实现路径不同。Qwen Code 走"换模型"方案的根本原因是 DashScope / OpenAI 不提供 priority tier 定价,只有 Anthropic 有。
修复:
- item-5 标题加 ⚠️ 部分实现标记
- 详细页加完整实现时间线(4 commits + 3 merged PRs)+ 两种方案对比表 + "为什么走不同方案"说明
- 主矩阵 item-5 行:状态 "仅指定备用模型" → "⚠️ 部分实现(
fastModel走不同方案)",进展列补 3 个 merged PRs - 架构差异总结表同步更新
追踪计数不变:PR#3077 / #3086 / #3120 早已在报告其他位置引用(changelog + 历史表),本次只是把它们归属到 item-5 的进展列,不是新增追踪。总追踪 PR 仍为 49,merged 仍为 27。
2026-04-15(补充追踪:Remote Control Bridge 3 个 PR)
用户指出 item-7 Remote Control Bridge "进展"列为空,搜索后发现 3 个未追踪 PR,分两条路径推进同一个 item:
路径 A:本地 HTTP/WebSocket + Web UI + QR code(对标 Claude Code Bridge)
- PR#2330(open)—
feat: remote-control feature for browser-based CLI interaction:http://localhost:7373/+ 64-char hex token + qrcode-terminal 扫码连手机 + rate limit + idle timeout + XSS sanitization - PR#1678(open,较早)— Web GUI,和 #2330 有重叠
路径 B:Channels 平台(通过消息平台远程驱动)
- PR#2628 ✓(2026-04-01 合并)—
feat(channels): extensible Channels platform:@qwen-code/channel-base插件系统 + 内置 Telegram/WeChat/DingTalk 3 个 adapter + allowlist/pairing/group policies + session 管理。这是另一种 remote control——通过 IM 驱动本地 Agent
修正:
- 主矩阵 item-7 行"进展"列从 "—" 补上 3 个 PR
- "Qwen Code 现状"列从"缺失"改为"Channels 平台已合并(IM 路径),Web/QR 路径 review 中"
- p0-p1-platform item-7 详细页新增长段落,对比两种路径的适用场景、实时性、已合并状态
总追踪 PR:47 → 49(+PR#2330、+PR#2628;PR#1678 只提及不单独计数),merged 26 → 27(+PR#2628 ✓)。
2026-04-15(补充追踪)
系统扫描 pull/ URL 跨报告交叉引用,发现 5 个此前未追踪的 PR。两个应立即追踪(已执行),3 个changelog 级记录(无对应 matrix item):
已加入追踪(主矩阵 + 详细页都更新):
- PR#3170(open,huww98)— LSP 官方 SDK + didSave 实时诊断。挂到 p2-perf item-7 LSP 服务器并行启动,与 PR#3034(diagnostics caching)互补。核心是"实时诊断"而非"启动并行"——解决 Edit 后必须手动 refresh 才能看到新 diagnostics 的问题
- PR#3276(open)—
/reviewStep 4 并行 dispatch 强化(弱模型)。挂到 p0-p1-platform item-2 GitHub Code Review 的"进行中的增强"。修复 qwen3.6-plus 等弱模型会串行执行 5 agent 的问题(替换单行指令为 callout + ASCII 正反例 + self-check + "STOP" 模式打断)
仅 changelog 记录(无对应 matrix item,为社区开发方向观察):
- PR#3191 ✓(2026-04-15 合并)— ACP LLM 消息重写中间件:
TurnBuffer累积 turn content(thoughts + messages),LlmRewriter用 user-defined system prompt 重写为用户友好格式。ACP 模式专用,不影响其他 session path - PR#3283(open)— 命令能力化 metadata(Phase 1):替换硬编码的
ALLOWED_BUILTIN_COMMANDS_NON_INTERACTIVE白名单为 per-commandcommandType+supportedModes元数据。是 broader slash command 架构重构的 Phase 1,零行为回归 - PR#3165(open)— MiniMax provider 支持。扩展 qwen-code 的 provider 生态到 MiniMax
总追踪 PR:45 → 47(新增 PR#3170 + PR#3276),merged 26 → 26(这次追加的 2 个 PR 都是 open)。
2026-04-14(追加:PR#3087 Auto Dream 追踪修复)
用户指出 item-5 Auto Dream 主矩阵的"进展"列为空,但 PR#3087 标题明确是 managed auto-memory + auto-dream system,即同时覆盖 item-4 会话记忆(extract 子系统)和 item-5 Auto Dream(dream 子系统)。
验证 PR 内容后确认:
extract→ item-4(提取记忆)—— 顺便修复了一个 bug:saveCacheSafeParams被skipNextSpeakerCheckearly-return 路径跳过,导致 extract 从未触发dream→ item-5(后台整理/去重/合并)- 含
PermissionManagerwrapper 限制 memory scope 写入权限 - PR 描述明确声明对齐 Claude Code 的
extract+dream实现模式
修复:主矩阵 item-5 行的"进展"列补上 PR#3087,并在 p0-p1-core item-5 详细页补充 "进展" 段落说明双子系统覆盖。
2026-04-14(追加:PR#2949 追踪缺口修复)
社区反馈发现 PR#2949(Skill 级模型覆盖,tanzhenxin 提交,2026-04-13 合并)未被追踪。检查后确认这是一个真实的追踪缺口:
- skill-system-deep-dive.md 矩阵 的"模型覆盖"列此前标注 Qwen Code 为 ✗(Claude Code / Copilot CLI 为 ✓)
- 改进报告从未为"Skill 模型覆盖"单独立过 item
补救:
- 新增 item-22 Skill 级模型覆盖(p2-tools-commands 子报告),直接标注 ✓ 已合并
- 更新 skill-system-deep-dive.md Qwen Code 行的"模型覆盖"列从 ✗ 改为 ✓(同 provider)
- PR#2949 实现要点:skill frontmatter
model:字段 →SkillConfig.model→ skill tool call 之后的 API 请求使用该 model → agentic loop 结束自然恢复。Phase 1 仅同 provider 切换,跨 provider 需要 ContentGenerator threading,延到 follow-up PR。
总项数 252 → 253,p2-tools-commands 子报告 21 → 22。 总追踪 PR:45 个(26 已合并 ✓)。
2026-04-14(AgentScope 参考新增 3 项)
基于对 AgentScope(阿里 Tongyi Lab,215 文件 / 43K 行)的源码级分析,新增 3 条 P2 improvement item,均标注"AgentScope 参考":
- item-24 Plan 状态机化 — 4 状态 subtask(todo/in_progress/done/abandoned)+ 每轮自动 hint 注入,升级
/plan从"一次性文档"到"持久状态机" - item-25 A2A 协议集成 — 集成
a2a-sdk+ AgentCard + Well-known/File/HTTP resolver,让 qwen-code 参与跨 agent 网络 - item-26 OTel 原生 Tracing — 5 类 span extractor(Agent/LLM/Tool/Formatter/Embedding),对标 AgentScope
src/agentscope/tracing/_trace.py:24-45的 13 个 extractor 实现
总项数 249 → 252,p2-core 子报告 25 → 28。(后于 2026-04-15 伪需求审计删除 item-22,最终项数 252,见该日 changelog 条目)。
新增文档章节 docs/frameworks/:
agentscope/— AgentScope 源码级 deep-dive(6 文件)comparison.md— 6 款 framework 横向对比- 5 个 framework 单文件(LangGraph / CrewAI / AG2 / MAF / LangChain)—— 基于文档级分析
2026-04-14(晚间更新)
勘误:social 反馈指出 platform item-2 "GitHub Code Review 多 Agent 审查" 已被 qwen-code 内置 /review skill 完整覆盖。审查源码 packages/core/src/skills/bundled/review/SKILL.md 后确认:
- Step 4:dispatch 5 个 task agent 并行执行(5 个维度:correctness / security / quality / performance / build-test)
- Step 9:用 GitHub Create Review API 一次性提交 verdict + inline comments 数组(模仿 Copilot Code Review)
- Step 5/6/8:去重、反向审计、autofix 流程完整
.qwen/review-rules.md项目规则(等同 REVIEW.md 概念)- 增量 cache、worktree 隔离、跨仓库 lightweight 模式等额外能力
实现深度已超过 Claude Code 托管的 GitHub Code Review。涉及 PR:#2348 ✓ / #2687 ✓ / #2932 ✓ —— 3 个 PR 已合并。#2376(multi-model arbitration,CLOSED 2026-04-13)和 #2380(extends: bundled)均已关闭(未合并,勘误:之前错标为 merged)。
更新 platform item-2 状态为"✓ 已实现",新增 5 个 PR 的 ✓ 标记到主矩阵。
总追踪 PR 重新计数:44 个(25 已合并 ✓,2 已关闭移除)
2026-04-14
继续追踪社区 PR(qwen-code 4/14 连续合并 + 新开):
- 新标记已合并(2 个 ✓):
- 新增追踪 PR(3 个 open):
- #3214(tanzhenxin)— 替换 fdir 爬虫为
git ls-files + ripgrep两级回退,Closes Issue#3137。直接解决@文件补全在大项目里按键每次重新扫描的性能问题;关联 p2-core item-15 FileIndex - #3242(open)— 保证 startup input 穿透 full init 流程不丢失,补充 PR#3085
- #3266(open)— 新增
PostTurnhook 事件(每次模型 turn 边界触发),延续 PR#2825 的"新 hook 事件类型"方向
- #3214(tanzhenxin)— 替换 fdir 爬虫为
- 其他新开 PR(观察中,暂不追踪):
- 其他维护合并(未对应矩阵条目):
- 总追踪 PR:40 个(21 已合并 ✓,2 已关闭移除)
2026-04-13(全量审计 + 晚间更新)
追踪社区 PR 合并(由社区反馈触发审计 + 全量扫描最近 4 天 PR 状态):
- 标记已合并(新增 7 个 ✓):
- #2864 ✓(智能工具并行 — Kind-based consecutive batching,item-7 + item-37 双侧面)
- #2904 ✓(上下文 Tips 系统,registry-based + LRU 跨会话轮转 + Responding→Idle hook)
- #3006 ✓(L2 microcompaction — 空闲上下文清理 +
cache_edits增量缓存删除) - #3064 ✓(subagent
disallowedTools字段) - #3066 ✓(approval mode 传播到 sub-agents)
- #3146 ✓(tools.sandboxImage 配置项,部分覆盖 item-30)
- 移除已关闭 PR:
- 勘误:从 item-1 Conditional Hooks 移除错误的 PR#2825 关联——PR#2825 实际实现的是 StopFailure + PostCompact 两个新 hook 事件,和 Hook
if字段条件过滤完全不同 - item-37 状态更新:重写为"已合并"版本,对比 PR#2864 与 Claude Code
StreamingToolExecutor在 Kind 分类、batching 策略、shell 读写检测上的差异 - 观察到的重要维护性合并(未对应改进矩阵条目):
- #3138 ✓ 文件爬虫 100k OOM 保护(对应 Issue#3164 heap exhaustion)
- #3197 ✓
@file注入遵循respectGitIgnore(对应 Issue#3142 feature request) - #3192 ✓ MCP server cwd 不存在时明确报错(对应 Issue#3163)
- #3194 ✓ agent 名称支持 Unicode / 中文(对应 Issue#3149)
- #3201 ✓ 输入
exit/quit直接退出(对应 Issue#3169)
- 总追踪 PR:38 个(19 已合并 ✓,2 已关闭移除)
2026-04-13
新增 item-14(闭环学习系统):基于对 Hermes Agent 源码的分析(822 .py / 369K 行),新增 p0-p1-core item-14 "Nudge 驱动的闭环学习"。总项数 248→249。
- 触发:codeagents Issue #129(pomelo-nwu 建议加入 Hermes Agent 研究)
- 核心发现:Hermes 的"闭环学习系统"由 4 个子系统组成 — 冻结快照 Memory / 自主 Skill + patch 自修补 / SQLite FTS5 跨会话搜索 / 双计数器 Nudge 触发
- 对 Qwen Code 的价值:PR#3087(managed auto-memory + auto-dream)缺少 ① 双计数器 ② 冻结快照保护 prompt cache ③ 保守 review prompt 三个关键要素
- 新增文档:
docs/tools/hermes-agent/(5 文件:README + 01-overview + 02-architecture + 03-closed-learning-loop + 04-tools-channels + EVIDENCE)docs/comparison/closed-learning-loop-deep-dive.md(横向对比 Hermes / Claude Code / Qwen Code / Codex / Cursor / Aider / Gemini CLI / OpenCode)
- Code Agent 总数:18 → 19(新增 Hermes Agent)
2026-04-11
- 标记已合并:#2871 ✓(队列输入编辑 Up arrow key)、#2914 ✓(Markdown 表格 CJK 列宽)
- 移除已关闭:#3105(/chat——已关闭,由 #3093 替代)
- 新增 PR 追踪:#3146(sandbox settings 中配置 sandboxImage)、#3034(LSP diagnostics caching)、#3048(vibe mode 安全 shell 自动批准)
- 总追踪 PR:38 个(13 已合并 ✓)— 后于 04-13 晚间全量审计更新为 19 已合并
2026-04-10(晚间更新)
- 新增 PR 追踪:#3087(auto-memory + auto-dream 记忆系统)、#3082(终端 dark/light 主题检测)、#3093(会话 rename/delete/auto-title)、#3105(/chat 命名会话管理)、#3115(Commit Attribution per-file AI 贡献追踪)
- 总追踪 PR:36 个(11 已合并 ✓)
2026-04-10
- 标记已合并:#3042 ✓(/context detail 子命令)
- 新增 PR 追踪:#3085(启动优化 API preconnect + 早期输入捕获)、#3080(CI/CD 持久化重试模式)、#3079(/batch 并行批量操作 Skill)、#3076(Agent 工具 run_in_background)
- 总追踪 PR:31 个(10 已合并 ✓)
2026-04-09(晚间更新)
- 标记已合并:#2923 ✓(Status Line 自定义)、#3008 ✓(/plan 退出恢复模式)
- 新增 PR 追踪:#3064(disallowedTools Agent 工具黑名单)、#3066(approval mode 传播到 sub-agent)、#3042(/context detail 子命令)
- 总追踪 PR:27 个(9 已合并 ✓)
2026-04-09
- 修正子报告项数:engine 24→27、stability 34→41、hooks 32→33
- 修正 Deep-Dive 索引数:134→133(实际值)
- 同步 README.md 数据
- 重写 5 个 Agent 文档系列(Copilot CLI / Codex CLI / Aider / Goose / Kimi CLI)为开发者视角
2026-04-08(晚间更新)
- 标记已合并:#2897 ✓(Thinking 块保留)、#2898 ✓(输出 Token 升级)、#2921 ✓(/plan 计划模式)
- 新增 PR 追踪:#3013(SlicingMaxSizedBox 防闪烁——P0 backport 项!)、#3006(microcompaction 空闲压缩)、#2990(prompt hook——LLM 推理决策 Hook,Claude Code 独有能力的 backport)
- 总追踪 PR:27 个(9 已合并 ✓)
2026-04-08
新增 9 项改进建议(来源:learn-claude-code 概念分析),总项数 240→248:
| 优先级 | 新增项 | 详情 |
|---|---|---|
| P1 | QWEN.md system-reminder 注入 | engine#26 |
| P1 | 错误恢复分类路由(truncation/overflow/transport 三分支) | engine#27 |
| P2 | Query TransitionReason 枚举(6 种转换原因) | stability#36 |
| P2 | 工具并发安全分类(concurrencySafe 标记) | stability#37 |
| P2 | 工具执行进度消息(>3s 发射进度) | stability#38 |
| P2 | 运行时任务模型(work-graph vs runtime task) | stability#39 |
| P2 | 后台通知 drain-before-call | stability#40 |
| P2 | 压缩后身份重注入(messages≤3 时注入身份) | stability#41 |
| P3 | 团队通信协议(邮箱/心跳/关闭请求) | hooks#33 |
勘误:删除 item-20(/thinkback)——经源码验证 Claude Code 的 /thinkback 是 Year in Review 动画功能,非会话时间线回顾。原 item-21(/context)重编号为 item-20。
2026-04-07
- 新增 PR 追踪:#2936(Fork Subagent)、#2932 ✓(/review 增强——实现了审查报告 10 项建议中的 9 项)
- 标记已合并:#2854 ✓(Mid-Turn Queue Drain)、#2889 ✓(危险操作指导)
2026-04-06
- 新增 7 个 PR 追踪:#2921(/plan)、#2923(StatusLine)、#2914(表格渲染)、#2915(/clear)、#2916(/context SDK)、#2911(ConfigTool)、#2904(Tips 系统)
2026-04-05
- 初始版本:240 项改进建议 + 133 篇 Deep-Dive 索引