Files

77 lines
22 KiB
Markdown
Raw Permalink Normal View History

# content_marketing_agent · 项目长期记忆
> ⚠️ 本工作区**现名 `contentm_agent`**(2026-10-08 定;旧名 `content_marketing_agent`,再早 `agent-product`)。
> 整理纪律:**同一件事只在一处写全**,别处只引;新条目先进当日日志,跨会话有用才上提到这里。
## 一、仓库与位置
- 🔴 **工作区仓**(`E:/ProgramData/AIProject/contentm_agent`):远端 `[email protected]:admin/contentm_agent.git`(Gitea,SSH deploy key **有写权限**),分支 `main`;提交 `df56c2c`(首,1773 文件 / 205 MiB)+ `eee042c`(10-08 22:xx,③段第八轮收口)。提交者身份是**局部**配置 `WorkBuddy <[email protected]>`(全局 git config 未动,可推翻)。`.gitignore` 排运行时噪音(collab 日志/脚本 `.bak*`/`supervise.pid`/`.workbuddy/tmp/`/`tmp/_*.txt`/`**/ui/_scratch/`/`__pycache__/`/`tmp/_bh_shots/`·`_figma_preview/`·`_gpt_dl/`/`.workbuddy/.load-pending`);**参考资料 231M 抽帧素材全量入库**(⛔ 不打折)。
- 🔴 **全局技能仓**(`E:/ProgramData/.workbuddy/skills`)是**独立仓**:远端 `…/admin/workbuddy_skills.git`,分支 `master`(⛔ **无 upstream** ⇒ 必须 `git push origin master` 显式推,`git status -sb` **不显示 ahead**,别拿它判断同步),提交者身份是**全局** `maogeigei <[email protected]>`(与工作区仓的局部身份不同,属正常,⛔ 别"统一")。⚠️ **该仓被多会话并发写、推进以分钟计** ⇒ **任何结论都带时效,用前先 `git log -1` 校准**。此前 9 个"未纳管"目录(AI HOT/draw-ui/dsh-* ×6/oil-motion/skills-security-check)已于 `e03465c` 入库。
- 🔴 **取证通道=「只连不起」**:本机 **9223 上常驻一个独立浏览器实例**,动手前 `netstat -ano | grep ":9223"` 探;在跑就直接连,⛔ 不另起。规则在 `skills/browser-harness/SKILL.md`「🔴 本机(用户明令)」段;`_tools/cap.py` 已走 CDP `Emulation.setDeviceMetricsOverride` 定视口(声明式,390×844 可测)。🔴 **一个页面只开一个标签**(用户令),定义处同上(⛔ 不复述细则)。
- ⚠️ **本机**:裸 `bash` 会落到 WSL(路径被吃)⇒ 一律用 `E:/ProgramData/.workbuddy/binaries/PortableGit/versions/1.2.0/usr/bin/bash.exe`。
- 全局技能根 `E:/ProgramData/.workbuddy/skills/`;本工作区 `.workbuddy/skills/` 只有 `aigc-idea-impression`。
## 二、产品规划四段流水线(MCN 项目 slug `mcn-shortvideo-agent`)
- **四段次序不可跳**:①产品需求(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)→ ②产品功能 → ③界面交互 → ④原型说明文档。用户 2026-10-08 定:「应该要先完成 1 2步 在进行第3步」。
- ①段 1a 落 `docs/pm/mcn-shortvideo-agent/research/1a-需求文档.md`(**汇总型**,不是 grill 产出);1b 在 `content-workbench` 项目下(跨项目引用,⛔ 不重写)。
- **产物落点**:执行期间一律落 `执行会话/目标-<标题前缀>-<sha1(title)[:6]>/`(域门禁+文档合同要求);正式归档 `docs/pm/mcn-shortvideo-agent/{research,prd}/` 由主会话收口后统一搬。
- 🔴 **本区当前目标**(`tmp/supervise-inbox/goal.json`,2026-10-08 23:29 切)=「梳理板块与操作路线,经 GPT 规划后重做②段文档并重生成界面」,类别 `产品规划`。旧目标「根据 1a 需求文档生成 MCN…产品界面」已归档进 `goals/`。
- 🔴 **换目标必须带 `--kpi`** —— 不带 ⇒ 旧验收判据原样留下 ⇒ 新目标一声明就被判「全过」、机制不派活(已踩)。
- 🔴 **换目标还要换 `tmp/supervise-inbox/NEXT.md`** —— 那是执行会话的开工队列,不换 ⇒ 新派出的会话去做旧目标的活。
- 派活排期名 `[执行]-[<goal.topics>]-<具体>`。
- 四步目标(现行队列 `NEXT.md`):①梳理现有板块/功能划分/操作路线 → ②问 GPT 如何规划最合理 → ③重做②段两份(产品功能/界面布局)→ ④重生成界面。⛔ 按序、不跳步、不给改法抢跑。
- ✅ 第①棒已完成(2026-10-08 23:4x):产物 `产品规划/现状梳理-板块·功能·操作路线.md`(**域目录 `产品规划/` 由此建立**)。该稿口径:只摆现状与问题点(A ③段新增层/B 跨页不落地/C 流转归属/D ②③口径不一致/E 已登记未清),⛔ 不给改法。
## 三、③段设计供给(**单一可信源**)
- 🔴 **供给关系只在 `references/stage-delivery/SKILL.md` 的 `## 供给(唯一权威处 · 改供给只改这一块)` 块里定义**(6 行表:方法主线|定调与令牌|版式骨架|工艺数值判据|独立评审协议|多方向比选)。③段其余章节、`references/execution-runbook.md`、`references/layouts-tooling.md`、总入口 `product-planning/SKILL.md` 提到供给**一律引 `§供给·<行名>`**,⛔ 不许复述「谁是默认/路径在哪/装了才有」。**改供给只改那一块**,改完跑闸门。边界:各档**内部**篇目(如可选档 `craft/xxx.md`)属执行细节,留在 runbook 各步里,不算复述。起因:这个事实曾被复述约 40 处,改一次动三份文件 17 处仍漏 13 处。
- 🔴 **默认主线 = `oil-ui-pro`**(方法+独立评审);定调与令牌取③段自带样式库 `assets/design-systems/`(当前 `design-system-tiaoyue`)。**`open-design` 是可选件**(2026-10-08 起由另一会话随③段携带于 `references/stage-delivery/assets/open-design/`,**选了才用**;源 `nexu-io/[email protected]`,Apache-2.0 本地裁剪版,64 MB / 4177 文件)。三份技能文档共 17 处已翻转,并统一读法:凡出现 `open-design/...` 路径一律按段内相对路径 `assets/open-design/...` 读。
- ⚠️ `assets/open-design/` 是**第三方件**,⛔ 不许改其文件内容;署名见其 `ATTRIBUTION.md`。⚠️ 当前**缺 Apache-2.0 的 LICENSE 全文与上游 NOTICE**(2026-10-08 记账)。
- ⚠️ **真缺口**:open-design `craft/` 的 13 份工艺数值判据(反 AI 味/无障碍/表单校验/动效纪律)在**没装 open-design 的工作区无供给来源** ⇒ 明说,⛔ 不编。
- 🔴 **说人话的处置(2026-10-08 用户选 C)**:⛔ **两个技能的内容不整合进 product-planning**,保持按技能名引用(整合会造第二处定义)。分工写在总入口「执行规则」内容准则条:**模式清单取 `humanizer`**(含 `references/patterns.zh.md`,中文产出读它)|**评分与门槛取 `humanizer-zh`** 五维表(**≥45/50**)|冲突以 `humanizer-zh` 为准|⛔ **取不到来源时明写「无判据来源,本项未判」,不许凭感觉放行**。落盘文字一律过说人话并在文末写评分。
## 四、技能包闸门与改包纪律(`product-planning`)
- ⚠️ 闸门 `check_naming.py` **必须带 `--ws`**:`python scripts/check_naming.py --ws "E:/ProgramData/AIProject/contentm_agent"` ⇒ 期望 **通过 2060 | 失败 0 | 提示 27**;⛔ **别给 `--root .`**(那是「技能根」,会把工作区当技能包查、满屏 FAIL)。**改全局技能包前后都要跑它**。
- 🔴 **「单一可信源」门禁**:`check_naming.py` 的 `AUTHORITY` 表登记「会变的事实 → 唯一定义处」,除定义处外任何地方复述即 FAIL。当前 9 条:②③边界(权威=②段 §②—③ 交接口)|停线规则(全包禁写,权威=总入口 §执行规则)|可选档骨架名单(权威=`layouts-tooling.md` 开头)|说人话门槛|对比度数值|契约十二字段展开(权威=runbook §2.1)|②③定案原话|1b 定案原话|grill A/B 节火力点。**改这些事实只改权威处,然后跑闸门。** ⚠️ 写"不复述"时⛔ 别把名单抄进来(我自己踩过)。
- 🔴 `DEAD_PATHS` 检查:`strategy/`、`ux/` 这类已废目录形态若出现在正文的产出/只读/必读位置 ⇒ FAIL;含废止标记(旧/已废/已改名/曾/移进/改为…)的行豁免。
- ⚠️ **改门禁后必须做变异对照**(注一条假病进去,确认报红,再还原)。反面教训:`check_naming.py` 曾因用 stale 变量(`if old in t` 该用 `tt`)导致「旧名提示」**恒不触发**(假绿)。
- ✅ 2026-10-08 第八轮修掉 3 条既有 FAIL:①「停线规则」在 `AUTHORITY` 表里的 `authority` 写成 `None`(自相矛盾且 `SKILL.md` 里没有这条规则)⇒ 已补进「执行规则」;②③ `stage-proto-doc` 与 `usage-scenario` 仍写①段已废的 `strategy/` 路径 ⇒ 已改 `research/1d-产品策略.md` / `research/1e-使用场景.md`。
- 🔴🔴 **改包纪律(技能仓根 `改包纪律.md`,技能仓提交 `0011050`,谁来这个仓干活先读它)**:⛔ **不许整文件覆盖**|落地前**比对时点**|改完**必跑闸门**|收到覆盖性提交先做**结构体检**。+出事后的标准修法。
- 🔴🔴 **事故留痕:全局技能包曾不是最新调整版**(2026-10-08 22:5x 查明):提交 `1d7d31a` 提交信息写「按合并落地」,实际是**整文件覆盖** product-planning 下 7 个文件,新稿编写时点**早于**被覆盖文件的修改时点 ⇒ 必丢中间调整。**硬指标:「单一可信源」类声明 5 处 → 1 处**(丢的是 `stage-delivery/SKILL.md` 的 `## 供给` 整节标题+六行表、`layouts-tooling.md` 开头的名单权威声明、`stage-requirements/SKILL.md` 的②—③交接口声明),**供给口径被翻转**成「open-design = 默认主线」。✅ **2026-10-08 23:0x 已整包回退到 `44d42b0`(技能仓提交 `8fc9a92`)**,闸门回 `2060 | 0 | 27`;那批「说人话」改写另存 `归档/技能包-说人话改写-被覆盖存档-20261008/`(将来只取措辞、⛔ 不取结构改动)。
- 🔴 **闸门 12 条 FAIL 的归因(已坐实)**:由 `1d7d31a`(10-08 22:22,作者 maogeigei)**一步引入**。验证法(可复现):`git archive <版本> product-planning` 抽出来各跑一次闸门 —— `44d42b0` ⇒ 全过、`1d7d31a` ⇒ 失败 12;且 `git diff --stat 44d42b0..HEAD -- product-planning/scripts/check_naming.py` **为空**(判据零改动,排除"判据变严翻旧账")。性质像**回退**:把权威声明整段删掉 ⇒ **权威处一弱化,复述就长回来**。⛔ 修法顺序:**先恢复权威处声明,再清复述**,反了会反复。⛔ 别默认是"自己上次的债"。
- 🔴 **并发覆盖实录与 B 方案补落**:我第八轮在 `stage-delivery/SKILL.md` 供给块的三处被另一会话那轮重写覆盖。用户选 B 方案后由其转告「另一会话已完成」,**核实现场不符**(HEAD 与 mtime 都没动、远端无新提交)⇒ 本会话 22:4x 补落(提交 `46bee95`)。⛔ 判"改动是否还在"一律 `git show HEAD:<文件> | grep`,⛔ 别看 `--stat` 行数。
- ⚠️ 全局技能包被多会话并发写:改前先看 mtime,改后必复跑 `check_naming.py`(该脚本只读、不写盘)。
- 🔴 **③段导航规则已改(第八轮)**:`layouts-tooling.md` **§5.5.2 判据订正** —— 从「栏宽必须 240–280px」改成「**每一项的名字必须常驻可读**(字号 ≥12px 不截断;64px 栏的名字上限 2 个汉字)」,判实质不判手段;**新增 §4.9「导航栏」一档**(两套合规形态:64px 药丸栏 / 240–280px 宽栏;含当前项只改颜色、窄屏整段换形态、⛔ 横滚条不许画滚动轨、图标一处出口、⛔ 不许照组件清单计数反推形态)。
- 🔴 **③段两条元规则(第八轮新增,`layouts-tooling.md` §5.6)**:① 参照物原值与我方令牌刻度冲突时**必须**走三步(量到数值 → 差异列表 → 逐条「学/不学+理由+代价」),⛔ 不许默默"就近落位",「刻意不学」⛔ 不得用于掩盖规则违反;② **自造物料(参照物笔记、临时对照表)⛔ 不得作为判据来源** —— 证据栏只许写「技能原文的文件:小节」「源站/源文件实测读数」「用户原话」。
- 🔴 **③段 Gate-3 新增强制两条(第八轮)**:① **「看过」必须有落盘记录**(`oil-ui-pro` 10 分制评分写进 3d),⛔ 不许用「自检 N 项全绿」顶替;② **人工项必须给机检实现,否则写死「本条无机检」,⛔ 不许在没有取值手段的条目上打 ✅**(起因:`3d` §九 曾把「§5.5 五条逐条过完」记成 `✅ 自检机核`,而那五条当时**零覆盖**)。
## 五、③段原型(`ui/mcn-workbench.html`)硬口径
- 🔴 **外壳高度链三件套**:只写 `html,body{height:100%;overflow:hidden}` ⇒ `.app` 跟着内容长高、`.view` 自己不滚、滚动落回 `<body>`,而 body 是 hidden ⇒ **整页「滚不动」而不是「不滚」**,折叠线以下内容永远拿不到。必须同时写 `.app{height:100vh;grid-template-rows:minmax(0,1fr)}` + `.main{min-height:0;overflow:hidden}` + `.view{flex:1 1 auto;min-height:0;overflow:auto}`。
- 🔴 **判据核滚动必须四个容器都核**:`window` / `html` / `body` / `.view`。只核 `window.scrollY` 会给**假绿**(原型自检曾在 500×844 报「一屏 7 行」,真值不到 1 行)。⇒ 连带:改门禁后**变异注入点也要重指**(M9 原注入 `window.scrollTo`,外壳修完后 window 根本滚不动 ⇒ 假变异,已改成注入 `.view.scrollTop`)。
- 🔴 **顶栏只放两项**:左「MCN 短视频整合营销工作台」+ 右「**随手记**」。⛔ 不许再加。依据:②段 `2b` §286 只把「随手记」定为全局可达(「任意页面一次点击内,F2 是 P0,不能埋在两层下」)⇒ 必须挂全局外壳,其余一律不许挂。
- ⛔ **已删六样,逐样来源**(详查在 `3d` §十):`收起侧栏`(G-11) 与**面包屑**来自**本项目参照物笔记** `ui/布局排版参考-mcn-work-shop.md`(⚠️ 那是**素材,不是规则文件**);`演示·账号`(G-07)/`演示·状态`(G-09) 是造的原型件;顶栏`全局检索`(G-10) 与②段 P1 的页内板块重复(**已改挂到 P1 页内**);`假设 2 项`改挂到「假设」徽章(G-08)。
- 🔴 两条纪律:①**别把「参照物产品的习惯」当需求搬进外壳**;②**撤销一个交互 ID 必须同时删它的 DOM**,否则判据「每个 data-act 都在清单里」报红。
- ⚠️ 连带:顶栏内衬 8px ⇒ **49px、任何宽度不折行**;页面身份靠页头 h1(不再有面包屑);六态由**路由**进入(`#/p/p4/empty`)。
- 🔴 **左侧栏=一层八个功能项**,与②段八页一一对应;**短名一律 2 个字**(总览/选题/资产/创作/发布/画像/复盘/对账)。**形态=64px 药丸浮栏**:栏 64px/内衬 3px/圆角 100px/淡底+1px 淡描边(⛔ 无右边线);项 **56×78 药丸**(圆角 54/内衬 16/段间距 6),**图标 24 在上、2 字短名 12px/500 在下,两者都常驻**;当前项=中性填充 `ink 6%` + 满墨(⛔ 不用品牌紫底);非当前项 `--ink-faint`;hover 只换色。悬停提示的内容是**该页说明**、⛔ 不是名字。⛔ 三处不学:填充字形图标/真浮层/逐项对齐的 162px 说明列。
- 自检判据:`#nav .nav-item` 恰 8 个、`#nav` 直接子元素全是 `.nav-item`(第二层 0 个)、八项逐个点过都落到自己那页。
- ⛔ 历史弯路两条:①写成「只有一层=四个大板块」;②塞八页项但带 240px 宽文字列表。⚠️ **形态一改,自检判据的选择器与变异注入点必须跟着改**(本轮 `.nav-flat`→`.nav-item`,M2/M8 重指),否则判据静默失效变恒绿 —— 假绿已踩过 4 次。
- ⚠️ 教训:改前那版「纯图标栏、名字只走提示」是**照 `library.json` 的计数猜的** —— **计数不是几何,包里没有的事实就回源站量**。
- 🔴 **左右布局**:每页都有一处两栏 `.grid-main-side`(宽比 **1.35fr : .9fr**):左=上下文/列表,右=产出/动作/详情;主数据块仍满宽。`≤900px` 落单列。
- 🔴 **功能入口卡 `.data-card`=三段纵向**(照参照物 `mcn-work-shop` 首页逐值量):图标 22px **独占一行** → 标题 `--fs-18/600`(行高写死 1.35)→ 描述 `--fs-14`(行高 1.35);`gap:6px`、`padding:16px`、`--sh-L1` 阴影;网格 `minmax(200px,1fr)`。**实测卡高 111.19px**。⛔ 三个刻意不学:圆角 12px、`translateY(-2px)` 位移、一个功能一个色。`.sect-nav` **没有小标**。⚠️ 这张卡的高度会转嫁给密度契约(它紧贴「数据统计」下面)—— 当前靠三处收高(卡内衬 12/16、`≤1000px` 隐描述、`≤1024` 顶栏内衬 8px)维持边界。
- 🔴 **学参照物=量到细节,⛔ 不是「知道有这个名字」**(用户点破:「每个组件的样式 高度 ICON 都是需要学习的,比如功能入口,感觉没有学到细节」)。纪律:**学任何组件都要回源站量**(`style.css` 行号 + `app.js` 生成函数),逐项记「参照物原值 / 我方现值 / 学没学 / 为什么」,**「刻意不学」也要写理由**。参照物位置(只读):`E:/ProgramData/AIProject/mcn-short-video/project/短视频脚本创作/V1.0/mcn-work-shop/public/`;量到的值存两处:`ui/布局排版参考-mcn-work-shop.md` §六(摘要)+ `ui/3d-审查报告.md` §十一(全量)。**三条刻意不学**:冷灰蓝品牌色/8 色相图标/圆角 12px 体系。
- 🔴 **密度分界(第八轮 A 方案后)**:P1 账号矩阵 **绿 = 1440/1280/1024/1000/960/920/901/900/840/820/768/700/640/560**;**红只剩 500×844**。做法:`≤1000` 功能入口卡最小宽 `200→160`、`≤820` 统计条最小宽 `132→96`(`auto-fit` 只在真装不下时才缩 ⇒ 宽屏一格未动)+ 移动档藏掉 16px 横向滚动轨。⚠️ 两档阈值已写进 `DESIGN.md` §1.1 ⑨ 断点表(原表 `901–1024` 与 `901–1000` 区间重叠,已校正成六档不重叠)。**遗留未清**:`3d` B-15(500×844 一屏 −1 行)**留档待裁定**,给了 A/B/C 三条路与代价,⛔ 判据一个字没改。旧文档写的「边界 768px」是**假数**,已整表替换。
- 🔴 **改一个组件高度之前,先跑「改前基线」**(改动回退成 `_scratch/base.html`,同一套判据跑满逐视口表)⇒ 才能分清哪条红是自己造成的。⚠️ 几何一改(加图标、改内衬、改网格最小宽),**逐视口密度表必须整表重跑** —— 这个毛病犯过两次(第六轮只量 1440、本轮 640 从 5 行掉到 3 行)。
- 🔴 **第 5 个门禁 `ui/_tools/check_js.py`**:抠 `<script>` 段跑 `node --check` + **多行**扫 script 区内每个 `<!-- … -->` 块里的**反引号**(反引号常在注释续行上,⛔ 单行扫会漏;已做变异对照)。**改原型两条硬坑**:① JS 模板字符串里的 HTML 注释**不许出现反引号** —— 会提前闭合模板字面量,而 `node --check` 整份 html **报不出来**,页面静默白屏/`xxx is not defined`(**踩了 4 次**);② HTML 注释**必须写 `-->`**,写成 `*/` 会吞掉后面整段。⇒ 改完先 `node --check` 再跑自检。
- 🔴 MCN 原型「外部参考版」照搬结论:`3c-GPT参考版.md` 那版 P1 用**满宽表格顺排**,照搬后账号矩阵首行顶 724px ⇒ 一屏只 2 行(契约 ≥6),把行内第二行小字拿掉仍只 4 行 ⇒ **满宽表格与「一屏 ≥6 行」不可兼得**,要兼得得把每格压成一个短值(动②段定的次级信息档位)。已登记、未动。
## 六、本区会话机制
- 🔴 **本区机制:开关 `off`,但常驻仍在跑**(2026-10-08 23:4x 实测订正本节旧说法):`collabctl.py status` 读数=开关 off | **常驻 ✅ 活 pid 40016 · 心跳 2 秒前** | 看板在听 20099 | 保活任务 `collabd-keepalive-contentm_agent` = Ready(旧区名的 `collabd-supervise-agent-product` 等仍是 Disabled)。⇒ **⛔ 别把 off 读成「没在跑」**(开关只挡「自动续命」);有活动目标时不必另起常驻。要真起/真停 ⇒ `collabctl.py on|off --ws E:/ProgramData/AIProject/contentm_agent`。
- 🔴 机制登记**已全部改成现名** `contentm_agent`:`collabd.config.json` 的 `workspace` + `collabctl.py` 的 `WORKSPACES`/`KEEPALIVE_TASKS`(**源 + 3 个区副本共 4 份,改一处要改 4 份**)+ ai1net 的 `peer_workspaces`。旧空壳目录改名 `content_marketing_agent.RETIRED-20261008` 保留(零删除)。⚠️ ai1net 改了 peer ⇒ **看板要重启**才生效(配置模块级只读一次)。
- ⚠️ **`collabctl.py` 的 `off --ws` 曾越区**(`kill_all()` 全机扫描不认 `--ws`,一次杀掉他区+看板共 5 个进程)⇒ 已修:`ONLY_WS` 时只杀本区心跳 pid 并提前 return。⛔ 改这文件记住**源 + 3 区副本**都要改。
- 域锁:域目录=**工作区下的第一层目录**(本次建立的域目录是 `产品规划/`,域键 `contentm_agent/产品规划`);⛔ 别在域目录外套公共父目录(所有子目录会算成同一个域键 ⇒ 域锁失效)。抢锁 `handoff-guard.sh --claim-exec "<会话名>" --domains "<域目录>"`(包在 `skills/session-mechanism/scripts/lock/`);抢不到 ⇒ **停手报告**,⛔ 不许硬写。释放:`--release` → `--release-exec "<会话名>"`。
- ⚠️ **本目标(`…-071c5b`)的产物落点分岔**:目标目录合同(`collabd.artifact_dir_ok`)判「不在目标目录内」,而域门禁要求「只许写域目录」。第①棒取域目录 `产品规划/`(收到软提醒,非拒收);第②棒改取**域目录 `执行会话`**(第一层目录 ⇒ 能盖住目标目录)+ 产物落目标目录 —— 两种都记在案,口径等用户裁定。
- ⚠️ `--report <sid> --state done --artifact "<路径>"` 对**不在目标目录内**的产物会给一条**软提醒**(不是拒收)—— 域门禁要求写域目录时,这是预期行为,如实记下即可。