[Enhancement] peers 列表把同名 auto-name 的 bg-respawn 孤儿显示成多个独立 peer —— 建议按母体 sessionId 折叠
定性:显示层 enhancement,不是 hub 的产生型 bug。fork 的产生源在 Claude Code 上游(见下),hub 行为本身正确,只是显示可以更聪明。先把归属讲清楚,免得 debug 跑偏到 hub 内部。
环境
- forge-hub:
com.forge-hub daemon(bun ~/.forge-hub/hub.ts,KeepAlive)
- Claude Code 2.1.154 / macOS 15
现象
fh hub peers 里同一个逻辑对话显示成多个 peer:
forge-85671 (Extract talking points for Silicon Valley article) [13h前]
forge-3417 (Extract talking points for Silicon Valley article) [2h前] ← 同名,不同 id
forge-18036 (Debug conversation windows forking issue) ...
用户感知:"一个对话裂成好几个窗口"。
真根因在 Claude Code 上游(非 hub)
两条独立的 CC 原生机制各自产生"多实例",hub 只是如实显示:
-
bg-respawn — session 切后台后,CC 的 background job 机制把它 respawn 成带全新 session id 的 job,且 nameSource:auto 自动起名撞车(同一对话的多个派生 job 拿到相同 name)。产物是 jsonl 几乎为空(只有 title+name)、内容在 state.json 的孤儿 job。本机实例:母体 e36cb49e 被 respawn 成 99f3e1db + cacf6b15,两者 name 同为 "Design file organization skill...",resumeSessionId 各指向自己、互不引用。
-
resume-fork — CC 的 --resume 在多叉 jsonl 上选错 leaf(anthropics/claude-code #48270)+ file-history-snapshot 的 messageId 撞 message uuid 断链(#36583)。产物是有完整内容的多个 session 文件。本机实例:88ab1e7d 一个 session 内 58 个快照中 57 个 messageId 撞号、13 个分叉点。
hub 不产生这些,只是把它们注册成 peer 显示出来。 上游两个 bug(#36583/#48270)均 closed,改不了。
hub 能做的(显示层折叠)
- 按母体 sessionId / resumeSessionId 折叠 — 同一对话派生出的多个 job/leaf 折叠成一个 peer,而非各占一行。
- 识别并降权空壳孤儿 — jsonl 只有 title+name、实质内容在 state.json 的派生 job,标注或折叠,不当独立实例。
- auto-name 撞车去歧义 — 同 name 多 peer 时附 short-id / 创建时间,避免视觉上"同一个挂多个"。
不该让 hub 背的
fork/respawn 的产生本身(属 CC 上游 background job + resume 机制)。本 issue 只请求 hub 在显示层不放大歧义。
备注
- forge-launcher 的 agents 列表是同源显示问题(同一批孤儿 job 的另一个 UI 投影),折叠逻辑可共用。
- 用户侧缓解:重度文件写入工作流一口气跑完、少切后台,可减少 respawn/fork 触发。
[Enhancement] peers 列表把同名 auto-name 的 bg-respawn 孤儿显示成多个独立 peer —— 建议按母体 sessionId 折叠
环境
com.forge-hubdaemon(bun ~/.forge-hub/hub.ts,KeepAlive)现象
fh hub peers里同一个逻辑对话显示成多个 peer:用户感知:"一个对话裂成好几个窗口"。
真根因在 Claude Code 上游(非 hub)
两条独立的 CC 原生机制各自产生"多实例",hub 只是如实显示:
bg-respawn — session 切后台后,CC 的 background job 机制把它 respawn 成带全新 session id 的 job,且
nameSource:auto自动起名撞车(同一对话的多个派生 job 拿到相同 name)。产物是 jsonl 几乎为空(只有 title+name)、内容在state.json的孤儿 job。本机实例:母体e36cb49e被 respawn 成99f3e1db+cacf6b15,两者 name 同为 "Design file organization skill...",resumeSessionId各指向自己、互不引用。resume-fork — CC 的
--resume在多叉 jsonl 上选错 leaf(anthropics/claude-code #48270)+ file-history-snapshot 的 messageId 撞 message uuid 断链(#36583)。产物是有完整内容的多个 session 文件。本机实例:88ab1e7d一个 session 内 58 个快照中 57 个 messageId 撞号、13 个分叉点。hub 不产生这些,只是把它们注册成 peer 显示出来。 上游两个 bug(#36583/#48270)均 closed,改不了。
hub 能做的(显示层折叠)
不该让 hub 背的
fork/respawn 的产生本身(属 CC 上游 background job + resume 机制)。本 issue 只请求 hub 在显示层不放大歧义。
备注