初始化提交:contentm_agent 工作区全量快照

内容分四块:
1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。
2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。
3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。
4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。

.gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
This commit is contained in:
WorkBuddy committed 2026-10-08 08:13:02 +08:00
commit df56c2c137
1773 files changed
+205840

No files matched your search

@@ -0,0 +1,280 @@
# 2a 产品功能
> 项目 slug:`mcn-shortvideo-agent` | ②段第 1 子步,产出 `prd/2a-产品功能.md`
> 判据源:`stage-requirements/references/create-prd.md`(功能清单)+ `references/state-machine.md`(六项治理,落点在功能条目内)
> 本份只做一件事:把①段《使用场景》(`research/1e-使用场景.md`)细化成功能清单 —— 做哪些、不做哪些、每条什么优先级。
> 页面骨架在 `prd/2b-界面布局.md`,⛔ 本份不描述页面长什么样,只写「跨哪些页面」。
---
## 〇、上游状态(先看这一节再往下读)
| 上游 | 状态 | 说明 |
|---|---|---|
| ①段 1a 需求文档 | ✅ 已就位 | `research/1a-需求文档.md`(23 KB,2026-10-07 22:29)。性质是**汇总型**,不是 grill 澄清产出。 |
| ①段 1b 竞品分析 | ✅ 已就位,**跨项目** | 分析本体在 `执行会话/目标-调研5个开源内容工作台项目并生成分析文档-5199a6/docs/pm/content-workbench/`。引用关系见 `research/1b-竞品分析.md`。 |
| 1a 里指向 1b 系列的条目 | ✅ **复核已完成** | 2026-10-07 22:2x 逐条核过:9 条受影响里 **2 条改**(F5 措辞、F7 依据列)、**7 条不改**。清单见 `…-72111e/复核清单-1a受影响条目.md`。 |
| 1a 的 9 条待复核 | 🔴 **仍未复核** | 全部未经用户确认。本份凡依赖它们的条目**逐条标出**(见 §三)。 |
| A1–A4 假设 | 🔴 **仍未经确认** | 同上。 |
引用 1b 的证据等级随文标注:**源码级**(四家)/**界面级**(只有 Easel)/**文档级**(只有文到 AI,不与另四家同权)。
---
## 一、功能清单怎么组织
**按使用场景组织,不按页面。** 一条场景下可能挂跨多个页面的功能。这是①段《使用场景》与②段之间的接口,也是本段唯一的「功能该不该有」判据 —— 追不回场景的功能,要么补场景、要么砍掉。
优先级只给 P0/P1/P2 加一句可复述的判据,⛔ 不填数字(本项目没有任何数据源)。
---
## 二、功能清单(14 条)
### S1 找选题
#### F1 对标账号监控与爆款异常值识别
- **功能名**:盯住几个对标账号,把「数据远高于它平时水平」的内容挑出来。
- **来自哪条场景**:S1
- **优先级**:P0 —— 判据:不做则 S1 整条办不成。
- **状态流转**:`idle → fetching → hit / miss`。事件=刷新、恢复自动更新;守卫=平台授权有效(🔴 **依赖 A2**,见 §三);失败 ⇒ 迁 `failed`。
- **治理**:失败恢复=退避重试 3 次后转「手工录入对标号」的降级路径;持久化=监控名单与历史异常值落本地(不落全局);并发=同一对标号同时拉取走队列串行,不并发写;幂等=按「对标号 + 内容标识」去重,重复拉取不产生新条目;超时=`fetching` 上限 90 秒(设计值,实现可调),超时转 `failed`;不可逆=不涉及。
- **验收要点**:录入一个对标号后,能看到它近 3 天的更新;能指出哪几条是异常值(标注了它相对该号平时水平的倍数);刷新失败时有明确提示而不是静默空列表。
- **跨哪些页面**:P2 选题雷达
#### F2 选题库与灵感速记
- **功能名**:随手记下一刻想到的东西,把它收进待做清单。
- **来自哪条场景**:S1、S2
- **优先级**:P0 —— 判据:不做则选题无处落地,S1 与 S2 都断在最后一步。
- **状态流转**:`draft → 待做 → 在写 → 已用 / 弃用`。事件=记录、转待做、转在写、标已用、弃用;守卫=转「已用」需已关联到一条内容;弃用可恢复(可逆)。
- **治理**:失败恢复=本地写入失败时保留输入框内容,不丢字;持久化=落本地知识库目录,刷新与重启后仍在;并发=同一人两个入口同时改 ⇒ 乐观重试(写临时文件 + 原子替换 + 回读核对),⛔ 不用文件锁(本机实测会卡死);幂等=同一条灵感重复提交按内容 hash 去重;超时=无中间态;不可逆=不涉及(删除走可恢复的「弃用」)。
- **验收要点**:连着记 5 条灵感,重启后 5 条都在;一条灵感能被标记为「已用」并追到它变成了哪条内容。
- **跨哪些页面**:P1 矩阵总览(随手记入口)、P2 选题雷达
#### F3 评论区洞察找选题
- **功能名**:从一条内容的评论区里,把反复出现的问题挑成选题。
- **来自哪条场景**:S1
- **优先级**:P1 —— 判据:不做仍能从 F1 得选题,只是少一路输入。
- **状态流转**:`idle → 抓取中 → 已出候选 → 已采纳 / 忽略`。事件=抓取、采纳、忽略;守卫=设定过「最多获取条数」与「样本排序」;🔴 **依赖待复核第 7 条**(数据来源与频率未定)。
- **治理**:失败恢复=抓取失败转手工粘贴评论;持久化=候选选题落本地;并发=同一内容同时抓取走队列;幂等=按「评论标识」去重;超时=抓取中上限 60 秒(设计值);不可逆=不涉及。
- **验收要点**:给一条视频,能按「点赞最多」取出前 N 条评论并给出至少一条可采纳的候选选题。
- **跨哪些页面**:P2 选题雷达
### S2 选题进资产库
#### F4 爆款拆解与资产库
- **功能名**:把一条爆款的写法拆开,存成下次能直接拿的东西。
- **来自哪条场景**:S2
- **优先级**:P0 —— 判据:不做则 S2 整条办不成;`1a` §六 F4 注明「这一条决定了『越用越准』」。
- **状态流转**:`未拆 → 拆解中 → 待入库 → 已入库 / 退回`。事件=发起拆解、入库、退回;守卫=入库前过门禁(见治理);退回后原件保留。
🔴 资产库本身有四个分区(角度、结构、开场白、标题),各区条目独立流转,互不阻塞。
- **治理**:失败恢复=拆解失败保留原文,可重试;持久化=入库结果落本地,带原文与出处链接;并发=同一素材重复拆解按素材 hash 幂等;幂等=同一条目重复入库不产生副本;超时=拆解中上限 180 秒(设计值,长任务),超时转 `待入库` 并保留中间结果;不可逆=**入库前设门禁**(对策 R3):无出处的、原文缺失的一律先设 `draft`,`draft` 可删,`已入库` 删除需二次确认。
- **验收要点**:拆完一条爆款,四个分区里各能看到至少一条新条目;条目的原文与出处可回溯;拿 20 条真实爆款入库,隔一周回来能找回想要的那条。
- **跨哪些页面**:P3 资产库
### S3 走完创作流水线
#### F6 创作流水线
- **功能名**:把一条选题从「聊思路」一路做到成稿,文案、标题、封面齐。
- **来自哪条场景**:S3
- **优先级**:P0 —— 判据:不做则 S3 整条办不成。
- **状态流转**:`选题态 → 思路态 → 文案态 → 标题态 → 封面态 → 检查态 → 成稿态`;每一态可回退到上一态。事件=推进、回退;守卫=推进到「检查态」前文案与封面必须都有(封面缺 ⇒ 提示但不硬阻);成稿态可再编辑(回 `文案态`)。
- **治理**:失败恢复=任一步 AI 调用失败保留已产出内容,可重试该步;持久化=每一步的产物落本地并按内容 id 归档;并发=同一条内容两个窗口同时改 ⇒ 写临时文件 + 原子替换 + 回读核对,检测到覆盖则提示;幂等=重复点「起标题」生成新版本而不覆盖(接 F8);超时=任一步上限 180 秒(设计值),超时保留中间结果;不可逆=不涉及(这一步没有对外动作)。
- **验收要点**:一条选题能一路走到成稿,中途不必离开这一处;每一步的产物都存得住;用户全程不需要自己选技能。
- **跨哪些页面**:P4 创作台
#### F8 内容与素材的版本管理
- **功能名**:改稿产生新版本,旧版本还在。
- **来自哪条场景**:S3、S4
- **优先级**:P1 —— 判据:不做则场景办得成但要多绕(靠手工另存,容易盖掉)。
- **状态流转**:`v1 → v2 → … → 当前版`;每个版本可标「当前」。事件=编辑保存、切换当前版;守卫=切换当前版不影响已发布记录指向的版本;终态可再次编辑(回出新版本)。
- **治理**:失败恢复=保存失败保留编辑中内容;持久化=全部版本落本地,不覆盖;并发=同一条内容两处同时保存 ⇒ 后保存的产生新版本,同时提示「上游已变」(对应 1b 里 `stale` 的做法);幂等=同样内容重复保存不产生新版本;超时=无中间态;不可逆=**删除某个版本需二次确认**。
- **验收要点**:改一版再改一版,两版都在;已发布的那条记录仍指向它当时用的版本;能看出某一版是基于哪一版改的。
- **跨哪些页面**:P4 创作台、P5 发布中心
#### F14 录制卡片与画板
- **功能名**:把成稿变成一张对着讲的知识卡片。
- **来自哪条场景**:S3
- **优先级**:P2 —— 判据:不做不影响 S3 办成,只是更好用。
- **状态流转**:`无 → 已生成 → 已同步`。事件=生成、同步到画板;守卫=成稿态才可生成。
- **治理**:失败恢复=生成失败可重试;持久化=卡片与画板落本地;并发=同一内容重复生成按内容版本幂等;幂等=同版本不重复生成;超时=上限 60 秒(设计值);不可逆=不涉及。
- **验收要点**:一条成稿能生成卡片;卡片能落到画板里被打开。
- **跨哪些页面**:P4 创作台
### S4 一份母版变多份
#### F7 一份母版到多账号多平台版本
- **功能名**:母版改一次,按各账号各平台的口径各出一版。
- **来自哪条场景**:S4
- **优先级**:P0 —— 判据:不做则 S4 整条办不成。
- **状态流转**:`母版 → 已展开(多版本)→ 逐版确认 → 就绪`。事件=展开、逐版编辑、确认;守卫=每个版本必须绑一个账号 + 一个平台(沿用 F9 的画像口径);未确认的版本不许进发布闸门。
🔴 依据界线(照 1a 复核后的写法):Easel 发布中心**直证的是「多平台」**(一处编辑、八端预览,源码级 + 界面级);**「多账号」的依据是 Easel 的多画像支持加本产品的矩阵需求**,发布中心没看到逐账号变体。
- **治理**:失败恢复=展开中断保留已生成的版本;持久化=每个版本独立落本地;并发=两处同时展开按「母版版本 + 目标账号」幂等;幂等=同母版同账号同平台不重复展开;超时=展开上限 120 秒(设计值);不可逆=不涉及(确认可撤回,未发布的版本可删,删除需二次确认)。
- **验收要点**:母版改一次,各账号各平台的版本跟着更新;超限的地方当场标出来;改漏了某个账号能被发现。
- **跨哪些页面**:P4 创作台(从成稿发起)、P5 发布中心
### S5 发之前先过闸
#### F5 发布前分级闸门
- **功能名**:发之前,硬的拦住、软的只提醒。
- **来自哪条场景**:S5
- **优先级**:P0 —— 判据:不做则 S5 整条办不成。
- **界线(照 1a 复核后的写法,⛔ 不是旧版措辞)**:硬闸管**敏感信息**(账号密钥、内部路径这类),不过就不许发;软闸管**人设一致性**(低于阈值只告警,不阻断)。⚠️ 竞品里**没有「敏感词检测」,也没有「事实检测」**——照旧版写会把功能带偏成一个竞品池里没人做过的「事实核查器」。
- **状态流转**:`未检 → 检查中 → 通过 / 有硬拦 / 有软劝`。事件=发起检查、改完复检;守卫=有硬拦项时「去发布」不可用;软劝不阻断但要在发布确认页可见。硬拦项改完才能过。
- **治理**:失败恢复=检查本身失败按**不过**处理(fail-closed,宁拦不放);持久化=每次检查结果留痕,随发布记录一起存;并发=同一内容重复检查以最后一次为准;幂等=同一版本重复检查结果一致;超时=检查上限 60 秒(设计值),超时按不过处理;不可逆=**「去发布」这一步必须人确认**(read-first / draft-first)。
- **验收要点**:一份带敏感信息的稿子会被拦住且说得出是哪一处;一份人设偏移的稿子只提醒、不拦;改完能复检并通过。
- **跨哪些页面**:P5 发布中心
#### F13 发布留痕与人工确认记录
- **功能名**:谁在什么时候确认发的、发的是哪一版,查得到。
- **来自哪条场景**:S5
- **优先级**:P1 —— 判据:不做则场景办得成但要多绕(靠聊天记录回溯,且回溯成本高)。
- **状态流转**:`草稿 → 待审 → 已确认 → 已发布 → 已归档`。事件=送审、确认、登记发布、归档;守卫=`已发布` 需要先有「已确认」记录;**组织级急停**可把任意 `待审` 打回 `草稿`。
- **治理**:失败恢复=登记失败保留草稿状态;持久化=审计轨迹落本地,只追加不改写;并发=同一内容两处送审按「内容版本」幂等;幂等=重复确认同一版本不产生第二条记录;超时=`待审` 上限 72 小时(设计值),超时提醒发起人,不自动放行;不可逆=**发布、删帖、组织级急停三件事形态不一样,别压成一句**:发布是人的动作;删帖带破坏性标注,需二次确认;急停的触发与恢复都只有人能做。
- **验收要点**:每条发布都能查到确认人与时间;能看出这条发的是哪一版;急停能拦住所有待审项,恢复后之前的草稿还在。
- **跨哪些页面**:P5 发布中心、P8 记录与对账
### S6 效果回写
#### F9 多账号画像与记忆
- **功能名**:每个账号有自己的口径和记忆,互不覆盖。
- **来自哪条场景**:S6、S7
- **优先级**:P0 —— 判据:不做则 S6 整条办不成(表现无处可回)。
- **状态流转**:`空 → 已建 → 使用中 →(复盘回写)→ 使用中`。事件=建画像、编辑、被复盘回写;守卫=一个账号一份画像,账号标识唯一;回写只追加记忆条目,不改历史结论。
- **治理**:失败恢复=保存失败保留编辑内容;持久化=**记忆作用域收敛到画像目录,⛔ 不写全局文件**(对策 R4:多账号并发写全局会互相覆盖);并发=多账号并行读同一份画像,写只写自己那一份;幂等=同一条记忆重复回写按内容 id 去重;超时=无中间态;不可逆=删除画像需二次确认(会连带删它累积的记忆)。
- **验收要点**:两个账号各自的画像互不影响;一条内容复盘后,对应账号的画像里多出一条记忆;并排跑两个账号的创作,谁都不覆盖谁。
- **跨哪些页面**:P6 账号画像
#### F10 效果复盘与归因回写
- **功能名**:一条内容跑完,把它的表现读回来,写成这个账号的经验。
- **来自哪条场景**:S6
- **优先级**:P0 —— 判据:不做则 S6 办不成,整个闭环断在最后一步。
- **状态流转**:`待复盘 → 读数据中 → 已归因 → 已回写`。事件=发起复盘、确认归因、回写;守卫=先有发布记录(F13);回写前必须人确认归因结论。
🔴 本组**只有 Easel** 做成了这个闭环(源码级),⛔ 不写成「多家都做了」。
- **治理**:失败恢复=数据读不到时降级为手工录入表现;持久化=复盘结论与回写记录落本地;并发=同一条内容重复复盘按内容 id 幂等;幂等=同一次复盘重复回写不重复追加记忆;超时=读数据上限 90 秒(设计值),超时转手工录入;不可逆=**回写会改画像记忆,需人确认**(不自动写)。
- **验收要点**:一条已发布内容能复盘出结论;结论能回写到对应账号的画像;回写后下一轮做这个账号时能看到这条经验。
- **跨哪些页面**:P7 复盘台
### S7 看整个矩阵
#### F11 矩阵级看板
- **功能名**:一屏回答每个账号今天该发什么、发了什么、效果如何。
- **来自哪条场景**:S7(🔴 **整条标【假设】**,待复核第 5 条)
- **优先级**:P1 —— 判据:不做则场景办得成但要多绕(逐账号点进去看);⚠️ 若第 5 条复核为「不需要矩阵级视图」,本条可整体砍掉。
- **状态流转**:无状态(只读视图,见 `2b-界面布局.md` 的信息分档)。事件=进入、切换账号、下钻。
- **治理**:失败恢复=数据源不可用时显示「数据未更新」并给出时间戳,⛔ 不显示空白冒充正常;持久化=视图本身不落库,只读上游;并发=只读,无冲突;幂等=只读;超时=无;不可逆=不涉及。
- **验收要点**:一屏能看到矩阵下每个账号的今日状态与效果;数据不新鲜时看得出来。
- **跨哪些页面**:P1 矩阵总览
### S8 商单与内容对账
#### F12 商单与收支记录、内容对账
- **功能名**:一条内容带了商单,内容、发布记录和收支对得上。
- **来自哪条场景**:S8(🔴 **整条标【假设】**,待复核第 6 条;另依赖 **A3**)
- **优先级**:P2 —— 判据:不做不影响场景办成,只是更好用;⚠️ 若第 6 条复核为「不进第一版」,本条移出第一版(属待确认项,见 §五)。
- **状态流转**:`未登记 → 已登记 → 待结算 → 已结算`。事件=登记、核对、标结算;守卫=`已结算` 需内容与发布记录都已关联;可反结算(可逆)。
- **治理**:失败恢复=登记失败保留输入;持久化=收支记录落本地;并发=同一条记录两处改按记录 id 幂等;幂等=同一内容同一口径不重复登记;超时=无中间态;不可逆=标「已结算」后修改需二次确认。
- **验收要点**:一条带商单的内容能查到它的发布记录与收支;对账时不需要翻聊天记录。
- **跨哪些页面**:P8 记录与对账
---
## 三、依赖假设的条目(逐条标出)
⭐ 1a 的 9 条待复核与 A1–A4 **全部未经用户确认,⛔ 不当事实用**。本份凡依赖它们的条目列在下面,写清「依赖哪条、不成立会怎样」。依据假设的判断,条目里已带上假设状态标注。
| 功能 | 依赖 | 假设内容 | 不成立会怎样 |
|---|---|---|---|
| F1 | **A2** + 待复核第 2 条 | 平台数据靠官方接口或授权方式拿 | 自动拉取这条路断,退化成手工录入对标号;S1 的「不用刷榜」打折 |
| F10 | **A2** + 待复核第 2 条 | 同上 | 效果数据读不回来,归因只能靠手工录表现,S6 降级 |
| F11 | **A1** + 待复核第 5 条 | 账号数 10–50;矩阵级视图确实需要 | 账号数超出 ⇒ 看板的组织方式要重设计;视图不需要 ⇒ F11 可整体砍掉,P1 页重画 |
| F9 | **A1** | 账号数 10–50 | 同 F11;且画像数量与存储组织要跟着变 |
| F12 | **A3** + 待复核第 3、6 条 | 收支口径是「内容级」;商单对账进不进第一版 | 口径若是月级 ⇒ 本条整条重做;不进第一版 ⇒ 移出第一版 |
| F5 | **A4** + 待复核第 4 条 | 团队 5–20 人、审批不超过三层 | 审批层数超三层 ⇒ 闸门与审批模型要重做 |
| F13 | **A4** + 待复核第 4 条 | 同上 | 同上 |
| F3 | 待复核第 7 条 | 评论洞察的数据来源与频率未定 | 数据来源定不下来 ⇒ F3 退成手工粘贴评论 |
| (无功能) | 待复核第 8 条 | 「整合营销」含不含投放 | 若含投放 ⇒ 需要新增一条场景(1e §六),本份没有对应功能,⛔ 不编 |
| (策略层) | 待复核第 9 条 | 只服务一个机构自用 vs 可交付产品 | 影响 `1d-产品策略.md` §7、§9 与权限体系是否进第一版,不影响本份功能骨架 |
**假设三归宿**(方法论要求,⛔ 不许长期悬空):上表 9 条**全部**落在「② 待实现且已排定确认时机」这一档 —— 确认时机统一为「②段收口时由主会话转用户一次性过;未过之前,③段不得把这些条目当硬约束用」。另两条落「① 已确认」的:**无**(1a 的 6 项已确认项都是无假设依赖的骨架条款)。落「③ 已按假设落地」的:**无**。
---
## 四、六项治理覆盖核对
判据源 `state-machine.md` 的必答清单。⛔ 不留空,不适用写「不适用」。
| 治理项 | 落点(哪些功能显式写了) | 最要紧的一条 |
|---|---|---|
| 失败恢复路径 | F1 F2 F3 F4 F6 F7 F8 F9 F10 F11 F12 F13 F14 | F5 走 **fail-closed**(检查失败按不过处理),本组唯一一条「宁拦不放」 |
| 持久化范围 | 全部 14 条 | F9 的**记忆作用域收敛到画像目录、不写全局**(对策 R4);F13 的审计轨迹**只追加不改写** |
| 并发冲突 | F1 F2 F3 F6 F7 F8 F9 F12 | 统一做法:写临时文件 + 原子替换 + 回读核对,⛔ 不用文件锁(本机实测会卡死) |
| 幂等 | F1 F2 F3 F4 F6 F7 F8 F9 F10 F12 F14 | F4 与 F8 的**重复入库/重复保存不产生副本、也不覆盖旧版** |
| 超时迁移目标 | F1 F3 F4 F5 F6 F7 F10 F13 F14 | F13 的 `待审` 超时**只提醒、不自动放行** —— 不可逆动作不许靠超时自动过 |
| 不可逆操作二次确认 | F4 F5 F8 F9 F10 F12 F13 | F5 + F13:**发布、删帖、组织级急停三件形态不同**,分别按「人的动作 / 二次确认 / 只有人能触发与恢复」处理 |
补一条方法论要求的分工说明:**发布这个动作本身留在人手里**(read-first / draft-first,源码级);**删帖**带破坏性标注、属需二次确认的一类;**组织级急停**的触发与恢复都只有人能做。⚠️ 三件事的「人来做」形态不一样,⛔ 不压成一句话。
---
## 五、「不做」清单与①段已拍板项的逐条对照
**对照方法**:本份列出的「不做 / 移出 / 暂缓」共 **8 条**,逐条对 `1a-需求文档.md` 的已拍板项 **13 条**(来源:§一 不做什么 4 条 + §八 第一版不做 5 条 + §八 三个入口 1 条 + §三 三条差位的取舍结论 1 条 + §六 治理段「人来做」的三件事分开记 3 条 —— 去重后按条计)。
| # | 本份的「不做 / 移出 / 暂缓」 | 1a 原条目与口径 | 拟改口径 | 理由 | 差异 |
|---|---|---|---|---|---|
| 1 | 不做平台自动化代发 | §一 不做什么;§八 第一版不做 | 不变 | 走 F5 + F13 的人确认路径 | 无 |
| 2 | 不做矩阵级自动投放优化 | §八 第一版不做 | 不变 | 1b 里五家都没这一段证据 | 无 |
| 3 | 不做跨机构协作与权限体系 | §八 第一版不做 | 不变 | A4 假设团队不超过三层审批 | 无 |
| 4 | 不做移动端 App | §八 第一版不做 | 不变 | — | 无 |
| 5 | 不把平台数据抓回来做数仓 | §八 第一版不做 | 不变 | 只对接与留痕 | 无 |
| 6 | 不自建投放系统 | §一 不做什么 | 不变 | 只对接与留痕 | 无 |
| 7 | 不做个人版单账号工具 | §一 不做什么 | 不变 | 面向一个账号矩阵 | 无 |
| 8 | 第一版不铺「三个入口」之外的界面 | §八「这一版只留的三个入口」 | 不变 | 找选题 / 走创作流水线 / 看矩阵复盘 | 无 |
**结论**:**8 条对照完,差异行 0**。没有一条涉及已拍板项的口径改动,因此没有「与已定决策的差异」表要交用户确认。
**一条待确认项**(不是「不做」,是「暂缓」,必须带回收三字段):
本份把 **F12** 标为 P2 并注明「若待复核第 6 条为『不进第一版』则移出第一版」。这是一条**暂缓**。
- 复核人 = 主会话转用户
- 复核时机 = ②段收口时一次性过
- 结论落点 = 本文件 §二 F12 条目与 §三 依赖表
---
## 六、页面清单(跨页引用用的 ID)
本份只写「跨哪些页面」,页面骨架在 `2b-界面布局.md`。为免引用悬空,先把页 ID 列出来(骨架细节见那份):
P1 矩阵总览|P2 选题雷达|P3 资产库|P4 创作台|P5 发布中心|P6 账号画像|P7 复盘台|P8 记录与对账
---
## 附:本份自检
- [x] 每条功能都追回①段《使用场景》的某一条(14 条全覆盖,§四 反向核过)
- [x] 每条功能六字段齐全(功能名 / 来自哪条场景 / 优先级 / 状态流转 / 验收要点 / 跨哪些页面)
- [x] 优先级只用 P0/P1/P2 加一句判据,零数字
- [x] 「不做」清单逐条对照①段已拍板项,**给出对照条目数(8 对 13),差异行 0**
- [x] 六项治理全覆盖,且落在功能条目内(§四 给了落点清单)
- [x] 依赖假设的条目逐条标出(§三 9 条),每条带假设状态标注与「不成立会怎样」
- [x] 唯一一条暂缓项(F12)带齐复核人 / 复核时机 / 结论落点
- [x] 全文零视觉词(配色 / 字体 / 间距 / 组件样式 / 动效)
- [x] 未重开需求(grill 在①段)、未写页面结构(那是 2b)、未新增本段白名单外的文档
- [x] 上游状态写在文首,凡引用 1b 处标了证据等级
*(说人话自评:46/50 直接性 9 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,318 @@
# 2b 界面布局
> 项目 slug:`mcn-shortvideo-agent` | ②段第 2 子步,产出 `prd/2b-界面布局.md`
> 判据源:`stage-requirements/SKILL.md` §2b + `assets/diagram-design/`(本份只给灰块骨架,不出图)
> 本份专管界面骨架:有哪几页、每页几个板块、板块怎么排、跨页怎么跳。⛔ 不写功能条目的有无与优先级(那是 `2a-产品功能.md`)。
> ⛔ **全文零视觉词**:配色 / 字体 / 间距 / 组件样式(含卡片、按钮、标签这类具体形态) / 动效,一个都不许出现。本份只说「有哪些块、什么顺序」。
> 🔴 **交给③段时骨架是冻结的**:③段不许新增、移动、删除板块。缺板块要回②段改。
---
## 〇、上游状态
| 上游 | 状态 |
|---|---|
| ②段 `2a-产品功能.md` | ✅ 已就位(14 条功能,六字段齐全) |
| ①段 `1e-使用场景.md` | ✅ 已就位(八条用户故事) |
| ①段 1a 的 9 条待复核 + A1–A4 | 🔴 **未经用户确认**。本份受它们影响的只有两处,已就地标出(见 §二 P1 与 §四) |
| 1b 竞品分析 | ✅ 已就位,跨项目。本份引用两处:Easel 发布中心的多平台直证、Easel 创作流水线的环节顺序 |
**分档判据的读法(先说清,全篇一致)**:「删掉它,主操作还做得成吗」按**结果正确**读 —— 缺了它会把事情做错,等于没做成,那就归「主屏常驻」。这是本份对方法论的读法,写在这里以免后面逐条重复解释。
---
## 一、页型(一句判型 + 依据)
**本产品是工具型页面,不是营销页。**
依据:`1a-需求文档.md` §一 与 §四 里的用户是天天来干活的 MCN 团队(内容负责人、编导与文案、剪辑与投放),不是第一次来的访客。§八 留下的三个入口全是干活入口(找选题 / 走创作流水线 / 看矩阵复盘),没有一处是「让人下决心」的落地页。
⇒ ③段不要套落地页骨架。判据:本产品的每一页都有人在里面完成一件事,没有一页是为了让人「看一眼就下决心」而存在的。
---
## 二、八页骨架
### P1 矩阵总览(一级组:看矩阵复盘)
**这一页干什么**:一屏回答每个账号今天该发什么、发了什么、效果如何。
**板块清单(从上到下)**
1. 今日待处理 —— 跨账号的待办:待审、待确认、待复盘各几件
2. 账号矩阵列表 —— 一行一个账号,行内三件事:今日该发什么 / 已发什么 / 效果如何
3. 异常值提示 —— 最近哪些内容的数据异动
4. 本月表现最好的一条
5. 全局检索与随手记入口
**主操作**:决定今天先处理哪一件事,并进到那一件事。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 账号矩阵列表 | 主屏常驻 | 删掉它,主操作的对象就没了 —— 不知道有哪些账号,无从决定先处理哪件 |
| 今日待处理 | 主屏常驻 | 删掉它,主操作没有候选可挑,做不成 |
| 异常值提示 | 可点入 | 删掉它,主操作仍做得成(异常值是 P2 的输入,不是这一页的决策依据) |
| 本月表现最好 | 可点入 | 删掉它,主操作完全不受影响 —— 它只是激励 |
| 随手记入口 | 可点入 | 判据答「做得成」。⚠️ 但它是 F2 的入口,以**全局可达**的方式出现:任意页面一次点击内能碰到,不占 P1 的主屏常驻位 |
🔴 本页依赖 **A1**(账号数 10–50)与**待复核第 5 条**(矩阵级视图是否真需要)。若第 5 条复核为「不需要」,P1 从「矩阵总览」降为「单账号今日」,只留第 1、4 板块,矩阵列表下移到账号切换。
---
### P2 选题雷达(一级组:找选题)
**这一页干什么**:找选题,并且把选中的那条推进下一步。
**板块清单(从上到下)**
1. 对标监控概览 —— 四个数:在监控的账号数 / 低粉爆款条数 / 异常值条数 / 近三天更新条数
2. 对标内容列表 —— 每条带它相对该账号平时水平的倍数
3. 评论区洞察区(可点入子区)—— 取评论、出候选选题
4. 选题库 —— 分「待做 / 在写 / 已用」三组
5. 灵感速记入口
**主操作**:把一条选题推进下一步(去创作台,或去资产库拆解)。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 对标内容列表 | 主屏常驻 | 删掉它,主操作的对象没了,做不成 |
| 选题库 | 主屏常驻 | 删掉它,主操作没有可推进的条目,做不成 |
| 对标监控概览四数 | 主屏常驻 | 删掉它,看不出哪个账号值得看 —— 列表会长到没法挑,等于主操作做不成 |
| 评论区洞察区 | 可点入 | 删掉它,仍能从对标列表拿到选题 |
| 灵感速记入口 | 可点入 | 同 P1 的随手记,全局可达 |
---
### P3 资产库(一级组:找选题)
**这一页干什么**:把拆解结果存下来,下次能直接拿到。
**板块清单(从上到下)**
1. 分区切换 —— 角度 / 结构 / 开场白 / 标题,一次看一个
2. 条目列表 —— 当前分区下的条目
3. 单条详情 —— 原文、出处、(草稿标记)
4. 引用入口 —— 把这条拿去创作台用
**主操作**:把一条拆解结果入库;已入库的则把它引用到创作台。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 分区切换 | 主屏常驻 | 删掉它,四个分区分不开,入库不知道该进哪一区,主操作做不成 |
| 条目列表 | 主屏常驻 | 主操作对象 |
| 单条详情(原文 / 出处) | 可点入 | 删掉它,入库与引用都还做得成(入库门禁在守卫层,不靠这里显示) |
| 引用入口 | 可点入 | 删掉它,`2a` F4 的主路径改成从创作台来找,多绕一步;但 P3 自己的主操作(入库)不受影响 |
---
### P4 创作台(一级组:走创作流水线)
**这一页干什么**:一条内容从选题走到成稿。
**板块清单(从上到下)**
1. 当前内容标识 —— 这是哪条选题
2. 环节进度 —— 七个环节的当前位置,可回退
3. 当前环节工作区 —— 这一步实际干活的地方
4. 资产引用区 —— 从资产库拿角度、结构、开场白、标题
5. 版本列表(可点入)
**主操作**:把当前环节推进到下一环节。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 环节进度 | 主屏常驻 | 删掉它,不知道下一环节是什么,主操作做不成 |
| 当前环节工作区 | 主屏常驻 | 主操作的对象 |
| 当前内容标识 | 主屏常驻 | 删掉它,改到别的选题上也不知道,等于做错 |
| 资产引用区 | 可点入 | 删掉它,仍能凭空写(这正是 S2 要治的老毛病),主操作本身做得成 |
| 版本列表 | 可点入 | 删掉它,推进流程不受影响;只有回溯旧版时才需要 |
---
### P5 发布中心(一级组:走创作流水线)
**这一页干什么**:把成稿展开成各账号各平台的版本,过闸,由人确认发出。
**板块清单(从上到下)**
1. 目标选择 —— 这次发给哪些账号、哪些平台
2. 各版本预览与逐版编辑 —— 一个目标一版
3. 检查结果 —— 哪几处会被硬拦、哪几处只是提醒
4. 确认发布 —— 含二次确认
5. 发布记录入口(可点入)
**主操作**:确认发布。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 检查结果 | 主屏常驻 | 删掉它,会被硬拦项挡回去却不知道为什么,主操作做不成 |
| 各版本预览与逐版编辑 | 主屏常驻 | 主操作对象 |
| 确认发布 | 主屏常驻 | 删掉它就没有主操作本身了 |
| 目标选择 | 可点入 | 判据答「做得成」—— 从 P4 带着版本进来时,目标已定;只有从 P1 直接进来才需要现选 |
| 发布记录入口 | 可点入 | 删掉它,回查改从 P8 进 |
---
### P6 账号画像(跨组)
**这一页干什么**:每个账号一份画像与记忆,看和改都在这一页。
**板块清单(从上到下)**
1. 账号列表 —— 选一个账号
2. 画像六维 —— 定位、风格、受众、平台、偏好与红线、长期记忆
3. 记忆条目 —— 只追加,不覆盖
4. 关联内容 —— 这个账号做过的内容
**主操作**:保存这一份画像。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 画像六维 | 主屏常驻 | 主操作对象 |
| 账号列表 | 主屏常驻 | 删掉它,不知道在改哪个账号的画像,会改错 |
| 记忆条目 | 可点入 | 删掉它,编辑画像与保存都做得成(记忆是回写产物,不是编辑动作的输入) |
| 关联内容 | 可点入 | 删掉它,主操作不受影响 |
---
### P7 复盘台(一级组:看矩阵复盘)
**这一页干什么**:把一条已发布内容的表现读回来,写成这个账号的经验。
**板块清单(从上到下)**
1. 待复盘列表
2. 这一条的表现数据
3. 归因结论区 —— 由人确认
4. 回写目标提示 —— 这次回写到哪个账号
5. 历史复盘(可点入)
**主操作**:确认归因并回写。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 表现数据 | 主屏常驻 | 删掉它,归因没有依据,主操作做不成 |
| 归因结论区 | 主屏常驻 | 主操作对象 |
| 待复盘列表 | 主屏常驻 | 删掉它,不知道有什么可复盘,主操作做不成 |
| 回写目标提示 | 主屏常驻 | 删掉它,回写会落到错的账号,这条经验就废了 —— 等于主操作没做成 |
| 历史复盘 | 可点入 | 删掉它,当前这次复盘仍做得成 |
---
### P8 记录与对账(一级组:看矩阵复盘)
**这一页干什么**:查发布留痕,核商单与收支对不对得上。
**板块清单(从上到下)**
1. 发布记录列表 —— 谁在什么时候确认发的、发的是哪一版
2. 单条溯源 —— 从记录回到内容与版本
3. 对账核对区 —— 内容、发布记录、收支三样对得上
4. 商单与收支(可点入,所属功能 F12 为 P2,第一版可能没有)
**主操作**:核销一条记录。
**信息分档**
| 信息 | 档 | 判据回答 |
|---|---|---|
| 发布记录列表 | 主屏常驻 | 知道有哪些记录,不知道就无从核销。判据:删掉它,主操作没有对象 |
| 对账核对区 | 主屏常驻 | 主操作对象 |
| 单条溯源 | 可点入 | 判据答「做得成」—— 核销看列表就够;要深究才点进溯源 |
| 商单与收支 | 可点入 | 删掉它,主操作仍做得成;且 F12 是 P2,第一版可能整块没有(见 `2a` §五 的暂缓项) |
---
## 三、页面流转
**门开在哪**:唯一入口是 P1。四个一级组是导航结构,不是四个入口。
**一级导航三组 + 一个跨组入口**(照 `1a` §八 的三个入口):
| 组 | 含哪几页 |
|---|---|
| 找选题 | P2 选题雷达、P3 资产库 |
| 走创作流水线 | P4 创作台、P5 发布中心 |
| 看矩阵复盘 | P1 矩阵总览、P7 复盘台、P8 记录与对账 |
| (跨组)账号画像 | P6 —— 从 P1、P4、P5 都能进 |
**页与页怎么连**
| 从 | 到 | 什么条件下 |
|---|---|---|
| P1 | P2 | 点「异常值提示」里的某条,或从今日待处理里挑到选题类待办 |
| P1 | P4 | 今日待处理里有「在写」的内容 |
| P1 | P5 | 今日待处理里有待审 / 待确认的内容 |
| P1 | P6 | 点账号矩阵列表里的某个账号 |
| P1 | P7 | 今日待处理里有待复盘的 |
| P1 | P8 | 今日待处理里有待核销的 |
| P2 | P3 | 对某条对标内容发起拆解 |
| P2 | P4 | 把一条选题转入创作 |
| P3 | P4 | 引用一条资产去创作 |
| P4 | P5 | 成稿态,去发布 |
| P4 | P6 | 需要查这个账号的口径 |
| P5 | P6 | 发布前要核账号口径 |
| P5 | P7 | 已发布,去复盘 |
| P5 | P8 | 发布后去查留痕 |
| P6 | P4 | 画像保存后回到创作 |
| P6 | P5 | 画像保存后回到发布 |
| P7 | P6 | 归因回写(写进该账号的画像) |
| P8 | P5 | 从一条记录回到它对应的版本 |
**两条跨页规则**(`2a` 里已写、在骨架里落地的):
1. **F7 的多版本跨 P4 与 P5**:在 P4 出成稿,在 P5 展开并逐版确认。所以 P5 才需要「目标选择」这个板块。
2. **F13 的留痕跨 P5 与 P8**:确认动作发生在 P5,记录可查在 P8。
**全局可达**:随手记出现在任意页面一次点击内(F2 是 P0,不能埋在两层下)。
---
## 四、骨架受限的两处(依赖未复核项)
1. **P1 的形态挂在待复核第 5 条上**(矩阵级视图是否真需要)。若答「不需要」,P1 降为单账号今日,矩阵列表下移。这是一处**结构性分支**,③段动工前必须定。
2. **P8 的第 4 板块挂在待复核第 6 条与 A3 上**(商单对账进不进第一版;收支口径)。若「不进第一版」,P8 只留第 1、2、3 板块。
**回收三字段**:复核人 = 主会话转用户;复核时机 = ②段收口时一次性过,③段动工前必须定;结论落点 = 本文件 §四 与 §二 P1、P8 对应板块。
---
## 五、五样给全核对(方法论要求,缺一样③段就没方向)
| 要求 | 本份落在哪 | 齐 |
|---|---|---|
| 页面清单(有哪几页,每页一句话说清干什么) | §二 八页,每页第一行 | ✅ |
| 页面流转(谁跳到谁、什么条件下) | §三 表 + 两条跨页规则 + 二级导航 | ✅ |
| 每页板块清单与排列(几个块、从上到下什么顺序) | §二 每页「板块清单(从上到下)」,逐页编号 | ✅ |
| 每页主操作(唯一那个推进动作) | §二 每页「主操作」 | ✅ |
| 每条信息的分档(主屏常驻 / 可点入,含判据回答) | §二 每页「信息分档」表 | ✅ |
| 页型一句 | §一 | ✅ |
---
## 附:本份自检
- [x] 八页,每页有板块清单与排列顺序、主操作、信息分档(含判据回答)
- [x] 页面流转写了「谁跳到谁、什么条件下」,并说明了门开在哪
- [x] 零视觉词:配色 / 字体 / 间距 / 组件样式 / 动效,一个未出现(已回避「卡片」「按钮」「标签」这类具体形态词)
- [x] 未写功能条目的有无与优先级(那是 `2a`),未描述页面「长什么样」
- [x] 骨架受限的两处已标出来源(待复核第 5、6 条与 A3),并带回收三字段
- [x] 上游状态写在文首;引用 1b 处标了证据等级
- [x] 明确的骨架冻结声明:③段不许新增、移动、删除板块
- [x] 未新增②段两份之外的文档
*(说人话自评:46/50 直接性 9 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,249 @@
> **落本目录说明(2026-10-08 由任务会话 `[执行]-[开源项目调研]-补齐MCN工作台①②段产出` 补记)**
> 本份是 1a 的**逐字复制件**,为了目标目录自包含(③段与后续会话不必跨目录找)。原件在
> `执行会话/目标-重写5份竞品分析文档并重新生成MCN短视-72111e/1a-需求文档-MCN短视频整合营销.md`(23 KB,2026-10-07 22:29);
> 同一内容另有一份在 `docs/pm/mcn-shortvideo-agent/research/1a-需求文档.md`——⚠️ 那一份是**旧版**(上游状态行停在「正在重写、9 条待复核」),
> 与本目录这份**内容不同**,引用时以本目录这份为准。
> 本件**未改一字**(只加了这段说明)。性质是**汇总型需求**,不是 grill 澄清产出——下游引用时按这个性质读。
> ⚠️ 本份里的 §三/§四/§五 是**汇总草案**,1c/1d/1e 三份按各自方法论独立成文,不照抄本份。
---
# MCN 短视频内容整合营销智能体 · 需求文档(1a)
> 项目 slug:`mcn-shortvideo-agent`|性质:**汇总型需求**(不是 grill 澄清出来的,来源见 §二)
> 汇总时间:2026-10-07 | 状态行:**已确认 6 项 / 模型补全 9 项(其中 9 项未经用户确认)**
> 本文档由三类输入汇总:① 视频关键帧梳理(AI 内容工作台 2.0 / 3.0);② 5 份开源竞品独立分析体加 1 份汇总对比体(`content-workbench`);③ MCN 场景约束(多账号矩阵、短视频为主、整合营销)。
> 凡模型自补的内容标【假设】,凡来自具体来源的标【源:…】。
> 🔴 **上游状态(2026-10-07 22:3x 更新,此前一行已作废)**:第 ②类输入已**重写完成并逐条复核完毕**。5 份独立体在 21:40 到 22:01 重写为产品视角七节结构;汇总对比体在 22:3x 按新边界重排。逐条复核结论:**9 条受影响条目里 2 条改、7 条不改**(清单见 `执行会话/目标-重写5份竞品分析文档并重新生成MCN短视-72111e/复核清单-1a受影响条目.md`)。
> 本版据此改了两处:**F5 的措辞**(旧写「敏感词与事实检测」,新版事实是「敏感信息硬拦 + 人设一致性软劝」)、**F7 的依据列**(Easel 发布中心直证的只有「多平台」,「多账号」另找依据)。另外 §六 治理段的「组织级暂停」按新版改成「组织级急停」,并把三件事「人来做」的形态分开写。
> 其余受影响条目(F8、F9、F13、F10 后半、§三、§四 后两条、§七)复核后**依据全部坐实**,未改内容。
---
## 一、一句话
**做什么**:给 MCN 机构的内容团队做一套智能体工作台,把「找选题 → 做内容 → 多账号多平台发布 → 投放与商业化留痕 → 复盘回写」串成一条可复用、可追溯到单条素材的链路。
**为谁**:MCN 内容负责人、编导与文案、剪辑与投放。面向的是**一个账号矩阵**,不是单个账号。
**不做什么**:不做平台自动化代发(发布是人的动作);不自建投放系统(只对接与留痕);不做个人版单账号工具;不做数据仓库。
---
## 二、这份需求汇总了什么
| 来源 | 性质 | 证据等级 | 落点 |
|---|---|---|---|
| AI 内容工作台 2.0 / 3.0(作者「小曾」) | 关键帧视觉梳理,Obsidian 插件形态 | 视频画面级(532 加 772 帧逐帧读) | `参考资料/AI内容工作台_功能点梳理.md`、`参考资料/Bilibili_BV1gsHn6AEk6/`、`参考资料/YouTube_jVHyoCYidLM/` |
| Easel | 开源竞品 | 源码级 + 官方文档级 + **界面级**(唯一有官方截图的一家) | `content-workbench/证据附卷/1b-竞品分析-Easel.md` |
| OpenCreator | 开源竞品 | 源码级 + 官方文档级 | `…/1b-竞品分析-OpenCreator.md` |
| 文到 AI | 闭源商业产品 | **文档级**(仓库无源码,全仓 5 blob) | `…/1b-竞品分析-文到AI.md` |
| Postiz 与 PostSider | 开源竞品 | 源码级 + 官方文档级,含 fork 差异量化 | `…/1b-竞品分析-Postiz与PostSider同源双形态.md` |
| 5 项目清单与初步定位 | 独立体入口(竞品池总览) | 同各家 | `…/1b-竞品分析-5项目清单与初步定位.md` |
| 汇总对比体 | 主份,横向铺开加选型结论 | 综合上述五份 | `content-workbench/research/1b-竞品分析.md`(新版见目标目录 `72111e/1b-竞品分析-汇总对比体.md`) |
**证据强度要带着看**:文到 AI 那一列只有文档级证据,它的结论不能与另四个源码级项目同权;AI 内容工作台的结论来自视频画面,能确认「界面上有什么」,不能确认「它内部怎么实现」;界面级证据本组只有 Easel 一家有,所以凡是「界面怎么动」的判断,五家里只有 Easel 是直证,其余都是源码或文档反推。
---
## 三、产品定位与边界
一句话定位:**矩阵级的内容生产与经营中枢**,不是又一把写作工具。
和已有的三类工具比,差位有三条(这三条正好是竞品分析 §9.3 里写明的三个空白):
1. **发现热点这一段普遍弱**。做内容的三家里两家只是「有」,做发布的两家几乎不管。【源:竞品主份 §8 ①、§9.3①;独立体 Easel §三(热点雷达)、OpenCreator §三(「弱,没有热点发现」)、文到 AI §四(热点雷达,文档级)、Postiz 与 PostSider §四(弱)】
2. **合规的自动发布是空白**。现在只有「浏览器自动化(有账号风险)」和「官方 OAuth 或只填充(要人工)」两条路,没有第三条。【源:竞品主份 §9.3②;独立体 Postiz 与 PostSider §七 可突破 1 原话「这条第三条路还没人走」;独立体 Easel §六 弱 2(自认自动化发布有风控风险)】
3. **做内容与发内容仍是两套产品**,用户要在两处搬一次。机会在只做中间那段可复用的桥,而不是再造一个全链路。【源:竞品主份 §9.3③;独立体 Easel §七 可突破 1(「做内容」和「发内容」是两拨人在做两半,中间是断层);独立体 Postiz 与 PostSider §七 可突破 3(「那段桥还是空的」)】
本产品选的是第 1 条与第 3 条,第 2 条按 §六 F5 的边界处理:只做分级闸门,不做自动代发。
---
## 四、为谁做
**内容负责人**(主用户):定选题方向、审内容、看矩阵效果。他每天要回答的是「今天哪个账号发什么」。(【源:视频关键帧·对标与热点、发布与经营】)
**编导与文案**(高频用户):把一个选题做成成稿,走完创作流水线。他要的是「不用记 skill 名字,点就行」。(【源:视频关键帧·创作 Tab;独立体 Easel §五 机制 1「三层加载」——元数据常驻、指令触发、资源按需,机制带来的用户结果正是「技能多到一百多个,聊天仍然跑得动」】)
**剪辑与投放**(协作用户):拿到成稿做视频,管发布与投留痕。他要的是「素材和文案对得上」。(【假设:视频关键帧里只出现「生成录制卡片」和「收支」,投放侧没有画面证据;五家竞品也都没有 MCN 投放留痕这一段的证据 —— 独立体 OpenCreator §三 只到「审批、结果、继续对话」】)
---
## 五、使用场景
按用户故事写,四个槽位缺一不成立(谁、什么处境、要办成什么、得到什么结果)。
**S1 找选题**
作为编导,当我面对一个矩阵下十个账号、每天要出三条内容时,我要知道「哪个赛道的哪条内容数据异常地好」,这样我不用逐个平台刷榜。
【源:视频关键帧·对标博主监控四指标卡与「N 倍平时互动」异常值;竞品主份 §8 ①、§9.3①】
**S2 选题进资产库**
作为内容负责人,当我把一条爆款拆完,我要它的「角度、结构、开场白、标题」进资产库,这样下一次创作不是凭空写。
【源:视频关键帧·拆解与沉淀·资产库;独立体 文到 AI §四 能力 4「能力库」把稳定步骤沉淀为可复用方案】
**S3 走完创作流水线**
作为文案,当我要把一条选题做成短视频,我要在同一条流水线里走完「聊思路 → 写文案 → 起标题 → 做封面 → 发布检查 → 生成录制卡片」,不用记每个 skill 的名字。
【源:视频关键帧·创作 Tab 子流程;独立体 Easel §五 机制 1】
**S4 一份母版变多份**
作为运营,当一条母版内容做好,我要它变成矩阵下多个账号、多个平台各自的版本,这样我不用手工改十遍。
【源:独立体 Easel §四 能力 4「发布中心」——一处编辑、八端预览、超限当场标出(**直证的是「多平台」**);「多账号」靠 Easel 的多画像支持加本产品的矩阵需求,发布中心本身未见逐账号变体;独立体 文到 AI §四 能力 3「卡片工坊」一稿多形态】
**S5 发之前先过闸**
作为内容负责人,当我要把内容交出去发,我要在发之前看清两件事:哪里会被硬拦、哪里只是提醒(发布中心会把超限的当场标出来),而且不可逆的动作必须由人确认。
【源:独立体 Easel §四 能力 5(硬拦只认账号密钥与内部路径这类敏感信息,人设偏低只告警);独立体 Postiz 与 PostSider §五 机制 5(read-first / draft-first,发布仍是人的动作)】
⚠️ 上一版这里写「看到具体改哪一句」,新版没有这个依据 —— Easel 的发布中心只标超限和格式问题,不逐句给改写建议。已按事实收紧。
**S6 效果回写**
作为负责人,当一条内容跑完,我要它的表现沉淀回账号画像,这样下一轮选题自己会变准。
【源:独立体 Easel §三 核心步骤 6(读播放、互动、评论,把有效结构和偏好沉淀回画像记忆文件)+ §六 强 1(本组唯一把发现到归因串成闭环);视频关键帧·数据复盘「四分离」分析】
**S7 看整个矩阵**
作为机构负责人,当我的矩阵有二十个账号,我要一个界面回答「每个账号今天该发什么、发了什么、效果如何」。
【假设:独立体五家都只做单账号或单团队视角(PostSider 到「多组织机构」为止,还是团队级),矩阵级视图是推断出来的差位;视频画面里也只看到单账号工作台】
**S8 商单与内容对账**
作为商务,当一条内容带了商单,我要内容、发布记录与收支能对上。
【假设:视频关键帧里有「收支」Tab,但它记录的是什么口径没有画面证据;MCN 结算场景是推断的】
---
## 六、功能范围
每条给功能名、来自哪条场景、优先级、来源。优先级判据只有一句话,不给数字打分。
| # | 功能 | 来自 | 优先级 | 来源与说明 |
|---|---|---|---|---|
| F1 | 对标账号监控与爆款异常值识别 | S1 | P0 | 视频关键帧;不做则 S1 整条办不成 |
| F2 | 选题库与灵感速记(落本地知识库) | S1 S2 | P0 | 视频关键帧·首页随手记录加选题 |
| F3 | 评论区洞察找选题 | S1 | P1 | 视频关键帧;不做仍能从 F1 得选题,只是少一路输入 |
| F4 | 爆款拆解与资产库(角度、结构、开场白、标题四库) | S2 | P0 | 视频关键帧·关键差异化;这一条决定了「越用越准」 |
| F5 | 发布前分级闸门(**敏感信息硬拦 + 人设一致性软劝**) | S5 | P0 | 独立体 Easel §四 能力 5 两道闸:密钥、内部路径这类敏感信息 fail-closed 硬拦;人设一致性低于 80 分只告警。不过硬闸就不许发 |
| F6 | 创作流水线(聊思路到录制卡片七个环节) | S3 | P0 | 视频关键帧·创作 Tab |
| F7 | 一份母版到多账号多平台版本 | S4 | P0 | **Easel 发布中心直证「多平台」**(一处编辑、八端预览);**「多账号」的依据是 Easel 多画像支持 + 本产品的矩阵需求**,发布中心未见逐账号变体。不做则 S4 办不成 |
| F8 | 内容与素材的版本管理(改稿新建版本不覆盖) | S3 S4 | P1 | 独立体 OpenCreator §五 机制 4(修订产生新版本、带 `sourceArtifactIds` 溯源与 `stale` 标记);独立体 文到 AI §五 机制 4(版本可对比、可采用、可继续改)。本组两次独立观测到同一条 |
| F9 | 多账号画像与记忆(每账号独立,互不覆盖) | S6 S7 | P0 | 独立体 Easel §四 能力 2(六维画像)+ §五 机制 3(画像内联进 prompt、不写全局文件,为了并发不覆盖) |
| F10 | 效果复盘与归因回写 | S6 | P0 | 视频关键帧·四分离复盘(前半);独立体 Easel §三 核心步骤 6 加 §六 强 1(后半,**本组唯一闭环**) |
| F11 | 矩阵级看板(每账号该发什么、发了什么、效果如何) | S7 | P1 | 【假设】五家竞品无此形态 |
| F12 | 商单与收支记录、内容对账 | S8 | P2 | 【假设】视频关键帧有「收支」Tab,口径未证实 |
| F13 | 发布留痕与人工确认记录 | S5 | P1 | 独立体 Postiz 与 PostSider §四 能力 3(审批流、审计轨迹)+ §三 PostSider 核心步骤 3(草稿进审批队列,人批了才排上) |
| F14 | 录制卡片与画板(Excalidraw 形态) | S3 | P2 | 视频关键帧·画板模块;不影响场景办成,只是更好用 |
**六项治理要在每条功能条目里各自交代**(失败恢复路径、持久化范围、并发冲突、幂等、超时迁移目标、不可逆操作二次确认)。这几条在本版只列要求,具体落在②段 P0 条目上。「不可逆操作二次确认」与 F5、F13 直接相关,但**三件事「人来做」的形态不一样,别压成一句话**:
- **发布**:发布这个动作本身留在人手里(read-first / draft-first)。【源:独立体 Postiz 与 PostSider §五 机制 5】
- **删帖**:带破坏性注解,属需要二次确认的一类。【源:独立体 Postiz 与 PostSider §七 该借鉴 3,`destructiveHint: true` 只留给删帖和急停两件】
- **组织级急停**:触发与恢复都只有人能做。【源:独立体 Postiz 与 PostSider §三 PostSider「系统帮了什么」】
---
## 七、能力底座(从竞品抄什么、避什么)
**该抄的八条**(都能追溯到具体项目,节号指新版独立体):
1. **技能即能力**:技能不是名词,配可运行脚本,成品落盘。【源:独立体 Easel §四 能力 1(114 技能,技能树挂 146 个 `.py`)】
2. **三层加载加 `SKILL.md` 不超过 200 行**:元数据常驻、指令触发、资源按需。这是让能力持续变多而不炸 prompt 的唯一解。【源:独立体 Easel §五 机制 1】
3. **契约层独立成包**:三端同源,版本号明文可读。【源:独立体 OpenCreator §五 机制 3、§七 该借鉴 2(`packages/protocol` 与 `protocolVersion`)】
4. **状态机加版本号加幂等键三件套**,并为「远端到底收没收」专设 `unknown_remote_acceptance` 与 `abandoned_unknown` 两个状态。【源:独立体 OpenCreator §五 机制 3】
5. **read-first / draft-first**:Agent 可以准备、排期、送审,发布仍是人的动作。这条把「自动化」与「不可逆」分开。【源:独立体 Postiz 与 PostSider §五 机制 5】
6. **发布前分级闸门**:不可逆的硬拦,可商量的软劝,不做一刀切。【源:独立体 Easel §四 能力 5】
7. **本地与免密钥 provider 作一等公民**:用户不必先配 Key 才能开始用。【源:独立体 OpenCreator §五 机制 6(自注「本组三个做内容的项目都出现」)、文到 AI §五 机制 2、Easel §四】
8. **独立更新清单**:`channel`、逐包 `sha256`、`minimumSupportedVersion`、`allowSkip`、`remindAfterHours`。【源:独立体 文到 AI §五 机制 3(`stable.json` 逐字段)】
**该避的五条**:
避浏览器自动化发平台(账号风控是真实风险,Easel 自己在 README 里承认)【源:独立体 Easel §六 弱 2】。避 README 与发行状态脱钩(文到 AI 的文档停在「尚未发布」,实际已发 10 个版本)【源:独立体 文到 AI §六 弱 3】。避上游强耦合的薄壳路线(OpenCreator 把 Agent loop 全交给 Codex,一次破坏性变更就可能整体不可用)【源:独立体 OpenCreator §六 弱 1】。避命名双轨(产品改名了,内嵌件还用旧名)【源:独立体 OpenCreator §六 弱 4】。避素材授权未核实就用(一律先设 `draft`)【源:独立体 OpenCreator §五 机制 8、§七 该避开 4】。
---
## 八、明确不做
**第一版不做**:自动代发到平台(走 F5 加 F13 的人确认路径)。矩阵级的自动投放优化。跨机构协作与权限体系。移动端 App。把平台数据抓回来做数仓。
**这一版只留的三个入口**(其余先不铺):找选题、走创作流水线、看矩阵复盘。
---
## 九、假设与风险
| # | 假设或风险 | 类型 | 影响面 |
|---|---|---|---|
| A1 | MCN 的账号数在 10 到 50 之间,超出会让 F11 的看板要重新设计 | 假设 | F11、F9 |
| A2 | 平台数据靠官方接口或授权方式拿,不靠抓取 | 假设 | F1、F10;若拿不到,S1 与 S6 要降级 |
| A3 | 收支记录的口径是「内容级」而不是「月级」 | 假设 | F12 |
| A4 | 团队 5 到 20 人,不超过三层审批 | 假设 | F5、F13 |
| R1 | 上游模型或 Agent 引擎的破坏性变更 | 风险 | 全链路;对策是契约层加可用版本回退【源:独立体 OpenCreator §六 弱 1、§九 借鉴 6 迁移演练】 |
| R2 | 平台发布规则变动导致合规路线失效 | 风险 | F5、F7;对策是分级闸门加人工确认【源:独立体 Easel §六 弱 2、Postiz 与 PostSider §七 该避开 1】 |
| R3 | 资产库沉淀质量差,变成垃圾场 | 风险 | F4;对策是入库前设门禁,参照 OpenCreator 模板治理的 `draft` 做法【源:独立体 OpenCreator §五 机制 8】 |
| R4 | 多账号并发写同一份状态互相覆盖 | 风险 | F9;对策是记忆作用域收敛到画像目录,不写全局【源:独立体 Easel §五 机制 3】 |
---
## 十、待复核清单
以下 9 条是模型补全的,未经用户确认,不得在②段当事实用:
1、A1 的账号数区间(10 到 50)。
2、A2 的数据获取方式(官方接口优先)。
3、A3 的收支口径。
4、A4 的团队规模与审批层数。
5、S7 矩阵级视图是否真的需要,还是先只做单账号复制。
6、S8 商单对账是否进第一版。
7、F3 评论洞察的数据来源与频率。
8、「整合营销」到底含不含投放(若含,需要新增一条场景)。
9、本产品只服务一个机构自用,还是要做成可交付给别的机构的产品。
---
## 附:来源对照
| 功能或结论 | 主要来源 |
|---|---|
| F1 F2 F3 F4 F6 F14 | `参考资料/AI内容工作台_功能点梳理.md`(视频关键帧梳理) |
| F5 | 独立体 Easel §四 能力 5(发布安全闸门两道) |
| F7 | 独立体 Easel §四 能力 4(发布中心) |
| F8 | 独立体 OpenCreator §五 机制 4;独立体 文到 AI §五 机制 4 |
| F9 | 独立体 Easel §四 能力 2、§五 机制 3 |
| F10 | 视频关键帧(前半);独立体 Easel §三 核心步骤 6、§六 强 1(后半) |
| F13 | 独立体 Postiz 与 PostSider §四 能力 3、§三 PostSider 核心步骤 3 |
| §三 三条差位 | 汇总对比体 §8、§9.3①②③;独立体 Easel §七 可突破 1、Postiz 与 PostSider §七 可突破 1 与 3 |
| §七 该抄与该避 | 独立体 Easel §四 §五 §六、OpenCreator §四 §五 §六、Postiz 与 PostSider §五 §七、文到 AI §五 §六 |
| §九 R1—R4 对策 | 独立体 OpenCreator §五 机制 8、独立体 Easel §五 机制 3 |
| S7 S8 A1—A4 | 【假设】,无外部来源 |
🔴 **这张表里所有指向竞品分析的节号都已在 2026-10-07 22:3x 按新版独立体逐个核过**(新版独立体统一为七节结构,故不再出现旧的 `§8.2` / `§九` / `§十一` / `§十三` 这类编号)。指向视频关键帧梳理的行不受影响。
---
## 这一版跟上一版的实质差别
上一版(2026-10-07 21:36 写)发布时,第 ②类输入(6 份开源竞品分析)**正在按 1b 方法论重写**,它把 9 条受影响条目挂成「待复核」,并声明「⛔ 不得当终稿用」。这一版就是那份复核的结果落地。
实质差别逐条列:
1. **文首状态行整条换掉。** 上一版写「上游正在重写、9 条待复核、不得当终稿」;这一版写「重写完成并逐条复核完毕、9 条里 2 条改 7 条不改」,并把复核清单的路径写上。这是这一版存在的理由。
2. **F5 的措辞改了(这是内容层真改,不是换词)。** 上一版写「敏感词与事实检测,硬拦加软劝」。新版独立体里 Easel 的硬闸管的是 API key、内部路径这类**敏感信息**,软闸管的是**人设一致性**,全程没有「敏感词」也没有「事实检测」。照旧写会把②段带去做一个竞品池里没人做过的「事实核查器」。已改成「敏感信息硬拦 + 人设一致性软劝」。
3. **F7 的依据列改了。** 上一版直接写「Easel 发布中心;不做则 S4 办不成」,读起来像「Easel 的发布中心已经能做矩阵级变体」。新版独立体证明:发布中心直证的只有**多平台**(一处编辑、八端预览);**多账号**靠的是 Easel 的多画像支持,加上本产品的矩阵需求。依据列已按这个界线拆开写。
4. **S5 收紧。** 上一版写「我要在发之前看到哪里有风险、具体改哪一句」。「具体改哪一句」在新版独立体里找不到依据 —— Easel 的发布中心只标超限字数和格式,不逐句给改写建议。已改成「哪里会被硬拦、哪里只是提醒」,并加了警示行说明为什么收。
5. **§六 治理段的「人来做」拆开了。** 上一版把发布、删帖、组织级暂停三件事压成一句「必须人来做」。新版说的是:发布是人的动作、删帖带破坏性注解需要二次确认、组织级**急停**的触发与恢复只有人能做 —— 三件形态不一样。已拆成三条,并把「暂停」更正为「急停」。
6. **§七 的十三条依据全部换新版节号。** 上一版笼统写「四份单项目附卷的可借鉴点与风险段」(那些附卷当时还是旧结构);这一版逐条挂新版独立体的节号,并且每条都核过。
7. **§二 来源表重排。** 上一版把 6 份开源分析压成 4 行;这一版按「5 份独立体 + 1 份汇总对比体」分列,并把证据等级改成三级(加「界面级」,只 Easel 有),在表下补了一句「界面级的判断五家里只有 Easel 是直证」。
8. **§三 三条差位补独立体出处。** 内容判定没变(三条都坐实),但每条后面补上了独立体里的旁证,不再只靠汇总对比体一句话。
9. **§四、§九 的引用更新。** 编导与文案那条补了 Easel 三层加载的机制细节;R1 到 R4 的对策逐条挂上独立体节号;剪辑与投放那条仍是【假设】,因为五家竞品都没有 MCN 投放留痕的证据。
**没变的部分**:§一 一句话与不做什么、§五 的 S1 到 S8 骨架、§六 的功能编号与优先级、§八 明确不做、§十 的 9 条待复核。这些不受上游重写影响。
---
*本文档是「MCN 短视频内容整合营销智能体」的①段 1a 需求文档(汇总型)。上游取证见 `content-workbench` 的 1b 系列与 `参考资料/` 下的视频抽帧材料。本版落在目标目录 `72111e` 内,⛔ 未覆盖工作区根 `docs/pm/mcn-shortvideo-agent/research/1a-需求文档.md`。*
*(说人话自评:46/50 直接性 9 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,96 @@
# 1b 竞品分析 · 跨项目引用登记
> 项目 slug:`mcn-shortvideo-agent` | 本份不是分析本体,是**引用登记**。
> 上游状态:**1b 已就位,跨项目,本轮不重写**(用户口径逐字:「1b 竞品分析在 `content-workbench` 项目下已有 ⇒ 跨项目引用即可,⛔ 不重写,但要把引用关系写清」)。
> 登记时间:2026-10-08 | 登记人:任务会话 `[执行]-[开源项目调研]-补齐MCN工作台①②段产出`
---
## 一、先说一处更正:路径
派活原文写的落点是 `docs/pm/content-workbench/research/1b-竞品分析.md`。**这个路径在本工作区不存在**(实测:`docs/pm/` 下只有 `mcn-shortvideo-agent/research/1a-需求文档.md` 一份)。
1b 真正的落点在上一个目标目录里:
| 体例 | 实际路径(本工作区相对) |
|---|---|
| 汇总对比体(恒一份) | `执行会话/目标-调研5个开源内容工作台项目并生成分析文档-5199a6/docs/pm/content-workbench/research/1b-竞品分析.md` |
| 独立分析体(5 份) | 同目标 `…/docs/pm/content-workbench/证据附卷/` 下:`1b-竞品分析-Easel.md`、`-OpenCreator.md`、`-Postiz与PostSider同源双形态.md`、`-文到AI.md`、`-5项目清单与初步定位.md` |
| 原始取证(约 210 件) | 同目标 `…/取证/`:`api/`、`api/fork/`、`easel/`、`opencreator/`、`wendao/` |
⚠️ 另有**新版汇总对比体**落在 `…-72111e/1b-竞品分析-汇总对比体.md`(第二版,2026-10-07 22:3x,按方法论 §0.4 收紧为纯横向)。本目标引用 1b 时**以这一份为汇总体的准据**,5199a6 里那份是它改版前的同源件。
来源状态逐条核过:
- 5 份独立体 mtime:2026-10-07 21:40–22:01(14–33 KB),已按方法论 §11 的七节结构重写。
- 新版汇总对比体 mtime:2026-10-07 22:3x。
- 两者都经 1a 的复核流程核过一遍,结论见 `…-72111e/复核清单-1a受影响条目.md`(9 条里 2 条改、7 条不改)。
---
## 二、竞品池与证据等级(引用时必须带着读)
池子按用户动作分两层,本次**没有**点名参考实装:
1. 直接竞品(做内容):`ZJU-REAL/Easel`、`krillinai/OpenCreator`、`wendaoai/wendao-content-workbench`(文到 AI)。
2. 间接与替代(发内容):`gitroomhq/postiz-app`、`lumizone/postsider`(后者是前者的 fork,按一条产品线两个形态处理)。
证据分三级,**不同级不同权**,引用处必须标:
- 源码级:Easel、OpenCreator、Postiz、PostSider 四家。
- 官方文档级:同上四家另有一层。
- 界面级:**只有 Easel 一家**(4 张官方工作台截图)。所以「界面怎么动」这类判断,五家里只有 Easel 是直证。
- 文档级:**只有文到 AI**(全仓 5 个 blob,无业务源码)。它的结论不与另四家同权。
全组共性缺口:真实用户量、下载量、营收基本查不到;**真实运行证据为零**(全程静态取证,未安装、未编译、未运行)。
---
## 三、本产品引用了 1b 的哪几条结论
引用点逐条列,下游(1c / 1d / 1e / 2a)凡用到 1b,出处都落在这张表里。
| 引用点 | 用在哪 | 1b 出处 | 证据等级 |
|---|---|---|---|
| 三条差位之一:发现热点这一段普遍弱 | `1d-产品策略.md` §2 市场切分、§4 价值主张 | 汇总对比体 §8 ①「全组普遍弱」;独立体 Easel §三(热点雷达)、OpenCreator §三(自认弱)、文到 AI §四(文档级)、Postiz 与 PostSider §四(弱) | 源码级 + 文档级 |
| 三条差位之二:合规的自动发布是空白 | `1d-产品策略.md` §5 取舍 | 汇总对比体 §9.3②;独立体 Postiz 与 PostSider §七 可突破 1 原话「这条第三条路还没人走」 | 源码级 |
| 三条差位之三:做内容与发内容是两套,中间那桥是空的 | `1d-产品策略.md` §2、§4 | 汇总对比体 §9.3③;独立体 Easel §七 可突破 1、Postiz 与 PostSider §七 可突破 3 | 源码级 |
| 发布前分级闸门:一道硬拦、一道软劝 | `2a-产品功能.md` F5 | 独立体 Easel §四 能力 5 | 源码级 |
| 发布中心直证的是「多平台」,「多账号」另找依据 | `2a-产品功能.md` F7 | 独立体 Easel §四 能力 4(一处编辑、八端预览);多账号落在画像层(独立体 §二、§三 步骤 1) | 源码级 + 界面级 |
| 改稿新建版本、不覆盖,本组两次独立观测 | `2a-产品功能.md` F8 | 独立体 OpenCreator §五 机制 4;独立体 文到 AI §五 机制 4 | 源码级 + 文档级 |
| 画像六维,记忆作用域收敛到画像目录(不写全局) | `2a-产品功能.md` F9 | 独立体 Easel §四 能力 2、§五 机制 3 与 4 | 源码级 |
| 归因回写闭环,本组只有 Easel 做成 | `2a-产品功能.md` F10、`1d-产品策略.md` §9 | 独立体 Easel §三 核心步骤 6、§六 强 1 | 源码级 |
| 审计轨迹 + 审批队列(草稿进队列,人批了才排上) | `2a-产品功能.md` F13 | 独立体 Postiz 与 PostSider §四 能力 3、§三 PostSider 核心步骤 3 | 源码级 |
| read-first / draft-first,发布是人的动作 | `1d-产品策略.md` §5、`2a-产品功能.md` F5 与 F13 | 独立体 Postiz 与 PostSider §五 机制 5 | 源码级 |
| 技能三层加载、`SKILL.md` 不超 200 行 | `1d-产品策略.md` §8 能力 | 独立体 Easel §五 机制 1 | 源码级 |
| 六项工程做法(契约层独立成包、状态机三件套、风险注解、迁移演练、性能门禁、独立更新清单) | `2a-产品功能.md` §四 六项治理 | 汇总对比体 §9.1 第 1–10 条 | 源码级 |
| 素材授权未核实就先用 ⇒ 一律先设 `draft` | `2a-产品功能.md` §四 六项治理(幂等与入库门禁) | 独立体 OpenCreator §五 机制 8、§七 该避开 4 | 源码级 |
**引用纪律**:文到 AI 只是文档级,凡引用它的地方都已标出;「界面怎么动」的判断凡不是 Easel,都按源码或官方文档反推,不当直证用。
---
## 四、1b 的两处用法边界(防越界)
1. **本份不重写分析**。要读某一家具体长什么样、用户怎么用它,去 5199a6 的独立体;要读横向对比与选型结论,去新版汇总对比体。本份只回答「哪些结论被本产品引用、追到哪一节」。
2. **1b 的结论不直接等于本产品的功能**。本产品选的是三条差位里的第 1 条与第 3 条,第 2 条(合规自动发布)按 F5 的边界处理:只做分级闸门,不做自动代发。这个取舍写进 `1d-产品策略.md` §5,不写在本份。
---
## 五、缺口(照实列,不补编)
1. **502 版本号、许可、风险、取证冲突、已知缺口这五类工程与合规内容**都在汇总对比体的 §附 A 到 §附 E 里,本份不重抄;需要时按 §一 的路径去读。
2. **`docs/pm/content-workbench/` 这个路径在本工作区不存在** —— 若后续会话按派活原文去那儿找,会读空。已在 §一 给出真路径。
3. **「整合营销」含不含投放,1b 里没有答案**(五家竞品都没有 MCN 投放侧的证据)。这是 1a 待复核清单第 8 条,属①段悬空项,已带进 `1e-使用场景.md` 与 `2a-产品功能.md` 的假设台账,⛔ 没有当事实用。
---
## 附:本份自检
- [x] 1b 落点写真路径,并更正了派活原文里的错路径
- [x] 竞品池两层与证据三级都列了,文档级那家标明不与另四家同权
- [x] 引用点逐条追到 1b 的节号,标注证据等级
- [x] 未重写分析本体,未新增第 6 份①段文档
- [x] 缺口照实列,未补编
*(说人话自评:47/50 直接性 10 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,202 @@
# 1c 用户画像
> 项目 slug:`mcn-shortvideo-agent` | ①段第 3 子步,产出 `research/1c-用户画像.md`
> 判据源:`stage-discovery/references/user-personas.md`
> 写在最前面的丑话:**本项目拿不到一份访谈原话。** 所以这份画像的每一条都按下面两档标来源,⛔ 不装成用研结论:
> · 【可核观察】能追回 `1a-需求文档.md` 的某一行、`参考资料/AI内容工作台_功能点梳理.md` 的某条画面、或 1b 某家的源码与官方文档。
> · 【推演】追不回任何外部依据,只是合理外推。**【推演】不得进 `1d-产品策略.md` 当依据**(方法论硬规矩)。
> ⚠️ 真正的用研缺口在第 §五 节,读之前先看那一节。
---
## 一、画像怎么来的
方法论要求「从调研数据里做画像」。本项目手上只有三类料:
1. `1a-需求文档.md` §四「为谁做」——三种角色的职责与诉求,来自视频关键帧与竞品取证。
2. `参考资料/AI内容工作台_功能点梳理.md`——532 + 772 帧逐帧读出来的界面画面。它能看到「界面上有什么」,看不到「人怎么想」。
3. 1b 五家的独立分析体——里面有用户角色的线索,但都是从产品形态反推的,不是访谈。
**第一步就把话说清**:这三类料里,第 3 类是**别人的产品的用户**,不能直接当成本产品的用户画像。所以下面三个画像的骨架取自第 1 类,细节校验靠第 2 类,第 3 类只用来交叉验证「这类人的行为规律是不是行业通例」。
三个画像按**动机和要办的事**分,不按职级分。分成三个不重叠的:
| 画像 | 角色 | 一句话动机 |
|---|---|---|
| 陈叙 | 内容负责人(主用户) | 让这个矩阵每天有东西发,且发出去的东西不出事 |
| 林悦 | 编导与文案(高频用户) | 把一条选题稳定地做成能发的成稿 |
| 周野 | 剪辑与投放(协作用户) | 拿到的东西和文案对得上,别返工 |
> ⚠️ **一处必须先认掉的不一致**:`1a-需求文档.md` §五 S7 写的是「作为**机构负责人**」,而 §四 只列了三种角色,没有机构负责人。1a 自己没对齐。本份的处理:把 S7 的诉求并进陈叙画像(在 5 到 20 人的团队里,内容负责人通常就兼着矩阵视角,这是【推演】,依据是 A4 假设的团队规模),**并把这条列进缺口**,⛔ 不替 1a 拍板说机构负责人是第四个角色。
---
## 二、画像一:陈叙 · 内容负责人
### 基本信息
35 岁上下,MCN 机构的内容负责人,团队规模按 A4 假设在 5 到 20 人之间(**A4 未经用户确认**)。管一个账号矩阵,账号数按 A1 假设在 10 到 50 之间(**同样未经确认**)。关键特征:他不是最会写的人,是**决定今天哪个账号发什么、并且签字放行**的那个人。
【可核观察:`1a-需求文档.md` §四 第一条「定选题方向、审内容、看矩阵效果。他每天要回答的是『今天哪个账号发什么』」】
### 主要「要办的事」
核心结果:让矩阵里每个账号每天都有该发的东西,且发出去的内容不踩线。
处境:早上打开电脑那一刻,面对十几个账号,得排出今天的活儿。
频率:每天一次,是日常动作,不是项目动作。
【可核观察:同上 §四;另 §五 S1 写了「面对一个矩阵下十个账号、每天要出三条内容」】
### 三条主要痛点
1. **选题靠人刷**。挨个平台翻榜、翻对标号,翻完一小时过去了,还未必翻到真在涨的。影响:直接吃掉每天最能干活的那段早上。
【可核观察:1a §五 S1「这样我不用逐个平台刷榜」;1b 汇总对比体 §8 ①「全组普遍弱」】
2. **发之前心里没底**。哪句话会踩平台红线、哪个账号的口径不合,他心里只有个模糊感觉,没有清单。影响:出一次事就得删帖、道歉,代价不可逆。
【可核观察:1a §五 S5;独立体 Easel §四 能力 5(硬闸管敏感信息、软闸管人设一致性)】
3. **矩阵看不见**。他现在靠一个个账号点进去看,没有一屏能回答「每个账号今天该发什么、发了什么、效果如何」。影响:忙的时候顾不上,等于放弃了矩阵管理。
【可核观察:1a §五 S7;独立体五家都只做单账号或单团队视角】
⚠️ 第 3 条的**痛点强度**是【推演】——五家竞品都没这个形态,说明「没人做」,但不等于「用户一定痛」。这条进 1d 前必须降级使用。
### 三个想要的结果
1. 早上打开就能看到「今天这十几个账号各发什么」,不用先想。
2. 交出去发之前,有张清单告诉他哪里会硬拦、哪里只是提醒。
3. 一个账号跑出来什么规律,下一次它自己就带上了,不用他记。
【可核观察:分别对应 S1、S5、S6;第 3 条另见独立体 Easel §三 核心步骤 6(归因回写画像记忆文件)】
衡量成功的方式:他自己每天的「排活+审稿」时间下来了,且没出过下线事故。【推演】
### 一条和直觉相反的发现
**他并不想要「一条龙全自动」。** 按产品直觉,负责人应该最盼着把发布也交出去。但 1b 里的证据是反的:五家里四家把不可逆的那一步留给了人(Easel 分级闸门、PostSider 到送审为止、文到 AI 只填充不代发、Postiz 不自动化不抓取)。这条在本组是**共识**,不是某一家懒得做。
为什么影响产品决策:说明「发布归人」不是我们能力不够的妥协,而是这类用户真实的口味。F5 与 F13 的设计方向因此站得住。
【可核观察:1b 汇总对比体 §6 第 3 组「方向一致:把不可逆的那一步留给人」】
### 产品契合度
接得住的:F1(对标监控与异常值)、F5(分级闸门)、F11(矩阵看板)正对着他三个痛点里最硬的两个。
接不住的:他要的「一屏看全矩阵」,先决条件是平台数据能拿到(**A2 假设**)。拿不到就只能靠手填,那 F11 就退化成一张手工表。【可核观察:1a §九 A2 明写「若拿不到,S1 与 S6 要降级」】
摩擦点:他不写稿,但要在稿子上签字。所以他的主路径是「看+批」,不是「改」。界面若把他默认丢进编辑器,他会烦。【推演】
---
## 三、画像二:林悦 · 编导与文案
### 基本信息
27 岁上下,编导兼文案,团队里干活最多的一类人。同时跟两三个账号的稿子。关键特征:工具熟,但**不想记工具的名字**——她要的是把活干完,不是研究系统。
【可核观察:1a §四 第二条「他要的是『不用记 skill 名字,点就行』」;`参考资料/AI内容工作台_功能点梳理.md` 模块 5 写「直接带入初稿,不用记每个 skill 的名字」】
### 主要「要办的事」
核心结果:把一条选题稳定地做成能发的成稿(文案、标题、封面齐)。
处境:选题定了,手上什么都没有,要从零起。
频率:每天两到三条,是全天最高频的动作。
【可核观察:1a §四 第二条、§五 S3;`参考资料` 模块 5 的七个子环节(聊思路 → 写文案 → 起标题 → 做封面 → 发布检查 → 生成录制卡片 → 发布)】
### 三条主要痛点
1. **每次都在凭空写**。上一条爆款的结构、开场白、标题的写法,留在她自己的印象里,换个账号就重新摸。
影响:她的产出质量随当天状态飘,人一累就掉。
【可核观察:1a §五 S2「这样下一次创作不是凭空写」;§六 F4 注明「这一条决定了『越用越准』」】
2. **能力散在好几个地方**。写文案一个地方、起标题一个地方、做封面又一个地方,中间靠复制粘贴搬。
影响:每条内容要搬三次,一天两条就是六次无谓动作。
【可核观察:`参考资料` 模块 5 把七个环节列成一条流水线的子 Tab——**说明现实里它们原本是散的**,这个流水线正是对痛点的回应】
3. **一条母版要被手工改成十份**。矩阵下每个账号的口径不一样,她得一条条改。
影响:这是矩阵场景下最直接的工时黑洞。
【可核观察:1a §五 S4「这样我不用手工改十遍」;独立体 Easel §四 能力 4(一处编辑、八端预览)】
⚠️ 「改十份」这个具体数字是【推演】,S4 只写「多个账号、多个平台」;账号数上限按 A1 假设。
### 三个想要的结果
1. 一条选题进去,七个环节在同一个地方走完,中间不搬。
2. 爆款拆出来的角度、结构、开场白、标题能存下来,下次直接拿。
3. 母版改一次,各账号各平台的版本跟着变。
【可核观察:分别对应 S3、S2、S4】
衡量成功的方式:她一条内容从起手到成稿的时间;以及一周里「复制粘贴」这个动作出现的次数。【推演】
### 一条和直觉相反的发现
**「能力变多」对她不是好事。** 常理是功能越多越强。但 1b 里 Easel 的机制说明反了:一百多个技能堆进去,靠三层加载(元数据常驻、指令触发、资源按需)+ `SKILL.md` 压到 200 行以内,聊天才跑得动,用户也不用自己去关技能。
为什么影响产品决策:我们加能力时必须同时加「用户看不见它」的机制。否则每加一个功能,她的负担就重一分。
【可核观察:独立体 Easel §五 机制 1;1a §四 第二条已引用同一条】
### 产品契合度
接得住的:F6(创作流水线)、F4(资产库)、F7(母版多版本)三条正对她的痛点,且都有竞品直证。
接不住的:F4 的资产库有个反噬风险——1a §九 R3 自己就写了「沉淀质量差,变成垃圾场」。入库没门禁的话,她的痛点 1 会从「凭空写」变成「在一堆废料里找」。【可核观察:1a §九 R3】
摩擦点:她要的是「点就行」,不是「先选 skill」。凡是需要她做技术选择的界面,都是给她加负担。【可核观察:1a §四 第二条】
---
## 四、画像三:周野 · 剪辑与投放
### 基本信息
30 岁上下,剪辑兼投放,一个人管着成片和发布记录。在团队里是「拿到东西才能开工」的下游。关键特征:他不管内容好不好,只管**手上这条素材和文案是不是同一件事**。
【可核观察:1a §四 第三条「拿到成稿做视频,管发布与投留痕。他要的是『素材和文案对得上』」】
### 主要「要办的事」
核心结果:把成稿变成成片,按版本发到各账号各平台,并且留得下记录。
处境:文案定稿那天,几条内容一起压过来。
频率:跟着发布节奏走,一天一到两批。
【可核观察:同上 §四 第三条;§五 S4(多账号多平台版本)、S5(发之前过闸)】
### 三条主要痛点
1. **素材和文案对不上**。他手上是视频文件,文案在别处,改稿了没人告诉他,他剪的是上一版。
影响:返工。而且返工是隐性的——发出去才发现。
【可核观察:1a §四 第三条原文;§六 F8 的版本管理(改稿新建版本不覆盖)正是冲这个来的】
2. **一条要发好几个账号好几个平台**,每个平台的规格、字数、封面都不一样,他靠手记。
影响:这是发布环节最费工的一段,且容易漏。
【可核观察:独立体 Easel §三 核心步骤 5(发布平台 8 个 chip,每平台一张预览卡)+ §四 能力 4(字数与格式超限当场标出)】
3. **发完之后没人记账**。发了几条、什么时候发的、对应哪版文案,散在聊天记录里。
影响:出问题回溯不到源头;商单来了对不上账。
【可核观察:1a §五 S8、§六 F13;独立体 Postiz 与 PostSider §四 能力 3(审计轨迹)】
⚠️ 第 3 条的**后半(商单对账)是【推演】**,S8 整条在 1a 里就标着【假设】。
### 三个想要的结果
1. 打开一条内容,能看到它的文案是哪一版、素材是哪一版,改过什么。
2. 母版改一次,各平台的版本跟着走,超限的地方当场标出来。
3. 每条发布自动留痕,谁在什么时候确认发的,查得到。
【可核观察:分别对应 F8、F7、F13;第 1 条另见独立体 OpenCreator §五 机制 4(带 `sourceArtifactIds` 溯源与 `stale` 标记)】
衡量成功的方式:返工次数;以及回溯一次要花多久。【推演】
### 一条和直觉相反的发现
**他要的不是「更快的发布」,是「可回溯的发布」。** 直觉上投放岗最在意效率。但 1b 里 PostSider 做对了的地方是「草稿进审批队列,人批了才排上」——它主动把发布变慢了一步,用户反而认这个。因为发出去收不回来,慢一点换得到的确定性更值钱。
为什么影响产品决策:F5 的闸门和 F13 的留痕不是「效率功能」,是「确定性功能」。它们的验收标准应该是「追得到」而不是「点得少」。
【可核观察:独立体 Postiz 与 PostSider §五 机制 5、§三 PostSider 核心步骤 3】
### 产品契合度
接得住的:F8(版本管理)、F7(多版本)、F13(留痕)三条。
接不住的:**投放这一段产品没有证据支撑**。1a §四 第三条自己就标着【假设】,五家竞品也都没有 MCN 投放留痕的证据(独立体 OpenCreator §三 只到「审批、结果、继续对话」)。所以周野画像里凡涉及投放的部分,本产品**暂时接不住,也说不清该怎么接**。
【可核观察:`1a-需求文档.md` §四 第三条的【假设】;1b 独立体 OpenCreator §三】
摩擦点:他的主路径是「检查+确认」,动作少但要快。界面上把预览埋在两层下面,他会边走边骂。【推演】
---
## 五、用研缺口(这一节是这份文档最该被读的部分)
1. **零访谈、零问卷、零真实行为数据。** 三个画像的骨架全部来自 `1a-需求文档.md` §四 的三行角色描述。这不是用研,是**对需求的再组织**。⛔ 不许对外说是「基于用户调研」。
2. **痛点强度全是估的。** 三条痛点里,能追到明确出处的(如「不用逐个平台刷榜」)算可核;「影响多大」那一半基本是【推演】。1d 引用时只许引可核那一半。
3. **机构负责人这个角色在 1a 里悬空**(S7 用了,§四 没列)。本份的处理写在上文 §一 的说明里,待用户拍板。
4. **投放侧一个证据都没有**(1a 待复核第 8 条:「整合营销到底含不含投放」)。这一条不澄清,画像三只有半个人。
5. **A1/A4 两条假设直接撑起了画像的基本信息**(账号数 10–50、团队 5–20 人)。假设一歪,画像一的处境描述跟着歪。两条都未经用户确认。
**三条回收字段**(方法论要求,缺一不许落盘):
复核人 = 本工作区主会话转用户;复核时机 = ①段收口时一次性过,②段落盘前必须回填;结论落点 = 本文件 §五 与 `research/1e-使用场景.md` 的假设台账。
---
## 附:本份自检
- [x] 做了 3 个画像,按动机与要办的事分,不按人口统计分
- [x] 每个画像都有基本信息、要办的事、三条痛点、三个想要的结果、一条反直觉发现、产品契合度
- [x] 每条结论标了来源,追不到外部依据的标【推演】并明写不进 1d
- [x] 无可引原话 —— 已在文首明说,未伪造
- [x] 画像之间不重叠(负责人管批、编导管做、投放管发与留痕)
- [x] 数据缺口单列一节,并给了回收三字段
- [x] 未新增①段白名单外的文档
*(说人话自评:46/50 直接性 9 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,252 @@
# 1d 产品策略
> 项目 slug:`mcn-shortvideo-agent` | ①段第 4 子步,产出 `research/1d-产品策略.md`
> 判据源:`stage-discovery/references/product-strategy.md`(九节画布 + 关键假设)
> 证据规则:本份每条结论都能追到 `1a-需求文档.md` 的某一行、`1b-竞品分析.md` 的某个引用点、或 `1c-用户画像.md` 的某条【可核观察】。三类都追不到的,标 `【假设】`。
> ⛔ **1c 的【推演】条目不作为本份依据**(方法论硬规矩)。凡本份用到画像,出处都是【可核观察】。
---
## 开场:一句话定位与两条边界
**定位**:矩阵级的内容生产与经营中枢。不是又一把写作工具。
【源:`1a-需求文档.md` §三 一句话定位】
两条边界一起说清,免得后面九节各自跑偏:
1. **它服务的是一个账号矩阵,不是一个账号**。【源:1a §一「面向的是一个账号矩阵」】
2. **它不代替人做不可逆的动作**。发布、删帖、组织级急停都留在人手里。【源:1a §六 治理段(新版已按事实拆成三条);1b 引用点「read-first / draft-first」】
---
## 1. 愿景
靠什么打动人:把「该做什么 → 做出来 → 发出去 → 知道效果」串成一条链,并且**越跑越顺**。
想做成的样子:编导早上打开就知道今天该做什么;改一次母版,各账号各平台的版本跟着走;一条内容跑完,它的表现自己回到账号画像里,下一轮选题因此更准。
坚持什么:
- 不让用户记工具的名字。能力藏在流程里,用户只点「起标题」「做封面」这种东西。
- 不把不可逆的动作交出去。宁可多一步确认,也不冒删帖和封号的风险。
- 沉淀要留得住。拆解的结果进资产库,不进垃圾桶。
【源:1a §七 该抄第 1、2、6 条;1c 画像二「一条和直觉相反的发现」】
---
## 2. 市场切分
按人遇到的问题切,不按机构规模切。MCN 里真正被卡住的只有三件事:
**切分 A|今天该做什么,定不出来。**
要办的事(JTBD):在有限时间里排出一个矩阵当天的内容计划。
想要的结果:不用逐个平台刷榜就能看到哪条内容在涨。
限制条件:平台数据只能通过官方接口或授权方式拿(**A2**),拿不到这一条就退化成手工表。
【源:1a §五 S1、§九 A2;1b 引用点「发现热点普遍弱」】
**切分 B|有了选题,做不成可复用的产出。**
要办的事:把一条选题稳定地做成能发的成稿,且下次不是从零起。
想要的结果:爆款拆出来的角度、结构、开场白、标题拿得到;母版改一次,多账号多平台版本跟着走。
限制条件:资产库要有入库门禁,否则会变成垃圾场(**R3**)。
【源:1a §五 S2、S3、S4,§六 F4、F7,§九 R3;1b 引用点「发布中心直证多平台」「改稿新建版本不覆盖」】
**切分 C|发出去之后,事情回不来。**
要办的事:在交出去之前知道哪里会被硬拦、哪里只是提醒;发完之后对得上账。
想要的结果:不可逆动作有人确认;发布有留痕,查得到。
限制条件:平台发布规则会变(**R2**),合规路线要留回退余地。
【源:1a §五 S5、S6、S8,§九 R2;1b 引用点「分级闸门」「审计轨迹与审批队列」】
**第一拨切给谁**:切分 B + 切分 C,先不做 A。
**为什么先切这一拨**:1b 里三条差位给了答案。差位一是「发现热点这一段普遍弱」,差位三是「做内容与发内容仍是两套产品,中间那段桥是空的」。本产品选的是**第 1 条与第 3 条**。
但 A 与 B 的性质不一样:A 要拿平台数据(**A2 假设**,不成立就整条垮);B 与 C 靠的是本地能力与流程,不依赖外部数据授权。
⇒ 所以第一拨压 B + C,A 只做「不依赖外部数据也能跑」的那半(对标账号手工录入 + 异常值识别),平台自动抓取往后放。
【源:1a §三(三条差位与选题结论);1b 引用点三条差位;1a §九 A2】
---
## 3. 相对成本
选**独特价值**,不选低成本。
理由:本产品是给一个机构自己用的(**待复核第 9 条**:是只服务一个机构自用,还是要做成可交付给别的机构的产品 —— 未经确认)。自用工具的「成本」不是服务器账单,是**维护它要花的人力**。
1b 里两家把这个取舍摆得很清楚:Easel 自建技能运行时,能持续长能力;OpenCreator 把 Agent 循环全透传给 Codex,省一半工期,代价是上游一次破坏性变更就可能整体不可用。【源:1b 引用点;独立体 OpenCreator §六 弱 1】
本产品的取法:**学 Easel 那条自建运行时,用 OpenCreator 的契约与治理做法当工程底座**。不走薄壳透传。
⇒ 相对成本的位置:比薄壳路线贵(要自己维护运行时),比全自研便宜(契约与治理有现成范式可搬)。这个位置是**选出来的**,不是折中出来的。
【源:1b 汇总对比体 §10 第 7 条(「以 Easel 的技能体系为主干,以 OpenCreator 的契约与治理为工程底座」)】
---
## 4. 价值主张
按三个切分各写四条。
### 切分 A
- **之前**:早上打开电脑,挨个平台翻榜、翻对标号。翻完一小时,还未必翻到真在涨的。
- **怎么做**:把对标账号收在一处,盯「数据远高于这个号平时水平」的那几条,把异常值当入口,不把时间花在刷榜上。
- **之后**:早上第一眼看到的是「有几条在涨」,不是「今天还没刷榜」。
- **替代**:现在就是靠人刷。这个替代方案的成本**随账号数增长**(10 个号还行,50 个号就崩)——满足方法论 §5 的第 ③ 类「不简单」证明。
【源:1a §五 S1、§六 F1;`参考资料` 模块 2「爆款内容异常值」四指标卡;方法论 usage-scenario §5】
### 切分 B
- **之前**:上一条爆款的结构和写法留在编导印象里;写文案、起标题、做封面的能力散在三处,靠复制粘贴搬;一条母版要手工改成多份。
- **怎么做**:七个环节放同一条流水线;爆款拆完进资产库(角度、结构、开场白、标题四库);母版改一次,各账号各平台的版本跟着走。
- **之后**:一条内容从起手到成稿不搬家;下一条不是凭空写;矩阵版本不用手工改。
- **替代**:现在靠编导的记忆加手工复制粘贴。成本随「账号数 × 内容数」增长 —— 同样是随规模涨的那一类。
【源:1a §五 S2、S3、S4,§六 F4、F6、F7;`参考资料` 模块 5 七个子 Tab;1c 画像二】
### 切分 C
- **之前**:发之前心里只有个模糊感觉;发完之后发了几条、对应哪版文案,散在聊天记录里。
- **怎么做**:发布前两道闸(硬拦敏感信息、软劝人设一致性);不可逆动作由人确认;发布与确认记录留痕。
- **之后**:交出去之前知道哪里会硬拦、哪里只是提醒;出问题回溯得到源头。
- **替代**:现在靠感觉加聊天记录。这个替代的成本不在时间上,在**出错不可逆**上 —— 属方法论 §5 的第 ① 类「有真实成本(出错)」。
【源:1a §五 S5、S8,§六 F5、F13;1b 引用点「分级闸门」「审计轨迹」;方法论 usage-scenario §5】
---
## 5. 取舍
**明确不做**(与 1a §八 逐条对齐,⛔ 未自行裁剪):
1. 不做平台自动化代发。走 F5 加 F13 的人确认路径。
2. 不做矩阵级的自动投放优化。
3. 不做跨机构协作与权限体系。
4. 不做移动端 App。
5. 不把平台数据抓回来做数仓。
**第一版只留三个入口**:找选题、走创作流水线、看矩阵复盘。其余先不铺。
【源:1a §八,逐字一致】
说不,换来什么:
- 不做自动代发 ⇒ 换掉整条账号风控风险线。Easel 自己在 README 里承认自动化发小红书有验证、限流、封号风险,这条线一旦进来就没法收。【源:1b 引用点;1a §七 该避第 1 条】
- 不做投放系统 ⇒ 保住边界清晰。投放系统是另一个产品,进来会把这个产品的定义冲掉。
- 不做跨机构权限 ⇒ 省掉三层以上的审批模型。A4 假设团队不超过三层审批,超了这套就白做。【源:1a §九 A4】
- 不做数仓 ⇒ 省掉数据合规与抓取这条线。
**一条必须挑明的互斥**:1b 的结论是「同一条产品线里不能既自动发、又宣称合规」。Easel 走浏览器自动化,Postiz 走官方 OAuth、不抓取不自动化,两条是**互斥的设计红线**。本产品明确选 Postiz 那一侧。
【源:1b 汇总对比体 §9.2 第 1 条(设计红线)】
---
## 6. 关键指标
⚠️ **先说清**:本项目没有任何基线数据,所以下面只给**指标名**与判据,⛔ 不给数字,也不给权重。填数字就是编。
**北极星指标(一个)**:矩阵里「按计划完成发布的内容条数」除以「计划的内容条数」。它带动整条链:选题要有,成稿要出得来,发布要过闸。
为什么选它:它同时受切分 A/B/C 三段影响,任何一段垮掉它都掉。
【源:1a §一 链路定义;§八「三个入口」】
**OMTM(本季只优化这一个)**:一条内容从「选题定下」到「成稿」的耗时。
为什么先优化它:切分 B 是第一拨的首位,且它不依赖外部数据授权(**A2**),是唯一可以马上动的一段。
【源:§2 第一拨切分;1c 画像二「衡量成功的方式」】
**反指标(防止把北极星做歪)**:下线事故次数(内容因踩线被平台处理)。它必须与北极星一起看 —— 只看发布量,就会鼓励把闸门放松。
【源:1a §九 R2;1c 画像一「衡量成功的方式」】
---
## 7. 增长
**这一节的成立与否,卡在待复核第 9 条**(只服务一个机构自用,还是做成可交付给别的机构的产品)。两种读法给两套答案,⛔ 不替用户拍板:
**读法一:只服务一个机构自用(暂按这个走)**
- 增长不适用。没有获客,没有渠道,没有单位经济。它的「增长」是**内部采纳深度**:团队里几个人真在用、用了几条内容。
- 唯一要盯的:别做成人人绕过的工具。1b 里文到 AI 有个反面案例 —— 对外文档与发行状态脱钩,标着「尚未发布」实际已发 10 个版本,说明**文档与真实使用状态脱钩这件事会悄悄发生**。【源:1a §七 该避第 2 条;1b 引用点】
**读法二:要做成可交付给别的机构的产品(未确认)**
- 走产品驱动,不走销售驱动。
- 主要获客渠道:这一条本份**答不出来**。1b 五家都是开源项目,可查的只有星标,没有可复用的获客数据;全组共性缺口第一条就是「真实用户量、下载量、营收基本查不到」。⇒ 这项**标记为缺口**,不编。
- 放量方式:开源是最自然的路径(可复用 1b 的许可结论:只在 Apache-2.0 那一侧取代码,AGPL 项目只借鉴设计不搬代码)。【源:1b 汇总对比体 §附 A】
- 单位经济:**无法计算**。没有成本结构,也没有定价信息来源。
**本份的处置**:主用读法一(因为它不需要额外假设),读法二当条件分支留着,等第 9 条拍板。
**回收三字段**:复核人 = 主会话转用户;复核时机 = ①段收口时;结论落点 = 本文件 §7 与 §2 第一拨切分。
---
## 8. 能力
要赢,必须练出这四样(都能追到 1b 的已验证做法):
1. **技能即能力**:每个能力配可运行脚本,成品落盘。不是写一段说明就完了。
2. **能力加载不炸**:三层加载(元数据常驻、指令触发、资源按需),单个 `SKILL.md` 控制在 200 行内。这是能力持续变多还能跑得动的唯一解。
3. **契约层独立**:三端同源,版本号明文可读。上游一变,改一处。
4. **分级闸门**:不可逆的硬拦,可商量的软劝,不做一刀切。
哪些自己做、哪些找伙伴:
- 自己做:技能运行时、内容生产链路、发布闸门、画像与记忆。
- 找伙伴:平台发布通道(走平台官方 OAuth,不自建)、外部模型 provider(本地与免密钥的作一等公民,用户不必先配 Key 才能开始用)。
【源:1a §七 该抄第 1、2、3、6、7 条;1b 引用点;1c 画像二「反直觉发现」】
**必须练出的第五样(1b 里没现成答案)**:MCN 投放这一段怎么做。五家竞品一个证据都没有。
⇒ 标记为**能力缺口**,不写成「我们要做投放」。【源:1a §四 第三条的【假设】;1b 第四 §三 只到「审批、结果、继续对话」】
---
## 9. 别人抄不走的地方
**按读法一(单机构自用)**:护城河不适用。自用工具没有竞争者,也没有对手要进来。这一节的价值只剩一条 —— **别把自己抄走**:资产库与账号画像都是本地数据,一旦导出机制没做好,换机器等于归零。【推演之外的可核部分:1a §七 该抄第 7 条「本地与免密钥 provider 作一等公民」;1c 画像二痛点 1】
**按读法二(可交付产品)**,护城河有三层,但**没有一层是硬的**:
1. **数据复利**:资产库与账号画像越用越厚,迁移成本随使用时间涨。1b 里只有 Easel 做出了这个闭环(归因回写画像)。【源:1b 引用点「归因回写闭环,本组只有 Easel 做成」】
2. **流程耦合**:做内容与发内容之间那段桥,上钩之后两边都不好换。但 1b 的判断是「这段桥还是空的」—— 空的好处是无人竞争,坏处是**没有人验证过用户愿不愿意在这上面耦合**。【源:1b 引用点「三条差位之三」】
3. **工程治理**:把 1b 那套做法(契约化、状态机三件套、迁移演练、性能门禁)内化,后来者要补的功课很长。这是**执行优势**,不是结构性优势。
【源:1b 汇总对比体 §9.1 与 §10 第 6 条】
⚠️ 老实说:这三层都不防大厂。要说挡得住谁,答案只在「这个市场本来就没多少人愿意做」这一条上。
---
## 10. 九节自洽检查
| 检查 | 结论 |
|---|---|
| 愿景 ↔ 市场切分 | 一致。愿景的三条坚持分别对应三个切分(不记名字→B,不交不可逆→C,沉淀留得住→B)。 |
| 切分 ↔ 价值主张 | 逐条对得上,三个切分各写了四条。 |
| 价值主张 ↔ 取舍 | 一致。取舍里「不做」的四条,都是价值主张里没承诺的。 |
| 取舍 ↔ 指标 | 一致。北极星只看发布完成率,反指标守住闸门,不许为指标放松取舍。 |
| 指标 ↔ 能力 | 一致。OMTM 选的是不依赖外部授权那一段,与 §2 的第一拨切分同向。 |
| 能力 ↔ 护城河 | 一致,但护城河是软的。工程治理那条是执行优势,已在 §9 明说。 |
| 增长 ↔ 第 9 条 | **不自洽是故意的**。待复核第 9 条没拍板,§7 与 §9 只能给两套读法,⛔ 不硬凑成一套。 |
---
## 11. 关键假设(必须成立才能赢,附最小验证)
方法论要求挑出「必须成立才能赢」的,并给最小成本的验证办法。按致命程度排:
| # | 假设 | 不成立会怎样 | 最小成本验证 | 来源 |
|---|---|---|---|---|
| K1 | 平台数据能通过官方接口或授权方式拿到 | S1 与 S6 整条降级;F11 矩阵看板退化成手工表 | 先拿一个平台的开放接口跑通「取一条公开互动数据」,⛔ 不抓取 | 1a §九 A2(**未经用户确认**) |
| K2 | 矩阵级视图真的有需求,不是单账号复制的叠加 | F11 整条可以被砍,`2b-界面布局.md` 的 P1 页要重画 | 拿现有 2 个账号的真实工作流走一遍,看是不是真的需要并排看 | 1a 待复核第 5 条 |
| K3 | 资产库的入库门禁做得住,不变成垃圾场 | F4 从「越用越准」反噬成「越用越难找」 | 拿 20 条真实爆款拆解结果入库,隔一周回来查还能不能找到想要的那条 | 1a §九 R3 |
| K4 | 团队规模不超过三层审批 | F5 与 F13 的审批模型要重做 | 与用户确认现有审批链有几层 | 1a §九 A4(**未经用户确认**) |
| K5 | 这个产品只服务一个机构自用 | §7 增长与 §9 护城河整两节要改写;权限体系要进第一版 | 直接问用户(待复核第 9 条) | 1a 待复核第 9 条 |
**一句话**:K1 与 K5 是最要命的两个。K1 挂掉,第一拨切分砍掉一半;K5 不拍板,策略有一整块写不下去。
---
## 附:本份自检
- [x] 九节都有内容,且 §10 逐条检查了自洽
- [x] 市场按问题切,不按人口统计切
- [x] 三个切分各写了价值主张四条(之前 / 怎么做 / 之后 / 替代)
- [x] §5 写明了「不做什么」,且与 1a §八 逐条对齐未裁剪
- [x] 北极星与 OMTM 各一个,且未填数字
- [x] 挑出 5 条关键假设并给了最小验证办法
- [x] 每条结论标了来源;1c 的【推演】条目一条未用
- [x] 未新增①段白名单外的文档
*(说人话自评:46/50 直接性 9 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,187 @@
# 1e 使用场景
> 项目 slug:`mcn-shortvideo-agent` | ①段第 5 子步,产出 `research/1e-使用场景.md`
> 判据源:`stage-discovery/references/usage-scenario.md`
> 本份**就是用户故事**,一份承载全部。唯一句式:**作为【谁】,当【什么处境】,我要【办成什么】,这样【得到什么结果】**,四槽位缺一不算完成。
> 它是②段功能清单的直接推导依据:②段每列一项功能都要能追回本份的某一条;反过来,本份某条场景推不出任何功能,就是空愿望。
> ⛔ 本份不写功能名、不写界面结构、不写验收标准、不写 Design —— 那些分别是②段与③段的活。
---
## 一、八条场景
来源口径:骨架取自 `1a-需求文档.md` §五(S1–S8),本份按方法论重写成完整四槽位,并补上「替代方案」那一问。凡 1a 标着【假设】的,本份**原样保留标记**,⛔ 不就地升格成事实。
### S1 找选题
作为**编导**,当**面对一个矩阵下十个账号、每天要出三条内容,而手上一个能用的选题都没有**时,我要**知道哪个赛道的哪条内容最近数据异常地好**,这样**我不用逐个平台刷榜,早上那段最能干活的时间留在了做内容上**。
- 处境出处【可核观察】:`1a` §五 S1 逐字。
- 替代方案:现在是**人肉刷榜**。成本随账号数增长 —— 十个号勉强能刷,五十个号就崩。满足方法论 §5 的**第 ③ 类证明**(成本随规模涨)。
- 证据出处:`参考资料` 模块 2(对标博主监控四指标卡;「爆款内容异常值」是核心指标);1b 引用点「发现热点普遍弱」。
### S2 选题进资产库
作为**内容负责人**,当**我把一条爆款拆完、正打算写下一条**时,我要**把这条爆款是怎么写的留下来,下一次能直接拿**,这样**下一条不是从零起,产出质量不随我当天的状态飘**。
- 处境出处【可核观察】:`1a` §五 S2;§六 F4 注明「这一条决定了『越用越准』」。
- 替代方案:现在是**编导的印象加手工存在自己文档里**。成本有两个:随人数增长(换个人就失传),且不可核(没人知道库里到底有什么)。满足**第 ① 类(有真实成本)+ 第 ③ 类(随规模涨)**。
- 证据出处:独立体 文到 AI §四 能力 4「能力库」(文档级);1b 引用点。
### S3 走完创作流水线
作为**文案**,当**选题定了、手上什么都没有,要从零起**时,我要**在同一条流水线里把一条选题做成能发的成稿,文案、标题、封面都齐**,这样**中间不用在几处之间来回搬,一条内容的动作连成一段**。
- 处境出处【可核观察】:`1a` §五 S3;`参考资料` 模块 5 把七个环节列成一条流水线的子 Tab(这一步本身就是对「原本散着」的回应)。
- 替代方案:现在是**三处来回搬、靠复制粘贴**。成本是每条内容多三次无谓动作,且换人就要重新教。满足**第 ① 类**。
- 证据出处:`参考资料` 模块 5;独立体 Easel §五 机制 1(能力加载不炸,所以能塞进一条流程而不需要用户自己关技能)。
- ⚠️ 四个槽位里**零功能名**:原 1a S3 把「聊思路 → 写文案 → 起标题 → 做封面 → 发布检查 → 生成录制卡片」当环节列了出来,那串字是 `参考资料` 里的子 Tab 名(界面名),已从场景正文撤出,只在上面这句出处里保留。
### S4 一份母版变多份
作为**运营**,当**一条母版内容做好,而矩阵下多个账号、多个平台各要一版**时,我要**按每个账号、每个平台各自的口径各出一版**,这样**不用手工改多遍,也不会漏掉某个账号**。
- 处境出处【可核观察】:`1a` §五 S4、「这样我不用手工改十遍」。
- 替代方案:现在是**手工逐版改**。成本随「账号数 × 平台数」增长。满足**第 ③ 类**。
- 证据出处:独立体 Easel §四 能力 4(一处编辑、八端预览)——**直证的是「多平台」**;「多账号」的依据是 Easel 的多画像支持加本产品的矩阵需求。这条界线在 `2a-产品功能.md` 的 F7 里也照原样标着。
- ⚠️ 「十份」这个数字是原话里的举例,不是确认过的账号数(**A1 未经确认**)。
### S5 发之前先过闸
作为**内容负责人**,当**我要把一批内容交出去发,而发出去就收不回来**时,我要**在发之前看清哪里会被硬拦、哪里只是提醒,而且不可逆的那一步由我点头**,这样**不会因为一句话踩线,落到删帖或封号那一步**。
- 处境出处【可核观察】:`1a` §五 S5(新版已按事实收紧,删掉了旧版「具体改哪一句」)。
- 替代方案:现在是**靠感觉,出事再删帖**。成本在**出错不可逆**上。满足**第 ① 类**。
- 证据出处:独立体 Easel §四 能力 5(硬闸管敏感信息、软闸管人设一致性);独立体 Postiz 与 PostSider §五 机制 5(read-first / draft-first,发布是人的动作)。
- ⚠️ 1a 已在这一条上贴了警示行:旧版写的「看到具体改哪一句」在竞品里找不到依据,本份不把它写回来。
### S6 效果回写
作为**负责人**,当**一条内容跑完、我要定下一轮怎么做**时,我要**这条内容的表现留下来,下次做这个账号的时候自己带上这个教训**,这样**不用我拿本子记每个账号各自的脾气**。
- 处境出处【可核观察】:`1a` §五 S6;§六 F10。
- 替代方案:现在是**负责人自己记**。成本随账号数增长 —— 二十个账号,人脑记不住。满足**第 ③ 类**。
- 证据出处:独立体 Easel §三 核心步骤 6(读各平台的播放、互动、评论,把有效结构和偏好沉淀回画像记忆文件)+ §六 强 1(本组唯一闭环);`参考资料` 模块 6 的「四分离」复盘。
- 措辞纪律:本组**只有 Easel** 做成了这个闭环,⛔ 不写成「多家都做了归因」。
### S7 看整个矩阵
作为**机构负责人**,当**矩阵有二十个账号、早上要决定今天谁发什么**时,我要**在一个地方看到每个账号今天该发什么、发了什么、效果如何**,这样**不用一个个账号点进去看**。
- 处境出处:`1a` §五 S7。**整条标【假设】** —— 五家竞品都只做单账号或单团队视角,矩阵级视图是推断出来的差位。
- 替代方案:现在是**逐账号点进各自后台**。成本随账号数线性涨。满足**第 ③ 类**。
- ⚠️ **一处必须先认掉的问题**:1a §四「为谁做」只列了三种角色(内容负责人 / 编导与文案 / 剪辑与投放),**没有机构负责人**,而 S7 用了这个身份。已记入 `1c-用户画像.md` §五 缺口,⛔ 本份不替 1a 拍板新增第四个角色。
- 证据出处:`1a` §六 F11 标【假设】「五家竞品无此形态」。
### S8 商单与内容对账
作为**商务**,当**一条内容带了商单、到月底要结账**时,我要**这条内容、它的发布记录和收支对得上**,这样**对账不用翻聊天记录,也不会漏记**。
- 处境出处:`1a` §五 S8。**整条标【假设】** —— 视频关键帧里有「收支」Tab,但它记录的口径没有画面证据。
- 替代方案:现在是**翻聊天记录加手工表**。成本在**漏记就少收**上。满足**第 ① 类**。
- 证据出处:`参考资料` 模块 10(收支);`1a` §六 F12 标【假设】。
- ⚠️ 依赖 **A3 假设**(收支口径是「内容级」而不是「月级」,未经确认)。口径若是月级,这条场景要重写。
---
## 二、四槽位核对(可机械核对)
| 场景 | 作为【谁】 | 当【什么处境】 | 我要【办成什么】 | 这样【得到什么结果】 | 四槽位齐 | 处境可追 | 办成什么零功能名 | 结果是麻烦少了 |
|---|---|---|---|---|---|---|---|---|
| S1 | 编导 | 十个账号每天三条、手上没选题 | 知道哪条内容数据异常地好 | 不用刷榜,早上时间留给做内容 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S2 | 内容负责人 | 爆款拆完,要写下一条 | 把爆款怎么写留下来,下次能拿 | 不从零起,质量不随状态飘 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S3 | 文案 | 选题定了、手上什么都没有 | 一处把选题做成能发的成稿 | 中间不来回搬 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S4 | 运营 | 母版做好,多账号多平台各要一版 | 按各账号各平台口径各出一版 | 不手工改多遍、不漏账号 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S5 | 内容负责人 | 一批内容要交出去发 | 看清哪里硬拦哪里提醒,不可逆由我点头 | 不因一句话踩线到删帖封号 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S6 | 负责人 | 一条内容跑完,要定下一轮 | 表现留下来,下次自己带上教训 | 不用拿本子记每个账号的脾气 | ✅ | ✅ 1a §五 | ✅ | ✅ |
| S7 | 机构负责人 | 二十个账号、早上要定今天谁发什么 | 一处看到每号该发什么发了什么效果如何 | 不用逐号点进去看 | ✅ | ⚠️ 1a §五(整条【假设】) | ✅ | ✅ |
| S8 | 商务 | 内容带商单、月底结账 | 内容、发布记录、收支对得上 | 不翻聊天记录、不漏记 | ✅ | ⚠️ 1a §五(整条【假设】) | ✅ | ✅ |
「可读性」那一栏按方法论的说法自查了一遍:八条都能原样念出来,不需要解释。念到 S7 时有个卡点(谁是机构负责人),已单列。
---
## 三、替代方案检验(为什么这些问题值得做)
方法论的判断:如果替代方案「简单到不值一提」,这个问题就不值得做。只作提问,不作判死。三个可接受的「不简单」证明,满足任一即过。
| 场景 | 替代方案 | ① 有真实成本(时间/钱/出错) | ② 不可得 | ③ 成本随规模增长 | 判定 |
|---|---|---|---|---|---|
| S1 | 人肉刷榜 | — | — | ✅ 随账号数涨 | 过 |
| S2 | 印象加手工文档 | ✅ 换人即失传 | — | ✅ 随人数涨 | 过 |
| S3 | 三处来回搬 | ✅ 每条多三次动作 | — | — | 过 |
| S4 | 手工逐版改 | ✅ 改漏就发错 | — | ✅ 随账号×平台涨 | 过 |
| S5 | 靠感觉、事后删帖 | ✅ 出错不可逆 | — | — | 过 |
| S6 | 负责人自己记 | — | — | ✅ 随账号数涨 | 过 |
| S7 | 逐账号点后台 | ✅ 每天十几个来回 | — | ✅ 随账号数涨 | 过 |
| S8 | 翻聊天记录+手工表 | ✅ 漏记就少收 | — | — | 过 |
八条都过。⚠️ 但要说清:**「过」不等于「需求被验证」**。这里的替代方案成本是从 1a 的措辞和竞品做法推的,没有一条来自真实用户的说法。替代方案检验能挡掉「明显不值得做」的,挡不掉「用户其实不在乎」。
---
## 四、每条场景对应的功能(②段反向核对)
| 场景 | 推到哪些功能 |
|---|---|
| S1 | F1 对标账号监控与爆款异常值识别|F2 选题库与灵感速记|F3 评论区洞察找选题 |
| S2 | F2 选题库与灵感速记|F4 爆款拆解与资产库 |
| S3 | F6 创作流水线|F8 版本管理|F14 录制卡片与画板 |
| S4 | F7 一份母版到多账号多平台版本|F8 版本管理 |
| S5 | F5 发布前分级闸门|F13 发布留痕与人工确认记录 |
| S6 | F9 多账号画像与记忆|F10 效果复盘与归因回写 |
| S7 | F11 矩阵级看板|F9 多账号画像与记忆 |
| S8 | F12 商单与收支记录、内容对账|F13 发布留痕与人工确认记录 |
反向核过:1a §六 的 F1–F14 **每一条都追得回上面的某条场景**,没有空愿望,也没有追不回来源的功能。F 的编号沿用 `1a-需求文档.md` §六,⛔ 本份不重新编号。
---
## 五、假设台账(本份带进②段的)
| # | 内容 | 1a 原状态 | 本份处置 |
|---|---|---|---|
| A1 | 账号数 10–50 | 待复核第 1 条,未经确认 | 保留标记。S4/S6/S7 的规模描述都挂在这条上。 |
| A2 | 平台数据靠官方接口或授权方式拿 | 待复核第 2 条,未经确认 | 保留标记。S1、S6 依赖它;不成立两条要降级。 |
| A3 | 收支口径是「内容级」 | 待复核第 3 条,未经确认 | 保留标记。S8 整条依赖它。 |
| A4 | 团队 5–20 人、审批不超过三层 | 待复核第 4 条,未经确认 | 保留标记。S5 的审批链长度挂在这条上。 |
| S7 | 矩阵级视图真的需要吗 | 待复核第 5 条 | 整条场景标【假设】,②段对应功能按假设标注。 |
| S8 | 商单对账进不进第一版 | 待复核第 6 条 | 同 A3,另受第 6 条管辖。 |
| F3 | 评论洞察的数据来源与频率 | 待复核第 7 条 | S1 挂了 F3,数据来源未定,②段标注依赖。 |
| — | 「整合营销」含不含投放 | 待复核第 8 条 | 🔴 **本份不写 S9**。若含投放,需要新增一条场景(谁是投放岗、什么处境、要办成什么),本份 ⛔ 不编。见 §六。 |
| — | 只服务一个机构自用 vs 可交付产品 | 待复核第 9 条 | 影响 `1d-产品策略.md` §7 与 §9,不影响本份的场景骨架。 |
**回收三字段**(缺一不许落盘):复核人 = 主会话转用户;复核时机 = ①段收口时一次性过;结论落点 = 本文件 §五(结论如有变,同步回填 `1c-用户画像.md` §五 与 `1d-产品策略.md` §11)。
---
## 六、一处未闭环的地方(明写,不糊)
**投放这段没有场景。** 1a 待复核第 8 条问的就是这个:「『整合营销』到底含不含投放(若含,需要新增一条场景)」。
现状是:`1a` §一 的链路里写了「投放与商业化留痕」,§四 有「剪辑与投放」这个角色,但 §五 的场景里没有一条是投放岗的。1c 画像三也因为这个只写了半个人(投放侧零证据,五家竞品都没有)。
三种可能的处理:
1. 若「整合营销」**不含投放** ⇒ 本份就是八条,`1a` §一 的链路描述需要改掉「投放」二字。
2. 若**含投放** ⇒ 需要新增一条 S9。本份不代写,因为写它需要回答「投放岗在什么处境下、要办成什么」,而这个答案现在一个字的外部依据都没有,写出来就是编。
3. 若**暂时不定** ⇒ 本份保持八条,把「投放」留在 `1a` §一 的链路描述里但标着悬空,②段不为它出功能。
**回收三字段**:复核人 = 主会话转用户;复核时机 = ①段收口时;结论落点 = 本文件 §六 与 §五 假设台账。
---
## 附:本份自检
- [x] 八条场景四槽位齐全(作为 / 当 / 我要 / 这样),缺一的对照表里已标出
- [x] 每条的「谁」是具体身份,不是「用户」「某类人」
- [x] 每条的「处境」都能追到 `1a-需求文档.md` §五 的某一行;S7、S8 整条标【假设】
- [x] 「办成什么」零功能名(S3 的环节名已从正文撤出,只在出处里保留)
- [x] 「得到什么」写的是少掉的麻烦,不是愿景
- [x] 八条都能原样念出来(S7 的卡点已单列说明)
- [x] 每条场景都推得出至少一项功能;F1–F14 每一条都追得回某条场景
- [x] 替代方案检验逐条做了,并说明了「过 ≠ 需求被验证」
- [x] 假设台账带全部标记进②段,未把【假设】当事实
- [x] 未新增①段白名单外的文档
*(说人话自评:47/50 直接性 10 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9 —— 判据源 `humanizer-zh`,门槛 45。)*
@@ -0,0 +1,268 @@
# 3b · 实测记录(③段界面交互)
> 落点:`执行会话/目标-根据1a需求文档生成MCN短视频整合营销-d85687/ui/3b-实测记录.md`
> 判据源:`stage-delivery/SKILL.md` §3b/§供给;`references/execution-runbook.md` §3.5、§5.3、§六;`references/layouts-tooling.md` §1、§5.5
> 交付物:`ui/mcn-workbench.html`(单文件自包含原型)+ `ui/DESIGN.md`(规范)
## 〇、声明制(四字段)
| 字段 | 内容 |
|---|---|
| 当前段与子步 | ③段 / 3b 原型构建 + 3b 实测(实测未过不进 3c) |
| 主干与挡位 | 供给=`oil-ui-pro`(方法主线)+ 本段自带样式库 `design-system-tiaoyue`(定调与令牌)/ 挡位 **标准** |
| 依据文件 | `DESIGN.md`(本段契约)、`prd/2b-界面布局.md`(冻结骨架)、`prd/2a-产品功能.md`(F1–F14) |
| 产出落点 | `ui/mcn-workbench.html`、`ui/_tools/`(三个可复跑脚本)、`ui/_gate_shots/`(23 张视口帧) |
## 一、怎么复跑(三条命令,全部只读原型)
```bash
PY="E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe"
cd "…/ui"
$PY _tools/cap.py --mode dom --route selftest --viewport 1440x900 --out _scratch/st.html # 取自检输出
$PY _tools/mutate_test.py # 变异对照
$PY _tools/check_skeleton.py # 骨架冻结闸门
```
`cap.py` 对外只收 `--viewport`;它内部按模式补偏移量(原因见 §五 的通道口径一节)。`_scratch/` 是跑出来的中间件、目录不存在时脚本会自建,看完随手删掉不影响任何结论;交付目录里只留脚本、截图与四份文档。
## 二、自检 81 项(1440×900 主视口,PASS 81 / FAIL 0)
自检是原型自带的:`#/selftest` 路由会在真实场景里逐个点过每个可点元素。全文落盘如下,⛔ 不是摘要。
```text
自检结果:PASS 81 / FAIL 0
PASS 路由 #/p/p1 渲染出 5 个顶层节点
PASS 路由 #/p/p2 渲染出 6 个顶层节点
PASS 路由 #/p/p3 渲染出 4 个顶层节点
PASS 路由 #/p/p4 渲染出 6 个顶层节点
PASS 路由 #/p/p5 渲染出 5 个顶层节点
PASS 路由 #/p/p6 渲染出 4 个顶层节点
PASS 路由 #/p/p7 渲染出 5 个顶层节点
PASS 路由 #/p/p8 渲染出 4 个顶层节点
PASS 六态 × 八页 = 48 个组合,全部渲染出内容
PASS 侧栏二级页项 8 个,与八页一致
PASS 清单里每个 ID 都在页面上出现过(75 个,无悬空声明)
PASS 页面上每个 data-act 都在清单里(共 703 次出现,无未登记的可点元素)
PASS 清单里 71 个 ID 都真驱动过并给出可见反馈,0 个死控件(22 个场景,每个实例各重置一次)
PASS 当刻被禁用的控件 4 个(有 disabled 属性:按契约在特定条件下不可点):P4-03, P5-06, P6-03, R-02
PASS 清单里每个 ID 都至少被驱动过一次(无「从未跑过」的条目)
PASS 侧栏 8 项逐个点过,每一项都跳到了自己标的那一页
PASS 五处「输入后才可用」的联动都通:其中 4 处在空输入时确实是禁用的 → 输入后转可用 → 点了有反应
PASS 工具型纪律:零 .eyebrow / 零 .lead / 零 .hero
PASS 零 @keyframes(工具型不做入场编排)
PASS 骨架冻结:八页 37 个板块的数量与顺序与 ②段 2b「板块清单」逐位一致,⛔ 未增删挪
PASS 结构 ①:八页各一个 h1,标题逐级不跳;每个板块都有文字标题
PASS 结构 ②:字号 12/14/16/18/24px 共 5 档,相邻差 2/2/2/6,正文档 14–16 在用
PASS 结构 ④:逐页查过,首屏同屏主档按钮 ≤1 个;本页实底按钮 1 种
PASS 交互态与可读性::hover / :focus-visible 都在且没被 outline:none 抹掉;tabular-nums、prefers-reduced-motion、防溢出三件套齐全
PASS 阴影:面板/卡片都用多层叠层,无单层死黑重阴影
PASS 间距:flex/grid 的 gap 取值全部落在登记刻度内(9 个刻度)
PASS 浮层「随手记」中性关闭出口 = 1(右上 ×)|另有决策型关闭 1 个(R-03);遮罩是「点层外」通道,不计作出口
PASS 浮层「随手记」打开后焦点在层内(当前=X-close)
PASS 浮层「随手记」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「随手记」Esc 能关
PASS 浮层「随手记」关掉后焦点回到触发件 G-06
PASS 浮层「随手记」点遮罩(层外空白)能关
PASS 浮层「全局检索」中性关闭出口 = 1(右上 ×)|另有决策型关闭 0 个;遮罩是「点层外」通道,不计作出口
PASS 浮层「全局检索」打开后焦点在层内(当前=X-close)
PASS 浮层「全局检索」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「全局检索」Esc 能关
PASS 浮层「全局检索」关掉后焦点回到触发件 G-10
PASS 浮层「全局检索」点遮罩(层外空白)能关
PASS 浮层「两处假设说明」中性关闭出口 = 1(右上 ×)|另有决策型关闭 0 个;遮罩是「点层外」通道,不计作出口
PASS 浮层「两处假设说明」打开后焦点在层内(当前=X-close)
PASS 浮层「两处假设说明」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「两处假设说明」Esc 能关
PASS 浮层「两处假设说明」关掉后焦点回到触发件 G-08
PASS 浮层「两处假设说明」点遮罩(层外空白)能关
PASS 浮层「资产选择器」中性关闭出口 = 1(右上 ×)|另有决策型关闭 0 个;遮罩是「点层外」通道,不计作出口
PASS 浮层「资产选择器」打开后焦点在层内(当前=X-close)
PASS 浮层「资产选择器」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「资产选择器」Esc 能关
PASS 浮层「资产选择器」关掉后焦点回到触发件 P4-04
PASS 浮层「资产选择器」点遮罩(层外空白)能关
PASS 浮层「版本列表」中性关闭出口 = 1(右上 ×)|另有决策型关闭 0 个;遮罩是「点层外」通道,不计作出口
PASS 浮层「版本列表」打开后焦点在层内(当前=X-close)
PASS 浮层「版本列表」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「版本列表」Esc 能关
PASS 浮层「版本列表」关掉后焦点回到触发件 P4-07
PASS 浮层「版本列表」点遮罩(层外空白)能关
PASS 浮层「发布二次确认」中性关闭出口 = 1(右上 ×)|另有决策型关闭 1 个(P5-10);遮罩是「点层外」通道,不计作出口
PASS 浮层「发布二次确认」打开后焦点在层内(当前=X-close)
PASS 浮层「发布二次确认」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「发布二次确认」Esc 能关
PASS 浮层「发布二次确认」关掉后焦点回到触发件 P5-08
PASS 浮层「发布二次确认」点遮罩(层外空白)能关
PASS 浮层「核销二次确认」中性关闭出口 = 1(右上 ×)|另有决策型关闭 1 个(CHECKOUT-CANCEL);遮罩是「点层外」通道,不计作出口
PASS 浮层「核销二次确认」打开后焦点在层内(当前=X-close)
PASS 浮层「核销二次确认」连按 8 次 Tab,焦点始终锁在层内
PASS 浮层「核销二次确认」Esc 能关
PASS 浮层「核销二次确认」关掉后焦点回到触发件 P8-03
PASS 浮层「核销二次确认」点遮罩(层外空白)能关
--- 数值取证(布局视口 1440 × 900 ;window.innerWidth 1440)---
PASS 对比度 --warn 对 --surface = 5.93:1(契约 ≥4.5:1)
PASS 对比度 --accent-text 对 --surface = 4.76:1(契约 ≥4.5:1)
PASS 对比度 --ink-faint 对 --surface = 3.55:1(契约 ≥3:1)
PASS 强调色填充面积占比:八页最高 创作台 = 0.52%(1 个填充块,契约 ≤5%;不含 3px 左侧标条 / 描边 / 文字色)
量尺寸时 scrollY = 0(P1)
PASS 量尺寸前页面停在滚动零点(P1):rect 取到的是相对视口的真值
PASS P1 账号矩阵:首屏从 214px 起,行距 67px,一屏装得下 10 行(契约 ≥6 行/900px 高,实测宽 1440)|示意数据 5 条 ⇒ 实际可见 5 行(数据用尽,非被截断)
PASS P1 账号矩阵行高齐:67–68px,差 ≤2px(没有哪一行被状态标或长文字撑高)
PASS P1 实际在用字号档 5 档:12px / 14px / 16px / 18px / 24px(契约 ≥3)
PASS 视觉层间距 32px / 块内相邻行分隔 1px(发丝线,行本身不套框)⇒ 比值 32 ≥2(4 个视觉层)
P1 各块落位(顶 / 高):今日待处理@149+360 · 账号矩阵列表@149+417 · 异常值提示@599+215 · 本月表现最好的一条@845+122 · 全局检索与随手记@1000+113(视口高 900;并排的两块顶相同)
量尺寸时 scrollY = 0(P2)
PASS 量尺寸前页面停在滚动零点(P2):rect 取到的是相对视口的真值
PASS P2 对标内容列表:首屏从 402px 起,行距 67px,一屏装得下 7 行(契约 ≥6 行/900px 高,实测宽 1440)|示意数据 5 条 ⇒ 实际可见 5 行(数据用尽,非被截断)
P2 各块落位(顶 / 高):对标监控概览@165+139 · 对标内容列表@336+417 · 评论区洞察@785+108 · 选题库@925+330 · 灵感速记@1287+113
PASS 横向溢出 = 0(scrollWidth 1440 = clientWidth 1440)
PASS 八页逐页查横向溢出:全为 0(最差 p1)
(附)P1 行高 67/67/67/68/67px · P1 按钮高度集合 32px · 量时 scrollY=0 · 顶栏高 69px · 导航占 1105px(column)· 主区内衬上 24px · innerWidth 1440 − clientWidth 1440 = 0px(窗口滚动条宽度)
控制台报错:0 条
```
截图:`_gate_shots/selftest-1440.png`。
## 三、变异对照 13 / 13(证明上面那串 PASS 不是恒绿)
一个永远 PASS 的自检等于没有自检。做法:复制原型 → 注入一处**已知的假病** → 再跑一次自检 → 要求它报红、**且红在预期那一条上**。
```text
基线(未注入):PASS 81 / FAIL 0
✅ M1 死控件(掏空 P2-01 实现) ⇒ PASS 80/FAIL 1 |红在 P2-01
✅ M2 未登记的可点元素(塞一个 ZZ-99) ⇒ PASS 79/FAIL 2 |红在「未登记的 data-act」
✅ M3 悬空声明(清单里加一个页面没有的 ID) ⇒ PASS 79/FAIL 2 |红在「声明了但页面里没有」
✅ M4 骨架漂移(P3 多塞一块) ⇒ PASS 80/FAIL 1 |红在「骨架与②段不一致」
✅ M5 对比度越界(--ink-faint → #c9c7c0) ⇒ PASS 80/FAIL 1 |红在「对比度 --ink-faint」
✅ M6 点击无反馈(go() 退回只改 hash) ⇒ PASS 79/FAIL 2 |红在「驱动了没反应」
✅ M7 行高不齐(放开行内换行,768x900) ⇒ PASS 79/FAIL 2 |红在「行高不齐」
✅ M8 密度退化(行内衬 12px → 36px) ⇒ PASS 79/FAIL 2 |红在「低于契约 6 行」
✅ M9 量尺寸时页面不在零点(量前先滚 300px) ⇒ PASS 80/FAIL 1 |红在「被滚到」
✅ M10 行分隔线被关掉(退回 .list-row:first-child)⇒ PASS 80/FAIL 1 |红在「行分隔线根本没画出来」
✅ M11 浮层没有遮罩 ⇒ PASS 72/FAIL 9 |红在「没有遮罩」
✅ M12 关掉浮层后焦点不还回去 ⇒ PASS 74/FAIL 7 |红在「关掉后焦点没回到」
✅ M13 浮层多出一个中性关闭出口(再加一颗 ×) ⇒ PASS 74/FAIL 7 |红在「中性关闭出口 = 2」
变异对照:13 / 13 通过
⇒ 13 处假病全部被自检抓住,且基线回绿:这套判据不是恒绿的。
```
⚠️ **M9 换过一次**。原来那版是「拿掉 `applyScene` 末尾的滚动复位」,但实测它**已经观测不到差别**了:重绘 `#view` 时浏览器把滚动自然夹回 0,量出来的数确实干净 ⇒ 那条变异变成了一条抓不到东西的假变异。改成直接注入「量之前把页面滚下去」,也就是这条守卫真正声称要拦的那件事。
## 四、骨架冻结闸门(正向 + 双向变异)
把②段 `prd/2b-界面布局.md` §二 当权威读,与原型 `FROZEN` 表逐页逐位比(数量相等、顺序相等、名字互为前缀)。
```text
正向:PASS 骨架冻结:八页 37 个板块,②段 2b-界面布局.md §二 与原型 FROZEN 表逐页逐位一致
反向变异 1(改原型 p3 多一块):p3 板块数 ②段 4 ≠ 原型 5
反向变异 2(改②段副本 p1 第 2 块名):p1 第 2 块 ②段「账号矩阵一览」≠ 原型「账号矩阵列表」
```
两条反向变异改的都是**副本**(`_probe/2b-mut.md`),权威件 `prd/2b-界面布局.md` 全程只读。为了事后能复核这件事,这里钉一条指纹:
```text
prd/2b-界面布局.md md5 = 1dcc69f952df97a394481658e84d90b2 15036 字节 mtime 2026-10-08 02:30
```
✅ 复核方式:`md5sum ../prd/2b-界面布局.md`,与上面比。一致 ⇒ ③段确实没动过冻结骨架。
(这条指纹是删 `_probe/` 之前补登的 —— 备份删掉后,只剩这一个数能证明骨架没被污染,所以先写进正文再清临时件。)
## 五、多视口密度核对(契约:一屏可见行数 ≥6 / 900px 高,`layouts-tooling.md` §1 原文,⛔ 不分档)
| 视口 | 自检 | P1 账号矩阵 | P2 对标列表 | 顶栏高 | 导航 | 结论 |
|---|---|---|---|---|---|---|
| 1440×900 | **PASS 81/0** | 首行 214px,**10 行** | 首行 402px,**7 行** | 69px | 1105px(竖栏) | ✅ |
| 1280×900 | **PASS 81/0** | 首行 216px,**10 行** | 首行 403px,**7 行** | 69px | 竖栏 | ✅ |
| 1024×900 | **PASS 81/0** | 首行 495px,**6 行** | 首行 402px,**7 行** | 69px | 竖栏 | ✅ |
| 768×900 | **PASS 81/0** | 首行 495px,**6 行** | 首行 402px,**7 行** | 69px | 竖栏 | ✅ |
| 641×900 | PASS 80/**1** | 首行 535px,**5 行** ❌ | 首行 442px,**6 行** | 109px(折两行) | 竖栏 | 缺口见 §六 |
| 640×900 | PASS 80/**1** | 首行 532px,**5 行** ❌ | 首行 439px,**6 行** | 61px | 53px(横条) | 缺口见 §六 |
| 500×844 | PASS 79/**2** | 首行 572px,**4 行** ❌ | 首行 479px,**5 行** ❌ | 101px(折两行) | 53px(横条) | 缺口见 §六 |
**边界是量出来的,不是我定的**:视口 ≥768px 时顶栏单行、导航竖排,一屏 6–10 行;≤767px 时顶栏折成两行(641px 实测 109px)、≤640px 导航变标签栏,首屏被页面外壳吃掉,容量掉到 4–5 行。行本身没变肥 —— 行高 67px、各行差 ≤2px、块内分隔 1px,这几条在任何视口都 PASS。
> 反事实(把 P1 前两块强制落回单列,1440×900):`账号矩阵列表@530+413` ⇒ 首行顶 530px、容量 `floor((900−530)/67) = 5 行`,够不着 6 ⇒ **并排是密度判据逼出来的,不是审美选择**。
### 通道口径(本轮实测发现,已修)
同一台机器、同一个 `--window-size`,Chrome 两条通道给出的**视口不是同一个**:
```text
--window-size=656,995 ─┬─ --dump-dom ⇒ 视口 640 × 900 (mq<=640 true)
└─ --screenshot ⇒ 视口 656 × 995 (mq<=640 false)
```
量这件事用的探针页只有 18 行,为了让它跟着报告一起活下去(临时目录已清),源码附在下面 —— 想自己复核就把这段存成 `_scratch/vp.html`,两种模式各跑一次同一尺寸,读第 1、3 行:
```html
<!DOCTYPE html><html><head><meta charset="utf-8"><title>vp</title>
<style>body{margin:0;font:700 34px/1.5 monospace;background:#fff;color:#111}</style></head><body>
<div id="o">…</div>
<script>
function r(){
document.getElementById('o').innerHTML =
'innerW '+window.innerWidth+'<br>'+
'innerH '+window.innerHeight+'<br>'+
'clientW '+document.documentElement.clientWidth+'<br>'+
'clientH '+document.documentElement.clientHeight+'<br>'+
'outerW '+window.outerWidth+'<br>'+
'mq<=640 '+matchMedia('(max-width:640px)').matches+'<br>'+
'mq<=1024 '+matchMedia('(max-width:1024px)').matches+'<br>'+
'dpr '+window.devicePixelRatio;
}
r(); addEventListener('resize',r);
</script>
</body></html>
```
⇒ 截图通道原样等于视口,dump-dom 通道要补回被扣掉的 16 / 95。`cap.py` 已按模式分开算,并且**每次截图后直接从 PNG 的 IHDR 读真实像素跟目标视口比**,不等就当场报红 —— 这条守卫是补回来的,因为本轮之前所有截图都比标称大 16×95(「1440×900」实际是 1456×995)。
## 六、本轮修掉的真缺陷(每条:现象 → 根因 → 证据)
| # | 现象 | 根因 | 证据 |
|---|---|---|---|
| 1 | 整份设计系统在屏幕上失效 | 样式表顶部注释里 `--t-*/--raw-*` 的 `*/` 提前闭掉注释,吞掉整个 `:root` 令牌块 | 修复后对比度取证才量得出来 |
| 2 | 全表行分隔线一直没画出来 | `.list-row:first-child{border-top:0}`:每行都包在 `<li>` 里,于是**每行都是自己 `<li>` 的 first-child**,`borderTopStyle` 全是 `none` | 变异 M10;另修了判据除数为 0 时恒 PASS(比值 `Infinity`) |
| 3 | 浮层不浮 | `#layer-root` 与 `.layer` 都没有定位样式,浮层渲染在文档流末尾,得滚到页尾才看得见 | 改为遮罩 `fixed inset:0` + 层本体 `fixed` 居中 |
| 4 | 行高随文字长短乱跳(66/82/100px) | 状态标放在操作列把 `auto` 列撑宽,只有那一行折行 | 状态标移到名称旁;再加「行内每段不许换行 + 省略号」;判据新增「行高齐」 |
| 5 | 自检在窄视口给出假 PASS「装得下 10 行」 | 驱动几百次点击后浏览器为聚焦元素自动滚动,`rect.top` 变负,容量公式虚高 | 加「量尺寸时页面在滚动零点」守卫 + 变异 M9 |
| 6 | 手机导航「既不是一条、也没滚动」,占 161px | `.sidebar` 只给了 `flex-direction:row`,可导航分组挂在 `<nav id="nav">` 里,而 `#nav` **一条样式都没有** ⇒ 仍是块级容器,4 个分组照旧竖堆 | 补 `#nav{display:flex;flex-flow:row nowrap}` + 整条链 `flex:0 0 auto`;161px → 53px |
| 7 | 顶栏「演示 · 账号」折成两行,顶栏被顶到 70px | `.topbar-label` 没有 `white-space:nowrap` | 独立评审第一眼点出;补 nowrap 后顶栏 69px |
| 8 | 截图尺寸全部比标称大 16×95 | `cap.py` 对两条通道用了同一个偏移量 | §五「通道口径」;已加 PNG 尺寸守卫 |
| 9 | 两个二次确认浮层其实各有**两个**可见关闭控件,判据却报「出口 = 1」 | 判据只数 `.layer-close` 这个类名,把可见的「取消」从眼皮底下藏掉了;核销层的「取消」还复用了 `X-close` | 判据改为「中性出口只认 `X-close`」+「决策型关闭单列报数」;核销取消拆出 `CHECKOUT-CANCEL`;加变异 M13 |
| 10 | 「今日该发:待发:3 分钟快手菜」冒号连用,评审读成错字 | 示意数据 `today` 字段的值里自带冒号,被拼进「今日该发:…」 | 数据改为空格分隔 |
| 11 | 制作黑话写在界面上(「这里是 X 的 empty 态」) | 状态面板上另贴了一句给做原型的人看的说明,而 `STATE_COPY` 已铺好用户向文案 | 删掉那句话;按钮改「回到正常内容」 |
| 12 | 手机形态看不出当前在哪一页 | 横滚标签栏里当前项滚在视野外 | 只调 `.sidebar` 自己的 `scrollLeft` 把当前项带进视野(⛔ 不碰 `window`,否则会误触滚动守卫) |
| 13 | `layerTrigger` 放进状态快照 `S` | 点任何元素都会改 `S` ⇒ 状态快照跟着变 ⇒ **没有一个控件会被判死**,死控件判据整条失效 | 移出 `S`;变异 M1/M6 当场回归报红 |
| 14 | 浮层焦点与可见性判据全部失效 | `offsetParent` 对 `position:fixed` 元素恒为 `null` | 改用 `getClientRects().length` |
| 15 | `--full`(整页长图)静默失效,产出的还是视口帧 | 无头 CLI 这条通道只能截视口 | 参数已删除,`_full/` 目录一并清掉,不留一个撒谎的开关 |
## 七、已记录的偏离(⛔ 不许静默)
| # | 原要求 | 实际做法 | 原因 | 影响 | 处置 |
|---|---|---|---|---|---|
| D1 | 3b 实测走 `browser-harness`(SKILL.md §3b) | 用「原型自带自检 81 项 + 变异对照 13/13 + 无头 Chrome 23 张视口帧 + 逐条 DOM 取值」等价替代 | 该通道绑定实时浏览器入口,本会话驱动不了(宿主侧能力,不是本段能修的) | 证据链换成可复跑脚本;⛔ 但**没有**「真人真点」这一层,交互结论全部来自脚本驱动 | 持续偏离,待用户裁定是否补一次人工走查 |
| D2 | D5 终检要 `1440x900` 与 `390x844` 两个视口帧(runbook §5.3、§七) | 实测到 **500×844** 为止 | Chrome 窗口宽下限 516 ⇒ 视口最小 500;要 390 得走 CDP `setDeviceMetricsOverride`,本轮没接 | 手机帧比要求宽 110px | 持续偏离;⛔ 报告里一律写「500×844」,**不许**写成已测 390 |
| D3 | 对外只留视口帧;`_full/` 长图仅自检(runbook §七) | 未产出长图 | `--full` 在本机通道上做不到(只能截视口),已把该参数删掉 | 无 | 已修 |
| D4 | 3c 要「外部 GPT 会诊」 | 见 `3c-GPT会诊.md`:本会话无对外模型通道,改用**隔离上下文的独立评审执行者** | 没有外部通道可用 | 与「异厂商外部审查」不是同一条通道 | 持续偏离,已明示 |
## 八、这一步的门槛结论
- 3a 已过 Gate-1(见 `DESIGN.md` §四)。
- 3b 实测:**契约视口 1440×900 全绿(PASS 81/FAIL 0)**;≥768px 宽全绿;≤767px 宽的密度缺口已如实登记(§五、`DESIGN.md` §五)。
- 可以进 3c。
---
## 九、说人话自评(判据源 `humanizer-zh`,五维各 10 分)
| 维度 | 分 | 说明 |
|---|---|---|
| 直接性 | 9 | 开头就是复跑命令,没有「本次工作取得进展」这类开场 |
| 节奏 | 8 | 表格 + 短断言为主,句式偏单一,⚠️ 弱项 |
| 信任度 | 10 | 把改坏的、没测到的、换了通道的都写出来了,没有藏 |
| 真实性 | 9 | 每条缺陷都带现象、根因与证据(脚本名 / 变异编号 / 实测数) |
| 精炼度 | 9 | 15 条缺陷各一行,不重复叙述;自检全文照录是留证需要,不是凑字 |
| **总分** | **45 / 50** | 门槛 ≥45,压线过;扣分点写在第 2 行 |
@@ -0,0 +1,212 @@
# 3c · 独立评审会诊(③段界面交互)
> 落点:`执行会话/目标-根据1a需求文档生成MCN短视频整合营销-d85687/ui/3c-GPT会诊.md`
> 判据源:`stage-delivery/SKILL.md` §3c + §供给·独立评审协议(`oil-ui-pro/references/visual-review.md`)
## 〇、通道说明(先说清这份是怎么来的,⛔ 不冒充外部会诊)
1. **本会话没有对外(异厂商)模型通道** ⇒ 按 `SKILL.md` §3c 的「异常情况」办:**未取得外部审查要在本份明示,未取得 ≠ 已通过**。
2. 为不让这一格空着,本轮改用**隔离上下文的独立评审执行者**:它只看我交给它的任务、约束与当前版本截图,**不继承本段的制作对话、不看源码、不接制作过程里的论证** —— 这正好落在 `visual-review.md` §评审者的独立性 的「选择能实际看图的隔离执行者」「首次独立复查使用新上下文」两条上。
3. ⚠️ 但它**不等于** SKILL.md 要求的「外部 GPT 会诊」:同一个宿主、同一批模型,不是异厂商的第二双眼。**这条偏离记在 `3b-实测记录.md` §七 D4。**
**交接内容**(照 `visual-review.md` 的「给 / 不给」表):
| 给了 | 没给 |
|---|---|
| 用户任务、受众、交付范围与目标设备 | 制作者的论证、已经投入的时间 |
| 已定的方向(暖白纸感、品牌紫、系统字体栈)、不可改约束(八页 37 板块冻结、工具型硬纪律) | 源码、实现细节、技术借口 |
| 当前版本截图 8 张,逐张注明页面、状态、逻辑视口 | 旧版截图、旧评分、旧评审结论 |
| —— | 预设问题清单、希望评审者赞同的答案 |
**附件清单**(文件名逐条列出,均属当前版本):
```
_gate_shots/p1-1440.png P1 矩阵总览 · 正常态 · 1440×900
_gate_shots/p2-1440.png P2 选题雷达 · 正常态 · 1440×900
_gate_shots/p4-1440.png P4 创作台 · 正常态 · 1440×900
_gate_shots/p5-1440.png P5 发布中心 · 正常态 · 1440×900
_gate_shots/p1-empty-1440.png P1 空格状态 · 1440×900
_gate_shots/p1-500x844.png P1 窄屏形态 · 500×844
_gate_shots/layer-quicknote-1440.png P1 上的「随手记」浮层 · 1440×900
_gate_shots/layer-confirm-1440.png P5 上的「发布二次确认」浮层 · 1440×900
```
> ⛔ 未提供 P3 / P6 / P7 / P8 四页截图 —— 这是交接上的短板,评审在结尾也自己点出来了。
---
## 一、提问原文(发给评审者的全文)
```text
你是一名没有参与过制作的独立界面评审者。请只依据下面给你的材料做评审,不要去找源码、
不要读任何实现文件、不要推测制作过程。
## 用户任务与约束
- 产品:MCN 短视频整合营销工作台(网页应用)。用户是 MCN 机构里天天来干活的三类人:
内容负责人(矩阵级决策)、编导与文案(选题与创作)、剪辑与投放(版本与发布)。
- 交付范围:8 个页面的工具型界面(不是营销落地页)。目标设备:桌面宽屏为主(1440×900),
另外提供窄屏形态(500×844)。
- 已确定、不可改动的约束:
1. 页面骨架与每页板块清单是冻结的(上一阶段定死),不要建议增删板块或改页面顺序。
2. 视觉方向已定:暖白纸感底 #faf9f5、面板白 #ffffff、墨色文字 #1a1a18、品牌强调色紫 #9E4CFF;
系统字体栈;圆角大 24 / 中 16 / 行 14 / 输入 9 / 按钮 26(药丸)。
3. 工具型页面的硬纪律:零「眉标/大标题/灰色副标题」三段式标题区,零入场动画编排,
强调色填充面积 ≤5%(只用于主按钮底、当前导航项左侧 3px 标条、链接文字、焦点环)。
4. 8 页分别是:P1 矩阵总览、P2 选题雷达、P3 资产库、P4 创作台、P5 发布中心、
P6 账号画像、P7 复盘台、P8 记录与对账。
- 不能改动的清单:上述品牌色、字体、组件形态、全局导航结构、八页板块清单。
## 当前版本的画面(请实际打开图片看,逐张用 Read,不要只看文件名猜)
[8 张截图的绝对路径与「页面 · 状态 · 逻辑视口」说明,见上一节附件清单]
## 请按这个顺序回答(不要改结构、不要写客套话)
1. 体裁判断:想成为什么体裁和风格;属于什么品类;这个品类里两三个风格最鲜明的产品怎么做;
违背共识处是有意偏离还是没认出品类;是不是某个标杆的复制。
2. 和顶尖标准的差距:顶尖团队会怎么做;指出差距最大的一到三处。
3. 密度:一屏能看到几个对象、第一排内容离顶部多远、主动作离当前对象有多远;和最好的产品比。
4. 过度的做法:模型味的默认分栏、渐变发光、处处圆角卡片、表情图标、随意上色、空泛比喻、
多主体抢主角;重复的线框。⚠️ 承担风格和结构的线不算问题;⚠️ 单侧彩色边线也算问题。
5. 可以直接删掉的文字,单独列出。
6. 细节瑕疵:对齐、圆角、阴影、标点、状态;表格和列表放大看行线与基线。
7. 有没有让人记住的一处;没有就直接说,并指出最值得集中发力的位置。
8. 10 分制打分。
每处问题写清:位置 / 观察 / 影响 / 可执行的调整方向。区分「可观察缺陷」与「风格偏好」。
没有明显问题的地方直接说明,不要为凑数提意见。未看到或无法验证的内容明确说明。
最后单独回答一句:如果只看这几张静态截图,有哪些结论是你无法验证的?
只提供评审,不要修改任何文件。
```
---
## 二、评审者回答原文(原件照录,⛔ 未删改、未转述)
> 已逐张看过这 8 张图。以下只依据画面判断。
### 1. 体裁判断
**它想成为什么**:一个「暖白纸感 + 淡紫点缀」的轻量运营工作台,气质偏编辑/文具感,试图用大面积留白和圆角卡片做出"干净、不吓人"的后台。
**它实际属于什么品类**:B2B 数据工作台 / 运营控制台。这个品类里风格最鲜明的参照是 **Linear**(密度极高、行高 32px、发丝线分区、几乎无卡片框)、**飞书多维表格 / Airtable**(表格即主视觉、列对齐、字段类型化)、**蝉妈妈 / 新榜 / 飞瓜**(MCN 数据后台:首屏就是 KPI 条 + 对齐的数据表 + 颜色只用于涨跌)。
**这些产品的共识**:主视觉是**数据本身**(表 / 矩阵 / 图表),不是"卡片 + 说明文字";行紧凑、列右对齐;颜色只承担语义(涨跌、异常);标题极小甚至没有,靠导航和分区标签定位。
**画面违背共识的地方**:
- **卡片化 + 大留白**(每页把每一组内容都包成 24px 圆角白卡):这是**没认出品类**。工具台的第一诉求是信息密度,不是呼吸感。
- **面板内写说明文字**("这里不占主屏…""点数字可筛下面的列表…"):这也是**没认出品类**,品类里不会把使用说明印在正文里。
- 标题用 `P1 矩阵总览` 这种带编号的大标题 + 上分隔线:**没认出品类**(工具页通常只有极小的位置标识或无标题)。
- 唯一像"有意的偏离"的是纸感底色与淡紫——这个方向可以保留,但它和"低密度"绑在了一起,代价太大。
**是不是标杆复制**:遮住 `P1 矩阵总览` 这类文字后,**认不出是任何一家**。侧栏分组结构像 Linear/Notion 的通用骨架,卡片+淡紫按钮像 shadcn/Tailwind 的默认产出。它不是克隆,是**没有品牌辨识度的通用后台**。
### 2. 和顶尖标准的差距
顶尖团队(Linear、Vercel Dashboard、飞书多维表格)做同一件事会是:先给一张**对齐的、可扫读的数据主表**,把 KPI/异常压成一行细条,颜色只留给语义,操作以行内 hover/行尾轻量入口呈现。差距最大的三处:
**(a) 主构图:P1 两栏平权,没有主次** — 位置:P1「今日待处理 | 账号矩阵列表」并排等宽。观察:两个完全不同的对象(流程队列 / 账号资产)被给了同等视觉权重,中间只隔一条缝。影响:视线在左右之间来回跳,看不出"我今天先看什么"。调整:一侧做主区(建议账号矩阵),另一侧收成窄栏或折叠条;不要两栏等宽。
**(b) 内容与操作的关系:动作被甩到最右边,脱离对象** — 位置:P1 每行末尾「看复盘」、P2 每行末尾「发起拆解」、P1「去选题雷达」。观察:操作在对象的最右端,与左侧标签水平相距近半个屏;P4 更是把"开始这一步"(灰,左)和"推进到〔标题态〕"(紫,右)拉到同一行的两端,主动作不明确。影响:读到对象时手要跨屏去找动作,节奏被打断。调整:动作贴对象——行尾固定窄列且右对齐成列,或 hover 出现在行尾;一屏内同类动作必须在同一 X 轴上对齐。
**(c) 空间被浪费在"空面板"上** — 位置:P2「评论区洞察」只有一行说明;P4「资产引用区」只有一句提示;P5 右栏「检查结果」几乎全空只放一个「复检」。观察:整块面板占位但不承载内容。影响:首屏有效信息量被稀释,看起来像没做完。调整:没内容就折叠该块或降级成一行内联状态,把纵向空间还给上面的主列表。
> 排版/空间/色彩层面:字号偏大(正文与分组标题都偏大)、行距偏松,是密度低的直接原因;颜色使用基本克制(见第 4 条),这点是对的。
### 3. 密度(仅凭画面估数)
- **P1**:一屏可见约 **12 个对象**(待处理 5 + 账号 5 + 异常 2),加侧栏 12 项导航。**第一排内容距顶部约 190–200px**(顶栏 ~56 + 页面标题区 ~68–100 + 分组标题 ~120 + 卡内边距),行高约 44–50px。**主动作"看复盘"与对象同行,但水平相隔约 500–650px**。
- **P2**:仅约 **9 个对象**(KPI 4 + 对标内容 5)+ 一个空区块,下方大片空白。
- **P4 / P5**:主体各只有 1 个当前对象 + 一条步骤条 / 两枚版本 chip,其余是输入框与空面板,密度极低。
**对比**:Linear 同类工作台一屏可扫 **20–30 条**,行高约 32px,首行距顶约 90–110px;飞书多维表格一屏 **15–20 行**(行高 40px),首行距顶约 120px,且列严格对齐。**当前密度大约只有同类的 40–50%,首行下移约 1.7 倍**。这是这份 UI 最硬的短板。
### 4. 过度的做法
1. **处处圆角大卡**(P1/P2/P4/P5 全部):列表类内容(账号矩阵、对标内容、待处理、发布记录)本应是"表格式行 + 发丝分隔",却每段包一张 24px 圆角白卡。**可观察缺陷**。
2. **默认的"左标题右说明"分栏**反复出现:P1「今日待处理 | 5 项·按截止时间排」、P2「对标监控概览 | 在监控 3 个账号·点数字可筛下面的列表」、P4「当前内容 | 来自选题库」、P5 多处。这是模型默认排版套路,且右侧说明是**给评审看的产品注释**,不是给用户看的。**可观察缺陷**。
3. **无理由给文字上色**:「假设」金色字(每页右上角)、「数据异动」橙色标签、P2「6.4× 异常」偏红——其中"假设"是制作说明被上色,属滥用强调色。**可观察缺陷**。
4. **统计标签加下划线**:P2 KPI「在监控账号 / 低粉爆款 / 异常值 / 近三天更新」下方各有一条下划线,视觉上像链接却不可点。**可观察缺陷**。
5. **重复的线框**:每个分组标题下都压一条通栏发丝线(P1/P2/P4/P5 无一例外),加上侧栏竖线、顶栏底线、卡边框、卡内行线——**每个层级都画了一遍线**。承担结构的那几条可留,其余应减。
6. **同一状态两种画法**:当前导航项在 P1/P2/P5 是**浅色描边药丸**,在 P4「创作台」看起来是**深色实心药丸**;而 P4 步骤条里当前步也是深色实心。同一"当前"语义出现两种画法。**需确认,疑似可观察缺陷**。
7. **文案空泛/口语化**:P4「写清方向,点开始这一步」「引过一条角度和结构,稿子会稳一些」——像给实习生写的批注。**可观察缺陷**。
8. 未发现表情符号图标、无来由的渐变/发光、多主体抢主角(这一项相对干净,可不算问题)。**单侧彩色边线**:行内左侧标签(待审/在写…)是纯文字不是色条,这点做对了;未见引文/提示类单侧色条。
### 5. 可以直接删掉的文字
- 顶栏 `演示·账号` / `演示·状态` 标签;`假设 2 项` 小胶囊。
- 每页右上角金色 `假设`。
- 页面标题里的编号前缀 `P1` `P2` `P4` `P5`(标题本身可留,编号删)。
- P1 空格态:`这里是矩阵总览的 empty 态。`(及那个"回到正常态"按钮——除非这是内部演示控件,交付应删)
- P1:`5 项·按截止时间排`、`5 个账号·按今日待办排`、`2 条异常` 这类贴在标题右侧的解释性计数。
- P2:`在监控 3 个账号·点数字可筛下面的列表`、`这里不占主屏:从对标列表选选题是主路,评论区是另一路输入。`、`5 条·倍数 = 相对该号水平`。
- P4:`来自选题库`、`写清方向,点开始这一步`、`还没有引用资产,这里可以空着写,但引过一条角度和结构,稿子会稳一些。`、`0 条已引用`。
- P5:`这次发 2 个账号 × 1 个平台 = 2 个版本。从创作台带版本进来时目标已定,这里是补选。`、`发出后会在记录与对账里留一条,谁在什么时候确认的都查得到。`、`这一块还没通过。`(以及"硬的拦住,软的只提醒"这种注释口吻)。
- 侧栏重复项 `账号画像(跑图)`(见下)。
### 6. 细节瑕疵
- **侧栏存在重复/残留导航项**:`账号画像(跑图)` 与 `账号画像` 并列出现。"跑图"是开发口吻,且两项指向同一页。影响:用户困惑,像未清理的草稿。调整:删掉一项。
- **同一页三种容器处理**:P1 左栏是带边框圆角卡、右栏是无框"标题线+行"、下方异常区又是卡。影响:看不出哪些是同层级。调整:统一为一种(建议统一为无框行 + 发丝线)。
- **导航计数不一致**:选题雷达 5 / 资产库 6 / 发布中心 3 / 矩阵总览 5 / 复盘台 2 / 记录与对账 5 有数字,`创作台`、`账号画像` 无数字且无线索。影响:数字含义不明(待办?资产数?),一半有半数无。调整:明确语义后要么全给要么不给。
- **窄屏(500)缺当前页指示**:顶部导航变成一排 chip,但看不出当前在 P1。影响:窄屏无法定位。调整:给当前 chip 一个选中态。
- **窄屏正文被硬截断**:账号行右侧 `已发 1 条 10:20 · 播放 1…` 用省略号截断,关键数据丢失。影响:数据不可读。调整:窄屏改为换行或精简为主指标。
- **行基线不齐(凭画面观察)**:P1 右栏每行右侧的指标是两行、右对齐、左边不齐,与左侧固定列形成参差;"看复盘"为单独一列。放大看每行右侧文字的左边缘没有对齐成列。调整:右侧指标改固定断点或统一为"字段名+值"两列右对齐。
- **文案可疑**:P1 右栏每行出现 `今日读发:待发:…`,并带下划线。"读发"疑为错字/内部词,且冒号连用。影响:看不懂。调整:改为明确字段名(如"今日排期 / 状态")。
- **浮层关闭按钮**:两个浮层的右上"×"都套了一个淡紫色圆圈(像常驻焦点环)。影响:看起来像被 focus 卡住。调整:圆圈只在 focus/hover 时出现。
- **浮层标题下压了一条通栏线**(随手记、确认发出)——与第 4 条的重复线框同源,可一并减。
- 圆角、阴影、标点层面未见明显崩坏;浮层阴影柔和,未过度。
### 7. 有没有让人记住的一处
**没有。** 每一处都停在"干净、中性、不出错",但没有一个点会让人回头。最该集中发力的位置是 **P1 的「账号矩阵列表」**——它名字叫"矩阵",画出来却是最普通的一列行,这正是品类里最能做出招牌的地方(矩阵/网格视图、热度着色、异常一列直连"去选题雷达"的动作链)。如果只改一处,把这里从"列表"变成"真正的矩阵 + 一眼可见的异常分布",整页的记忆点就成立了。
### 8. 打分
**5 / 10**
硬纪律基本守住了(强调色只出现在主按钮/链接/当前项,无入场动画,无三段式标题,无发光渐变、无表情图标),这是加分项。但作为工具页它密度只有同类一半、被制作注释和空面板稀释、主次不清、无记忆点。骨架和色彩可用,**问题集中在密度、主次和"去掉注释性文案"这三件事上**,修完能到 7 分左右。
**只看这几张静态截图,我无法验证**:点击/悬停/焦点后的真实行为与状态切换、任何动效、全局检索的实际结果、浮层遮罩的交互与键盘可达性、导航计数的真实语义、窄屏 500 以外断点的表现、真实数据量下行高与滚动/溢出的处理、以及 P3/P6/P7/P8 四页(本次未提供截图)是否与这四页同一套密度与容器的处理。
---
## 三、处置表(逐条给结论;⛔ 不接受「基本没问题」)
口径:**已采纳·已改** / **已采纳·本段不改**(说明为什么,并给替代动作) / **不采纳**(说明依据,异议要能反驳) / **未能复核**(如实说,不硬判)。
| # | 评审意见 | 结论 | 依据 / 改动落点 |
|---|---|---|---|
| R-01 | 密度只有同类 40–50%,行高 44–50px vs Linear 32px | **已采纳·本段不改** | 密度判据(`layouts-tooling.md` §1)是「一屏可见 ≥6 行 @900px 高」,1440/1280 实测 **10 行**、1024/768 实测 6 行,达标。再压行高只有一条路:把每行的 3 条次级信息砍成 1 条 —— 那是②段《界面布局》给的信息档位,③段不许改。**这条取舍留给用户判**(见 §四)。 |
| R-02 | 处处 24px 圆角大卡,列表本该是「表格行 + 发丝线」 | **已采纳·已改(部分)** | 列表**行**早已是无框行 + `border-top` 发丝线(本轮还修掉了「分隔线一直没画出来」)。剩的是**承载列表的那一层面板**仍是圆角卡。改为无框会让 37 个板块里的一片面板失去与底纸的分层,本段不整体改;已把评审这条记为可讨论项。 |
| R-03 | 默认「左标题右说明」分栏反复出现,右侧说明是给评审看的注释 | **已采纳·已改** | 逐条过了一遍板块头的右侧小字:能读出「这是给你解释口径」的那几条已改写或删除(P1 空格态那句 `这里是 X 的 empty 态` 已删、P4 输入框提示与空引用文案已改写、`回到正常态` → `回到正常内容`)。剩下的多是②段要求的**计数与口径**(如「5 项 · 按截止时间排」),保留。 |
| R-04 | 「假设」金色字属滥用强调色、是制作说明被上色 | **不采纳**(含颜色) | 「假设」标不是装饰,是本任务的**硬要求**:`1a` 的待复核第 5、6 条尚无用户结论,②段 §四 要求③段显式标注,⛔ 不能删。颜色也不换:`--warn` 在本产品里就是「**需要人来看一眼**」的语义位(`DESIGN.md` §2.2 明写「状态色只用红/绿/黄三系,不做装饰」),而「假设待复核」正是这个语义;换成中性墨色,它在八页里会被直接忽略,标注就白标了。⚠️ 本轮**未**改这一处颜色,评审这条保留为意见。 |
| R-05 | P2 KPI 标签下有下划线,像链接却不可点 | **未能复核** | 代码里 `.stat` 与 `.stat-label` 都没有 `border-bottom` / `text-decoration`,4 个 KPI 里 2 个是真按钮(`P2-01` / `P2-02`,可点即筛选)。评审看到的线未能复现,也不排除是缩略下的砖缝感。**如实记为未复核**,不做无依据的改动。 |
| R-06 | 每个分组标题下都压一条通栏线,重复线框 | **不采纳** | `layouts-tooling.md` §1 判定要点原文:「边框只上不围 —— 行间用 `border-top`」。板块标题下的那条是**结构线**,`visual-review.md` 自己也写了「承担风格和结构的线不算问题」。删掉它,板块头与内容就分不开了。 |
| R-07 | 同一状态两种画法(当前导航项,P4 看着是深色实心) | **不采纳**(评审判读) | 侧栏当前项在八页是同一套样式:`background:var(--surface-soft)` + 左侧 3px `--accent`。P4 那一眼的「深色实心」是把侧栏当前项与**步骤条里的当前步**看混了 —— 后者按③段设计就该更重(它标的是流程位置,不是导航位置)。自检逐页核过:8 项导航的 `is-active` 只有一个。 |
| R-08 | P4 文案口语化(「写清方向,点开始这一步」) | **已采纳·已改** | 输入框提示改为「写下这一步要往哪个方向走」;空引用文案改为「还没有引用资产。可以直接写,也可以从资产库引一条进来。」 |
| R-09 | 侧栏 `账号画像(跑图)` 与 `账号画像` 重复、「跑图」是开发口吻 | **不采纳**(评审判读),**但记账** | 那三个字是「跨组」不是「跑图」。字样直接来自②段 `2b §一` 的一级导航表「(跨组)账号画像」,③段不许改②段定的导航名。评审由此暴露的「括号夹在词中间不好读」这点,记为本段已知取舍。 |
| R-10 | 导航计数只给了一半(创作台 / 账号画像 无数字) | **已采纳·本段不改** | 计数=**这一页有几件事等你做**;没数字的两页当前确实没有待办(不是漏给)。但「一半有半数无」读起来像掉数据 —— 评审这条是对的,已记为待办,改动落点在交互清单 `G-05` 的反馈列,本轮不动。 |
| R-11 | 窄屏导航看不出当前在哪一页 | **已采纳·已改** | 横滚标签栏里当前项滚在视野外 ⇒ 在 `paint()` 里只调 `.sidebar` 自己的 `scrollLeft` 把当前项带进视野(⛔ 不碰 `window`,否则会误触「量尺寸前页面在滚动零点」那条守卫)。 |
| R-12 | 窄屏正文被省略号硬截断,关键数据丢失 | **已采纳·本段不改** | 这是**上一轮为「行高齐」付的代价**:行内每段不许换行 + 省略号,是行高能恒为 67px 的唯一办法(放开换行实测行高跳到 66/82/100px 乱跳,变异 M7 盯着)。完整原文挂在行上的 `title` 里。窄屏(500×844)本就不在本产品第一版的交付范围内(`1a §七`:第一版不做移动端 App)。 |
| R-13 | 每行右侧指标左边缘没对齐成列 | **已采纳·本段不改** | 右栏是「标签 + 值」两行、整块右对齐到块右内衬,不是逐字右对齐;改成逐字对齐会把「今日该发:待发 …」这种长短差异大的值拉开成锯齿。保留现状,记为可讨论项。 |
| R-14 | `今日读发:待发:…` 冒号连用、疑似错字 | **已采纳·已改** | 真缺陷(不是错字,是**双冒号**):示意数据 `today` 字段值里自带冒号,被拼进「今日该发:…」。已把 5 行数据改成空格分隔。 |
| R-15 | 浮层右上「×」套着淡紫圆圈,像常驻焦点环 | **不采纳**,但**记账** | 那圈是 `:focus-visible` 焦点环(`--accent`),出现是因为浮层打开后焦点按设计就落在层内第一个可聚焦件上,而它正好是 ×。**这是硬要求,不能改成 hover 才出现**(改掉就把键盘用户的定位点弄丢了)。已记为「截图时带焦点环」的已知现象。 |
| R-16 | 顶栏 `演示·账号` / `演示·状态`、`假设 2 项`、页面编号 `P1…P8` 可以删 | **不采纳** | 三类都是**原型自带件**,不是产品正文:前两类是演示控件(`G-07` / `G-09` 登记在交互清单里,用来把页面掰到六态给评审看);`P1…P8` 是原型里定位页面的编号,正式交付去掉。⛔ 但**不能因此把它从原型里删掉** —— 删了评审就看不到六态。 |
| R-17 | 「空面板」(P2 评论区洞察、P4 资产引用区、P5 检查结果)稀释首屏 | **已采纳·本段不改** | 三块都是②段冻结的板块,⛔ 不许折叠或删除。它们看起来空是因为**示意数据只填了主路径**;每块的空态文案(`STATE_COPY` 逐页不同)都在。记为「示意数据丰满度」的已知边界。 |
| R-18 | 动作甩到最右边、离对象半屏远 | **已采纳·本段不改** | 操作列右对齐成列是刻意的:`layouts-tooling.md` §5.5 要求「并列卡有主次」且同类动作要在同一轴上对齐。评审的另一半意见(「一屏内同类动作必须在同一 X 轴上对齐」)正是现状。 |
| R-19 | P1 两栏平权、没有主次 | **不采纳** | 并排是**密度判据逼出来的**,有反事实实测:落回单列时账号矩阵首行顶 530px、一屏只装得下 5 行(<6)。两栏宽度也不是等宽(`minmax(0,400px) minmax(0,1fr)`),左栏是窄栏。 |
| R-20 | 硬纪律守住了(强调色克制、无入场动画、无三段式标题、无渐变发光、无表情图标) | **确认** | 自检逐条机核:零 `.eyebrow`/`.lead`/`.hero`、零 `@keyframes`、强调色填充占比八页最高 0.52%。 |
| R-21 | 记不住 —— 建议把 P1「账号矩阵列表」做成真正的矩阵 + 异常分布 | **已采纳·本段不改**(记为用户可选项) | 改名成「矩阵」的块,画法受②段冻结:板块名与位置不能动,「矩阵视图」是一种信息呈现变更,超出③段权限。**这是本轮最值得往上提的一条建议**,见 §四。 |
| R-22 | 无法验证:点击/悬停/焦点行为、动效、检索结果、遮罩键盘可达性、其他四页 | **已采纳·已补** | 评审看不到的部分正是 3b 自检覆盖的部分:71 个 ID 逐个真驱动(0 死控件)、六态 × 八页 48 组合、7 个浮层 × 6 项(中性出口 / 焦点在层内 / Tab 锁层 / Esc / 焦点归还 / 点遮罩)。P3/P6/P7/P8 的截图**已补拍**(`_gate_shots/p3-1440.png` … `p8-1440.png`),本轮交接口径已改为八页全给。 |
---
## 四、要往上提的两条(不属本段权限,交主会话转用户)
1. **R-01 密度 vs ②段信息档位**:要把行高压到同类水平,就得砍掉每行的次级信息,而那是②段定的档位。**两件事只能挑一件。**
2. **R-21 P1「账号矩阵列表」要不要真的做成矩阵视图**:这是全篇最有可能做出记忆点的一处,但属于信息呈现变更(不是视觉实现),需②段或用户拍板。
## 五、本轮的会诊结论
- 拿到了一份**可核对的独立意见**(8 张截图、8 个问题域、10 分制打 5 分),全部 22 条已逐条给结论:**采纳并已改 4 条**(R-08、R-11、R-14,以及 R-03 的文案部分)、**采纳但本段不改 8 条**(都写清了为什么与替代动作)、**不采纳 9 条**(都有判据或实测反驳)、**未能复核 1 条**(R-05)。
- ⚠️ 仍然只是**一次**:`visual-review.md` §处理结果 要求「只做一轮」。改完由主 Agent 与基线做前后对比,**不为分数复查**。
- ⚠️ 这条通道**不等于** SKILL.md §3c 要求的「外部 GPT 会诊」。**未取得外部审查 ≠ 已通过。**
@@ -0,0 +1,217 @@
# 3d · 审查报告(③段界面交互收口)
> 落点:`执行会话/目标-根据1a需求文档生成MCN短视频整合营销-d85687/ui/3d-审查报告.md`
> 模板:`SKILL.md` §3d + `references/execution-runbook.md` §5.4/§5.5、§七(固定七节)
> 交付物:`ui/mcn-workbench.html`(原型)+ `ui/DESIGN.md`(规范)+ `ui/3b-实测记录.md`(实测)+ `ui/3c-GPT会诊.md`(会诊)
---
## 一、范围
| 项 | 内容 |
|---|---|
| 段与子步 | ③段界面交互 · 3d(D3 收口 + D4 动效 + D5 终检 + Gate-2 / Gate-3) |
| 被审对象 | `ui/mcn-workbench.html`(单文件自包含原型,八页 + 七浮层)+ `ui/DESIGN.md`(设计契约与令牌) |
| 覆盖页 | P1 矩阵总览 / P2 选题雷达 / P3 资产库 / P4 创作台 / P5 发布中心 / P6 账号画像 / P7 复盘台 / P8 记录与对账(**八页全审,无抽样**) |
| 覆盖状态 | 正常 / 加载 / 空 / 出错 / 禁用 / 无权限 —— 逐页 × 逐态 = 48 组合 |
| 不在范围 | ④段(原型说明区与演示引导);②段的板块清单与信息档位(已冻结,本段不动);暗色主题(见 `DESIGN.md` §五 第 2 条) |
| 证据留档 | `_gate_shots/` **23 张视口帧**(全部经 PNG 像素尺寸校验);`ui/_tools/` 三个可复跑脚本 |
**本轮是否跑了脚本**:**跑了**。三条,全部可复跑,命令见 `3b-实测记录.md` §一:
```text
自检(#/selftest 路由,原型自带) → PASS 81 / FAIL 0 @1440×900
变异对照(_tools/mutate_test.py) → 13 / 13 通过
骨架冻结闸门(_tools/check_skeleton.py)→ PASS 八页 37 个板块与②段逐页逐位一致
```
**结构核对表的每一个数,都来自上面这三条脚本的输出或 DOM 取值,⛔ 无一处是目测截图。**
---
## 二、挡位
**标准档**(本段未升未降)。理由:这是新产品的第一版原型,不是发版前的精修;`SKILL.md` §供给·方法主线 给的默认主线就是 `oil-ui-pro`,挡位按 runbook 默认的**标准**执行 —— 三条门(Gate-1 / 2 / 3)全过,但不上「多方向比选」与「严格档」的额外轮次。
---
## 三、阻断项表
口径:`阻断` = 不清零就不能交。**本轮共 15 条,14 条已清零,1 条未清零并留档。**
| # | 阻断项 | 观察(现象) | 根因 | 处置 | 现状 |
|---|---|---|---|---|---|
| B-01 | 整份设计系统在屏幕上失效 | 原型打开后令牌全不生效 | 样式表顶部注释里 `--t-*/--raw-*` 的 `*/` 提前闭掉注释,吞掉整个 `:root` 令牌块 | 改写注释文字 | ✅ 清零 |
| B-02 | 全表行分隔线一直没画出来 | 列表行之间没有任何分隔线 | `.list-row:first-child{border-top:0}` —— 每行都包在 `<li>` 里,于是每行都是自己 `<li>` 的 first-child | 改为 `li:first-child > .list-row` | ✅ 清零(+变异 M10) |
| B-03 | 判据除数为 0 时恒 PASS | 上面那条真缺陷没有任何门禁报它 | `gap>=2*bw` 在 `bw=0` 时恒成立、比值算成 `Infinity` | 除数为 0 一律判红 | ✅ 清零 |
| B-04 | 浮层不浮 | 浮层渲染在文档流末尾,得滚到页尾才看得见 | `#layer-root` 与 `.layer` 都没有定位样式 | 遮罩 `fixed inset:0` + 层本体 `fixed` 居中 | ✅ 清零 |
| B-05 | 行高随文字长短乱跳 | 同一张表量出 66 / 82 / 100px 三种行高 | 状态标放在操作列把 `auto` 列撑宽,只有那一行折行 | 状态标移到名称旁 + 行内每段不许换行 + 新增「行高齐」判据 | ✅ 清零(+变异 M7) |
| B-06 | 自检在窄视口给出假 PASS | 报「一屏装得下 10 行」,实际 5 行 | 驱动几百次点击后浏览器自动滚动,`rect.top` 变负,容量公式虚高 | 加「量尺寸前页面在滚动零点」守卫 | ✅ 清零(+变异 M9) |
| B-07 | 手机导航「既不是一条、也没滚动」 | 导航条占 161px 高,4 个分组竖着堆 | 导航分组挂在 `<nav id="nav">` 里,而 `#nav` **一条样式都没有** ⇒ 仍是块级容器 | 补 `#nav{display:flex;flex-flow:row nowrap}` + 整条链 `flex:0 0 auto` | ✅ 清零(161px → 53px) |
| B-08 | 顶栏标签折行 | 「演示 · 账号」折成两行,顶栏被顶到 70px | `.topbar-label` 没有 `white-space:nowrap` | 补 nowrap | ✅ 清零(→ 69px) |
| B-09 | 两个二次确认浮层其实有两个可见关闭控件,判据却报「出口 = 1」 | 核销层与发布层各有一颗「取消」 | 判据只数 `.layer-close` 这个类名,把可见的「取消」从眼皮底下藏掉了;核销层的「取消」还复用了 `X-close` | 判据改成「中性出口只认 `X-close`」+「决策型关闭单列报数」;核销取消拆出 `CHECKOUT-CANCEL` | ✅ 清零(+变异 M13) |
| B-10 | 截图尺寸全部比标称大 16×95 | 「1440×900」的帧实际是 1456×995,同一份报告里 dump-dom 又按 640 说话 | Chrome 两条通道对 `--window-size` 的解释不同(截图=视口,dump-dom=视口+16/95),而脚本对两者用了同一个偏移量 | 按模式分开算 + 每次截图后从 PNG 的 IHDR 读真实像素比对目标视口 | ✅ 清零(23 张帧全部 ✓) |
| B-11 | 制作黑话写在界面上 | 状态面板上贴着「这里是 X 的 empty 态。」 | 给做原型的人看的说明被写进了界面,而 `STATE_COPY` 已经铺好用户向文案 | 删掉那句话;按钮改「回到正常内容」 | ✅ 清零 |
| B-12 | 主列表可读性 | 「今日该发:待发:3 分钟快手菜」冒号连用,独立评审读成错字 | 示意数据 `today` 字段的值里自带冒号,被拼进「今日该发:…」 | 5 行数据改为空格分隔 | ✅ 清零 |
| B-13 | 窄屏看不出当前在哪一页 | 横滚标签栏里当前项滚在视野之外 | 没有把当前项带进视野的逻辑 | 只调 `.sidebar` 自己的 `scrollLeft`(⛔ 不碰 `window`,否则误触 B-06 的守卫) | ✅ 清零 |
| B-14 | `--full`(整页长图)静默失效 | 带该参数产出的还是视口帧 | 无头 CLI 这条通道只能截视口 | 删掉该参数与 `_full/` 目录,不留撒谎的开关 | ✅ 清零 |
| **B-15** | **≤767px 宽时一屏装不满 6 行** | 641×900 与 640×900 实测 **5 行**;500×844 实测 **4 行 / 5 行** | 页面外壳吃掉首屏:≤767px 顶栏折成两行(641px 实测 109px)、≤640px 导航变标签栏。**行本身没变肥** —— 行高 67px、行高差 ≤2px、块内分隔 1px 在任何视口都 PASS | 未在本段修 | ❌ **未清零,留档待裁定** |
### B-15 为什么没在本段修,以及留给用户的两条路
判据原文(`layouts-tooling.md` §1)是「一屏可见行数 **≥ 6(900px 高时)**」,**不带宽度条件**。实测出来的边界是 **768px 宽**:≥768px 时顶栏单行、导航竖排,容量 6–10 行;≤767px 时页面外壳折行,容量掉到 4–5 行。三条路,**两件事必须挑一件**:
| 选择 | 代价 |
|---|---|
| A. 把支持宽度下限写成 **≥768px**,手机形态只承诺「可用」(布局折行、零横向溢出、全路径可点通),不承诺 6 行密度 | 要在契约里**明文加一条本段自定的宽度条件**;依据是 `1a §七` 已明确第一版不做移动端 App |
| B. 压掉每行的次级信息,把行高从 67px 压到 40px 上下,让窄屏也装得下 6 行 | 那 3 条次级信息是②段《界面布局》定的档位,③段不许改 ⇒ 得回②段改档 |
| C. 动页面外壳(顶栏控件精简、导航折叠) | 顶栏那几个控件都登记在交互清单里(`G-06`/`G-08`/`G-10`),删或搬家等于改交互清单 |
⛔ 本段**没有**选任何一条就宣布通过:判据一个字没改,`needRows=6` 写死,三个窄视口的 FAIL 原样留在自检输出里。
---
## 四、建议项表
口径:每条要么**修掉**,要么**显式写「已知不修 + 原因」**。⛔ 不接受「基本没问题」。
| # | 建议项 | 结论 |
|---|---|---|
| S-01 | 密度只有同类工具的 40–50%(评审:Linear 行高 32px,本原型 67px) | **已知不修**:判据是「≥6 行 @900px 高」,1440/1280 实测 10 行、1024/768 实测 6 行,达标。再压只有砍次级信息一条路 ⇒ 属②段档位,见 B-15 选择 B |
| S-02 | 处处 24px 圆角大卡,列表本该是「表格行 + 发丝线」 | **部分已修**:列表**行**本来就是无框行 + `border-top` 发丝线(B-02 修的就是它真的画出来);剩的是承载列表那层**面板**仍是圆角卡,改为无框会让 37 个板块散在底纸上失去分层。已知不修 |
| S-03 | 「左标题右说明」分栏里,右侧小字像给评审看的注释 | **已修**:逐条过了一遍板块头右侧的小字 —— 读出「这是在解释口径」的那几条已改写或删除(B-11、P4 输入提示、空引用文案)。剩下的多是②段要求的计数与口径(「5 项 · 按截止时间排」),保留 |
| S-04 | P2 KPI 标签下有下划线,像链接却不可点 | **未能复核**:代码里 `.stat` / `.stat-label` 都没有 `border-bottom` / `text-decoration`;4 个 KPI 里 2 个是真按钮(`P2-01`/`P2-02`)。⛔ 不做无依据的改动,如实记为未复核 |
| S-05 | 每个分组标题下都压一条通栏线(重复线框) | **不采纳**:`layouts-tooling.md` §1 原文「边框只上不围 —— 行间用 `border-top`」;`visual-review.md` 自己也写「承担风格和结构的线不算问题」。删掉它板块头与内容就分不开 |
| S-06 | 同一状态两种画法(当前导航项,P4 看着是深色实心) | **不采纳(评审判读)**:侧栏当前项八页同一套样式(`--surface-soft` + 左 3px `--accent`)。自检逐页核过:8 项导航里 `is-active` 只有一个。评审把侧栏当前项与**步骤条里的当前步**看混了 —— 后者按设计就该更重 |
| S-07 | 侧栏 `账号画像(跑图)` 与 `账号画像` 重复 | **不采纳(评审判读)**:那三个字是「跨组」不是「跑图」;字样直接来自②段 `2b §一` 的一级导航表「(跨组)账号画像」,③段不许改②段定的导航名。由此暴露的「括号夹在词中间不好读」记为已知取舍 |
| S-08 | 导航计数只给了一半(创作台 / 账号画像 无数字) | **已采纳·本段不改**:计数=「这页有几件事等你做」,没数字的两页当前确实没有待办。但「一半有半数无」读起来像掉数据,这条提得对 —— 改动落点在交互清单 `G-05` 的反馈列,本轮不动 |
| S-09 | 窄屏正文被省略号硬截断 | **已知不修**:这是上一轮为「行高齐」付的代价 —— 行内每段不许换行 + 省略号,是行高能恒为 67px 的唯一办法(放开换行行高跳到 66/82/100px,变异 M7 盯着)。完整原文挂在行上的 `title` 里 |
| S-10 | 每行右侧指标左边缘没对齐成列 | **已知不修**:右栏是「标签 + 值」两行、整块右对齐到块右内衬;改成逐字对齐会把长短差异大的值拉成锯齿 |
| S-11 | 浮层右上「×」套着淡紫圆圈,像常驻焦点环 | **不采纳**:那是 `:focus-visible` 焦点环(`--accent`),出现是因为浮层打开后焦点按设计落在层内第一个可聚焦件上,而它正好是 ×。⛔ 不能改成 hover 才出现 —— 改掉就把键盘用户的定位点弄丢了。已记为「截图里带焦点环」的已知现象 |
| S-12 | 顶栏演示控件、`假设 2 项`、页面编号 `P1…P8` 可以删 | **不采纳**:都是原型自带件 —— 演示控件(`G-07`/`G-09`)用来把页面掰到六态给评审看,编号用来定位页面。删了评审就看不到六态 |
| S-13 | 「空面板」(P2 评论区洞察、P4 资产引用区、P5 检查结果)稀释首屏 | **已知不修**:三块都是②段冻结的板块,⛔ 不许折叠或删除。看着空是因为示意数据只填了主路径;每块的空态文案都在(`STATE_COPY` 逐页不同) |
| S-14 | 动作甩到最右边、离对象半屏远 | **不采纳**:操作列右对齐成列是刻意的(`layouts-tooling.md` §5.5 要求同类动作在同一轴上对齐);两栏也不是等宽(`minmax(0,400px) minmax(0,1fr)`) |
| S-15 | P1 两栏平权、没有主次 | **不采纳**:并排是密度判据逼出来的,有反事实实测 —— 落回单列时账号矩阵首行顶 530px、一屏只装得下 5 行(<6)。见 B-15 选择 A |
| S-16 | 记不住 —— 建议把 P1「账号矩阵列表」做成真正的矩阵 + 异常分布 | **已知不修·往上提**:块名与位置受②段冻结,「矩阵视图」是**信息呈现**变更,超出③段权限。**本轮最值得往上提的一条**,交主会话转用户 |
| S-17 | 评审看不到的:点击/悬停/焦点行为、动效、检索结果、遮罩键盘可达性、另外四页 | **已补**:这些正是 3b 自检覆盖的 —— 71 个 ID 逐个真驱动(0 死控件)、六态 × 八页 48 组合、7 浮层 × 6 项。P3/P6/P7/P8 截图已补拍,本轮交接已改为八页全给 |
---
## 五、状态覆盖核对表(六项逐页)
判据源:`SKILL.md` 铁律 2 的六态清单。⚠️ 逐项**数值**判据出自供给可选档的 `craft/state-coverage.md`,**本轮未动用可选档 ⇒ 该项无供给来源**(`DESIGN.md` §五 第 1 条),故只核「有没有、长什么样」,不编阈值。
机检结论:**六态 × 八页 = 48 个组合,全部渲染出内容**(自检第 10 行)。
| 页 | loading | empty | error | success | disabled | 无权限 |
|---|---|---|---|---|---|---|
| P1 矩阵总览 | ✅ 骨架行 +「正在取矩阵数据」 | ✅「还没接入账号」+ 去处按钮(→P6) | ✅ 显时间戳 + 重试 | ✅ 默认态 | ✅ 无待办时待办区禁用并说明 | ✅ 非管理员看利润列的遮罩说明 |
| P2 选题雷达 | ✅「正在拉对标更新」 | ✅「监控名单是空的」+ 录对标号 | ✅ 拉取失败(退路=手工录入) | ✅ 默认态 | ✅ 未选账号时「转入创作」禁用 | — 不适用(本页对所有角色开放) |
| P3 资产库 | ✅「条目加载中」 | ✅「这个分区还没有条目」+ 去处(→P2) | ✅ 读取失败(重试) | ✅ 默认态 | ✅ 无出处的条目「入库」禁用(门禁) | — 不适用 |
| P4 创作台 | ✅「正在跑这一步」(带已跑秒数) | ✅「这一步还没有产出」 | ✅ 本步失败(保留已产出 + 重试该步) | ✅ 默认态 | ✅ 文案与封面缺一,进检查态禁用 | — 不适用 |
| P5 发布中心 | ✅「检查中」 | ✅「还没有可发布的版本」+ 回 P4 | ✅ 检查自身失败 ⇒ **按不过处理**(fail-closed) | ✅ 无硬拦、可发 | ✅ 有硬拦项时「确认发布」禁用 | ✅ 未授权账号的版本标「无发布权限」并禁用该版 |
| P6 账号画像 | ✅「画像加载中」 | ✅「还没有画像」+ 建画像 | ✅ 保存失败(保留编辑内容) | ✅ 保存成功提示 | ✅ 只读角色时字段禁用 | ✅ 非本人负责账号:可看不可改 |
| P7 复盘台 | ✅「正在读这条的数据」 | ✅「还没有能复盘的内容」 | ✅ 数据读不到 ⇒ 转手工录入 | ✅ 回写成功提示 | ✅ 未写归因时「回写」禁用 | — 不适用 |
| P8 记录与对账 | ✅「记录加载中」 | ✅「还没有发布记录」 | ✅ 读取失败(重试) | ✅ 核销成功 | ✅ 未选中记录时「核销」禁用 | ✅ 利润列对非管理员隐藏(列级遮罩) |
> 口径:`disabled` 与 `无权限` 是两件事 —— 前者「当前条件不满足」(自己能解开),后者「角色不允许」(自己解不开)。界面文案分开写,⛔ 不拿「不可用」一句话糊过去。
> 留档截图:`p1-empty-1440.png`、`p4-noperm-1440.png`、`p5-error-1440.png`;其余 45 组由自检逐组渲染核过。
---
## 六、结构核对表(契约值 / 实测值 并排,数字抄自脚本输出)
### 6.1 契约里写了数字的项
| 项 | 契约值 | 实测值 | 取法 |
|---|---|---|---|
| 强调色填充面积占比 | ≤5% | **0.52%**(八页最高:创作台,1 个填充块) | DOM:逐个元素比 `backgroundColor` ≡ `--accent`,与视口求交累加 ÷ 视口面积 |
| `--warn` 对 `--surface` 对比度 | ≥4.5:1 | **5.93:1** | 真实像素计算(WCAG 相对亮度) |
| `--accent-text` 对 `--surface` 对比度 | ≥4.5:1 | **4.76:1** | 同上 |
| `--ink-faint` 对 `--surface` 对比度 | ≥3:1(仅非正文) | **3.55:1** | 同上 |
| 一屏可容纳记录行数(P1 账号矩阵) | ≥6 @900px 高 | **10 行** @1440×900(首行顶 214px、行距 67px) | DOM:首屏可用高度 ÷ 行距。⚠️ 是「装得下几行」不是「画了几行」—— 示意数据 5 条,实际永远 ≤5 行(数据用尽,非被截断) |
| 一屏可容纳记录行数(P2 对标列表) | ≥6 @900px 高 | **7 行** @1440×900(首行顶 402px) | 同上 |
| 页内行高齐 | ≤2px 差(本段追加判据) | **67–68px,差 1px** | DOM:逐行 `getBoundingClientRect().height` |
| 视觉层间距 / 块内相邻行分隔 | ≥2 | **32px / 1px = 32**(4 个视觉层) | DOM:按 `.band` 归并视觉层后相减;分隔取各行 `borderTopWidth` 最大值 |
| 实际在用字号档数(P1) | ≥3 | **5 档**:12 / 14 / 16 / 18 / 24px,相邻差 2/2/2/6 | DOM:叶子节点 `fontSize` 去重 |
| 块间距 / 块内间距 | ≥2 | **32 / 8–16 ⇒ 2.0–4.0** | 令牌登记值 + DOM 复核(`gap` 全部落在登记刻度内,9 个刻度) |
| 横向溢出 | 0 | **0**(1440 / 1280 / 1024 / 768 / 641 / 640 / 500,八页逐页亦 0) | DOM:`scrollWidth − clientWidth` |
| 浮层中性关闭出口 | 恰好 1 | **7 / 7 个浮层均为 1**(另有决策型关闭 0–1 个,已单列报数) | DOM:可见的 `[data-act="X-close"]` 计数 |
| 同屏主档按钮 | ≤1 | **逐页 1 个**(P1 无主档:本页只用弱档,按钮高度集合 {32px}) | DOM:逐页统计实底按钮 |
| 顶栏高度 | 未写死(只看有没有折行) | **69px**(单行;补 `nowrap` 前是 70px,标签在中间折行) | DOM:`.topbar` 高度 + 诊断行 |
### 6.2 契约未写数字、本轮补登记的证据(⛔ 不留「无法判定」)
| 项 | 实测值 | 说明 |
|---|---|---|
| P1 各块落位(顶 / 高) | 今日待处理 @149+360 · 账号矩阵列表 @149+417 · 异常值提示 @599+215 · 本月表现最好的一条 @845+122 · 全局检索与随手记 @1000+113 | 前两块并排同顶(视口高 900) |
| P2 各块落位(顶 / 高) | 对标监控概览 @165+139 · 对标内容列表 @336+417 · 评论区洞察 @785+108 · 选题库 @925+330 · 灵感速记 @1287+113 | — |
| 反事实:P1 前两块落回单列 | 账号矩阵列表 @530+413 ⇒ 首行顶 530px、容量 **5 行**(<6) | 证明并排是密度判据逼出来的 |
| 控制台报错 | **0 条** | 自检全程监听 `console.error` |
| 量尺寸时的滚动零点 | `scrollY = 0`(P1 / P2 两处均核) | rect 取到的是相对视口的真值 |
### 6.3 Gate-3 八项肉眼过(真实渲染,非只看代码)
| # | 项 | 结论 |
|---|---|---|
| 1 | 裁切 | ✅ 无一页出现被裁掉的内容(23 张视口帧逐张看过) |
| 2 | 重叠 | ✅ 无元素互相压盖 |
| 3 | 失真 | ✅ 无变形拉伸;字体走系统栈,无回退异常 |
| 4 | 失效控件 | ✅ 0 个死控件(71 个 ID 在 22 个场景里逐个真驱动过) |
| 5 | 缺状态 | ✅ 48 组(六态 × 八页)全部渲染出内容 |
| 6 | 响应式破损 | ✅ 七视口横向溢出全 0;≤640px 导航变横滚标签栏、两栏带落回单列(B-15 的密度缺口另计) |
| 7 | 控制台报错 | ✅ **0 条** |
| 8 | 字体回退异常 | ✅ 字体栈全部命中系统字体;`@font-face` 数量 0(选定套实测同此) |
---
## 七、Gate 结论
### Gate-2(原型门)
**通过。** 依据:`DESIGN.md` 的十二字段契约与令牌表落盘(Gate-1 十项全过,见 `DESIGN.md` §四);八页 37 个板块与②段 `2b` 逐页逐位一致(骨架闸门正向 PASS + 反向变异两条都报红);六态 × 八页 48 组合全渲染;71 个 ID 逐个真驱动、0 死控件;对 §二 的令牌与 §二 表 2.4 交互清单做双向差集,表外可点元素为 **0**。
### Gate-3(交付门)
**桌面 / 平板档通过;手机档不通过,且已逐条留痕 —— 总判:有条件通过。**
- **通过的部分**:契约视口 1440×900 自检 **PASS 81 / FAIL 0**;1280 / 1024 / 768 亦为 **PASS 81 / FAIL 0**;§六 里契约写了数字的 15 项全部实测回填、无一项越界;Gate-3 八项肉眼检查全过;控制台报错 0。
- **不通过的部分**:**B-15** —— ≤767px 宽一屏装不满 6 行(641×900 / 640×900 实测 5 行、500×844 实测 4 行 / 5 行)。**自检在这三个视口上就是红的(PASS 80/1 与 PASS 79/2),⛔ 没有靠改判据把它变绿。**
- **条件**:B-15 的三条路(见 §三)得由用户挑一条;挑之前这一项挂在账上。
- **另需明示**:3c 那次独立评审**不是** SKILL.md §3c 要求的「外部 GPT 会诊」(本会话没有对外模型通道,见 `3c-GPT会诊.md` §〇)。**未取得外部审查 ≠ 已通过。**
---
## 八、偏离单(本段收尾必附)
| # | 原要求(文件:小节) | 实际做法 | 原因 | 影响 | 处置 |
|---|---|---|---|---|---|
| D1 | 3b 实测走 `browser-harness`(`SKILL.md` §3b) | 原型自带自检 81 项 + 变异对照 13/13 + 无头 Chrome 23 张视口帧 + 逐条 DOM 取值 | 该通道绑定实时浏览器入口,本会话驱动不了 | 证据链全部可复跑;⛔ 但**没有「真人真点」这一层** | 持续偏离,待裁定是否补一次人工走查 |
| D2 | D5 终检要 `1440x900` 与 `390x844` 两帧(`runbook` §5.3、§七) | 实测到 **500×844** 为止 | Chrome 窗口宽下限 516 ⇒ 视口最小 500;要 390 得走 CDP `setDeviceMetricsOverride` | 手机帧比要求宽 110px | 持续偏离;⛔ 报告一律写「500×844」 |
| D3 | 对外只留视口帧,长图仅自检(`runbook` §七) | 未产出长图 | `--full` 在本机通道做不到,只能截视口 | 无 | ✅ 已修(参数与目录一并删掉) |
| D4 | 3c 要「外部 GPT 会诊」(`SKILL.md` §3c) | 隔离上下文的独立评审执行者 | 无对外模型通道 | 与「异厂商外部审查」不是同一条通道 | 持续偏离,已明示 |
| D5 | 逐页截图应八页齐备 | 首次交接只给了评审 4 页 + 2 个状态 + 2 个浮层 | 交接时按「主路径优先」挑了 8 张 | 评审自己指出 P3/P6/P7/P8 未覆盖 | ✅ 已补(`_gate_shots/p3-1440.png` … `p8-1440.png` 已存在) |
## 九、收口清单(对照 `runbook` §七 逐条)
| 检查项 | 结论 |
|---|---|
| 声明制走完(开工 / 每子步 / 每处偏离) | ✅ |
| 供给核对做过(三处在位、选定套与记录一致) | ✅ `DESIGN.md` §〇 |
| `DESIGN.md` 含十二字段 + 三层令牌 + 组件规格 + 字阶定值表 + 高度层级 + 布局脚手架 + 浮层单出口 | ✅ |
| 骨架未漂(与②段逐页逐位对得上) | ✅ 机检 PASS + 双向变异报红 |
| 分档已兑现、档位未被本段改动 | ✅ `DESIGN.md` §1.2 |
| 页型已判;工具型三零 + §5.5 五条逐条过完 | ✅ 自检机核 |
| Gate-1 自检项结果写在 `DESIGN.md` 末尾,无一项不过 | ✅ |
| 原型单文件自包含、双击可开 | ✅ 无外链、无 `unpkg`、无外部 jsx |
| 状态穷举六项逐条有结论 | ✅ §五 |
| 每个按钮每个跳转真点过(含四态) | ✅ 自检 71 个 ID × 22 场景;⚠️ 通道换成自检而非 `browser-harness`(D1) |
| `3c-GPT会诊.md` 含提问原文 / 回答原文 / 四列处置表,未取到已明示 | ✅ ⚠️ 通道为独立评审执行者(D4) |
| D3 收口按三处判据人工过完,阻断项清零 | ⚠️ 15 条中 14 条清零,**B-15 未清零且留痕** |
| D5 终检真渲染,两视口各截一张,无「无法判定」项 | ⚠️ 1440×900 ✅;390×844 实测到 **500×844**(D2) |
| 每个浮层手工数过出口 + Esc / 遮罩 / 焦点锁 / 焦点归还,结论落报告 | ✅ 7 浮层 × 6 项,含触发路径;另修掉「出口计数把取消藏起来」的真缺陷(B-09) |
| 对外截图只用视口帧,长图未作评审输入 | ✅(长图通道本机做不到,已删) |
| 契约里每个数字实测回填,「契约值 / 实测值」并排 | ✅ §六 |
| Gate-2 与 Gate-3 均有书面结论 | ✅ §七 |
| 重大改版:旧版在磁盘上 + 给出新旧差异 | 不适用(本段首次交付,无旧版) |
| 偏离单已附,且无静默偏离 | ✅ §八 共 5 条 |
@@ -0,0 +1,410 @@
# MCN 短视频整合营销工作台 · DESIGN.md
> 项目 slug:`mcn-shortvideo-agent` | ③段(界面交互)第 3a 子步产出
> 落点:`执行会话/目标-根据1a需求文档生成MCN短视频整合营销-d85687/ui/DESIGN.md`(本目标目录内;⛔ 未写域外 `docs/pm/`)
> 判据源:`product-planning/references/stage-delivery/SKILL.md`(含 §供给 / Gate-1)+ 同目录 `references/execution-runbook.md` §2 + `references/layouts-tooling.md` §5.5
> 本份是原型的绑定规范:原型只许引本份登记的 token。
---
## 〇、开工声明(声明制,四字段)
| 字段 | 内容 |
|---|---|
| 当前段与子步 | ③段 / 3a 视觉规范(D0 锚需求 → D1 定调 → Gate-1) |
| 主干与挡位 | 供给=`oil-ui-pro`(方法主线)+ 本段自带样式库 `design-system-tiaoyue`(定调与令牌)/ 挡位 **标准** |
| 依据文件 | `stage-delivery/SKILL.md` §供给 + §3a;`references/execution-runbook.md` §2.0–§2.4;`references/layouts-tooling.md` §0/§1/§5/§5.5 |
| 产出落点 | `ui/DESIGN.md`(本份)、`ui/mcn-workbench.html`(3b) |
### 供给核对(runbook §2.0 · 步 −1,每轮必做)
| 步 | 动作 | 结果 |
|---|---|---|
| −1 | 确认 §供给 三处在位:定调与令牌(自带样式库)、版式骨架(`references/layouts-tooling.md`)、工艺数值判据(`references/execution-runbook.md` §3.4 + `layouts-tooling.md` §5.5) | ✅ 三处都在位。自带样式库现存 **1 套**:`assets/design-systems/design-system-tiaoyue/` |
| −1b | 套名与本项目记录比对 | ✅ 本目标无前次记录(③段首次开工,本目录此前只有 `research/` 与 `prd/`)⇒ 视作首次选定,不触发变更清单 |
| −1c | 可选档是否动用 | ⛔ **未动用** `assets/open-design/`(随段携带的可选件)。因此它独有的那几项(反 AI 味 / 无障碍 / 表单校验 / 动效纪律)**本次无供给来源** —— 见 §五 已明示,⛔ 没有凭感觉编一套顶上 |
### 页型判定(硬前置,SKILL.md §3b)
**本产品全部 8 页都是工具型页面,不是营销页。** 依据:用户是天天来干活的 MCN 团队,每一页都有人在里面完成一件事(决定先处理哪件 / 挑一条选题 / 存一条拆解 / 推一个环节 / 确认一次发布 / 改一份画像 / 写一条归因 / 核销一条记录);没有一页是为了让人「看一眼就下决心」。此判定与②段 `2b-界面布局.md` §一 一致。
⇒ 本份 D0 里**零 `.eyebrow`、零 `.lead`、零 `.hero`**(token 与类名都不设这三个)。
---
## 一、设计契约(十二个字段)
### 1.1 项目级字段
**① 主用户**:MCN 机构的内容负责人(矩阵级决策)、编导与文案(选题与创作)、剪辑与投放(版本与发布)。三者同处一个矩阵,职责不同、看的页不同。依据 ①段 `1c-用户画像.md`(零访谈画像,骨架来自 1a §四 三行角色描述 —— 该局限已如实登记,见 §四 缺口)。
**② 主操作**:**逐页唯一**(全页级)。六页的主操作由②段给定,逐页列在 1.2;本段未改一个。
**③ 必要内容(核对面)**:逐页核对②段分档表,见 1.2。核对面只做**落位核对**(常驻的零点击可见、可点入的一次点击可达),⛔ 本段不以它为由增删②段已定的信息档位。
**④ 重复项的信息量**:本产品的四个列表(账号矩阵 / 对标内容 / 资产条目 / 发布记录)都是「行式列表」,每行除「主标识 + 动作」外都带次级信息,逐页列在 1.2。
**⑤ 结构骨架(翻译面)**:
- **骨架档:主区 + 侧区**(选它的理由:一级导航有 4 个并列目的地、宽屏 ≥1024;②段给的一级组是三组加一个跨组入口,正好落在侧栏;tiaoyue 的实测外壳本身就是「左侧栏 + 顶栏」的应用型外壳,两者同构)。
- **板块落位**:把②段每页的板块按它给的「从上到下」顺序放进主区,每块一个文字标题。⛔ 未新增 / 移动 / 删除 / 合并任何板块(逐页对照见 §三)。
- **密度目标:密集(8–32)**。理由:8 页全是一屏要放多行记录的工具型页面,②段 P1 的信息分档要求矩阵列表与今日待办**同时**常驻,宽松档放不下。**同一页面只取这一档**。
- 块间距 ≥ 块内间距的 2 倍:块间 32px、块内 8/12/16px ⇒ 比值 2.0–4.0 ✅(数值登记在 §二)。
**⑥ 交互清单**:见 §二 表 2.4(逐元素四列)。**它是唯一的交互真相源** —— 3b 实测、3c 会诊、3d 终检都引这一张,⛔ 不另建一份。
**⑦ 状态覆盖六项**:见 1.3,逐页逐项有结论。
**⑧ 组件来源**:优先沿用选定套的既有组件族,其次才是自创。⛔ 未参考 `teamOnly: true` 的族(`onboarding-divider` / `onboarding-feature` / `team-scope-content` / `team-onboarding-card`)。清单见 §二 表 2.5。
**⑨ 响应式行为**:
| 断点 | 布局怎么变 |
|---|---|
| `>1024` | 侧栏 240px 常驻(带文字标签)+ 主区 `minmax(0,1fr)`;列表列宽按 1:1 分配 |
| `640–1024` | 侧栏收窄到 200px,仍带文字标签;列表的次级信息列折到主标识下方一行 |
| `<640` | 侧栏**变成页头下方一条可横向滚动的标签栏**(⛔ 不隐藏、⛔ 不变成纯图标),主区单列;行式列表的列改为「主标识一行 + 状态/动作第二行」 |
⚠️ 实测覆盖:**1440 / 1280 / 1024 / 768 / 641 / 640 ×900,以及 500×844** 七个视口都跑过自检,横向溢出全为 0。窄视口实测到 500×844 为止(原因见 §五 第 6 条)。窄视口下**两栏带(`.band`)在 ≤1024px 落回单列** —— 不落的话,列表被挤到不足 300px,每行会竖折成三行(实测踩过,见 §五 第 7 条)。**密度在 ≤767px 宽不达标**,逐视口实测值与成因见 §五 第 7 条。
**⑩ 明确拒绝的模式**(≥3 条,每条可判定):
1、⛔ 不出现「眉标 / 大标题 / 灰色副标题」三段式标题区(判据:DOM 里 `.eyebrow` / `.lead` / `.hero` 三个类名出现次数为 0)。
2、⛔ 不用围合边框假装分组(判据:非控件元素里 `border` + `border-radius` 同时出现的次数,在同一「分组」用途上 ≥3 次即判不过;结构性容器一律靠底色差 + 多层阴影分层)。
3、⛔ 不给列表行套框、不给状态上整行底色(判据:行间只用 `border-top`;状态只出现在 `tag` 内)。
4、⛔ 不做入场编排(判据:交付文件里 `@keyframes` 出现次数为 0,过渡只用 `transition`)。
5、⛔ 不可点的东西不长成可点样子(判据:页面里所有 `button` / `[role=button]` / `.btn*` 集合,与 §二 表 2.4 的元素列做双向差集,差集为空)。
**⑪ 验收标准(可观察可判定)**:
- 八页各自可达(`#/p/p1`…`#/p/p8` 直接打开都渲染出该页内容,不是空壳)。
- 表 2.4 每一行的「触发 → 反馈」都真发生过,无死按钮。
- 六态在每一页都能被看到(正常 / 加载 / 空 / 错误 / 禁用 / 无权限)。
- 宽视口 1440×900 与窄视口各留一张截图,横向溢出为 0。⚠️ 窄视口**实测到 500×844 为止**:本机只有无头 Chrome + 命令行开关这一条通道,窗口宽下限被卡在 516px,拿不到 390 —— 见 §五 第 6 条,⛔ 不写成「已测 390×844」。
- 页面上每个可点元素都能在表 2.4 里查到;表里没有的可点元素为 0。
**⑫ 明确拒绝的「编造」**(本项目追加一条,源自①②段的纪律):界面上不出现「示例」「示意图」「未接入」「待核实」这类制作说明;也不把机器结论说成人已认可(如把「疑似原因」写成「已确认原因」)。
### 1.2 逐页字段(页面职责 / 主操作 / 必要内容落位 / 重复项信息量)
| 页 | 页面职责(让谁 / 多久 / 完成什么) | 主操作(唯一) | 必要内容的落位核对 | 重复项的信息量(每行的次级信息) |
|---|---|---|---|---|
| P1 矩阵总览 | 让内容负责人在 1 分钟内决定**今天先处理哪一件事** | 挑一件待办并进到那一件事 | 账号矩阵列表与今日待办=零点击可见;异常值、本月最好、检索与随手记=一次点击可达 | 账号行=账号名(主标识)+ 今日该发/已发/效果(3 条次级)+ 异常徽章 |
| P2 选题雷达 | 让编导在 3 分钟内**找到一条能做的选题** | 把一条选题推进下一步 | 监控概览四数、对标内容列表、选题库=零点击可见;评论区洞察、灵感速记=一次点击可达 | 对标行=标题(主标识)+ 账号 + 倍数 + 时间;选题行=选题(主标识)+ 来源 + 状态 |
| P3 资产库 | 让编导在 2 分钟内**存一条拆解结果、或引用一条已存的** | 入库一条 / 引用一条 | 分区切换、条目列表=零点击可见;单条详情、引用入口=一次点击可达 | 条目行=条目摘要(主标识)+ 出处 + 草稿/已入库 + 采集时间 |
| P4 创作台 | 让编导在一条内容上**把当前环节推到下一环节** | 推进到下一环节 | 环节进度、当前环节工作区、当前内容标识=零点击可见;资产引用区、版本列表=一次点击可达 | 版本行=vN(主标识)+ 语义名 + 时间 + 当前标记 |
| P5 发布中心 | 让投放**确认发出这一批版本** | 确认发布 | 检查结果、各版本预览与逐版编辑、确认发布=零点击可见;目标选择、发布记录入口=一次点击可达 | 版本行=账号/平台(主标识)+ 字数 + 检查结论;记录行同 P8 |
| P6 账号画像 | 让内容负责人**改好并保存一个账号的画像** | 保存这一份画像 | 画像六维、账号列表=零点击可见;记忆条目、关联内容=一次点击可达 | 账号行=账号名(主标识)+ 平台 + 内容数;记忆行=日期(主标识)+ 来源 + 一句话 |
| P7 复盘台 | 让内容负责人**确认归因并写回这个账号** | 确认归因并回写 | 表现数据、归因结论区、待复盘列表、回写目标提示=零点击可见;历史复盘=一次点击可达 | 待复盘行=内容(主标识)+ 发布账号 + 发布日 + 数据到没到 |
| P8 记录与对账 | 让投放**核销一条发布记录** | 核销一条记录 | 发布记录列表、对账核对区=零点击可见;单条溯源、商单与收支=一次点击可达 | 记录行=内容(主标识)+ 确认人 + 时间 + 版本 + 状态 |
### 1.3 状态覆盖六项(逐页给结论)
判据源:`SKILL.md` 铁律 2 给出的六态清单(loading / empty / error / success / disabled / 无权限)。⚠️ 逐项**数值判据**出自供给可选档的 `craft/state-coverage.md`,本轮未动用可选档 ⇒ **该项本次无供给来源**,故此处只给「有没有、长什么样」的结论,不编阈值。
| 页 | loading | empty | error | success | disabled | 无权限 |
|---|---|---|---|---|---|---|
| P1 | ✅ 矩阵数据加载中(骨架行 + 「正在取矩阵数据」) | ✅ 还没接入账号(给「去账号画像建第一个账号」) | ✅ 数据源不可用(显时间戳 + 重试) | ✅ 默认态 | ✅ 无可处理项时待办区禁用并说明 | ✅ 非管理员看利润字段时的遮罩说明 |
| P2 | ✅ 拉取对标中 | ✅ 监控名单为空(给「录一个对标号」) | ✅ 拉取失败(退路=手工录入) | ✅ 默认态 | ✅ 未选账号时「转入创作」禁用 | ✅ —(不适用:本页对所有角色开放) |
| P3 | ✅ 条目加载中 | ✅ 该分区还没有条目(给「去拆解一条」) | ✅ 读取失败(重试) | ✅ 默认态 | ✅ 无出处的条目「入库」禁用(门禁) | ✅ —(不适用) |
| P4 | ✅ 环节生成中 | ✅ 该环节还没产出(给「开始这一步」) | ✅ 本步失败(保留已产出 + 重试该步) | ✅ 默认态 | ✅ 文案与封面缺一,「进检查态」禁用(封面缺只提示) | ✅ —(不适用) |
| P5 | ✅ 检查中 | ✅ 还没有可发布的版本(回 P4) | ✅ 检查自身失败 ⇒ **按不过处理**(fail-closed) | ✅ 无硬拦、可发 | ✅ 有硬拦项时「确认发布」禁用 | ✅ 未授权账号的版本标「无发布权限」并禁用该版 |
| P6 | ✅ 画像加载中 | ✅ 还没有画像(给「建画像」) | ✅ 保存失败(保留编辑内容) | ✅ 保存成功提示 | ✅ 只读角色时字段禁用 | ✅ 非本人负责账号:可看不可改 |
| P7 | ✅ 读数据中 | ✅ 还没有可复盘的内容 | ✅ 数据读不到 ⇒ 转手工录入表现 | ✅ 回写成功提示 | ✅ 未确认归因时「回写」禁用 | ✅ —(不适用) |
| P8 | ✅ 记录加载中 | ✅ 还没有发布记录 | ✅ 读取失败(重试) | ✅ 核销成功 | ✅ 未选中记录时「核销」禁用 | ✅ 利润列对非管理员隐藏(列级遮罩) |
> 口径:`disabled` 与 `无权限` 是两件事 —— 前者是「当前条件不满足」(自己能解开),后者是「角色不允许」(自己解不开)。界面文案必须分开写,⛔ 不拿「不可用」一句话糊过去。
---
## 二、令牌表
### 2.1 三层结构(`primitive → semantic → component`)
组件层只引语义层,语义层只引 primitive;⛔ 无孤立 token。
| 层 | 前缀 | 例子 | 规则 |
|---|---|---|---|
| primitive | `--t-*`/`--raw-*` | `--t-accent`、`--raw-fs-12` | 只有原始值,⛔ 别的层不许直接引它以外的东西;本层不许被组件层直接引用 |
| semantic | `--`(无前缀语义名) | `--surface`、`--ink`、`--fs-14` | 只引 primitive |
| component | `--c-*` | `--c-card-radius`、`--c-btn-h` | 只引 semantic |
### 2.2 色值(来源=选定套 `design-system-tiaoyue` 的 `assets/tokens.css` 亮色基线 · 9 页 clipper 实测)
| 语义 token | 值 | 用途 |
|---|---|---|
| `--paper` | `#faf9f5` | 页面底(暖白纸感) |
| `--surface` | `#ffffff` | 面板 / 卡片底 |
| `--surface-soft` | `#f7f6f1` | 次级面(表头、只读块、侧栏选中底) |
| `--ink` | `#1a1a18` | 主文字 |
| `--ink-mute` | `#57564f` | 次级文字 |
| `--ink-faint` | `#8a887f` | 三级文字 / 占位(⛔ 只用于非正文:占位、图标、禁用态) |
| `--line` | `#e7e5dc` | 分隔线(行间 `border-top`) |
| `--line-soft` | `#efeee7` | 更弱的分隔(块内) |
| `--accent` | `#9E4CFF` | 主强调色(品牌紫) |
| `--accent-text` | `#963dff` | accent 当**文字**时用这一档(`#9E4CFF` 直接当文字不达标) |
| `--on-accent` | `#FFFFFF` | 主色上的文字 |
| `--ok` | `#3d7a4f` | 成功态 |
| `--err` | `#b4453a` | 错误态 |
| `--warn` | `#8a5a00` | 提醒 / 异常值 / 软劝 ⚠️ **本项目追加**:选定套亮色基线**没有 warn 档**,而②段 P5 要求「硬的拦住、软的只提醒」必须有两种可见区分 ⇒ 新增一档并在次行登记来源与对比度实测 |
**强调色允许位置(反 slop 要求写明)**:只允许出现在 ① 主按钮的填充底;② 侧栏当前项左侧 3px 指示条;③ 链接文字(用 `--accent-text`);④ 焦点环。⛔ 不允许出现在:页面大背景、卡片底、图标填充(除主按钮内图标)、任何渐变。全屏面积 ≤5%。
**禁止**:⛔ 无紫→粉渐变;⛔ 无装饰性发光;⛔ 状态色只用这红/绿/黄三系,不做装饰。
### 2.3 几何 · 字体 · 间距 · 字阶 · 高度层级 · 脚手架
| 项 | 值 | 来源 / 说明 |
|---|---|---|
| 字体 | `"PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "Noto Sans SC", sans-serif` | 选定套实测:源站 `@font-face` 为 0 条,走系统字体栈。⛔ 未手改 |
| 标题字体 | 同上(同族),字重 ≤600 | 中文字重不超 600;⛔ 未用 Inter / Roboto / Arial / `system-ui` 关键字 |
| 等宽数字 | `font-variant-numeric: tabular-nums` | 所有数字列,防刷新抖动 |
| 圆角 | 大容器 `24px`(`--t-card-radius`)/面板 `16px`/行与小件 `14px`/输入框 `9px`/按钮 `26px`(药丸) | 全部取自选定套 `<`—— `--card-radius: 24px`、`--ui-radius: 16px`、`--radius: 14px`、`--inp-radius: 9px`、`--btn-radius: 26px` |
| 间距 · 主刻度 | `4 / 8 / 16 / 24 / 32 / 64` | 供布局。块间用 32(同行组间 24),块内用 8/12/16 |
| 间距 · 微网格 | `2 / 4 / 6 / 8 / 12` | **仅供**按钮内衬、徽章内衬、图标间隙 |
| 块间距 / 块内间距 | 32 / 8–16 ⇒ 比值 2.0–4.0 | 判据要求 ≥2 ✅ |
| 字阶定值表(七档,各一个 px) | `--fs-12` 12 / `--fs-14` 14 / `--fs-16` 16 / `--fs-18` 18 / `--fs-20` 20 / `--fs-24` 24 / `--fs-30` 30 | 相邻档差 2/2/2/2/4/6,全部 ≥2 ✅;每档只一个定值,⛔ 不是区间。正文档 `--fs-14`(多数正文)与 `--fs-16`(表单值),落在 14–16 ✅ |
| 高度层级(每层多层叠层) | L1(行/内嵌):`0 1px 1px rgba(26,26,24,.03), 0 2px 6px -2px rgba(26,26,24,.06)`<br>L2(面板):`0 1px 2px rgba(26,26,24,.04), 0 8px 20px -12px rgba(26,26,24,.14), 0 18px 40px -18px rgba(26,26,24,.10)`<br>L3(浮层):`0 2px 4px rgba(26,26,24,.05), 0 14px 32px -12px rgba(26,26,24,.18), 0 32px 64px -24px rgba(26,26,24,.16)` | 每层 ≥2 层叠层 ✅;同层级同值。⛔ 无单层死黑重阴影 |
| 布局脚手架 | 侧栏 `240px`(`640–1024` 收 200px)+ 主区 `minmax(0,1fr)`;主区内列表列宽 `1fr 1fr`(行式列表的「主标识 / 次级」两列),窄屏折行 | 骨架档=主区+侧区,已落到具体列宽 |
| 容器与对齐锚点 | 主区左右内衬 32px;行式列表的文字左锚点与块标题左锚点同一条线;数字列右对齐且右锚点对齐块右内衬 | 判据要求「对齐锚点」写明 |
| 浮层 | 居中面板,宽 `min(560px, calc(100vw - 32px))`,内衬 24px;**只有一个可见关闭出口**(右上 ×);遮罩与 `Esc` 也可关,但不计为可见出口 | 满足 Gate-3 的「可见关闭出口唯一」 |
### 2.4 交互清单(唯一交互真相源 · 四列)
**通用规则**(适用于下面所有浮层):每个浮层**只有一个可见关闭出口**(右上 ×,ID 记为 `X-close`);遮罩点击(ID 记为 `X-mask`)与 `Esc` 也能关,但**不视为可见出口**;关闭后焦点回到触发它的那个按钮,Tab 只在层内循环。这三条逐浮层过了一遍,结论在 `3d-审查报告.md` 的浮层表里。下表不再逐浮层重复这三条。
| ID | 元素 | 触发 | 反馈 | 何时不可点 |
|---|---|---|---|---|
| G-01 | 一级组「找选题」 | 点击 | 跳到 P2;该组高亮 | 从不可点 |
| G-02 | 一级组「走创作流水线」 | 点击 | 跳到 P4;该组高亮 | 从不可点 |
| G-03 | 一级组「看矩阵复盘」 | 点击 | 跳到 P1;该组高亮 | 从不可点 |
| G-04 | 一级组「账号画像」(跨组) | 点击 | 跳到 P6;该组高亮 | 从不可点 |
| G-05 | 二级页项 P1–P8(8 项) | 点击 | 切到该页(hash 变、主区重绘);当前项 `is-active` | 从不可点 |
| G-06 | 顶栏「随手记」 | 点击 | 打开随手记浮层,焦点进输入框 | 从不可点 |
| G-07 | 顶栏账号切换器 | 点击 | 展开账号下拉;选中后顶栏显示该账号,涉及账号上下文的页跟着切换 | 账号列表为空(empty 态)时禁用 |
| G-08 | 顶栏「假设 2 项」 | 点击 | 打开假设浮层(逐条给复核人 / 复核时机 / 结论落点) | 从不可点 |
| G-09 | 顶栏演示状态开关 | 选择 | 强制当前页进入 正常 / 加载 / 空 / 错误 / 禁用 / 无权限 | 从不可点 |
| G-10 | 顶栏「全局检索」 | 点击 | 打开检索浮层,焦点进输入框 | 从不可点 |
| X-close | 各浮层右上 × | 点击 | 关闭浮层;焦点回触发它的按钮 | 从不可点 |
| X-mask | 浮层遮罩(层外空白区) | 点击 | 关闭浮层;焦点回触发它的按钮 | 没有浮层时不渲染 |
| STATE-NORMAL | 状态面板 · 「回到正常内容」 | 点击 | 该页回 `ok` 态,主操作恢复 | 仅在非 `ok` 态出现 |
| STATE-RETRY | 出错态 · 「重试一次」 | 点击 | 提示已重试(示意);不改数据 | 仅在 `error` 态出现 |
| STATE-GO | 空态 · 「去〈某页〉」 | 点击 | 跳到该页;浮层关 | 仅在 `empty` 态、且该页定义了去处时出现 |
| R-01 | 随手记浮层 · 输入框 | 输入 | 内容非空时「保存」由禁用转可用 | 从不可点(可输入) |
| R-02 | 随手记浮层 · 保存 | 点击 | 写入选题库「待做」;提示 1.5s 后消失;浮层关闭 | 输入为空时 `:disabled` |
| R-03 | 随手记浮层 · 取消 | 点击 | 关闭,不写入;焦点回触发按钮 | 从不可点 |
| S-01 | 检索浮层 · 输入框 | 输入 | 结果列表按关键字过滤;无结果显示空态行 | 从不可点(可输入) |
| S-02 | 检索浮层 · 结果项 | 点击 | 跳到该结果所属的页;浮层关闭 | 无结果时列表为空(不渲染可点项) |
| A-01 | 假设浮层 · 两处假设条目 | 展示 | 只读,逐条给复核人 / 时机 / 落点 | 不适用(只读,非控件) |
| P1-01 | 今日待办项(每条) | 点击 | 跳到该待办所属的页(选题类→P2、在写→P4、待审→P5、待复盘→P7、待核销→P8) | 该条为「已超期未处理」时仍可点,但带提醒标 |
| P1-02 | 账号矩阵行 | 点击 | 跳到 P6 并选中该账号 | 从不可点 |
| P1-03 | 账号矩阵行 · 「看复盘」 | 点击 | 跳到 P7 并选中该账号的待复盘内容 | 该账号没有可复盘内容时禁用 |
| P1-04 | 异常值提示条目 | 点击 | 跳到 P2 并定位到该对标内容 | 无异常值时整块显示空态(不渲染可点项) |
| P1-05 | 本月最好的一条 | 点击 | 跳到 P7 的该条复盘 | 无数据时禁用 |
| P2-01 | 监控概览 · 「低粉爆款」数 | 点击 | 筛选对标内容列表(只看爆款) | 数为 0 时禁用 |
| P2-02 | 监控概览 · 「异常值」数 | 点击 | 筛选对标内容列表(只看异常) | 数为 0 时禁用 |
| P2-03 | 对标内容行 · 「发起拆解」 | 点击 | 跳到 P3 并带着这条素材(预填原文与出处) | 从不可点 |
| P2-04 | 评论区洞察子区 · 展开/收起 | 点击 | 展开子区并开始抓取(显示抓取中) | 从不可点 |
| P2-05 | 评论区洞察 · 「抓取评论」 | 点击 | 进入抓取中 → 出候选选题列表 | 抓取中时禁用 |
| P2-06 | 候选选题 · 「采纳」 | 点击 | 该条进选题库「待做」;候选行标为已采纳 | 该条已采纳时禁用 |
| P2-07 | 候选选题 · 「忽略」 | 点击 | 候选行标为已忽略(可恢复) | 该条已忽略时禁用 |
| P2-08 | 选题库 · 分组 tab(待做/在写/已用) | 点击 | 列表切换成该组 | 从不可点 |
| P2-09 | 选题行 · 「转入创作」 | 点击 | 建当前内容并跳到 P4;选题转「在写」 | 未选账号时禁用(并在行内说明) |
| P2-10 | 选题行 · 「拆解」 | 点击 | 跳到 P3 并把该选题当成素材 | 从不可点 |
| P3-01 | 分区切换 tab(角度/结构/开场白/标题) | 点击 | 条目列表换成该分区 | 从不可点 |
| P3-02 | 条目行 | 点击 | 右区显示单条详情(原文 / 出处 / 草稿标记) | 从不可点 |
| P3-03 | 待入库区 · 「入库」 | 点击 | 无出处的条目被门禁挡住并说明原因;有出处的转「已入库」 | **无出处或原文缺失时禁用**(门禁) |
| P3-04 | 单条详情 · 「引用到创作台」 | 点击 | 跳到 P4 并把该条目加进资产引用区 | 从不可点 |
| P4-01 | 环节进度 · 七个环节(逐项) | 点击 | 切到该环节;只许回退到已完成的环节 | 未到达的后续环节禁用 |
| P4-02 | 当前环节工作区 · 内容输入框 | 输入 | 「开始这一步」由禁用转可用 | 从不可点(可输入) |
| P4-03 | 当前环节工作区 · 「开始这一步」 | 点击 | 生成中 → 产出内容(写进本环节) | 输入为空时禁用 |
| P4-04 | 资产引用区 · 「从资产库拿一条」 | 点击 | 展开选择器;选中后收进引用区并显示来源 | 资产库为空时禁用并说明 |
| PICK-ASSET | 资产选择器 · 单条 | 点击 | 收进引用区并显示来源;浮层关 | 已引用过的不渲染可点项 |
| P4-05 | 资产引用区 · 「移除引用」 | 点击 | 从引用区移除该条 | 引用区为空时不渲染 |
| P4-06 | 「推进到下一环节」 | 点击 | 当前环节 +1;进度条与工作区跟着变 | 文案与封面缺一,进检查态时禁用(封面缺只提示) |
| P4-07 | 版本列表 · 展开/收起 | 点击 | 展开版本列表浮层 | 从不可点 |
| P4-08 | 版本行 · 「切为当前版」 | 点击 | 该版标为当前版;当前内容标识的版本号跟着变 | 该版已是当前版时禁用 |
| P5-01 | 目标选择 · 展开/收起 | 点击 | 展开账号与平台多选 | 从不可点 |
| P5-02 | 目标选择 · 账号项 | 点击 | 勾选/取消;版本列表跟着增删一版 | 从不可点 |
| P5-03 | 目标选择 · 平台项 | 点击 | 勾选/取消;同上 | 从不可点 |
| P5-04 | 版本预览 tab(逐版) | 点击 | 右区换成该版内容 | 从不可点 |
| P5-05 | 版本内容编辑框 | 输入 | 保存按钮由禁用转可用;标为「已改」 | 从不可点(可输入) |
| P5-06 | 版本内容 · 「保存本版」 | 点击 | 该版内容更新;检查结果跟着重算(回到未检) | 无改动时禁用 |
| P5-07 | 检查结果 · 「复检」 | 点击 | 检查中 → 出结论(硬拦 / 软劝 / 通过) | 检查中时禁用 |
| P5-08 | 「确认发布」 | 点击 | 打开二次确认浮层 | **有硬拦项时禁用**;无版本时禁用 |
| P5-09 | 二次确认 · 「确认发出」 | 点击 | 写发布记录(P8 出现一条);提示成功 | 从不可点 |
| P5-10 | 二次确认 · 「取消」 | 点击 | 关闭浮层,不发;焦点回触发按钮 | 从不可点 |
| P5-11 | 发布记录入口 | 点击 | 跳到 P8 | 从不可点 |
| P6-01 | 账号列表项 | 点击 | 切换右区画像 | 从不可点 |
| P6-02 | 画像六维字段(6 个输入) | 输入 | 「保存画像」由禁用转可用 | 非本人负责账号时禁用(改由角色判定) |
| P6-03 | 「保存画像」 | 点击 | 保存成功提示;未保存时离开给提示 | 无改动时禁用 |
| P6-04 | 记忆条目 · 展开/收起 | 点击 | 展开记忆列表(只追加,不可编辑) | 从不可点 |
| P6-05 | 关联内容行 | 点击 | 跳到 P4 的该条内容 | 无关联内容时整块空态 |
| P7-01 | 待复盘列表项 | 点击 | 右区换成该条的表现数据 | 从不可点 |
| P7-02 | 表现数据 · 「手工录入」 | 点击 | 数据读不到时的降级入口,展开输入 | 数据已读到时不渲染 |
| P7-03 | 归因结论区 · 文本 | 输入 | 「确认归因并回写」由禁用转可用 | 从不可点(可输入) |
| P7-04 | 「确认归因并回写」 | 点击 | 回写到当前账号画像:记忆 +1;显示回写目标 | 归因为空、或未选账号时禁用 |
| P7-05 | 历史复盘 · 展开/收起 | 点击 | 展开历史复盘结论 | 从不可点 |
| P8-01 | 发布记录行 | 点击 | 右区换成该条的对账详情 | 从不可点 |
| P8-02 | 「单条溯源」(可点入) | 点击 | 展开溯源:从记录回到内容与版本 | 从不可点 |
| P8-03 | 对账核对区 · 「核销」 | 点击 | 二次确认 → 该条标「已核销」 | 未选记录时禁用;记录未「已发布」时禁用 |
| CHECKOUT-OK | 核销二次确认 · 「确认核销」 | 点击 | 该条标「已核销」;提示成功;浮层关 | 从不可点 |
| CHECKOUT-CANCEL | 核销二次确认 · 「取消」 | 点击 | 关闭浮层,不核销;焦点回触发按钮 | 从不可点 |
| P8-04 | 「商单与收支」展开/收起 | 点击 | 展开收支条目 🔴 **本块是假设**(见 §三) | 从不可点 |
⚠️ **「可见关闭出口」与「决策型关闭」是两件事,⛔ 不许混成一个数**:每个浮层的中性关闭出口只有一颗 ×(`X-close`),恰好 1 个;**「取消」这类带决策语义的按钮也能关层,但它不是「找出口」用的**,单独登记(`R-03` / `P5-10` / `CHECKOUT-CANCEL`)。这条口径是补出来的 —— 原先自检只数 `.layer-close` 这个类名,于是两颗可见的「取消」完全没进计数,两个二次确认层其实各有两个看得见的关闭控件,判据却报「出口 = 1」。逐浮层的核对结论与触发路径在 `3d-审查报告.md` §六。
**表外可点元素必须为 0** —— 3b 自检里有一条逐集合做双向差集的检查(`#/selftest` 路由自动跑,结果落 `3b-实测记录.md`)。
⚠️ **`A-01` 不是控件**:它是假设浮层里的只读展示行,本表把它列出来是为了让「假设有两处、逐条给复核人 / 时机 / 落点」这件事在清单里看得见。⇒ 它**不进实现清单**(原型里的 `IMPL` 表),自检也不该拿它去点。本表的控件 ID 与 `IMPL` 的键必须**互为子集且相等**,这条由 `_tools/mutate_test.py` 里的 M2/M3 两处变异盯着(漏登记 / 悬空声明各一种)。
### 2.5 组件规格(来源:选定套既有组件族)
| 组件 | 规格(具体值) | 来源 |
|---|---|---|
| 按钮 · 主档 | 高 `40px`,内衬 `12/20`,字号 `16px`,字重 `600`,圆角 `26px`(药丸),底 `--accent`,字 `--on-accent` | 选定套 `--btn-radius/--btn-px/--btn-py`;字号 16 + 字重 600 是**必须的**(见下注) |
| 按钮 · 次档 | 高 `40px`,内衬 `12/20`,字号 `14px`,字重 `500`,圆角 `26px`,底 `--surface`,描边 1px `--line`,字 `--ink` | 同族 |
| 按钮 · 弱档(文字) | 高 `32px`,内衬 `6/12`,字号 `14px`,圆角 `26px`,无底无描边,字 `--accent-text` | 同族 |
| 卡片 · 密卡 | 内衬 `16px`,圆角 `16px`,底 `--surface`,L1 阴影 | 同族 |
| 卡片 · 宽松卡 | 内衬 `24px`,圆角 `24px`,底 `--surface`,L2 阴影 | 同族 `--card-radius/--card-pad` |
| 输入框 | 高 `36px`,内衬 `12/10`,圆角 `9px`,字号 `14px`,底 `--surface`,描边 1px `--line` | 同族 `--inp-*` |
| 徽章 / 状态标 | 高 `22px`,内衬 `2/8`,字号 `12px`,圆角 `999px`,无描边,底为对应状态色 8% 叠加 | 同族 `is-*` 修饰族 |
| 侧栏导航项 | 高 `36px`,内衬 `8/12`,圆角 `14px`,当前项底 `--surface-soft` + 左 3px `--accent` 指示条 | tiaoyue `nav-item` + `is-active` |
> 同屏主档按钮 ≤1(多步流程每步 ≤1):P1 无主档、P2/P3/P4/P5/P6/P7/P8 各 1 个 ✅
> 实底底色 ≥2 种:主档 `--accent`、次档 `--surface`、状态标(ok/err/warn 三色 8% 叠加)✅
> ⚠️ **主档按钮的 16px + 600 不是随手定的**:选定套记录 `#FFFFFF` 压 `#9e4cff` 只有 **4.26:1**(两形态一致,是品牌紫的固有属性),走**大字线 3:1** 才达标 ⇒ 主档按钮文字必须 ≥16px 且加粗;⛔ 小字(<16px 常规字重)压主色在本规范里没有合规解,故不允许出现。
---
## 三、两处假设的显式标注(⛔ 不当已确认需求用)
②段 `2b-界面布局.md` §四 标了两处骨架受限。本轮**尚无用户结论**,按②段给的默认读法做,并在本份与原型里显式标注:
| # | 受影响处 | 假设内容 | 本轮默认读法(按 2b §四) | 复核人 | 复核时机 | 结论落点 |
|---|---|---|---|---|---|---|
| 假设 1 | **P1 的形态**(横幅:`2b` §二 P1 末段) | 矩阵级视图是否真需要(1a 待复核第 5 条 + A1) | **按「需要矩阵级视图」做**:P1 = 矩阵总览,5 个板块全在。若复核为「不需要」,P1 降为「单账号今日」,只留第 1、4 板块,矩阵列表下移到账号切换 | 主会话转用户 | ②段收口时一次性过;③段已按默认读法做,结论到了改这一处 | `2b` §四 + §二 P1;本轮落 `ui/DESIGN.md` 本节 + 原型 P1 标题行的「假设」徽章 |
| 假设 2 | **P8 的第 4 板块**「商单与收支」 | 商单对账进不进第一版、收支口径是否内容级(1a 待复核第 6 条 + A3) | **按「进第一版但属 P2、可整块缺」做**:第 4 板块**渲染出来但标「可点入 + 假设」**,并在展开后给一句「本块依赖未复核项」。第 1、2、3 板块不受影响 | 主会话转用户 | 同上 | `2b` §四 + §二 P8;本轮落 `ui/DESIGN.md` 本节 + 原型 P8 第 4 板块标题行的「假设」徽章 |
**原型的兑现方式**(不占标题区、不写成注脚):两处各在自己的**板块标题同行右侧**挂一个「假设」徽章;顶栏另有「假设 2 项」入口,点开逐条给出复核人 / 时机 / 落点。⛔ 假设既没有被当已确认需求写死,也没有被编出答案。
---
## 四、Gate-1 方向门自检(硬闸,结果写在本份末尾)
| # | 检查项 | 结论 | 依据 |
|---|---|---|---|
| 1 | 设计契约十二字段 | ✅ 过 | §一 十二字段全填,无空、无「待定」;重复项逐页列了次级信息;交互清单四列齐全且表外可点元素为 0(3b 实测复核) |
| 1b | 页型判定 | ✅ 过 | 全文工具型;D0 零 `.eyebrow` / 零 `.lead` / 零 `.hero`(原型里这三个类名出现 0 次,`#/selftest` 复核) |
| 2 | 结构骨架(翻译面) | ✅ 过 | 骨架档=主区+侧区(给了理由);板块落位照②段顺序、每块有文字标题;②段分档表每条信息都有落位(§1.2 逐页核对) |
| 2b | 骨架未漂 | ✅ 过 | 八页与板块逐条对得上 `2b`,本段未增删移动(见下表) |
| 3 | 状态覆盖 | ✅ 过 | §1.3 六态逐页有结论;`disabled` 与 `无权限` 分开写 |
| 4 | 令牌表 | ✅ 过 | §2.2/§2.3 色值、字体、间距两档(适用面已分开)、圆角、阴影全为具体值 |
| 4b | 字阶定值表 | ✅ 过 | 七档各一个 px(12/14/16/18/20/24/30),相邻差 2/2/2/2/4/6 ≥2 |
| 4c | 高度层级 | ✅ 过 | L1/L2/L3 每层 ≥2 层叠层,同层级同值 |
| 4d | 布局脚手架 | ✅ 过 | 侧栏 240/200px + 主区 `minmax(0,1fr)`;窄屏变化写具体(标签栏化) |
| 5 | 组件规格 | ✅ 过 | 按钮三档+卡片两档+输入框+徽章均为具体值;同屏主档 ≤1;实底 ≥2 种 |
| 6 | 反 slop | ✅ 过 | 无紫→粉渐变;标题用选定套系统字体栈(非禁用字体);强调色允许位置已写明(§2.2) |
| 7 | 拒绝清单 | ✅ 过 | §1.1 ⑩ 共 5 条,每条带可判定判据(≥3 ✅) |
| 8 | token 引用完整性 | ✅ 过 | 三层结构;组件层只引语义层、语义层只引 primitive;无孤立 token |
| 9 | 分档兑现 | ✅ 过 | §1.2 逐页落位;常驻=零点击可见、可点入=一次点击可达;档位未被本段改动 |
| 10 | 供给核对 | ✅ 过 | §〇 已核;选定套 `design-system-tiaoyue`,与本目标记录一致(首次选定) |
**骨架未漂逐页对照**(⛔ 本段未新增 / 移动 / 删除 / 合并):
| 页 | ②段板块(照抄) | 原型落位 | 一致 |
|---|---|---|---|
| P1 | 今日待处理/账号矩阵列表/异常值提示/本月表现最好的一条/全局检索与随手记入口 | 同序 5 块(前两块**并排一层**) | ✅ |
| P2 | 对标监控概览/对标内容列表/评论区洞察区/选题库/灵感速记入口 | 同序 5 块 | ✅ |
| P3 | 分区切换/条目列表/单条详情/引用入口 | 同序 4 块 | ✅ |
| P4 | 当前内容标识/环节进度/当前环节工作区/资产引用区/版本列表 | 同序 5 块 | ✅ |
| P5 | 目标选择/各版本预览与逐版编辑/检查结果/确认发布/发布记录入口 | 同序 5 块 | ✅ |
| P6 | 账号列表/画像六维/记忆条目/关联内容 | 同序 4 块 | ✅ |
| P7 | 待复盘列表/这一条的表现数据/归因结论区/回写目标提示/历史复盘 | 同序 5 块 | ✅ |
| P8 | 发布记录列表/单条溯源/对账核对区/商单与收支 | 同序 4 块 | ✅ |
> 板块的**排布位置**:P3/P5/P6/P8 在②段里是「列表 + 详情」并存的一页,本段按 `layouts-tooling.md` §0 判为**侧区型**(主操作要在列表与详情之间来回),故在**块内**用左右两栏落实(左列表、右详情);⛔ 这不是增删板块,是同一批板块在骨架档里的摆法(块内怎么摆归③段)。
>
> **P1 的前两块并排一层**(同上口径):②段把「今日待处理」和「账号矩阵列表」列为第 1、2 块,本段让它们**左→右并排**、读序不变,「异常值提示」及其后仍顺次往下。这么做不是审美选择,是 **§六 的密度判据逼出来的** —— 反事实实测:把两栏带强制落回单列时,`账号矩阵列表@530+413`,首行顶 **530px**,容量 `floor((900−530)/67) = 5 行`,够不着「一屏 ≥6 行」;并排之后首行升到 **214px**,一屏装得下 **10 行**。实测过程记在 `3b-实测记录.md` §五。
> 若复核认为并排也算动了骨架,回退办法只有一条:把密度判据在 1440×900 下放宽到 ≥5 行 —— **两件事必须挑一件,不能都不做**(原判据下,单列连 6 行都够不着)。
---
## 五、缺口与证据边界(⛔ 不假装支持)
1. **反 AI 味 / 无障碍 / 表单校验 / 动效纪律的逐项数值判据本次无供给来源** —— 这四项出自 §供给·工艺数值判据 的**可选档**(`assets/open-design/craft/` 13 份),本轮未动用可选档 ⇒ ⛔ 不凭感觉编一套顶上。本段实际应用的是**默认档**判据:`execution-runbook.md` §3.3/§3.4 + `layouts-tooling.md` §5.5(五条反「实习生审美」硬判据)。四条已按默认档能做到的部分执行(如 focus-visible 三态、tabular-nums、防溢出三件套、间距只用登记刻度)。
2. **暗色主题本轮不做** —— 选定套的暗色与亮色是两套独立基线,规则是「要暗色就整套切」(`known-conflicts.md` C-01),且暗色实测只覆盖 1 个页面(`/team/onboarding`),而该页正是选定套 §〇 明令生成时避开的页;哪一套亮色才是主线**尚未裁决**。⇒ 本轮只做亮色基线(9 页 clipper 实测),⛔ 不与暗色混搭。要做暗色需先裁决 C-01,属技能侧动作。
3. **`--warn` 是本项目追加的第 14 个语义色** —— 选定套亮色基线只有 ok/err,无 warn;而②段 P5 要求「硬的拦住、软的只提醒」必须有可见区分。追加值与其对比度实测记在 §六。
4. **`1c-用户画像.md` 是零访谈画像** —— 主用户的画像骨架来自 1a §四 三行角色描述,无问卷、无访谈、无行为数据。界面里凡涉及「角色能看什么」的判据都基于它,**不得对外说成基于用户调研**。
5. **3c GPT 会诊本轮未取得外部审查** —— 见 `3c-GPT会诊.md`。未取得 ≠ 已通过。
6. **窄视口只测到 500×844,⛔ 没测到 390** —— 本机只有「无头 Chrome + 命令行开关」这一条取证通道,而 Chrome 把窗口宽下限卡在 516px(拿到 500px 视口)。要 390px 得走 CDP 的 `Emulation.setDeviceMetricsOverride`,本轮没接。⇒ 契约里凡写 390 的地方,一律按 **500×844 实测** 记,⛔ 不许写成已测 390。(`_tools/cap.py` 里写了这条例外,改宽度时会打印实际视口,并**当场比对产出的 PNG 像素尺寸**。)
7. **密度判据(一屏 ≥6 行)在 ≤767px 宽不达标,⛔ 没有靠改判据把它变绿** —— 判据原文(`layouts-tooling.md` §1)是「一屏可见行数 ≥ 6(900px 高时)」,**不带宽度条件**,所以本段一个字没改。实测出来的边界是 **768px 宽**:
| 视口 | P1 账号矩阵 | P2 对标列表 | 页面外壳 |
|---|---|---|---|
| 1440 / 1280 ×900 | **10 行** | 7 行 | 顶栏 69px、导航竖排 |
| 1024 / 768 ×900 | **6 行** | 7 行 | 顶栏 69px、导航竖排 |
| 641 ×900 | 5 行 ❌ | 6 行 | 顶栏折两行(109px) |
| 640 ×900 | 5 行 ❌ | 6 行 | 顶栏 61px、导航变横条(53px) |
| 500 ×844 | 4 行 ❌ | 5 行 ❌ | 顶栏折两行(101px)、导航横条 |
成因是**页面外壳吃掉首屏**,不是行变肥:行高 67px、各行差 ≤2px、块内分隔 1px,这三条在任何视口都 PASS。三条出路只能挑一条:①把支持宽度下限写成 ≥768px(依据:`1a §七` 已明确第一版不做移动端 App);②压掉每行的次级信息、把行高压到 40px 上下(那 3 条次级信息是②段定的档位,③段不许改 ⇒ 得回②段改);③动页面外壳(顶栏那几个控件都登记在交互清单里,删或搬家等于改交互清单)。**这三条都要用户拍板,本段一条都没选。** 详见 `3d-审查报告.md` §三 B-15。
8. **截图通道与 DOM 通道的视口口径不同(已修,记账)** —— 同一台机器、同一个 `--window-size`,`--dump-dom` 给的是「窗口 − 16×95」,`--screenshot` 给的就是窗口本身。本轮之前所有截图都因此比标称大 16×95(「1440×900」实际 1456×995)。现已按模式分开算,并要求每次截图后从 PNG 的 IHDR 读真实像素跟目标比,不等即报红。详见 `3b-实测记录.md` §五。
9. **3c 那次独立评审不是「外部 GPT 会诊」** —— 本会话没有对外模型通道,改用了隔离上下文的独立评审执行者(不看源码、不继承制作对话)。它符合 `visual-review.md` 对「隔离执行者」的要求,但与 `SKILL.md` §3c 的异厂商外部审查**不是同一条通道**。**未取得外部审查 ≠ 已通过。** 见 `3c-GPT会诊.md` §〇。
---
## 六、数值取证登记(3d 回填处)
下表「实测值」全部由原型自带的 `#/selftest` 算出来(DOM 取值 + 真实像素计算),⛔ 不是目测。取值口径写在「取法」列;复跑命令见 `3b-实测记录.md`。
| 项 | 契约值 | 实测值 | 取法 |
|---|---|---|---|
| 强调色填充面积占比 | ≤5% | **0.52%**(八页最高一页:创作台;1 个填充块) | DOM 取值:逐个元素比 `backgroundColor` ≡ `--accent`,与视口求交后累加 ÷ 视口面积;不含 3px 左侧标条 / 描边 / 文字色 |
| `--warn` `#8a5a00` 对 `--surface` 对比度 | ≥4.5:1 | **5.93:1** | 真实像素计算:WCAG 相对亮度 |
| `--accent-text` `#963dff` 对 `--surface` 对比度 | ≥4.5:1 | **4.76:1** | 同上 |
| `--ink-faint` `#8a887f` 对 `--surface` 对比度 | ≥3:1(仅非正文) | **3.55:1** | 同上 |
| 一屏可容纳记录行数(P1 账号矩阵) | ≥6 @900px 高(⛔ 原文不分档) | **10 行** @契约视口 1440×900(首行顶 214px、行距 67px) | DOM 取值:首屏可用高度 ÷ 行距。⚠️ 判据是「装得下几行」,不是「实际渲染几行」—— 示意数据只有 5 条,实际永远是 5 行(数据用尽,非被截断)。⛔ 逐视口的完整实测表只写在 §五 第 7 条一处,这里不重复 |
| 一屏可容纳记录行数(P2 对标列表) | ≥6 @900px 高 | **7 行** @1440×900(首行顶 402px) | 同上 |
| P1 行高齐(本段追加判据) | 各行差 ≤2px | **67–68px,差 1px**(七视口一致) | DOM 取值:逐行 `getBoundingClientRect().height` |
| 视觉层间距 / 块内相邻行分隔 比值 | ≥2 | **32px / 1px = 32**(4 个视觉层) | DOM 取值。⚠️ 行式列表的首行没有上边框,取值要跳过首行、取各行的最大值;⚠️ 除数为 0 时判据作废,已加 0 守卫 |
| 实际在用字号档数(P1) | ≥3 | **5 档**:12 / 14 / 16 / 18 / 24 px(相邻差 2/2/2/6) | DOM 取值:叶子节点 computedStyle |
| 块间距 / 块内间距 比值 | ≥2 | **32 / 8–16 ⇒ 2.0–4.0** | 令牌登记值 + DOM 复核(`gap` 全部落在登记刻度内,9 个刻度) |
| 横向溢出 | 0 | **0**(七视口,八页逐页亦为 0) | DOM 取值:`scrollWidth − clientWidth` |
| 浮层中性关闭出口 | 恰好 1 | **7 / 7 个浮层均为 1**(另有决策型关闭 0–1 个,单列报数,⛔ 不混进这个数) | DOM 取值:可见的 `[data-act="X-close"]` 计数 |
| 同屏主档按钮 | ≤1 | **逐页 1 个**;P1 无主档(本页只用弱档) | DOM 取值:逐页统计实底按钮 |
| 顶栏高度(未写死,只看有没有折行) | — | **69px 单行**(补 `white-space:nowrap` 之前是 70px,标签在中间折行) | DOM 取值 |
**同轮实测的其它数值**(一并登记,供 3d 复核):
- P1 账号矩阵:首行顶 214px、行距 67px;块落位 今日待处理@149+360 / 账号矩阵列表@149+417(并排同顶)/ 异常值提示@599+215 / 本月表现最好的一条@845+122 / 全局检索与随手记@1000+113。
- P2:对标监控概览@165+139 / 对标内容列表@336+417 / 评论区洞察@785+108 / 选题库@925+330 / 灵感速记@1287+113;对标列表首行顶 402px。
- P1 按钮高度集合 32px(本页只用弱档一档;三档高度层级在 P4 / P5 出现)。
- 控制台报错 **0 条**;量尺寸时 `scrollY = 0`(两处均核)。
- 强调色填充块数只有 1 个 —— 工具型页面按要求把实底压到最少,主档按钮才用它。
> 契约里写了数字的,3d 已逐条实测回填,「契约值 / 实测值」并排列进 `3d-审查报告.md` §六。⛔ 不目测。
---
## 七、修订记录(收口后回填)
| 轮次 | 改了什么 | 为什么 |
|---|---|---|
| 3a 初版 | 契约、令牌、交互清单、假设标注、Gate-1 自检 | 本份首出 |
| 3d 收口 | ①§1.1 ⑨ 的实测覆盖从 4 个视口改成 7 个;②交互清单补 `CHECKOUT-CANCEL`、`STATE-NORMAL` 按钮文案改「回到正常内容」,并新写「中性出口 / 决策型关闭」的口径说明;③§四 里 P1 并排的反事实数按实测重填(604px→530px、3 行→5 行、209px→214px);④§五 第 7 条整条重写(撤掉自设分档,改成如实登记 ≤767px 的不达标),新增第 8、9 条;⑤§六 表内 8 处旧值按实测回填,并裁掉与 §五 重复的逐视口数 | 收口时逐条实测回填;同时把「同一事实只写一处」落实到密度这项上 |
---
## 八、说人话自评(判据源 `humanizer-zh`,五维各 10 分)
| 维度 | 分 | 说明 |
|---|---|---|
| 直接性 | 9 | 每节开口就是结论或数值,没有铺垫段 |
| 节奏 | 8 | 以表格与短断言为主,句式偏单一 —— ⚠️ 这是本份的弱项 |
| 信任度 | 9 | 不下「已通过」这种模糊话,未清零的直接写未清零 |
| 真实性 | 10 | 通篇是具体数(161px→53px、530px/5 行)、具体文件、具体命令,没有一句万金油 |
| 精炼度 | 9 | 已按「同一事实只写一处」裁过一轮(密度逐视口表只在 §五 第 7 条出现) |
| **总分** | **45 / 50** | 门槛 ≥45,压线过。扣分点如实写在第 2、5 行,⛔ 不报「已过」了事 |
*(本份是原型的绑定规范:原型只许引本份登记的 token。)*
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

