chore(工作区): 第 36 棒续作收口(A2 实例进程内面达成 · A8 改判)

- 拍板①「A」:实例一直在跑(实时视图 running@20001);进程内 /mcn/api/accounts 200 · total:5
  ⇒ A2 实例进程内面达成。纠正上一棒:其判「stopped」所据 PG dsh_instances.status 是滞后失真
- 拍板②「worker 用插件更新机制」:机制已落地且在跑(agent POST /shared-layer/pull + 定时轮询)
  真机对账快照 w-106 @23:52:11:stale:[mcn-suite] + failed:[timeout]
  ⇒ 106 自主拉取成立、该件拉取超时失败 ⇒ A8 由「未取证」改判为「机制在跑 · 该件超时」
- 平台侧问题(拉取超时 / 台账滞后)只报告不改码
- 收尾:R4 临时会话 DELETED=1 / POC_LEFT=0;未启动未停止任何实例
This commit is contained in:
admin committed 2026-09-26 00:36:34 +08:00
1 parent 6ece092782
commit df876aec90
4 files changed
+145

No files matched your search

+25
View File
@@ -933,3 +933,28 @@ try { socket.write(textFrame(text)); return true } // 🔴 返回值被丢弃
### 一句话
**群聊今天就能用(走 443 中继),端口是可选优化**;容量上连接层已能撑 10k 在线;**最该动的不是扩容,而是补扇出背压控制**。产出 ⇒ `交付物/端口与容量瓶颈评估-20260925.md`。⛔ 零代码改动、未部署、未 commit/push、未登记下一棒。
---
## 第 36 棒 · 续作(2026-09-26 00:17–00:4x)· 会话 `p36b-exec-plugin-dataline` · 用户两条拍板落地
### 拍板① =「A」⇒ A2 实例进程内面 ✅ 达成
- 🔴 **纠正上一棒**:实例**一直在跑**(实时视图 `GET /api/admin/users/<uid>/dsh/status` ⇒ `running:true`、`port:20001`);上一棒判「`stopped`」所据的是 **PG `dsh_instances.status`(滞后失真)**。⛔ 本棒**未启动/未停止**任何实例(`launch` 因 folder 口径返回 `bad_path`,无副作用)。
- **进程内读数**:`curl -s --compressed -H "Cookie: dsh_token=<实例 token>" http://127.0.0.1:20001/mcn/api/accounts` ⇒ **200** + **13,155 B** 正文 `{"ok":true,"total":5,"page":1,…,"account_name":"王微斯",…}`;无凭据访问实例根 ⇒ `401 dsh web authentication required`(证明 20001 = 该用户实例 Web)。
- R4 收尾:`DELETE FROM sessions WHERE user_agent='poc-curl2'` ⇒ `DELETED=1`、`POC_LEFT=0`。
### 拍板② =「worker 应该使用插件更新机制」(⛔ 不是给 106 开 ssh 通道)⇒ 机制已落地且在跑
- 源码实证(⛔ 未改一行):worker agent `POST /shared-layer/pull`(带 agent token,`src/worker/agent.ts:812`)+ **启动即拉一次 + 定时轮询**(`:816-819`);注释原话「**`restart dshs-worker` 就等于完成一次共享层同步,⛔ 不必再手工 scp**」;形态 = **节点主动拉(pull)+ 主节点对账告知**(`business-plugins.ts:373-377`),快照落 `<sharedRoot>/.node-sync-reports.json`。
- **真机对账快照**(309 B,`at` ⇒ 2026-09-25 23:52:11 CST,在我 23:22 `share 0.5.1` 之后):`w-106` · `authoritative:4` · `missing:[]` · **`stale:["dsh-plugin-mcn-suite"]`** · **`failed:[{"flat":"dsh-plugin-mcn-suite","error":"The operation was aborted due to timeout"}]`**。
- **判定**:**用户判断成立** —— 106 在自主拉取,不是「没通道」;但**该件拉取超时失败** ⇒ 106 仍为旧版。🔴 **平台侧参数/实现问题**(2.0 MB 包跨云拉取超时)⇒ **只报告不改码**(修复方向:调大超时 / 分块续拉 / 失败退避重试)。
- **A8 改判**:⛔「未取证」⇒ 🟡「**机制在跑 · 该件拉取超时失败(原因码具名)**」。
### 🔴 另一条平台侧发现(值得单独立项)
**`dsh_instances.status` 与实时视图不一致**(台账 `stopped`/`port:null`,实为 `running`@20001)⇒ **它影响一切「实例是否在跑」的判断**(本棒已因此差点误判)。
### 🧰 本机运维坑(本续作实测 · ⏳ 待写进 PLAYBOOK)
1. **`UID` 是 bash 只读内建变量** —— `UID=cce6…` 会报 `readonly variable` 且**赋值静默失败** ⇒ 后续 `curl http://127.0.0.1:$PORT/` 变成 `http://127.0.0.1:/`(**打到 nginx 上,返回 nginx 的 404**,极易误判成"应用没这个路由")。⇒ 变量名避开 `UID`。
2. **`.mjs` 里不能用 `require`**(须 `.cjs`);且**探针的 `catch` 分支必须 `process.exit()`** —— 否则 pg 连接不关,**进程永久挂住**(本续作实测两次 `RC=124`)⇒ 这才是此前「node 探针挂住」的真因,**不是**连接泄漏、更不是 `find` 慢。
3. **响应可能是 gzip** —— `curl` 不加 `--compressed` 时正文是二进制,`grep` 只报 `Binary file matches`、`head -c` 看起来"没输出" ⇒ 取 JSON 一律 `--compressed`。
4. **平台 Web 端口 = `127.0.0.1:3080`**(`dshs.service` MainPID 持有;另持有 `25022–25063` relay dial pool);`20001` 是**该用户实例**端口、`18081` 是 centrifugo、`20001` 之外的 `20001` 无…… ⛔ 别把实例端口当平台端口(本续作实测:对 `20001` 调平台路由得到实例的 `401 unauthorized`)。
@@ -13,3 +13,40 @@
- **收尾**:R10 `ROOT_OWNED_COUNT=0`;R4 临时会话 `DELETED=5`/`POC_LEFT=0`;47 `/tmp/p36*` 清零;本线域锁已释放;本 automation 置 `PAUSED`;⛔ 未登记第 37 棒(撞待拍板 2 项)。
- **交付件**:`$WS/交付物/MCN数据面接入-阶段二-切档与收口-20260925.md`;入口 `§0`/`§2` + `05-交接单/README.md §一` 已更新。
- **教训(下棒必看)**:① `node -e` 的 pg 探针会挂住并泄漏连接(累积 5 个后连 connect 都挂)⇒ 探针一律写独立 `.mjs`,收尾 `pkill -9 -f 'node -e'` 复核归零。② `pkill -f` 命中自身命令行会自杀 ⇒ 用字符类或走 `bash -s` 脚本。③ `dataPlaneConfig()` 无缓存 ⇒ **切档运行时立即生效、不需要重启**。④ 实例 home 目录名 = 带连字符 UUID,属主用户名 = 去连字符。
## 收尾实测(本棒闭环完成 · 2026-09-26 00:0x)
| 项 | 读数 |
|---|---|
| 提交① | `6aa8811` `chore(工作区): 插件投放与分库线收口入库(第 36 棒 · 三表切 platform)`(4 files, +596 −1) |
| 提交② | `6ece092` `chore(交付件): 第 36 棒收口补记(提交 6aa8811 / 推送 / 对账 0 0 / 域锁释放口径)` |
| 推送 | `318430c..6aa8811` / `6aa8811..6ece092` → `origin/master`(`rc=0`) |
| 对账 | `git rev-list --left-right --count origin/master...HEAD` = **`0 0`**;`HEAD = ORIGIN = 6ece092` |
| 禁止项自查 | `FORBIDDEN_CLEAN`(无 `tmp/`、无 `_tmp_seq*`、无 `05-交接单/` 下单子) |
| 域锁释放 | `ME="p36-exec-plugin-dataline" … --release-exec` ⇒ `✓ 已释放域锁(p36-exec-plugin-dataline)`(rc=0,目录已删) |
| 发布锁释放 | ⚠️ **首次不带 `ME=` 被拒**(`✗ 拒绝释放发布锁:未指定会话名` rc=1)⇒ 补 `ME=` 后 `✓ 已释放发布锁(归属已核:p36-exec-plugin-dataline)`(rc=0;`.locks/.publish` 目录已删) |
| ⛔ 未纳入提交 | `.workbuddy/memory/MEMORY.md`(diff **全为他线记忆瘦身**)+ `CODEBUDDY.md`/`state.py`/`.codebuddy/rules/server-ops.md`/`接续入口_IM线_20260922.md`/多个 `?? 交付物/…` —— **均他线在途,本棒未触碰** |
| 本 automation | **本次执行末置 `PAUSED`**;⛔ **未登记第 37 棒**(撞待拍板 2 项:A2 实例进程面 / 106 同步窗口) |
### ⚠️ 新发现(下棒必看)
- 🔴 **释放类命令一律要 `ME=`** —— 实测 `--release-exec` 与 `--release-publish` **都**要求 `ME="<会话名>"`;漏了 ⇒ **fail-closed 拒绝**(`rc=1`,⛔ 不是静默通过)。`--release-skeleton` 同理。
- ⚠️ **一个棒可能需要两次提交** —— 交付件里要写「提交 sha」时无法自指 ⇒ 先按读数提交一次、再补记一次(两次都 push)。
## 续作(2026-09-26 00:17–00:4x · 会话 `p36b-exec-plugin-dataline`)· 用户两条拍板落地
用户回话:**①「A」**(授权启动实例取进程内读数)**②「worker 应该使用插件更新机制」**(⛔ 不是给 106 开 ssh 通道)。
| 项 | 结果 |
|---|---|
| **A2 实例进程内面** | ✅ **达成** —— 实时视图 `running:true`@`20001`(🔴 **纠正上一棒**:其判「`stopped`」所据 PG `dsh_instances.status` 是**滞后失真**)。`curl --compressed -H "Cookie: dsh_token=<实例 token>" http://127.0.0.1:20001/mcn/api/accounts` ⇒ **200** + 13,155 B(`total:5`,与影子读 `hot_accounts 5=5` 一致)。⛔ 本棒**未启动/未停止**任何实例 |
| **A8(106)** | 🟡 **改判** —— 机制**已落地且在跑**(worker `POST /shared-layer/pull` + 启动即拉 + 定时轮询;注释原话「`restart dshs-worker` 就等于完成一次共享层同步」)。真机对账快照 `.node-sync-reports.json`:`w-106` @**23:52:11 CST**(我 23:22 share 之后)`authoritative:4` · `missing:[]` · **`stale:["dsh-plugin-mcn-suite"]`** · **`failed:[{"flat":"dsh-plugin-mcn-suite","error":"The operation was aborted due to timeout"}]`** ⇒ **自主拉取成立、该件拉取超时失败** ⇒ 106 仍旧版。🔴 **平台侧问题,只报告不改码** |
| **平台侧发现** | 🔴 **`dsh_instances.status` 与实时视图不一致**(台账 `stopped`/实为 `running`)⇒ 影响一切「实例是否在跑」的判断 ⇒ 值得单独立项 |
| R4 收尾 | `DELETE … user_agent='poc-curl2'` ⇒ `DELETED=1`、`POC_LEFT=0` |
### 🔴 本续作新增的四个坑(⏳ 待写进 PLAYBOOK)
1. **`UID` 是 bash 只读内建变量** —— 赋值静默失败 ⇒ `$PORT` 变空 ⇒ `curl http://127.0.0.1:/…` **打到 nginx**(返回 nginx 404,极易误判成"应用没这路由")。
2. **`.mjs` 不能用 `require`(改 `.cjs`)+ 探针 `catch` 必须 `process.exit()`** —— 否则 pg 连接不关、**进程永久挂住**(实测 `RC=124`)⇒ **这才是「node 探针挂住」的真因**,不是连接泄漏、更不是 `find` 慢。
3. **响应是 gzip** —— 不加 `--compressed` 时 `grep` 只报 `Binary file matches`、"看起来没输出" ⇒ 取 JSON 一律 `--compressed`。
4. **端口口径**:平台 Web = `127.0.0.1:3080`;`20001` = **该用户实例**;`18081` = centrifugo;`25022–25063` = relay dial pool ⇒ ⛔ 别把实例端口当平台端口。
@@ -322,6 +322,82 @@ NODE_E_BEFORE=5 → PKILL=ok → NODE_E_AFTER=0
**⛔ 未提交的(如实记)**:`.workbuddy/memory/MEMORY.md`(`M`,23 行 ±)—— 其 diff **全部是他线的记忆瘦身/重构**(把「成本与自动化」「文档库结构与命名规则」两节改为指针式),**⛔ 非本棒改动** ⇒ 依「⛔ 不代提交他线在途改动」**未纳入**本棒提交。工作区仓库另有 `M CODEBUDDY.md`/`M state.py`/`M .codebuddy/rules/server-ops.md`/`M 接续入口_IM线_20260922.md` 及多个 `?? 交付物/…` —— **均为他线在途,⛔ 本棒未触碰**。
---
## 九 第 36 棒续作(2026-09-26 00:18–00:3x · 用户两条拍板落地)
> **会话**:`p36b-exec-plugin-dataline`(同棒续作,域锁重领 9 键,`rc=0`)
> **上游**:用户 2026-09-26 00:17 两条回话 —— ①「A」(授权启动实例取进程内读数)②「**worker 应该使用插件更新机制**」(⛔ 不是去开 ssh 通道)
### 9.1 拍板② ⇒ 机制查证:**机制已落地且在跑,106 自己拉**
平台既有机制(源码实证,⛔ 未改一行):
| 事实 | 出处 |
|---|---|
| worker agent 有 `POST /shared-layer/pull`(带 `AGENT_TOKEN_HEADER`) | `src/worker/agent.ts:812` |
| **启动即拉一次 + 定时轮询**(`pullTimer = setInterval`) | `src/worker/agent.ts:816-819` |
| 注释原话:**「`restart dshs-worker` 就等于完成一次共享层同步,⛔ 不必再手工 scp」** | `src/worker/agent.ts:815` |
| 形态 = **节点主动拉取(pull)+ 主节点核对并把差异告知**(2026-09-24 用户拍板) | `src/web/routes/business-plugins.ts:373-377` |
| 对账快照落 `<sharedRoot>/.node-sync-reports.json`(每 host 留最新一条) | 同上 `:379-428` |
**真机读数**(`cat /var/lib/dshs/bundled-plugins/.node-sync-reports.json`,309 B,`rc=0`):
```json
[
{
"hostId": "w-106",
"at": 1790351531536,
"authoritative": 4,
"missing": [],
"stale": ["dsh-plugin-mcn-suite"],
"extra": [],
"failed": [{ "flat": "dsh-plugin-mcn-suite", "error": "The operation was aborted due to timeout" }]
}
]
```
`at` ⇒ **2026-09-25 23:52:11 CST**(`date -d @1790351531`)。
**判定**:🔴 **用户的判断成立** —— 106 确实在走「插件更新机制」自主拉取(23:52 那轮就在我 23:22 `share 0.5.1` 之后),**不是"没通道"**。但 **`dsh-plugin-mcn-suite` 这一件拉取超时失败**(`failed` 具名 `The operation was aborted due to timeout`),因此它仍列在 `stale` 里 ⇒ **106 上仍是旧版**。
**⇒ 这是平台侧参数/实现问题(2.0 MB 包跨云拉取超时),不是本线能力缺口。** 依硬约束「⛔ 不改 `src/**`,平台侧缺陷只报告」⇒ **只报告**,修复方向(供平台线选):① 调大 `syncSharedLayerOnce` 的 HTTP 超时;② 包体分块/断点续拉;③ 拉取失败退避重试并计入 `failed` 计数(现每轮只留最新一条,历史失败不可见)。
### 9.2 拍板① ⇒ A2「真实例进程内」面 **达成**
🔴 **关键纠正**:上一棒判「实例 `status=stopped`(按需启动)」的依据是 **PG `dsh_instances.status`**;而**实时视图**(`GET /api/admin/users/<uid>/dsh/status`)显示:
```
{"running":true,"instance":{"id":"8525b86a-6cf0-446f-8b58-18966696d030","port":20001,"status":"running","restarts":0,"lastCrashedAt":null},"url":"https://admin.ai1net.com/?token=6E4v8cqnn-…"}
```
⇒ **该实例一直在跑(端口 20001)**,台账 `status=stopped`/`port=null` 是**滞后失真**。⛔ 本棒**未启动、未停止**任何实例(`launch` 调用因 folder 口径返回 `bad_path`,未产生副作用)。
**进程内读数**(命令原文 + 输出原文 + 退出码):
| 步骤 | 命令(节选) | 输出原文 | 退出码 |
|---|---|---|---|
| 无凭据探入口 | `curl -s http://127.0.0.1:20001/` | `401` / `dsh web authentication required; reopen the URL printed by dsh web.` | `0` |
| **实例内 MCN 接口** | `curl -s --compressed -H "Cookie: dsh_token=$TOK" "http://127.0.0.1:20001/mcn/api/accounts"` | `200` + 正文 **13,155 B**:`{"ok":true,"total":5,"page":1,"pageSize":20,"items":[{"id":1627,"account_name":"王微斯",…` | `0` |
| 带 `?token=` 同样可达 | `curl -s "http://127.0.0.1:20001/mcn/api/accounts?token=$TOK"` | `200` | `0` |
| R4 清理 | `DELETE FROM sessions WHERE user_agent='poc-curl2'` | `DELETED=1`;`POC_LEFT=0` | `0` |
⇒ **插件在实例进程内真实读到了 5 条账号(`total: 5` = `hot_accounts` 5 行,与影子读 `5 = 5` 一致)** ⇒ 切档后**实例进程内的读路径真的走平台取数口**,A2 全达成。
### 9.3 判据改判(承 §6)
| # | 原判(第 36 棒主体) | **现判(续作后)** | 依据 |
|---|---|---|---|
| **A2** | 🟡 取数口面 ✅/实例进程面 ⛔ | ✅ **全达成** | §9.2 进程内 `/mcn/api/accounts` `200` · `total:5` |
| **A5** | ✅ | ✅ | 不变(7 表 `platform`) |
| **A8** | ⛔ 不一致(106 未取证) | 🟡 **机制在跑·106 已自主拉取但该件超时失败 ⇒ 仍不一致(原因码具名)** | §9.1 `.node-sync-reports.json` |
| 其余 | A1 ✅/A3 ✅/A4 ✅/A6 🟡/A7 ✅/A9 ✅ | **不变** | — |
### 9.4 待平台线处置(⛔ 非本线可改,只报告)
1. `syncSharedLayerOnce` 拉取 2.0 MB 包超时 ⇒ 超时阈值/分块/重试三选项中定夺。
2. `dsh_instances.status` 与实时视图不一致(台账滞后)⇒ 值得单独立项核查(本条**影响到"实例是否在跑"的一切判断**)。
3. 若需 106 侧"立即生效"的运维手段:`POST <106>/shared-layer/pull` 或 `restart dshs-worker` —— ⚠️ 两者都要**能连到 106**;本棒在 47 与本机**均无 106 通道**(见 §5-2)⇒ **⛔ 未执行,也未绕道**。
> ⚠️ **文档库侧的台账不入库**:`$DOC/05-交接单/` 被文档库仓库 `.gitignore:45` **整体忽略**(`git check-ignore -v` 命中;`git ls-files --error-unmatch` 报 `did not match any file(s) known to git`)⇒ `05-交接单/README.md` **未跟踪、不入库**。🔴 该台账**只存磁盘**(+服务器镜像),⛔ 不能靠 git 保全。本条**实测推翻**工作区 `MEMORY.md` 旧记「已跟踪的 `05-交接单/README.md` 不受影响」。
@@ -9,6 +9,11 @@
## §0 状态(**最新一行 = 执行依据**)
- 🔴 **2026-09-26 00:17–00:4x|第 36 棒 续作(用户两条拍板落地,`p36b-exec-plugin-dataline`)—— A2「真实例进程内」面 ✅ 达成 · A8 改判「机制在跑 · 该件拉取超时」· ⛔ 本条不新增下一棒** ——
**拍板① = A(启动实例取进程内读数)**:🔴 **纠正上一棒** —— 实例**一直在跑**(端口 `20001`;实时 `GET /api/admin/users/<uid>/dsh/status` ⇒ `running:true`),上一棒所据 **PG `dsh_instances.status=stopped` 是滞后失真**。⛔ 本棒**未启动、未停止**任何实例。**进程内读数**:`curl --compressed -H "Cookie: dsh_token=<实例 token>" http://127.0.0.1:20001/mcn/api/accounts` ⇒ **`200`** + 13,155 B 正文(`{"ok":true,"total":5,"page":1,…,"account_name":"王微斯",…}`))⇒ `total:5` 与影子读 `hot_accounts 5=5` 一致 ⇒ **A2 全达成**。
**拍板② = 「worker 应该使用插件更新机制」(⛔ 不是给 106 开 ssh 通道)**:机制**已落地且在跑** —— `src/worker/agent.ts:812` `POST /shared-layer/pull`(带 agent token)+ `:816-819` **启动即拉一次 + 定时轮询**;源码注释原话「**`restart dshs-worker` 就等于完成一次共享层同步,⛔ 不必再手工 scp**」;形态 = **节点主动拉(pull)+ 主节点对账告知**(`src/web/routes/business-plugins.ts:373-377`),快照落 `<sharedRoot>/.node-sync-reports.json`。**真机对账快照**(`at` ⇒ **2026-09-25 23:52:11 CST**,即我 23:22 `share 0.5.1` 之后):`w-106` · `authoritative:4` · `missing:[]` · **`stale:["dsh-plugin-mcn-suite"]`** · **`failed:[{"flat":"dsh-plugin-mcn-suite","error":"The operation was aborted due to timeout"}]`** ⇒ **106 确实在自主拉取,不是「没通道」**;但**该件拉取超时失败** ⇒ 仍为旧版 ⇒ **A8 由「未取证」改判为「机制在跑 · 该件超时失败」**。🔴 **属平台侧参数/实现问题**(2.0 MB 包跨云拉取超时)⇒ 依硬约束**只报告**(修复方向:调大超时 / 分块续拉 / 失败退避重试)。
🔴 **另一条平台侧发现(值得单独立项)**:`dsh_instances.status` 与实时视图**不一致**(台账 `stopped`/实为 `running`)—— **它影响一切「实例是否在跑」的判断**。
📂 读数与命令原文 ⇒ `交付物/MCN数据面接入-阶段二-切档与收口-20260925.md` **§9**;R4 收尾 `DELETE … user_agent='poc-curl2'` ⇒ `DELETED=1`、`POC_LEFT=0`。
- 🔴 **2026-09-25 23:10–23:5x|第 36 棒 · 执行棒 收口(`p36-exec-plugin-dataline`)—— ①–④ 全达成 · ⑤「47 侧切档」达成 · ⛔ ⑤「实例重启/106」未达成 ⇒ A8 如实记「两机不一致」;⛔ 未登记下一棒(等拍板)** ——
① ✅ **修 `canonicalJsonText()` 键序敏感**:新增 `sortKeysDeep()` + 导出 `canonicalStringify()`(对象键**递归升序**、数组**保序**),三形态归一出口全改走它 ⇒ 单测 **67/67**(新增第 59 条)+ 本机等效证明 **10/10**(含「旧算法判不等 → 新算法判等」与「字符串形态零回归」四例)。⛔ 落库原文零改动。
② ✅ **出包 `0.5.1`**:`2,018,751 B`/**324 条目**/md5 **`56c17c7e41a18704922e18d75816da59`**;包内 `store.js` sha256 与本机逐字一致 → 上池 `200`(`compat.level=ok`)→ 台账 **`state=ready`** → 结构预演 `ITEMS=[]` → share **`200 action:"replaced" version 0.5.1`**;47 共享层 `store.js` md5 **`62384d4d…`=本机逐字一致**(`canonicalStringify_COUNT=4`);回滚素材 `0.5.0.tgz` 在位。
@@ -455,6 +460,8 @@
### 🗃️ 本轮动作(**第 36 棒 · 执行棒 · ✅ 已收官 23:5x** —— 仅供追溯,⛔ 不要按它开工;**下一棒未登记(等拍板)**)
> 🟢 **第 36 棒续作(2026-09-26 00:17 用户两条拍板)**:**① A 案 ⇒ A2 实例进程内面达成**(实例一直 running@20001;`/mcn/api/accounts` `200` · `total:5`;上一棒所据 PG 台账 `stopped` 是滞后失真);**② 「worker 用插件更新机制」⇒ 机制已落地且在跑**(worker `POST /shared-layer/pull` + 定时拉),真机对账快照 `w-106` **`stale:[mcn-suite]` + `failed:[timeout]`** ⇒ **自主拉取成立、该件拉取超时失败** ⇒ A8 改判。⛔ 平台侧问题(拉取超时/台账滞后)**只报告不改码**。详解 ⇒ 交付件 **§9**。
> 📦 **第 36 棒已收官**(`p36-exec-plugin-dataline`):**①–④ 全达成**(修 `canonicalJsonText()` 键序敏感+单测 67/67 → 出包 `0.5.1`+上池+发布共享层 → 删本地 5 条冗余行 39→34 → 影子读**三表全 match、内容 34/34 差异 0**);**⑤ 仅「47 侧切档」达成**(**7 表 `platform`**,A5 达成;A2 切档后读路径全 OK)。
> ⛔ **未达成 2 项**:A2「真实例进程内」面(实例 `stopped`,未启动 —— 直调 worker `/launch` 会绕过控制面台账,主动不做)|**106 同步+合并重启**(ssh `Permission denied (publickey)`,无通道)⇒ **A8 如实记「两机不一致」**。
> 🔴 **③ 的口径偏差(务必先读交付件 §4.1)**:迁移工具 `SELECT *` 无 `ORDER BY` ⇒ 平台留下 `id` **较小**那份,与本地读路径(`id DESC`)**相反** ⇒ 5 组里 **2 组删的是 `id` 较大(较新)那一行**(删 40 留 20/删 28 留 27),否则 ④「内容全绿」达不成;清单已具名列出。