Skip to content

feat(mesh): ship shared-thread demo and runtime flow - #11260

Merged
yiliang114 merged 30 commits into
codex/multi-agent-mesh-foundationfrom
codex/mesh-step-9-web-demo
Sep 7, 2026
Merged

yiliang114 merged 30 commits into
codex/multi-agent-mesh-foundationfrom
codex/mesh-step-9-web-demo

Conversation

@yiliang114

@yiliang114 yiliang114 commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

This delivers the usable shared-thread mesh demo on top of the foundation in #11206. A workspace can create, enable, disable, and remove persistent agent identities. Creating the first identity establishes its hidden host; disabling rejects new work while draining existing bookings; removal clears the resident body and transcripts while preserving historical post attribution, and removing the last identity releases the now-unused host. Daemon restart restores hosts only for non-empty rosters. It can atomically create, assign, and reassign work against the live roster, watch agents collaborate across root and child threads, interject while a run is active, inspect per-run transcript slices, cancel work, and mark reviewed threads done.

Durable bookings reach a workspace-qualified hidden host through ACP. The dispatcher handles new launches, resident continuation, direct input to a running agent, parent reports, FIFO backpressure, delivery-race rebooking, one restart/stall recovery attempt, source-first cancellation, stale host replacement, and startup replay. Launch, resident continuation, paused resume, and cold revival carry the durable run id through the same structured external-message path, and child-review reports retain the source run across their system-authored parent hop. Failed and cancelled runs remain terminal, cancellation and thread-tree closure are admitted atomically, an accepted replay reuses an existing same-parent/same-title child instead of duplicating work, inert unassigned children cannot strand a waiting parent, and the hidden owner stops when its workspace runtime generation is replaced. Runtime mutation remains guarded by the ambient workspace/thread/run/attempt binding. Tool responses distinguish queued work from a started peer and do not promise channel notification while its destination remains undecided.

The Web Shell uses the resolver's status and reason directly, previews new assignments and reply routing with the production rules, preserves deleted authors as tombstones, and keeps child threads and run history beside the shared ledger. Durable mutations whose immediate background processing fails are reported as saved-but-not-processed instead of disappearing behind polling.

Why it's needed

The earlier mesh steps established rules, storage, capabilities, and runtime seams but did not give a person a usable product loop. This PR is the smallest browser-driven path that demonstrates persistent identities collaborating on one shared thread while a person can observe, redirect, stop, and review the work.

Reviewer Test Plan

How to verify

  1. Start qwen serve for a trusted workspace and open its Web Shell.
  2. Open Agents, create two identities, then create a root thread assigned to the first identity. Confirm the assignment immediately creates runnable work even when the optional body is empty.
  3. Disable an idle identity and confirm it remains in the roster but cannot be assigned new work; enable it again before continuing.
  4. Reassign the thread from its header and confirm the new assignment is booked without cancelling already-booked work. Then ask the active identity to create one child assigned to the second identity, wait for it, and submit the root for review. Confirm the child report wakes the parent identity without another browser action and the root reaches in_review.
  5. While an agent is running, post a follow-up addressed to it. Confirm the post is delivered to that run or durably rebooked rather than waiting for a new browser mutation.
  6. Cancel a queued or running run. Confirm cancellation is persisted first, the runtime stops, the row reaches terminal cancelled, is not rebooked by a later dispatcher sweep, and the next FIFO run can start.
  7. Have an agent call thread_block; confirm the question and the resolver's waiting-for-a-person reason are visible. Open a completed run and confirm only its transcript byte range is rendered.
  8. Delete an idle agent that already posted; confirm the roster entry disappears while the historical post retains name (removed). Remove the final identity and confirm the hidden host is released.
  9. Try to mark a parent done while a child remains open and confirm the request is refused; after every descendant is done, repeat the command and confirm it creates at most one parent report.

Evidence (Before & After)

Before: the mesh foundation had no person-facing shared-thread workflow.

After: a real daemon and Web Shell completed alice-demo -> bob-demo child -> alice-demo parent continuation. Both threads reached in_review; the root showed the attributed result, inline child, and two collapsed past runs. Separate browser passes showed a blocked question, exact run transcript range 16990..22071, running-to-cancelled control flow, inline children, mark-done, and deleted-agent tombstones. A final latest-source smoke previewed Will start @alice, durably created and assigned a thread, replayed its queued run after daemon restart, and showed Alice's attributed thread_review result as completed/review with the thread in_review. The later recovery, correlated resume/revival delivery, atomic cancellation/tree closure, runtime-generation fencing, internal retention-gap reporting, and saved-but-not-started UI paths are implemented from source inspection but have not been exercised in another runtime pass.

