chore(工作区): 插件投放与分库线收口入库(第 35 棒 + 22:44 拍板落盘)
范围 = 本线(插件投放与分库线)产物 + 记忆类,共 27 件:
- 接续入口_插件投放与分库线(1 件):§0 新增 22:44 拍板行;§2 第 36 棒范围改 5 步、条件步转无条件
- 交付物(22 件):MCN 数据面接入阶段一/阶段二系列(含 B 案落地与 shadow 读数)、
P0 修通与移动端真机验收、pnpm-EPERM、两机 lib 差异、共享层台账语义、
基础插件身份与回滚、插件接入验收、插件数据面取数口、移动端迁包与字号扩面、跨机错误消息
- 记忆(4 件):2026-09-24 / 2026-09-25 日志、MEMORY.md、本棒 automation 执行记录
⛔ 未含他线在途改动(只报告、不代提交):机制层 CODEBUDDY.md / state.py /
.codebuddy/rules/server-ops.md、接续入口_IM线、接续入口_StoryForge验收线、
其余 29 个 automation 目录、docs/规则与载体/、归档/、接续包_*。
This commit is contained in:
1 parent
c1461fd958
commit
318430c9e9
27 files changed
+5649
-72
No files matched your search
@@ -0,0 +1,123 @@
|
||||
# 插件接入验收(静态面·用 MCN 插件)+ MCN 工作台移动端独占屏幕(2026-09-25)
|
||||
|
||||
> **一句话**:① 拿**真插件**(`dsh-plugin-mcn`)走了一遍接入的**静态面验收** —— 声明过校验、库名换算正确、
|
||||
> DDL 正确,同时抓出**两条会让人返工的实测结论**;② 修掉"MCN 工作台在移动端一半会话一半插件、没法用"
|
||||
> —— 窄屏改为**独占**;③ `08-插件开发与对接规范` 新增 **§4-补 移动端 / 窄屏兼容(硬要求)**。
|
||||
> **两件都未部署**(本机无 PG、无容器 ⇒ 真机验收与部署合并为下一棒)。
|
||||
|
||||
---
|
||||
|
||||
## 一、接入验收(静态面)—— 用真插件跑平台真校验器
|
||||
|
||||
**跑法(可复现)**:
|
||||
|
||||
```bash
|
||||
node 交付物/插件接入验收-静态面-20260925.mjs # 默认插件 = D:/dshworkspace/plugin_package/dsh-plugin-mcn
|
||||
node 交付物/插件接入验收-静态面-20260925.mjs <插件包目录> # 换插件
|
||||
```
|
||||
|
||||
判据来源**不是**本仓库单测,而是**平台真实现** `lib/db/plugin-data/schema.js`(与门户「检测第 3 项」同一个函数)
|
||||
⇒ 这就是"插件会话照文档做"会遇到的同一套校验。脚本**只读**:不建库、不连 PG、不改插件包、不上传。
|
||||
|
||||
### 验收结果(全绿)
|
||||
|
||||
```
|
||||
声明来源 origin = yaml-file ← 必须由 package.json 的 dsh.data.schema 指向
|
||||
✅ 声明通过校验:3 张表 · schemaVersion=1 · source=./dsh.data.yaml
|
||||
✅ hot_accounts scope=user · 12 列 · 2 索引 · 物理名 p_dsh_plugin_mcn_hot_accounts
|
||||
✅ account_videos scope=user · 15 列 · 2 索引 · 物理名 p_dsh_plugin_mcn_account_videos
|
||||
✅ account_analysis scope=user · 5 列 · 1 索引 · 物理名 p_dsh_plugin_mcn_account_analysis
|
||||
✅ 库名换算:dsh-plugin-mcn ⇒ dshs_pl_dsh_plugin_mcn(过白名单 ^dshs_pl_[a-z][a-z0-9_]{0,40}$)
|
||||
✅ 声明自算库名与换算一致(运行时「库名不一致即拒」判据的正面用例)
|
||||
✅ 每张表都是「(归属列, 声明第一列)」复合主键 —— ⛔ 无代理自增 id
|
||||
✅ 归属列已由内核补齐(scope:user ⇒ user_id)
|
||||
```
|
||||
|
||||
**建库后库内 DDL(8 条)**:3 张表 + 5 个索引,形如
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS "p_dsh_plugin_mcn_hot_accounts" (
|
||||
"user_id" TEXT NOT NULL, "created_at" BIGINT NOT NULL, "updated_at" BIGINT NOT NULL,
|
||||
"account_key" TEXT NOT NULL, … , PRIMARY KEY ("user_id", "account_key"));
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "p_dsh_plugin_mcn_hot_accounts_account_key_uq_1" ON … ("account_key");
|
||||
```
|
||||
|
||||
### 🔴 验收抓出的两条实测结论(**会让人返工,已回写文档**)
|
||||
|
||||
1. **只把 `dsh.data.yaml` 放进包里 = 不生效**。本次第一跑 `origin = none` —— 因为没有 `package.json` 的
|
||||
`dsh.data.schema` 指向。平台**不自动探测**该文件名(`schema.ts:701-746` 现读)。
|
||||
⇒ `08 规范 §3-1` 已写这条(**我这次是没先读文档才踩的,反证该条写得对**);同时提醒:`files` 字段
|
||||
也要带上 `dsh.data.yaml`,否则 `npm pack` 不打包它。
|
||||
2. **存量表的自增 `id` 不能照搬**。数据面主键 = `(归属列, 声明第一列)`,**没有代理 id 列**
|
||||
⇒ MCN 原有的 `id INTEGER PRIMARY KEY` 必须换成**业务键**(本次声明用 `account_key` / `aweme_id` /
|
||||
`analysis_key`,取值规则 = `<账号名>` 或 `<账号名>:<时间戳>`)。这是"存量插件接入"最先撞的一堵墙。
|
||||
|
||||
### 验收同时得到的"接入前置条件"读数
|
||||
|
||||
**红线扫描(`DB-03 §二`)命中 21 处**,全在 `lib/db.js`(`CREATE TABLE` × 11 + 迁移语句等)
|
||||
⇒ **MCN 当前形态不合规**(DB-03 红线 6:⛔ 不得以实例本地库为权威)。接入路径 = 把 `db.js` 的读写
|
||||
换成经内核 API(`/api/im/data/*` 或 SDK)⇒ 属**插件侧改造**,工作量大,需单独排棒。
|
||||
|
||||
---
|
||||
|
||||
## 二、MCN 工作台 · 移动端独占屏幕
|
||||
|
||||
### 病象与根因
|
||||
|
||||
**病象**(用户实测):手机上点开 MCN 工作台 ⇒ **一半会话窗口、一半插件窗口**,两侧都不可用。
|
||||
|
||||
**根因**(代码级,`dsh-plugin-mcn/lib/client.js`):
|
||||
工作台把宿主的会话区搬进一个 `flex-direction:row` 的容器(`.mcnNav_split`),
|
||||
再追加一个宽度 **50%**(`.mcnNav_panel`,行内 `style.width`)的面板 ⇒
|
||||
**窄屏上两栏各半**,而面板内表格内容宽 **720px**、操作按钮也摆不下 ⇒ 不可用。
|
||||
插件此前**没有任何视口断点**(只有主题判断)。
|
||||
|
||||
### 改法(纯样式 · 单文件 · 独立成段)
|
||||
|
||||
新增一段独立样式 `data-plugin-css="mcn-mobile"`(⛔ 不碰既有三段样式),一条
|
||||
`@media (max-width:900px)` 内含四组规则:
|
||||
|
||||
| 组 | 规则 | 为什么必须这么写 |
|
||||
|---|---|---|
|
||||
| ① **独占** | `.mcnNav_split{display:block}`|会话区与 `.mcnNav_resizer` `display:none!important`|面板 `width:100%!important` | 面板宽度是**行内 style** ⇒ 只有 `!important` 盖得住;宿主给会话区设了 `display:contents` ⇒ 隐藏也必须 `!important` |
|
||||
| ② 触摸目标 | 按钮/标签 ≥44px;图标按钮 44×44 | WCAG 2.5.5 / iOS HIG |
|
||||
| ③ 输入字号 | input/select/textarea `font-size:16px` | <16px 时 iOS Safari 聚焦会**放大整页** |
|
||||
| ④ 窄屏适配 | 弹窗 `width:calc(100vw-32px)`、`min-width:0`|宽弹窗与对比面板改竖排|统计条换行、字号收小|表格单元格间距放宽 | 原先 `min-width:320px` +固定宽度在 320px 视口上必然横向溢出 |
|
||||
|
||||
**为什么取 900px**(而非"手机断点"768):≤900px 时两栏各 <450px,表格/表单都不成立
|
||||
⇒ 桌面窄窗口与平板共享同一条判据,不维护第二套阈值。
|
||||
**宽屏(>900px)行为逐字不变** ⇒ 只做正向迭代。
|
||||
|
||||
**退出路径**:复用面包屑上既有的关闭按钮(已放大到 ≥44px 触摸目标)⇒ 关掉即恢复会话区,
|
||||
⛔ 不新增控件、⛔ 不动 React 结构(改动面 = 一段 CSS 数组,可单独回滚)。
|
||||
|
||||
### 本轮做过的校验(**不是**真实浏览器验收)
|
||||
|
||||
```
|
||||
node --check lib/client.js → ✅ 语法通过(改动前后均过)
|
||||
mcn-mobile 段存在 / @media 规则 1 条 → ✅
|
||||
```
|
||||
⚠️ **未做**:真实浏览器/真机视觉验收(见下)。
|
||||
|
||||
---
|
||||
|
||||
## 三、文档(同批)
|
||||
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `01-规范/08-插件开发与对接规范.md` | **新增 §4-补 移动端 / 窄屏兼容(硬要求)**(断点表 + 四条硬判据 + 三条 ⛔ + 六条自测 + 参考实现指针)|`§7` 自测清单补「移动端专项」|头部状态块补一行|`§11` 变更记录补 2026-09-25 |
|
||||
| 同上(上一轮同批) | `§3-4` 数据面取数链路重写 + `§6` 错误码 + `§7` 取数自测 |
|
||||
|
||||
---
|
||||
|
||||
## 四、未做(⛔ 不许看成已闭环)
|
||||
|
||||
1. 🔴 **未部署、未真机验收**(本机无 PG、无容器 ⇒ 数据面建库/取数在本机跑不了)。合并成一棒:
|
||||
**部署 47 → 数据面真机自测(四拒一空 + insert/find 回读)→ MCN 工作台移动端视觉验收
|
||||
(375×667 独占 / 能退出 / 无横向溢出 / 聚焦不缩放 / 横屏可用)**。
|
||||
2. **MCN 插件未改造为"数据面接入"**:仅补了**声明 + package.json 指向**(`dsh.data.yaml`、`dsh.data` 键、
|
||||
`files` 带上该文件)—— 读写仍走本地 SQLite(红线扫描 21 处)。⚠️ **未上传、未投放**
|
||||
⇒ 在线用户零影响。⚠️ **注意**:一旦把带声明的版本传到共享层,平台检测会判它"有数据面"
|
||||
⇒ **未建库前所有用户都无法启用**(门禁 ②)。**顺序必须是:先建库 ⇒ 再投放**。
|
||||
3. **移动端改动只覆盖 MCN 工作台**。其它"占用宿主区域"型插件(如门户入口/会话标签页)
|
||||
是否同样有窄屏问题 ⇒ **未普查**(§4-补 已把判据写成硬要求,可用于逐个复查)。
|
||||
Reference in new issue
Block a user