Files
dsh_ai1net_server/交付物/插件接入验收与移动端独占-20260925.md
T
admin 318430c9e9 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/规则与载体/、归档/、接续包_*。
2026-09-25 23:06:29 +08:00

124 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 插件接入验收(静态面·用 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-补 已把判据写成硬要求,可用于逐个复查)。