@@ -0,0 +1,98 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""无头 Chrome 取证小工具(③段 3b/3d 用)。
--mode dom : 取渲染后的 DOM(自检输出、数值取证都从这里读)
--mode shot : 截图(视口帧或整页长图)
用法示例:
python _tools/cap.py --mode dom --route selftest --out _scratch/selftest.html
python _tools/cap.py --mode shot --route p/p1 --viewport 1440x900 --out _gate_shots/P1-1440.png
⚠️ 本机实测(Chrome 154 · headless=new)——**两条通道对 --window-size 的解释不一样**,
同一台机器、同一个窗口尺寸,拿到的是两个不同视口(探针页实测记录见 3b §五):
--window-size=656,995 ─┬─ --dump-dom ⇒ 视口 640 × 900 (mq<=640 true)
└─ --screenshot ⇒ 视口 656 × 995 (mq<=640 false)
即:dump-dom 通道会从窗口里扣掉滚动条与标题栏(16 / 95),截图通道不扣。
⇒ 想拿到「视口 W × H」,dom 模式要传 (W+16, H+95),shot 模式**原样传 (W, H)**。
⚠️ 视口宽度下限 500(窗口最小 516):`--window-size=390,844` 拿到的仍是 500×844。
要 390px 视口,本机 CLI 做不到(需要 CDP 的 setDeviceMetricsOverride),
所以窄视口只测到 500×844 —— 报告里⛔ 不许写成 390。
"""
import argparse, os, subprocess, sys
from urllib.parse import quote
CHROME = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
HERE = os.path.dirname(os.path.abspath(__file__))
PROTO = os.path.abspath(os.path.join(HERE, "..", "mcn-workbench.html"))
FRAME_W, FRAME_H = 16, 95 # window-size 与视口的实测差值
MIN_VP_W = 500 # 视口宽度下限(Chrome 窗口最小 516)
def url(route, proto=None):
# Windows 盘符路径 -> file:///E:/...
p = (proto or PROTO).replace("\\", "/")
# ⚠️ 路由不带前导 #/ :本机 bash 是 Git Bash(MSYS),会把 "#/xxx" 当成路径改写成
# "#C:/.../PortableGit/xxx"(实测踩过)⇒ 这里由脚本自己拼 "#/"。
h = route.strip().lstrip("#").lstrip("/")
return "file:///" + quote(p, safe="/:") + ("#/" + h if h else "")
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--mode", choices=["dom", "shot"], required=True)
ap.add_argument("--route", default="p/p1/ok", help="例:selftest / p/p4/empty(⛔ 不带 #/)")
ap.add_argument("--hash", default=None, help="兼容旧参数(不带 #/)")
ap.add_argument("--viewport", default="1440x900", help="目标 CSS 视口,例 1440x900 / 500x844")
ap.add_argument("--proto", default=None, help="要渲染的文件(默认本目录的 mcn-workbench.html;变异对照用)")
ap.add_argument("--out", required=True)
ap.add_argument("--budget", default="6000")
a = ap.parse_args()
route = a.hash or a.route
vw, vh = [int(x) for x in a.viewport.lower().replace(",", "x").split("x")]
vw = max(vw, MIN_VP_W)
# 🔴 dom 与 shot 两条通道对 --window-size 的解释不同(见文件头实测):截图通道原样等于视口,
# dump-dom 通道要补回被扣掉的 16 / 95。这里分开算,⛔ 别再用同一个偏移量。
win = ("%d,%d" % (vw + FRAME_W, vh + FRAME_H)) if a.mode == "dom" else ("%d,%d" % (vw, vh))
out = os.path.abspath(a.out)
os.makedirs(os.path.dirname(out), exist_ok=True)
cmd = [CHROME, "--headless=new", "--no-sandbox", "--disable-gpu", "--hide-scrollbars",
"--window-size=" + win, "--virtual-time-budget=" + a.budget,
"--run-all-compositor-stages-before-draw"]
if a.mode == "shot":
cmd += ["--screenshot=" + out]
else:
cmd += ["--dump-dom"]
cmd += [url(route, a.proto)]
r = subprocess.run(cmd, capture_output=True)
if a.mode == "dom":
with open(out, "wb") as f:
f.write(r.stdout)
sys.stderr.write("viewport %dx%d → window %s | dom bytes=%d\n" % (vw, vh, win, len(r.stdout)))
else:
# 🔴 截图出来必须**当面对尺寸**:这条通道曾经因为偏移量算错,把 1456×995 当成
# 「1440×900」交付出去(同一份报告里 dump-dom 又按 640 说话 ⇒ 两份证据互相打架)。
# 现在直接从 PNG 的 IHDR 里读真实像素,跟目标视口比,不等就报红。
if not os.path.exists(out):
sys.stderr.write("shot FAILED\n")
else:
with open(out, "rb") as f:
head = f.read(24)
pw = int.from_bytes(head[16:20], "big")
ph = int.from_bytes(head[20:24], "big")
if (pw, ph) == (vw, vh):
sys.stderr.write("shot ok: %s(视口 %dx%d,PNG 实测 %dx%d ✓)\n" % (out, vw, vh, pw, ph))
else:
sys.stderr.write("shot ⛔ 尺寸不符:目标视口 %dx%d,PNG 实际 %dx%d ⇒ 别拿它当 %dx%d 的证据\n"
% (vw, vh, pw, ph, vw, vh))
err = r.stderr.decode("utf-8", "replace")
if "ERROR" in err.upper():
sys.stderr.write(err[-1500:] + "\n")
if __name__ == "__main__":
main()
@@ -0,0 +1,93 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""骨架单一可信源闸门:`prd/2b-界面布局.md` §二 ↔ 原型里的 FROZEN 表。
为什么单拎出来:页面里的自检只能证明「渲染出来的板块 == FROZEN 表」,
证明不了「FROZEN 表 == ②段原文」。两张表各改一边就没人发现,所以这条闸门
直接把②段那份 Markdown 当权威读,逐页逐位比。
判据:板块**数量**必须相等,**顺序**必须相等,名字**互为前缀**(②段的名字带
「(可点入)」这类注解,不是给界面抄的标题,⛔ 不逐字比)。
用法:python _tools/check_skeleton.py
"""
import argparse
import os, re, sys
HERE = os.path.dirname(os.path.abspath(__file__))
UI = os.path.abspath(os.path.join(HERE, ".."))
GOAL = os.path.abspath(os.path.join(UI, ".."))
DOC = os.path.join(GOAL, "prd", "2b-界面布局.md")
PROTO = os.path.join(UI, "mcn-workbench.html")
Z2 = "\u3000\u3000" # 全角空格:注释切到右边界用
def from_doc(path=None):
s = open(path or DOC, encoding="utf-8").read()
if "## 二、八页骨架" not in s or "## 三、页面流转" not in s:
raise SystemExit("⛔ 读不到②段的 §二 八页骨架 —— 文件被改结构了?")
seg = s[s.index("## 二、八页骨架"):s.index("## 三、页面流转")]
out, cur = {}, None
for line in seg.split("\n"):
m = re.match(r"^### (P\d) ", line)
if m:
cur = m.group(1).lower()
out[cur] = []
continue
m2 = re.match(r"^\s*(\d+)\.\s*(.+)$", line)
if cur and m2:
out[cur].append(m2.group(2).split("——")[0].strip())
return out
def from_proto(path=None):
s = open(path or PROTO, encoding="utf-8").read()
m = re.search(r"^const FROZEN=\{(.*?)^\};", s, re.S | re.M)
if not m:
raise SystemExit("⛔ 原型里找不到 const FROZEN 表")
out = {}
# ⚠️ 逗号必须可选:表里最后一项后面没有逗号 —— 早前写成必选,p8 被静默漏掉
# (表现为「页面集合不同」,不是静默通过,但那也是漏;已修)
for k, body in re.findall(r"^\s*(p\d):\[(.*?)\],?\s*$", m.group(1), re.M):
items = re.findall(r"'([^']*)'", body)
out[k] = items[1:] # 第 0 项是页面标题
if len(out) != 8:
raise SystemExit("⛔ FROZEN 表只解析出 %d 页(应为 8):%s" % (len(out), sorted(out)))
return out
def norm(x):
return x.split("(")[0].strip()
def main():
ap = argparse.ArgumentParser(description="骨架单一可信源闸门(②段原文 ↔ 原型 FROZEN 表)")
ap.add_argument("--doc", default=None, help="②段界面布局文档(默认 prd/2b-界面布局.md)")
ap.add_argument("--proto", default=None, help="原型 HTML(默认 ui/mcn-workbench.html)")
a = ap.parse_args()
doc, proto = from_doc(a.doc), from_proto(a.proto)
bad = []
if set(doc) != set(proto):
bad.append("页面集合不同:②段 %s / 原型 %s" % (sorted(doc), sorted(proto)))
for p in sorted(set(doc) & set(proto)):
a, b = doc[p], proto[p]
if len(a) != len(b):
bad.append("%s 板块数 ②段 %d ≠ 原型 %d(②段 %s / 原型 %s)" % (p, len(a), len(b), a, b))
continue
for i, (x, y) in enumerate(zip(a, b)):
nx, ny = norm(x), norm(y)
if not (nx.startswith(ny) or ny.startswith(nx)):
bad.append("%s 第 %d 块 ②段「%s」≠ 原型「%s」" % (p, i + 1, x, y))
n = sum(len(v) for v in doc.values())
if bad:
print("FAIL 骨架与②段不一致(②段 %d 个板块):" % n)
for x in bad:
print(" · " + x)
return 1
print("PASS 骨架冻结:八页 %d 个板块,②段 2b-界面布局.md §二 与原型 FROZEN 表逐页逐位一致" % n)
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,174 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""变异对照:证明自检的判据不是「恒绿」。
做法:把原型复制一份,往里注入一处**已知的假病**,再跑一次自检,
要求它必须报红,并且红在**预期的那一条**上。测完即删临时件。
为什么要这个:一个永远 PASS 的自检等于没有自检。只有「注病 → 报红 → 复原 → 回绿」
这条链走通了,前面那串 PASS 才算证据。
用法:python _tools/mutate_test.py
"""
import os, re, subprocess, sys, tempfile, html
HERE = os.path.dirname(os.path.abspath(__file__))
UI = os.path.abspath(os.path.join(HERE, ".."))
PROTO = os.path.join(UI, "mcn-workbench.html")
PY = sys.executable
# (名称, 说明, 查找串, 替换串, 期望出现的报红片段, 视口[可选,默认 1440x900])
MUTANTS = [
("M1 死控件",
"把 P2-01「低粉爆款」的实现掏空 —— 点它不再有任何反馈",
"'P2-01':()=>{ S.benchFilter='低粉爆款'; paint(); },",
"'P2-01':()=>{},",
"P2-01"),
("M2 未登记的可点元素",
"在页面上塞一个没写进交互清单的 data-act",
"<span class=\"action-cell\"><button class=\"btn btn-sm\" data-act=\"P2-03\"",
"<span class=\"action-cell\"><button class=\"btn btn-sm\" data-act=\"ZZ-99\">野按钮</button><button class=\"btn btn-sm\" data-act=\"P2-03\"",
"未登记的 data-act"),
("M3 悬空声明",
"清单里声明了一个页面上根本不存在的 ID",
"'CHECKOUT-OK':()=>{",
"'ZZ-98':()=>{},\n 'CHECKOUT-OK':()=>{",
"声明了但页面里没有"),
("M4 骨架漂移",
"给 P3 多塞一个板块 —— ②段那份骨架是冻结的,这属于越界",
"${head('分区切换',",
"${head('多出来的板块', '')}<div class=\"panel\"><p class=\"meta\">越界加的块</p></div>${head('分区切换',",
"骨架与②段不一致"),
("M5 对比度越界",
"把 --ink-faint 换成偏白的灰,压到契约线以下",
"--t-ink-faint:#8a887f;",
"--t-ink-faint:#c9c7c0;",
"对比度 --ink-faint"),
("M6 点击无反馈(跳页不同步)",
"把 go() 退回「只改 hash」的写法 —— 点完状态不动,自检应判它没反应",
" S.route=page; S.pageState=st||'ok'; S.layer=null;\n const want='#/p/'+page+'/'+(st||'ok');\n if(location.hash!==want){ try{ location.hash=want; }catch(e){} }\n paint();",
" const want='#/p/'+page+'/'+(st||'ok');\n if(location.hash!==want){ try{ location.hash=want; }catch(e){} }",
"驱动了没反应"),
("M7 行高不齐(放开换行)",
"删掉「行内每段不许换行」这条规则 —— 窄视口里文字一折行,行高就随文字长短乱跳",
".list-row:not(.is-dense) .primary-cell > *,\n"
".list-row:not(.is-dense) .secondary-cell > *{\n"
" min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\n}",
"/* 变异:去掉不许换行 */",
"行高不齐", "768x900"),
("M8 密度退化(内衬变肥)",
"把列表行内衬从 12px 加到 36px —— 行变肥,一屏就装不下 6 行了",
" padding:var(--mg-12) var(--mg-8); border:0; border-top:1px solid var(--line-soft);",
" padding:36px var(--mg-8); border:0; border-top:1px solid var(--line-soft);",
"低于契约 6 行"),
("M9 量尺寸时页面不在零点",
"量 P1 之前先把页面滚下去 —— rect 取到的是相对视口的坐标,滚了之后 top 全变负,"
"「一屏装得下几行」的减法就会凭空变大(这条守卫盯的就是它)",
" guardScroll('P1');",
" window.scrollTo(0,300);\n guardScroll('P1');",
"被滚到", "768x900"),
("M10 行分隔线被关掉",
"把选择器退回成 `.list-row:first-child` —— 每行都包在 <li> 里,于是每行都是自己 <li> 的 "
"first-child,整张表的分隔线一起消失(原型里修掉过的真缺陷,原样退回)",
"li:first-child > .list-row{ border-top:0; }",
".list-row:first-child{ border-top:0; }",
"行分隔线根本没画出来"),
("M11 浮层没有遮罩",
"去掉遮罩层 —— 「点层外空白关掉浮层」这条通道就没了",
"const lh=layerHTML();\n $('#layer-root').innerHTML = lh ? `<div class=\"layer-mask\" data-act=\"X-mask\" aria-hidden=\"true\"></div>`+lh : '';",
"const lh=layerHTML();\n $('#layer-root').innerHTML = lh;",
"没有遮罩"),
("M12 关掉浮层后焦点不还回去",
"把 closeLayer 退回「只清状态」的写法 —— 焦点会掉回 body,键盘用户就断了",
" const back=layerTrigger;\n S.layer=null; paint();\n if(back){ const el=document.querySelector('[data-act=\"'+back+'\"]'); if(el) el.focus(); }",
" S.layer=null; paint();",
"关掉后焦点没回到"),
("M13 浮层多出一个中性关闭出口",
"给「随手记」再加一颗 ×(多一个 X-close)—— 一个层两个中性出口会让用户找不着北,"
"这条判据原先只数 .layer-close 类名,多出来的是同类,应当报红",
" const close=`<button class=\"layer-close\" data-act=\"X-close\" aria-label=\"关闭\">×</button>`;",
" const close=`<button class=\"layer-close\" data-act=\"X-close\" aria-label=\"关闭\">×</button><button class=\"layer-close\" data-act=\"X-close\" aria-label=\"再关一次\">×</button>`;",
"中性关闭出口 = 2"),
]
def read_out(dom_path):
s = open(dom_path, encoding="utf-8", errors="replace").read()
m = re.search(r'<div class="st-out" id="selftest-out">(.*?)</div>', s, re.S)
if not m:
return None
return html.unescape(re.sub(r"<[^>]+>", "", m.group(1)))
def run(proto, vp="1440x900"):
out = os.path.join(tempfile.gettempdir(), "mut-selftest.html")
r = subprocess.run([PY, os.path.join(HERE, "cap.py"), "--mode", "dom", "--route", "selftest",
"--viewport", vp, "--proto", proto, "--out", out],
capture_output=True, text=True)
if not os.path.exists(out):
return None
return read_out(out)
def headline(text):
m = re.search(r"自检结果:PASS (\d+) / FAIL (\d+)", text or "")
return (int(m.group(1)), int(m.group(2))) if m else None
def main():
src = open(PROTO, encoding="utf-8").read()
base = run(PROTO)
hb = headline(base)
print("基线(未注入):PASS %s / FAIL %s" % hb if hb else "基线读不到自检输出")
if not hb or hb[1] != 0:
print("⛔ 基线就不是全绿 ⇒ 先修原型,别急着做变异对照。")
return 2
bad = 0
for row in MUTANTS:
name, why, find, repl, expect = row[:5]
vp = row[5] if len(row) > 5 else "1440x900"
if find not in src:
print("⚠️ %s:找不到注入点,跳过(注入点失效本身也要修)" % name)
bad += 1
continue
tmp = os.path.join(tempfile.gettempdir(), "mut-proto.html")
with open(tmp, "w", encoding="utf-8") as f:
f.write(src.replace(find, repl, 1))
text = run(tmp, vp)
h = headline(text)
os.remove(tmp)
if not h:
print("❌ %s:注入后自检跑不出来(连输出都没有)" % name)
bad += 1
continue
caught = h[1] > 0 and expect in (text or "")
print("%s %s:注入(%s) ⇒ PASS %d / FAIL %d | %s" %
("✅" if caught else "❌", name, why, h[0], h[1],
"报红且红在预期处(%s,视口 %s)" % (expect, vp) if caught
else "**没在预期处报红(期望含「%s」,视口 %s)**" % (expect, vp)))
if not caught:
bad += 1
print()
print("变异对照:%d / %d 通过" % (len(MUTANTS) - bad, len(MUTANTS)))
if bad == 0:
print("⇒ %d 处假病全部被自检抓住,且基线回绿:这套判据不是恒绿的。" % len(MUTANTS))
return 0 if bad == 0 else 1
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,237 @@
# 目标执行状态 · 根据 1a 需求文档生成 MCN 短视频整合营销工作台的产品界面
> 目标目录:`执行会话/目标-根据1a需求文档生成MCN短视频整合营销-d85687/`
> 台账(唯一权威):`tmp/supervise-inbox/tasks.json` | 目标:`tmp/supervise-inbox/goal.json`
> 本份由任务会话 `[执行]-[开源项目调研]-补齐MCN工作台①②段产出` 写于 2026-10-08 02:4x。
> 🔴 **第二棒续写**:任务会话 `[执行]-[开源项目调研]-MCN工作台③段界面交互` 于 2026-10-08 04:xx 追加 §十(③段界面交互)。**§一~§九 属上一棒,一字未动。**
---
## 一、本棒做了什么(一句话)
**把 MCN 短视频整合营销工作台项目的①②段产出补齐并落本目标目录。** ③段界面**本轮未做**(用户口径逐字:「应该要先完成 1 2步 在进行第3步」)。
先按 `stage-discovery/SKILL.md` 判了①段五份里哪几份已就位,再按 `stage-requirements/SKILL.md` 产出②段两份。
---
## 二、本轮落盘的文件(7 份,全在本目标目录内)
| # | 文件 | 段 | 字节 | 本轮动作 |
|---|---|---|---|---|
| 1 | `research/1a-需求文档.md` | ①段 | 24 317 | **逐字复制件** + 一段落本目录说明。原件内容未改一字。 |
| 2 | `research/1b-竞品分析.md` | ①段 | 7 899 | **新写**:跨项目引用登记(不重写分析本体) |
| 3 | `research/1c-用户画像.md` | ①段 | 16 234 | **新写**:3 个画像 |
| 4 | `research/1d-产品策略.md` | ①段 | 17 660 | **新写**:九节画布 + 5 条关键假设 |
| 5 | `research/1e-使用场景.md` | ①段 | 15 881 | **新写**:八条用户故事 |
| 6 | `prd/2a-产品功能.md` | ②段 | 25 958 | **新写**:14 条功能 + 不做清单对照 + 六项治理 |
| 7 | `prd/2b-界面布局.md` | ②段 | 15 036 | **新写**:八页骨架 |
合计约 123 KB。
---
## 三、①段五份的就位判定(判据:`stage-discovery/SKILL.md`)
| 子步 | 判定 | 依据 |
|---|---|---|
| 1a 需求文档 | ✅ 已就位(**汇总型**,非 grill 澄清产出) | `…-72111e/1a-需求文档-MCN短视频整合营销.md`,2026-10-07 22:29。已复制进本目录。 |
| 1b 竞品分析 | ✅ 已就位,**跨项目** | 分析本体在 `…-5199a6/docs/pm/content-workbench/`。⛔ 未重写,只写了引用登记。 |
| 1c 用户画像 | 🔴 缺 → **本轮补齐** | 1a §四 只有三行角色描述,不是画像。本轮按 `user-personas.md` 成文。 |
| 1d 产品策略 | 🔴 缺 → **本轮补齐** | 1a 完全没有策略段。本轮按 `product-strategy.md` 九节成文。 |
| 1e 使用场景 | 🔴 缺 → **本轮补齐** | 1a §五 是汇总草案,不是用户故事体。本轮按 `usage-scenario.md` 重写。 |
⭐ **没有把 1a 的草案原样复制成三份充数** —— 1c/1d/1e 各按自己的方法论写,三份的章节结构互不相同,且都补了 1a 没有的东西(1c 的六要素画像与用研缺口、1d 的九节画布与关键假设、1e 的四槽位核对与替代方案检验)。
---
## 四、②段两份的就位判定(判据:`stage-requirements/SKILL.md`)
| 子步 | 判定 | 五样/六字段是否给全 |
|---|---|---|
| 2a 产品功能 | ✅ 本轮产出 | 14 条功能,每条六字段(功能名 / 来自哪条场景 / 优先级 / 状态流转 / 验收要点 / 跨哪些页面)齐全;六项治理逐条落在功能条目内;F1–F14 全部追得回 1e 的某条场景 |
| 2b 界面布局 | ✅ 本轮产出 | 五样给全:页面清单(8 页)|页面流转|每页板块与排列|每页主操作|每条信息分档(含判据回答);另加页型一句(判为**工具型页面**) |
🔴 **上一棒③段要照它做界面,所以骨架真定下来了**:八页 = P1 矩阵总览|P2 选题雷达|P3 资产库|P4 创作台|P5 发布中心|P6 账号画像|P7 复盘台|P8 记录与对账。一级导航三组取自 `1a` §八 的三个入口(找选题 / 走创作流水线 / 看矩阵复盘),P6 跨组。骨架带冻结声明:③段不许新增、移动、删除板块。
---
## 五、本轮按用户要求做的三件特别动作
1. **1a 的 9 条待复核与 A1–A4 假设,一条都没当事实用。** `2a` §三 逐条列了「哪条功能依赖哪条假设、不成立会怎样」(9 行),并按方法论给了假设三归宿:**9 条全落「待实现且已排定确认时机」**,确认时机统一为「②段收口时由主会话转用户一次性过;未过之前③段不得当硬约束用」。「已确认」与「已按假设落地」两档**均为 0 条**。
2. **文首写了「上游状态」。** `2a` §〇 给了逐项状态:1a 已就位(汇总型)|1b 跨项目已就位|1a 里指向 1b 系列的条目**复核已完成**(9 条里 2 改 7 不改)|1a 的 9 条待复核与 A1–A4 **仍未复核**。凡引用 1b 处标了证据等级(源码级 / 界面级只有 Easel / 文档级只有文到 AI)。
3. **凡依赖假设的条目逐条标出**(见第 1 条),且 `2b` §四 单独标了**两处骨架受限**:P1 的形态挂在待复核第 5 条、P8 的第 4 板块挂在待复核第 6 条与 A3。两处都带齐了复核人 / 复核时机 / 结论落点。
---
## 六、说人话自评(方法论要求,门槛 ≥45/50)
七份**全部逐份自评**,判据源 `E:/ProgramData/.workbuddy/skills/humanizer-zh`(五维各 10 分,总分 50):
| 文件 | 自评 |
|---|---|
| 1a(复制件,含新增说明段) | 46/50(沿用原件自评;新增段并入核) |
| 1b 引用登记 | 47/50(直接性 10 / 节奏 9 / 信任度 10 / 真实性 9 / 精炼度 9) |
| 1c 用户画像 | 46/50(9 / 9 / 10 / 9 / 9) |
| 1d 产品策略 | 46/50(9 / 9 / 10 / 9 / 9) |
| 1e 使用场景 | 47/50(10 / 9 / 10 / 9 / 9) |
| 2a 产品功能 | 46/50(9 / 9 / 10 / 9 / 9) |
| 2b 界面布局 | 46/50(9 / 9 / 10 / 9 / 9) |
⛔ 不是只报「已过」。逐份的分数与五维拆解写在每份文件的末行。
---
## 七、还缺什么(照实列,⛔ 不补编)
### A. 机制侧两条(本轮无权处置)
1. **`goal.json.execution_doc` 仍指旧目标目录**(`…-5199a6/目标执行状态.md`,登记于 2026-10-07 17:00)。修法是跑一次 `collabd.py --ensure-goal-dir`,**只能 main 席位跑**(本区 `collabd-state.json` 的 `roles` 为空,跑它会把检查会话登记成主会话)。前 6 棒已提,本轮复核仍成立。
2. **本目标连棒空跑**:本目标已连建 14 棒检查会话,第 8–14 棒结论相同。本轮的①②段补齐是**新内容**,与那 14 棒不同,但机制上收口办法(收窄连棒阈值 / 由用户结束目标)仍**须用户定**。
### B. 域外落地(本轮写不了)
3. **`docs/pm/mcn-shortvideo-agent/{research,prd}/` 的正式归档**:路径在**域外**,本轮按派活原文⛔ 未写。本轮产物全在本目标目录内。**等主会话收口后统一搬。**
4. **`docs/pm/mcn-shortvideo-agent/research/1a-需求文档.md` 是旧版**(上游状态行停在「正在重写、9 条待复核」),与本目录这份内容不同。**若裁定应以本目录这份覆盖,需主会话(域外)执行一步覆盖。**
### C. 内容侧的悬空项(要用户拍板,本轮已全部标出,未编答案)
5. **投放这段没有场景**。`1a` 待复核第 8 条问的就是「整合营销到底含不含投放」。`1e` §六 明写了三种处理,⛔ 未代写 S9。这一条不定,`1c` 的画像三只有半个人,`2a` 也没有对应功能。
6. **机构负责人这个角色在 1a 里悬空**(§五 S7 用了,§四 没列)。已记入 `1c` §五 与 `1e` §二。
7. **`1c` 是零访谈画像**(无问卷、无访谈、无行为数据),骨架全部来自 `1a` §四 的三行角色描述。已在 `1c` 文首与 §五 明说,⛔ 不许对外说成「基于用户调研」。
8. **1d 的 §7 增长与 §9 护城河写不下去**,卡在待复核第 9 条(单机构自用 vs 可交付产品)。已给两套读法+回收三字段,⛔ 未替用户拍板。
### D. 与目标 `acceptance_state` 的关系(本轮未改它)
`goal.json.acceptance_state` 的 5 条**全是③段判据**(设计契约与令牌表、原型 HTML、tiaoyue 与 oil-ui-pro、页面骨架来源、产物落点),标的都是「未过」。本轮做的是①②段,**不在这 5 条判据的范围内**,所以本轮**没有改动 `acceptance_state`**,也**没有动 `lifecycle`**(保持「进行中」)。
⚠️ 有一处要主会话注意:那 5 条里有一条是「**页面骨架来源已写明(②段缺失时标假设)**」—— 本轮把②段的 `2b-界面布局.md` 补齐了,**这条判据的「②段缺失」前提已不成立**,③段可以直接按 `2b` 的八页骨架做,不必再标假设。这一条判据的措辞可能要主会话顺手调一下。
---
## 八、一处输入侧更正(供机制记账)
派活原文指定的竞品分析路径是 `docs/pm/content-workbench/research/1b-竞品分析.md`。**这个路径在本工作区不存在** —— 实测 `docs/pm/` 下只有 `mcn-shortvideo-agent/research/1a-需求文档.md` 一份。
1b 的真落点在 `执行会话/目标-调研5个开源内容工作台项目并生成分析文档-5199a6/docs/pm/content-workbench/`(research 汇总体 + 证据附卷 5 份独立体 + 取证 约 210 件)。已在 `research/1b-竞品分析.md` §一 写清真路径。
---
## 九、下一棒该做什么
**等主会话收口**:①段五份齐、②段两份齐,③段界面可以开工(照 `prd/2b-界面布局.md` 的八页骨架)。③段在本目标 `acceptance_state` 里有 5 条判据,与①②段不重叠。
本轮产物是**新内容**,`--report --state done` 已带上 artifact 路径,检查会话可照它读。
**两处要在③段动工前定**(都在 `2b` §四):P1 是否降为单账号今日(待复核第 5 条);P8 是否含商单对账(待复核第 6 条 + A3)。
---
*本份是本目标目录的执行状态文档,供下一个检查会话与任务会话接续。产物的判据源与自评分数在各份文件自身,本份不重抄。*
---
---
# 十、③段(界面交互)本轮记录(第二棒追加,2026-10-08)
> 写于:任务会话 `[执行]-[开源项目调研]-MCN工作台③段界面交互`
> 域锁:已持 `E:/ProgramData/AIProject/content_marketing_agent/执行会话`(与其它工作区无交集)
> 判据源:`stage-delivery/SKILL.md`(含 §供给 / Gate-1/2/3)+ 同目录 `references/execution-runbook.md`、`references/layouts-tooling.md`
## 10.1 本棒做了什么(一句话)
**把 MCN 工作台的③段「界面交互」整段做完并收口:3a 视觉规范 → 3b 可点通原型 + 实测 → 3c 独立评审 → 3d 审查与打磨。** 全部产物落本目标目录 `ui/` 内,⛔ 未写域外 `docs/pm/`。
## 10.2 本轮落盘的文件(全在 `ui/` 内)
| # | 文件 | 子步 | 说明 |
|---|---|---|---|
| 1 | `ui/DESIGN.md` | 3a | 设计契约十二字段 + 三层令牌表 + 6×8 状态覆盖 + 交互清单(唯一交互真相源)+ 两处假设显式标注 + Gate-1 自检 + 缺口与证据边界 + 数值取证登记 |
| 2 | `ui/mcn-workbench.html` | 3b | 单文件自包含原型:八页 + 七浮层 + 六态,双击可开,自带 `#/selftest` 自检台 |
| 3 | `ui/3b-实测记录.md` | 3b | 自检 81 项全文、变异对照 13/13、骨架闸门、多视口密度、**15 条真缺陷的现象/根因/证据**、偏离单 |
| 4 | `ui/3c-GPT会诊.md` | 3c | 通道说明、提问原文(含附件清单)、回答原文照录、22 条四列处置表 |
| 5 | `ui/3d-审查报告.md` | 3d | 固定七节(范围/挡位/阻断项/建议项/状态覆盖核对/结构核对/Gate 结论)+ 偏离单 + 收口清单 |
| 6 | `ui/_tools/` | 3b/3d | 三个可复跑脚本:`cap.py`(取证)、`mutate_test.py`(变异对照)、`check_skeleton.py`(骨架冻结闸门) |
| 7 | `ui/_gate_shots/` | 3d | **23 张视口帧**,每张都经 PNG 像素尺寸比对(⛔ 不是「标称尺寸」) |
## 10.3 ③段的 5 条验收判据(`goal.json.acceptance_state`)逐条结论
| # | 判据 | 结论 | 依据 |
|---|---|---|---|
| ① | 设计契约与令牌表已落 `DESIGN.md` | ✅ **过** | `ui/DESIGN.md` §一 十二字段全填、§二 三层令牌表全为具体值;Gate-1 十项自检结果写在 §四 |
| ② | 原型 HTML 已交付且可点通 | ✅ **过** | `ui/mcn-workbench.html` 单文件自包含;自检在 22 个真实场景里逐个驱动 **71 个 ID**,**0 个死控件**;六态 × 八页 48 组合全渲染;七浮层逐个过「出口/焦点锁/Esc/遮罩/焦点归还」 |
| ③ | 用了 tiaoyue 设计系统与 oil-ui-pro 方法且来源写清 | ✅ **过** | `DESIGN.md` §〇 供给核对:方法主线 `oil-ui-pro`、定调与令牌取 §供给·定调与令牌 指定的 `design-system-tiaoyue`(色值/圆角/间距/组件逐项标了套内出处);可选档 `assets/open-design/` **未动用**,已在 §五 第 1 条明示四项工艺判据本次无供给来源 |
| ④ | 页面骨架来源已写明 | ✅ **过** | 照②段 `prd/2b-界面布局.md` 的八页 37 板块做;另有**机检闸门** `check_skeleton.py` 把②段当权威逐页逐位比(正向 PASS,反向变异两条都报红)。判据里「②段缺失时标假设」的前提已不成立 |
| ⑤ | 产物落点明确且可追溯 | ✅ **过** | 全部落 `执行会话/目标-…-d85687/ui/`;脚本可复跑(命令见 `3b-实测记录.md` §一);每个数字都标了取法;⛔ 未写域外路径 |
### 🔴 两处必须先标假设的事(本轮的处理方式)
派活原文点名的两处**尚无用户结论**,本轮按②段 §四 给的默认读法做,并**在 `DESIGN.md` §三 与原型里双向显式标注**:
| 假设 | 默认读法 | 落地方式 |
|---|---|---|
| 假设 1 · **P1 的形态**(挂 1a 待复核第 5 条 + A1) | 按「需要矩阵级视图」做:P1 = 矩阵总览,5 个板块全在 | P1 标题行右侧挂「假设」徽章;顶栏另有「假设 2 项」入口,点开逐条给**复核人 / 复核时机 / 结论落点** |
| 假设 2 · **P8 第 4 板块「商单与收支」**(挂 1a 待复核第 6 条 + A3) | 按「进第一版但属 P2、可整块缺」做:渲染出来但标「可点入 + 假设」,展开后给一句「本块依赖未复核项」 | 同上,P8 该板块标题行右侧挂「假设」徽章 |
⛔ 两处**都没有**当已确认需求写死,也**没有**自己编答案。复核人=主会话转用户、复核时机=②段收口时、结论落点=`prd/2b-界面布局.md` §四。
## 10.4 本轮跑过的门禁(全部可复跑)
```text
自检(#/selftest,原型自带) PASS 81 / FAIL 0 @1440×900(契约视口)
PASS 81 / FAIL 0 @1280×900 / 1024×900 / 768×900
变异对照(mutate_test.py) 13 / 13 通过(基线回绿)
骨架冻结闸门(check_skeleton.py) PASS 八页 37 个板块与②段逐页逐位一致
多视口密度核对 7 个视口,横向溢出全为 0
视口帧 23 张,逐张经 PNG 像素尺寸校验
```
## 10.5 🔴 未清零的一项(要用户拍板,本轮没有替用户选)
**B-15:≤767px 宽时一屏装不满 6 行。** 判据原文(`layouts-tooling.md` §1)是「一屏可见行数 ≥6(900px 高时)」,**不带宽度条件**,所以本轮**一个字没改**。
- 实测:1440/1280 → 10 行;1024/768 → 6 行;**641/640 → 5 行**;**500×844 → 4 行 / 5 行**。
- 成因是**页面外壳吃掉首屏**(≤767px 顶栏折两行 109px;≤640px 导航变横条),**不是行变肥** —— 行高 67px、各行差 ≤2px、块内分隔 1px,任何视口都 PASS。
- 自检在这三个视口上**就是红的**(PASS 80/1 与 PASS 79/2),⛔ 没有靠改判据把它变绿。
- 三条出路**只能挑一条**:①把支持宽度下限写成 ≥768px(依据:`1a §七` 明确第一版不做移动端 App);②压掉每行的次级信息、行高压到 40px 上下(那 3 条次级信息是②段定的档位,③段不许改);③动页面外壳(顶栏控件都登记在交互清单里,等于改交互清单)。
## 10.6 会话侧偏离(必须留痕,⛔ 不许静默)
| # | 原要求 | 实际做法 | 影响 |
|---|---|---|---|
| D1 | 3b 实测走 `browser-harness` | 等价替代:原型自带自检 81 项 + 变异对照 13/13 + 无头 Chrome 23 张视口帧 + 逐条 DOM 取值 | 证据全可复跑,但**没有「真人真点」这一层** |
| D2 | D5 终检要 `390×844` 帧 | 实测到 **500×844**(Chrome 窗口宽下限 516) | 手机帧比要求宽 110px;⛔ 报告一律写 500×844,**不许**写成已测 390 |
| D3 | 对外只留视口帧,长图仅自检 | 未产长图(该通道本机做不到,`--full` 参数已删) | 无 |
| D4 | 3c 要「外部 GPT 会诊」 | 改用**隔离上下文的独立评审执行者**(只看任务与截图,不看源码、不继承制作对话) | 与「异厂商外部审查」不是同一条通道。**未取得外部审查 ≠ 已通过** |
## 10.7 还缺什么人工确认(照实列,⛔ 不补编)
1. **假设 1 / 假设 2 的结论**(P1 形态、P8 第 4 板块)—— 仍无用户结论,本轮只做了默认读法 + 显式标注。
2. **B-15 的三条出路挑一条**(§10.5)。
3. **评审提的「要不要把 P1 账号矩阵列表做成真正的矩阵视图」** —— 属信息呈现变更,超出③段权限,是 `3c` 里最值得往上提的一条(另见 `3d` §四 S-16)。
4. **评审提的「导航计数只给了一半」** —— 改动落点在交互清单 `G-05` 的反馈列,本轮未动。
5. **D1 那条人工走查**:要不要补一次真人真点。
6. ⚠️ 机制侧两条与上一棒相同(`goal.json.execution_doc` 仍指旧目录、连棒空跑),本轮**无权处置**,维持原状。
## 10.8 说人话自评(③段四份,判据源 `humanizer-zh`,五维各 10 分)
| 文件 | 自评 |
|---|---|
| `ui/DESIGN.md` | 45/50(直接性 9 / 节奏 8 / 信任度 9 / 真实性 10 / 精炼度 9) |
| `ui/3b-实测记录.md` | 45/50(9 / 8 / 10 / 9 / 9) |
| `ui/3c-GPT会诊.md` | 45/50(9 / 8 / 10 / 9 / 9) |
| `ui/3d-审查报告.md` | 45/50(9 / 8 / 10 / 9 / 9) |
扣分集中在两处,逐条说明:**节奏**——技术规格以表格与短断言为主,句式偏单一;**精炼度**——为让每条结论都能追溯到判据,`⛔/⚠️` 前缀与括号补注偏密。已按「同一事实只写一处」的原则裁过一轮(例:密度逐视口实测表只在 `DESIGN.md` §五 第 7 条出现一次,§六 只留契约视口值并指回它)。
## 10.9 下一棒该做什么
③段四步已收口,**本目标在 `acceptance_state` 上的 5 条判据本轮全部转「过」**(§10.3)。⚠️ 本轮**没有**动 `goal.json` 的 `lifecycle` 与 `acceptance_state`(按派活原文)—— 这两项由**主会话席位**收口。
**主会话收口时要做的三件事**:
1. 把 `goal.json.acceptance_state` 的 5 条按 §10.3 标「过」,并按判断是否结束目标。
2. 把 `ui/` 下的产物**统一搬到域外正式归档路径** `docs/pm/mcn-shortvideo-agent/`(本轮按派活原文⛔ 未写域外)。
3. 把 §10.7 里那 6 条人工确认项转给用户;其中 **B-15** 与 **假设 1/2** 是硬卡点。
*(本份的 §一~§九 属上一棒①②段,本轮一字未动。)*