chore(工作区): 插件投放与分库线收口入库(第 36 棒 · 三表切 platform)

- ① 修 canonicalJsonText() 键序敏感(新增 sortKeysDeep + 导出 canonicalStringify)⇒ 单测 67/67、本机证明 10/10
- ② 出包 0.5.1(2,018,751 B / 324 条目 / md5 56c17c7e41a18704922e18d75816da59)→ 上池 → share 200 action:"replaced"
- ③ 删本地 5 条重复 aweme_id 旧副本 ⇒ account_video_source 39 → 34(留档 .bak + dump + export-dup5.json)
- ④ 影子读全绿:34=34 / 362=362 / 5=5;三表 match=true;正文 34/34 · 分析 34/34 · 差异 0
- ⑤ 三表切 platform ⇒ 实例 data-plane.json 7 表全 platform;A2 取数口面 TOTAL_WRITES=0
- ⛔ 未达成:A2 真实例进程内(实例 stopped,启停属控制面职责);A8 两机一致(106 无 ssh 通道)
- 收尾:R10 ROOT_OWNED_COUNT=0;R4 临时会话 DELETED=5 / POC_LEFT=0;47 /tmp/p36* 清零

交付件 = 交付物/MCN数据面接入-阶段二-切档与收口-20260925.md
This commit is contained in:
admin committed 2026-09-26 00:05:19 +08:00
1 parent 318430c9e9
commit 6aa8811086
4 files changed
+596 -1

No files matched your search

