核实目标管理落地情况并纠偏:撤销误建的计划任务(现行规则只许会话后台任务);落点三处收敛到机制口径;对齐 goal.json 的 execution_doc;移除工作区根的浏览器脚本副本;记忆补记教训(注入版可能落后于磁盘版)
This commit is contained in:
1 parent
cbc80e0b2b
commit
5140f8d1f3
5 files changed
+42
-82
No files matched your search
@@ -288,3 +288,29 @@
|
|||||||
- ✅ 已派第 1 棒:`[执行]-[开源项目调研]-逆向Easel热点雷达与选题链路并对照现版P2`,`once` 22:46,`cwds` 逐字本区;域=`contentm_agent/执行会话`(派前 `--domain-status`=**无人持锁** ⇒ ⛔ 未动任何孤儿锁);定位=**调研与方案棒**(⛔ 明令不许改 2a/2b/原型,落地方案只写进文档)。
|
- ✅ 已派第 1 棒:`[执行]-[开源项目调研]-逆向Easel热点雷达与选题链路并对照现版P2`,`once` 22:46,`cwds` 逐字本区;域=`contentm_agent/执行会话`(派前 `--domain-status`=**无人持锁** ⇒ ⛔ 未动任何孤儿锁);定位=**调研与方案棒**(⛔ 明令不许改 2a/2b/原型,落地方案只写进文档)。
|
||||||
- ⚠️ 工具现状沿用两处:工作区根 **`state.py` 不存在**(派活单第 1 项跑不到,报 `can't open file`);`--domain-block 执行会话` 出块正常。
|
- ⚠️ 工具现状沿用两处:工作区根 **`state.py` 不存在**(派活单第 1 项跑不到,报 `can't open file`);`--domain-block 执行会话` 出块正常。
|
||||||
- ⛔ 本棒未改 2a/2b/原型/DESIGN 一个字,也未改 `acceptance_state`(未完成 ⇒ 不写回机读副本)。
|
- ⛔ 本棒未改 2a/2b/原型/DESIGN 一个字,也未改 `acceptance_state`(未完成 ⇒ 不写回机读副本)。
|
||||||
|
|
||||||
|
## 22:55–23:0x · 主会话核实「都纳入目标管理」后现场 ⇒ 揪出并修掉两个真问题
|
||||||
|
|
||||||
|
- **三棒现状**(全部取进程级/文件级证据,⛔ 不凭印象):①Easel 棒 `3f59c890`(`[执行]-[开源项目调研]-…`)**working**,22:46:10 起跑、末活动 22:55:28,主产物 `第1棒_逆向Easel热点雷达与选题链路_2026-10-10.md`(15 456 B)**已落**,另有 `取证/` 12 份原始文件(Easel 的 skills 与 web 源码);②侧栏棒 `95d7e790` `once` **23:12** ACTIVE(未到点);③我建的重复 Easel 排期 `560ba39c` 已 PAUSED ✅。
|
||||||
|
- 🔴🔴 **真问题一:9223 上没有实例**。实测:`chrome_with_debugport=0`(32 个 chrome 进程**全无** `--remote-debugging-port`)、`netstat` 见 9223 **零行**、`Get-ScheduledTask` 里也没有 `bh-chrome-keepalive`。⇒ 这正是「执行会话要开浏览器却每会都错一次」的根:规则说「只连不起」,而**该被连的那个实例早没了**。
|
||||||
|
⚠️⚠️ **我第一反应做错了(本条已如实改过来)**:我照**注入上下文里的旧文案**(「保活=Windows 计划任务 `bh-chrome-keepalive`」)**重建了那个计划任务** —— 而**磁盘版 MEMORY 第 12/69 行写的是现行令**(用户 2026-10-10):「浏览器保活=**本会话后台任务**,⛔ **不建** Windows 计划任务(本机已撤 `bh-chrome-keepalive`)、⛔ **不复制副本到工作区**(启动器只用 `skills/browser-harness/agent-workspace/` 那一份)」。⇒ 已 `Unregister-ScheduledTask`(回读 `still_exists=False`);实例保留(pid 43812 仍 LISTENING,会话可直接连)。
|
||||||
|
✅ **现行起法**(照 `skills/browser-harness/SKILL.md` §1 整段抄,交给**本会话的后台任务**跑):`pythonw.exe "E:/ProgramData/.workbuddy/skills/browser-harness/agent-workspace/bh_chrome_keepalive.py" --log "E:/ProgramData/.workbuddy/tmp/_bh_chrome.log" >> "E:/ProgramData/.workbuddy/tmp/_bh_bg.out" 2>&1`。语义=「会话在、浏览器在;会话收工、浏览器随之下线」。
|
||||||
|
📌🔴 **教训(本轮最值钱的)**:**注入进来的 MEMORY 可能落后于磁盘版**,这次两版**方向相反**(旧=计划任务/新=后台任务)⇒ 我照旧文案动手,等于做了用户明令禁止的事。⇒ **动手改机制、建任务、动浏览器之前,先读磁盘版** `E:/ProgramData/AIProject/contentm_agent/.workbuddy/memory/MEMORY.md` 对时点(注入版只是缓存)。
|
||||||
|
📌 附带解释:`bh-chrome-keepalive` 早先「消失」并非自己丢的 —— 它是**规则反转后被主动撤掉的**。
|
||||||
|
📌 待收尾:工作区根 `bh_chrome_keepalive.py`(2 667 B,10-09 07:38,**已入库**)是旧规则时代的**违规副本**(现行令「⛔ 不复制副本到工作区」)⇒ 本轮已核实**全工作区无代码引用**(只有记忆文件提到),按可逆方式清出仓库。
|
||||||
|
- 🔴 **真问题二:`goal.json.execution_doc` 指着已归档的 Easel 目录**。这字段是**检查会话判断目标状态的唯一依据所指向的路径**,切目标后没人对齐 ⇒ 第 47 棒会拿 Easel 那份状态文档去判新目标。已按机制规则手工复现并改对:`执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/目标执行状态.md`。
|
||||||
|
- 🔴🔴 **落点三处不一致 ⇒ 已收敛到机制口径**。实测三个值各不相同:派活单写 `…左侧导航改回基准形态 64px 图标在上-41c8bd`(**属 22:39 已归档的旧目标**)/我写的 NEXT.md 是标题全称 `…改icon-20a8ac`/**机制口径**(回源码坐实 `goal_dir_name()`:`short or title` → 去非法字符 → **去空格** → **`[:20]`** → 后缀 `sha1(title)[:6]`)= `…改ic-20a8ac`(`侧栏改回64px基准形态并刷新按钮改icon` 共 22 字,**第 21 字起被截掉 ⇒ 尾巴是 `改ic` 不是 `改icon`**)。✅ 已按机制口径**建目录 + 放 `目标执行状态.md` 骨架**,并把 NEXT.md 两处落点一并改成该口径(并写明「派活单里两条旧路径都作废」)。⛔ 未改排期 prompt(重建 4000+ 字符风险大于收益;NEXT.md 是开工第 0 步必读,且派活单自称「以实际建出来的为准」)。
|
||||||
|
- ⚠️ **22:38 未触发的推断(未坐实,待观察)**:排期 `95d7e790` 原设 `22:38` 而其创建时刻已晚于该点(或等于把时间设在过去)⇒ 宿主调度器不会补跑。同批 `5587a951` 设 `22:46` 就**准点触发**(`3f59c890` created 22:46:10)⇒ 倾向「调度器正常,是时间设错」。⇒ 23:12 在**未来**,预期能正常触发。
|
||||||
|
- ⚠️ **总闸仍 `off`**(`collabctl status`:ai1net/vibe `on`、contentm_agent `off`;常驻 pid 13524 活、心跳 6 秒前)。`goalctl` 报「周期排期 0 条 ⇒ 无人值守的叫醒通道是关着的/这个需求现在是停着」。⇒ 不自动拉会话这件事**没变**,仍靠一次性棒。
|
||||||
|
|
||||||
|
|
||||||
|
## 22:46–23:0x · 第 1 棒(本会话 `3f59c890`)收口:Easel 热点雷达逆向完成并上报
|
||||||
|
|
||||||
|
- ✅ 三条判据**全部写「过」**并落 `执行会话/目标-逆向Easel热点雷达与选题链路补齐现版-547748/目标执行状态.md`(在骨架上补,加了 §一 本棒交付,⛔ 未推倒重来);主产物 `第1棒_逆向Easel热点雷达与选题链路_2026-10-10.md`(15 456 B);说人话 47/50。
|
||||||
|
- 🔴 **取证路线(可复用)**:本机 `raw.githubusercontent.com` 连不通(rc=56)⇒ 走 `api.github.com/repos/ZJU-REAL/Easel/contents/<path>` 取 base64 解码落盘。本次取 14 份成功,`web/app.py` 237 KB 也照取(先落盘再 grep,⛔ 不整份读进上下文)。
|
||||||
|
- 🔴 **Easel 热点链路的源码坐标(下次直接查,别再全仓翻)**:`web/app.py` **4666-4682**=TREND_SOURCES 六平台一主一备;**4684-4686**=标题/热度/链接的多 key 容错表;**4715-4736**=`_parse_hot` 宽容解析;**4739-4750**=`_fetch_platform` 主备降级;**4753-4775**=`/api/trends`(TTL **300 秒**、limit 夹 1..30、返回带 `ok` 区分两种空);**4890-4963**=选题库 `_ideas.json`(四字段 + 原子写)。前端:`TrendsPage.tsx` 106 行(收藏→`createIdea` source 定死;做内容→`onUseTopic`)|`App.tsx` **540-547**=生成的 prompt 原文(带「先判断它适不适合我的账号赛道」)。
|
||||||
|
- 🔴 **Easel 的判据口径(它是有逻辑的,我们缺的就是这一层)**:`skills/shared/scoring-dimensions.md` 七维(流量 25/账号匹配 20/竞争差异化 15/变现 15/时效 10/成本 8<反向>/合规 7<反向>)→ 百分制 → **≥70 做|50-69 改方向|<50 不做**;`skill-trend-rider` 另有 S/A/B/C + 生命周期四期(0-4h/4-24h/1-3d/3d+)+ 关联度高/中/低/无(**低于「中」明确建议不蹭**)。
|
||||||
|
- ⚠️ **它的两个坑别照抄**:① 已收藏状态存前端内存 `Set`,刷新即失效,后端 `createIdea` 不去重(我们 `2a` F2 已有 hash 去重 ⇒ 我们更强);② 各平台 `hot` 值量纲不统一(微博百万 vs 知乎热度),它只并排展示、没做归一化。
|
||||||
|
- 🔴 **对照出的 8 条缺口(核心两条)**:`mult` 倍数**没有分母**(原型是写死字符串,`2a` F1 未写基线统计量/窗口/样本下限);`zone` 三值**没有阈值与算法**。落地方案建议:基线=近 30 条播放量**中位数**、样本 <10 条不给倍数;异常值 ≥3.0、低粉爆款 ≥2.0 且粉丝 <1 万。⛔ **四个数值是建议值待拍板,本棒零改动**(2a/2b/原型/DESIGN 全只读)。
|
||||||
|
- ⚠️ **上报时的既有分岔重现**:`--report` 出软提醒「artifact 不在目标目录内」,因为**目标在 22:49 又被换成「侧栏改回64px基准形态并刷新按钮改icon」**,机制算出的目录是 `…-20a8ac` 而我的派活单是 `…-547748`。属既有分岔、不拒收(已实证第 4 次)。
|
||||||
|
- ✅ 域锁:开工抢 `contentm_agent/执行会话`,收工按 OWNER 的 `ME` 原文释放,复核 `.locks/` 已空。
|
||||||
@@ -4,12 +4,13 @@
|
|||||||
> 整理纪律:**同一件事只在一处写全**,别处只引;细则进当日日志,跨会话有用才上提这里。
|
> 整理纪律:**同一件事只在一处写全**,别处只引;细则进当日日志,跨会话有用才上提这里。
|
||||||
> 🔴 本文件按 **~9 KB 目标**维护;**实测注入在 19 KB 时开始截断**(2026-10-09 只丢末尾数十字符)⇒ 本版压至 ~14 KB 留余量。**再加内容先删等量旧内容**。
|
> 🔴 本文件按 **~9 KB 目标**维护;**实测注入在 19 KB 时开始截断**(2026-10-09 只丢末尾数十字符)⇒ 本版压至 ~14 KB 留余量。**再加内容先删等量旧内容**。
|
||||||
> 压缩史:2026-10-09 压过两次;压前全量存 `MEMORY-压前全量-20261009.md` 与 `MEMORY-压前-20261009-2305.md`。
|
> 压缩史:2026-10-09 压过两次;压前全量存 `MEMORY-压前全量-20261009.md` 与 `MEMORY-压前-20261009-2305.md`。
|
||||||
|
> 🔴🔴 **注入进来的副本可能落后于本文件**(2026-10-10 实测):注入版写「浏览器保活=**计划任务**」,而本文件(现行)写「**只许会话后台任务**、⛔ 不建计划任务」——**两版方向正好相反**,照注入版动手=做了用户明令禁止的事(已撤销)。⇒ **动手改机制/建计划任务/动浏览器之前,先读本文件磁盘版对时点**,把注入版当缓存看。
|
||||||
|
|
||||||
## 一、仓与位置
|
## 一、仓与位置
|
||||||
|
|
||||||
- **工作区仓** `E:/ProgramData/AIProject/contentm_agent`:远端 `[email protected]:admin/contentm_agent.git`(Gitea,deploy key **有写权限**),分支 `main`;提交者=**局部** `WorkBuddy <[email protected]>`(全局 config 未动,可推翻)。参考资料 231M 抽帧素材**全量入库**;`.gitignore` 排运行时噪音。
|
- **工作区仓** `E:/ProgramData/AIProject/contentm_agent`:远端 `[email protected]:admin/contentm_agent.git`(Gitea,deploy key **有写权限**),分支 `main`;提交者=**局部** `WorkBuddy <[email protected]>`(全局 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` 校准**。
|
- 🔴 **全局技能仓** `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`。
|
- 🔴 **浏览器=「只连不起」**:本机 9223 独立 Chrome(保活=**本会话后台任务**跑 `bh_chrome_keepalive.py`)。动手前 `netstat -ano | grep ":9223"` 探;在跑就直连。🔴 **一个页面只开一个标签**。规则见 `skills/browser-harness/SKILL.md`。
|
||||||
- ⚠️ **本机裸 `bash` 落到 WSL**(路径被吃)⇒ 一律用 `E:/ProgramData/.workbuddy/binaries/PortableGit/versions/1.2.0/usr/bin/bash.exe`。
|
- ⚠️ **本机裸 `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/<r>/contents/<path>`(base64)+ `git/trees/<b>?recursive=1`。公开接口够用,⛔ 不为取数起浏览器。
|
- 🔴 **本机 curl 取 GitHub**:`raw.githubusercontent.com` **连不通**(`rc=56`)⇒ 走 `api.github.com/repos/<r>/contents/<path>`(base64)+ `git/trees/<b>?recursive=1`。公开接口够用,⛔ 不为取数起浏览器。
|
||||||
|
|
||||||
@@ -21,8 +22,8 @@
|
|||||||
- 🔴 **功能归属现行判据(2026-10-09 用户令)**:**同一类事情放同一个页面**(找选题/拆解选题/做选题都属「选题相关的事」⇒ 同在选题页)。两条配套口径:**资产入库不限页**(任何页产生资产都可就地入库,**资产库页=统一管理的地方**,⛔ 不是唯一入库口;「一个对象只有一处产生」管的是**唯一权威数据**、⛔ 不是写入动作的地点);**选题库容纳「对选题有帮助的任何信息」**(随手记仍落选题库,⛔ 不新增「待整理」状态,靠分类区分)。
|
- 🔴 **功能归属现行判据(2026-10-09 用户令)**:**同一类事情放同一个页面**(找选题/拆解选题/做选题都属「选题相关的事」⇒ 同在选题页)。两条配套口径:**资产入库不限页**(任何页产生资产都可就地入库,**资产库页=统一管理的地方**,⛔ 不是唯一入库口;「一个对象只有一处产生」管的是**唯一权威数据**、⛔ 不是写入动作的地点);**选题库容纳「对选题有帮助的任何信息」**(随手记仍落选题库,⛔ 不新增「待整理」状态,靠分类区分)。
|
||||||
- 🔴 **「复盘」=发布之后看结果**:**看数据 + 看收入**(用户 2026-10-09 22:48 逐字「发布的目的就是为了看数据和看收入啊」)⇒「记录与对账」(发布记录/溯源/对账/商单与收支)**属复盘、是同一类事**,留在复盘页,⛔ 不拆页、⛔ 不加导航项、⛔ 页内不分(GPT 主张拆出去的三条 G7/G10/G22 ⇒ **不采纳**)。
|
- 🔴 **「复盘」=发布之后看结果**:**看数据 + 看收入**(用户 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 用户逐字「内容账号管的是内容属性(主要是账号设定 内容做成什么样),平台账号应该是 发布的渠道三方平台账号 用户发布具体内容」)**:**内容账号**=管**内容属性**(账号设定:定位/风格/受众/偏好红线/长期记忆),**平台不属于它**;**平台账号**=**发布的渠道**(三方平台账号,"发布具体内容"用的就是它),**登录态/授权归它**。⇒「**渠道**」=**平台账号**(⛔ 不再说"账号 × 平台")。**建模(主会话自决、可推翻)**:不加对象,平台账号做成**内容账号下的子项清单**(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 换目标时归档。
|
- 🔴 **本区当前目标**(2026-10-10 22:49 声明,用户令「都纳入目标管理 这两个事」)=「**侧栏改回64px基准形态并刷新按钮改icon**」——两处=①侧栏 `128px`→`64px` 药丸浮栏、图标在上名字在下;②刷新按钮由文字改 icon 并挪到页面标题行右对齐。类别 `产品规划`;目标目录=**机制口径** `执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/`(⚠️ 尾部是 `改ic`,⛔ 不是标题全称 `改icon`);三条判据当前全 `未过`。执行棒 `95d7e790` `once` **23:12**(`560ba39c` 重复 Easel 排期已 PAUSED)。⚠️ **23:12 与 Easel 棒 `3f59c890` 撞同一把域锁**(域键都是 `contentm_agent/执行会话`)⇒ 抢不到按 `blocked` 停手,⛔ 不硬写。
|
||||||
- 📌 **已收口的旧目标**(细则在当日日志):①「导航改七项一层并重排功能归属(P8 并入复盘)」(`fc471a`,15:48 收口);②「征询 GPT 对当前七页结构与操作路径的建议」(`b49e02`,16:46 收口;GPT 原文 10 562 字符逐字留痕;🔴 **D1 待裁定**=GPT 主张拆「记录与对账」出复盘,与用户拍板方向相反);③ 四步(梳理→GPT→重做②段→重生成界面,`071c5b`,08:14 收口)。
|
- 📌 **已收口的旧目标**(细则在当日日志):①「导航改七项一层并重排功能归属(P8 并入复盘)」(`fc471a`,15:48 收口);②「征询 GPT 对当前七页结构与操作路径的建议」(`b49e02`,16:46 收口;GPT 原文 10 562 字符逐字留痕;🔴 **D1 待裁定**=GPT 主张拆「记录与对账」出复盘,与用户拍板方向相反);③ 四步(梳理→GPT→重做②段→重生成界面,`071c5b`,08:14 收口);④「把八条已定口径落进②段两份与原型」(`fa6e07`,09:34 收口 —— V4;⚠️ 设「已完成」时**常驻会被优雅退出**,下次开新目标要重新拉起);⑤「逆向 Easel 热点雷达与选题链路」(`547748`,22:49 被换掉,其执行棒 `3f59c890` 仍在跑、产物按自己的目录落、⛔ 别去动)。⛔ 两条待订正:机读副本判据写「六维」而②段实际是「五维+平台账号」(采信②段);`--kpi` 按**分号**切 ⇒ 依据里⛔ 不许写 `;`。
|
||||||
|
|
||||||
## 三、②段两份的现行口径(2026-10-09 新版)
|
## 三、②段两份的现行口径(2026-10-09 新版)
|
||||||
|
|
||||||
@@ -65,5 +66,5 @@
|
|||||||
- ⚠️ **开关 `off` ≠ 没在跑**:`collabctl.py ensure` = 幂等收敛「on⇒补齐缺失/**off⇒全停**」,保活任务周期触发它 ⇒ off 下迟早被收敛停掉。开关语义="挡自动续命"。要真起/真停 ⇒ `collabctl.py on|off --ws …`。
|
- ⚠️ **开关 `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 副本。
|
- 🔴 **机制登记已全改现名 `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 <sid> --state done --artifact "<路径>"`:产物**读不到**⇒硬拒收;**落点不在目标目录**只给**软提醒**(不拒收)。
|
- 🔴 **文档合同**:执行棒产物落 `<目标目录>/`;**sid 取法**=查宿主库 `E:/ProgramData/.workbuddy/workbuddy.db` 的 `sessions` 表(按 `cwd` + `created_at desc`,本区会话 `is_background_automation=1`)。`--report <sid> --state done --artifact "<路径>"`:产物**读不到**⇒硬拒收;**落点不在目标目录**只给**软提醒**(不拒收)。
|
||||||
- 🔴🔴 **目标目录名两种口径(已实证 3 次)**:机制=`goal_dir_name()` **`title[:20]` 再去空格**;而**派活单与实际目录一律用全称去空格** ⇒ 上报必带一条「不在目标目录内」软提醒,**属既有分岔、不拒收**(如本目标:机制 `…upload-0ec0a7` vs 实际 `…upload项目,用于投放页与发布对象的判断-0ec0a7`)。⛔ 改名会断台账 `artifact` 引用 ⇒ 未修,待裁定。
|
- 🔴🔴 **目标目录名:新目标一律按机制口径**(2026-10-10 定,消掉原来的「两种口径」分岔)。规则(回源码 `goal_dir_name()` 坐实)=取 `short or title` → 去掉 `\/:*?"<>|` → **去空格** → **`[:20]`**,后缀 `sha1(title)[:6]`。例:`侧栏改回64px基准形态并刷新按钮改icon`(22 字)⇒ **尾部被截成 `改ic`** ⇒ 目录=`执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/`。⚠️ **存量那个全称口径的旧目录保持原样、⛔ 不改名**(改名会断台账 `artifact` 引用,如 `…upload项目,用于投放页与发布对象的判断-0ec0a7`)。⇒ 开新目标时**先按上式算准目录名** —— `goal.json.execution_doc` 是同一套口径算出来的,**必须与它一致**(切目标后若没跑过 `--ensure-goal-dir`,它会仍指着上一个目录 ⇒ 检查会话就会拿旧目标的状态文档判新目标,须手工对齐)。
|
||||||
- 🔴 **浏览器实例/计划任务**:浏览器保活用计划任务 **`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。
|
- 🔴 **浏览器保活=会话后台任务**(用户 2026-10-10 令「只允许这一种方式」):在要用浏览器的那个会话里,用**后台任务**跑 `bh_chrome_keepalive.py`,stdout 全重定向到文件(完整命令段见 `skills/browser-harness/SKILL.md` §1)。会话结束浏览器随之下线;手关窗(rc=0)⇒ 守卫停手、关了不再弹;崩溃(rc≠0)⇒ 自动拉回。⛔ 不建 Windows 计划任务(本机已撤 `bh-chrome-keepalive`)、⛔ 不复制副本到工作区。验证=`netstat` 见 LISTENING + `curl --noproxy '*' http://127.0.0.1:9223/json/version` 回 JSON。
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""常驻:确保本机有一个可用的独立 Chrome 实例(9223,固定 profile ⇒ 登录态保留)。
|
|
||||||
|
|
||||||
为什么必须常驻:本机沙箱在父进程退出时连带杀子进程 ⇒ 会话/工具调用里起的浏览器一返回就死。
|
|
||||||
为什么放工作区根而不是 tmp/:tmp/ 会被清理,脚本一没计划任务就静默失效。
|
|
||||||
|
|
||||||
形态:幂等 —— 端口已在听 ⇒ 立刻退出(⛔ 不叠加第二个实例、不抢同一个 profile)。
|
|
||||||
由计划任务 `bh-chrome-keepalive` 每 5 分钟触发一次(MultipleInstances=IgnoreNew),
|
|
||||||
所以"活着的那份"负责守端口,任务只是兜它挂掉时重新拉起。
|
|
||||||
⛔ 不附着用户日常 Chrome(那是 9222,会弹「允许远程调试?」动到用户浏览器)。
|
|
||||||
"""
|
|
||||||
import os, subprocess, sys, time, socket, io
|
|
||||||
|
|
||||||
for k in ["HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy"]:
|
|
||||||
os.environ.pop(k, None)
|
|
||||||
os.environ["NO_PROXY"] = "127.0.0.1,localhost"
|
|
||||||
|
|
||||||
WS = r"E:/ProgramData/AIProject/contentm_agent"
|
|
||||||
CHROME = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
|
|
||||||
PROFILE = r"E:/ProgramData/.workbuddy/tmp/bu-chatgpt-profile"
|
|
||||||
PORT = 9223
|
|
||||||
LOG = os.path.join(WS, "tmp", "_bh_chrome.log")
|
|
||||||
|
|
||||||
|
|
||||||
def log(msg):
|
|
||||||
try:
|
|
||||||
os.makedirs(os.path.dirname(LOG), exist_ok=True)
|
|
||||||
with io.open(LOG, "a", encoding="utf-8") as f:
|
|
||||||
f.write("[%s] %s\n" % (time.strftime("%m-%d %H:%M:%S"), msg))
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def up():
|
|
||||||
try:
|
|
||||||
s = socket.create_connection(("127.0.0.1", PORT), 1)
|
|
||||||
s.close()
|
|
||||||
return True
|
|
||||||
except Exception:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def launch():
|
|
||||||
return subprocess.Popen(
|
|
||||||
[CHROME, "--remote-debugging-port=%d" % PORT,
|
|
||||||
"--user-data-dir=%s" % PROFILE,
|
|
||||||
"--no-first-run", "--no-default-browser-check",
|
|
||||||
"about:blank"],
|
|
||||||
creationflags=0x00000008 | 0x08000000 | 0x00000200, # DETACHED | NO_WINDOW | NEW_PROCESS_GROUP
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# ---- 幂等前置:端口已在听 ⇒ 什么都不做 ----
|
|
||||||
if up():
|
|
||||||
log("port %d already listening ⇒ exit (idempotent)" % PORT)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
p = launch()
|
|
||||||
log("launched pid=%s" % p.pid)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
time.sleep(5)
|
|
||||||
if p.poll() is not None:
|
|
||||||
log("chrome exited rc=%s ⇒ relaunch" % p.returncode)
|
|
||||||
p = launch()
|
|
||||||
log("relaunched pid=%s" % p.pid)
|
|
||||||
if not up():
|
|
||||||
# ⚠️ 这里只记日志:僵死态(端口不应答、进程不死)按规则由人/会话判定后重启实例,
|
|
||||||
# ⛔ 脚本不做自动重启,免得把"正在被人排查的现场"清掉。
|
|
||||||
log("port %d not answering (pid alive=%s)" % (PORT, p.poll() is None))
|
|
||||||
@@ -3,8 +3,11 @@
|
|||||||
> 目标(2026-10-10 22:49 下达,已切目标):用户令「**都纳入目标管理 这两个事**」——
|
> 目标(2026-10-10 22:49 下达,已切目标):用户令「**都纳入目标管理 这两个事**」——
|
||||||
> 一、**左侧导航改回去**:侧栏由 `128px`/图标在左,改回设计供给的基准形态 `64px` 药丸浮栏、**图标在上名字在下**;
|
> 一、**左侧导航改回去**:侧栏由 `128px`/图标在左,改回设计供给的基准形态 `64px` 药丸浮栏、**图标在上名字在下**;
|
||||||
> 二、**刷新按钮改成 icon 并挪到页面标题行右对齐**。
|
> 二、**刷新按钮改成 icon 并挪到页面标题行右对齐**。
|
||||||
> 🔴🔴 **落点以本份为准**:目标目录 = `执行会话/目标-侧栏改回64px基准形态并刷新按钮改icon-20a8ac/`
|
> 🔴🔴 **落点以本份为准**:目标目录 = `执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/`
|
||||||
> (⚠️ 排期 `95d7e790` 的派活单里写的是旧路径 `…41c8bd` —— 那是上一次切目标时算出来的 ⇒ **按本份的新目录落**。)
|
> (⚠️ 目录名按机制的 `goal_dir_name()` 算 —— `title[:20]` **去空格** + `sha1(title)[:6]` ⇒
|
||||||
|
> 末尾截到 `…改ic-`,不是标题全称 `…改icon-`。**已按这个把目录建好 + 状态文档已放进去**。
|
||||||
|
> ⚠️ 排期 `95d7e790` 的派活单里写的是更旧的 `…41c8bd`(那属已归档的上一版目标「左侧导航改回基准形态 64px 图标在上」)
|
||||||
|
> ⇒ **两处都不按,按本份这一行落**。)
|
||||||
> ⚠️ 本目标承接的这两件事,此前只挂在排期上没被拉起:排期 `95d7e790` 的 `next_run_at` 一直停在 `22:38`、`last_run_at` 为空 ⇒ **到点没被拉起**;现已改到 **23:12** 重触发。
|
> ⚠️ 本目标承接的这两件事,此前只挂在排期上没被拉起:排期 `95d7e790` 的 `next_run_at` 一直停在 `22:38`、`last_run_at` 为空 ⇒ **到点没被拉起**;现已改到 **23:12** 重触发。
|
||||||
> 上一版队列(旧目标「逆向 Easel 热点雷达与选题链路」)已留痕:`NEXT-旧目标-逆向Easel-已归档20261010-2249.md`
|
> 上一版队列(旧目标「逆向 Easel 热点雷达与选题链路」)已留痕:`NEXT-旧目标-逆向Easel-已归档20261010-2249.md`
|
||||||
> (那个目标已归档,但**它那一棒 `3f59c890` 仍在跑**,产物按它自己的目录落 —— 别去动它)。
|
> (那个目标已归档,但**它那一棒 `3f59c890` 仍在跑**,产物按它自己的目录落 —— 别去动它)。
|
||||||
@@ -14,13 +17,13 @@
|
|||||||
## 1、侧栏改回 64px + 刷新按钮改 icon —— 待
|
## 1、侧栏改回 64px + 刷新按钮改 icon —— 待
|
||||||
|
|
||||||
**执行者**:执行会话(本工作区,域目录 `执行会话`)
|
**执行者**:执行会话(本工作区,域目录 `执行会话`)
|
||||||
**目标目录**:`执行会话/目标-侧栏改回64px基准形态并刷新按钮改icon-20a8ac/`
|
**目标目录**:`执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/`
|
||||||
**起点(只读,⛔ 不要改它)**:`执行会话/目标-把八条已定口径落进②段两份与原型-fa6e07/`
|
**起点(只读,⛔ 不要改它)**:`执行会话/目标-把八条已定口径落进②段两份与原型-fa6e07/`
|
||||||
(`2a-产品功能-新版.md`、`2b-界面布局-新版.md`、`ui/mcn-workbench.html` V4、`ui/DESIGN.md`、`ui/3b-实测记录.md`)
|
(`2a-产品功能-新版.md`、`2b-界面布局-新版.md`、`ui/mcn-workbench.html` V4、`ui/DESIGN.md`、`ui/3b-实测记录.md`)
|
||||||
|
|
||||||
**详细要求看排期 `95d7e790` 的派活单** —— 两处改动、尺寸依据、⛔ 不许动的清单、交付要求都在里面。本份只补两点:
|
**详细要求看排期 `95d7e790` 的派活单** —— 两处改动、尺寸依据、⛔ 不许动的清单、交付要求都在里面。本份只补两点:
|
||||||
|
|
||||||
1、**落点换成上面的新目录**(派活单里那条旧路径作废)。
|
1、**落点换成上面那一行机制口径的目录**(派活单里 `…41c8bd` 与 `…改icon-` 两条路径都作废;目录和状态文档已由主会话按机制口径建好)。
|
||||||
2、**抢不到域锁就停手报告**(`3f59c890` 那棒可能还在跑,它先来)⇒ 按 `--state blocked` 上报,⛔ 不硬写。
|
2、**抢不到域锁就停手报告**(`3f59c890` 那棒可能还在跑,它先来)⇒ 按 `--state blocked` 上报,⛔ 不硬写。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -30,7 +33,7 @@
|
|||||||
- **重写 ≠ 润色**:内容层必须真改;结构变了要在文末列「与上一版的实质差别」。
|
- **重写 ≠ 润色**:内容层必须真改;结构变了要在文末列「与上一版的实质差别」。
|
||||||
- 一切落盘文字过「说人话」(判据源 `E:/ProgramData/.workbuddy/skills/humanizer-zh`),门槛 ≥45/50,文末写明评分。
|
- 一切落盘文字过「说人话」(判据源 `E:/ProgramData/.workbuddy/skills/humanizer-zh`),门槛 ≥45/50,文末写明评分。
|
||||||
- **域目录 `执行会话`**,抢到域锁才能写;抢不到 ⇒ 停手报告。
|
- **域目录 `执行会话`**,抢到域锁才能写;抢不到 ⇒ 停手报告。
|
||||||
- 浏览器:**只连不起**(9223 已有实例)+ **一类任务只开一个标签页并复用**。
|
- 浏览器:**先探再连**(`netstat -ano | grep -E "127\.0\.0\.1:9223 .*LISTENING"`)—— 现在**已有实例在跑**(pid 43812),直连即可;⚠️ 万一探不到,**别按派活单那句「停手」办**(那是计划任务时代的旧措辞):现行规则是**用本会话的后台任务起**,整段命令抄 `E:/ProgramData/.workbuddy/skills/browser-harness/SKILL.md` §1。+ **一类任务只开一个标签页并复用**。
|
||||||
- 做完即停、上报:`python .workbuddy/collab/collabd.py --report <sid> --state done --artifact "<路径>"`。
|
- 做完即停、上报:`python .workbuddy/collab/collabd.py --report <sid> --state done --artifact "<路径>"`。
|
||||||
- 收工必跑 `--release-exec` 释放域锁。
|
- 收工必跑 `--release-exec` 释放域锁。
|
||||||
- 半成品按失败交付,⛔ 不许当完成上报。
|
- 半成品按失败交付,⛔ 不许当完成上报。
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
"lifecycle": "进行中",
|
"lifecycle": "进行中",
|
||||||
"lifecycle_at": "2026-10-10T22:49:23",
|
"lifecycle_at": "2026-10-10T22:49:23",
|
||||||
"lifecycle_by": "goalctl declare --switch-goal(换目标自动复位)",
|
"lifecycle_by": "goalctl declare --switch-goal(换目标自动复位)",
|
||||||
"execution_doc": "执行会话/目标-逆向Easel热点雷达与选题链路补齐现版-547748/目标执行状态.md",
|
"execution_doc": "执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/目标执行状态.md",
|
||||||
"execution_doc_at": "2026-10-10 22:39:59",
|
"execution_doc_at": "2026-10-10 22:55:00",
|
||||||
"lifecycle_why": "换目标 ⇒ 复位(改前=进行中);旧目标整份归档,可在归档件里回查",
|
"lifecycle_why": "换目标 ⇒ 复位(改前=进行中);旧目标整份归档,可在归档件里回查",
|
||||||
"_前身目标": "逆向 Easel 热点雷达与选题链路 补齐现版逻辑(已于 2026-10-10T22:49 换目标时归档至 goals/逆向 Easel 热点雷达与选题链路 补齐现版逻辑__20261010-2249.json)",
|
"_前身目标": "逆向 Easel 热点雷达与选题链路 补齐现版逻辑(已于 2026-10-10T22:49 换目标时归档至 goals/逆向 Easel 热点雷达与选题链路 补齐现版逻辑__20261010-2249.json)",
|
||||||
"execution_doc_by": "[检查]-[目标检查]-contentm_agent-第42棒"
|
"execution_doc_by": "[检查]-[目标检查]-contentm_agent-第42棒"
|
||||||
|
|||||||
Reference in new issue
Block a user