# contentm_agent · 项目长期记忆 > ⚠️ 本工作区**现名 `contentm_agent`**(2026-10-08 定;旧名 `content_marketing_agent`,再早 `agent-product`)。 > 整理纪律:**同一件事只在一处写全**,别处只引;细则进当日日志,跨会话有用才上提这里。 > 🔴 本文件按 **~9 KB 目标**维护;**实测注入在 19 KB 时开始截断**(2026-10-09 只丢末尾数十字符)⇒ 本版压至 ~14 KB 留余量。**再加内容先删等量旧内容**。 > 压缩史:2026-10-09 压过两次;压前全量存 `MEMORY-压前全量-20261009.md` 与 `MEMORY-压前-20261009-2305.md`。 ## 一、仓与位置 - **工作区仓** `E:/ProgramData/AIProject/contentm_agent`:远端 `git@ssh.alotbuy.com:admin/contentm_agent.git`(Gitea,deploy key **有写权限**),分支 `main`;提交者=**局部** `WorkBuddy `(全局 config 未动,可推翻)。参考资料 231M 抽帧素材**全量入库**;`.gitignore` 排运行时噪音。 - 🔴 **全局技能仓** `E:/ProgramData/.workbuddy/skills` 是**独立仓**:远端 `…/admin/workbuddy_skills.git`,分支 `master`,⛔ **无 upstream** ⇒ 必须 `git push origin master`(`git status -sb` 不显示 ahead);提交者=**全局** `maogeigei`(与工作区仓不同,属正常)。⚠️ 多会话并发写、分钟级推进 ⇒ **用前先 `git log -1` 校准**。 - 🔴 **浏览器=「只连不起」**:本机 **9223 常驻独立 Chrome**(计划任务 `bh-chrome-keepalive` 保活)。动手前 `netstat -ano | grep ":9223"` 探;在跑就直连,⛔ 不另起。🔴 **一个页面只开一个标签**。规则见 `skills/browser-harness/SKILL.md`。 - ⚠️ **本机裸 `bash` 落到 WSL**(路径被吃)⇒ 一律用 `E:/ProgramData/.workbuddy/binaries/PortableGit/versions/1.2.0/usr/bin/bash.exe`。 - 🔴 **本机 curl 取 GitHub**:`raw.githubusercontent.com` **连不通**(`rc=56`)⇒ 走 `api.github.com/repos//contents/`(base64)+ `git/trees/?recursive=1`。公开接口够用,⛔ 不为取数起浏览器。 ## 二、产品规划四段流水线(slug `mcn-shortvideo-agent`) - **四段次序不可跳**:①产品需求(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)→ ②产品功能 → ③界面交互 → ④原型说明文档。①段落 `docs/pm/mcn-shortvideo-agent/research/`(1a 是**汇总型**);1b 在 `content-workbench` 项目下(跨项目引用,⛔ 不重写)。 - **执行期产物落点**:一律落 `执行会话/目标-<标题前缀>-/`;正式归档 `docs/pm/…/{research,prd}/` 由主会话收口后统一搬。 - 🔴 **换目标三件套**:带 `--kpi`(不带 ⇒ 旧验收判据原样留下 ⇒ 新目标一声明就判「全过」)+ 换 `tmp/supervise-inbox/NEXT.md`(执行会话开工队列)+ `--switch-goal`(并同步 `collabd.py --set-life`)。派活排期名 `[执行]-[]-<具体>`。 - 🔴 **功能归属现行判据(2026-10-09 用户令)**:**同一类事情放同一个页面**(找选题/拆解选题/做选题都属「选题相关的事」⇒ 同在选题页)。两条配套口径:**资产入库不限页**(任何页产生资产都可就地入库,**资产库页=统一管理的地方**,⛔ 不是唯一入库口;「一个对象只有一处产生」管的是**唯一权威数据**、⛔ 不是写入动作的地点);**选题库容纳「对选题有帮助的任何信息」**(随手记仍落选题库,⛔ 不新增「待整理」状态,靠分类区分)。 - 🔴 **「复盘」=发布之后看结果**:**看数据 + 看收入**(用户 2026-10-09 22:48 逐字「发布的目的就是为了看数据和看收入啊」)⇒「记录与对账」(发布记录/溯源/对账/商单与收支)**属复盘、是同一类事**,留在复盘页,⛔ 不拆页、⛔ 不加导航项、⛔ 页内不分(GPT 主张拆出去的三条 G7/G10/G22 ⇒ **不采纳**)。 - 🔴 **「账号」是两个概念,现行定义(2026-10-10 用户逐字「内容账号管的是内容属性(主要是账号设定 内容做成什么样),平台账号应该是 发布的渠道三方平台账号 用户发布具体内容」)**:**内容账号**=管**内容属性**(账号设定:定位/风格/受众/偏好红线/长期记忆),**平台不属于它**;**平台账号**=**发布的渠道**(三方平台账号,"发布具体内容"用的就是它),**登录态/授权归它**。⇒「**渠道**」=**平台账号**(⛔ 不再说"账号 × 平台")。**建模(主会话自决、可推翻)**:不加对象,平台账号做成**内容账号下的子项清单**(1 → N,每项带「平台 + 登录态 + 授权状态」)。✅ **2026-10-10 已落地(V4)**:`2b` P6 画像改**五维** + 新增「平台账号」块(框 4→5 块);`2a` `Account` 改「内容账号」+ F7 改名并改「按平台账号展开」、F13 补「一版一路」(`PublishRecord` ⛔ 不加渠道字段)。 - 🔴 **本区当前目标**(2026-10-10 07:57 声明)=「**侧栏改回64px基准形态并刷新按钮改icon**」,类别 `产品规划`,目标目录 `执行会话/目标-把八条已定口径落进②段两份与原型-fa6e07/`。✅ **执行棒 `d7ea834b` 08:2x 交付 done**:`2a`/`2b` 升 **V4**、原型、`ui/DESIGN.md`、`ui/3b-实测记录.md` 全同步。闸门:骨架 PASS(七页 39 块)|自检 78/0|变异 24/24|逐视口 3/16 红(沿用登记项)|命名 2060|0|27。**本轮骨架账**:P2 5→4(灵感速记并进选题库)、P6 4→5(新增平台账号)⇒ 总数仍 39;页数/导航/流转/几何不动。🔴 **第 44 检查棒 09:05 裁定=未完**(缺 `目标执行状态.md`)⇒ 已派棒 `6b520c68`。✅ **补齐棒 `6f6cd256` 09:1x 交付**:五道闸门**现跑**全过(骨架 39 块逐位一致|自检 78·0|变异 24·24|命名 2060·0·27|逐视口 16 档绿 13 红 3=**V3 既有登记项、非本轮引入**)⇒ **三条判据全过、本棒零改动**;`目标执行状态.md` 已补齐,三条结论 `declare --kpi` 写回并回读。✅ **第 45 检查棒 09:34 收口=已完成**(三路取并集:台账 22 条全 done/无 taskgraph 件/三条判据全 `过`)⇒ 重声明 `--kpi` 并回读确认后 `--set-life 已完成`。⚠️ **副作用**:设完成时**常驻程序被优雅退出**(pid 8236)⇒ 下次开新目标要**重新拉起常驻**。⚠️ 两处待订正:机读副本判据写「六维」而②段实际是「**五维+平台账号**」(采信②段);`--kpi` 按分号切 ⇒ 依据里⛔ 不许写 `;`。前一身目标(分析 social-auto-upload,`254f554c`/`0ec0a7`)已于 07:57 换目标时归档。 - 📌 **已收口的旧目标**(细则在当日日志):①「导航改七项一层并重排功能归属(P8 并入复盘)」(`fc471a`,15:48 收口);②「征询 GPT 对当前七页结构与操作路径的建议」(`b49e02`,16:46 收口;GPT 原文 10 562 字符逐字留痕;🔴 **D1 待裁定**=GPT 主张拆「记录与对账」出复盘,与用户拍板方向相反);③ 四步(梳理→GPT→重做②段→重生成界面,`071c5b`,08:14 收口)。 ## 三、②段两份的现行口径(2026-10-09 新版) - 改动主线=按「**业务对象 + 数据流转**」解耦(原来「页面=功能=数据」揉在一起)。八页**不推倒**,改的是归属判据。 - **归属判据**=这个功能主要**创建/改变哪个核心业务对象**(⛔ 不是「哪页有按钮」)。🔴 **11 个对象**=`Account`/`Benchmark`/`Topic`/`Asset`/`Content`/`ContentVersion`/`PublishTask`/`PublishRecord`/`Performance`/`Review`/`Campaign·Order`。F7/F8 收归 **P4**、F14 从 P2 改 **P4**;F11 标「待验证/非主链」、F12 标 `P2/Deferred`。 - **2b 结构**:新增「**页面公共框架(Page Shell)**」层(不计板块数/不参与归属/不占冻结计数);③段自长的「功能入口」层**撤销**;页面 **7 个**(P1 矩阵总览/P2 选题雷达/P3 资产库/P4 创作台/P5 发布中心/P6 账号画像/P7 复盘台),导航**一层七项**(首页/选题/创作/投放/复盘/账号/资产);流转=**六要素契约**(来源/触发/传递对象/对象ID/接收方式/落地状态)共 **20 条**;骨架冻结升级为**对象冻结**。业务板块 **39 块**。 - ②段两条老硬约束:功能**按使用场景组织**(不按页面,2026-10-06 定案)|全段**零视觉词**。 - ⚠️ 计数订正:①棒 §四 A1 写「八页共 38 个板块」,其加总 `5+5+4+6+5+4+6+4` 实为 **39** ⇒ 38 是加总差错。 - 🔴 **P5 投放页现状(`2b` §五)**:5 板块=目标选择/各版本与逐版编辑/检查结果/确认发布/发布记录;主操作=确认发布。F5 硬闸管敏感信息、软闸管人设一致性(⚠️ 竞品里**没有**「敏感词检测」也没有「事实检测」)。 ## 四、技能包闸门与改包纪律(`product-planning`) - ⚠️ 闸门必须带 `--ws`:`python scripts/check_naming.py --ws "E:/ProgramData/AIProject/contentm_agent"` ⇒ 期望 **通过 2060|失败 0|提示 27**;⛔ 别给 `--root .`。**改包前后都要跑**。 - 🔴 **单一可信源门禁**:`AUTHORITY` 表登记「会变的事实 → 唯一定义处」,除定义处外复述即 FAIL(现 9 条)。**改这些事实只改权威处,然后跑闸门**;⛔ 写「不复述」时别把名单抄进来(自己踩过)。 - ⚠️ **改门禁后必须做变异对照**(注一条假病进去确认报红,再还原)。教训:曾因 stale 变量导致「旧名提示」**恒不触发**(假绿)。 - 🔴🔴 **改包纪律**(技能仓根 `改包纪律.md`):⛔ **不许整文件覆盖**|落地前**比对时点**|改完**必跑闸门**|收到覆盖性提交先做**结构体检**。 - 🔴 **事故留痕**:提交 `1d7d31a` 用「整文件覆盖」造出 12 条 FAIL ⇒ 2026-10-08 整包回退到 `44d42b0`(技能仓提交 `8fc9a92`),闸门回 `2060|0|27`;那批「说人话」改写另存 `归档/技能包-说人话改写-被覆盖存档-20261008/`(只取措辞,⛔ 不取结构)。⛔ 修法顺序:**先恢复权威处声明,再清复述**。 - 🔴 **说人话的处置**(2026-10-08 用户选 C):两个技能**不整合进 product-planning**,按技能名引用 —— 模式清单取 `humanizer`|**评分与门槛取 `humanizer-zh` 五维表(≥45/50)**|冲突以 `humanizer-zh` 为准|⛔ 取不到来源时明写「无判据来源,本项未判」。落盘文字一律过说人话并在文末写评分。 ## 五、③段设计供给(单一可信源) - 供给关系**只在** `references/stage-delivery/SKILL.md` 的 `## 供给` 块定义(6 行表);③段其余章节与 runbook/layouts-tooling/总入口提到供给一律引 `§供给·<行名>`,⛔ 不许复述。**改供给只改那一块**,改完跑闸门。 - **默认主线=`oil-ui-pro`**(方法+独立评审);定调与令牌取③段自带 `assets/design-systems/`(当前 `design-system-tiaoyue`);**`open-design`=可选件**(本地裁剪 Apache-2.0,⛔ 不许改其内容;缺 LICENSE 全文与上游 NOTICE)。无 open-design 时 `craft/` 那 13 份工艺数值判据**无供给来源** ⇒ 明说,⛔ 不编。 - ③段细目(导航判据 `§5.5.2`、`§4.9` 导航栏、`§5.6` 两条元规则、Gate-3 两条新增)⇒ 读技能包 `layouts-tooling.md` 与 `execution-runbook.md`,本文件不复制。 ## 六、③段原型 `ui/mcn-workbench.html` - 🔴 **细则不在此复制**:口径与断点表在项目内 `ui/DESIGN.md`,全量实测值在 `ui/3d-审查报告.md`。最易踩三条: 1. **外壳高度链三件套**:`html,body` + `.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` = 假绿)。 2. **改原型两条硬坑**:JS 模板字符串里的 HTML 注释**不许出现反引号**(提前闭合模板字面量 ⇒ 静默白屏,而 `node --check` 报不出;已踩 4 次);HTML 注释**必须写 `-->`**(写成 `*/` 会吞掉后面整段)。改完先 `node --check` 再跑自检。 3. **几何一改,逐视口密度表整表重跑**,且改前先落「改前基线」—— 犯过两次。 - **顶栏只放两项**(左标题 + 右「随手记」),⛔ 不许再加。**左栏=一层八项**、短名**两字**、形态=64px 药丸浮栏。⚠️ **形态一改,自检选择器与变异注入点必须跟着改**,否则判据静默失效变恒绿(假绿已踩 4 次)。 - ⚠️ 教训:改前那版「纯图标栏」是**照 `library.json` 的计数猜的** —— **计数不是几何,包里没有的事实就回源站量**。 - **遗留未清**:`3d` B-15(500×844 一屏 −1 行)留档待裁定;「满宽表格与一屏 ≥6 行不可兼得」已登记未动。 ## 七、本区会话机制 - 🔴 **域锁实体不在本工作区**:`handoff-guard.sh` 的 ROOT 落到**共享锁库 `D:/github/dsh_shenxian/dsh-server-docs/05-交接单/.locks/`**(`DSH_DOCS_ROOT` 覆盖**实测无效**);目录名被转义成 `_____…-`(非 ASCII 逐字变 `_`)。🔴 **释放要按 `OWNER` 里登记的 `ME` 原文**(例:登记的是 `改导航七项一层并P8并入复盘`,**不带** `[执行]-[产品规划]-` 前缀 ⇒ 用全名释放会报「名下无可释放的锁」而**锁其实还挂着**)⇒ 先 `cat <锁目录>/OWNER` 抄准名字。 - **域锁规则**:域目录=**工作区下的第一层目录**;⛔ 别套公共父目录。抢 `handoff-guard.sh --claim-exec "<会话名>" --domains "<域目录>"`(包在 `skills/session-mechanism/scripts/lock/`);抢不到 ⇒ **停手报告**。释放 `--release-exec "<会话名>"`。🔴 **孤儿锁成因**:锁是**磁盘持久物**,会话无论怎么结束**都不释放**它(被宿主终止=`terminated`;**被用户手动关=`completed`**)⇒ 都成孤儿,而域冲突判定**只比会话名、不判死活**。✅ **2026-10-09 已有自动解除工具** `session-mechanism/scripts/lock/orphan-lock.py`(用户逐字授权「可以授权 检查会话自解除孤儿锁」= **R9 唯一例外**)—— 判据查宿主库 `sessions.status`(`working` 不动|`terminated`/`error`/`archived` 可解|`completed` 过时间闸 `--idle-min` 默认 30 分钟|查不到 sid ⇒ fail-closed);先 `--dry-run`。 - ⚠️ **开关 `off` ≠ 没在跑**:`collabctl.py ensure` = 幂等收敛「on⇒补齐缺失/**off⇒全停**」,保活任务周期触发它 ⇒ off 下迟早被收敛停掉。开关语义="挡自动续命"。要真起/真停 ⇒ `collabctl.py on|off --ws …`。 - 🔴 **机制登记已全改现名 `contentm_agent`**:`collabd.config.json` + `collabctl.py` 的 `WORKSPACES`/`KEEPALIVE_TASKS`(**源 + 3 个区副本共 4 份**)+ ai1net 的 `peer_workspaces`(改完**看板要重启**)。旧空壳 `content_marketing_agent.RETIRED-20261008` 保留(零删除)。⚠️ 改这文件记住源+3 副本。 - 🔴 **文档合同**:执行棒产物落 `<目标目录>/`;**sid 取法**=查宿主库 `E:/ProgramData/.workbuddy/workbuddy.db` 的 `sessions` 表(按 `cwd` + `created_at desc`,本区会话 `is_background_automation=1`)。`--report --state done --artifact "<路径>"`:产物**读不到**⇒硬拒收;**落点不在目标目录**只给**软提醒**(不拒收)。 - 🔴🔴 **目标目录名两种口径(已实证 3 次)**:机制=`goal_dir_name()` **`title[:20]` 再去空格**;而**派活单与实际目录一律用全称去空格** ⇒ 上报必带一条「不在目标目录内」软提醒,**属既有分岔、不拒收**(如本目标:机制 `…upload-0ec0a7` vs 实际 `…upload项目,用于投放页与发布对象的判断-0ec0a7`)。⛔ 改名会断台账 `artifact` 引用 ⇒ 未修,待裁定。 - 🔴 **浏览器实例/计划任务**:浏览器保活用计划任务 **`bh-chrome-keepalive`**(动作 `pythonw.exe "E:\ProgramData\.workbuddy\skills\browser-harness\agent-workspace\bh_chrome_keepalive.py" --log "E:\ProgramData\.workbuddy\tmp\_bh_chrome.log"`,幂等:端口在听就退出;每 5 分钟 + `MultipleInstances=IgnoreNew` + `ExecutionTimeLimit=0`)。🔴 **启动器只用技能包内那一份**,⛔ 不再往工作区复制副本(两份会漂移;2026-10-10 已把手写那份的副本收掉)。验证=`netstat` 见 LISTENING + `curl --noproxy '*' http://127.0.0.1:9223/json/version` 回 JSON。⛔ 别用「后台任务」(只活到发起它的会话结束)。⚠️ **建计划任务一律用 `pythonw.exe`**(`python.exe` 是控制台程序 ⇒ 每分钟弹黑窗);`schtasks.exe` 被本机黑名单拦截 ⇒ 走 PowerShell `ScheduledTasks` 模块。完整命令段见 `skills/browser-harness/SKILL.md` §1。