@@ -9,6 +9,20 @@
## §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` 在位。
③ ✅ **删本地 5 条冗余副本(拍板①)**:**先双份留档**(`sqlite3 .backup` ⇒ 2,383,872 B/sha256 `ee75df4a…`;全表 dump 39 行/sha256 `fdfd8fa4…`;5 组原样含正文 `export-dup5.json` 542,624 B/sha256 `b0e560ca…`;本机副本在 `$WS/tmp/p36/`)⇒ 再删 `id = 40,28,29,31,32` ⇒ **39 → 34 行**、`KEY_DELTA lost=[] extra=[]`、`integrity_check=ok`;⛔ 库文件在位未删、属主未变、别的表一行未动。⚠️ **插件既有删除路径不适用**(`removeVideoSource` 按 `aweme_id` 删**整组** ⇒ 会误删保留行)⇒ 用最小 SQL + 四条 fail-closed 断言。
④ ✅ **影子读重取**:三表 A1 **34=34 / 362=362 / 5=5**(`onlyLocal=[] onlyPlatform=[]`)· SHADOW 三表 **`match=true`**、`degraded=false` · `account_video_source` **逐行内容「正文 34/34 · 分析 34/34 · 差异 0」(第 35 棒为 23/34 不等 ⇒ ① 的修法真机确认)** · `PACKED_LEFTOVER=0` · `TOTAL_WRITES=0`。
⑤ 🟡 **47 侧切档达成**:三表切 `platform`(读写同切)⇒ 实例档位 **7 表 platform**(**A5 达成**)· 第四批三表仍 `local` · 属主 = 实例 uid · 原文件已备份 `data-plane.json.bak-p36-1790350596159`。📌 **生效机制实测**:`dataPlaneConfig()` **每次调用读文件**(无内存缓存)⇒ 切档**运行时立即生效、不需要重启**。A2 切档后面:三表 `source=platform` 全 OK、`TOTAL_WRITES=0`。
⑤ ⛔ **未达成两项(具名)**:**(甲)** A2「**真实例进程内**」面 —— 目标实例 `dsh_instances.status = "stopped"`(平台**按需启动**);本棒未启动它:Manager 侧未找到启停路由,worker agent `POST /launch`(`127.0.0.1:19100`)**属控制面职责** ⇒ 直调会绕过 Manager 的 `epoch/lease` 台账(状态漂移,R11)⇒ **主动不做**。**(乙)** **106(`w-106` / `106.54.21.172`)同步 + 合并重启** —— 47 与本机 ssh 106 **均 `Permission denied (publickey)`**、47 亦无法直连其 `19000`(`overlay` 台账 `via: "relay"`)⇒ **无可用通道**。
📊 **A 判据**:**A1 ✅**(三表全一致)· **A2 🟡**(取数口面=第 35 棒 + 切档后读路径面 ✅;真实例进程面 ⛔)· **A3 ✅**(`157 / 8 / 10`;本棒**未改任何调用点** ⇒ 第 34 棒「平台档路径零命中 + 三类具名豁免」结论**逐字沿用**)· **A4 ✅**(`0 / 10`)· **A5 ✅**(7 表)· **A6 🟡**(库文件在位未删、属主未变;sha256 因**授权删行**必然变化,回滚靠 `.bak` + dump)· **A7 ✅ 免跑**(`lib/client.js` mtime 09:47,本棒改动面仅 `store.js`/`tests`/`package.json`/`dist`)· **A8 ⛔ 不一致**(47 代码面=运行面=`0.5.1`;**106 未取证**)· **A9 ✅ = 23(零新增)**。
🔴 **本棒动过生产**:47 共享层投放 `0.5.1` + 实例库**删 5 行**(已授权)+ 实例档位切 **7 表 `platform`**。⛔ **未启动/停止任何实例**、⛔ **未触碰 106**、⛔ **未改 `D:/github/dsh_shenxian/src/**`**、⛔ **未删库文件/未重建库**。
🔴 **新发现(未闭合 · 插件侧)**:`tools/migrate-local-to-platform.mjs` 的 `SELECT *` **无 `ORDER BY`** ⇒ 平台折叠时保留 `id` **较小**那份,而本地读路径 `ORDER BY id DESC LIMIT 1` 取 `id` **最大** ⇒ **同一行在两处的"权威版本"不同**(本次影响 2 组)。⚠️ **因此 ③ 的删除口径如实偏差**:5 组里有 **2 组删掉的是 `id` 较大(较新)那一行**(`aweme_id 7658997937279683855` 删 40 留 20;`7648947073131625905` 删 28 留 27),这 2 组差异 = 值内 2 字节**字面 `\n`**;若按字面「删 `id` 小的」,本地剩余内容与平台**不一致** ⇒ ④ 判据达不成。**该判定属内容取舍,清单已具名列出供复核**(交付件 §4.1)。
📌 交付件 = `$WS/交付物/MCN数据面接入-阶段二-切档与收口-20260925.md`(结论/①–⑤ 状态/A1–A9 命令+输出+退出码/**判定表与偏差说明**/未达成 5 条/卫生与域锁)。
🧹 **卫生**:R10 全程 `ROOT_OWNED=0`(收尾再复核)· 临时会话清理读数见交付件 §8 · 47 侧 `/tmp/p36*` 已清(本机留档留 7 天)。
⛔ **未登记下一棒(第 37 棒)** —— 剩余两项**要用户拍板**:**(i)** 106 的 ssh 凭据/授权通道;**(ii)** 实例何时启(用户下次访问门户即**自然启动**并加载 `0.5.1` + 新档位)。按规则「要用户拍板的,等拍了再新建接续会话」⇒ **等拍板**。
- 🟢 **2026-09-25 22:44|第 35 棒后续 · 用户拍板两条(`p35-exec-plugin-dataline`)—— ① 本地 5 组重复 `aweme_id` 处置 = **A 案「删本地 5 条旧副本」**(不可逆 · 已授权)|② 插件包源码 = **B 案「不纳入版本管理」** ⇒ 改为定期打压缩包备份,**已落地**:固定目录 `E:/dsh-backups/plugin-src/`(`backup.sh` + 基线包 `mcn-suite-src-20260925-2246-v0.5.0.tgz`/6,065,179 B/330 文件/md5 `247dd145…`)+ 每周自动备份 automation `1e3c9070-a75d-4ae4-b81e-06e2eb20a5b4`(周日 03:30 · 内容摘要去重 · 保留最近 26 份)。🔴 **两条拍板已注入第 36 棒 prompt ⇒ ⑥ 可闭环、⑦ 可执行、⛔ 不再重问**。**
- 🔴 **2026-09-25 22:5x|第 35 棒 · 执行棒 收口(`p35-exec-plugin-dataline`)—— ①–⑤ 全达成 · ⑥ 未全绿 ⇒ ⛔ 未切档 · ⑦ 整条留给第 36 棒 · 已登记第 36 棒** ——
@@ -439,7 +453,12 @@
## §2 现状(本会话已核实 / 已定稿,执行棒复核时**只读**)
### ⏭️ 本轮动作(**第 36 棒 · 执行棒 · 已登记 `23:10`** · 接续第 35 棒;上游 = §0 顶部 **22:44 拍板行** + 22:5x 收官行 ⇒ **两条待拍板已到手,条件步转无条件**)
### 🗃️ 本轮动作(**第 36 棒 · 执行棒 · ✅ 已收官 23:5x** —— 仅供追溯,⛔ 不要按它开工;**下一棒未登记(等拍板)**)
> 📦 **第 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),否则 ④「内容全绿」达不成;清单已具名列出。
> 📌 交付件 = `$WS/交付物/MCN数据面接入-阶段二-切档与收口-20260925.md`。⛔ **下一棒(第 37 棒)未登记** —— 剩余两项要用户拍板(106 通道 / 实例启动时机)。详版见 §0 顶部行。
> 📦 **第 35 棒(执行棒)已收官**:①–⑤ 全达成(处方 (a) 落码 + 单测 66/66 → 出包 `0.5.0` → 上池+发布共享层 → 加列迁移 2 条 `ADD COLUMN` → 回填 `local_id`);**A2(平台取数口面)达成**(三表 7 步读写全 200 · 6 负例全 `bad-args` · PG 残留 0);**⑥ 未全绿** ⇒ **停住不切档**,**⑦ 整条未执行**;🔴 根因两条(本地 5 组重复 `aweme_id` / `jsonb` 键序 × `canonicalJsonText()` 假阴性)⇒ 交付件 `$WS/交付物/MCN数据面接入-阶段二-B案落地与shadow读数-20260925.md`。