Files
dsh_ai1net_server/交付物/插件接入验收与移动端独占-20260925.md
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

7.7 KiB
Raw Permalink Blame History

插件接入验收(静态面·用 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");

🔴 验收抓出的两条实测结论(会让人返工,已回写文档)

  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-补 已把判据写成硬要求,可用于逐个复查)。