From 5140f8d1f3713081df7aa97354926beeeb71b0e3 Mon Sep 17 00:00:00 2001 From: WorkBuddy Date: Sat, 10 Oct 2026 22:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B8=E5=AE=9E=E7=9B=AE=E6=A0=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=90=BD=E5=9C=B0=E6=83=85=E5=86=B5=E5=B9=B6=E7=BA=A0?= =?UTF-8?q?=E5=81=8F=EF=BC=9A=E6=92=A4=E9=94=80=E8=AF=AF=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E4=BB=BB=E5=8A=A1=EF=BC=88=E7=8E=B0=E8=A1=8C?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=8F=AA=E8=AE=B8=E4=BC=9A=E8=AF=9D=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E4=BB=BB=E5=8A=A1=EF=BC=89=EF=BC=9B=E8=90=BD=E7=82=B9?= =?UTF-8?q?=E4=B8=89=E5=A4=84=E6=94=B6=E6=95=9B=E5=88=B0=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=EF=BC=9B=E5=AF=B9=E9=BD=90=20goal.json=20?= =?UTF-8?q?=E7=9A=84=20execution=5Fdoc=EF=BC=9B=E7=A7=BB=E9=99=A4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=8C=BA=E6=A0=B9=E7=9A=84=E6=B5=8F=E8=A7=88=E5=99=A8?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=89=AF=E6=9C=AC=EF=BC=9B=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E8=A1=A5=E8=AE=B0=E6=95=99=E8=AE=AD=EF=BC=88=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E7=89=88=E5=8F=AF=E8=83=BD=E8=90=BD=E5=90=8E=E4=BA=8E=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .workbuddy/memory/2026-10-10.md | 26 ++++++++++++ .workbuddy/memory/MEMORY.md | 11 +++--- bh_chrome_keepalive.py | 70 --------------------------------- tmp/supervise-inbox/NEXT.md | 13 +++--- tmp/supervise-inbox/goal.json | 4 +- 5 files changed, 42 insertions(+), 82 deletions(-) delete mode 100644 bh_chrome_keepalive.py diff --git a/.workbuddy/memory/2026-10-10.md b/.workbuddy/memory/2026-10-10.md index feed2b7..28a92e1 100644 --- a/.workbuddy/memory/2026-10-10.md +++ b/.workbuddy/memory/2026-10-10.md @@ -288,3 +288,29 @@ - ✅ 已派第 1 棒:`[执行]-[开源项目调研]-逆向Easel热点雷达与选题链路并对照现版P2`,`once` 22:46,`cwds` 逐字本区;域=`contentm_agent/执行会话`(派前 `--domain-status`=**无人持锁** ⇒ ⛔ 未动任何孤儿锁);定位=**调研与方案棒**(⛔ 明令不许改 2a/2b/原型,落地方案只写进文档)。 - ⚠️ 工具现状沿用两处:工作区根 **`state.py` 不存在**(派活单第 1 项跑不到,报 `can't open file`);`--domain-block 执行会话` 出块正常。 - ⛔ 本棒未改 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/` 取 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/` 已空。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index 24e48a8..67f1035 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -4,12 +4,13 @@ > 整理纪律:**同一件事只在一处写全**,别处只引;细则进当日日志,跨会话有用才上提这里。 > 🔴 本文件按 **~9 KB 目标**维护;**实测注入在 19 KB 时开始截断**(2026-10-09 只丢末尾数十字符)⇒ 本版压至 ~14 KB 留余量。**再加内容先删等量旧内容**。 > 压缩史:2026-10-09 压过两次;压前全量存 `MEMORY-压前全量-20261009.md` 与 `MEMORY-压前-20261009-2305.md`。 +> 🔴🔴 **注入进来的副本可能落后于本文件**(2026-10-10 实测):注入版写「浏览器保活=**计划任务**」,而本文件(现行)写「**只许会话后台任务**、⛔ 不建计划任务」——**两版方向正好相反**,照注入版动手=做了用户明令禁止的事(已撤销)。⇒ **动手改机制/建计划任务/动浏览器之前,先读本文件磁盘版对时点**,把注入版当缓存看。 ## 一、仓与位置 - **工作区仓** `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`。 +- 🔴 **浏览器=「只连不起」**:本机 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`。 - 🔴 **本机 curl 取 GitHub**:`raw.githubusercontent.com` **连不通**(`rc=56`)⇒ 走 `api.github.com/repos//contents/`(base64)+ `git/trees/?recursive=1`。公开接口够用,⛔ 不为取数起浏览器。 @@ -21,8 +22,8 @@ - 🔴 **功能归属现行判据(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-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 收口);④「把八条已定口径落进②段两份与原型」(`fa6e07`,09:34 收口 —— V4;⚠️ 设「已完成」时**常驻会被优雅退出**,下次开新目标要重新拉起);⑤「逆向 Easel 热点雷达与选题链路」(`547748`,22:49 被换掉,其执行棒 `3f59c890` 仍在跑、产物按自己的目录落、⛔ 别去动)。⛔ 两条待订正:机读副本判据写「六维」而②段实际是「五维+平台账号」(采信②段);`--kpi` 按**分号**切 ⇒ 依据里⛔ 不许写 `;`。 ## 三、②段两份的现行口径(2026-10-09 新版) @@ -65,5 +66,5 @@ - ⚠️ **开关 `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。 +- 🔴🔴 **目标目录名:新目标一律按机制口径**(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`,它会仍指着上一个目录 ⇒ 检查会话就会拿旧目标的状态文档判新目标,须手工对齐)。 +- 🔴 **浏览器保活=会话后台任务**(用户 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。 diff --git a/bh_chrome_keepalive.py b/bh_chrome_keepalive.py deleted file mode 100644 index 5e28e86..0000000 --- a/bh_chrome_keepalive.py +++ /dev/null @@ -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)) diff --git a/tmp/supervise-inbox/NEXT.md b/tmp/supervise-inbox/NEXT.md index 19f295b..8ec9cbc 100644 --- a/tmp/supervise-inbox/NEXT.md +++ b/tmp/supervise-inbox/NEXT.md @@ -3,8 +3,11 @@ > 目标(2026-10-10 22:49 下达,已切目标):用户令「**都纳入目标管理 这两个事**」—— > 一、**左侧导航改回去**:侧栏由 `128px`/图标在左,改回设计供给的基准形态 `64px` 药丸浮栏、**图标在上名字在下**; > 二、**刷新按钮改成 icon 并挪到页面标题行右对齐**。 -> 🔴🔴 **落点以本份为准**:目标目录 = `执行会话/目标-侧栏改回64px基准形态并刷新按钮改icon-20a8ac/` -> (⚠️ 排期 `95d7e790` 的派活单里写的是旧路径 `…41c8bd` —— 那是上一次切目标时算出来的 ⇒ **按本份的新目录落**。) +> 🔴🔴 **落点以本份为准**:目标目录 = `执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/` +> (⚠️ 目录名按机制的 `goal_dir_name()` 算 —— `title[:20]` **去空格** + `sha1(title)[:6]` ⇒ +> 末尾截到 `…改ic-`,不是标题全称 `…改icon-`。**已按这个把目录建好 + 状态文档已放进去**。 +> ⚠️ 排期 `95d7e790` 的派活单里写的是更旧的 `…41c8bd`(那属已归档的上一版目标「左侧导航改回基准形态 64px 图标在上」) +> ⇒ **两处都不按,按本份这一行落**。) > ⚠️ 本目标承接的这两件事,此前只挂在排期上没被拉起:排期 `95d7e790` 的 `next_run_at` 一直停在 `22:38`、`last_run_at` 为空 ⇒ **到点没被拉起**;现已改到 **23:12** 重触发。 > 上一版队列(旧目标「逆向 Easel 热点雷达与选题链路」)已留痕:`NEXT-旧目标-逆向Easel-已归档20261010-2249.md` > (那个目标已归档,但**它那一棒 `3f59c890` 仍在跑**,产物按它自己的目录落 —— 别去动它)。 @@ -14,13 +17,13 @@ ## 1、侧栏改回 64px + 刷新按钮改 icon —— 待 **执行者**:执行会话(本工作区,域目录 `执行会话`) -**目标目录**:`执行会话/目标-侧栏改回64px基准形态并刷新按钮改icon-20a8ac/` +**目标目录**:`执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/` **起点(只读,⛔ 不要改它)**:`执行会话/目标-把八条已定口径落进②段两份与原型-fa6e07/` (`2a-产品功能-新版.md`、`2b-界面布局-新版.md`、`ui/mcn-workbench.html` V4、`ui/DESIGN.md`、`ui/3b-实测记录.md`) **详细要求看排期 `95d7e790` 的派活单** —— 两处改动、尺寸依据、⛔ 不许动的清单、交付要求都在里面。本份只补两点: -1、**落点换成上面的新目录**(派活单里那条旧路径作废)。 +1、**落点换成上面那一行机制口径的目录**(派活单里 `…41c8bd` 与 `…改icon-` 两条路径都作废;目录和状态文档已由主会话按机制口径建好)。 2、**抢不到域锁就停手报告**(`3f59c890` 那棒可能还在跑,它先来)⇒ 按 `--state blocked` 上报,⛔ 不硬写。 --- @@ -30,7 +33,7 @@ - **重写 ≠ 润色**:内容层必须真改;结构变了要在文末列「与上一版的实质差别」。 - 一切落盘文字过「说人话」(判据源 `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 --state done --artifact "<路径>"`。 - 收工必跑 `--release-exec` 释放域锁。 - 半成品按失败交付,⛔ 不许当完成上报。 diff --git a/tmp/supervise-inbox/goal.json b/tmp/supervise-inbox/goal.json index 3442750..9e6124c 100644 --- a/tmp/supervise-inbox/goal.json +++ b/tmp/supervise-inbox/goal.json @@ -16,8 +16,8 @@ "lifecycle": "进行中", "lifecycle_at": "2026-10-10T22:49:23", "lifecycle_by": "goalctl declare --switch-goal(换目标自动复位)", - "execution_doc": "执行会话/目标-逆向Easel热点雷达与选题链路补齐现版-547748/目标执行状态.md", - "execution_doc_at": "2026-10-10 22:39:59", + "execution_doc": "执行会话/目标-侧栏改回64px基准形态并刷新按钮改ic-20a8ac/目标执行状态.md", + "execution_doc_at": "2026-10-10 22:55:00", "lifecycle_why": "换目标 ⇒ 复位(改前=进行中);旧目标整份归档,可在归档件里回查", "_前身目标": "逆向 Easel 热点雷达与选题链路 补齐现版逻辑(已于 2026-10-10T22:49 换目标时归档至 goals/逆向 Easel 热点雷达与选题链路 补齐现版逻辑__20261010-2249.json)", "execution_doc_by": "[检查]-[目标检查]-contentm_agent-第42棒"