chore(工作区): 纳入版本控制基线(回收 411 MB 过程产物)

回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复:
- 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录)
- tmp/(32.4 M,按接续棒命名的过程临时区)
- .workbuddy/tmp/(39.5 M)
- 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物)
- tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留

入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与
接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、
.workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。

排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、
打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
This commit is contained in:
admin committed 2026-09-24 07:51:03 +08:00
commit ce8e6ceed9
396 files changed
+66045

No files matched your search

@@ -0,0 +1,33 @@
# automation `89e11630` · IM 线 · 第 12 棒(执行棒 · 动工连接层 B 案)
> 只记高层摘要。细节 ⇒ 当日日志 `.workbuddy/memory/2026-09-23.md` 的 `19:1x–19:4x` 节。
> 线:IM 线 | 工作区:`E:\ProgramData\AI技能\aliyun-dsh-server` | 代码基线:`D:\github\dsh_shenxian`
## 2026-09-23 19:12–19:4x — ✅ 完成(首次执行)
**任务**:按入口 §2「第 12 棒」自包含段落地 **连接层 B 案**(外引连接层)—— 中立抽象 + 保活垫片 + 两后端 + 容量表。⛔ 未部署(守边界)。
**产出(代码面 5 新 3 改)**
- 新增 `src/im/connection-backend.ts`(连通层中立抽象:能力自述 / `selectConnectionBackend` / `planKeepalive` / `assertCapabilities`)· `src/im/keepalive.ts`(`ImKeepaliveShim`,单扫描器 + **每连接 deadline**)· `src/im/backends/native.ts` · `src/im/backends/gateway.ts` · `test/im-connection-backend.test.mjs`(28 例)· `poc/im-connection-gateway/`(参考部署)。
- 改 `src/im/hub.ts`(新增 `ImFanoutPort`,**纯重构**:未注入 ⇒ 与第 6 棒逐字节一致)· `src/web/routes/im.ts`(`fanoutSlot` 晚绑定破环;stats 增后端信息)· `package.json`。
- 回填 `交接单/IM群组-稳定性机制与框架选型.md` **§十五**(§十四 未动)。
**三条硬实现项全部满足**:① 保活锚点 = 每连接 `open` 时刻 ② 复用既有 `ImWsRuntimeOptions`/`ImUpgradeDispatch` 接缝,`src/im/**` 无外部产品名(测试强制)③ 容量表(10k⇒1×2 GiB / 100k⇒2×4C8G / 1M⇒13×4C8G)。
**验证**:`build` rc=0 | 新测试 **28/28** | `npm test` **476 过 / 0 败 / 2 skip** | `check-layering` rc=0 无新增违规 | `smoke:subdomain` OK。
**🔴 关键实证(106 真机)**
- **E-7 三分对照(10k)**:`off` ⇒ 10000→0(t=26 s 全断)|`global` ⇒ 掉 **2517**(E-2 记 2773,独立复现)|`conn` ⇒ **0 掉线**。⇒ 把 E-2 的「26 s 全断」做成**机制解释**,并固化为 `assertCapabilities` 结构约束。
- **E-6 与 E-2 对账(5 跑)**:扇出离散度中位 19.07/51.23/99.12 ms vs 17.2/57.9/97.8 ⇒ **B 案立论未被推翻**;内存中位 663.6 MiB(−11.5%)。⚠️ P99 高 6~49%,**原因未定位** ⇒ 只判「离散度中位 + 内存中位」等效。⚠️ 验收口径更正:`e2sum.py` 的 `hbTimeoutRate` 结构性非零 ⇒ 权威判据 = 「`num_clients` 不掉 + worker `closed=0`」。
**🔴 P0(本轮发现 · 未修 ⇒ 交第 13 棒)**:E 单 client bundle 与平台 `/api/im/ws` **协议不一致**(客户端 `{type:'subscribe'/'ping'}` + 按 `msg.type` 分支;平台读 `msg.op` ⇒ `reject('bad-op')` + `socket.destroy()`)⇒ **投放后必然「连上即断、零消息」**,且堵住客户端侧保活接线。
**收尾五件**:① 回填 ✅ ② 域锁 `IM线-第12棒` 已 `--release-exec` ✅(复核 `.locks/` 为空)③ 下一棒已登记 = `31f0b0d7-f652-4081-88d0-3aec69136949`(第 13 棒 · 修 P0)✅ ④ 入口 §0 新行 + §2 推进 ✅ ⑤ 当日日志已追加 ✅。
**顺带办掉一条跨线缺口**(入口第 136 行的收口要求):E 单投放面此前"两不管" ⇒ 已在**投放线入口 `接续入口_插件投放与分库线_20260922.md` §5「本线后续」新增第 5 条**(写明"是什么 / 为何以前没人做 / **硬阻塞 = 本棒 P0** / 投放前须先等第 13 棒修完")+ **改正该入口 §0 末行「automation 不可用」的过时前提**(库 18:55 已由 app 重建;实测 `mode=list`/`create` 均可用)。⚠️ 该投放的**归属仍未认领** ⇒ 已列进本线 §2「第 13 棒」连带待办。
**⚠️ 留给后续棒的坑**
- 第 12 棒**只声明了 `poc/im-connection-gateway` 域** ⇒ 第 13 棒**抢锁域必须含 `poc/im-conversation-tabs`**(该域当时未在锁内),⛔ 别照抄上一棒的域清单。
- **编辑入口时误删 §3 标题**(`## §3 已取事实…`)⇒ 本轮已复原,`grep "^## §"` 复核 §0–§6 齐全。教训:用 Edit 插块时 ⛔ 不要把**下一节的标题行**当 `old_string`。
- E 单投放面仍**无人认领**(投放线入口 `im-conversation-tabs` 零命中)⇒ 须显式登记到投放线或本线自行排棒。
- 本 automation 库 09-23 18:55 被 app 重建过(历史记录全丢)⇒ 本轮 `mode=list` 实测**可写**,无需走入口 §2「手工接力」替代路径。