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:
commit
ce8e6ceed9
396 files changed
+66045
No files matched your search
@@ -0,0 +1,44 @@
|
||||
# 覆盖网络线 · 序 ⑭ 执行棒(automation `3e0a7b01`)— 运行记忆
|
||||
|
||||
> 用途:下一棒开工前扫一眼,确认本棒没有遗留「未落盘的状态 / 未告知的拍板」。
|
||||
> ⛔ 只记高层结论与指针,不复制正文。
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-17 15:53–16:1x · 第 1 次运行 —— ✅ 全部完成(收官)
|
||||
|
||||
**任务**:序 ⑭「修掉 relay 流上的 HTTP keep-alive 复用这条数据面缺陷」**执行棒**,按入口 §2 + `交接单_观测口径与在册缺陷_20260917.md` §9.3 开工。
|
||||
|
||||
**结果**:✅ **缺陷已修并端到端验收**;改动只有 **2 个文件**、**未改任何生产值**、零 commit / push、零上抛、收口 5 件全办。
|
||||
|
||||
**核心成果(一句话)**:真因 = **`src/net/relay/client.ts#openStream` 里多挂了一行 `duplex.on('data', …)`**,把**读侧接回了出向** ⇒ agent 的响应被原样回灌进 agent socket ⇒ agent 拿 `HTTP/1.1 200 OK` 当请求行 ⇒ Fastify `clientError` 回 `400`(写裸 socket、不写 pino 日志)⇒ **任何 `via='relay'` 的 host(w-106)用户 `POST /api/dsh/enter` 必 500、「登录直达」整体不可用**。**修法 = 删掉那一行**(出向唯一入口本就是 `_write`→`onOut`;`duplex.write()` 与 `tcp.pipe(duplex)` 走同一条路)。
|
||||
|
||||
**关键指针**:
|
||||
- 证据 = 交接单 **§10**(10.1–10.10 全节);`--scene all` 原文 = 本地 `/tmp/seq14-scene-all.txt`。
|
||||
- 验收原文:guest `enter` **200 / 200**(同连接 ×2,instance port=21000 running);已分配池口 25000 同连接 ×3 = **200/200/200**;`npm test` **160 pass / 0 fail / 1 skip**;`--scene all` **12 PASS / 0 SKIP / 0 FAIL**;`overlay-probe` **12/12**。
|
||||
- 指纹:`src/net/relay/client.ts` = **`6ffb117f3f6df1c2456641e176529ce8`**|`test/relay.test.mjs` = **`14aa2808bc6446d34af19306d43c4e8d`**(1149 行)|部署产物 = **`b8b29afba06ed6347cbefd29091f8c73`**(远端 5 处同值)|交接单 §8 前缀 **`3ece0f870cba67d0113a4c5f9de9d812`(未变)**|参数表 **`8f08e74b026e6e5b5e1b3db813f031ae`(未变 ⇒ D1 自证)**。
|
||||
- 部署备查:远端各留 `.bak-20260917-1558xx`;**只重启了 47 的 `dshs`**(拨号方);`dshs-relay` / 106 `dshs-worker` 未重启。R7 传播面自证 = 铺前逐文件对账 ⇒ **Δ 只有 `client.js` 一个文件**。
|
||||
|
||||
**🔴 本棒留给下一棒的三条硬事实**:
|
||||
1. **缺陷 B(新发现,未修)** —— 拨号池**未分配**槽位被**任意一条连接**碰到 ⇒ `dialer.ts#onConn` 只 `slot.server.close()` + `tcp.destroy()` 却**不把槽位从 `slots` 摘掉** ⇒ 该槽位**永久死亡**,而 `localPortFor()` 的 `slots.find(s => s.key === undefined)` **下次还会选中它** ⇒ `ECONNREFUSED` ⇒ `enter` 回 500 `fetch failed`。跑象:池报"64 个口"而 `ss -lntp | grep -cE ':25[0-9]{3} '` = **63**。
|
||||
2. ⛔ **绝不要对「未分配」的池口发任何连接** —— 那正是缺陷 B 的**触发器**(本棒自己踩过一次,把 `25000` 打死了)。要打池口:**先用一次真实 `POST /api/dsh/enter` 把落点分配出来**,再从日志 `[relay-dialer] 落点 127.0.0.1:<口> -> <逻辑名>:<端口>` 取**已分配**的口号。若不慎打死 ⇒ `systemctl restart dshs` 拿干净池。
|
||||
3. **Q4 缺口扩大**:`src/net/relay/**` untracked ⇒ **本棒的修复(`client.ts`)与回归用例(`test/relay.test.mjs`,也是 `??`)只存在于工作区、不在版本库里** ⇒ commit / push 仍需用户授权(本棒未获授权,未动)。
|
||||
|
||||
**下一棒登记**:automation id **`1933b18a-0c2a-46a2-829c-440a900fed08`**「覆盖网络线-序15执行棒-拨号池槽位自毁缺陷B修复」(一次性,`scheduledAt` = 2026-09-17 **16:14** = 收口 +4 min,`nextRunAt` = 1789632840000)。已用陈述句告知用户并落盘到入口 §0/§2 与 `MEMORY.md` 在途单。
|
||||
|
||||
**边界遵守**:⛔ 未 commit / 未 push(`git status` = 43、`src/` = 20 **均为既有基线**,Δ0;⚠️ 但注意 relay 目录是 untracked ⇒ **别拿"总数没变"当"没改文件"的证据**)|⛔ 未改参数表 / 未动 `RELAY_FAILOVER_*`·`HB_SEC`·burst|⛔ `COOLDOWN_MS` 置 0 本机与 47 均 **0 命中**|⛔ 未动 Q4 / Q5(只报告)|⛔ 未改 `package.json`|⛔ 未重启 106 worker / relay|R4 收尾:`DELETE 1` ⇒ `sessions` 回基线 2。
|
||||
|
||||
**收口清单核对**:① 释放锁 ✅ ② 陈述句告知 + 登记下一棒 ✅ ③ 入口 §0 + §2 推进到序 ⑮ ✅ ④ 工作区日志 `.workbuddy/memory/2026-09-17.md` ✅ ⑤ 交接单追加 §10 ✅ ⑥ 本文件 ✅。
|
||||
|
||||
---
|
||||
|
||||
## 运行须知(给后续复跑的同类棒)
|
||||
|
||||
- 本 automation **是一次性的**,已执行完毕 ⇒ ⛔ 不要重启它;若需再跑,另建新棒。
|
||||
- 开工前先跑 `state.py` + 扫最新两条 automation memory(防漏掉别人留下的拍板)。
|
||||
- 🔴 **`duplex` / `MuxDuplex` 上必须挂 `'error'` 监听** —— `RelayClient#onDown` 会走 `teardownDialStreams()` → `duplex.destroy(new Error('link down: …'))`,**没有监听就是 uncaughtException**(表现极具误导性:**用例自己 pass、整个测试文件却 fail**,node:test 报 "async activity after the test ended")。生产侧 `dialer.ts` 有同形监听。
|
||||
- 🔴 **判"某条流方向对不对"要逐帧记账,别只看总量** —— 本缺陷靠 `dialRoundTrip` 那种"凑够长度就 resolve"的辅助函数**永远抓不到**(多出来的回声没人看)。T23 的做法:把目标端收到的字节分 `requests` / `garbage` 两桶记。
|
||||
- 🔴 **`overlay-probe` 必须带 `--table "<工作区根>/参数表_覆盖网络_20260917.md"`** —— 不带会因参数表不在代码仓根而报「找到 0 个参数表」。
|
||||
- 🔴 **`--scene all` 会停/起 47 与 106 的 relay 并把 Manager 归零到 47(含一次 `dshs` 重启)** ⇒ 跑完要重新确认池口状态;**演练后池口全是未分配态,此时打任何池口都会触发缺陷 B**(本棒踩到)。
|
||||
- 🔴 **判定"服务是否正常"要看 `systemctl is-active dshs dshs-relay dshs-pg`** —— 演练进行中 `dshs-relay` 会是 `inactive`,那是**幕的正常态**,不是故障。
|
||||
- 🔴 **对 106 的 ssh 偶发 `rc=255`**(MaxStartups 被外部爆破限流)⇒ 脚本里的 ssh 一律写 `2>/dev/null` 并容许单次重试;⛔ 放宽限流命中 R5 ⇒ 只报告。
|
||||
Reference in new issue
Block a user