范围 = 本线(插件投放与分库线)产物 + 记忆类,共 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/规则与载体/、归档/、接续包_*。
7.7 KiB
插件接入验收(静态面·用 MCN 插件)+ MCN 工作台移动端独占屏幕(2026-09-25)
一句话:① 拿真插件(
dsh-plugin-mcn)走了一遍接入的静态面验收 —— 声明过校验、库名换算正确、 DDL 正确,同时抓出两条会让人返工的实测结论;② 修掉"MCN 工作台在移动端一半会话一半插件、没法用" —— 窄屏改为独占;③08-插件开发与对接规范新增 §4-补 移动端 / 窄屏兼容(硬要求)。 两件都未部署(本机无 PG、无容器 ⇒ 真机验收与部署合并为下一棒)。
一、接入验收(静态面)—— 用真插件跑平台真校验器
跑法(可复现):
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 个索引,形如
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");
🔴 验收抓出的两条实测结论(会让人返工,已回写文档)
- 只把
dsh.data.yaml放进包里 = 不生效。本次第一跑origin = none—— 因为没有package.json的dsh.data.schema指向。平台不自动探测该文件名(schema.ts:701-746现读)。 ⇒08 规范 §3-1已写这条(我这次是没先读文档才踩的,反证该条写得对);同时提醒:files字段 也要带上dsh.data.yaml,否则npm pack不打包它。 - 存量表的自增
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 取数自测 |
四、未做(⛔ 不许看成已闭环)
- 🔴 未部署、未真机验收(本机无 PG、无容器 ⇒ 数据面建库/取数在本机跑不了)。合并成一棒: 部署 47 → 数据面真机自测(四拒一空 + insert/find 回读)→ MCN 工作台移动端视觉验收 (375×667 独占 / 能退出 / 无横向溢出 / 聚焦不缩放 / 横屏可用)。
- MCN 插件未改造为"数据面接入":仅补了声明 + package.json 指向(
dsh.data.yaml、dsh.data键、files带上该文件)—— 读写仍走本地 SQLite(红线扫描 21 处)。⚠️ 未上传、未投放 ⇒ 在线用户零影响。⚠️ 注意:一旦把带声明的版本传到共享层,平台检测会判它"有数据面" ⇒ 未建库前所有用户都无法启用(门禁 ②)。顺序必须是:先建库 ⇒ 再投放。 - 移动端改动只覆盖 MCN 工作台。其它"占用宿主区域"型插件(如门户入口/会话标签页) 是否同样有窄屏问题 ⇒ 未普查(§4-补 已把判据写成硬要求,可用于逐个复查)。