No local unit tests, lint, typecheck, or CI wait were run for the latest demo-first changes. Only the ACP bridge package output was refreshed because the shared worktree dependency still pointed at its older build.

Tested on

OS Status
🍏 macOS ✅ real daemon, Web Shell, and live model happy path
🪟 Windows ⚠️ not tested
🐧 Linux ⚠️ not tested

Environment (optional)

Local source-mode daemon and Vite Web Shell against a temporary workspace.

Risk & Scope

  • Main risk or tradeoff: reliability paths exist but the negative failure-injection matrix has not been executed.
  • Not validated / out of scope: bare-mode exposure, cross-machine runtimes, and channel notification delivery. Notifications remain pending because a Web-created thread has no defined channel recipient; §9.12 records the product decision.
  • Breaking changes / migration notes: none. This child PR targets codex/multi-agent-mesh-foundation and is not intended to merge directly to main.

Linked Issues

Part of #11206.

中文说明

这个 PR 做了什么

这个 PR 在 #11206 的 foundation 上交付可用的 shared-thread mesh demo。一个工作区可以创建、启用、停用和删除持久 Agent 身份;创建首个身份会建立隐藏 host;停用只拒绝新工作,已经 booking 的工作继续 drain;删除会清除驻留执行体和 transcript,同时保留历史帖子署名,删除最后一个身份时还会释放不再需要的隐藏 host;daemon 重启只为非空 roster 恢复 host。它会依据锁内最新 roster 原子地创建、指派和重新指派工作,观察 Agent 在根线程和子线程之间协作,在 run 进行中随时插话,查看单个 run 的 transcript slice,取消工作,并把验收后的线程标记为 done。

持久 booking 通过 ACP 到达 workspace-qualified 的隐藏 host。派发器处理首次启动、驻留续跑、向运行中 Agent 直接投递、父级报告、FIFO 背压、投递竞态重订、一次重启/卡死恢复、source-first 取消、陈旧 host 替换和启动重放。首次启动、驻留续跑、暂停恢复和冷复活都通过同一条结构化外部消息路径携带持久 run id,子线程 review 报告经过 system-authored 的父级跳转时也保留来源 run。失败与取消保持终态,取消与线程树关闭在同一个事务内准入,已接受输入的重放会复用同父级同标题的既有子线程而不会重复派工,未指派的惰性子线程不会让父 Agent 永久等待,隐藏 owner 会在工作区 runtime generation 被替换时停止。所有运行时写操作继续由 ambient workspace/thread/run/attempt 绑定保护。工具返回会区分“已排队”和“对方已启动”,在通知目标未决定前也不会承诺 channel notification。

Web Shell 直接使用 resolver 返回的状态和原因,用生产规则预览新指派和回复路由,删除 Agent 后保留历史署名,并把子线程和 run 历史放在共享 ledger 旁边。持久写入成功但后台处理失败时会明确显示“已保存但后台处理失败”,不会被轮询静默清掉。

为什么需要

此前的 mesh 步骤建立了规则、存储、能力边界和 runtime 接缝,但没有人可以操作的完整产品闭环。这个 PR 用最小浏览器路径展示持久身份如何在一个共享线程上协作,同时人可以观察、纠偏、停止和验收。

Reviewer 验证计划

