From a4ef00fd94ade96cbcfcfeb40526307f346c20f8 Mon Sep 17 00:00:00 2001 From: mereith Date: Sun, 11 Oct 2026 03:19:28 +0800 Subject: [PATCH] docs: B-543/B-544/B-545 shipped --- docs/backlog.md | 6 +++--- specs/2026-10-socket-singleton-and-rewind-reconcile.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/backlog.md b/docs/backlog.md index bdce14f5..0d3e2c7f 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -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 在压缩结束时回放 `/compact` 与 `Compacted` 两条 user 消息,前者渲染成第二个气泡并切出空轮次。参照 Claude Code(「Conversation compacted」单行)、Codex(「Context compacted」)、Cursor(摘要分隔线):`compaction.ts` 把只含压缩事件的轮次收成一条 1px 分隔线 + 居中「上下文已压缩 · 耗时」(运行中 accent 转圈、失败 danger 写原因、会话停了没收尾显示未完成),`dropSlashCommandEchoes` 在 `chronological` 层去掉与用户刚输入的同名命令回放及其空 stdout/caveat(终端里跑的命令无输入孪生,保留 `/cmd` 胶囊)。轮次里有其他内容(停止/报错/正文)时保持原渲染。auto-compact 不发这两条事件,仍无提示,另议 | diff --git a/specs/2026-10-socket-singleton-and-rewind-reconcile.md b/specs/2026-10-socket-singleton-and-rewind-reconcile.md index 529b6d7b..92951e79 100644 --- a/specs/2026-10-socket-singleton-and-rewind-reconcile.md +++ b/specs/2026-10-socket-singleton-and-rewind-reconcile.md @@ -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% 复现)