Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/backlog.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

| id | 标题 | 类型 | 来源 | 状态 | 备注 |
|---|---|---|---|---|---|
| B-545 | **重启/恢复会话用 daemon 启动时的 metadata 快照,回到编辑前的对话** | bug | B-544 收尾实测 2026-10-11 | doing | daemon `restartSessionImpl` / `resumeSessionImpl` 只在快照缺 agent id 时才拉服务端 metadata;wrapper 运行中改的 `claudeSessionId`(就地编辑切到改写副本、/clear)只到服务端 ⇒ 重启按快照 `--resume` 旧对话,把已删除的轮次带回来(token360 会话重启时即按快照 `8208b899` 拉起)。修:`daemon/relaunchMetadata.ts` 服务端副本优先、离线才回落快照,两处都走它 |
| B-544 | **会话改写在 agent 侧生效、页面侧未生效(回执丢失即分裂)**(Owner 2026-10-11:token360 会话编辑 T-3 超时后 agent 已切到截断副本、页面仍全量显示) | bug | Owner 2026-10-11 | doing | 实现中(PR fix/b544-rewind-reconcile):CLI `rewindReconcile.ts` 纯规则 + `rewindReconciler.ts`(metadata.rewind 暂定、tombstone 确认、120 s 回滚、迟到 tombstone 重放、启动对账含 lineage);web requestId + 超时等 metadata 10 s;需新 CLI 生效、wrapper 重启。spec `specs/2026-10-socket-singleton-and-rewind-reconcile.md` §B:requestId + metadata 暂定记录,以 tombstone 确认、120 s 未确认自动切回源 JSONL;web 超时查 metadata 修补;wrapper 启动对账(含旧版本留下的分裂,按 lineage 切回源);定位跨 lineage |
| B-543 | **重连双 CONNECT 留下孤儿 socket,session RPC 100% 超时**(Owner 2026-10-11:「编辑消息再发送卡死 operation has timed out」) | bug | Owner 2026-10-11 | doing | 根因与本地复现见 spec `specs/2026-10-socket-singleton-and-rewind-reconcile.md` §A:client `connect()` 在 CONNECT 未决时重发 → server 同 engine 两个 socket,孤儿留在 RPC room 收请求但 ack 路由给新 socket。修:client `socketConnectGuard`;server connection 时驱逐同 engine 同 namespace 孤儿 + 60 s 清扫;RPC 选路排除孤儿。**实现中(PR 待合)**:CLI `api/socketConnectGuard.ts`(未决不重发、15 s 卡死整连重建,apiSession/apiMachine 全部手动 connect 走它);server `socket/socketOrphans.ts`(connection 时驱逐同 engine 同 namespace 孤儿 + 60 s 清扫、移交未决 ack、`socket_orphans_evicted_total`);`selectRpcTarget` 排除孤儿→epoch→新连接优先;真 server+client 集成测试钉住;web apiSocket 无「已 open manager 上再 connect」路径,未改 |
| B-545 | **重启/恢复会话用 daemon 启动时的 metadata 快照,回到编辑前的对话** | bug | B-544 收尾实测 2026-10-11 | done | **Shipped 2026-10-11**:PR #484 → `main@fae3d3cd1`,CLI v0.2.165(latest),web deploy 38078220207;dev-sg daemon 0.2.165。 daemon `restartSessionImpl` / `resumeSessionImpl` 只在快照缺 agent id 时才拉服务端 metadata;wrapper 运行中改的 `claudeSessionId`(就地编辑切到改写副本、/clear)只到服务端 ⇒ 重启按快照 `--resume` 旧对话,把已删除的轮次带回来(token360 会话重启时即按快照 `8208b899` 拉起)。修:`daemon/relaunchMetadata.ts` 服务端副本优先、离线才回落快照,两处都走它 |
| B-544 | **会话改写在 agent 侧生效、页面侧未生效(回执丢失即分裂)**(Owner 2026-10-11:token360 会话编辑 T-3 超时后 agent 已切到截断副本、页面仍全量显示) | bug | Owner 2026-10-11 | done | **Shipped 2026-10-11**:PR #483 → `main@904bb6611`(含 claude-agent-sdk 0.3.296 / Claude Code 2.1.296),web deploy 38076769131,CLI v0.2.164。token360 会话(cmun0cigo…)重启后从原始 `8208b899` 拉起,session RPC 恢复。 实现中(PR fix/b544-rewind-reconcile):CLI `rewindReconcile.ts` 纯规则 + `rewindReconciler.ts`(metadata.rewind 暂定、tombstone 确认、120 s 回滚、迟到 tombstone 重放、启动对账含 lineage);web requestId + 超时等 metadata 10 s;需新 CLI 生效、wrapper 重启。spec `specs/2026-10-socket-singleton-and-rewind-reconcile.md` §B:requestId + metadata 暂定记录,以 tombstone 确认、120 s 未确认自动切回源 JSONL;web 超时查 metadata 修补;wrapper 启动对账(含旧版本留下的分裂,按 lineage 切回源);定位跨 lineage |
| B-543 | **重连双 CONNECT 留下孤儿 socket,session RPC 100% 超时**(Owner 2026-10-11:「编辑消息再发送卡死 operation has timed out」) | bug | Owner 2026-10-11 | done | **Shipped 2026-10-11**:PR #482 → `main@d84c3084b`,deploy 38075722911(blue);上线 15 min 驱逐孤儿 242 个、其后零 `RPC failed`/多 socket 告警;CLI guard 随 v0.2.164。 根因与本地复现见 spec `specs/2026-10-socket-singleton-and-rewind-reconcile.md` §A:client `connect()` 在 CONNECT 未决时重发 → server 同 engine 两个 socket,孤儿留在 RPC room 收请求但 ack 路由给新 socket。修:client `socketConnectGuard`;server connection 时驱逐同 engine 同 namespace 孤儿 + 60 s 清扫;RPC 选路排除孤儿。**实现中(PR 待合)**:CLI `api/socketConnectGuard.ts`(未决不重发、15 s 卡死整连重建,apiSession/apiMachine 全部手动 connect 走它);server `socket/socketOrphans.ts`(connection 时驱逐同 engine 同 namespace 孤儿 + 60 s 清扫、移交未决 ack、`socket_orphans_evicted_total`);`selectRpcTarget` 排除孤儿→epoch→新连接优先;真 server+client 集成测试钉住;web apiSocket 无「已 open manager 上再 connect」路径,未改 |
| B-542 | **iOS 26 主屏幕 PWA 底部大白条**(Xu CHEN 2026-10-10:Safari 添加到主屏幕、iOS 26.5、刚打开未点输入框也有;截图输入框下 ~90pt 空白) | bug | Xu CHEN 2026-10-10 | done | **Shipped 2026-10-10**:PR #479 → `main@bcb54a632`,deploy 38031395302(切换已提交,green 槽 ACTIVE_RELEASE=bcb54a632,回滚点 blue `ccda35aed`;workflow exit=5 old-slot-retained 同 B-541,已手工 stop blue),`check-shipped` 命中 `2026-10-10-ios-home-screen-height` 与 CSS `100lvh`。根因:iOS 26 WebKit 回归——standalone + `viewport-fit=cover` + `black-translucent`(我们三者都开)下 `100dvh`/`100svh`/`100%`/`innerHeight` 都少算顶部安全区(~47–59pt),只有 `100lvh` 是全高;`.app-shell` 用 `100dvh` ⇒ 整个 app 底边抬高、露出一条底色。修:`base.css` 新 `--app-h`(默认 `100dvh`;`@media (display-mode: standalone)` + `@supports (-webkit-touch-callout: none)` 下 `100lvh`,html 同步),全屏壳(app-shell / assistant / auth / terminalConnect / RouteLoading / ChunkFailure / `#root`)改用它;铺到底边后 `.sd-foot` 加 `env(safe-area-inset-bottom)` 让开 home indicator,键盘 pin 时归零。Safari 标签页与 Android 仍走 `100dvh`(WebKit iPhone 13 非 standalone 实测 `--app-h=100dvh`、html=innerHeight=664)。契约测试 `styles/appHeight.test.ts` + mutation-check 7/7。standalone 无法自动化模拟,真机项 V-168 |
| B-541 | **长会话「回到最新」按钮数字慢慢涨到 99+**(Xu CHEN 2026-10-09 iOS 实报:「右下角会慢慢数字变到 99+,点击 99+ 会到达会话最下面,但一小会儿就又会回到刚打开的位置,同时数字又开始慢慢变大」) | bug | Xu CHEN 2026-10-09 | done | **Shipped 2026-10-10**:PR #477 → `main@ccda35aed`,deploy 37972658389(切换已提交,blue 槽 ACTIVE_RELEASE=ccda35aed,回滚点 green `57a39446`;workflow 报 exit=5 old-slot-retained 是旧槽 inFlightHttp=6 未按时 drained、localSockets=0,已手工 stop green),`check-shipped --needle 2026-10-10-unseen-badge` 命中 live `AppRoot-…-ccda35aed`。根因:`.cl-jump` 的未读数 = 离底后 `rows.length` 增量,而 `prefetchOlderMessagesInBackground` 每 250ms 往**顶部**插一页旧历史,row 数照涨 ⇒ 旧历史被当新消息。修:离底快照改记最新一行的 key,只数它之后的行(`chatFollow.nextAwaySnapshot/unseenRows`)。WebKit iPhone 13 + `/dev/chat-scroll` 实测:修前 40→99+,修后仅预取不出数字、底部新到 3 条显示 3。「点完又跳回原位」同夹具未复现(点后持续预取视图一直贴底),待真机录屏;同报的底部白条(输入框下 ~90pt)未定位,疑 `useKeyboardViewportPin` 键盘收起后未释放,待确认 Safari/PWA 与 iOS 版本 |
| B-540 | **/compact 在对话里显示怪**(Owner 2026-10-07 截图:「compact 的 UI 很奇怪,也看看其他的 coding agent ui」):一轮 /compact 显示成「耗时」面板 + 两行英文 mono `Compaction started/completed` + 结尾再冒一个 `>_ /compact` 气泡 | ux | Owner 2026-10-07 | done | **Shipped 2026-10-07** web `57a394465`(PR #474,deploy 37509261761 success;`check-shipped` 命中「上下文已压缩」)。真实数据(dev-sg 10-07 01:23 的 /compact:wrapper 日志 + transcript):SDK 在压缩结束时回放 `<command-name>/compact</command-name>` 与 `<local-command-stdout>Compacted</local-command-stdout>` 两条 user 消息,前者渲染成第二个气泡并切出空轮次。参照 Claude Code(「Conversation compacted」单行)、Codex(「Context compacted」)、Cursor(摘要分隔线):`compaction.ts` 把只含压缩事件的轮次收成一条 1px 分隔线 + 居中「上下文已压缩 · 耗时」(运行中 accent 转圈、失败 danger 写原因、会话停了没收尾显示未完成),`dropSlashCommandEchoes` 在 `chronological` 层去掉与用户刚输入的同名命令回放及其空 stdout/caveat(终端里跑的命令无输入孪生,保留 `/cmd` 胶囊)。轮次里有其他内容(停止/报错/正文)时保持原渲染。auto-compact 不发这两条事件,仍无提示,另议 |
Expand Down
2 changes: 1 addition & 1 deletion specs/2026-10-socket-singleton-and-rewind-reconcile.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 一条连接只有一个 socket + 会话改写以持久状态收敛

状态:Final · B-543 / B-544 · 2026-10-11
状态:Shipped · B-543 / B-544 · 2026-10-11 · PR #482 `d84c3084b` · PR #483 `904bb6611` · CLI 0.2.164(重启快照问题见 B-545 / 0.2.165)

## 问题(Owner 2026-10-11 实报,100% 复现)

Expand Down
Loading