如何验证

  1. 为可信工作区启动 qwen serve 并打开 Web Shell。
  2. 打开 Agents,创建两个身份,再创建一个指派给第一个身份的根线程。即使可选 body 为空,也应立即产生可运行的 assignment。
  3. 停用一个空闲身份,确认它仍保留在 roster 中但不能接新工作;重新启用后继续。
  4. 从线程页头重新指派,确认新的 assignment 会 booking,但不会取消已经 booking 的工作。然后让活跃身份创建唯一子线程并指派给第二个身份,等待后提交根线程验收。确认子级报告无需额外浏览器操作即可唤醒父级身份,且根线程进入 in_review
  5. Agent 运行时再发一条指向它的消息。确认消息进入当前 run,或在投递竞态中被持久重订,而不是等待下一次浏览器变更。
  6. 取消 queued 或 running run。确认取消意图先持久化,runtime 停止,行状态最终为 cancelled,后续 dispatcher 扫描不会重新 booking,且下一个 FIFO run 可以启动。
  7. 让 Agent 调用 thread_block,确认问题和“等待人处理”的 resolver 原因可见。打开已完成 run,确认只渲染它自己的 transcript 字节范围。
  8. 删除一个已发帖的空闲 Agent,确认 roster 中消失,但历史帖子仍显示 name (removed);删除最后一个身份后,隐藏 host 应被释放。
  9. 子线程仍 open 时尝试把父线程标记 done,确认请求被拒绝;所有后代完成后重复操作,确认父级报告至多生成一次。

证据(Before & After)

Before:mesh foundation 没有人可以使用的 shared-thread 工作流。

After:真实 daemon 和 Web Shell 完成了 alice-demo -> bob-demo child -> alice-demo parent continuation。两个线程都进入 in_review;根线程显示了归属清晰的结果、inline child 和两次折叠的历史 run。其他浏览器路径展示了 blocked 问题、精确 run transcript 范围 16990..22071、running 到 cancelled 的控制流、inline child、mark-done 和删除 Agent 后的历史署名。最后一轮 latest-source smoke 还预览了 Will start @alice,持久创建并指派线程,在 daemon 重启后重放 queued run,并在 Web Shell 中看到 Alice 的署名 thread_review 结果;run 为 completed/review,线程为 in_review。之后补充的恢复/复活关联投递、原子取消/线程树关闭、runtime generation 防护、内部 retention gap 报告和“已保存但未启动”提示仅做了源码检查,还没有再跑一轮 runtime。

最新 demo-first 改动没有运行本地单测、lint、typecheck,也没有等待 CI。只刷新了 ACP bridge 包产物,因为共享 worktree dependency 仍指向旧 build。

测试环境

OS 状态
🍏 macOS ✅ 真实 daemon、Web Shell 和真模型 happy path
🪟 Windows ⚠️ 未测试
🐧 Linux ⚠️ 未测试

环境(可选)

本地 source mode daemon 和 Vite Web Shell,对应一个临时工作区。

风险与范围

  • 主要风险或取舍:可靠性生产路径已经存在,但负向 failure-injection matrix 尚未执行。
  • 未验证/范围外:bare mode、跨机器 runtime 和 channel notification delivery。Web 创建的线程没有定义 channel recipient,因此通知暂留 pending;§9.12 记录了这个产品决定。
  • 破坏性变更/迁移说明:无。这个子 PR 的 base 是 codex/multi-agent-mesh-foundation,不直接合入 main

关联 Issue

#11206 的一部分。

@yiliang114 yiliang114 changed the title feat(mesh): expose shared threads in Web Shell feat(mesh): ship shared-thread demo and runtime flow Sep 7, 2026
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Demo-first main-flow update: correlated mid-run delivery now reaches the exact ambient run; delivery misses are detached and rebooked; restart and three-minute no-activity recovery retry once; late attempt callbacks are guarded; definitively dead hidden host sessions are replaced. Child blocked/failed/cancelled/done transitions now report to a waiting parent, not only in_review. Commits: 6808980 and b819ee7. No local tests, lint, typecheck, build, or CI wait were run.

@yiliang114
yiliang114 marked this pull request as ready for review September 7, 2026 07:37
@yiliang114
yiliang114 merged commit aeefa63 into codex/multi-agent-mesh-foundation Sep 7, 2026
57 of 59 checks passed
@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage started at 07:37:56Z; this PR merged into codex/multi-agent-mesh-foundation at 07:37:20Z — 36 seconds earlier. So the staged admission gate is moot here: there is nothing left to admit, and a --request-changes or --approve on a merged PR gates nothing. I'm not submitting a review. Stages 1–2 were not run as a gate.

I did finish reading the code and the CI signal, and there's one thing worth acting on before this reaches main.

The merged tree does not typecheck

npm run build --workspace=packages/web-shell fails at tsc -p tsconfig.lib.json with 8 errors. Both checks that build the package are red on the reviewed head — TUI parity snapshots (ink vs opentui) and OpenTUI no-flicker gate — and the same 8 are red on the post-merge base tip 47d88186 (same errors, App.tsx shifted ~6 lines). So this isn't a stale-head artifact; it landed.

I traced each one to a line in this diff. All 8 are real and all 8 are from this PR's code — none is pre-existing infra noise:

mesh-view-logic.ts(71,3) TS2322 — the returned array literal is the receiver of .filter(...), so it is never contextually typed by the declared ThreadGroup[] return type and key: 'needs_you' widens to string. Needs a typed local:

const groups: ThreadGroup[] = [ /* … */ ];
return groups.filter((group) => group.threads.length > 0);

ThreadsRoute.tsx(130,5) TS18048workspace.capabilities?.workspaces.find(…). The ?. guards capabilities, but workspaces is itself optional, so .find is unguarded. One more ?..

ThreadsRoute.tsx(157,29) TS2554useRef<string | undefined>(). This package resolves @types/react@^19.2.0, which dropped the no-arg overload: useRef<string | undefined>(undefined).

App.tsx TS2339 ×4 (2546, 2572, 2573, 2577) + TS2367 ×1 (6719) — these are the ones I'd look at hardest, because they're not just type noise. DaemonSessionAgentTaskStatus has no teamName member, and DaemonSessionTaskLifecycleStatus is 'running' | 'paused' | 'completed' | 'failed' | 'cancelled' — there is no 'idle'. So beyond failing to compile, every one of these reads is a dead branch: liveTask.teamName ? … : … can only ever take the else arm, !liveTask.teamName is always true, and the added task.status === 'idle' in the session-agents poll condition can never fire — the poll won't keep refreshing for whatever state that was meant to cover.

They also look unrelated to a mesh shared-thread demo. Together with the derivedTaskIdForTool / getEnvironmentAgentTasks fallback to tool.args?.name, these read like work written against a different tree (an agent-teams teamName/idle shape) that came along for the ride. Worth deciding whether they belong in this feature at all, and if they do, whether the SDK type is the thing that's missing the field.

CI never ran the suite on this PR

ci.yml's pull_request trigger is filtered to main and release/**. This PR targets codex/multi-agent-mesh-foundation, so no unit tests, no lint, no typecheck job ran at all. The only pull_request workflow that fired was tui-parity (its paths filter matches packages/cli/**), and it caught the build break incidentally, because its setup builds web-shell.

That's the part I'd flag for #11206: the break is now sitting in that PR's head branch, and #11206main is the first point where the full suite will actually see this code. The description's own note — "No local unit tests, lint, typecheck, or CI wait were run for the latest demo-first changes" — matches what CI shows.

Tests

38 files, ~5104 production lines changed, zero test files — nothing matching *.test.ts(x) or *.spec.ts(x) anywhere in the diff. That's most visible in mesh-view-logic.ts, whose own header says "Everything here is pure and testable without a browser, following the same split as agents-manager-logic.ts" — and the precedent it cites does have a collocated agents-manager-logic.test.ts. The pure grouping/label logic was the cheap thing to pin and it's the file that shipped a type error.

Size and risk

Production lines: ~5104 (docs 306, tests 0, generated/schema 0), across packages/core/src/**, packages/cli, packages/web-shell and packages/acp-bridge — so core paths plus a cross-package change, including a new 1213-line packages/cli/src/serve/routes/mesh.ts. feat-type, so no size block, but this is well past both the 500-line maintainer-awareness line and the 1000-line split advisory.

The route file itself reads carefully — resolveWorkspaceRuntimeFromParam + requireTrustedWorkspaceRuntime on every handler, runtime.trusted filtered on startup replay, generation guard asserted before dispatch, owner replaced when the bridge or guard identity changes. That's the right shape for a workspace-scoped surface. One small thing: owners is keyed by workspaceCwd and entries are only replaced, never removed, so a workspace that goes away leaves its owner in the map.

packages/cli/src/acp-integration/acpAgent.ts matches the high-risk path set from the revert-history analysis (acp-integration), so that file deserves the focused read.

What would actually settle the behavioural claims

The description is candid that recovery, correlated resume/revival delivery, atomic cancellation and tree closure, runtime-generation fencing, retention-gap reporting and the saved-but-not-started UI path "are implemented from source inspection but have not been exercised in another runtime pass". Those are the load-bearing claims of this PR and neither the diff nor CI substantiates any of them — the suite that would have run didn't run.

Sandboxed verification would settle this: @qwen-code /verify — that cancellation persisted before the runtime stopped, that a replaced workspace runtime generation actually fences the hidden owner, and that an accepted replay reuses the same-parent/same-title child instead of duplicating work, are all unobservable from the diff and currently unexercised. @qwen-code /tmux for the Web Shell thread surface (grouping, blocked reason, transcript range, tombstoned author).

Check Conclusion
TUI parity snapshots (ink vs opentui) failure
OpenTUI no-flicker gate failure
review-pr cancelled
assign success
authorize success
label success
Remind on force-push success
delete-asset-branch success
fallback-comment success
triage in_progress (this run)
~70 further bot-orchestration jobs skipped
Qwen Code CI (test / lint / typecheck) never triggered — base is not main or release/**

Failing excerpt, identical in both red jobs:

##[error]client/App.tsx(2546,19): error TS2339: Property 'teamName' does not exist on type 'DaemonSessionAgentTaskStatus'.
##[error]client/App.tsx(6719,15): error TS2367: This comparison appears to be unintentional because the types '"completed" | "paused" | "failed" | "cancelled"' and '"idle"' have no overlap.
##[error]client/components/mesh/ThreadsRoute.tsx(130,5): error TS18048: 'workspace.capabilities.workspaces' is possibly 'undefined'.
##[error]client/components/mesh/ThreadsRoute.tsx(157,29): error TS2554: Expected 1 arguments, but got 0.
##[error]client/components/mesh/mesh-view-logic.ts(71,3): error TS2322: Type '{ key: string; label: string; threads: ThreadSummaryView[]; collapsedByDefault: boolean; }[]' is not assignable to type 'ThreadGroup[]'.
npm error Lifecycle script `build` failed with error:
npm error command sh -c vite build && vite build --config vite.lib.config.ts && vite build --config vite.lib.config.ts --mode transcript && tsc -p tsconfig.lib.json

Not verified: runtime behaviour of the dispatcher, cancellation, recovery, generation fencing and the Web Shell surfaces — no lane ran them, and I did not execute any PR code (static review only, per the gate's no-execute rule).

中文说明

Triage 于 07:37:56Z 启动,而本 PR 已在 07:37:20Z 合入 codex/multi-agent-mesh-foundation——早了 36 秒。因此分阶段准入门禁已无意义:没有可准入的对象,对已合并的 PR 提交 --request-changes--approve 都拦不住任何东西。我没有提交 review,Stage 1–2 也没有作为门禁执行。

代码和 CI 信号我读完了,有一件事值得在它进入 main 之前处理。

合并后的树无法通过类型检查。 npm run build --workspace=packages/web-shelltsc -p tsconfig.lib.json 处失败,共 8 个错误。构建该 package 的两个 check 在被审 head 上都是红的——TUI parity snapshots (ink vs opentui)OpenTUI no-flicker gate——合并后的 base tip 47d88186 上同样是这 8 个错误(App.tsx 行号偏移约 6 行)。所以这不是 head 过期造成的假象,问题已经落地。

我逐个定位到了本 diff 中的具体行,8 个全部来自本 PR 的代码,没有一个是既有的环境噪音:

  • mesh-view-logic.ts(71,3):返回的数组字面量是 .filter(...) 的接收者,因此不会被声明的 ThreadGroup[] 返回类型做上下文推断,key: 'needs_you' 被放宽成 string。需要先赋给一个带类型标注的局部变量再 filter。
  • ThreadsRoute.tsx(130,5)workspace.capabilities?.workspaces.find(…)?. 只保护了 capabilities,而 workspaces 本身也是可选的,需要再加一个 ?.
  • ThreadsRoute.tsx(157,29)useRef<string | undefined>()。本 package 解析到 @types/react@^19.2.0,该版本移除了无参重载,需要写成 useRef<string | undefined>(undefined)
  • App.tsx 4 个 TS2339 + 1 个 TS2367:这几个最值得仔细看,因为不只是类型噪音。DaemonSessionAgentTaskStatus 没有 teamName 成员,DaemonSessionTaskLifecycleStatus'running' | 'paused' | 'completed' | 'failed' | 'cancelled',没有 'idle'。所以除了编译不过,这些读取全是死分支liveTask.teamName ? … : … 只会走 else,!liveTask.teamName 恒为 true,session-agents 轮询条件里新增的 task.status === 'idle' 永远不会命中——它想覆盖的那个状态并不会让轮询继续刷新。

这些改动看起来也和 mesh 共享线程 demo 无关。连同 derivedTaskIdForTool / getEnvironmentAgentTasks 中回退到 tool.args?.name 的改动,更像是照着另一棵树(带 agent-teams teamName/idle 形状)写的代码被顺带带进来了。值得决定它们是否属于这个 feature;如果属于,那缺字段的可能是 SDK 类型。

CI 从未在本 PR 上跑过测试套件。 ci.ymlpull_request 触发器只过滤 mainrelease/**。本 PR 的 base 是 codex/multi-agent-mesh-foundation,所以单测、lint、typecheck 一个都没跑。唯一触发的 pull_request workflow 是 tui-parity(它的 paths 命中 packages/cli/**),而它是 incidental 地发现了这个构建失败——因为它的准备步骤会构建 web-shell。

这一点是我认为需要提醒 #11206 的:这个失败现在就在该 PR 的 head 分支上,而 #11206main 是完整套件第一次真正看到这些代码的时点。PR 描述里自己写的"最新 demo-first 改动没有运行本地单测、lint、typecheck,也没有等待 CI",与 CI 呈现的情况一致。

测试。 38 个文件、约 5104 行生产代码改动,测试文件为 0——diff 中没有任何 *.test.ts(x)*.spec.ts(x)。这一点在 mesh-view-logic.ts 上最明显:它的文件头注释写着"这里的一切都是纯函数、无需浏览器即可测试,沿用与 agents-manager-logic.ts 相同的拆分方式",而它引用的这个先例确实有同目录的 agents-manager-logic.test.ts。纯分组/文案逻辑本来是最容易钉住的部分,偏偏就是这个文件带着类型错误进了仓库。

规模与风险。 生产行数约 5104(文档 306、测试 0、生成/schema 0),横跨 packages/core/src/**packages/clipackages/web-shellpackages/acp-bridge——既是核心路径又是跨 package 改动,其中包含新增的 1213 行 packages/cli/src/serve/routes/mesh.ts。类型是 feat,所以不触发规模硬阻断,但已远超 500 行的维护者关注线和 1000 行的拆分建议线。

路由文件本身写得谨慎——每个 handler 都走 resolveWorkspaceRuntimeFromParam + requireTrustedWorkspaceRuntime,启动重放过滤了 runtime.trusted,dispatch 前断言 generation guard,bridge 或 guard 身份变化时替换 owner。对一个 workspace 作用域的接口来说这是正确的形态。一个小问题:ownersworkspaceCwd 为 key,只替换不删除,工作区消失后它的 owner 会留在 map 里。

packages/cli/src/acp-integration/acpAgent.ts 命中了 revert 历史分析中的高风险路径集合(acp-integration),这个文件值得重点读。

什么才能真正验证行为层面的主张。 PR 描述坦承:恢复、resume/revival 关联投递、原子取消与线程树关闭、runtime generation 防护、retention gap 报告以及"已保存但未启动"的 UI 路径,"仅做了源码检查,还没有再跑一轮 runtime"。这些正是本 PR 最关键的主张,而 diff 和 CI 都无法佐证任何一条——本该跑的套件没有跑。

沙箱验证可以解决这一点:@qwen-code /verify——取消是否先持久化再停 runtime、工作区 runtime generation 被替换后隐藏 owner 是否真的被 fence、已接受的重放是否复用同父级同标题的子线程而不是重复派工,这些都从 diff 看不出来,目前也没有被执行过。@qwen-code /tmux 用于 Web Shell 线程界面(分组、blocked 原因、transcript 范围、删除后的署名)。

未验证:dispatcher、取消、恢复、generation fencing 以及 Web Shell 各界面的运行时行为——没有任何验证通道跑过它们,我也没有执行任何 PR 代码(按门禁的禁止执行规则,只做静态审查)。

Qwen Code · qwen3.8-max-2026-09-02

Reviewed at ffb1c8d60fbb5d45f18d5ee52516d1735837925f (merged as aeefa63eb0706d0b65c53408e06314b885eae706) · re-run with @qwen-code /triage

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants